Ver código fonte

应急代码提交

wang_xy 3 anos atrás
pai
commit
a6c33e34e5
100 arquivos alterados com 18756 adições e 0 exclusões
  1. 156 0
      leiSP-admin/leisp-admin.iml
  2. 124 0
      leiSP-admin/pom.xml
  3. 35 0
      leiSP-admin/src/main/java/com/LeispApplication.java
  4. 18 0
      leiSP-admin/src/main/java/com/LeispServletInitializer.java
  5. 148 0
      leiSP-admin/src/main/java/com/sooka/web/controller/common/CommonController.java
  6. 80 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoDialogController.java
  7. 326 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoFormController.java
  8. 35 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoIconController.java
  9. 326 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoOperateController.java
  10. 53 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoReportController.java
  11. 423 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoTableController.java
  12. 116 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/domain/CustomerModel.java
  13. 82 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/domain/GoodsModel.java
  14. 149 0
      leiSP-admin/src/main/java/com/sooka/web/controller/demo/domain/UserOperateModel.java
  15. 26 0
      leiSP-admin/src/main/java/com/sooka/web/controller/monitor/DruidController.java
  16. 31 0
      leiSP-admin/src/main/java/com/sooka/web/controller/monitor/ServerController.java
  17. 94 0
      leiSP-admin/src/main/java/com/sooka/web/controller/monitor/SysLogininforController.java
  18. 89 0
      leiSP-admin/src/main/java/com/sooka/web/controller/monitor/SysOperlogController.java
  19. 88 0
      leiSP-admin/src/main/java/com/sooka/web/controller/monitor/SysUserOnlineController.java
  20. 92 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysCaptchaController.java
  21. 157 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysConfigController.java
  22. 252 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysDeptController.java
  23. 120 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysDictDataController.java
  24. 188 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysDictTypeController.java
  25. 73 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysIndexController.java
  26. 87 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysLoginController.java
  27. 196 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysMenuController.java
  28. 112 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysNoticeController.java
  29. 163 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysPostController.java
  30. 173 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysProfileController.java
  31. 46 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysRegisterController.java
  32. 304 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysRoleController.java
  33. 297 0
      leiSP-admin/src/main/java/com/sooka/web/controller/system/SysUserController.java
  34. 26 0
      leiSP-admin/src/main/java/com/sooka/web/controller/tool/BuildController.java
  35. 24 0
      leiSP-admin/src/main/java/com/sooka/web/controller/tool/SwaggerController.java
  36. 175 0
      leiSP-admin/src/main/java/com/sooka/web/controller/tool/TestController.java
  37. 69 0
      leiSP-admin/src/main/java/com/sooka/web/core/config/SwaggerConfig.java
  38. 75 0
      leiSP-admin/src/main/resources/application-druid.yml
  39. 126 0
      leiSP-admin/src/main/resources/application.yml
  40. 24 0
      leiSP-admin/src/main/resources/banner.txt
  41. 18 0
      leiSP-admin/src/main/resources/config/iccSdk.properties
  42. 81 0
      leiSP-admin/src/main/resources/ehcache/ehcache-shiro.xml
  43. 93 0
      leiSP-admin/src/main/resources/logback.xml
  44. 16 0
      leiSP-admin/src/main/resources/mybatis/mybatis-config.xml
  45. 322 0
      leiSP-admin/src/main/resources/templates/demo/form/autocomplete.html
  46. 593 0
      leiSP-admin/src/main/resources/templates/demo/form/basic.html
  47. 620 0
      leiSP-admin/src/main/resources/templates/demo/form/button.html
  48. 319 0
      leiSP-admin/src/main/resources/templates/demo/form/cards.html
  49. 161 0
      leiSP-admin/src/main/resources/templates/demo/form/cxselect.html
  50. 236 0
      leiSP-admin/src/main/resources/templates/demo/form/datetime.html
  51. 65 0
      leiSP-admin/src/main/resources/templates/demo/form/duallistbox.html
  52. 432 0
      leiSP-admin/src/main/resources/templates/demo/form/grid.html
  53. 118 0
      leiSP-admin/src/main/resources/templates/demo/form/jasny.html
  54. 148 0
      leiSP-admin/src/main/resources/templates/demo/form/select.html
  55. 198 0
      leiSP-admin/src/main/resources/templates/demo/form/sortable.html
  56. 93 0
      leiSP-admin/src/main/resources/templates/demo/form/summernote.html
  57. 353 0
      leiSP-admin/src/main/resources/templates/demo/form/tabs_panels.html
  58. 113 0
      leiSP-admin/src/main/resources/templates/demo/form/timeline.html
  59. 55 0
      leiSP-admin/src/main/resources/templates/demo/form/upload.html
  60. 193 0
      leiSP-admin/src/main/resources/templates/demo/form/validate.html
  61. 192 0
      leiSP-admin/src/main/resources/templates/demo/form/wizard.html
  62. 1944 0
      leiSP-admin/src/main/resources/templates/demo/icon/fontawesome.html
  63. 1364 0
      leiSP-admin/src/main/resources/templates/demo/icon/glyphicons.html
  64. 215 0
      leiSP-admin/src/main/resources/templates/demo/modal/dialog.html
  65. 95 0
      leiSP-admin/src/main/resources/templates/demo/modal/form.html
  66. 256 0
      leiSP-admin/src/main/resources/templates/demo/modal/layer.html
  67. 56 0
      leiSP-admin/src/main/resources/templates/demo/modal/table.html
  68. 86 0
      leiSP-admin/src/main/resources/templates/demo/modal/table/check.html
  69. 90 0
      leiSP-admin/src/main/resources/templates/demo/modal/table/parent.html
  70. 86 0
      leiSP-admin/src/main/resources/templates/demo/modal/table/radio.html
  71. 78 0
      leiSP-admin/src/main/resources/templates/demo/operate/add.html
  72. 69 0
      leiSP-admin/src/main/resources/templates/demo/operate/detail.html
  73. 79 0
      leiSP-admin/src/main/resources/templates/demo/operate/edit.html
  74. 77 0
      leiSP-admin/src/main/resources/templates/demo/operate/other.html
  75. 125 0
      leiSP-admin/src/main/resources/templates/demo/operate/table.html
  76. 1264 0
      leiSP-admin/src/main/resources/templates/demo/report/echarts.html
  77. 478 0
      leiSP-admin/src/main/resources/templates/demo/report/metrics.html
  78. 206 0
      leiSP-admin/src/main/resources/templates/demo/report/peity.html
  79. 232 0
      leiSP-admin/src/main/resources/templates/demo/report/sparkline.html
  80. 92 0
      leiSP-admin/src/main/resources/templates/demo/table/button.html
  81. 113 0
      leiSP-admin/src/main/resources/templates/demo/table/child.html
  82. 178 0
      leiSP-admin/src/main/resources/templates/demo/table/curd.html
  83. 76 0
      leiSP-admin/src/main/resources/templates/demo/table/data.html
  84. 86 0
      leiSP-admin/src/main/resources/templates/demo/table/detail.html
  85. 128 0
      leiSP-admin/src/main/resources/templates/demo/table/editable.html
  86. 107 0
      leiSP-admin/src/main/resources/templates/demo/table/event.html
  87. 81 0
      leiSP-admin/src/main/resources/templates/demo/table/export.html
  88. 145 0
      leiSP-admin/src/main/resources/templates/demo/table/fixedColumns.html
  89. 83 0
      leiSP-admin/src/main/resources/templates/demo/table/footer.html
  90. 80 0
      leiSP-admin/src/main/resources/templates/demo/table/groupHeader.html
  91. 79 0
      leiSP-admin/src/main/resources/templates/demo/table/image.html
  92. 222 0
      leiSP-admin/src/main/resources/templates/demo/table/multi.html
  93. 106 0
      leiSP-admin/src/main/resources/templates/demo/table/other.html
  94. 77 0
      leiSP-admin/src/main/resources/templates/demo/table/pageGo.html
  95. 158 0
      leiSP-admin/src/main/resources/templates/demo/table/params.html
  96. 86 0
      leiSP-admin/src/main/resources/templates/demo/table/remember.html
  97. 75 0
      leiSP-admin/src/main/resources/templates/demo/table/reorder.html
  98. 202 0
      leiSP-admin/src/main/resources/templates/demo/table/search.html
  99. 185 0
      leiSP-admin/src/main/resources/templates/demo/table/subdata.html
  100. 0 0
      leiSP-admin/src/main/resources/templates/error/404.html

+ 156 - 0
leiSP-admin/leisp-admin.iml

@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="web" name="Web">
+      <configuration>
+        <webroots>
+          <root url="file://$MODULE_DIR$/src/main/webapp" relative="/" />
+        </webroots>
+      </configuration>
+    </facet>
+    <facet type="Spring" name="Spring">
+      <configuration />
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
+    <output url="file://$MODULE_DIR$/target/classes" />
+    <output-test url="file://$MODULE_DIR$/target/test-classes" />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <excludeFolder url="file://$MODULE_DIR$/target" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="Maven: com.dahuatech.icc:java-sdk-oauth:1.0.9" level="project" />
+    <orderEntry type="library" name="Maven: com.dahuatech.icc:java-sdk-core:1.0.9" level="project" />
+    <orderEntry type="library" name="Maven: com.dahuatech.icc:java-sdk-common:1.0.9" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-thymeleaf:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.11.1" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: javax.annotation:javax.annotation-api:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-core:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.23" level="project" />
+    <orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf-spring5:3.0.11.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.thymeleaf:thymeleaf:3.0.11.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.attoparser:attoparser:2.0.5.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.unbescape:unbescape:1.1.6.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.thymeleaf.extras:thymeleaf-extras-java8time:3.0.2.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-devtools:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger2:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spi:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-core:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: net.bytebuddy:byte-buddy:1.9.5" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-schema:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-common:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-spring-web:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.google.guava:guava:20.0" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml:classmate:1.4.0" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-core:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.plugin:spring-plugin-metadata:1.2.0.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mapstruct:mapstruct:1.2.0.Final" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-annotations:1.5.21" level="project" />
+    <orderEntry type="library" name="Maven: io.swagger:swagger-models:1.5.21" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0" level="project" />
+    <orderEntry type="library" name="Maven: io.springfox:springfox-swagger-ui:2.9.2" level="project" />
+    <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.13" level="project" />
+    <orderEntry type="module" module-name="leisp-framework" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.13" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-el:9.0.13" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.13" level="project" />
+    <orderEntry type="library" name="Maven: org.hibernate.validator:hibernate-validator:6.0.13.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.3.2.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-web:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.2" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid-spring-boot-starter:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:druid:1.1.14" level="project" />
+    <orderEntry type="library" name="Maven: com.github.penggle:kaptcha:2.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.jhlabs:filters:2.0.235-1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-spring:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-core:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-lang:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-hash:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-core:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-crypto-cipher:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-core:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-config-ogdl:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.4" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-event:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-web:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.owasp.encoder:encoder:1.2.2" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-ehcache:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.shiro:shiro-cache:1.5.3" level="project" />
+    <orderEntry type="library" name="Maven: net.sf.ehcache:ehcache-core:2.6.11" level="project" />
+    <orderEntry type="library" name="Maven: com.github.theborakompanioni:thymeleaf-extras-shiro:2.0.0" level="project" />
+    <orderEntry type="library" name="Maven: eu.bitwalker:UserAgentUtils:1.19" level="project" />
+    <orderEntry type="library" name="Maven: com.github.oshi:oshi-core:3.9.1" level="project" />
+    <orderEntry type="library" name="Maven: net.java.dev.jna:jna:4.5.2" level="project" />
+    <orderEntry type="library" name="Maven: net.java.dev.jna:jna-platform:4.5.2" level="project" />
+    <orderEntry type="module" module-name="leisp-system" />
+    <orderEntry type="module" module-name="leisp-quartz" />
+    <orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.0" level="project" />
+    <orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.11" level="project" />
+    <orderEntry type="module" module-name="leisp-common" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-starter:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.2.0" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-tx:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis:3.4.6" level="project" />
+    <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.2" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper-spring-boot-autoconfigure:1.2.5" level="project" />
+    <orderEntry type="library" name="Maven: com.github.pagehelper:pagehelper:5.1.4" level="project" />
+    <orderEntry type="library" name="Maven: com.github.jsqlparser:jsqlparser:1.0" level="project" />
+    <orderEntry type="library" name="Maven: javax.validation:validation-api:2.0.1.Final" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.7" level="project" />
+    <orderEntry type="library" name="Maven: com.alibaba:fastjson:1.2.70" level="project" />
+    <orderEntry type="library" name="Maven: commons-io:commons-io:2.5" level="project" />
+    <orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.3.3" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi:3.17" level="project" />
+    <orderEntry type="library" name="Maven: commons-codec:commons-codec:1.11" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.poi:poi-ooxml-schemas:3.17" level="project" />
+    <orderEntry type="library" name="Maven: org.apache.xmlbeans:xmlbeans:2.6.0" level="project" />
+    <orderEntry type="library" name="Maven: stax:stax-api:1.0.1" level="project" />
+    <orderEntry type="library" name="Maven: com.github.virtuald:curvesapi:1.04" level="project" />
+    <orderEntry type="library" name="Maven: javax.servlet:javax.servlet-api:4.0.1" level="project" />
+    <orderEntry type="module" module-name="leisp-generator" />
+    <orderEntry type="library" name="Maven: org.apache.velocity:velocity:1.7" level="project" />
+    <orderEntry type="library" name="Maven: commons-collections:commons-collections:3.2.1" level="project" />
+    <orderEntry type="library" name="Maven: commons-lang:commons-lang:2.4" level="project" />
+    <orderEntry type="module" module-name="mybusiness" />
+    <orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
+    <orderEntry type="library" name="Maven: log4j:log4j:1.2.17" level="project" />
+    <orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.61" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-websocket:2.1.1.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.1.3.RELEASE" level="project" />
+    <orderEntry type="library" name="Maven: org.springframework:spring-websocket:5.1.3.RELEASE" level="project" />
+  </component>
+</module>

+ 124 - 0
leiSP-admin/pom.xml

@@ -0,0 +1,124 @@
+<?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">
+    <parent>
+        <artifactId>emergencyCommand_yanji</artifactId>
+        <groupId>com.leisp</groupId>
+        <version>1.0.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>war</packaging>
+    <artifactId>leisp-admin</artifactId>
+
+    <description>
+        web服务入口
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.dahuatech.icc</groupId>
+            <artifactId>java-sdk-oauth</artifactId>
+            <version>1.0.9</version>
+        </dependency>
+        <!-- SpringBoot集成thymeleaf模板 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+
+        <!-- spring-boot-devtools -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional> <!-- 表示依赖不会传递 -->
+        </dependency>
+
+        <!-- swagger2-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+        </dependency>
+
+        <!--防止进入swagger页面报类型转换错误,排除2.9.2中的引用,手动增加1.5.21版本-->
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+            <version>1.5.21</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-models</artifactId>
+            <version>1.5.21</version>
+        </dependency>
+
+        <!-- swagger2-UI-->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+        </dependency>
+
+        <!-- Mysql驱动包 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- 核心模块-->
+        <dependency>
+            <groupId>com.leisp</groupId>
+            <artifactId>leisp-framework</artifactId>
+        </dependency>
+
+        <!-- 定时任务-->
+        <dependency>
+            <groupId>com.leisp</groupId>
+            <artifactId>leisp-quartz</artifactId>
+        </dependency>
+
+        <!-- 代码生成-->
+        <dependency>
+            <groupId>com.leisp</groupId>
+            <artifactId>leisp-generator</artifactId>
+        </dependency>
+
+        <!-- 业务依赖 -->
+        <dependency>
+            <groupId>com.leisp</groupId>
+            <artifactId>mybusiness</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.1.1.RELEASE</version>
+                <configuration>
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.0.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <!--<warName>${project.artifactId}</warName>-->
+                </configuration>
+           </plugin>
+        </plugins>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 35 - 0
leiSP-admin/src/main/java/com/LeispApplication.java

@@ -0,0 +1,35 @@
+package com;
+
+import com.business.tools.CommonConfig;
+import com.dahua.sdk.client.DHClientTool;
+import com.dahua.sdk.client.DahuaDomainService;
+import com.dahua.sdk.client.common.SchemeEnum;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+/**
+ * 启动程序
+ *
+ * @author lei_wang
+ */
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
+public class LeispApplication
+{
+    public static void main(String[] args)
+    {
+        // System.setProperty("spring.devtools.restart.enabled", "false");
+        SpringApplication.run(LeispApplication.class, args);
+//        DHClientTool.createService(SchemeEnum.HTTPS, CommonConfig.SERVER_IP, CommonConfig.SERVER_PORT_HTTPS, CommonConfig.USERNAME, CommonConfig.PASSWORD);
+        System.out.println("**********SOOKA 管理系統 启动成功********* \n" +
+                "   _____  ____   ____  _  __                 _____ _____  \n" +
+                "  / ____|/ __ \\ / __ \\| |/ /    /\\    ___   / ____|  __ \\ \n" +
+                " | (___ | |  | | |  | | ' /    /  \\  ( _ ) | (___ | |__) |\n" +
+                "  \\___ \\| |  | | |  | |  <    / /\\ \\ / _ \\/\\\\___ \\|  ___/ \n" +
+                "  ____) | |__| | |__| | . \\  / ____ \\ (_>  <____) | |     \n" +
+                " |_____/ \\____/ \\____/|_|\\_\\/_/    \\_\\___/\\/_____/|_|     \n" +
+                "                                                          \n" +
+                "                                              ");
+    }
+}

+ 18 - 0
leiSP-admin/src/main/java/com/LeispServletInitializer.java

@@ -0,0 +1,18 @@
+package com;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ * 
+ * @author lei_wang
+ */
+public class LeispServletInitializer extends SpringBootServletInitializer
+{
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
+    {
+        return application.sources(LeispApplication.class);
+    }
+}

+ 148 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/common/CommonController.java

@@ -0,0 +1,148 @@
+package com.sooka.web.controller.common;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import com.dahuatech.hutool.http.Method;
+import com.dahuatech.hutool.json.JSONObject;
+import com.dahuatech.hutool.json.JSONUtil;
+import com.dahuatech.icc.exception.ClientException;
+import com.dahuatech.icc.oauth.http.DefaultClient;
+import com.dahuatech.icc.oauth.http.IClient;
+import com.dahuatech.icc.oauth.model.v202010.GeneralRequest;
+import com.dahuatech.icc.oauth.model.v202010.GeneralResponse;
+import com.sooka.common.utils.uuid.UUID;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import com.sooka.common.config.Global;
+import com.sooka.common.config.ServerConfig;
+import com.sooka.common.constant.Constants;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.utils.StringUtils;
+import com.sooka.common.utils.file.FileUploadUtils;
+import com.sooka.common.utils.file.FileUtils;
+
+
+/**
+ * 通用请求处理
+ *
+ * @author lei_wang
+ */
+@Controller
+public class CommonController
+{
+    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
+
+    @Autowired
+    private ServerConfig serverConfig;
+
+    /**
+     * 通用下载请求
+     *
+     * @param fileName 文件名称
+     * @param delete 是否删除
+     */
+    @GetMapping("common/download")
+    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
+    {
+        try
+        {
+            if (!FileUtils.isValidFilename(fileName))
+            {
+                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
+            }
+            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
+            String filePath = Global.getDownloadPath() + fileName;
+
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition",
+                    "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName));
+            FileUtils.writeBytes(filePath, response.getOutputStream());
+            if (delete)
+            {
+                FileUtils.deleteFile(filePath);
+            }
+        }
+        catch (Exception e)
+        {
+            log.error("下载文件失败", e);
+        }
+    }
+
+    /**
+     * 通用上传请求
+     */
+    @PostMapping("/common/upload")
+    @ResponseBody
+    public AjaxResult uploadFile(MultipartFile file) throws Exception
+    {
+        try
+        {
+            // 上传文件路径
+            String filePath = Global.getUploadPath();
+            // 上传并返回新文件名称
+            String fileName = FileUploadUtils.upload(filePath, file);
+            String url = serverConfig.getUrl() + fileName;
+            AjaxResult ajax = AjaxResult.success();
+            ajax.put("fileName", fileName);
+            ajax.put("url", url);
+            return ajax;
+        }
+        catch (Exception e)
+        {
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 本地资源通用下载
+     */
+    @GetMapping("/common/download/resource")
+    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
+            throws Exception
+    {
+        // 本地资源路径
+        String localPath = Global.getProfile();
+        // 数据库资源地址
+        String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
+        // 下载名称
+        String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
+        response.setCharacterEncoding("utf-8");
+        response.setContentType("multipart/form-data");
+        response.setHeader("Content-Disposition",
+                "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName));
+        FileUtils.writeBytes(downloadPath, response.getOutputStream());
+    }
+
+    /**
+     * 获取视频流地址
+     */
+    @RequestMapping("/hlsUrl")
+    @ResponseBody
+    public String hlsUrl(String q, String t, String type) throws ClientException {
+        IClient iClient = new DefaultClient();
+        GeneralRequest generalRequest =
+                new GeneralRequest("/evo-apigw/admin/API/MTS/Video/StartVideo", Method.POST);
+        String body =
+                "{\n" +
+                        "  \"data\": {\n" +
+                        "    \"channelId\": \"1006176$1$0$0\",\n" +
+                        "    \"dataType\": \"1\",\n" +
+                        "    \"streamType\": \"1\"\n" +
+                        "  }\n" +
+                        "}";
+        generalRequest.body(body);
+        GeneralResponse response = iClient.doAction(generalRequest, generalRequest.getResponseClass());
+        JSONObject obj = JSONUtil.parseObj(response.getResult());
+        String url = obj.getJSONObject("data").getStr("url");
+
+        return url;
+    }
+}

+ 80 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoDialogController.java

@@ -0,0 +1,80 @@
+package com.sooka.web.controller.demo.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * 模态窗口
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/demo/modal")
+public class DemoDialogController
+{
+    private String prefix = "demo/modal";
+
+    /**
+     * 模态窗口
+     */
+    @GetMapping("/dialog")
+    public String dialog()
+    {
+        return prefix + "/dialog";
+    }
+
+    /**
+     * 弹层组件
+     */
+    @GetMapping("/layer")
+    public String layer()
+    {
+        return prefix + "/layer";
+    }
+
+    /**
+     * 表单
+     */
+    @GetMapping("/form")
+    public String form()
+    {
+        return prefix + "/form";
+    }
+
+    /**
+     * 表格
+     */
+    @GetMapping("/table")
+    public String table()
+    {
+        return prefix + "/table";
+    }
+
+    /**
+     * 表格check
+     */
+    @GetMapping("/check")
+    public String check()
+    {
+        return prefix + "/table/check";
+    }
+
+    /**
+     * 表格radio
+     */
+    @GetMapping("/radio")
+    public String radio()
+    {
+        return prefix + "/table/radio";
+    }
+
+    /**
+     * 表格回传父窗体
+     */
+    @GetMapping("/parent")
+    public String parent()
+    {
+        return prefix + "/table/parent";
+    }
+}

Diferenças do arquivo suprimidas por serem muito extensas
+ 326 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoFormController.java


+ 35 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoIconController.java

@@ -0,0 +1,35 @@
+package com.sooka.web.controller.demo.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * 图标相关
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/demo/icon")
+public class DemoIconController
+{
+    private String prefix = "demo/icon";
+
+    /**
+     * FontAwesome图标
+     */
+    @GetMapping("/fontawesome")
+    public String fontAwesome()
+    {
+        return prefix + "/fontawesome";
+    }
+
+    /**
+     * Glyphicons图标
+     */
+    @GetMapping("/glyphicons")
+    public String glyphicons()
+    {
+        return prefix + "/glyphicons";
+    }
+}

+ 326 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoOperateController.java

@@ -0,0 +1,326 @@
+package com.sooka.web.controller.demo.controller;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.PageDomain;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.core.page.TableSupport;
+import com.sooka.common.core.text.Convert;
+import com.sooka.common.exception.BusinessException;
+import com.sooka.common.utils.StringUtils;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.web.controller.demo.domain.CustomerModel;
+import com.sooka.web.controller.demo.domain.UserOperateModel;
+
+/**
+ * 操作控制
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/demo/operate")
+public class DemoOperateController extends BaseController
+{
+    private String prefix = "demo/operate";
+
+    private final static Map<Integer, UserOperateModel> users = new LinkedHashMap<Integer, UserOperateModel>();
+    {
+        users.put(1, new UserOperateModel(1, "1000001", "测试1", "0", "15888888888", "ry@qq.com", 150.0, "0"));
+        users.put(2, new UserOperateModel(2, "1000002", "测试2", "1", "15666666666", "ry@qq.com", 180.0, "1"));
+        users.put(3, new UserOperateModel(3, "1000003", "测试3", "0", "15666666666", "ry@qq.com", 110.0, "1"));
+        users.put(4, new UserOperateModel(4, "1000004", "测试4", "1", "15666666666", "ry@qq.com", 220.0, "1"));
+        users.put(5, new UserOperateModel(5, "1000005", "测试5", "0", "15666666666", "ry@qq.com", 140.0, "1"));
+        users.put(6, new UserOperateModel(6, "1000006", "测试6", "1", "15666666666", "ry@qq.com", 330.0, "1"));
+        users.put(7, new UserOperateModel(7, "1000007", "测试7", "0", "15666666666", "ry@qq.com", 160.0, "1"));
+        users.put(8, new UserOperateModel(8, "1000008", "测试8", "1", "15666666666", "ry@qq.com", 170.0, "1"));
+        users.put(9, new UserOperateModel(9, "1000009", "测试9", "0", "15666666666", "ry@qq.com", 180.0, "1"));
+        users.put(10, new UserOperateModel(10, "1000010", "测试10", "0", "15666666666", "ry@qq.com", 210.0, "1"));
+        users.put(11, new UserOperateModel(11, "1000011", "测试11", "1", "15666666666", "ry@qq.com", 110.0, "1"));
+        users.put(12, new UserOperateModel(12, "1000012", "测试12", "0", "15666666666", "ry@qq.com", 120.0, "1"));
+        users.put(13, new UserOperateModel(13, "1000013", "测试13", "1", "15666666666", "ry@qq.com", 380.0, "1"));
+        users.put(14, new UserOperateModel(14, "1000014", "测试14", "0", "15666666666", "ry@qq.com", 280.0, "1"));
+        users.put(15, new UserOperateModel(15, "1000015", "测试15", "0", "15666666666", "ry@qq.com", 570.0, "1"));
+        users.put(16, new UserOperateModel(16, "1000016", "测试16", "1", "15666666666", "ry@qq.com", 260.0, "1"));
+        users.put(17, new UserOperateModel(17, "1000017", "测试17", "1", "15666666666", "ry@qq.com", 210.0, "1"));
+        users.put(18, new UserOperateModel(18, "1000018", "测试18", "1", "15666666666", "ry@qq.com", 340.0, "1"));
+        users.put(19, new UserOperateModel(19, "1000019", "测试19", "1", "15666666666", "ry@qq.com", 160.0, "1"));
+        users.put(20, new UserOperateModel(20, "1000020", "测试20", "1", "15666666666", "ry@qq.com", 220.0, "1"));
+        users.put(21, new UserOperateModel(21, "1000021", "测试21", "1", "15666666666", "ry@qq.com", 120.0, "1"));
+        users.put(22, new UserOperateModel(22, "1000022", "测试22", "1", "15666666666", "ry@qq.com", 130.0, "1"));
+        users.put(23, new UserOperateModel(23, "1000023", "测试23", "1", "15666666666", "ry@qq.com", 490.0, "1"));
+        users.put(24, new UserOperateModel(24, "1000024", "测试24", "1", "15666666666", "ry@qq.com", 570.0, "1"));
+        users.put(25, new UserOperateModel(25, "1000025", "测试25", "1", "15666666666", "ry@qq.com", 250.0, "1"));
+        users.put(26, new UserOperateModel(26, "1000026", "测试26", "1", "15666666666", "ry@qq.com", 250.0, "1"));
+    }
+
+    /**
+     * 表格
+     */
+    @GetMapping("/table")
+    public String table()
+    {
+        return prefix + "/table";
+    }
+
+    /**
+     * 其他
+     */
+    @GetMapping("/other")
+    public String other()
+    {
+        return prefix + "/other";
+    }
+
+    /**
+     * 查询数据
+     */
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(UserOperateModel userModel)
+    {
+        TableDataInfo rspData = new TableDataInfo();
+        List<UserOperateModel> userList = new ArrayList<UserOperateModel>(users.values());
+        // 查询条件过滤
+        if (StringUtils.isNotEmpty(userModel.getSearchValue()))
+        {
+            userList.clear();
+            for (Map.Entry<Integer, UserOperateModel> entry : users.entrySet())
+            {
+                if (entry.getValue().getUserName().equals(userModel.getSearchValue()))
+                {
+                    userList.add(entry.getValue());
+                }
+            }
+        }
+        else if (StringUtils.isNotEmpty(userModel.getUserName()))
+        {
+            userList.clear();
+            for (Map.Entry<Integer, UserOperateModel> entry : users.entrySet())
+            {
+                if (entry.getValue().getUserName().equals(userModel.getUserName()))
+                {
+                    userList.add(entry.getValue());
+                }
+            }
+        }
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        if (null == pageDomain.getPageNum() || null == pageDomain.getPageSize())
+        {
+            rspData.setRows(userList);
+            rspData.setTotal(userList.size());
+            return rspData;
+        }
+        Integer pageNum = (pageDomain.getPageNum() - 1) * 10;
+        Integer pageSize = pageDomain.getPageNum() * 10;
+        if (pageSize > userList.size())
+        {
+            pageSize = userList.size();
+        }
+        rspData.setRows(userList.subList(pageNum, pageSize));
+        rspData.setTotal(userList.size());
+        return rspData;
+    }
+
+    /**
+     * 新增用户
+     */
+    @GetMapping("/add")
+    public String add(ModelMap mmap)
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存用户
+     */
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(UserOperateModel user)
+    {
+        Integer userId = users.size() + 1;
+        user.setUserId(userId);
+        return AjaxResult.success(users.put(userId, user));
+    }
+
+    /**
+     * 新增保存主子表信息
+     */
+    @PostMapping("/customer/add")
+    @ResponseBody
+    public AjaxResult addSave(CustomerModel customerModel)
+    {
+        System.out.println(customerModel.toString());
+        return AjaxResult.success();
+    }
+
+    /**
+     * 修改用户
+     */
+    @GetMapping("/edit/{userId}")
+    public String edit(@PathVariable("userId") Integer userId, ModelMap mmap)
+    {
+        mmap.put("user", users.get(userId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存用户
+     */
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(UserOperateModel user)
+    {
+        return AjaxResult.success(users.put(user.getUserId(), user));
+    }
+
+    /**
+     * 导出
+     */
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(UserOperateModel user)
+    {
+        List<UserOperateModel> list = new ArrayList<UserOperateModel>(users.values());
+        ExcelUtil<UserOperateModel> util = new ExcelUtil<UserOperateModel>(UserOperateModel.class);
+        return util.exportExcel(list, "用户数据");
+    }
+
+    /**
+     * 下载模板
+     */
+    @GetMapping("/importTemplate")
+    @ResponseBody
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<UserOperateModel> util = new ExcelUtil<UserOperateModel>(UserOperateModel.class);
+        return util.importTemplateExcel("用户数据");
+    }
+
+    /**
+     * 导入数据
+     */
+    @PostMapping("/importData")
+    @ResponseBody
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<UserOperateModel> util = new ExcelUtil<UserOperateModel>(UserOperateModel.class);
+        List<UserOperateModel> userList = util.importExcel(file.getInputStream());
+        String message = importUser(userList, updateSupport);
+        return AjaxResult.success(message);
+    }
+
+    /**
+     * 删除用户
+     */
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        Integer[] userIds = Convert.toIntArray(ids);
+        for (Integer userId : userIds)
+        {
+            users.remove(userId);
+        }
+        return AjaxResult.success();
+    }
+
+    /**
+     * 查看详细
+     */
+    @GetMapping("/detail/{userId}")
+    public String detail(@PathVariable("userId") Integer userId, ModelMap mmap)
+    {
+        mmap.put("user", users.get(userId));
+        return prefix + "/detail";
+    }
+
+    @PostMapping("/clean")
+    @ResponseBody
+    public AjaxResult clean()
+    {
+        users.clear();
+        return success();
+    }
+
+    /**
+     * 导入用户数据
+     * 
+     * @param userList 用户数据列表
+     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
+     * @return 结果
+     */
+    public String importUser(List<UserOperateModel> userList, Boolean isUpdateSupport)
+    {
+        if (StringUtils.isNull(userList) || userList.size() == 0)
+        {
+            throw new BusinessException("导入用户数据不能为空!");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        for (UserOperateModel user : userList)
+        {
+            try
+            {
+                // 验证是否存在这个用户
+                boolean userFlag = false;
+                for (Map.Entry<Integer, UserOperateModel> entry : users.entrySet())
+                {
+                    if (entry.getValue().getUserName().equals(user.getUserName()))
+                    {
+                        userFlag = true;
+                        break;
+                    }
+                }
+                if (!userFlag)
+                {
+                    Integer userId = users.size() + 1;
+                    user.setUserId(userId);
+                    users.put(userId, user);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "、用户 " + user.getUserName() + " 导入成功");
+                }
+                else if (isUpdateSupport)
+                {
+                    users.put(user.getUserId(), user);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "、用户 " + user.getUserName() + " 更新成功");
+                }
+                else
+                {
+                    failureNum++;
+                    failureMsg.append("<br/>" + failureNum + "、用户 " + user.getUserName() + " 已存在");
+                }
+            }
+            catch (Exception e)
+            {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
+                failureMsg.append(msg + e.getMessage());
+            }
+        }
+        if (failureNum > 0)
+        {
+            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+            throw new BusinessException(failureMsg.toString());
+        }
+        else
+        {
+            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+        }
+        return successMsg.toString();
+    }
+}

+ 53 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoReportController.java

@@ -0,0 +1,53 @@
+package com.sooka.web.controller.demo.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * 报表
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/demo/report")
+public class DemoReportController
+{
+    private String prefix = "demo/report";
+
+    /**
+     * 百度ECharts
+     */
+    @GetMapping("/echarts")
+    public String echarts()
+    {
+        return prefix + "/echarts";
+    }
+
+    /**
+     * 图表插件
+     */
+    @GetMapping("/peity")
+    public String peity()
+    {
+        return prefix + "/peity";
+    }
+
+    /**
+     * 线状图插件
+     */
+    @GetMapping("/sparkline")
+    public String sparkline()
+    {
+        return prefix + "/sparkline";
+    }
+
+    /**
+     * 图表组合
+     */
+    @GetMapping("/metrics")
+    public String metrics()
+    {
+        return prefix + "/metrics";
+    }
+}

+ 423 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/controller/DemoTableController.java

@@ -0,0 +1,423 @@
+package com.sooka.web.controller.demo.controller;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.page.PageDomain;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.core.page.TableSupport;
+import com.sooka.common.utils.DateUtils;
+import com.sooka.common.utils.StringUtils;
+
+/**
+ * 表格相关
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/demo/table")
+public class DemoTableController extends BaseController
+{
+    private String prefix = "demo/table";
+
+    private final static List<UserTableModel> users = new ArrayList<UserTableModel>();
+    {
+        users.add(new UserTableModel(1, "1000001", "测试1", "0", "15888888888", "ry@qq.com", 150.0, "0"));
+        users.add(new UserTableModel(2, "1000002", "测试2", "1", "15666666666", "ry@qq.com", 180.0, "1"));
+        users.add(new UserTableModel(3, "1000003", "测试3", "0", "15666666666", "ry@qq.com", 110.0, "1"));
+        users.add(new UserTableModel(4, "1000004", "测试4", "1", "15666666666", "ry@qq.com", 220.0, "1"));
+        users.add(new UserTableModel(5, "1000005", "测试5", "0", "15666666666", "ry@qq.com", 140.0, "1"));
+        users.add(new UserTableModel(6, "1000006", "测试6", "1", "15666666666", "ry@qq.com", 330.0, "1"));
+        users.add(new UserTableModel(7, "1000007", "测试7", "0", "15666666666", "ry@qq.com", 160.0, "1"));
+        users.add(new UserTableModel(8, "1000008", "测试8", "1", "15666666666", "ry@qq.com", 170.0, "1"));
+        users.add(new UserTableModel(9, "1000009", "测试9", "0", "15666666666", "ry@qq.com", 180.0, "1"));
+        users.add(new UserTableModel(10, "1000010", "测试10", "0", "15666666666", "ry@qq.com", 210.0, "1"));
+        users.add(new UserTableModel(11, "1000011", "测试11", "1", "15666666666", "ry@qq.com", 110.0, "1"));
+        users.add(new UserTableModel(12, "1000012", "测试12", "0", "15666666666", "ry@qq.com", 120.0, "1"));
+        users.add(new UserTableModel(13, "1000013", "测试13", "1", "15666666666", "ry@qq.com", 380.0, "1"));
+        users.add(new UserTableModel(14, "1000014", "测试14", "0", "15666666666", "ry@qq.com", 280.0, "1"));
+        users.add(new UserTableModel(15, "1000015", "测试15", "0", "15666666666", "ry@qq.com", 570.0, "1"));
+        users.add(new UserTableModel(16, "1000016", "测试16", "1", "15666666666", "ry@qq.com", 260.0, "1"));
+        users.add(new UserTableModel(17, "1000017", "测试17", "1", "15666666666", "ry@qq.com", 210.0, "1"));
+        users.add(new UserTableModel(18, "1000018", "测试18", "1", "15666666666", "ry@qq.com", 340.0, "1"));
+        users.add(new UserTableModel(19, "1000019", "测试19", "1", "15666666666", "ry@qq.com", 160.0, "1"));
+        users.add(new UserTableModel(20, "1000020", "测试20", "1", "15666666666", "ry@qq.com", 220.0, "1"));
+        users.add(new UserTableModel(21, "1000021", "测试21", "1", "15666666666", "ry@qq.com", 120.0, "1"));
+        users.add(new UserTableModel(22, "1000022", "测试22", "1", "15666666666", "ry@qq.com", 130.0, "1"));
+        users.add(new UserTableModel(23, "1000023", "测试23", "1", "15666666666", "ry@qq.com", 490.0, "1"));
+        users.add(new UserTableModel(24, "1000024", "测试24", "1", "15666666666", "ry@qq.com", 570.0, "1"));
+        users.add(new UserTableModel(25, "1000025", "测试25", "1", "15666666666", "ry@qq.com", 250.0, "1"));
+        users.add(new UserTableModel(26, "1000026", "测试26", "1", "15666666666", "ry@qq.com", 250.0, "1"));
+    }
+
+    /**
+     * 搜索相关
+     */
+    @GetMapping("/search")
+    public String search()
+    {
+        return prefix + "/search";
+    }
+
+    /**
+     * 数据汇总
+     */
+    @GetMapping("/footer")
+    public String footer()
+    {
+        return prefix + "/footer";
+    }
+
+    /**
+     * 组合表头
+     */
+    @GetMapping("/groupHeader")
+    public String groupHeader()
+    {
+        return prefix + "/groupHeader";
+    }
+
+    /**
+     * 表格导出
+     */
+    @GetMapping("/export")
+    public String export()
+    {
+        return prefix + "/export";
+    }
+
+    /**
+     * 翻页记住选择
+     */
+    @GetMapping("/remember")
+    public String remember()
+    {
+        return prefix + "/remember";
+    }
+
+    /**
+     * 跳转至指定页
+     */
+    @GetMapping("/pageGo")
+    public String pageGo()
+    {
+        return prefix + "/pageGo";
+    }
+
+    /**
+     * 自定义查询参数
+     */
+    @GetMapping("/params")
+    public String params()
+    {
+        return prefix + "/params";
+    }
+
+    /**
+     * 多表格
+     */
+    @GetMapping("/multi")
+    public String multi()
+    {
+        return prefix + "/multi";
+    }
+
+    /**
+     * 点击按钮加载表格
+     */
+    @GetMapping("/button")
+    public String button()
+    {
+        return prefix + "/button";
+    }
+
+    /**
+     * 直接加载表格数据
+     */
+    @GetMapping("/data")
+    public String data(ModelMap mmap)
+    {
+        mmap.put("users", users);
+        return prefix + "/data";
+    }
+
+    /**
+     * 表格冻结列
+     */
+    @GetMapping("/fixedColumns")
+    public String fixedColumns()
+    {
+        return prefix + "/fixedColumns";
+    }
+
+    /**
+     * 自定义触发事件
+     */
+    @GetMapping("/event")
+    public String event()
+    {
+        return prefix + "/event";
+    }
+
+    /**
+     * 表格细节视图
+     */
+    @GetMapping("/detail")
+    public String detail()
+    {
+        return prefix + "/detail";
+    }
+
+    /**
+     * 表格父子视图
+     */
+    @GetMapping("/child")
+    public String child()
+    {
+        return prefix + "/child";
+    }
+
+    /**
+     * 表格图片预览
+     */
+    @GetMapping("/image")
+    public String image()
+    {
+        return prefix + "/image";
+    }
+
+    /**
+     * 动态增删改查
+     */
+    @GetMapping("/curd")
+    public String curd()
+    {
+        return prefix + "/curd";
+    }
+
+    /**
+     * 表格拖拽操作
+     */
+    @GetMapping("/reorder")
+    public String reorder()
+    {
+        return prefix + "/reorder";
+    }
+
+    /**
+     * 表格行内编辑操作
+     */
+    @GetMapping("/editable")
+    public String editable()
+    {
+        return prefix + "/editable";
+    }
+
+    /**
+     * 主子表提交
+     */
+    @GetMapping("/subdata")
+    public String subdata()
+    {
+        return prefix + "/subdata";
+    }
+
+    /**
+     * 表格其他操作
+     */
+    @GetMapping("/other")
+    public String other()
+    {
+        return prefix + "/other";
+    }
+
+    /**
+     * 查询数据
+     */
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(UserTableModel userModel)
+    {
+        TableDataInfo rspData = new TableDataInfo();
+        List<UserTableModel> userList = new ArrayList<UserTableModel>(Arrays.asList(new UserTableModel[users.size()]));
+        Collections.copy(userList, users);
+        // 查询条件过滤
+        if (StringUtils.isNotEmpty(userModel.getUserName()))
+        {
+            userList.clear();
+            for (UserTableModel user : users)
+            {
+                if (user.getUserName().equals(userModel.getUserName()))
+                {
+                    userList.add(user);
+                }
+            }
+        }
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        if (null == pageDomain.getPageNum() || null == pageDomain.getPageSize())
+        {
+            rspData.setRows(userList);
+            rspData.setTotal(userList.size());
+            return rspData;
+        }
+        Integer pageNum = (pageDomain.getPageNum() - 1) * 10;
+        Integer pageSize = pageDomain.getPageNum() * 10;
+        if (pageSize > userList.size())
+        {
+            pageSize = userList.size();
+        }
+        rspData.setRows(userList.subList(pageNum, pageSize));
+        rspData.setTotal(userList.size());
+        return rspData;
+    }
+}
+
+class UserTableModel
+{
+    /** 用户ID */
+    private int userId;
+
+    /** 用户编号 */
+    private String userCode;
+
+    /** 用户姓名 */
+    private String userName;
+
+    /** 用户性别 */
+    private String userSex;
+
+    /** 用户手机 */
+    private String userPhone;
+
+    /** 用户邮箱 */
+    private String userEmail;
+
+    /** 用户余额 */
+    private double userBalance;
+
+    /** 用户状态(0正常 1停用) */
+    private String status;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    public UserTableModel()
+    {
+
+    }
+
+    public UserTableModel(int userId, String userCode, String userName, String userSex, String userPhone,
+            String userEmail, double userBalance, String status)
+    {
+        this.userId = userId;
+        this.userCode = userCode;
+        this.userName = userName;
+        this.userSex = userSex;
+        this.userPhone = userPhone;
+        this.userEmail = userEmail;
+        this.userBalance = userBalance;
+        this.status = status;
+        this.createTime = DateUtils.getNowDate();
+    }
+
+    public int getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(int userId)
+    {
+        this.userId = userId;
+    }
+
+    public String getUserCode()
+    {
+        return userCode;
+    }
+
+    public void setUserCode(String userCode)
+    {
+        this.userCode = userCode;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getUserSex()
+    {
+        return userSex;
+    }
+
+    public void setUserSex(String userSex)
+    {
+        this.userSex = userSex;
+    }
+
+    public String getUserPhone()
+    {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone)
+    {
+        this.userPhone = userPhone;
+    }
+
+    public String getUserEmail()
+    {
+        return userEmail;
+    }
+
+    public void setUserEmail(String userEmail)
+    {
+        this.userEmail = userEmail;
+    }
+
+    public double getUserBalance()
+    {
+        return userBalance;
+    }
+
+    public void setUserBalance(double userBalance)
+    {
+        this.userBalance = userBalance;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public Date getCreateTime()
+    {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime)
+    {
+        this.createTime = createTime;
+    }
+}

+ 116 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/domain/CustomerModel.java

@@ -0,0 +1,116 @@
+package com.sooka.web.controller.demo.domain;
+
+import java.util.List;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 客户测试信息
+ * 
+ * @author lei_wang
+ */
+public class CustomerModel
+{
+    /**
+     * 客户姓名
+     */
+    private String name;
+
+    /**
+     * 客户手机
+     */
+    private String phonenumber;
+
+    /**
+     * 客户性别
+     */
+    private String sex;
+
+    /**
+     * 客户生日
+     */
+    private String birthday;
+
+    /**
+     * 客户描述
+     */
+    private String remark;
+
+    /**
+     * 商品信息
+     */
+    private List<GoodsModel> goods;
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getPhonenumber()
+    {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber)
+    {
+        this.phonenumber = phonenumber;
+    }
+
+
+    public String getSex()
+    {
+        return sex;
+    }
+
+    public void setSex(String sex)
+    {
+        this.sex = sex;
+    }
+
+    public String getBirthday()
+    {
+        return birthday;
+    }
+
+    public void setBirthday(String birthday)
+    {
+        this.birthday = birthday;
+    }
+
+    public String getRemark()
+    {
+        return remark;
+    }
+
+    public void setRemark(String remark)
+    {
+        this.remark = remark;
+    }
+
+    public List<GoodsModel> getGoods()
+    {
+        return goods;
+    }
+
+    public void setGoods(List<GoodsModel> goods)
+    {
+        this.goods = goods;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("name", getName())
+            .append("phonenumber", getPhonenumber())
+            .append("sex", getSex())
+            .append("birthday", getBirthday())
+            .append("goods", getGoods())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 82 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/domain/GoodsModel.java

@@ -0,0 +1,82 @@
+package com.sooka.web.controller.demo.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 商品测试信息
+ * 
+ * @author lei_wang
+ */
+public class GoodsModel
+{
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    /**
+     * 商品重量
+     */
+    private Integer weight;
+
+    /**
+     * 商品价格
+     */
+    private Double price;
+
+    /**
+     * 商品种类
+     */
+    private String type;
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public Integer getWeight()
+    {
+        return weight;
+    }
+
+    public void setWeight(Integer weight)
+    {
+        this.weight = weight;
+    }
+
+    public Double getPrice()
+    {
+        return price;
+    }
+
+    public void setPrice(Double price)
+    {
+        this.price = price;
+    }
+
+    public String getType()
+    {
+        return type;
+    }
+
+    public void setType(String type)
+    {
+        this.type = type;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("name", getName())
+            .append("weight", getWeight())
+            .append("price", getPrice())
+            .append("type", getType())
+            .toString();
+    }
+}

+ 149 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/demo/domain/UserOperateModel.java

@@ -0,0 +1,149 @@
+package com.sooka.web.controller.demo.domain;
+
+import java.util.Date;
+import com.sooka.common.annotation.Excel;
+import com.sooka.common.annotation.Excel.Type;
+import com.sooka.common.core.domain.BaseEntity;
+import com.sooka.common.utils.DateUtils;
+
+public class UserOperateModel extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    private int userId;
+
+    @Excel(name = "用户编号")
+    private String userCode;
+
+    @Excel(name = "用户姓名")
+    private String userName;
+
+    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
+    private String userSex;
+
+    @Excel(name = "用户手机")
+    private String userPhone;
+
+    @Excel(name = "用户邮箱")
+    private String userEmail;
+
+    @Excel(name = "用户余额")
+    private double userBalance;
+
+    @Excel(name = "用户状态", readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
+    private Date createTime;
+
+    public UserOperateModel()
+    {
+
+    }
+
+    public UserOperateModel(int userId, String userCode, String userName, String userSex, String userPhone,
+            String userEmail, double userBalance, String status)
+    {
+        this.userId = userId;
+        this.userCode = userCode;
+        this.userName = userName;
+        this.userSex = userSex;
+        this.userPhone = userPhone;
+        this.userEmail = userEmail;
+        this.userBalance = userBalance;
+        this.status = status;
+        this.createTime = DateUtils.getNowDate();
+    }
+
+    public int getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(int userId)
+    {
+        this.userId = userId;
+    }
+
+    public String getUserCode()
+    {
+        return userCode;
+    }
+
+    public void setUserCode(String userCode)
+    {
+        this.userCode = userCode;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getUserSex()
+    {
+        return userSex;
+    }
+
+    public void setUserSex(String userSex)
+    {
+        this.userSex = userSex;
+    }
+
+    public String getUserPhone()
+    {
+        return userPhone;
+    }
+
+    public void setUserPhone(String userPhone)
+    {
+        this.userPhone = userPhone;
+    }
+
+    public String getUserEmail()
+    {
+        return userEmail;
+    }
+
+    public void setUserEmail(String userEmail)
+    {
+        this.userEmail = userEmail;
+    }
+
+    public double getUserBalance()
+    {
+        return userBalance;
+    }
+
+    public void setUserBalance(double userBalance)
+    {
+        this.userBalance = userBalance;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    @Override
+    public Date getCreateTime()
+    {
+        return createTime;
+    }
+
+    @Override
+    public void setCreateTime(Date createTime)
+    {
+        this.createTime = createTime;
+    }
+}

+ 26 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/monitor/DruidController.java

@@ -0,0 +1,26 @@
+package com.sooka.web.controller.monitor;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.sooka.common.core.controller.BaseController;
+
+/**
+ * druid 监控
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/monitor/data")
+public class DruidController extends BaseController
+{
+    private String prefix = "/druid";
+
+    @RequiresPermissions("monitor:data:view")
+    @GetMapping()
+    public String index()
+    {
+        return redirect(prefix + "/index");
+    }
+}

+ 31 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/monitor/ServerController.java

@@ -0,0 +1,31 @@
+package com.sooka.web.controller.monitor;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.framework.web.domain.Server;
+
+/**
+ * 服务器监控
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/monitor/server")
+public class ServerController extends BaseController
+{
+    private String prefix = "monitor/server";
+
+    @RequiresPermissions("monitor:server:view")
+    @GetMapping()
+    public String server(ModelMap mmap) throws Exception
+    {
+        Server server = new Server();
+        server.copyTo();
+        mmap.put("server", server);
+        return prefix + "/server";
+    }
+}

+ 94 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/monitor/SysLogininforController.java

@@ -0,0 +1,94 @@
+package com.sooka.web.controller.monitor;
+
+import java.util.List;
+import com.sooka.framework.shiro.service.SysPasswordService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.system.domain.SysLogininfor;
+import com.sooka.system.service.ISysLogininforService;
+
+/**
+ * 系统访问记录
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/monitor/logininfor")
+public class SysLogininforController extends BaseController
+{
+    private String prefix = "monitor/logininfor";
+
+    @Autowired
+    private ISysLogininforService logininforService;
+
+    @Autowired
+    private SysPasswordService passwordService;
+
+    @RequiresPermissions("monitor:logininfor:view")
+    @GetMapping()
+    public String logininfor()
+    {
+        return prefix + "/logininfor";
+    }
+
+    @RequiresPermissions("monitor:logininfor:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysLogininfor logininfor)
+    {
+        startPage();
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
+        return getDataTable(list);
+    }
+
+    @Log(title = "登陆日志", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("monitor:logininfor:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysLogininfor logininfor)
+    {
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
+        ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
+        return util.exportExcel(list, "登陆日志");
+    }
+
+    @RequiresPermissions("monitor:logininfor:remove")
+    @Log(title = "登陆日志", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(logininforService.deleteLogininforByIds(ids));
+    }
+    
+    @RequiresPermissions("monitor:logininfor:remove")
+    @Log(title = "登陆日志", businessType = BusinessType.CLEAN)
+    @PostMapping("/clean")
+    @ResponseBody
+    public AjaxResult clean()
+    {
+        logininforService.cleanLogininfor();
+        return success();
+    }
+
+    @RequiresPermissions("monitor:logininfor:unlock")
+    @Log(title = "账户解锁", businessType = BusinessType.OTHER)
+    @PostMapping("/unlock")
+    @ResponseBody
+    public AjaxResult unlock(String loginName)
+    {
+        passwordService.unlock(loginName);
+        return success();
+    }
+}

+ 89 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/monitor/SysOperlogController.java

@@ -0,0 +1,89 @@
+package com.sooka.web.controller.monitor;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.system.domain.SysOperLog;
+import com.sooka.system.service.ISysOperLogService;
+
+/**
+ * 操作日志记录
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/monitor/operlog")
+public class SysOperlogController extends BaseController
+{
+    private String prefix = "monitor/operlog";
+
+    @Autowired
+    private ISysOperLogService operLogService;
+
+    @RequiresPermissions("monitor:operlog:view")
+    @GetMapping()
+    public String operlog()
+    {
+        return prefix + "/operlog";
+    }
+
+    @RequiresPermissions("monitor:operlog:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysOperLog operLog)
+    {
+        startPage();
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        return getDataTable(list);
+    }
+
+    @Log(title = "操作日志", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("monitor:operlog:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysOperLog operLog)
+    {
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
+        return util.exportExcel(list, "操作日志");
+    }
+
+    @RequiresPermissions("monitor:operlog:remove")
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(operLogService.deleteOperLogByIds(ids));
+    }
+
+    @RequiresPermissions("monitor:operlog:detail")
+    @GetMapping("/detail/{operId}")
+    public String detail(@PathVariable("operId") Long operId, ModelMap mmap)
+    {
+        mmap.put("operLog", operLogService.selectOperLogById(operId));
+        return prefix + "/detail";
+    }
+    
+    @Log(title = "操作日志", businessType = BusinessType.CLEAN)
+    @RequiresPermissions("monitor:operlog:remove")
+    @PostMapping("/clean")
+    @ResponseBody
+    public AjaxResult clean()
+    {
+        operLogService.cleanOperLog();
+        return success();
+    }
+}

+ 88 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/monitor/SysUserOnlineController.java

@@ -0,0 +1,88 @@
+package com.sooka.web.controller.monitor;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.core.text.Convert;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.enums.OnlineStatus;
+import com.sooka.framework.shiro.session.OnlineSession;
+import com.sooka.framework.shiro.session.OnlineSessionDAO;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysUserOnline;
+import com.sooka.system.service.ISysUserOnlineService;
+
+/**
+ * 在线用户监控
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/monitor/online")
+public class SysUserOnlineController extends BaseController
+{
+    private String prefix = "monitor/online";
+
+    @Autowired
+    private ISysUserOnlineService userOnlineService;
+
+    @Autowired
+    private OnlineSessionDAO onlineSessionDAO;
+
+    @RequiresPermissions("monitor:online:view")
+    @GetMapping()
+    public String online()
+    {
+        return prefix + "/online";
+    }
+
+    @RequiresPermissions("monitor:online:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysUserOnline userOnline)
+    {
+        startPage();
+        List<SysUserOnline> list = userOnlineService.selectUserOnlineList(userOnline);
+        return getDataTable(list);
+    }
+
+    @RequiresPermissions(value = { "monitor:online:batchForceLogout", "monitor:online:forceLogout" }, logical = Logical.OR)
+    @Log(title = "在线用户", businessType = BusinessType.FORCE)
+    @PostMapping("/batchForceLogout")
+    @ResponseBody
+    public AjaxResult batchForceLogout(String ids)
+    {
+        for (String sessionId : Convert.toStrArray(ids))
+        {
+            SysUserOnline online = userOnlineService.selectOnlineById(sessionId);
+            if (online == null)
+            {
+                return error("用户已下线");
+            }
+            OnlineSession onlineSession = (OnlineSession) onlineSessionDAO.readSession(online.getSessionId());
+            if (onlineSession == null)
+            {
+                return error("用户已下线");
+            }
+            if (sessionId.equals(ShiroUtils.getSessionId()))
+            {
+                return error("当前登陆用户无法强退");
+            }
+            onlineSession.setStatus(OnlineStatus.off_line);
+            onlineSessionDAO.update(onlineSession);
+            online.setStatus(OnlineStatus.off_line);
+            userOnlineService.saveOnline(online);
+        }
+        return success();
+    }
+}

+ 92 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysCaptchaController.java

@@ -0,0 +1,92 @@
+package com.sooka.web.controller.system;
+
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+import com.google.code.kaptcha.Constants;
+import com.google.code.kaptcha.Producer;
+import com.sooka.common.core.controller.BaseController;
+
+/**
+ * 图片验证码(支持算术形式)
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/captcha")
+public class SysCaptchaController extends BaseController
+{
+    @Resource(name = "captchaProducer")
+    private Producer captchaProducer;
+
+    @Resource(name = "captchaProducerMath")
+    private Producer captchaProducerMath;
+
+    /**
+     * 验证码生成
+     */
+    @GetMapping(value = "/captchaImage")
+    public ModelAndView getKaptchaImage(HttpServletRequest request, HttpServletResponse response)
+    {
+        ServletOutputStream out = null;
+        try
+        {
+            HttpSession session = request.getSession();
+            response.setDateHeader("Expires", 0);
+            response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
+            response.addHeader("Cache-Control", "post-check=0, pre-check=0");
+            response.setHeader("Pragma", "no-cache");
+            response.setContentType("image/jpeg");
+
+            String type = request.getParameter("type");
+            String capStr = null;
+            String code = null;
+            BufferedImage bi = null;
+            if ("math".equals(type))
+            {
+                String capText = captchaProducerMath.createText();
+                capStr = capText.substring(0, capText.lastIndexOf("@"));
+                code = capText.substring(capText.lastIndexOf("@") + 1);
+                bi = captchaProducerMath.createImage(capStr);
+            }
+            else if ("char".equals(type))
+            {
+                capStr = code = captchaProducer.createText();
+                bi = captchaProducer.createImage(capStr);
+            }
+            session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);
+            out = response.getOutputStream();
+            ImageIO.write(bi, "jpg", out);
+            out.flush();
+
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        finally
+        {
+            try
+            {
+                if (out != null)
+                {
+                    out.close();
+                }
+            }
+            catch (IOException e)
+            {
+                e.printStackTrace();
+            }
+        }
+        return null;
+    }
+}

+ 157 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysConfigController.java

@@ -0,0 +1,157 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.constant.UserConstants;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysConfig;
+import com.sooka.system.service.ISysConfigService;
+
+/**
+ * 参数配置 信息操作处理
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/config")
+public class SysConfigController extends BaseController
+{
+    private String prefix = "system/config";
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @RequiresPermissions("system:config:view")
+    @GetMapping()
+    public String config()
+    {
+        return prefix + "/config";
+    }
+
+    /**
+     * 查询参数配置列表
+     */
+    @RequiresPermissions("system:config:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysConfig config)
+    {
+        startPage();
+        List<SysConfig> list = configService.selectConfigList(config);
+        return getDataTable(list);
+    }
+
+    @Log(title = "参数管理", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("system:config:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysConfig config)
+    {
+        List<SysConfig> list = configService.selectConfigList(config);
+        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
+        return util.exportExcel(list, "参数数据");
+    }
+
+    /**
+     * 新增参数配置
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存参数配置
+     */
+    @RequiresPermissions("system:config:add")
+    @Log(title = "参数管理", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysConfig config)
+    {
+        if (UserConstants.CONFIG_KEY_NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
+        {
+            return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
+        }
+        config.setCreateBy(ShiroUtils.getLoginName());
+        return toAjax(configService.insertConfig(config));
+    }
+
+    /**
+     * 修改参数配置
+     */
+    @GetMapping("/edit/{configId}")
+    public String edit(@PathVariable("configId") Long configId, ModelMap mmap)
+    {
+        mmap.put("config", configService.selectConfigById(configId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存参数配置
+     */
+    @RequiresPermissions("system:config:edit")
+    @Log(title = "参数管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysConfig config)
+    {
+        if (UserConstants.CONFIG_KEY_NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
+        {
+            return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
+        }
+        config.setUpdateBy(ShiroUtils.getLoginName());
+        return toAjax(configService.updateConfig(config));
+    }
+
+    /**
+     * 删除参数配置
+     */
+    @RequiresPermissions("system:config:remove")
+    @Log(title = "参数管理", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(configService.deleteConfigByIds(ids));
+    }
+
+    /**
+     * 清空缓存
+     */
+    @RequiresPermissions("system:config:remove")
+    @Log(title = "参数管理", businessType = BusinessType.CLEAN)
+    @GetMapping("/clearCache")
+    @ResponseBody
+    public AjaxResult clearCache()
+    {
+        configService.clearCache();
+        return success();
+    }
+
+    /**
+     * 校验参数键名
+     */
+    @PostMapping("/checkConfigKeyUnique")
+    @ResponseBody
+    public String checkConfigKeyUnique(SysConfig config)
+    {
+        return configService.checkConfigKeyUnique(config);
+    }
+}

+ 252 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysDeptController.java

@@ -0,0 +1,252 @@
+package com.sooka.web.controller.system;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.sooka.system.domain.SysPost;
+import com.sooka.system.service.ISysPostService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.constant.UserConstants;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.domain.Ztree;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.StringUtils;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysDept;
+import com.sooka.system.domain.SysRole;
+import com.sooka.system.service.ISysDeptService;
+
+/**
+ * 部门信息
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/dept")
+public class SysDeptController extends BaseController
+{
+    private String prefix = "system/dept";
+
+    @Autowired
+    private ISysDeptService deptService;
+    @Autowired
+    private ISysPostService postService;
+
+    @RequiresPermissions("system:dept:view")
+    @GetMapping()
+    public String dept()
+    {
+        return prefix + "/dept";
+    }
+
+    @RequiresPermissions("system:dept:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public List<SysDept> list(SysDept dept)
+    {
+        List<SysDept> deptList = deptService.selectDeptList(dept);
+        return deptList;
+    }
+
+    /**
+     * 新增部门
+     */
+    @GetMapping("/add/{parentId}")
+    public String add(@PathVariable("parentId") Long parentId, ModelMap mmap)
+    {
+        mmap.put("dept", deptService.selectDeptById(parentId));
+        mmap.put("posts", postService.selectPostAll());//机构性质
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存部门
+     */
+    @Log(title = "部门管理", businessType = BusinessType.INSERT)
+    @RequiresPermissions("system:dept:add")
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysDept dept)
+    {
+        if (UserConstants.DEPT_NAME_NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
+        {
+            return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
+        }
+        dept.setCreateBy(ShiroUtils.getLoginName());
+        return toAjax(deptService.insertDept(dept));
+    }
+
+    /**
+     * 修改
+     */
+    @GetMapping("/edit/{deptId}")
+    public String edit(@PathVariable("deptId") Long deptId, ModelMap mmap)
+    {
+        SysDept dept = deptService.selectDeptById(deptId);
+        if (StringUtils.isNotNull(dept) && 100L == deptId)
+        {
+            dept.setParentName("无");
+        }
+        mmap.put("dept", dept);
+        //机构性质
+        List<SysPost> posts = postService.selectPostAll();
+        for (SysPost post:posts) {
+            if(post.getPostId().longValue() == dept.getPostId().longValue()){
+                post.setFlag(true);
+                break;
+            }
+        }
+        mmap.put("posts", posts);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 保存
+     */
+    @Log(title = "部门管理", businessType = BusinessType.UPDATE)
+    @RequiresPermissions("system:dept:edit")
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysDept dept)
+    {
+        if (UserConstants.DEPT_NAME_NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
+        {
+            return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
+        }
+        else if (dept.getParentId().equals(dept.getDeptId()))
+        {
+            return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
+        }
+        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())
+                && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0)
+        {
+            return AjaxResult.error("该部门包含未停用的子部门!");
+        }
+        dept.setUpdateBy(ShiroUtils.getLoginName());
+        return toAjax(deptService.updateDept(dept));
+    }
+
+    /**
+     * 删除
+     */
+    @Log(title = "部门管理", businessType = BusinessType.DELETE)
+    @RequiresPermissions("system:dept:remove")
+    @GetMapping("/remove/{deptId}")
+    @ResponseBody
+    public AjaxResult remove(@PathVariable("deptId") Long deptId)
+    {
+        if (deptService.selectDeptCount(deptId) > 0)
+        {
+            return AjaxResult.warn("存在下级部门,不允许删除");
+        }
+        if (deptService.checkDeptExistUser(deptId))
+        {
+            return AjaxResult.warn("部门存在用户,不允许删除");
+        }
+        return toAjax(deptService.deleteDeptById(deptId));
+    }
+
+    /**
+     * 校验部门名称
+     */
+    @PostMapping("/checkDeptNameUnique")
+    @ResponseBody
+    public String checkDeptNameUnique(SysDept dept)
+    {
+        return deptService.checkDeptNameUnique(dept);
+    }
+
+    /**
+     * 选择部门树
+     * 
+     * @param deptId 部门ID
+     * @param excludeId 排除ID
+     */
+    @GetMapping(value = { "/selectDeptTree/{deptId}", "/selectDeptTree/{deptId}/{excludeId}" })
+    public String selectDeptTree(@PathVariable("deptId") Long deptId,
+            @PathVariable(value = "excludeId", required = false) String excludeId, ModelMap mmap)
+    {
+        mmap.put("dept", deptService.selectDeptById(deptId));
+        mmap.put("excludeId", excludeId);
+        return prefix + "/tree";
+    }
+
+    /**
+     * 加载部门列表树
+     */
+    @GetMapping("/treeData")
+    @ResponseBody
+    public List<Ztree> treeData()
+    {
+        List<Ztree> ztrees = deptService.selectDeptTree(new SysDept());
+        return ztrees;
+    }
+
+    /**
+     * 加载部门列表树
+     */
+    @GetMapping("/treeDataList")
+    @ResponseBody
+    public List<Ztree> treeDataList()
+    {
+        SysDept sysDept = new SysDept();
+        SysDept shiroDept = ShiroUtils.getSysUser().getDept();
+        /**
+         * if(postID不是null,并且等于 6区级委办局,8街道委办科室,10网格)
+         * 只查自己和父级组织机构
+         *
+         * else if(部门ID=1,也就是最顶级)
+         * 查询所有组织结构
+         *
+         * 如果以上都不满足,说明是街道指挥中心(postId=7),区级指挥中心(postId=5)或者领导 ,查询父级下所有组织机构
+         * */
+        if(shiroDept.getPostId() != null &&
+                (shiroDept.getPostId() == 6 || shiroDept.getPostId() == 8 || shiroDept.getPostId() == 10)){
+            SysDept pDept = deptService.selectDeptById(shiroDept.getParentId());
+            SysDept dept = deptService.selectDeptById(ShiroUtils.getSysUser().getDept().getDeptId());
+            List<SysDept> deptList = new ArrayList<>();
+            deptList.add(pDept);
+            deptList.add(dept);
+            return deptService.initZtree(deptList);
+        }else if(shiroDept.getDeptId() == 1){
+            return deptService.selectDeptTree(new SysDept());
+        }
+        sysDept.setParentId(ShiroUtils.getSysUser().getDept().getParentId());
+        return deptService.selectDeptTreeList(sysDept);
+    }
+
+    /**
+     * 加载部门列表树(排除下级)
+     */
+    @GetMapping("/treeData/{excludeId}")
+    @ResponseBody
+    public List<Ztree> treeDataExcludeChild(@PathVariable(value = "excludeId", required = false) Long excludeId)
+    {
+        SysDept dept = new SysDept();
+        dept.setDeptId(excludeId);
+        List<Ztree> ztrees = deptService.selectDeptTreeExcludeChild(dept);
+        return ztrees;
+    }
+
+    /**
+     * 加载角色部门(数据权限)列表树
+     */
+    @GetMapping("/roleDeptTreeData")
+    @ResponseBody
+    public List<Ztree> deptTreeData(SysRole role)
+    {
+        List<Ztree> ztrees = deptService.roleDeptTreeData(role);
+        return ztrees;
+    }
+}

+ 120 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysDictDataController.java

@@ -0,0 +1,120 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysDictData;
+import com.sooka.system.service.ISysDictDataService;
+
+/**
+ * 数据字典信息
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/dict/data")
+public class SysDictDataController extends BaseController
+{
+    private String prefix = "system/dict/data";
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    @RequiresPermissions("system:dict:view")
+    @GetMapping()
+    public String dictData()
+    {
+        return prefix + "/data";
+    }
+
+    @PostMapping("/list")
+    @RequiresPermissions("system:dict:list")
+    @ResponseBody
+    public TableDataInfo list(SysDictData dictData)
+    {
+        startPage();
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        return getDataTable(list);
+    }
+
+    @Log(title = "字典数据", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("system:dict:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysDictData dictData)
+    {
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
+        return util.exportExcel(list, "字典数据");
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @GetMapping("/add/{dictType}")
+    public String add(@PathVariable("dictType") String dictType, ModelMap mmap)
+    {
+        mmap.put("dictType", dictType);
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存字典类型
+     */
+    @Log(title = "字典数据", businessType = BusinessType.INSERT)
+    @RequiresPermissions("system:dict:add")
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysDictData dict)
+    {
+        dict.setCreateBy(ShiroUtils.getLoginName());
+        return toAjax(dictDataService.insertDictData(dict));
+    }
+
+    /**
+     * 修改字典类型
+     */
+    @GetMapping("/edit/{dictCode}")
+    public String edit(@PathVariable("dictCode") Long dictCode, ModelMap mmap)
+    {
+        mmap.put("dict", dictDataService.selectDictDataById(dictCode));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存字典类型
+     */
+    @Log(title = "字典数据", businessType = BusinessType.UPDATE)
+    @RequiresPermissions("system:dict:edit")
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysDictData dict)
+    {
+        dict.setUpdateBy(ShiroUtils.getLoginName());
+        return toAjax(dictDataService.updateDictData(dict));
+    }
+
+    @Log(title = "字典数据", businessType = BusinessType.DELETE)
+    @RequiresPermissions("system:dict:remove")
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(dictDataService.deleteDictDataByIds(ids));
+    }
+}

+ 188 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysDictTypeController.java

@@ -0,0 +1,188 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.constant.UserConstants;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.domain.Ztree;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysDictType;
+import com.sooka.system.service.ISysDictTypeService;
+
+/**
+ * 数据字典信息
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/dict")
+public class SysDictTypeController extends BaseController
+{
+    private String prefix = "system/dict/type";
+
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+    @RequiresPermissions("system:dict:view")
+    @GetMapping()
+    public String dictType()
+    {
+        return prefix + "/type";
+    }
+
+    @PostMapping("/list")
+    @RequiresPermissions("system:dict:list")
+    @ResponseBody
+    public TableDataInfo list(SysDictType dictType)
+    {
+        startPage();
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        return getDataTable(list);
+    }
+
+    @Log(title = "字典类型", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("system:dict:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysDictType dictType)
+    {
+
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
+        return util.exportExcel(list, "字典类型");
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存字典类型
+     */
+    @Log(title = "字典类型", businessType = BusinessType.INSERT)
+    @RequiresPermissions("system:dict:add")
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysDictType dict)
+    {
+        if (UserConstants.DICT_TYPE_NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
+        {
+            return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        dict.setCreateBy(ShiroUtils.getLoginName());
+        return toAjax(dictTypeService.insertDictType(dict));
+    }
+
+    /**
+     * 修改字典类型
+     */
+    @GetMapping("/edit/{dictId}")
+    public String edit(@PathVariable("dictId") Long dictId, ModelMap mmap)
+    {
+        mmap.put("dict", dictTypeService.selectDictTypeById(dictId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存字典类型
+     */
+    @Log(title = "字典类型", businessType = BusinessType.UPDATE)
+    @RequiresPermissions("system:dict:edit")
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysDictType dict)
+    {
+        if (UserConstants.DICT_TYPE_NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
+        {
+            return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        dict.setUpdateBy(ShiroUtils.getLoginName());
+        return toAjax(dictTypeService.updateDictType(dict));
+    }
+
+    @Log(title = "字典类型", businessType = BusinessType.DELETE)
+    @RequiresPermissions("system:dict:remove")
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(dictTypeService.deleteDictTypeByIds(ids));
+    }
+
+    /**
+     * 清空缓存
+     */
+    @RequiresPermissions("system:dict:remove")
+    @Log(title = "字典类型", businessType = BusinessType.CLEAN)
+    @GetMapping("/clearCache")
+    @ResponseBody
+    public AjaxResult clearCache()
+    {
+        dictTypeService.clearCache();
+        return success();
+    }
+
+    /**
+     * 查询字典详细
+     */
+    @RequiresPermissions("system:dict:list")
+    @GetMapping("/detail/{dictId}")
+    public String detail(@PathVariable("dictId") Long dictId, ModelMap mmap)
+    {
+        mmap.put("dict", dictTypeService.selectDictTypeById(dictId));
+        mmap.put("dictList", dictTypeService.selectDictTypeAll());
+        return "system/dict/data/data";
+    }
+
+    /**
+     * 校验字典类型
+     */
+    @PostMapping("/checkDictTypeUnique")
+    @ResponseBody
+    public String checkDictTypeUnique(SysDictType dictType)
+    {
+        return dictTypeService.checkDictTypeUnique(dictType);
+    }
+
+    /**
+     * 选择字典树
+     */
+    @GetMapping("/selectDictTree/{columnId}/{dictType}")
+    public String selectDeptTree(@PathVariable("columnId") Long columnId, @PathVariable("dictType") String dictType,
+            ModelMap mmap)
+    {
+        mmap.put("columnId", columnId);
+        mmap.put("dict", dictTypeService.selectDictTypeByType(dictType));
+        return prefix + "/tree";
+    }
+
+    /**
+     * 加载字典列表树
+     */
+    @GetMapping("/treeData")
+    @ResponseBody
+    public List<Ztree> treeData()
+    {
+        List<Ztree> ztrees = dictTypeService.selectDictTree(new SysDictType());
+        return ztrees;
+    }
+}

+ 73 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysIndexController.java

@@ -0,0 +1,73 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+
+import com.sooka.system.domain.SysDept;
+import com.sooka.system.mapper.SysDeptMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import com.sooka.common.config.Global;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysMenu;
+import com.sooka.system.domain.SysUser;
+import com.sooka.system.service.ISysConfigService;
+import com.sooka.system.service.ISysMenuService;
+
+import javax.annotation.Resource;
+
+/**
+ * 首页 业务处理
+ * 
+ * @author lei_wang
+ */
+@Controller
+public class SysIndexController extends BaseController
+{
+    @Autowired
+    private ISysMenuService menuService;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    // 系统首页
+    @GetMapping("/index")
+    public String index(ModelMap mmap)
+    {
+        // 取身份信息
+        SysUser user = ShiroUtils.getSysUser();
+        // 根据用户id取出菜单
+        List<SysMenu> menus = menuService.selectMenusByUser(user);
+        mmap.put("menus", menus);
+        mmap.put("user", user);
+        mmap.put("sideTheme", configService.selectConfigByKey("sys.index.sideTheme"));
+        mmap.put("skinName", configService.selectConfigByKey("sys.index.skinName"));
+        mmap.put("copyrightYear", Global.getCopyrightYear());
+        mmap.put("demoEnabled", Global.isDemoEnabled());
+        boolean isAdmin = user.getDept().getParentId() == 0;
+        if(isAdmin||user.getDept().getPostId()==5){
+            mmap.put("perFlag","zhzx");//人员身份为管理员或指挥中心
+        }else if(user.getDept().getPostId()==7){
+            //街道登录查询所有社区
+            mmap.put("perFlag","jd");//人员身份为管理员或指挥中心
+        }
+        return "index";
+    }
+
+    // 切换主题
+    @GetMapping("/system/switchSkin")
+    public String switchSkin(ModelMap mmap)
+    {
+        return "skin";
+    }
+
+    // 系统介绍
+    @GetMapping("/system/main")
+    public String main(ModelMap mmap)
+    {
+        mmap.put("version", Global.getVersion());
+        return "main";
+    }
+}

+ 87 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysLoginController.java

@@ -0,0 +1,87 @@
+package com.sooka.web.controller.system;
+
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.utils.ServletUtils;
+import com.sooka.common.utils.StringUtils;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysRole;
+import com.sooka.system.domain.SysUser;
+import com.sooka.system.service.ISysUserService;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.authc.AuthenticationException;
+import org.apache.shiro.authc.UsernamePasswordToken;
+import org.apache.shiro.subject.Subject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 登录验证
+ *
+ * @author lei_wang
+ */
+@Controller
+public class SysLoginController extends BaseController
+{
+    @Autowired
+    private ISysUserService userService;
+
+
+    @GetMapping("/login")
+    public String login(HttpServletRequest request, HttpServletResponse response)
+    {
+        // 如果是Ajax请求,返回Json字符串。
+        if (ServletUtils.isAjaxRequest(request))
+        {
+            return ServletUtils.renderString(response, "{\"code\":\"1\",\"msg\":\"未登录或登录超时。请重新登录\"}");
+        }
+
+        return "login";
+    }
+
+    @PostMapping("/login")
+    @ResponseBody
+    public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe)
+    {
+        UsernamePasswordToken token = new UsernamePasswordToken(username, password, rememberMe);
+        Subject subject = SecurityUtils.getSubject();
+        try
+        {
+            subject.login(token);
+            AjaxResult success=AjaxResult.success();
+            return success;
+        }
+        catch (AuthenticationException e)
+        {
+            String msg = "用户或密码错误";
+            if (StringUtils.isNotEmpty(e.getMessage()))
+            {
+                msg = e.getMessage();
+            }
+            return error(msg);
+        }
+    }
+
+    @GetMapping("/unauth")
+    public String unauth()
+    {
+        return "error/unauth";
+    }
+
+    /**
+     *
+     * @return
+     */
+    @GetMapping("/errorHtml")
+    public String errorHtml()
+    {
+        return "error/errorHtml";
+    }
+}

+ 196 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysMenuController.java

@@ -0,0 +1,196 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.constant.UserConstants;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.domain.Ztree;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysMenu;
+import com.sooka.system.domain.SysRole;
+import com.sooka.system.service.ISysMenuService;
+
+/**
+ * 菜单信息
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/menu")
+public class SysMenuController extends BaseController
+{
+    private String prefix = "system/menu";
+
+    @Autowired
+    private ISysMenuService menuService;
+
+    @RequiresPermissions("system:menu:view")
+    @GetMapping()
+    public String menu()
+    {
+        return prefix + "/menu";
+    }
+
+    @RequiresPermissions("system:menu:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public List<SysMenu> list(SysMenu menu)
+    {
+        Long userId = ShiroUtils.getUserId();
+        List<SysMenu> menuList = menuService.selectMenuList(menu, userId);
+        return menuList;
+    }
+
+    /**
+     * 删除菜单
+     */
+    @Log(title = "菜单管理", businessType = BusinessType.DELETE)
+    @RequiresPermissions("system:menu:remove")
+    @GetMapping("/remove/{menuId}")
+    @ResponseBody
+    public AjaxResult remove(@PathVariable("menuId") Long menuId)
+    {
+        if (menuService.selectCountMenuByParentId(menuId) > 0)
+        {
+            return AjaxResult.warn("存在子菜单,不允许删除");
+        }
+        if (menuService.selectCountRoleMenuByMenuId(menuId) > 0)
+        {
+            return AjaxResult.warn("菜单已分配,不允许删除");
+        }
+        ShiroUtils.clearCachedAuthorizationInfo();
+        return toAjax(menuService.deleteMenuById(menuId));
+    }
+
+    /**
+     * 新增
+     */
+    @GetMapping("/add/{parentId}")
+    public String add(@PathVariable("parentId") Long parentId, ModelMap mmap)
+    {
+        SysMenu menu = null;
+        if (0L != parentId)
+        {
+            menu = menuService.selectMenuById(parentId);
+        }
+        else
+        {
+            menu = new SysMenu();
+            menu.setMenuId(0L);
+            menu.setMenuName("主目录");
+        }
+        mmap.put("menu", menu);
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存菜单
+     */
+    @Log(title = "菜单管理", businessType = BusinessType.INSERT)
+    @RequiresPermissions("system:menu:add")
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysMenu menu)
+    {
+        if (UserConstants.MENU_NAME_NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
+        {
+            return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
+        }
+        menu.setCreateBy(ShiroUtils.getLoginName());
+        ShiroUtils.clearCachedAuthorizationInfo();
+        return toAjax(menuService.insertMenu(menu));
+    }
+
+    /**
+     * 修改菜单
+     */
+    @GetMapping("/edit/{menuId}")
+    public String edit(@PathVariable("menuId") Long menuId, ModelMap mmap)
+    {
+        mmap.put("menu", menuService.selectMenuById(menuId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存菜单
+     */
+    @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
+    @RequiresPermissions("system:menu:edit")
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysMenu menu)
+    {
+        if (UserConstants.MENU_NAME_NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
+        {
+            return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
+        }
+        menu.setUpdateBy(ShiroUtils.getLoginName());
+        ShiroUtils.clearCachedAuthorizationInfo();
+        return toAjax(menuService.updateMenu(menu));
+    }
+
+    /**
+     * 选择菜单图标
+     */
+    @GetMapping("/icon")
+    public String icon()
+    {
+        return prefix + "/icon";
+    }
+
+    /**
+     * 校验菜单名称
+     */
+    @PostMapping("/checkMenuNameUnique")
+    @ResponseBody
+    public String checkMenuNameUnique(SysMenu menu)
+    {
+        return menuService.checkMenuNameUnique(menu);
+    }
+
+    /**
+     * 加载角色菜单列表树
+     */
+    @GetMapping("/roleMenuTreeData")
+    @ResponseBody
+    public List<Ztree> roleMenuTreeData(SysRole role)
+    {
+        Long userId = ShiroUtils.getUserId();
+        List<Ztree> ztrees = menuService.roleMenuTreeData(role, userId);
+        return ztrees;
+    }
+
+    /**
+     * 加载所有菜单列表树
+     */
+    @GetMapping("/menuTreeData")
+    @ResponseBody
+    public List<Ztree> menuTreeData()
+    {
+        Long userId = ShiroUtils.getUserId();
+        List<Ztree> ztrees = menuService.menuTreeData(userId);
+        return ztrees;
+    }
+
+    /**
+     * 选择菜单树
+     */
+    @GetMapping("/selectMenuTree/{menuId}")
+    public String selectMenuTree(@PathVariable("menuId") Long menuId, ModelMap mmap)
+    {
+        mmap.put("menu", menuService.selectMenuById(menuId));
+        return prefix + "/tree";
+    }
+}

+ 112 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysNoticeController.java

@@ -0,0 +1,112 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysNotice;
+import com.sooka.system.service.ISysNoticeService;
+
+/**
+ * 公告 信息操作处理
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/notice")
+public class SysNoticeController extends BaseController
+{
+    private String prefix = "system/notice";
+
+    @Autowired
+    private ISysNoticeService noticeService;
+
+    @RequiresPermissions("system:notice:view")
+    @GetMapping()
+    public String notice()
+    {
+        return prefix + "/notice";
+    }
+
+    /**
+     * 查询公告列表
+     */
+    @RequiresPermissions("system:notice:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysNotice notice)
+    {
+        startPage();
+        List<SysNotice> list = noticeService.selectNoticeList(notice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增公告
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存公告
+     */
+    @RequiresPermissions("system:notice:add")
+    @Log(title = "通知公告", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(SysNotice notice)
+    {
+        notice.setCreateBy(ShiroUtils.getLoginName());
+        return toAjax(noticeService.insertNotice(notice));
+    }
+
+    /**
+     * 修改公告
+     */
+    @GetMapping("/edit/{noticeId}")
+    public String edit(@PathVariable("noticeId") Long noticeId, ModelMap mmap)
+    {
+        mmap.put("notice", noticeService.selectNoticeById(noticeId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存公告
+     */
+    @RequiresPermissions("system:notice:edit")
+    @Log(title = "通知公告", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(SysNotice notice)
+    {
+        notice.setUpdateBy(ShiroUtils.getLoginName());
+        return toAjax(noticeService.updateNotice(notice));
+    }
+
+    /**
+     * 删除公告
+     */
+    @RequiresPermissions("system:notice:remove")
+    @Log(title = "通知公告", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        return toAjax(noticeService.deleteNoticeByIds(ids));
+    }
+}

+ 163 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysPostController.java

@@ -0,0 +1,163 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.constant.UserConstants;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysPost;
+import com.sooka.system.service.ISysPostService;
+
+/**
+ * 岗位信息操作处理
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/post")
+public class SysPostController extends BaseController
+{
+    private String prefix = "system/post";
+
+    @Autowired
+    private ISysPostService postService;
+
+    @RequiresPermissions("system:post:view")
+    @GetMapping()
+    public String operlog()
+    {
+        return prefix + "/post";
+    }
+
+    @RequiresPermissions("system:post:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysPost post)
+    {
+        startPage();
+        List<SysPost> list = postService.selectPostList(post);
+        return getDataTable(list);
+    }
+
+    @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("system:post:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysPost post)
+    {
+        List<SysPost> list = postService.selectPostList(post);
+        ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
+        return util.exportExcel(list, "岗位数据");
+    }
+
+    @RequiresPermissions("system:post:remove")
+    @Log(title = "岗位管理", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        try
+        {
+            return toAjax(postService.deletePostByIds(ids));
+        }
+        catch (Exception e)
+        {
+            return error(e.getMessage());
+        }
+    }
+
+    /**
+     * 新增岗位
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存岗位
+     */
+    @RequiresPermissions("system:post:add")
+    @Log(title = "岗位管理", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysPost post)
+    {
+        if (UserConstants.POST_NAME_NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
+        {
+            return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
+        }
+        else if (UserConstants.POST_CODE_NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
+        {
+            return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
+        }
+        post.setCreateBy(ShiroUtils.getLoginName());
+        return toAjax(postService.insertPost(post));
+    }
+
+    /**
+     * 修改岗位
+     */
+    @GetMapping("/edit/{postId}")
+    public String edit(@PathVariable("postId") Long postId, ModelMap mmap)
+    {
+        mmap.put("post", postService.selectPostById(postId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存岗位
+     */
+    @RequiresPermissions("system:post:edit")
+    @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysPost post)
+    {
+        if (UserConstants.POST_NAME_NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
+        {
+            return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
+        }
+        else if (UserConstants.POST_CODE_NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
+        {
+            return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
+        }
+        post.setUpdateBy(ShiroUtils.getLoginName());
+        return toAjax(postService.updatePost(post));
+    }
+
+    /**
+     * 校验岗位名称
+     */
+    @PostMapping("/checkPostNameUnique")
+    @ResponseBody
+    public String checkPostNameUnique(SysPost post)
+    {
+        return postService.checkPostNameUnique(post);
+    }
+
+    /**
+     * 校验岗位编码
+     */
+    @PostMapping("/checkPostCodeUnique")
+    @ResponseBody
+    public String checkPostCodeUnique(SysPost post)
+    {
+        return postService.checkPostCodeUnique(post);
+    }
+}

+ 173 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysProfileController.java

@@ -0,0 +1,173 @@
+package com.sooka.web.controller.system;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.config.Global;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.StringUtils;
+import com.sooka.common.utils.file.FileUploadUtils;
+import com.sooka.framework.shiro.service.SysPasswordService;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysUser;
+import com.sooka.system.service.ISysUserService;
+
+/**
+ * 个人信息 业务处理
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/user/profile")
+public class SysProfileController extends BaseController
+{
+    private static final Logger log = LoggerFactory.getLogger(SysProfileController.class);
+
+    private String prefix = "system/user/profile";
+
+    @Autowired
+    private ISysUserService userService;
+    
+    @Autowired
+    private SysPasswordService passwordService;
+
+    /**
+     * 个人信息
+     */
+    @GetMapping()
+    public String profile(ModelMap mmap)
+    {
+        SysUser user = ShiroUtils.getSysUser();
+        mmap.put("user", user);
+        mmap.put("roleGroup", userService.selectUserRoleGroup(user.getUserId()));
+        mmap.put("postGroup", userService.selectUserPostGroup(user.getUserId()));
+        return prefix + "/profile";
+    }
+
+    @GetMapping("/checkPassword")
+    @ResponseBody
+    public boolean checkPassword(String password)
+    {
+        SysUser user = ShiroUtils.getSysUser();
+        if (passwordService.matches(user, password))
+        {
+            return true;
+        }
+        return false;
+    }
+
+    @GetMapping("/resetPwd")
+    public String resetPwd(ModelMap mmap)
+    {
+        SysUser user = ShiroUtils.getSysUser();
+        mmap.put("user", userService.selectUserById(user.getUserId()));
+        return prefix + "/resetPwd";
+    }
+
+    @Log(title = "重置密码", businessType = BusinessType.UPDATE)
+    @PostMapping("/resetPwd")
+    @ResponseBody
+    public AjaxResult resetPwd(String oldPassword, String newPassword)
+    {
+        SysUser user = ShiroUtils.getSysUser();
+        if (StringUtils.isNotEmpty(newPassword) && passwordService.matches(user, oldPassword))
+        {
+            user.setSalt(ShiroUtils.randomSalt());
+            user.setPassword(passwordService.encryptPassword(user.getLoginName(), newPassword, user.getSalt()));
+            if (userService.resetUserPwd(user) > 0)
+            {
+                ShiroUtils.setSysUser(userService.selectUserById(user.getUserId()));
+                return success();
+            }
+            return error();
+        }
+        else
+        {
+            return error("修改密码失败,旧密码错误");
+        }
+    }
+
+    /**
+     * 修改用户
+     */
+    @GetMapping("/edit")
+    public String edit(ModelMap mmap)
+    {
+        SysUser user = ShiroUtils.getSysUser();
+        mmap.put("user", userService.selectUserById(user.getUserId()));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改头像
+     */
+    @GetMapping("/avatar")
+    public String avatar(ModelMap mmap)
+    {
+        SysUser user = ShiroUtils.getSysUser();
+        mmap.put("user", userService.selectUserById(user.getUserId()));
+        return prefix + "/avatar";
+    }
+
+    /**
+     * 修改用户
+     */
+    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/update")
+    @ResponseBody
+    public AjaxResult update(SysUser user)
+    {
+        SysUser currentUser = ShiroUtils.getSysUser();
+        currentUser.setUserName(user.getUserName());
+        currentUser.setEmail(user.getEmail());
+        currentUser.setPhonenumber(user.getPhonenumber());
+        currentUser.setSex(user.getSex());
+        if (userService.updateUserInfo(currentUser) > 0)
+        {
+            ShiroUtils.setSysUser(userService.selectUserById(currentUser.getUserId()));
+            return success();
+        }
+        return error();
+    }
+
+    /**
+     * 保存头像
+     */
+    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/updateAvatar")
+    @ResponseBody
+    public AjaxResult updateAvatar(@RequestParam("avatarfile") MultipartFile file)
+    {
+        SysUser currentUser = ShiroUtils.getSysUser();
+        try
+        {
+            if (!file.isEmpty())
+            {
+                String avatar = FileUploadUtils.upload(Global.getAvatarPath(), file);
+                currentUser.setAvatar(avatar);
+                if (userService.updateUserInfo(currentUser) > 0)
+                {
+                    ShiroUtils.setSysUser(userService.selectUserById(currentUser.getUserId()));
+                    return success();
+                }
+            }
+            return error();
+        }
+        catch (Exception e)
+        {
+            log.error("修改头像失败!", e);
+            return error(e.getMessage());
+        }
+    }
+}

+ 46 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysRegisterController.java

@@ -0,0 +1,46 @@
+package com.sooka.web.controller.system;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.framework.shiro.service.SysRegisterService;
+import com.sooka.system.domain.SysUser;
+import com.sooka.system.service.ISysConfigService;
+
+/**
+ * 注册验证
+ * 
+ * @author lei_wang
+ */
+@Controller
+public class SysRegisterController extends BaseController
+{
+    @Autowired
+    private SysRegisterService registerService;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    @GetMapping("/register")
+    public String register()
+    {
+        return "register";
+    }
+
+    @PostMapping("/register")
+    @ResponseBody
+    public AjaxResult ajaxRegister(SysUser user)
+    {
+        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
+        {
+            return error("当前系统没有开启注册功能!");
+        }
+        String msg = registerService.register(user);
+        return StringUtils.isEmpty(msg) ? success() : error(msg);
+    }
+}

+ 304 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysRoleController.java

@@ -0,0 +1,304 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.constant.UserConstants;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysRole;
+import com.sooka.system.domain.SysUser;
+import com.sooka.system.domain.SysUserRole;
+import com.sooka.system.service.ISysRoleService;
+import com.sooka.system.service.ISysUserService;
+
+/**
+ * 角色信息
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/role")
+public class SysRoleController extends BaseController
+{
+    private String prefix = "system/role";
+
+    @Autowired
+    private ISysRoleService roleService;
+
+    @Autowired
+    private ISysUserService userService;
+
+    @RequiresPermissions("system:role:view")
+    @GetMapping()
+    public String role()
+    {
+        return prefix + "/role";
+    }
+
+    @RequiresPermissions("system:role:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysRole role)
+    {
+        startPage();
+        List<SysRole> list = roleService.selectRoleList(role);
+        return getDataTable(list);
+    }
+
+    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("system:role:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysRole role)
+    {
+        List<SysRole> list = roleService.selectRoleList(role);
+        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
+        return util.exportExcel(list, "角色数据");
+    }
+
+    /**
+     * 新增角色
+     */
+    @GetMapping("/add")
+    public String add()
+    {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存角色
+     */
+    @RequiresPermissions("system:role:add")
+    @Log(title = "角色管理", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysRole role)
+    {
+        if (UserConstants.ROLE_NAME_NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
+        {
+            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
+        }
+        else if (UserConstants.ROLE_KEY_NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
+        {
+            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        }
+        role.setCreateBy(ShiroUtils.getLoginName());
+        ShiroUtils.clearCachedAuthorizationInfo();
+        return toAjax(roleService.insertRole(role));
+
+    }
+
+    /**
+     * 修改角色
+     */
+    @GetMapping("/edit/{roleId}")
+    public String edit(@PathVariable("roleId") Long roleId, ModelMap mmap)
+    {
+        mmap.put("role", roleService.selectRoleById(roleId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存角色
+     */
+    @RequiresPermissions("system:role:edit")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        if (UserConstants.ROLE_NAME_NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
+        {
+            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
+        }
+        else if (UserConstants.ROLE_KEY_NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
+        {
+            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
+        }
+        role.setUpdateBy(ShiroUtils.getLoginName());
+        ShiroUtils.clearCachedAuthorizationInfo();
+        return toAjax(roleService.updateRole(role));
+    }
+
+    /**
+     * 角色分配数据权限
+     */
+    @GetMapping("/authDataScope/{roleId}")
+    public String authDataScope(@PathVariable("roleId") Long roleId, ModelMap mmap)
+    {
+        mmap.put("role", roleService.selectRoleById(roleId));
+        return prefix + "/dataScope";
+    }
+
+    /**
+     * 保存角色分配数据权限
+     */
+    @RequiresPermissions("system:role:edit")
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/authDataScope")
+    @ResponseBody
+    public AjaxResult authDataScopeSave(SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        role.setUpdateBy(ShiroUtils.getLoginName());
+        if (roleService.authDataScope(role) > 0)
+        {
+            ShiroUtils.setSysUser(userService.selectUserById(ShiroUtils.getSysUser().getUserId()));
+            return success();
+        }
+        return error();
+    }
+
+    @RequiresPermissions("system:role:remove")
+    @Log(title = "角色管理", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        try
+        {
+            return toAjax(roleService.deleteRoleByIds(ids));
+        }
+        catch (Exception e)
+        {
+            return error(e.getMessage());
+        }
+    }
+
+    /**
+     * 校验角色名称
+     */
+    @PostMapping("/checkRoleNameUnique")
+    @ResponseBody
+    public String checkRoleNameUnique(SysRole role)
+    {
+        return roleService.checkRoleNameUnique(role);
+    }
+
+    /**
+     * 校验角色权限
+     */
+    @PostMapping("/checkRoleKeyUnique")
+    @ResponseBody
+    public String checkRoleKeyUnique(SysRole role)
+    {
+        return roleService.checkRoleKeyUnique(role);
+    }
+
+    /**
+     * 选择菜单树
+     */
+    @GetMapping("/selectMenuTree")
+    public String selectMenuTree()
+    {
+        return prefix + "/tree";
+    }
+
+    /**
+     * 角色状态修改
+     */
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
+    @RequiresPermissions("system:role:edit")
+    @PostMapping("/changeStatus")
+    @ResponseBody
+    public AjaxResult changeStatus(SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        return toAjax(roleService.changeStatus(role));
+    }
+
+    /**
+     * 分配用户
+     */
+    @RequiresPermissions("system:role:edit")
+    @GetMapping("/authUser/{roleId}")
+    public String authUser(@PathVariable("roleId") Long roleId, ModelMap mmap)
+    {
+        mmap.put("role", roleService.selectRoleById(roleId));
+        return prefix + "/authUser";
+    }
+
+    /**
+     * 查询已分配用户角色列表
+     */
+    @RequiresPermissions("system:role:list")
+    @PostMapping("/authUser/allocatedList")
+    @ResponseBody
+    public TableDataInfo allocatedList(SysUser user)
+    {
+        startPage();
+        List<SysUser> list = userService.selectAllocatedList(user);
+        return getDataTable(list);
+    }
+
+    /**
+     * 取消授权
+     */
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
+    @PostMapping("/authUser/cancel")
+    @ResponseBody
+    public AjaxResult cancelAuthUser(SysUserRole userRole)
+    {
+        return toAjax(roleService.deleteAuthUser(userRole));
+    }
+
+    /**
+     * 批量取消授权
+     */
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
+    @PostMapping("/authUser/cancelAll")
+    @ResponseBody
+    public AjaxResult cancelAuthUserAll(Long roleId, String userIds)
+    {
+        return toAjax(roleService.deleteAuthUsers(roleId, userIds));
+    }
+
+    /**
+     * 选择用户
+     */
+    @GetMapping("/authUser/selectUser/{roleId}")
+    public String selectUser(@PathVariable("roleId") Long roleId, ModelMap mmap)
+    {
+        mmap.put("role", roleService.selectRoleById(roleId));
+        return prefix + "/selectUser";
+    }
+
+    /**
+     * 查询未分配用户角色列表
+     */
+    @RequiresPermissions("system:role:list")
+    @PostMapping("/authUser/unallocatedList")
+    @ResponseBody
+    public TableDataInfo unallocatedList(SysUser user)
+    {
+        startPage();
+        List<SysUser> list = userService.selectUnallocatedList(user);
+        return getDataTable(list);
+    }
+
+    /**
+     * 批量选择用户授权
+     */
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
+    @PostMapping("/authUser/selectAll")
+    @ResponseBody
+    public AjaxResult selectAuthUserAll(Long roleId, String userIds)
+    {
+        return toAjax(roleService.insertAuthUsers(roleId, userIds));
+    }
+}

+ 297 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/system/SysUserController.java

@@ -0,0 +1,297 @@
+package com.sooka.web.controller.system;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.sooka.system.domain.SysDept;
+import com.sooka.system.service.ISysDeptService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import com.sooka.common.annotation.Log;
+import com.sooka.common.constant.UserConstants;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.core.page.TableDataInfo;
+import com.sooka.common.enums.BusinessType;
+import com.sooka.common.utils.poi.ExcelUtil;
+import com.sooka.framework.shiro.service.SysPasswordService;
+import com.sooka.framework.util.ShiroUtils;
+import com.sooka.system.domain.SysRole;
+import com.sooka.system.domain.SysUser;
+import com.sooka.system.service.ISysPostService;
+import com.sooka.system.service.ISysRoleService;
+import com.sooka.system.service.ISysUserService;
+
+/**
+ * 用户信息
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/system/user")
+public class SysUserController extends BaseController
+{
+    private String prefix = "system/user";
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private ISysDeptService deptService;
+
+    @Autowired
+    private ISysRoleService roleService;
+
+    @Autowired
+    private ISysPostService postService;
+
+    @Autowired
+    private SysPasswordService passwordService;
+
+    @RequiresPermissions("system:user:view")
+    @GetMapping()
+    public String user()
+    {
+        return prefix + "/user";
+    }
+
+    @RequiresPermissions("system:user:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(SysUser user)
+    {
+        startPage();
+        List<SysUser> list = userService.selectUserList(user);
+        return getDataTable(list);
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
+    @RequiresPermissions("system:user:export")
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(SysUser user)
+    {
+        List<SysUser> list = userService.selectUserList(user);
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        return util.exportExcel(list, "用户数据");
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
+    @RequiresPermissions("system:user:import")
+    @PostMapping("/importData")
+    @ResponseBody
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        List<SysUser> userList = util.importExcel(file.getInputStream());
+        String operName = ShiroUtils.getSysUser().getLoginName();
+        String message = userService.importUser(userList, updateSupport, operName);
+        return AjaxResult.success(message);
+    }
+
+    @RequiresPermissions("system:user:view")
+    @GetMapping("/importTemplate")
+    @ResponseBody
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        return util.importTemplateExcel("用户数据");
+    }
+
+    /**
+     * 新增用户
+     */
+    @GetMapping("/add")
+    public String add(ModelMap mmap)
+    {
+        mmap.put("roles", roleService.selectRoleAll().stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        mmap.put("posts", postService.selectPostAll());
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存用户
+     */
+    @RequiresPermissions("system:user:add")
+    @Log(title = "用户管理", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(@Validated SysUser user)
+    {
+        if (UserConstants.USER_NAME_NOT_UNIQUE.equals(userService.checkLoginNameUnique(user.getLoginName())))
+        {
+            return error("新增用户'" + user.getLoginName() + "'失败,登录账号已存在");
+        }
+        else if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
+        {
+            return error("新增用户'" + user.getLoginName() + "'失败,手机号码已存在");
+        }
+        else if (UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+        {
+            return error("新增用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
+        }
+        user.setSalt(ShiroUtils.randomSalt());
+        user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
+        user.setCreateBy(ShiroUtils.getLoginName());
+        return toAjax(userService.insertUser(user));
+    }
+
+    /**
+     * 修改用户
+     */
+    @GetMapping("/edit/{userId}")
+    public String edit(@PathVariable("userId") Long userId, ModelMap mmap)
+    {
+        List<SysRole> roles = roleService.selectRolesByUserId(userId);
+        mmap.put("user", userService.selectUserById(userId));
+        mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        mmap.put("posts", postService.selectPostsByUserId(userId));
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存用户
+     */
+    @RequiresPermissions("system:user:edit")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@Validated SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        if (UserConstants.USER_PHONE_NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
+        {
+            return error("修改用户'" + user.getLoginName() + "'失败,手机号码已存在");
+        }
+        else if (UserConstants.USER_EMAIL_NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+        {
+            return error("修改用户'" + user.getLoginName() + "'失败,邮箱账号已存在");
+        }
+        user.setUpdateBy(ShiroUtils.getLoginName());
+        return toAjax(userService.updateUser(user));
+    }
+
+    @RequiresPermissions("system:user:resetPwd")
+    @Log(title = "重置密码", businessType = BusinessType.UPDATE)
+    @GetMapping("/resetPwd/{userId}")
+    public String resetPwd(@PathVariable("userId") Long userId, ModelMap mmap)
+    {
+        mmap.put("user", userService.selectUserById(userId));
+        return prefix + "/resetPwd";
+    }
+
+    @RequiresPermissions("system:user:resetPwd")
+    @Log(title = "重置密码", businessType = BusinessType.UPDATE)
+    @PostMapping("/resetPwd")
+    @ResponseBody
+    public AjaxResult resetPwdSave(SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        user.setSalt(ShiroUtils.randomSalt());
+        user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
+        if (userService.resetUserPwd(user) > 0)
+        {
+            if (ShiroUtils.getUserId().longValue() == user.getUserId().longValue())
+            {
+                ShiroUtils.setSysUser(userService.selectUserById(user.getUserId()));
+            }
+            return success();
+        }
+        return error();
+    }
+
+    /**
+     * 进入授权角色页
+     */
+    @GetMapping("/authRole/{userId}")
+    public String authRole(@PathVariable("userId") Long userId, ModelMap mmap)
+    {
+        SysUser user = userService.selectUserById(userId);
+        // 获取用户所属的角色列表
+        List<SysRole> roles = roleService.selectRolesByUserId(userId);
+        mmap.put("user", user);
+        mmap.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        return prefix + "/authRole";
+    }
+
+    /**
+     * 用户授权角色
+     */
+    @RequiresPermissions("system:user:add")
+    @Log(title = "用户管理", businessType = BusinessType.GRANT)
+    @PostMapping("/authRole/insertAuthRole")
+    @ResponseBody
+    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
+    {
+        userService.insertUserAuth(userId, roleIds);
+        return success();
+    }
+
+    @RequiresPermissions("system:user:remove")
+    @Log(title = "用户管理", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids)
+    {
+        try
+        {
+            return toAjax(userService.deleteUserByIds(ids));
+        }
+        catch (Exception e)
+        {
+            return error(e.getMessage());
+        }
+    }
+
+    /**
+     * 校验用户名
+     */
+    @PostMapping("/checkLoginNameUnique")
+    @ResponseBody
+    public String checkLoginNameUnique(SysUser user)
+    {
+        return userService.checkLoginNameUnique(user.getLoginName());
+    }
+
+    /**
+     * 校验手机号码
+     */
+    @PostMapping("/checkPhoneUnique")
+    @ResponseBody
+    public String checkPhoneUnique(SysUser user)
+    {
+        return userService.checkPhoneUnique(user);
+    }
+
+    /**
+     * 校验email邮箱
+     */
+    @PostMapping("/checkEmailUnique")
+    @ResponseBody
+    public String checkEmailUnique(SysUser user)
+    {
+        return userService.checkEmailUnique(user);
+    }
+
+    /**
+     * 用户状态修改
+     */
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
+    @RequiresPermissions("system:user:edit")
+    @PostMapping("/changeStatus")
+    @ResponseBody
+    public AjaxResult changeStatus(SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        return toAjax(userService.changeStatus(user));
+    }
+}

+ 26 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/tool/BuildController.java

@@ -0,0 +1,26 @@
+package com.sooka.web.controller.tool;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.sooka.common.core.controller.BaseController;
+
+/**
+ * build 表单构建
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/tool/build")
+public class BuildController extends BaseController
+{
+    private String prefix = "tool/build";
+
+    @RequiresPermissions("tool:build:view")
+    @GetMapping()
+    public String build()
+    {
+        return prefix + "/build";
+    }
+}

+ 24 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/tool/SwaggerController.java

@@ -0,0 +1,24 @@
+package com.sooka.web.controller.tool;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.sooka.common.core.controller.BaseController;
+
+/**
+ * swagger 接口
+ * 
+ * @author lei_wang
+ */
+@Controller
+@RequestMapping("/tool/swagger")
+public class SwaggerController extends BaseController
+{
+    @RequiresPermissions("tool:swagger:view")
+    @GetMapping()
+    public String index()
+    {
+        return redirect("/swagger-ui.html");
+    }
+}

+ 175 - 0
leiSP-admin/src/main/java/com/sooka/web/controller/tool/TestController.java

@@ -0,0 +1,175 @@
+package com.sooka.web.controller.tool;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.sooka.common.core.controller.BaseController;
+import com.sooka.common.core.domain.AjaxResult;
+import com.sooka.common.utils.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * swagger 用户测试方法
+ * 
+ * @author lei_wang
+ */
+@Api("用户信息管理")
+@RestController
+@RequestMapping("/test/user")
+public class TestController extends BaseController
+{
+    private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
+    {
+        users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
+        users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
+    }
+
+    @ApiOperation("获取用户列表")
+    @GetMapping("/list")
+    public AjaxResult userList()
+    {
+        List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
+        return AjaxResult.success(userList);
+    }
+
+    @ApiOperation("获取用户详细")
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
+    @GetMapping("/{userId}")
+    public AjaxResult getUser(@PathVariable Integer userId)
+    {
+        if (!users.isEmpty() && users.containsKey(userId))
+        {
+            return AjaxResult.success(users.get(userId));
+        }
+        else
+        {
+            return error("用户不存在");
+        }
+    }
+
+    @ApiOperation("新增用户")
+    @ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity")
+    @PostMapping("/save")
+    public AjaxResult save(UserEntity user)
+    {
+        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
+        {
+            return error("用户ID不能为空");
+        }
+        return AjaxResult.success(users.put(user.getUserId(), user));
+    }
+
+    @ApiOperation("更新用户")
+    @ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity")
+    @PutMapping("/update")
+    public AjaxResult update(UserEntity user)
+    {
+        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
+        {
+            return error("用户ID不能为空");
+        }
+        if (users.isEmpty() || !users.containsKey(user.getUserId()))
+        {
+            return error("用户不存在");
+        }
+        users.remove(user.getUserId());
+        return AjaxResult.success(users.put(user.getUserId(), user));
+    }
+
+    @ApiOperation("删除用户信息")
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path")
+    @DeleteMapping("/{userId}")
+    public AjaxResult delete(@PathVariable Integer userId)
+    {
+        if (!users.isEmpty() && users.containsKey(userId))
+        {
+            users.remove(userId);
+            return success();
+        }
+        else
+        {
+            return error("用户不存在");
+        }
+    }
+}
+
+@ApiModel("用户实体")
+class UserEntity
+{
+    @ApiModelProperty("用户ID")
+    private Integer userId;
+
+    @ApiModelProperty("用户名称")
+    private String username;
+
+    @ApiModelProperty("用户密码")
+    private String password;
+
+    @ApiModelProperty("用户手机")
+    private String mobile;
+
+    public UserEntity()
+    {
+
+    }
+
+    public UserEntity(Integer userId, String username, String password, String mobile)
+    {
+        this.userId = userId;
+        this.username = username;
+        this.password = password;
+        this.mobile = mobile;
+    }
+
+    public Integer getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Integer userId)
+    {
+        this.userId = userId;
+    }
+
+    public String getUsername()
+    {
+        return username;
+    }
+
+    public void setUsername(String username)
+    {
+        this.username = username;
+    }
+
+    public String getPassword()
+    {
+        return password;
+    }
+
+    public void setPassword(String password)
+    {
+        this.password = password;
+    }
+
+    public String getMobile()
+    {
+        return mobile;
+    }
+
+    public void setMobile(String mobile)
+    {
+        this.mobile = mobile;
+    }
+}

+ 69 - 0
leiSP-admin/src/main/java/com/sooka/web/core/config/SwaggerConfig.java

@@ -0,0 +1,69 @@
+package com.sooka.web.core.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import com.sooka.common.config.Global;
+import io.swagger.annotations.ApiOperation;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * Swagger2的接口配置
+ * 
+ * @author lei_wang
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig
+{
+    /** 是否开启swagger */
+    @Value("${swagger.enabled}")
+    private boolean enabled;
+    
+    /**
+     * 创建API
+     */
+    @Bean
+    public Docket createRestApi()
+    {
+        return new Docket(DocumentationType.SWAGGER_2)
+                // 是否启用Swagger
+                .enable(enabled)
+                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
+                .apiInfo(apiInfo())
+                // 设置哪些接口暴露给Swagger展示
+                .select()
+                // 扫描所有有注解的api,用这种方式更灵活
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                // 扫描指定包中的swagger注解
+                //.apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
+                // 扫描所有 .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    /**
+     * 添加摘要信息
+     */
+    private ApiInfo apiInfo()
+    {
+        // 用ApiInfoBuilder进行定制
+        return new ApiInfoBuilder()
+                // 设置标题
+                .title("标题:Leisp管理系统_接口文档")
+                // 描述
+                .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
+                // 作者信息
+                .contact(new Contact(Global.getName(), null, null))
+                // 版本
+                .version("版本号:" + Global.getVersion())
+                .build();
+    }
+}

+ 75 - 0
leiSP-admin/src/main/resources/application-druid.yml

@@ -0,0 +1,75 @@
+# 项目相关配置
+leisp:
+    # 名称
+    name: LEI
+    # 版本
+    version: 1.0.0
+    # 版权年份
+    copyrightYear: 2019
+    # 实例演示开关
+    demoEnabled: false
+    # 文件路径 示例( Windows配置D:/leisp/uploadPath,Linux配置 /home/leisp/uploadPath)
+    profile: D:/zhsq_qk
+#    profile: /home/limeng/yanbian/uploadPath
+    # 获取ip地址开关
+    addressEnabled: false
+# 数据源配置
+spring:
+    datasource:
+        type: com.alibaba.druid.pool.DruidDataSource
+        driverClassName: com.mysql.cj.jdbc.Driver
+        druid:
+            # 主库数据源
+            master:
+                url: jdbc:mysql://127.0.0.1:3306/yanbian?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&useSSL=false
+                username: root
+                password: 123456
+#                url: jdbc:mysql://121.37.83.100:53306/zhnc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&useSSL=false
+#                username: limeng
+#                password: limeng123456
+            # 从库数据源
+            slave:
+                # 从数据源开关/默认关闭
+                enabled: false
+                url:
+                username:
+                password:
+            # 初始连接数
+            initialSize: 5
+            # 最小连接池数量
+            minIdle: 10
+            # 最大连接池数量
+            maxActive: 20
+            # 配置获取连接等待超时的时间
+            maxWait: 60000
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+            timeBetweenEvictionRunsMillis: 60000
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
+            minEvictableIdleTimeMillis: 300000
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
+            maxEvictableIdleTimeMillis: 900000
+            # 配置检测连接是否有效
+            validationQuery: SELECT 1 FROM DUAL
+            testWhileIdle: true
+            testOnBorrow: false
+            testOnReturn: false
+            webStatFilter:
+                enabled: true
+            statViewServlet:
+                enabled: true
+                # 设置白名单,不填则允许所有访问
+                allow:
+                url-pattern: /druid/*
+                # 控制台管理用户名和密码
+                login-username:
+                login-password:
+            filter:
+                stat:
+                    enabled: true
+                    # 慢SQL记录
+                    log-slow-sql: true
+                    slow-sql-millis: 1000
+                    merge-sql: true
+                wall:
+                    config:
+                        multi-statement-allow: true

+ 126 - 0
leiSP-admin/src/main/resources/application.yml

@@ -0,0 +1,126 @@
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为80
+  port: 80
+  servlet:
+    # 应用的访问路径
+    context-path: /yanbian
+    session:
+      timeout: PT30M
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # tomcat最大线程数,默认为200
+    max-threads: 800
+    # Tomcat启动初始化的线程数,默认值25
+    min-spare-threads: 30
+    # Tomcat移动端上传文件
+    basedir: D:\tmp\tomcat1
+
+# 日志配置
+logging:
+  level:
+    com.ruoyi: debug
+    org.springframework: warn
+
+# 用户配置
+user:
+  password:
+    # 密码错误{maxRetryCount}次锁定10分钟
+    maxRetryCount: 5
+
+# Spring配置
+spring:
+  # 模板引擎
+  thymeleaf:
+    mode: HTML
+    encoding: utf-8
+    # 禁用缓存
+    cache: false
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: static/i18n/messages
+  jackson:
+    time-zone: GMT+8
+    date-format: yyyy-MM-dd HH:mm:ss
+  profiles:
+    active: druid
+  # 文件上传
+  servlet:
+     multipart:
+       # 单个文件大小
+       max-file-size:  10MB
+       # 设置总上传的文件大小
+       max-request-size:  20MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: true
+
+# MyBatis
+mybatis:
+    # 搜索指定包别名
+    typeAliasesPackage: com.**.domain
+    # 配置mapper的扫描,找到所有的mapper.xml映射文件
+    mapperLocations: classpath*:mapper/**/*Mapper.xml
+    # 加载全局的配置文件
+    configLocation: classpath:mybatis/mybatis-config.xml
+
+# PageHelper分页插件
+pagehelper:
+  helperDialect: mysql
+  reasonable: true
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Shiro
+shiro:
+  user:
+    # 登录地址
+    loginUrl: /login
+    # 权限认证失败地址
+    unauthorizedUrl: /unauth
+    # 首页地址
+    indexUrl: /index
+    # 验证码开关
+    captchaEnabled: false
+    # 验证码类型 math 数组计算 char 字符
+    captchaType: math
+  cookie:
+    # 设置Cookie的域名 默认空,即当前访问的域名
+    domain:
+    # 设置cookie的有效访问路径
+    path: /
+    # 设置HttpOnly属性
+    httpOnly: true
+    # 设置Cookie的过期时间,天为单位
+    maxAge: 30
+    # 设置密钥,务必保持唯一性(生成方式,直接拷贝到main运行即可)KeyGenerator keygen = KeyGenerator.getInstance("AES"); SecretKey deskey = keygen.generateKey(); System.out.println(Base64.encodeToString(deskey.getEncoded()));
+    cipherKey: zSyK5Kp6PZAAjlT+eeNMlg==
+  session:
+    # Session超时时间,-1代表永不过期(默认30分钟)
+    expireTime: 30
+    # 同步session到数据库的周期(默认1分钟)
+    dbSyncPeriod: 1
+    # 相隔多久检查一次session的有效性,默认就是10分钟
+    validationInterval: 10
+    # 同一个用户最大会话数,比如2的意思是同一个账号允许最多同时两个人登录(默认-1不限制)
+    maxSession: -1
+    # 踢出之前登录的/之后登录的用户,默认踢出之前登录的用户
+    kickoutAfter: false
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice/*
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*
+
+# Swagger配置
+swagger:
+  # 是否开启swagger
+  enabled: false

+ 24 - 0
leiSP-admin/src/main/resources/banner.txt

@@ -0,0 +1,24 @@
+Application Version: ${leisp.version}
+Spring Boot Version: ${spring-boot.version}
+////////////////////////////////////////////////////////////////////
+//                          _ooOoo_                               //
+//                         o8888888o                              //
+//                         88" . "88                              //
+//                         (| ^_^ |)                              //
+//                         O\  =  /O                              //
+//                      ____/`---'\____                           //
+//                    .'  \\|     |//  `.                         //
+//                   /  \\|||  :  |||//  \                        //
+//                  /  _||||| -:- |||||-  \                       //
+//                  |   | \\\  -  /// |   |                       //
+//                  | \_|  ''\---/''  |   |                       //
+//                  \  .-\__  `-`  ___/-. /                       //
+//                ___`. .'  /--.--\  `. . ___                     //
+//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
+//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
+//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
+//      ========`-.____`-.___\_____/___.-`____.-'========         //
+//                           `=---='                              //
+//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
+//             佛祖保佑       永不宕机      永无BUG               //
+////////////////////////////////////////////////////////////////////

+ 18 - 0
leiSP-admin/src/main/resources/config/iccSdk.properties

@@ -0,0 +1,18 @@
+#平台ip端口
+icc.sdk.host=60.191.94.122:20033
+#鉴权类型=[password],[client_credentials]
+icc.sdk.grantType=client_credentials
+#-----------客户端鉴权模式配置--------------
+#客户端鉴权模式凭证id icc.sdk.grantType=client_credentials生效
+icc.sdk.clientId=CompanyName
+#客户端鉴权模式凭证密钥 icc.sdk.grantType=client_credentials生效
+icc.sdk.clientSecret=42bec152-8f04-476a-9aec-e7d616ff3cb3
+#-----------用户密码鉴权模式配置--------------
+#用户密码鉴权模式凭证id icc.sdk.grantType=password生效
+icc.sdk.pwdClientId=CompanyName
+#用户密码鉴权模式凭证密钥 icc.sdk.grantType=password生效
+icc.sdk.pwdClientSecret=42bec152-8f04-476a-9aec-e7d616ff3cb3
+#用户名 icc.sdk.grantType=password生效
+icc.sdk.username=TEST
+#密码 icc.sdk.grantType=password生效
+icc.sdk.password=Admin123

+ 81 - 0
leiSP-admin/src/main/resources/ehcache/ehcache-shiro.xml

@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache name="ruoyi" updateCheck="false">
+
+    <!-- 磁盘缓存位置 -->
+    <diskStore path="java.io.tmpdir"/>
+    
+    <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数,0没有限制 -->
+    <!-- maxElementsInMemory: 在内存中缓存的element的最大数目。-->
+    <!-- eternal:elements是否永久有效,如果为true,timeouts将被忽略,element将永不过期 -->
+    <!-- timeToIdleSeconds:失效前的空闲秒数,当eternal为false时,这个属性才有效,0为不限制 -->
+    <!-- timeToLiveSeconds:失效前的存活秒数,创建时间到失效时间的间隔为存活时间,当eternal为false时,这个属性才有效,0为不限制 -->
+    <!-- overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上 -->
+    <!-- statistics:是否收集统计信息。如果需要监控缓存使用情况,应该打开这个选项。默认为关闭(统计会影响性能)。设置statistics="true"开启统计 -->
+    
+    <!-- 默认缓存 -->
+    <defaultCache
+            maxEntriesLocalHeap="1000"
+            eternal="false"
+            timeToIdleSeconds="3600"
+            timeToLiveSeconds="3600"
+            overflowToDisk="false">
+    </defaultCache>
+
+    <!-- 登录记录缓存 锁定10分钟 -->
+    <cache name="loginRecordCache"
+           maxEntriesLocalHeap="2000"
+           eternal="false"
+           timeToIdleSeconds="600"
+           timeToLiveSeconds="0"
+           overflowToDisk="false"
+           statistics="true">
+    </cache>
+
+    <!-- 系统活跃用户缓存 -->
+    <cache name="sys-userCache"
+           maxEntriesLocalHeap="10000"
+           overflowToDisk="false"
+           eternal="false"
+           diskPersistent="false"
+           timeToLiveSeconds="0"
+           timeToIdleSeconds="0"
+           statistics="true">
+    </cache>
+    
+    <!-- 系统缓存 -->
+    <cache name="sys-cache"
+           maxEntriesLocalHeap="1000"
+           eternal="true"
+           overflowToDisk="true"
+           statistics="true">
+    </cache>
+    
+    <!-- 系统参数缓存 -->
+    <cache name="sys-config"
+           maxEntriesLocalHeap="1000"
+           eternal="true"
+           overflowToDisk="true"
+           statistics="true">
+    </cache>
+    
+    <!-- 系统字典缓存 -->
+    <cache name="sys-dict"
+           maxEntriesLocalHeap="1000"
+           eternal="true"
+           overflowToDisk="true"
+           statistics="true">
+    </cache>
+    
+    <!-- 系统会话缓存 -->
+    <cache name="shiro-activeSessionCache"
+           maxElementsInMemory="10000"
+           overflowToDisk="true"
+           eternal="true"
+           timeToLiveSeconds="0"
+           timeToIdleSeconds="0"
+           diskPersistent="true"
+           diskExpiryThreadIntervalSeconds="600">
+    </cache>
+    
+</ehcache>
+	

+ 93 - 0
leiSP-admin/src/main/resources/logback.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/home/limeng/zhnc/logs" />
+    <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+	<!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+	<!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+	<!-- 用户访问日志输出  -->
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/sys-user.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 按天回滚 daily -->
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+
+	<!-- 系统模块日志级别控制  -->
+	<logger name="com.sooka" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+
+	<!--系统用户操作日志-->
+    <logger name="sys-user" level="info">
+        <appender-ref ref="sys-user"/>
+    </logger>
+</configuration>

+ 16 - 0
leiSP-admin/src/main/resources/mybatis/mybatis-config.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration
+PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+	
+	<settings>
+		<setting name="cacheEnabled"             value="true"  />  <!-- 全局映射器启用缓存 -->
+		<setting name="useGeneratedKeys"         value="true"  />  <!-- 允许 JDBC 支持自动生成主键 -->
+		<setting name="defaultExecutorType"      value="REUSE" />  <!-- 配置默认的执行器 -->
+		<setting name="logImpl"                  value="SLF4J" />  <!-- 指定 MyBatis 所用日志的具体实现 -->
+		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>  驼峰式命名 -->
+		<setting name="logImpl" value="STDOUT_LOGGING" /> <!-- 打印查询语句 -->
+	</settings>
+	
+</configuration>

+ 322 - 0
leiSP-admin/src/main/resources/templates/demo/form/autocomplete.html

@@ -0,0 +1,322 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('搜索自动补全')" />
+</head>
+<body class="gray-bg">
+      <div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>搜索自动补全<small>https://github.com/lzwme/bootstrap-suggest-plugin</small></h5>
+                    </div>  
+                    <div class="ibox-content">
+                        <p>展示下拉菜单按钮。</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                                <div class="input-group">
+                                    <input type="text" class="form-control" id="suggest-demo-1">
+                                    <div class="input-group-btn">
+                                        <button type="button" class="btn btn-white dropdown-toggle" data-toggle="dropdown">
+                                            <span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu dropdown-menu-right" role="menu">
+                                        </ul>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <p>不展示下拉菜单按钮。</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                                <div class="input-group">
+                                    <input type="text" class="form-control" id="suggest-demo-2">
+                                    <div class="input-group-btn">
+                                        <button type="button" class="btn btn-white dropdown-toggle" data-toggle="dropdown">
+                                            <span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu dropdown-menu-right" role="menu">
+                                        </ul>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <p>前端json中获取数据</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                                <div class="input-group">
+                                    <input type="text" class="form-control" id="suggest-demo-3">
+                                    <div class="input-group-btn">
+                                        <button type="button" class="btn btn-white dropdown-toggle" data-toggle="dropdown">
+                                            <span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu dropdown-menu-right" role="menu">
+                                        </ul>
+                                    </div>
+                                    <!-- /btn-group -->
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <h3>百度搜索</h3>
+                        <p>支持逗号分隔多关键字</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                                <div class="input-group" style="width: 300px;">
+                                    <input type="text" class="form-control" id="baidu">
+                                    <div class="input-group-btn">
+                                        <button type="button" class="btn btn-white dropdown-toggle" data-toggle="dropdown">
+                                            <span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu dropdown-menu-right" role="menu">
+                                        </ul>
+                                    </div>
+                                    <!-- /btn-group -->
+                                </div>
+                            </div>
+                        </div>
+                        
+                        <h3>淘宝搜索</h3>
+                        <p>支持逗号分隔多关键字</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                                <div class="input-group" style="width: 400px;">
+                                    <input type="text" class="form-control" id="taobao">
+                                    <div class="input-group-btn">
+                                        <button type="button" class="btn btn-white dropdown-toggle" data-toggle="dropdown">
+                                            <span class="caret"></span>
+                                        </button>
+                                        <ul class="dropdown-menu dropdown-menu-right" role="menu">
+                                        </ul>
+                                    </div>
+                                    <!-- /btn-group -->
+                                </div>
+                            </div>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="#" target="_blank">http://www.sooka.com</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>搜索自动补全<small>https://github.com/bassjobsen/Bootstrap-3-Typeahead</small></h5>
+                    </div>  
+                    <div class="ibox-content">
+                        <p>通过数据属性的基本示例。</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                           	    <input type="text" placeholder="ruoyi..." data-provide="typeahead" data-source='["ruoyi 1","ruoyi 2","ruoyi 3"]' class="form-control" />
+                            </div>
+                        </div>
+                        <hr>
+                        
+                        <p>通过javascript的基本示例。</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                                <input type="text" placeholder="ruoyi..." class="form-control" id="typeahead-demo-1"/>
+                            </div>
+                        </div>
+                        
+                        <hr>
+                        <p>通过javascript的复杂示例。</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                                <input type="text" placeholder="ruoyi..." class="form-control" id="typeahead-demo-2"/>
+                            </div>
+                        </div>
+                        
+                        <hr>
+                        <p>后台url中获取简单数据</p>
+                        <div class="row">
+                            <div class="col-lg-6">
+                                <input type="text" placeholder="ruoyi..." class="form-control" id="typeahead-demo-3"/>
+                            </div>
+                        </div>
+                        
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="http://www.sooka.com/document/zjwd.html#bootstrap-typeahead" target="_blank">http://www.sooka.com/document/zjwd.html#bootstrap-typeahead</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: bootstrap-suggest-js" />
+    <th:block th:include="include :: bootstrap-typeahead-js" />
+    <script type="text/javascript">
+        
+	    var testBsSuggest = $("#suggest-demo-1").bsSuggest({
+	        url: ctx + "demo/form/userModel",
+	        idField: "userId",
+	        keyField: "userName"
+	    }).on('onDataRequestSuccess', function (e, result) {
+	        console.log('onDataRequestSuccess: ', result);
+	    }).on('onSetSelectValue', function (e, keyword) {
+	        console.log('onSetSelectValue: ', keyword);
+	    }).on('onUnsetSelectValue', function (e) {
+	        console.log("onUnsetSelectValue");
+	    });
+	    
+	    var testBsSuggest = $("#suggest-demo-2").bsSuggest({
+	        url: ctx + "demo/form/userModel",
+	        showBtn: false,
+	        idField: "userId",
+	        keyField: "userName"
+	    }).on('onDataRequestSuccess', function (e, result) {
+	        console.log('onDataRequestSuccess: ', result);
+	    }).on('onSetSelectValue', function (e, keyword) {
+	        console.log('onSetSelectValue: ', keyword);
+	    }).on('onUnsetSelectValue', function (e) {
+	        console.log("onUnsetSelectValue");
+	    });
+	
+	    //data 数据中获取
+	    var testdataBsSuggest = $("#suggest-demo-3").bsSuggest({
+	        indexId: 1,
+	        indexKey: 2,
+	        data: {
+	            'value': [
+	                {
+	                    'userId': '1',
+	                    'userCode': '1000001',
+	                    'userName': '测试1',
+	                    'userPhone': '15888888888'
+	                },
+	                {
+	                    'userId': '2',
+	                    'userCode': '1000002',
+	                    'userName': '测试2',
+	                    'userPhone': '15888888888'
+	                },
+	                {
+	                    'userId': '3',
+	                    'userCode': '1000003',
+	                    'userName': '测试3',
+	                    'userPhone': '15888888888'
+	                },
+	                {
+	                    'userId': '4',
+	                    'userCode': '1000004',
+	                    'userName': '测试4',
+	                    'userPhone': '15888888888'
+	                },
+	                {
+	                    'userId': '5',
+	                    'userCode': '1000005',
+	                    'userName': '测试5',
+	                    'userPhone': '15888888888'
+	                }
+				],
+	            'defaults': 'http://www.sooka.com'
+	        }
+	    });
+	    
+	    //百度搜索测试
+	    var baiduBsSuggest = $("#baidu").bsSuggest({
+	        allowNoKeyword: false, //是否允许无关键字时请求数据
+	        multiWord: true, //以分隔符号分割的多关键字支持
+	        separator: ",", //多关键字支持时的分隔符,默认为空格
+	        getDataMethod: "url", //获取数据的方式,总是从 URL 获取
+	        url: 'http://unionsug.baidu.com/su?p=3&t=' + (new Date()).getTime() + '&wd=',
+	        /*优先从url ajax 请求 json 帮助数据,注意最后一个参数为关键字请求参数*/
+	        jsonp: 'cb',
+	        /*如果从 url 获取数据,并且需要跨域,则该参数必须设置*/
+	        processData: function (json) { // url 获取数据时,对数据的处理,作为 getData 的回调函数
+	            var i, len, data = {
+	                value: []
+	            };
+	            if (!json || !json.s || json.s.length === 0) {
+	                return false;
+	            }
+	
+	            console.log(json);
+	            len = json.s.length;
+	
+	            jsonStr = "{'value':[";
+	            for (i = 0; i < len; i++) {
+	                data.value.push({
+	                    word: json.s[i]
+	                });
+	            }
+	            data.defaults = 'baidu';
+	
+	            //字符串转化为 js 对象
+	            return data;
+	        }
+	    });
+	    
+	    //淘宝搜索建议测试
+	    var taobaoBsSuggest = $("#taobao").bsSuggest({
+	        indexId: 2, //data.value 的第几个数据,作为input输入框的内容
+	        indexKey: 1, //data.value 的第几个数据,作为input输入框的内容
+	        allowNoKeyword: false, //是否允许无关键字时请求数据
+	        multiWord: true, //以分隔符号分割的多关键字支持
+	        separator: ",", //多关键字支持时的分隔符,默认为空格
+	        getDataMethod: "url", //获取数据的方式,总是从 URL 获取
+	        effectiveFieldsAlias: {
+	            Id: "序号",
+	            Keyword: "关键字",
+	            Count: "数量"
+	        },
+	        showHeader: true,
+	        url: 'http://suggest.taobao.com/sug?code=utf-8&extras=1&q=',
+	        /*优先从url ajax 请求 json 帮助数据,注意最后一个参数为关键字请求参数*/
+	        jsonp: 'callback',
+	        /*如果从 url 获取数据,并且需要跨域,则该参数必须设置*/
+	        processData: function (json) { // url 获取数据时,对数据的处理,作为 getData 的回调函数
+	            var i, len, data = {
+	                value: []
+	            };
+	
+	            if (!json || !json.result || json.result.length == 0) {
+	                return false;
+	            }
+	
+	            console.log(json);
+	            len = json.result.length;
+	
+	            for (i = 0; i < len; i++) {
+	                data.value.push({
+	                    "Id": (i + 1),
+	                    "Keyword": json.result[i][0],
+	                    "Count": json.result[i][1]
+	                });
+	            }
+	            console.log(data);
+	            return data;
+	        }
+	    });
+	    
+	    $('#typeahead-demo-1').typeahead({
+            source: ["ruoyi 1","ruoyi 2","ruoyi 3"]
+        });
+	    
+	    $('#typeahead-demo-2').typeahead({
+            source: [
+                {"name": "Afghanistan", "code": "AF", "ccn0": "040"},
+                {"name": "Land Islands", "code": "AX", "ccn0": "050"},
+                {"name": "Albania", "code": "AL","ccn0": "060"},
+                {"name": "Algeria", "code": "DZ","ccn0": "070"}
+            ]
+        });
+	    
+	    $.get(ctx + "demo/form/collection", function(data){
+	    	$("#typeahead-demo-3").typeahead({
+		        source: data.value
+		    });
+        },'json');
+    </script>
+</body>
+</html>

+ 593 - 0
leiSP-admin/src/main/resources/templates/demo/form/basic.html

@@ -0,0 +1,593 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('基本表单')" />
+</head>
+<body class="gray-bg">
+    <div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-7">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>基本表单 <small>简单登录表单示例</small></h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+                        <div class="row">
+                            <div class="col-sm-6 b-r">
+                                <h3 class="m-t-none m-b">登录</h3>
+                                <p>欢迎登录本站(⊙o⊙)</p>
+                                <form role="form">
+                                    <div class="form-group">
+                                        <label>用户名</label>
+                                        <input type="email" placeholder="请输入您注册的E-mail" class="form-control">
+                                    </div>
+                                    <div class="form-group">
+                                        <label>密码</label>
+                                        <input type="password" placeholder="请输入密码" class="form-control">
+                                    </div>
+                                    <div>
+                                        <button class="btn btn-sm btn-primary pull-right m-t-n-xs" type="submit"><strong>登 录</strong>
+                                        </button>
+                                        <label>
+                                            <input type="checkbox">自动登录</label>
+                                    </div>
+                                </form>
+                            </div>
+                            <div class="col-sm-6">
+                                <h4>还不是会员?</h4>
+                                <p>您可以注册一个新账户</p>
+                                <p class="text-center">
+                                    <a href="#"><i class="fa fa-sign-in big-icon"></i></a>
+                                </p>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-5">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>横向表单</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+                        <form class="form-horizontal">
+                            <p>欢迎登录本站(⊙o⊙)</p>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">用户名:</label>
+
+                                <div class="col-sm-8">
+                                    <input type="email" placeholder="用户名" class="form-control"> <span class="help-block m-b-none">请输入您注册时所填的E-mail</span>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">密码:</label>
+
+                                <div class="col-sm-8">
+                                    <input type="password" placeholder="密码" class="form-control">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="col-sm-offset-3 col-sm-8">
+                                    <button class="btn btn-sm btn-white" type="submit">登 录</button>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-8">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>内联表单</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+                        <form role="form" class="form-inline">
+                            <div class="form-group">
+                                <label for="exampleInputEmail2" class="sr-only">用户名</label>
+                                <input type="email" placeholder="请输入用户名" id="exampleInputEmail2" class="form-control">
+                            </div>
+                            <div class="form-group">
+                                <label for="exampleInputPassword2" class="sr-only">密码</label>
+                                <input type="password" placeholder="请输入密码" id="exampleInputPassword2" class="form-control">
+                            </div>
+                            <div class="checkbox m-l m-r-xs">
+                                <label>
+                                    <input type="checkbox"><i></i> 自动登录</label>
+                            </div>
+                            <button class="btn btn-white" type="submit">登录</button>
+                        </form>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-4">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>弹出表单 <small>弹出框登录示例</small></h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+                        <div class="text-center">
+                            <a data-toggle="modal" class="btn btn-primary" href="#modal-form">打开登录窗口</a>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>所有表单元素 <small>包括自定义样式的复选和单选按钮</small></h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+                        <form method="get" class="form-horizontal">
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">普通</label>
+
+                                <div class="col-sm-10">
+                                    <input type="text" class="form-control">
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">带说明信息</label>
+                                <div class="col-sm-10">
+                                    <input type="text" class="form-control"> <span class="help-block m-b-none">帮助文本,可能会超过一行,以块级元素显示</span>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">密码</label>
+
+                                <div class="col-sm-10">
+                                    <input type="password" class="form-control" name="password">
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">提示</label>
+
+                                <div class="col-sm-10">
+                                    <input type="text" placeholder="提示信息" class="form-control">
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">禁用</label>
+
+                                <div class="col-sm-10">
+                                    <input type="text" disabled="" placeholder="已被禁用" class="form-control">
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">静态控制</label>
+
+                                <div class="col-sm-10">
+                                    <p class="form-control-static">leisp</p>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">复选框&amp;单选框
+                                    <br/>
+                                    <small class="text-navy">普通Bootstrap元素</small>
+                                </label>
+
+                                <div class="col-sm-10">
+                                    <div class="checkbox">
+                                        <label>
+                                            <input type="checkbox" value="">选项1</label>
+                                    </div>
+                                    <div class="radio">
+                                        <label>
+                                            <input type="radio" checked="" value="option1" id="optionsRadios1" name="optionsRadios">选项1</label>
+                                    </div>
+                                    <div class="radio">
+                                        <label>
+                                            <input type="radio" value="option2" id="optionsRadios2" name="optionsRadios">选项2</label>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">内联复选框</label>
+
+                                <div class="col-sm-10">
+                                    <label class="checkbox-inline">
+                                        <input type="checkbox" value="option1" id="inlineCheckbox1">a</label>
+                                    <label class="checkbox-inline">
+                                        <input type="checkbox" value="option2" id="inlineCheckbox2">b</label>
+                                    <label class="checkbox-inline">
+                                        <input type="checkbox" value="option3" id="inlineCheckbox3">c</label>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">复选框&amp;单选框
+                                    <br/><small class="text-navy">自定义样式</small>
+                                </label>
+
+                                <div class="col-sm-10">
+                                    <div class="checkbox check-box">
+                                        <label>
+                                            <input type="checkbox" value=""> <i></i> 选项1</label>
+                                    </div>
+                                    <div class="checkbox check-box">
+                                        <label>
+                                            <input type="checkbox" value="" checked=""> <i></i> 选项2(选中)</label>
+                                    </div>
+                                    <div class="checkbox check-box">
+                                        <label>
+                                            <input type="checkbox" value="" disabled="" checked=""> <i></i> 选项3(选中并禁用)</label>
+                                    </div>
+                                    <div class="checkbox check-box">
+                                        <label>
+                                            <input type="checkbox" value="" disabled=""> <i></i> 选项4(禁用)</label>
+                                    </div>
+                                    <div class="radio check-box">
+                                        <label>
+                                            <input type="radio" value="option1" name="a"> <i></i> 选项1</label>
+                                    </div>
+                                    <div class="radio check-box">
+                                        <label>
+                                            <input type="radio" checked="" value="option2" name="a"> <i></i> 选项2(选中)</label>
+                                    </div>
+                                    <div class="radio check-box">
+                                        <label>
+                                            <input type="radio" disabled="" checked="" value="option2"> <i></i> 选项3(选中并禁用)</label>
+                                    </div>
+                                    <div class="radio check-box">
+                                        <label>
+                                            <input type="radio" disabled="" name="a"> <i></i> 选项4(禁用)</label>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">内联复选框</label>
+
+                                <div class="col-sm-10">
+                                    <label class="checkbox-inline check-box">
+                                        <input type="checkbox" value="option1">a</label>
+                                    <label class="checkbox-inline check-box">
+                                        <input type="checkbox" value="option2">b</label>
+                                    <label class="checkbox-inline check-box">
+                                        <input type="checkbox" value="option3">c</label>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">Select</label>
+
+                                <div class="col-sm-10">
+                                    <select class="form-control m-b" name="account">
+                                        <option>选项 1</option>
+                                        <option>选项 2</option>
+                                        <option>选项 3</option>
+                                        <option>选项 4</option>
+                                    </select>
+
+                                    <div class="col-sm-4 m-l-n">
+                                        <select class="form-control" multiple="">
+                                            <option>选项 1</option>
+                                            <option>选项 2</option>
+                                            <option>选项 3</option>
+                                            <option>选项 4</option>
+                                        </select>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group has-success">
+                                <label class="col-sm-2 control-label">验证通过</label>
+
+                                <div class="col-sm-10">
+                                    <input type="text" class="form-control">
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group has-warning">
+                                <label class="col-sm-2 control-label">未填写</label>
+
+                                <div class="col-sm-10">
+                                    <input type="text" class="form-control">
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group has-error">
+                                <label class="col-sm-2 control-label">验证未通过</label>
+
+                                <div class="col-sm-10">
+                                    <input type="text" class="form-control">
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">自定义尺寸</label>
+
+                                <div class="col-sm-10">
+                                    <input type="text" placeholder=".input-lg" class="form-control input-lg m-b">
+                                    <input type="text" placeholder="Default input" class="form-control m-b">
+                                    <input type="text" placeholder=".input-sm" class="form-control input-sm">
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">列尺寸</label>
+
+                                <div class="col-sm-10">
+                                    <div class="row">
+                                        <div class="col-md-2">
+                                            <input type="text" placeholder=".col-md-2" class="form-control">
+                                        </div>
+                                        <div class="col-md-3">
+                                            <input type="text" placeholder=".col-md-3" class="form-control">
+                                        </div>
+                                        <div class="col-md-4">
+                                            <input type="text" placeholder=".col-md-4" class="form-control">
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">文本框组</label>
+
+                                <div class="col-sm-10">
+                                    <div class="input-group m-b"><span class="input-group-addon">@</span>
+                                        <input type="text" placeholder="用户名" class="form-control">
+                                    </div>
+                                    <div class="input-group m-b">
+                                        <input type="text" class="form-control"> <span class="input-group-addon">.00</span>
+                                    </div>
+                                    <div class="input-group m-b"><span class="input-group-addon">&yen;</span>
+                                        <input type="text" class="form-control"> <span class="input-group-addon">.00</span>
+                                    </div>
+                                    <div class="input-group m-b"><span class="input-group-addon"> <input type="checkbox"> </span>
+                                        <input type="text" class="form-control">
+                                    </div>
+                                    <div class="input-group"><span class="input-group-addon"> <input type="radio"> </span>
+                                        <input type="text" class="form-control">
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">按钮插件</label>
+
+                                <div class="col-sm-10">
+                                    <div class="input-group m-b"><span class="input-group-btn">
+                                            <button type="button" class="btn btn-primary">搜</button> </span>
+                                        <input type="text" class="form-control">
+                                    </div>
+                                    <div class="input-group">
+                                        <input type="text" class="form-control"> <span class="input-group-btn"> <button type="button" class="btn btn-primary">搜索
+                                        </button> </span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">带下拉框</label>
+
+                                <div class="col-sm-10">
+                                    <div class="input-group m-b">
+                                        <div class="input-group-btn">
+                                            <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">操作 <span class="caret"></span>
+                                            </button>
+                                            <ul class="dropdown-menu">
+                                                <li><a href="#">选项1</a>
+                                                </li>
+                                                <li><a href="#">选项2</a>
+                                                </li>
+                                                <li><a href="#">选项3</a>
+                                                </li>
+                                                <li class="divider"></li>
+                                                <li><a href="#">选项4</a>
+                                                </li>
+                                            </ul>
+                                        </div>
+                                        <input type="text" class="form-control">
+                                    </div>
+                                    <div class="input-group">
+                                        <input type="text" class="form-control">
+
+                                        <div class="input-group-btn">
+                                            <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button">操作 <span class="caret"></span>
+                                            </button>
+                                            <ul class="dropdown-menu pull-right">
+                                                <li><a href="#">选项1</a>
+                                                </li>
+                                                <li><a href="#">选项2</a>
+                                                </li>
+                                                <li><a href="#">选项3</a>
+                                                </li>
+                                                <li class="divider"></li>
+                                                <li><a href="#">选项4</a>
+                                                </li>
+                                            </ul>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <label class="col-sm-2 control-label">分段</label>
+
+                                <div class="col-sm-10">
+                                    <div class="input-group m-b">
+                                        <div class="input-group-btn">
+                                            <button tabindex="-1" class="btn btn-white" type="button">操作</button>
+                                            <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button"><span class="caret"></span>
+                                            </button>
+                                            <ul class="dropdown-menu">
+                                                <li><a href="#">选项1</a>
+                                                </li>
+                                                <li><a href="#">选项2</a>
+                                                </li>
+                                                <li><a href="#">选项3</a>
+                                                </li>
+                                                <li class="divider"></li>
+                                                <li><a href="#">选项4</a>
+                                                </li>
+                                            </ul>
+                                        </div>
+                                        <input type="text" class="form-control">
+                                    </div>
+                                    <div class="input-group">
+                                        <input type="text" class="form-control">
+
+                                        <div class="input-group-btn">
+                                            <button tabindex="-1" class="btn btn-white" type="button">操作</button>
+                                            <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button"><span class="caret"></span>
+                                            </button>
+                                            <ul class="dropdown-menu pull-right">
+                                                	分段
+                                            </ul>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="hr-line-dashed"></div>
+                            <div class="form-group">
+                                <div class="col-sm-4 col-sm-offset-2">
+                                    <button class="btn btn-primary" type="submit">保存内容</button>
+                                    <button class="btn btn-white" type="submit">取消</button>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div id="modal-form" class="modal fade" aria-hidden="true">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-body">
+                    <div class="row">
+                        <div class="col-sm-6 b-r">
+                            <h3 class="m-t-none m-b">登录</h3>
+
+                            <p>欢迎登录本站(⊙o⊙)</p>
+
+                            <form role="form">
+                                <div class="form-group">
+                                    <label>用户名:</label>
+                                    <input type="email" placeholder="请输入用户名" class="form-control">
+                                </div>
+                                <div class="form-group">
+                                    <label>密码:</label>
+                                    <input type="password" placeholder="请输入密码" class="form-control">
+                                </div>
+                                <div>
+                                    <button class="btn btn-sm btn-primary pull-right m-t-n-xs" type="submit"><strong>登录</strong>
+                                    </button>
+                                    <label>
+                                        <input type="checkbox" class="i-checks">自动登录</label>
+                                </div>
+                            </form>
+                        </div>
+                        <div class="col-sm-6">
+                            <h4>还不是会员?</h4>
+                            <p>您可以注册一个账户</p>
+                            <p class="text-center">
+                                <a href="#"><i class="fa fa-sign-in big-icon"></i></a>
+                            </p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+</body>
+</html>

+ 620 - 0
leiSP-admin/src/main/resources/templates/demo/form/button.html

@@ -0,0 +1,620 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('按钮')" />
+</head>
+<body class="gray-bg">
+     <div class="row wrapper wrapper-content animated fadeInRight">
+        <div class="col-sm-4">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>按钮颜色</h5>
+                    <div class="ibox-tools">
+                        <a class="collapse-link">
+                            <i class="fa fa-chevron-up"></i>
+                        </a>
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                            <i class="fa fa-wrench"></i>
+                        </a>
+                        <ul class="dropdown-menu dropdown-user">
+                            <li><a href="#">选项1</a>
+                            </li>
+                            <li><a href="#">选项2</a>
+                            </li>
+                        </ul>
+                        <a class="close-link">
+                            <i class="fa fa-times"></i>
+                        </a>
+                    </div>
+                </div>
+                <div class="ibox-content">
+                    <p>
+                        可使用class来快速改变按钮的颜色,如<code>.btn-primary</code>
+                    </p>
+
+                    <h3 class="font-bold">
+                            普通按钮
+                        </h3>
+                    <p>
+                        <button type="button" class="btn btn-w-m btn-default">btn-default</button>
+                        <button type="button" class="btn btn-w-m btn-primary">btn-primary</button>
+                        <button type="button" class="btn btn-w-m btn-success">btn-success</button>
+                        <button type="button" class="btn btn-w-m btn-info">btn-info</button>
+                        <button type="button" class="btn btn-w-m btn-warning">btn-warning</button>
+                        <button type="button" class="btn btn-w-m btn-danger">btn-danger</button>
+                        <button type="button" class="btn btn-w-m btn-white">btn-white</button>
+                        <button type="button" class="btn btn-w-m btn-link">btn-link</button>
+                    </p>
+                </div>
+            </div>
+        </div>
+        <div class="col-sm-4">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>按钮大小</h5>
+                    <div class="ibox-tools">
+                        <a class="collapse-link">
+                            <i class="fa fa-chevron-up"></i>
+                        </a>
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                            <i class="fa fa-wrench"></i>
+                        </a>
+                        <ul class="dropdown-menu dropdown-user">
+                            <li><a href="#">选项1</a>
+                            </li>
+                            <li><a href="#">选项2</a>
+                            </li>
+                        </ul>
+                        <a class="close-link">
+                            <i class="fa fa-times"></i>
+                        </a>
+                    </div>
+                </div>
+                <div class="ibox-content">
+                    <p>
+                        可以通过添加class的值为<code>.btn-lg</code>, <code>.btn-sm</code>, or <code>.btn-xs</code>来修改按钮的大小
+                    </p>
+                    <h3 class="font-bold">按钮尺寸</h3>
+                    <p>
+                        <button type="button" class="btn btn-primary btn-lg">大按钮</button>
+                        <button type="button" class="btn btn-default btn-lg">大按钮</button>
+                        <br/>
+                        <button type="button" class="btn btn-primary">默认按钮</button>
+                        <button type="button" class="btn btn-default">默认按钮</button>
+                        <br/>
+                        <button type="button" class="btn btn-primary btn-sm">小按钮</button>
+                        <button type="button" class="btn btn-default btn-sm">小按钮</button>
+                        <br/>
+                        <button type="button" class="btn btn-primary btn-xs">Mini按钮</button>
+                        <button type="button" class="btn btn-default btn-xs">Mini按钮</button>
+                    </p>
+                </div>
+            </div>
+        </div>
+        <div class="col-sm-4">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>线性按钮</h5>
+                    <div class="ibox-tools">
+                        <a class="collapse-link">
+                            <i class="fa fa-chevron-up"></i>
+                        </a>
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                            <i class="fa fa-wrench"></i>
+                        </a>
+                        <ul class="dropdown-menu dropdown-user">
+                            <li><a href="#">选项1</a>
+                            </li>
+                            <li><a href="#">选项2</a>
+                            </li>
+                        </ul>
+                        <a class="close-link">
+                            <i class="fa fa-times"></i>
+                        </a>
+                    </div>
+                </div>
+                <div class="ibox-content">
+                    <p>
+                        要使用线性按钮,可添加class<code>.btn-block</code>或<code>.btn-outline</code>
+                    </p>
+
+                    <h3 class="font-bold">线性按钮</h3>
+                    <p>
+                        <button type="button" class="btn btn-outline btn-default">默认</button>
+                        <button type="button" class="btn btn-outline btn-primary">主要</button>
+                        <button type="button" class="btn btn-outline btn-success">成功</button>
+                        <button type="button" class="btn btn-outline btn-info">信息</button>
+                        <button type="button" class="btn btn-outline btn-warning">警告</button>
+                        <button type="button" class="btn btn-outline btn-danger">危险</button>
+                        <button type="button" class="btn btn-outline btn-link">链接</button>
+                    </p>
+                    <h3 class="font-bold">块级按钮</h3>
+                    <p>
+                        <button type="button" class="btn btn-block btn-outline btn-primary">这是一个块级按钮</button>
+                    </p>
+                </div>
+            </div>
+        </div>
+        <div class="col-sm-12">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>3D按钮</h5>
+                    <div class="ibox-tools">
+                        <a class="collapse-link">
+                            <i class="fa fa-chevron-up"></i>
+                        </a>
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                            <i class="fa fa-wrench"></i>
+                        </a>
+                        <ul class="dropdown-menu dropdown-user">
+                            <li><a href="#">选项1</a>
+                            </li>
+                            <li><a href="#">选项2</a>
+                            </li>
+                        </ul>
+                        <a class="close-link">
+                            <i class="fa fa-times"></i>
+                        </a>
+                    </div>
+                </div>
+                <div class="ibox-content">
+                    <p>
+                        可以通过添加<code>.dim</code>class来使用3D按钮.
+                    </p>
+                    <h3 class="font-bold">3D按钮</h3>
+
+                    <button class="btn btn-primary dim btn-large-dim" type="button"><i class="fa fa-money"></i>
+                    </button>
+                    <button class="btn btn-warning dim btn-large-dim" type="button"><i class="fa fa-warning"></i>
+                    </button>
+                    <button class="btn btn-danger  dim btn-large-dim" type="button"><i class="fa fa-heart"></i>
+                    </button>
+                    <button class="btn btn-primary  dim btn-large-dim" type="button"><i class="fa fa-dollar"></i>6</button>
+                    <button class="btn btn-info  dim btn-large-dim btn-outline" type="button"><i class="fa fa-ruble"></i>
+                    </button>
+                    <button class="btn btn-primary dim" type="button"><i class="fa fa-money"></i>
+                    </button>
+                    <button class="btn btn-warning dim" type="button"><i class="fa fa-warning"></i>
+                    </button>
+                    <button class="btn btn-primary dim" type="button"><i class="fa fa-check"></i>
+                    </button>
+                    <button class="btn btn-success  dim" type="button"><i class="fa fa-upload"></i>
+                    </button>
+                    <button class="btn btn-info  dim" type="button"><i class="fa fa-paste"></i>
+                    </button>
+                    <button class="btn btn-warning  dim" type="button"><i class="fa fa-warning"></i>
+                    </button>
+                    <button class="btn btn-default  dim " type="button"><i class="fa fa-star"></i>
+                    </button>
+                    <button class="btn btn-danger  dim " type="button"><i class="fa fa-heart"></i>
+                    </button>
+
+                    <button class="btn btn-outline btn-primary dim" type="button"><i class="fa fa-money"></i>
+                    </button>
+                    <button class="btn btn-outline btn-warning dim" type="button"><i class="fa fa-warning"></i>
+                    </button>
+                    <button class="btn btn-outline btn-primary dim" type="button"><i class="fa fa-check"></i>
+                    </button>
+                    <button class="btn btn-outline btn-success  dim" type="button"><i class="fa fa-upload"></i>
+                    </button>
+                    <button class="btn btn-outline btn-info  dim" type="button"><i class="fa fa-paste"></i>
+                    </button>
+                    <button class="btn btn-outline btn-warning  dim" type="button"><i class="fa fa-warning"></i>
+                    </button>
+                    <button class="btn btn-outline btn-danger  dim " type="button"><i class="fa fa-heart"></i>
+                    </button>
+
+                </div>
+            </div>
+        </div>
+        <div class="col-sm-12">
+            <div class="row">
+                <div class="col-sm-6">
+                    <div class="ibox float-e-margins">
+                        <div class="ibox-title">
+                            <h5>下拉按钮</h5>
+                            <div class="ibox-tools">
+                                <a class="collapse-link">
+                                    <i class="fa fa-chevron-up"></i>
+                                </a>
+                                <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                    <i class="fa fa-wrench"></i>
+                                </a>
+                                <ul class="dropdown-menu dropdown-user">
+                                    <li><a href="#">选项1</a>
+                                    </li>
+                                    <li><a href="#">选项2</a>
+                                    </li>
+                                </ul>
+                                <a class="close-link">
+                                    <i class="fa fa-times"></i>
+                                </a>
+                            </div>
+                        </div>
+                        <div class="ibox-content">
+                            <p>
+                                下拉按钮可使用任何颜色任何大小
+                            </p>
+
+                            <h3 class="font-bold">下拉按钮</h3>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-primary dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#" class="font-bold">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-warning dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-default dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#" class="font-bold">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+
+                            <br/>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-primary btn-sm dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#" class="font-bold">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-warning btn-sm dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#" class="font-bold">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-default btn-sm dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#" class="font-bold">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <br/>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-primary btn-xs dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#" class="font-bold">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-warning btn-xs dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#" class="font-bold">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+                            <div class="btn-group">
+                                <button data-toggle="dropdown" class="btn btn-default btn-xs dropdown-toggle">操作 <span class="caret"></span>
+                                </button>
+                                <ul class="dropdown-menu">
+                                    <li><a href="#">置顶</a>
+                                    </li>
+                                    <li><a href="#" class="font-bold">修改</a>
+                                    </li>
+                                    <li><a href="#">禁用</a>
+                                    </li>
+                                    <li class="divider"></li>
+                                    <li><a href="#">删除</a>
+                                    </li>
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="ibox float-e-margins">
+                        <div class="ibox-title">
+                            <h5>按钮组</h5>
+                            <div class="ibox-tools">
+                                <a class="collapse-link">
+                                    <i class="fa fa-chevron-up"></i>
+                                </a>
+                                <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                    <i class="fa fa-wrench"></i>
+                                </a>
+                                <ul class="dropdown-menu dropdown-user">
+                                    <li><a href="#">选项1</a>
+                                    </li>
+                                    <li><a href="#">选项2</a>
+                                    </li>
+                                </ul>
+                                <a class="close-link">
+                                    <i class="fa fa-times"></i>
+                                </a>
+                            </div>
+                        </div>
+                        <div class="ibox-content">
+
+                            <h3 class="font-bold">按钮组</h3>
+                            <div class="btn-group">
+                                <button class="btn btn-white" type="button">左</button>
+                                <button class="btn btn-primary" type="button">中</button>
+                                <button class="btn btn-white" type="button">右</button>
+                            </div>
+                            <br/>
+                            <br/>
+                            <div class="btn-group">
+                                <button type="button" class="btn btn-white"><i class="fa fa-chevron-left"></i>
+                                </button>
+                                <button class="btn btn-white">1</button>
+                                <button class="btn btn-white  active">2</button>
+                                <button class="btn btn-white">3</button>
+                                <button class="btn btn-white">4</button>
+                                <button type="button" class="btn btn-white"><i class="fa fa-chevron-right"></i>
+                                </button>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>图标按钮 </h5>
+                    <div class="ibox-tools">
+                        <a class="collapse-link">
+                            <i class="fa fa-chevron-up"></i>
+                        </a>
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                            <i class="fa fa-wrench"></i>
+                        </a>
+                        <ul class="dropdown-menu dropdown-user">
+                            <li><a href="#">选项1</a>
+                            </li>
+                            <li><a href="#">选项2</a>
+                            </li>
+                        </ul>
+                        <a class="close-link">
+                            <i class="fa fa-times"></i>
+                        </a>
+                    </div>
+                </div>
+                <div class="ibox-content">
+                    <p>
+                        任何按钮都可以在左侧或右侧添加图标
+                    </p>
+
+                    <h3 class="font-bold">图标按钮</h3>
+                    <p>
+                        <button class="btn btn-primary " type="button"><i class="fa fa-check"></i>&nbsp;提交</button>
+                        <button class="btn btn-success " type="button"><i class="fa fa-upload"></i>&nbsp;&nbsp;<span class="bold">上传</span>
+                        </button>
+                        <button class="btn btn-info " type="button"><i class="fa fa-paste"></i> 编辑</button>
+                        <button class="btn btn-warning " type="button"><i class="fa fa-warning"></i> <span class="bold">警告</span>
+                        </button>
+                        <button class="btn btn-default " type="button"><i class="fa fa-map-marker"></i>&nbsp;&nbsp;百度地图</button>
+
+                        <a class="btn btn-success">
+                            <i class="fa fa-weixin"> </i> 分享到微信
+                        </a>
+                        <a class="btn btn-success btn-outline">
+                            <i class="fa fa-qq"> </i> 使用QQ账号登录
+                        </a>
+                        <a class="btn btn-white btn-bitbucket">
+                            <i class="fa fa-user-md"></i>
+                        </a>
+                        <a class="btn btn-white btn-bitbucket">
+                            <i class="fa fa-group"></i>
+                        </a>
+                        <a class="btn btn-white btn-bitbucket">
+                            <i class="fa fa-wrench"></i>
+                        </a>
+                        <a class="btn btn-white btn-bitbucket">
+                            <i class="fa fa-exchange"></i>
+                        </a>
+                        <a class="btn btn-white btn-bitbucket">
+                            <i class="fa fa-check-circle-o"></i>
+                        </a>
+                        <a class="btn btn-white btn-bitbucket">
+                            <i class="fa fa-road"></i>
+                        </a>
+                        <a class="btn btn-white btn-bitbucket">
+                            <i class="fa fa-ambulance"></i>
+                        </a>
+                        <a class="btn btn-white btn-bitbucket">
+                            <i class="fa fa-star"></i> 收藏
+                        </a>
+                    </p>
+
+                    <h3 class="font-bold">按钮切换</h3>
+                    <button data-toggle="button" class="btn btn-primary btn-outline" type="button">按钮1</button>
+                    <button data-toggle="button" class="btn btn-primary" type="button">按钮2</button>
+                    <div data-toggle="buttons-checkbox" class="btn-group">
+                        <button class="btn btn-primary active" type="button"><i class="fa fa-bold"></i> 粗体</button>
+                        <button class="btn btn-primary" type="button"><i class="fa fa-underline"></i> 下划线</button>
+                        <button class="btn btn-primary active" type="button"><i class="fa fa-italic"></i> 斜体</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-sm-12">
+            <div class="row">
+                <div class="col-sm-6">
+                    <div class="ibox float-e-margins">
+                        <div class="ibox-title">
+                            <h5>圆形图标按钮</h5>
+                            <div class="ibox-tools">
+                                <a class="collapse-link">
+                                    <i class="fa fa-chevron-up"></i>
+                                </a>
+                                <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                    <i class="fa fa-wrench"></i>
+                                </a>
+                                <ul class="dropdown-menu dropdown-user">
+                                    <li><a href="#">选项1</a>
+                                    </li>
+                                    <li><a href="#">选项2</a>
+                                    </li>
+                                </ul>
+                                <a class="close-link">
+                                    <i class="fa fa-times"></i>
+                                </a>
+                            </div>
+                        </div>
+                        <div class="ibox-content">
+                            <p>
+                                要使用圆形图标按钮,可以通过添加class为<code>.btn-circle</code>实现
+                            </p>
+
+                            <h3 class="font-bold">圆形按钮</h3>
+                            <br/>
+                            <button class="btn btn-default btn-circle" type="button"><i class="fa fa-check"></i>
+                            </button>
+                            <button class="btn btn-primary btn-circle" type="button"><i class="fa fa-list"></i>
+                            </button>
+                            <button class="btn btn-success btn-circle" type="button"><i class="fa fa-link"></i>
+                            </button>
+                            <button class="btn btn-info btn-circle" type="button"><i class="fa fa-check"></i>
+                            </button>
+                            <button class="btn btn-warning btn-circle" type="button"><i class="fa fa-times"></i>
+                            </button>
+                            <button class="btn btn-danger btn-circle" type="button"><i class="fa fa-heart"></i>
+                            </button>
+                            <button class="btn btn-danger btn-circle btn-outline" type="button"><i class="fa fa-heart"></i>
+                            </button>
+                            <br/>
+                            <br/>
+                            <button class="btn btn-default btn-circle btn-lg" type="button"><i class="fa fa-check"></i>
+                            </button>
+                            <button class="btn btn-primary btn-circle btn-lg" type="button"><i class="fa fa-list"></i>
+                            </button>
+                            <button class="btn btn-success btn-circle btn-lg" type="button"><i class="fa fa-link"></i>
+                            </button>
+                            <button class="btn btn-info btn-circle btn-lg" type="button"><i class="fa fa-check"></i>
+                            </button>
+                            <button class="btn btn-warning btn-circle btn-lg" type="button"><i class="fa fa-times"></i>
+                            </button>
+                            <button class="btn btn-danger btn-circle btn-lg" type="button"><i class="fa fa-heart"></i>
+                            </button>
+                            <button class="btn btn-danger btn-circle btn-lg btn-outline" type="button"><i class="fa fa-heart"></i>
+                            </button>
+
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="ibox float-e-margins">
+                        <div class="ibox-title">
+                            <h5>圆角按钮</h5>
+                            <div class="ibox-tools">
+                                <a class="collapse-link">
+                                    <i class="fa fa-chevron-up"></i>
+                                </a>
+                                <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                    <i class="fa fa-wrench"></i>
+                                </a>
+                                <ul class="dropdown-menu dropdown-user">
+                                    <li><a href="#">选项1</a>
+                                    </li>
+                                    <li><a href="#">选项2</a>
+                                    </li>
+                                </ul>
+                                <a class="close-link">
+                                    <i class="fa fa-times"></i>
+                                </a>
+                            </div>
+                        </div>
+                        <div class="ibox-content">
+                            <p>
+                                可以通过添加class的值微<code>.btn-rounded</code>来实现圆角按钮
+                            </p>
+
+                            <h3 class="font-bold">按钮组</h3>
+                            <p>
+                                <a class="btn btn-default btn-rounded" href="#">默认</a>
+                                <a class="btn btn-primary btn-rounded" href="#">主要</a>
+                                <a class="btn btn-success btn-rounded" href="#">成果</a>
+                                <a class="btn btn-info btn-rounded" href="#">信息</a>
+                                <a class="btn btn-warning btn-rounded" href="#">警告</a>
+                                <a class="btn btn-danger btn-rounded" href="#">危险</a>
+                                <a class="btn btn-danger btn-rounded btn-outline" href="#">危险</a>
+                                <br/>
+                                <br/>
+                                <a class="btn btn-primary btn-rounded btn-block" href="#"><i class="fa fa-info-circle"></i> 圆角块级带图标按钮</a>
+                            </p>
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+</body>
+</html>

+ 319 - 0
leiSP-admin/src/main/resources/templates/demo/form/cards.html

@@ -0,0 +1,319 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('卡片列表')" />
+</head>
+<body class="gray-bg">
+    <div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-4">
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <span class="label label-primary pull-right">NEW</span>
+                        <h5>IT-01 - 设计部</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">48%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 48%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                12
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                4个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;200,913 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <h5>IT-04 - 市场部</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">32%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 32%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                24
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                3个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;190,325 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <h5>IT-07 - 财务部</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">73%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 73%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                11
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                6个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;560,105 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-4">
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <h5>IT-02 - 开发部</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">61%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 61%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                43
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                1个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;705,913 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <span class="label label-warning pull-right">截止</span>
+                        <h5>IT-05 - 管理层</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">14%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 14%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                8
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                7个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;40,200 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <h5>IT-08 - 销售部</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">25%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 25%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                25
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                4个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;140,105 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-4">
+                <div class="ibox">
+                    <div class="ibox-title">
+
+                        <h5>IT-02 - 销售部</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">82%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 82%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                68
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                2个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;701,400 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <h5>IT-06 - 销售部</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">26%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 26%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                16
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                8个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;160,100 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <h5>IT-09 - 销售部</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h4>部门简介</h4>
+                        <p>
+                                                                           平面设计(graphic design),也称为视觉传达设计,是以“视觉”作为沟通和表现的方式,透过多种方式来创造和结合符号、图片和文字,借此作出用来传达想法或讯息的视觉表现。
+                        </p>
+                        <div>
+                            <span>当前项目进度:</span>
+                            <div class="stat-percent">18%</div>
+                            <div class="progress progress-mini">
+                                <div style="width: 18%;" class="progress-bar"></div>
+                            </div>
+                        </div>
+                        <div class="row  m-t-sm">
+                            <div class="col-sm-4">
+                                <div class="font-bold">项目</div>
+                                53
+                            </div>
+                            <div class="col-sm-4">
+                                <div class="font-bold">周期</div>
+                                9个月
+                            </div>
+                            <div class="col-sm-4 text-right">
+                                <div class="font-bold">预算</div>
+                                &yen;60,140 <i class="fa fa-level-up text-navy"></i>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+</body>
+</html>

+ 161 - 0
leiSP-admin/src/main/resources/templates/demo/form/cxselect.html

@@ -0,0 +1,161 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('多级联动下拉')" />
+</head>
+<body class="gray-bg">
+      <div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>多级联动下拉<small>https://github.com/ciaoca/cxSelect</small></h5>
+                    </div>  
+                    <div class="ibox-content">
+                        <p>简单联动示例。</p>
+                        <div id="element" class="row">
+                            <div class="col-sm-2">
+	                            <select class="type form-control m-b" data-first-title="请选择">
+				                  <option value="">请选择</option>
+				                </select>
+			                </div>
+			                <div class="col-sm-2">
+				                <select class="router form-control m-b" data-first-title="请选择">
+				                  <option value="">请选择</option>
+				                </select>
+			                </div>
+                        </div>
+                        <hr>
+                        
+                        <p>国内省市区联动。</p>
+                        <div id="element1" class="row">
+                            <div class="col-sm-2">
+	                            <select class="province form-control m-b" data-first-title="选择省">
+				                  <option value="">请选择</option>
+				                  <option value="广东省" selected>广东省</option>
+				                </select>
+			                </div>
+			                <div class="col-sm-2">
+				                <select class="city form-control m-b" data-first-title="选择市">
+				                  <option value="">请选择</option>
+				                  <option value="深圳市" selected>深圳市</option>
+				                </select>
+			                </div>
+			                <div class="col-sm-2">
+				                <select class="area form-control m-b" data-first-title="选择地区">
+				                  <option value="">请选择</option>
+				                  <option value="南山区" selected>南山区</option>
+				                </select>
+			                </div>
+                        </div>
+                        <hr>
+                        
+                        <p>自定义选项。</p>
+                        <div id="element2" class="row">
+                            <div class="col-sm-2">
+	                            <select class="first form-control m-b"></select>
+			                </div>
+			                <div class="col-sm-2">
+				                <select class="second form-control m-b"></select>
+			                </div>
+			                <div class="col-sm-2">
+				                <select class="third form-control m-b"></select>
+			                </div>
+			                <div class="col-sm-2">
+				                <select class="fourth form-control m-b"></select>
+			                </div>
+			                <div class="col-sm-2">
+			                    <select class="fifth form-control m-b"></select>
+			                </div>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="#" target="_blank">http://www.sooka.com</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: jquery-cxselect-js" />
+    <script th:inline="javascript">
+        // 直接返回获取
+   		var data = [[${data}]];
+    	$('#element').cxSelect({
+    	  selects: ['type', 'router'],
+    	  jsonValue: 'v',
+    	  data: data
+    	});
+    	
+    	// 通过默认url获取
+    	var urlChina = 'cityData';
+    	$.cxSelect.defaults.url = urlChina;
+    	$('#element1').cxSelect({
+   		  selects: ['province', 'city', 'area'],
+   		  nodata: 'none'
+   		});
+    	
+    	// 固定值获取
+    	$('#element2').cxSelect({
+   		  selects: ['first', 'second', 'third', 'fourth', 'fifth'],
+   		  required: true,
+   		  jsonValue: 'v',
+   		  data: [
+   			{'v': '1', 'n': '第一级 >', 's': [
+   			  {'v': '2', 'n': '第二级 >', 's': [
+   				{'v': '3', 'n': '第三级 >', 's': [
+   				  {'v': '4', 'n': '第四级 >', 's': [
+   					{'v': '5', 'n': '第五级 >', 's': [
+   					  {'v': '6', 'n': '第六级 >'}
+   					]}
+   				  ]}
+   				]}
+   			  ]}
+   			]},
+   			{'v': 'test number', 'n': '测试数字', 's': [
+   			  {'v': 'text', 'n': '文本类型', 's': [
+   				{'v': '4', 'n': '4'},
+   				{'v': '5', 'n': '5'},
+   				{'v': '6', 'n': '6'},
+   				{'v': '7', 'n': '7'},
+   				{'v': '8', 'n': '8'},
+   				{'v': '9', 'n': '9'},
+   				{'v': '10', 'n': '10'}
+   			  ]},
+   			  {'v': 'number', 'n': '数值类型', 's': [
+   				{'v': 11, 'n': 11},
+   				{'v': 12, 'n': 12},
+   				{'v': 13, 'n': 13},
+   				{'v': 14, 'n': 14},
+   				{'v': 15, 'n': 15},
+   				{'v': 16, 'n': 16},
+   				{'v': 17, 'n': 17}
+   			  ]}
+   			]},
+   			{'v': 'test boolean','n': '测试 Boolean 类型', 's': [
+   			  {'v': true ,'n': true},
+   			  {'v': false ,'n': false}
+   			]},
+   			{v: 'test quotes', n: '测试属性不加引号', s: [
+   			  {v: 'quotes', n: '引号'}
+   			]},
+   			{v: 'test other', n: '测试奇怪的值', s: [
+   			  {v: '[]', n: '数组(空)'},
+   			  {v: [1,2,3], n: '数组(数值)'},
+   			  {v: ['a','b','c'], n: '数组(文字)'},
+   			  {v: new Date(), n: '日期'},
+   			  {v: new RegExp('\\d+'), n: '正则对象'},
+   			  {v: /\d+/, n: '正则直接量'},
+   			  {v: {}, n: '对象'},
+   			  {v: document.getElementById('custom_data'), n: 'DOM'},
+   			  {v: null, n: 'Null'},
+   			  {n: '未设置 value'}
+   			]},
+   			{'v': '' , 'n': '无子级'}
+   		  ]
+   		});
+    </script>
+</body>
+</html>

+ 236 - 0
leiSP-admin/src/main/resources/templates/demo/form/datetime.html

@@ -0,0 +1,236 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('日期和时间')" />
+	<th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="gray-bg">
+      <div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>日期选择器 <small>https://github.com/smalot/bootstrap-datetimepicker</small></h5>
+                    </div>
+                    <div class="ibox-content">
+                        <div class="form-group">
+                            <label class="font-noraml">简单示例</label>
+                            <div class="input-group date">
+                                <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                                <input type="text" class="form-control" id="datetimepicker-demo-1" placeholder="yyyy-MM-dd HH:mm">
+                            </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">显示年月日</label>
+                            <div class="input-group date">
+                                <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                                <input type="text" class="form-control" id="datetimepicker-demo-2" placeholder="yyyy-MM-dd">
+                            </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">显示年月日时分秒</label>
+                            <div class="input-group date">
+                                <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                                <input type="text" class="form-control" id="datetimepicker-demo-3" placeholder="yyyy-MM-dd HH:mm:ss">
+                            </div>
+                        </div>
+                        
+                        <div class="form-group">
+			                <label class="font-noraml">带清空的按钮</label>
+			                <div class="input-group date form_date">
+			                    <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+			                    <input class="form-control" size="16" type="text" readonly>
+			                    <span class="input-group-addon"><span class="glyphicon glyphicon-remove"></span></span>
+			                </div>
+			            </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">日期范围选择</label>
+                            <div class="input-daterange input-group">
+                                <input type="text" class="input-sm form-control" id="datetimepicker-startTime" placeholder="yyyy-MM-dd"/>
+                                <span class="input-group-addon">到</span>
+                                <input type="text" class="input-sm form-control" id="datetimepicker-endTime" placeholder="yyyy-MM-dd"/>
+                            </div>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="http://www.sooka.com" target="_blank">http://www.sooka.com</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>日期选择器 <small>https://github.com/sentsin/laydate</small></h5>
+                    </div>
+                    <div class="ibox-content">
+                        <div class="form-group">
+                            <label class="font-noraml">简单示例</label>
+                            <div class="input-group date">
+                                <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                                <input type="text" class="form-control" id="laydate-demo-1" placeholder="yyyy-MM-dd">
+                            </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">显示年月日</label>
+                            <div class="input-group date">
+                                <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                                <input type="text" class="form-control" id="laydate-demo-2" placeholder="yyyy-MM-dd">
+                            </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">显示年月日时分秒</label>
+                            <div class="input-group date">
+                                <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                                <input type="text" class="form-control" id="laydate-demo-3" placeholder="yyyy-MM-dd HH:mm:ss">
+                            </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">单框范围选择</label>
+                            <div class="input-group date">
+                                <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                                <input type="text" class="form-control" id="laydate-demo-4" placeholder="yyyy-MM-dd - yyyy-MM-dd">
+                            </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">日期范围选择</label>
+                            <div class="input-daterange input-group">
+                                <input type="text" class="input-sm form-control" id="laydate-startTime" placeholder="yyyy-MM-dd"/>
+                                <span class="input-group-addon">到</span>
+                                <input type="text" class="input-sm form-control" id="laydate-endTime" placeholder="yyyy-MM-dd"/>
+                            </div>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="http://www.sooka.com" target="_blank">http://www.sooka.com</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script type="text/javascript">
+        $(function(){
+        	<!-- datetimepicker示例 -->
+        	$("#datetimepicker-demo-1").datetimepicker();
+        	
+        	$("#datetimepicker-demo-2").datetimepicker({
+       		    format: "yyyy-mm-dd",
+       		    minView: "month",
+       		    autoclose: true
+       		});
+        	
+        	$("#datetimepicker-demo-3").datetimepicker({
+       		    format: "yyyy-mm-dd hh:ii:ss",
+       		    autoclose: true
+       		});
+        	
+        	$('.form_date').datetimepicker({
+        		format: "yyyy-mm-dd",
+       		    minView: "month",
+       		    autoclose: true
+            });
+        	
+        	$("#datetimepicker-startTime").datetimepicker({
+        		format: 'yyyy-mm-dd',
+        		minView: "month",
+        	    todayBtn:  true,
+        	    autoclose: true,
+        		endDate : new Date(),
+        	}).on('changeDate', function(event) {
+        		event.preventDefault();
+        		event.stopPropagation();
+        		var startTime = event.date;
+        		$('#datetimepicker-endTime').datetimepicker('setStartDate', startTime);
+        	});
+        	
+        	$("#datetimepicker-endTime").datetimepicker({
+        		format: 'yyyy-mm-dd',
+        		minView: "month",
+        		todayBtn:  true,
+        		autoclose: true,
+        		endDate : new Date(),
+        	}).on('changeDate', function(event) {
+        		event.preventDefault();
+        		event.stopPropagation();
+        		var endTime = event.date;
+        		$("#datetimepicker-startTime").datetimepicker('setEndDate', endTime);
+        	});
+        	
+        	<!-- laydate示例 -->
+        	layui.use('laydate', function(){
+       		  var laydate = layui.laydate;
+       		  
+       		  laydate.render({
+       		    elem: '#laydate-demo-1'
+       		  });
+       		  
+       		  laydate.render({ 
+       		    elem: '#laydate-demo-2',
+       		    type: 'date'
+       		  });
+       		  
+       		  laydate.render({ 
+       		    elem: '#laydate-demo-3',
+       		    type: 'datetime',
+       		    trigger: 'click'
+       		  });
+       		  
+       		  laydate.render({
+       		    elem: '#laydate-demo-4',
+       		    range: true
+       		  });
+       		  
+       		  var startDate = laydate.render({
+		        elem: '#laydate-startTime',
+		        max: $('#laydate-endTime').val(),
+		        theme: 'molv',
+		        trigger: 'click',
+		        done: function(value, date) {
+		            // 结束时间大于开始时间
+		            if (value !== '') {
+		                endDate.config.min.year = date.year;
+		                endDate.config.min.month = date.month - 1;
+		                endDate.config.min.date = date.date;
+		            } else {
+		                endDate.config.min.year = '';
+		                endDate.config.min.month = '';
+		                endDate.config.min.date = '';
+		            }
+		        }
+		      });
+       		
+		      var endDate = laydate.render({
+		        elem: '#laydate-endTime',
+		        min: $('#laydate-startTime').val(),
+		        theme: 'molv',
+		        trigger: 'click',
+		        done: function(value, date) {
+		            // 开始时间小于结束时间
+		            if (value !== '') {
+		                startDate.config.max.year = date.year;
+		                startDate.config.max.month = date.month - 1;
+		                startDate.config.max.date = date.date;
+		            } else {
+		                startDate.config.max.year = '';
+		                startDate.config.max.month = '';
+		                startDate.config.max.date = '';
+		            }
+		        }
+		      });
+       	   });
+        });
+    </script>
+</body>
+</html>

+ 65 - 0
leiSP-admin/src/main/resources/templates/demo/form/duallistbox.html

@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('左右互选组件')" />
+	<th:block th:include="include :: bootstrap-duallistbox-css" />
+</head>
+<body class="gray-bg">
+	<div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-lg-12">
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <h5>双重列表框 <small>https://github.com/istvan-ujjmeszaros/bootstrap-duallistbox</small></h5>
+                    </div>  
+                    <div class="ibox-content">
+                        <p>
+                            Bootstrap Dual Listbox是针对Twitter Bootstrap进行了优化的响应式双列表框。它适用于所有现代浏览器和触摸设备。
+                        </p>
+
+                        <form id="form" action="#" class="wizard-big">
+                            <select class="form-control dual_select" multiple>
+                                <option value="1">若依1</option>
+                                <option value="2">若依2</option>
+                                <option value="3">若依3</option>
+                                <option selected value="4">若依4</option>
+                                <option selected value="5">若依5</option>
+                                <option value="6">若依6</option>
+                                <option value="7">若依7</option>
+                                <option value="8">若依8</option>
+                                <option value="9">若依9</option>
+                                <option value="10">若依10</option>
+                                <option value="11">若依11</option>
+                                <option value="12">若依12</option>
+                            </select>
+                        </form>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="http://www.sooka.com/document/zjwd.html#bootstrap-duallistbox" target="_blank">http://www.sooka.com/document/zjwd.html#bootstrap-duallistbox</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: bootstrap-duallistbox-js" />
+    <script type="text/javascript">
+	    $('.dual_select').bootstrapDualListbox({
+	    	nonSelectedListLabel: '未有用户',
+            selectedListLabel: '已有用户',
+            preserveSelectionOnMove: 'moved',
+            moveOnSelect: false,           // 出现一个剪头,表示可以一次选择一个
+            filterTextClear: '展示所有',
+            moveSelectedLabel: "添加",
+            moveAllLabel: '添加所有',
+            removeSelectedLabel: "移除",
+            removeAllLabel: '移除所有',
+            infoText: '共{0}个',
+            showFilterInputs: false,       // 是否带搜索
+	        selectorMinimalHeight: 160
+	    });
+    </script>
+</body>
+</html>

+ 432 - 0
leiSP-admin/src/main/resources/templates/demo/form/grid.html

@@ -0,0 +1,432 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('栅格')" />
+</head>
+<body class="gray-bg">
+    <div class="wrapper wrapper-content">
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>栅格设置</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+
+                        <p>通过下表可以详细查看 Bootstrap 的栅格系统是如何在多种屏幕设备上工作的。</p>
+                        <div class="table-responsive">
+                            <table class="table table-bordered table-striped">
+                                <thead>
+                                    <tr>
+                                        <th></th>
+                                        <th>
+                                            超小屏幕
+                                            <small>手机 (&lt;768px)</small>
+                                        </th>
+                                        <th>
+                                            小屏幕
+                                            <small>平板 (≥768px)</small>
+                                        </th>
+                                        <th>
+                                            中等屏幕
+                                            <small>桌面显示器 (≥992px)</small>
+                                        </th>
+                                        <th>
+                                            大屏幕
+                                            <small>大桌面显示器 (≥1200px)</small>
+                                        </th>
+                                    </tr>
+                                </thead>
+                                <tbody>
+                                    <tr>
+                                        <th class="text-nowrap">栅格系统行为</th>
+                                        <td>总是水平排列</td>
+                                        <td colspan="3">开始是堆叠在一起的,当大于这些阈值时将变为水平排列C</td>
+                                    </tr>
+                                    <tr>
+                                        <th class="text-nowrap"><code>.container</code> 最大宽度</th>
+                                        <td>None (自动)</td>
+                                        <td>750px</td>
+                                        <td>970px</td>
+                                        <td>1170px</td>
+                                    </tr>
+                                    <tr>
+                                        <th class="text-nowrap">类前缀</th>
+                                        <td><code>.col-xs-</code>
+                                        </td>
+                                        <td><code>.col-sm-</code>
+                                        </td>
+                                        <td><code>.col-md-</code>
+                                        </td>
+                                        <td><code>.col-lg-</code>
+                                        </td>
+                                    </tr>
+                                    <tr>
+                                        <th class="text-nowrap">列(column)数</th>
+                                        <td colspan="4">12</td>
+                                    </tr>
+                                    <tr>
+                                        <th class="text-nowrap">最大列(column)宽</th>
+                                        <td class="text-muted">自动</td>
+                                        <td>~62px</td>
+                                        <td>~81px</td>
+                                        <td>~97px</td>
+                                    </tr>
+                                    <tr>
+                                        <th class="text-nowrap">槽(gutter)宽</th>
+                                        <td colspan="4">30px (每列左右均有 15px)</td>
+                                    </tr>
+                                    <tr>
+                                        <th class="text-nowrap">可嵌套</th>
+                                        <td colspan="4">是</td>
+                                    </tr>
+                                    <tr>
+                                        <th class="text-nowrap">偏移(Offsets)</th>
+                                        <td colspan="4">是</td>
+                                    </tr>
+                                    <tr>
+                                        <th class="text-nowrap">列排序</th>
+                                        <td colspan="4">是</td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                        </div>
+
+
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>从堆叠到水平排列</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+
+                        <p>使用单一的一组 <code>.col-md-*</code> 栅格类,就可以创建一个基本的栅格系统,在手机和平板设备上一开始是堆叠在一起的(超小屏幕到小屏幕这一范围),在桌面(中等)屏幕设备上变为水平排列。所有“列(column)必须放在 ” <code>.row</code> 内。</p>
+                        <div class="row show-grid">
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                            <div class="col-md-1">.col-md-1</div>
+                        </div>
+                        <div class="row show-grid">
+                            <div class="col-md-8">.col-md-8</div>
+                            <div class="col-md-4">.col-md-4</div>
+                        </div>
+                        <div class="row show-grid">
+                            <div class="col-md-4">.col-md-4</div>
+                            <div class="col-md-4">.col-md-4</div>
+                            <div class="col-md-4">.col-md-4</div>
+                        </div>
+                        <div class="row show-grid">
+                            <div class="col-md-6">.col-md-6</div>
+                            <div class="col-md-6">.col-md-6</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>移动设备和桌面屏幕</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+
+                        <p>是否不希望在小屏幕设备上所有列都堆叠在一起?那就使用针对超小屏幕和中等屏幕设备所定义的类吧,即 <code>.col-xs-*</code> 和 <code>.col-md-*</code>。请看下面的实例,研究一下这些是如何工作的。</p>
+                        <div class="row show-grid">
+                            <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div>
+                            <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
+                        </div>
+                        <div class="row show-grid">
+                            <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
+                            <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
+                            <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
+                        </div>
+                        <div class="row show-grid">
+                            <div class="col-xs-6">.col-xs-6</div>
+                            <div class="col-xs-6">.col-xs-6</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>手机、平板、桌面</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+
+                        <p>在上面案例的基础上,通过使用针对平板设备的 <code>.col-sm-*</code> 类,我们来创建更加动态和强大的布局吧。</p>
+                        <div class="row show-grid">
+                            <div class="col-xs-12 col-sm-6 col-md-8">.col-xs-12 .col-sm-6 .col-md-8</div>
+                            <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div>
+                        </div>
+                        <div class="row show-grid">
+                            <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
+                            <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
+                            <!-- Optional: clear the XS cols if their content doesn't match in height -->
+                            <div class="clearfix visible-xs"></div>
+                            <div class="col-xs-6 col-sm-4">.col-xs-6 .col-sm-4</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>多余的列(column)将另起一行排列</h5>
+
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+                        <p>在等宽的4网格中,网格不等高会碰到问题,为了解决这个问题,可使用<code>.clearfix</code>。<a href="#responsive-utilities">响应实用工具类</a>
+                        </p>
+                        <div class="row show-grid">
+                            <div class="col-xs-6 col-sm-3">
+                                .col-xs-6 .col-sm-3
+                                <br>调整窗口大小或者在手机上查看本示例
+                            </div>
+                            <div class="col-xs-6 col-sm-3">.col-xs-6 .col-sm-3</div>
+
+                            <!-- Add the extra clearfix for only the required viewport -->
+                            <div class="clearfix visible-xs"></div>
+
+                            <div class="col-xs-6 col-sm-3">.col-xs-6 .col-sm-3</div>
+                            <div class="col-xs-6 col-sm-3">.col-xs-6 .col-sm-3</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>列偏移</h5>
+
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+
+                        <p>使用 <code>.col-md-offset-*</code> 类可以将列向右侧偏移。这些类实际是通过使用 <code>*</code> 选择器为当前元素增加了左侧的边距(margin)。例如,<code>.col-md-offset-4</code> 类将 <code>.col-md-4</code> 元素向右侧偏移了4个列(column)的宽度。</p>
+                        <div class="row show-grid">
+                            <div class="col-md-4">.col-md-4</div>
+                            <div class="col-md-4 col-md-offset-4">.col-md-4 .col-md-offset-4</div>
+                        </div>
+                        <div class="row show-grid">
+                            <div class="col-md-3 col-md-offset-3">.col-md-3 .col-md-offset-3</div>
+                            <div class="col-md-3 col-md-offset-3">.col-md-3 .col-md-offset-3</div>
+                        </div>
+                        <div class="row show-grid">
+                            <div class="col-md-6 col-md-offset-3">.col-md-6 .col-md-offset-3</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>嵌套列</h5>
+
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+                        <p>为了使用内置的栅格系统将内容再次嵌套,可以通过添加一个新的 <code>.row</code> 元素和一系列 <code>.col-sm-*</code> 元素到已经存在的 <code>.col-sm-*</code> 元素内。被嵌套的行(row)所包含的列(column)的个数不能超过12(其实,没有要求你必须占满12列)。</p>
+                        <div class="row show-grid">
+                            <div class="col-md-9">
+                                第一级: .col-md-9
+                                <div class="row show-grid">
+                                    <div class="col-md-6">
+                                        第二级: .col-md-6
+                                    </div>
+                                    <div class="col-md-6">
+                                        第二级: .col-md-6
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>列排序</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content">
+                        <p>通过使用 <code>.col-md-push-*</code> 和 <code>.col-md-pull-*</code> 类就可以很容易的改变列(column)的顺序。</p>
+                        <div class="row show-grid">
+                            <div class="col-md-9 col-md-push-3">.col-md-9 .col-md-push-3</div>
+                            <div class="col-md-3 col-md-pull-9">.col-md-3 .col-md-pull-9</div>
+                        </div>
+                    </div>
+                </div>
+
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+</body>
+</html>

+ 118 - 0
leiSP-admin/src/main/resources/templates/demo/form/jasny.html

@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('功能扩展')" />
+	<th:block th:include="include :: jasny-bootstrap-css" />
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>文件上传控件 <small>https://github.com/jasny/bootstrap</small></h5>
+                    </div>
+                    <div class="ibox-content">
+                    	<div class="form-group">
+                            <label class="font-noraml">输入组示例</label>
+                            
+	                        <div class="fileinput fileinput-new input-group" data-provides="fileinput">
+	                            <div class="form-control" data-trigger="fileinput"><i class="glyphicon glyphicon-file fileinput-exists"></i> <span class="fileinput-filename"></span></div>
+	                            <span class="input-group-addon btn btn-white btn-file"><span class="fileinput-new">选择文件</span><span class="fileinput-exists">更改</span><input type="file"></span>
+	                            <a href="#" class="input-group-addon btn btn-white fileinput-exists" data-dismiss="fileinput">清除</a>
+	                        </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">按钮示例</label>
+                            <br/>
+	                        <div class="fileinput fileinput-new" data-provides="fileinput">
+	                            <span class="btn btn-white btn-file"><span class="fileinput-new">选择文件</span><span class="fileinput-exists">更改</span><input type="file" name="..."></span>
+	                            <span class="fileinput-filename"></span>
+	                            <a href="#" class="close fileinput-exists" data-dismiss="fileinput" style="float: none">&times;</a>
+	                        </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">图片上传示例</label>
+                            <br/>
+	                        <div class="fileinput fileinput-new" data-provides="fileinput">
+					            <div class="fileinput-preview thumbnail" data-trigger="fileinput" style="width: 200px; height: 150px;"></div>
+					            <div>
+					                <span class="btn btn-white btn-file"><span class="fileinput-new">选择图片</span><span class="fileinput-exists">更改</span><input type="file"></span>
+					                <a href="#" class="btn btn-white fileinput-exists" data-dismiss="fileinput">清除</a>
+					            </div>
+					        </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">图片预览示例</label>
+                            <br/>
+	                        <div class="fileinput fileinput-new" data-provides="fileinput">
+						        <div class="fileinput-new thumbnail" style="width: 140px; height: 140px;">
+						          <img th:src="@{/img/profile.jpg}">
+						        </div>
+						        <div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px;"></div>
+						        <div>
+						          <span class="btn btn-white btn-file"><span class="fileinput-new">选择图片</span><span class="fileinput-exists">更改</span><input type="file"></span>
+						          <a href="#" class="btn btn-white fileinput-exists" data-dismiss="fileinput">清除</a>
+						        </div>
+						      </div>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="http://www.sooka.com/document/zjwd.html#jasny-bootstrap" target="_blank">http://www.sooka.com/document/zjwd.html#jasny-bootstrap</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>固定格式文本 <small>https://github.com/jasny/bootstrap</small></h5>
+                    </div>
+                    <div class="ibox-content">
+                        <div class="form-group">
+                            <label class="font-noraml">手机号码格式</label>
+                             <input type="text" class="form-control" data-mask="999-9999-9999" placeholder="请输入手机号码">
+                             <span class="help-block">158-8888-88888</span>
+                       	 </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">电话号码格式</label>
+                            <input type="text" class="form-control" data-mask="9999-9999999" placeholder="请输入电话号码">
+                            <span class="help-block">0730-8888888</span>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">日期格式</label>
+                            <input type="text" class="form-control" data-mask="9999-99-99" placeholder="请输入日期格式">
+                            <span class="help-block">yyyy-mm-dd</span>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">IPV4格式</label>
+                            <input type="text" class="form-control" data-mask="999.999.999.999" placeholder="请输入IP地址">
+                            <span class="help-block">192.168.100.200</span>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">税务代码格式</label>
+                            <input type="text" class="form-control" data-mask="99-9999999" placeholder="请输入税务代码">
+                            <span class="help-block">99-9999999</span>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="http://www.sooka.com/document/zjwd.html#jasny-bootstrap" target="_blank">http://www.sooka.com/document/zjwd.html#jasny-bootstrap</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: jasny-bootstrap-js" />
+</body>
+</html>

+ 148 - 0
leiSP-admin/src/main/resources/templates/demo/form/select.html

@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('下拉框')" />
+	<th:block th:include="include :: select2-css" />
+	<th:block th:include="include :: bootstrap-select-css" />
+</head>
+<body class="gray-bg">
+     <form>
+      <div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>下拉框 <small>https://github.com/select2/select2</small></h5>
+                    </div>  
+                    <div class="ibox-content">
+                        <div class="form-group">
+                            <label class="font-noraml">单选</label>
+                            <select class="form-control">
+                            	<option value="">--请选择开发语言--</option>
+                            	<option value="Java">Java</option>
+                            	<option value="PHP">PHP</option>
+                            	<option value=".NET">.NET</option>
+                            </select>
+                        </div>
+                        
+                        <div class="form-group">
+                             <label class="font-noraml">分组单选</label>
+                             <select class="form-control">
+                               <optgroup label="--请选择开发语言--">
+								 <option value="Java">Java</option>
+                                 <option value="PHP">PHP</option>
+                                 <option value=".NET">.NET</option>
+							   </optgroup>
+							   <optgroup label="--请选择数据库--">
+							     <option value="Oracle">Oracle</option>
+                                 <option value="Mysql">Mysql</option>
+                                 <option value="Sysbase">Sysbase</option>
+						       </optgroup>
+                             </select>
+                        </div>
+						  
+                        <div class="form-group">
+                            <label class="font-noraml">多选</label>
+                            <select class="form-control select2-multiple" multiple>
+                            	<option value="">请选择开发语言</option>
+                            	<option value="Java">Java</option>
+                            	<option value="PHP">PHP</option>
+                            	<option value=".NET">.NET</option>
+                            </select>
+                        </div>
+                        
+                        <div class="form-group">
+                             <label class="font-noraml">分组多选</label>
+                             <select class="form-control select2-multiple" multiple>
+                               <optgroup label="--请选择开发语言--">
+								 <option value="Java">Java</option>
+                                 <option value="PHP">PHP</option>
+                                 <option value=".NET">.NET</option>
+							   </optgroup>
+							   <optgroup label="--请选择数据库--">
+							     <option value="Oracle">Oracle</option>
+                                 <option value="Mysql">Mysql</option>
+                                 <option value="Sysbase">Sysbase</option>
+						       </optgroup>
+                             </select>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="#" target="_blank">http://www.sooka.com</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>下拉框 <small>https://github.com/snapappointments/bootstrap-select</small></h5>
+                    </div>
+                     <div class="ibox-content">
+                        <div class="form-group">
+                            <label class="font-noraml">单选</label>
+                            <select class="form-control noselect2 selectpicker">
+                            	<option value="">--请选择开发语言--</option>
+                            	<option value="Java">Java</option>
+                            	<option value="PHP">PHP</option>
+                            	<option value=".NET">.NET</option>
+                            </select>
+                        </div>
+                        
+                        <div class="form-group">
+                             <label class="font-noraml">分组多选</label>
+                             <select class="form-control noselect2 selectpicker">
+                               <optgroup label="--请选择开发语言--">
+								 <option value="Java">Java</option>
+                                 <option value="PHP">PHP</option>
+                                 <option value=".NET">.NET</option>
+							   </optgroup>
+							   <optgroup label="--请选择数据库--">
+							     <option value="Oracle">Oracle</option>
+                                 <option value="Mysql">Mysql</option>
+                                 <option value="Sysbase">Sysbase</option>
+						       </optgroup>
+                             </select>
+                        </div>
+						  
+                        <div class="form-group">
+                            <label class="font-noraml">多选</label>
+                            <select class="form-control noselect2 selectpicker" data-none-selected-text="请选择开发语言" multiple>
+                            	<option value="Java">Java</option>
+                            	<option value="PHP">PHP</option>
+                            	<option value=".NET">.NET</option>
+                            </select>
+                        </div>
+                        
+                        <div class="form-group">
+                             <label class="font-noraml">分组多选</label>
+                             <select class="form-control noselect2 selectpicker" data-none-selected-text="请选择" multiple>
+                               <optgroup label="--请选择开发语言--">
+								 <option value="Java">Java</option>
+                                 <option value="PHP">PHP</option>
+                                 <option value=".NET">.NET</option>
+							   </optgroup>
+							   <optgroup label="--请选择数据库--">
+							     <option value="Oracle">Oracle</option>
+                                 <option value="Mysql">Mysql</option>
+                                 <option value="Sysbase">Sysbase</option>
+						       </optgroup>
+                             </select>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="#" target="_blank">http://www.sooka.com</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+   </form>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: select2-js" />
+    <th:block th:include="include :: bootstrap-select-js" />
+</body>
+</html>

+ 198 - 0
leiSP-admin/src/main/resources/templates/demo/form/sortable.html

@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('拖动排序')" />
+</head>
+<body class="gray-bg">
+    <div class="wrapper wrapper-content  animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-4">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h3>任务列表</h3>
+                        <p class="small"><i class="fa fa-hand-o-up"></i> 在列表之间拖动任务面板</p>
+
+                        <div class="input-group">
+                            <input type="text" placeholder="添加新任务" class="input input-sm form-control">
+                            <span class="input-group-btn">
+                                        <button type="button" class="btn btn-sm btn-white"> <i class="fa fa-plus"></i> 添加</button>
+                                </span>
+                        </div>
+
+                        <ul class="sortable-list connectList agile-list">
+                            <li class="warning-element">
+                                加强过程管理,及时统计教育经费使用情况,做到底码清楚,
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标签</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.01
+                                </div>
+                            </li>
+                            <li class="success-element">
+                                支持财会人员的继续培训工作。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.05.12
+                                </div>
+                            </li>
+                            <li class="info-element">
+                                协同教导处搞好助学金、减免教科书费的工作。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.10
+                                </div>
+                            </li>
+                            <li class="danger-element">
+                                要求会计、出纳人员严格执行财务制度,遵守岗位职责,按时上报各种资料。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-primary">确定</a>
+                                    <i class="fa fa-clock-o"></i> 2018.06.10
+                                </div>
+                            </li>
+                            <li class="warning-element">
+                                做好职工公费医疗工作,按时发放门诊费。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标签</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.09
+                                </div>
+                            </li>
+                            <li class="warning-element">
+                                有计划地把课本复习三至五遍。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-primary">确定</a>
+                                    <i class="fa fa-clock-o"></i> 2018.08.04
+                                </div>
+                            </li>
+                            <li class="success-element">
+                                看一本高质量的高中语法书
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.05.12
+                                </div>
+                            </li>
+                            <li class="info-element">
+                                选择一份较好的英语报纸,通过阅读提高英语学习效果。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.10
+                                </div>
+                            </li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-4">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h3>进行中</h3>
+                        <p class="small"><i class="fa fa-hand-o-up"></i> 在列表之间拖动任务面板</p>
+                        <ul class="sortable-list connectList agile-list">
+                            <li class="success-element">
+                                全面、较深入地掌握我们“产品”的功能、特色和优势并做到应用自如。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标签</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.01
+                                </div>
+                            </li>
+                            <li class="success-element">
+                                根据自己以前所了解的和从其他途径搜索到的信息,录入客户资料150家。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.05.12
+                                </div>
+                            </li>
+                            <li class="warning-element">
+                                锁定有意向客户20家。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.10
+                                </div>
+                            </li>
+                            <li class="warning-element">
+                                力争完成销售指标。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标签</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.09
+                                </div>
+                            </li>
+                            <li class="info-element">
+                                在总结和摸索中前进。
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-primary">确定</a>
+                                    <i class="fa fa-clock-o"></i> 2018.08.04
+                                </div>
+                            </li>
+                            <li class="success-element">
+                                不断学习行业知识、产品知识,为客户带来实用介绍内容
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.05.12
+                                </div>
+                            </li>
+                            <li class="danger-element">
+                                先友后单:与客户发展良好友谊,转换销售员角色,处处为客户着想
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.11.04
+                                </div>
+                            </li>
+                        </ul>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-4">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h3>已完成</h3>
+                        <p class="small"><i class="fa fa-hand-o-up"></i> 在列表之间拖动任务面板</p>
+                        <ul class="sortable-list connectList agile-list">
+                            <li class="info-element">
+                                制定工作日程表
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.10
+                                </div>
+                            </li>
+                            <li class="warning-element">
+                                每天坚持打40个有效电话,挖掘潜在客户
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标签</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.09
+                                </div>
+                            </li>
+                            <li class="warning-element">
+                                拜访客户之前要对该客户做全面的了解(客户的潜在需求、职位、权限以及个人性格和爱好)
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标签</a>
+                                    <i class="fa fa-clock-o"></i> 2018.09.09
+                                </div>
+                            </li>
+                            <li class="warning-element">
+                                提高自己电话营销技巧,灵活专业地与客户进行电话交流
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-primary">确定</a>
+                                    <i class="fa fa-clock-o"></i> 2018.08.04
+                                </div>
+                            </li>
+                            <li class="success-element">
+                                通过电话销售过程中了解各盛市的设备仪器使用、采购情况及相关重要追踪人
+                                <div class="agile-detail">
+                                    <a href="#" class="pull-right btn btn-xs btn-white">标记</a>
+                                    <i class="fa fa-clock-o"></i> 2018.05.12
+                                </div>
+                            </li>
+
+                        </ul>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:src="@{/js/jquery-ui-1.10.4.min.js}"></script>
+    <script>
+	    $(document).ready(function () {
+	        $(".sortable-list").sortable({connectWith: ".connectList"}).disableSelection()
+	    });
+    </script>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 93 - 0
leiSP-admin/src/main/resources/templates/demo/form/summernote.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 353 - 0
leiSP-admin/src/main/resources/templates/demo/form/tabs_panels.html


+ 113 - 0
leiSP-admin/src/main/resources/templates/demo/form/timeline.html

@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>时间轴</title>
+	<link href="../static/css/bootstrap.min.css" th:href="@{/css/bootstrap.min.css}" rel="stylesheet"/>
+    <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
+    <link href="../static/css/main/animate.min.css" th:href="@{/css/main/animate.min.css}" rel="stylesheet"/>
+    <link th:href="@{/css/style.css}" rel="stylesheet"/>
+</head>
+<body class="gray-bg">
+    <div class="row animated fadeInRight">
+        <div class="ibox float-e-margins">
+            <div class="text-center float-e-margins p-md">
+                <span>打开/关闭颜色/背景或方向版本: </span>
+                <a href="#" class="btn btn-xs btn-primary" id="lightVersion">轻型版本 </a>
+                <a href="#" class="btn btn-xs btn-primary" id="darkVersion">黑色版本 </a>
+            </div>
+            <div id="ibox-content">
+                 <div id="vertical-timeline" class="vertical-container light-timeline">
+                     <div class="vertical-timeline-block">
+                         <div class="vertical-timeline-icon navy-bg">
+                             <i class="fa fa-briefcase"></i>
+                         </div>
+
+                         <div class="vertical-timeline-content">
+                             <h2>会议</h2>
+                             <p>上一年的销售业绩发布会。总结产品营销和销售趋势及销售的现状。
+                             </p>
+                             <a href="#" class="btn btn-sm btn-primary"> 更多信息</a>
+                             <span class="vertical-date">
+                         	今天 <br>
+                         <small>2月3日</small>
+                     </span>
+                         </div>
+                     </div>
+
+                     <div class="vertical-timeline-block">
+                         <div class="vertical-timeline-icon blue-bg">
+                             <i class="fa fa-file-text"></i>
+                         </div>
+
+                         <div class="vertical-timeline-content">
+                             <h2>给张三发送文档</h2>
+                             <p>发送上年度《销售业绩报告》</p>
+                             <a href="#" class="btn btn-sm btn-success"> 下载文档 </a>
+                             <span class="vertical-date">
+                         	今天 <br>
+                         <small>2月3日</small>
+                     </span>
+                         </div>
+                     </div>
+
+                     <div class="vertical-timeline-block">
+                         <div class="vertical-timeline-icon lazur-bg">
+                             <i class="fa fa-coffee"></i>
+                         </div>
+
+                         <div class="vertical-timeline-content">
+                             <h2>喝咖啡休息</h2>
+                             <p>喝咖啡啦,啦啦啦~~</p>
+                             <a href="#" class="btn btn-sm btn-info">更多</a>
+                             <span class="vertical-date"> 昨天 <br><small>2月2日</small></span>
+                         </div>
+                     </div>
+
+                     <div class="vertical-timeline-block">
+                         <div class="vertical-timeline-icon yellow-bg">
+                             <i class="fa fa-phone"></i>
+                         </div>
+
+                         <div class="vertical-timeline-content">
+                             <h2>给李四打电话</h2>
+                             <p>给李四打电话分配本月工作任务</p>
+                             <span class="vertical-date">昨天 <br><small>2月2日</small></span>
+                         </div>
+                     </div>
+
+                     <div class="vertical-timeline-block">
+                         <div class="vertical-timeline-icon lazur-bg">
+                             <i class="fa fa-user-md"></i>
+                         </div>
+
+                         <div class="vertical-timeline-content">
+                             <h2>公司年会</h2>
+                             <p>发年终奖啦,啦啦啦~~</p>
+                             <span class="vertical-date">前天 <br><small>2月1日</small></span>
+                         </div>
+                     </div>
+                 </div>
+             </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script>
+        $(document).ready(function(){
+            $('#lightVersion').click(function(event) {
+                event.preventDefault()
+                $('#ibox-content').removeClass('ibox-content');
+                $('#vertical-timeline').removeClass('dark-timeline');
+                $('#vertical-timeline').addClass('light-timeline');
+            });
+            $('#darkVersion').click(function(event) {
+                event.preventDefault()
+                $('#ibox-content').addClass('ibox-content');
+                $('#vertical-timeline').removeClass('light-timeline');
+                $('#vertical-timeline').addClass('dark-timeline');
+            });
+        });
+    </script>
+</body>
+</html>

+ 55 - 0
leiSP-admin/src/main/resources/templates/demo/form/upload.html

@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('文件上传')" />
+	<th:block th:include="include :: bootstrap-fileinput-css" />
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>文件上传控件 <small>https://github.com/kartik-v/bootstrap-fileinput</small></h5>
+                    </div>
+                    <div class="ibox-content">
+                    	<div class="form-group">
+                            <label class="font-noraml">简单示例</label>
+	                        <div class="file-loading">
+					            <input class="file" type="file" multiple data-min-file-count="1" data-theme="fas">
+					        </div>
+                        </div>
+                        
+                        <div class="form-group">
+                            <label class="font-noraml">多文件上传</label>
+	                        <div class="file-loading">
+					            <input id="fileinput-demo-1" type="file" multiple>
+					        </div>
+                        </div>
+                        <hr>
+                        <div class="form-group">
+                            <label class="font-noraml">相关参数详细信息</label>
+                            <div><a href="http://www.sooka.com/document/zjwd.html#bootstrap-fileinput" target="_blank">http://www.sooka.com/document/zjwd.html#bootstrap-fileinput</a></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: bootstrap-fileinput-js" />
+    <script type="text/javascript">
+    $(document).ready(function () {
+        $("#fileinput-demo-1").fileinput({
+            'theme': 'explorer-fas',
+            'uploadUrl': '#',
+            overwriteInitial: false,
+            initialPreviewAsData: true,
+            initialPreview: [
+                "/img/profile.jpg"
+            ]
+        });
+    });
+    </script>
+</body>
+</html>

+ 193 - 0
leiSP-admin/src/main/resources/templates/demo/form/validate.html

@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('表单校验')" />
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>jQuery Validate 简介</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <p>jquery.validate.js 是一款优秀的jQuery表单验证插件。它具有如下特点:</p>
+                        <ul>
+                            <li>安装简单</li>
+                            <li>内置超过20种数据验证方法</li>
+                            <li>直列错误提示信息</li>
+                            <li>可扩展的数据验证方法</li>
+                            <li>使用内置的元数据或插件选项来指定您的验证规则</li>
+                            <li>优雅的交互设计</li>
+                        </ul>
+                        <p>官网:<a href="http://jqueryvalidation.org/" target="_blank">http://jqueryvalidation.org/</a>
+                        </p>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>简单示例</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <form class="form-horizontal m-t" id="commentForm">
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">姓名:</label>
+                                <div class="col-sm-8">
+                                    <input id="cname" name="name" minlength="2" type="text" class="form-control" required>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">E-mail:</label>
+                                <div class="col-sm-8">
+                                    <input id="cemail" type="email" class="form-control" name="email" required>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">网站:</label>
+                                <div class="col-sm-8">
+                                    <input id="curl" type="url" class="form-control" name="url">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">说明:</label>
+                                <div class="col-sm-8">
+                                    <textarea id="ccomment" name="comment" class="form-control" required></textarea>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="col-sm-4 col-sm-offset-3">
+                                    <button class="btn btn-primary" type="submit">提交</button>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+                <div class="ibox float-e-margins">
+                    <div class="ibox-content">
+                        <p class="m-t">更多示例请访问官方示例页面:<a href="http://jqueryvalidation.org/files/demo/" target="_blank">查看</a>
+                        </p>
+                        <p>中文API可参考:<a href="http://www.sooka.com" target="_blank">http://www.sooka.com</a>
+                        </p>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-6">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>完整验证表单</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <form class="form-horizontal m-t" id="signupForm">
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">姓氏:</label>
+                                <div class="col-sm-8">
+                                    <input id="firstname" name="firstname" class="form-control" type="text">
+                                    <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 这里写点提示的内容</span>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">名字:</label>
+                                <div class="col-sm-8">
+                                    <input id="lastname" name="lastname" class="form-control" type="text" required>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">用户名:</label>
+                                <div class="col-sm-8">
+                                    <input id="username" name="username" class="form-control" type="text" required>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">密码:</label>
+                                <div class="col-sm-8">
+                                    <input id="password" name="password" class="form-control" type="password">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">确认密码:</label>
+                                <div class="col-sm-8">
+                                    <input id="confirm_password" name="confirm_password" class="form-control" type="password">
+                                    <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 请再次输入您的密码</span>
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <label class="col-sm-3 control-label">E-mail:</label>
+                                <div class="col-sm-8">
+                                    <input id="email" name="email" class="form-control" type="email">
+                                </div>
+                            </div>
+                            <div class="form-group">
+                                <div class="col-sm-8 col-sm-offset-3">
+                                    <button class="btn btn-primary" type="submit">提交</button>
+                                </div>
+                            </div>
+                        </form>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+    $(function(){
+        $("#commentForm").validate();
+
+        var icon = "<i class='fa fa-times-circle'></i> ";
+        $("#signupForm").validate({
+            rules: {
+                firstname: "required",
+                lastname: "required",
+                username: {
+                    required: true,
+                    minlength: 2
+                },
+                password: {
+                    required: true,
+                    minlength: 5
+                },
+                confirm_password: {
+                    required: true,
+                    minlength: 5,
+                    equalTo: "#password"
+                },
+                email: {
+                    required: true,
+                    email: true
+                }
+            },
+            messages: {
+                firstname: icon + "请输入你的姓",
+                lastname: icon + "请输入您的名字",
+                username: {
+                    required: icon + "请输入您的用户名",
+                    minlength: icon + "用户名必须两个字符以上"
+                },
+                password: {
+                    required: icon + "请输入您的密码",
+                    minlength: icon + "密码必须5个字符以上"
+                },
+                confirm_password: {
+                    required: icon + "请再次输入密码",
+                    minlength: icon + "密码必须5个字符以上",
+                    equalTo: icon + "两次输入的密码不一致"
+                },
+                email: icon + "请输入您的E-mail"
+            }
+        });
+
+        $("#username").focus(function () {
+            var firstname = $("#firstname").val();
+            var lastname = $("#lastname").val();
+            if (firstname && lastname && !this.value) {
+                this.value = firstname + "." + lastname;
+            }
+        });
+    });
+    </script>
+</body>
+</html>

+ 192 - 0
leiSP-admin/src/main/resources/templates/demo/form/wizard.html

@@ -0,0 +1,192 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('基本表单')" />
+	<th:block th:include="include :: jquery-steps-css" />
+</head>
+<body class="gray-bg">
+    <div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-5">
+                <div class="jumbotron">
+                    <h1>表单向导</h1>
+                    <p>Smart UI 部件允许您快速创建表单向导接口。</p>
+                    <p><a href="https://github.com/rstaib/jquery-steps" target="_blank" class="btn btn-primary btn-lg" role="button">了解 jQuery Steps</a>
+                    </p>
+                </div>
+            </div>
+            <div class="col-sm-7">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>基础表单向导</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <p>
+                                                                      这是一个简单的表单向导示例
+                        </p>
+                        <div id="wizard">
+                            <h1>第一步</h1>
+                            <div class="step-content">
+                                <div class="text-center m-t-md">
+                                    <h2>第一步</h2>
+                                    <p>
+                                                                                                       这是第一步的内容
+                                    </p>
+                                </div>
+                            </div>
+
+                            <h1>第二步</h1>
+                            <div class="step-content">
+                                <div class="text-center m-t-md">
+                                    <h2>第二步</h2>
+                                    <p>
+                                                                                                       这是第二步的内容
+                                    </p>
+                                </div>
+                            </div>
+
+                            <h1>第三步</h1>
+                            <div class="step-content">
+                                <div class="text-center m-t-md">
+                                    <h2>第三步</h2>
+                                    <p>
+                                                                                                      这是第三步的内容
+                                    </p>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox">
+                    <div class="ibox-title">
+                        <h5>带验证的表单向导</h5>
+                    </div>
+                    <div class="ibox-content">
+                        <h2>
+                                                                               带验证的表单向导
+                            </h2>
+                        <p>
+                                                                              下面这个示例展示了如何在表单向导中使用 jQuery Validation 插件
+                        </p>
+
+                        <form id="form" action="" class="wizard-big">
+                            <h1>账户</h1>
+                            <fieldset>
+                                <h2>账户信息</h2>
+                                <div class="row">
+                                    <div class="col-sm-8">
+                                        <div class="form-group">
+                                            <label>用户名 *</label>
+                                            <input id="userName" name="userName" type="text" class="form-control required">
+                                        </div>
+                                        <div class="form-group">
+                                            <label>密码 *</label>
+                                            <input id="password" name="password" type="text" class="form-control required">
+                                        </div>
+                                        <div class="form-group">
+                                            <label>确认密码 *</label>
+                                            <input id="confirm" name="confirm" type="text" class="form-control required">
+                                        </div>
+                                    </div>
+                                    <div class="col-sm-4">
+                                        <div class="text-center">
+                                            <div style="margin-top: 20px">
+                                                <i class="fa fa-sign-in" style="font-size: 180px;color: #e5e5e5 "></i>
+                                            </div>
+                                        </div>
+                                    </div>
+                                </div>
+
+                            </fieldset>
+                            <h1>个人资料</h1>
+                            <fieldset>
+                                <h2>个人资料信息</h2>
+                                <div class="row">
+                                    <div class="col-sm-6">
+                                        <div class="form-group">
+                                            <label>姓名 *</label>
+                                            <input id="name" name="name" type="text" class="form-control required">
+                                        </div>
+                                    </div>
+                                    <div class="col-sm-6">
+                                        <div class="form-group">
+                                            <label>Email *</label>
+                                            <input id="email" name="email" type="text" class="form-control required email">
+                                        </div>
+                                        <div class="form-group">
+                                            <label>地址 *</label>
+                                            <input id="address" name="address" type="text" class="form-control">
+                                        </div>
+                                    </div>
+                                </div>
+                            </fieldset>
+
+                            <h1>警告</h1>
+                            <fieldset>
+                                <div class="text-center" style="margin-top: 120px">
+                                    <h2>你是火星人 :-)</h2>
+                                </div>
+                            </fieldset>
+
+                            <h1>完成</h1>
+                            <fieldset>
+                                <h2>条款</h2>
+                                <input id="acceptTerms" name="acceptTerms" type="checkbox" class="required">
+                                <label for="acceptTerms">我同意注册条款</label>
+                            </fieldset>
+                        </form>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: jquery-steps-js" />
+    <script>
+	    $(document).ready(function () {
+	        $("#wizard").steps();
+	        $("#form").steps({
+	            bodyTag: "fieldset", onStepChanging: function (event, currentIndex, newIndex) {
+	                if (currentIndex > newIndex) {
+	                    return true
+	                }
+	                if (newIndex === 3 && Number($("#age").val()) < 18) {
+	                    return false
+	                }
+	                var form = $(this);
+	                if (currentIndex < newIndex) {
+	                    $(".body:eq(" + newIndex + ") label.error", form).remove();
+	                    $(".body:eq(" + newIndex + ") .error", form).removeClass("error")
+	                }
+	                form.validate().settings.ignore = ":disabled,:hidden";
+	                return form.valid()
+	            }, onStepChanged: function (event, currentIndex, priorIndex) {
+	                if (currentIndex === 2 && Number($("#age").val()) >= 18) {
+	                    $(this).steps("next")
+	                }
+	                if (currentIndex === 2 && priorIndex === 3) {
+	                    $(this).steps("previous")
+	                }
+	            }, onFinishing: function (event, currentIndex) {
+	                var form = $(this);
+	                form.validate().settings.ignore = ":disabled";
+	                return form.valid()
+	            }, onFinished: function (event, currentIndex) {
+	                var form = $(this);
+	                form.submit()
+	            }
+	        }).validate({
+	            errorPlacement: function (error, element) {
+	                element.before(error)
+	            }, rules: {confirm: {equalTo: "#password"}}
+	        })
+	    });
+	</script>
+</body>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 1944 - 0
leiSP-admin/src/main/resources/templates/demo/icon/fontawesome.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 1364 - 0
leiSP-admin/src/main/resources/templates/demo/icon/glyphicons.html


Diferenças do arquivo suprimidas por serem muito extensas
+ 215 - 0
leiSP-admin/src/main/resources/templates/demo/modal/dialog.html


+ 95 - 0
leiSP-admin/src/main/resources/templates/demo/modal/form.html

@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+	<th:block th:include="include :: header('新增用户')" />
+</head>
+<body>
+    <div class="main-content">
+        <form id="form-user-add" class="form-horizontal">
+            <div class="row">
+            	<div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">用户名称:</label>
+                        <div class="col-sm-8">
+                            <input name="userName" placeholder="请输入用户名称" class="form-control" type="text">
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">归属部门:</label>
+                        <div class="col-sm-8">
+                            <div class="input-group">
+                            	<input name="deptName" type="text" placeholder="请选择归属部门" class="form-control">
+                                <span class="input-group-addon"><i class="fa fa-search"></i></span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">手机号码:</label>
+                        <div class="col-sm-8">
+                            <input name="phonenumber" placeholder="请输入手机号码" class="form-control" type="text">
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">邮箱:</label>
+                        <div class="col-sm-8">
+                            <input name="email" class="form-control" type="text" placeholder="请输入邮箱">
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">登录账号:</label>
+                        <div class="col-sm-8">
+                            <input name="loginName" placeholder="请输入登录账号" class="form-control" type="text">
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">登录密码:</label>
+                        <div class="col-sm-8">
+                            <input name="password" placeholder="请输入登录密码" class="form-control" type="password">
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">用户性别:</label>
+                        <div class="col-sm-8">
+                            <div class="input-group" style="width: 100%">
+                                <select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}">
+				                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+				                </select>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label">用户状态:</label>
+                        <div class="col-sm-8">
+                            <label class="toggle-switch switch-solid">
+	                            <input type="checkbox" id="status" checked>
+	                            <span></span>
+	                        </label>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+	<th:block th:include="include :: footer" />
+</body>
+</html>

+ 256 - 0
leiSP-admin/src/main/resources/templates/demo/modal/layer.html

@@ -0,0 +1,256 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('弹层组件')" />
+</head>
+<body class="gray-bg">
+	<div class="wrapper wrapper-content fadeInRight">
+	    <div class="row">
+	        <div class="col-sm-6">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>信息框</h5>
+	                </div>
+	                <div class="ibox-content" id="test">
+	                    <p>通过调用<code>$.modal.alert()</code>实现。 </p>
+	                    <button type="button" class="btn btn-primary" onclick="$.modal.alert('Hi,你好!')">普通</button>
+	                    <button type="button" class="btn btn-success" onclick="$.modal.alertSuccess('Hi,你好!')">成功</button>
+	                    <button type="button" class="btn btn-warning" onclick="$.modal.alertWarning('Hi,你好!')">警告</button>
+	                    <button type="button" class="btn btn-danger" onclick="$.modal.alertError('Hi,你好!')">失败</button>
+	                </div>
+	            </div>
+	        </div>
+	        
+	        <div class="col-sm-6">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>提示框</h5>
+	                </div>
+	                <div class="ibox-content">
+	                    <p>通过调用<code>$.modal.msg()</code>实现。 </p>
+	                    <button type="button" class="btn btn-primary" onclick="$.modal.msg('Hi,你好!')">普通</button>
+	                    <button type="button" class="btn btn-success" onclick="$.modal.msgSuccess('Hi,你好!')">成功</button>
+	                    <button type="button" class="btn btn-warning" onclick="$.modal.msgWarning('Hi,你好!')">警告</button>
+	                    <button type="button" class="btn btn-danger" onclick="$.modal.msgError('Hi,你好!')">失败</button>
+	                </div>
+	            </div>
+	        </div>
+	    </div>
+	
+	    <div class="row">
+	        <div class="col-sm-6">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>询问框</h5>
+	                </div>
+	                <div class="ibox-content">
+	                    <p>通过调用<code>$.modal.confirm()</code>实现。 </p>
+	                    <button type="button" class="btn btn-primary" id="button-confirm">询问按钮</button>
+	                </div>
+	            </div>
+	        </div>
+	        
+	        <div class="col-sm-6">
+	            <div class="ibox ">
+	                <div class="ibox-title">
+	                <h5>消息提示并刷新父窗体</h5>
+	                </div>
+	                <div class="ibox-content">
+	                    <p>通过调用<code>$.modal.msgReload()</code>实现。 </p>
+	                    <button type="button" class="btn btn-primary" id="button-msgReload">提示刷新按钮</button>
+	                </div>
+	            </div>
+	        </div>
+	        
+	        <div class="col-sm-6">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>普通弹出层</h5>
+	                </div>
+	                <div class="ibox-content">
+	                    <p>通过调用<code>$.modal.open()</code>实现。 </p>
+	                    <button type="button" class="btn btn-primary" id="button-open-1">默认</button>
+	                    <button type="button" class="btn btn-success" id="button-open-2">设置宽高</button>
+	                    <button type="button" class="btn btn-warning" id="button-open-3">回调函数</button>
+	                    <button type="button" class="btn btn-danger" id="button-open-4">自定义选项</button>
+	                    <button type="button" class="btn btn-primary" id="button-open-5">全屏弹出</button>
+	                </div>
+	            </div>
+	        </div>
+	        
+	        <div class="col-sm-6">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>选卡页方式</h5>
+	                </div>
+	                <div class="ibox-content">
+	                    <p>通过调用<code>$.modal.openTab()</code>实现。 </p>
+	                    <button type="button" class="btn btn-primary" id="button-open-6">新窗口打开</button>
+	                    <button type="button" class="btn btn-warning" id="button-open-7">关闭当前</button>
+	                    <button type="button" class="btn btn-primary" id="button-open-14">选卡页同一页签打开</button>
+	                    <button type="button" class="btn btn-warning" id="button-open-15">关闭指定</button>
+	                </div>
+	            </div>
+	        </div>
+	        
+	        <div class="col-sm-6">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>其他内容</h5>
+	                </div>
+	                <div class="ibox-content">
+	                    <p>通过调用<code>layer</code>实现。 </p>
+	                    <button type="button" class="btn btn-primary" id="button-open-8">tab层</button>
+	                    <button type="button" class="btn btn-primary" id="button-open-9">prompt层</button>
+	                    <button type="button" class="btn btn-primary" id="button-open-10">捕获页</button>
+	                </div>
+	            </div>
+	        </div>
+	        
+	        <div class="col-sm-6">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>遮罩层</h5>
+	                </div>
+	                <div class="ibox-content">
+	                    <p>通过调用<code>blockUI</code>实现。 </p>
+	                    <button type="button" class="btn btn-primary" id="button-open-11">打开</button>
+	                    <button type="button" class="btn btn-warning" id="button-open-12">关闭</button>
+	                    <button type="button" class="btn btn-primary" id="button-open-13">layer遮罩</button>
+	                </div>
+	            </div>
+	        </div>
+	        
+	        <div class="col-sm-12">
+	            <div class="ibox">
+	                <div class="ibox-title">
+                        <label class="font-noraml">相关参数详细信息</label>
+                        <div><a href="#" target="_blank">http://www.sooka.com</a></div>
+	            </div>
+	        </div>
+	        
+	    </div>
+	</div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+        var prefix = ctx + "demo/modal";
+        
+	    $("#button-confirm").click(function(){
+	    	$.modal.confirm("确认要点击确定吗?", function() {
+	    		$.modal.alert("ok");
+	    	});
+	    })
+	    
+	    $("#button-msgReload").click(function(){
+	        $.modal.msgReload("保存成功,正在刷新数据请稍后……", modal_status.SUCCESS);
+	    })
+	    
+	    $("#button-open-1").click(function(){
+	    	$.modal.open('添加用户', prefix + "/form");
+	    })
+	    
+	    $("#button-open-2").click(function(){
+	    	$.modal.open('添加用户', prefix + "/form", '900', '320');
+	    })
+	    
+	    $("#button-open-3").click(function(){
+	    	$.modal.open('添加用户', prefix + "/form", '900', '320', callback);
+	    })
+	    
+	    $("#button-open-4").click(function(){
+	    	var btn = ['<i class="fa fa-check"></i> 点我回调', '<i class="fa fa-close"></i> 点我关闭'];
+			var options = {
+				title: '添加用户',
+				width: "900",
+				height: "320",
+				url: prefix + "/form",
+				btn: btn,
+				callBack: doSubmit
+			};
+			$.modal.openOptions(options);
+	    })
+	    
+	    function doSubmit(index, layero) {
+	    	alert("进入了自定义选项提交方法");
+	    }
+	    
+	    function callback(index, layero) {
+	    	alert("进入了回调函数提交方法");
+	    }
+	    
+	    $("#button-open-5").click(function(){
+	    	$.modal.openFull('添加用户', prefix + "/form");
+	    })
+	    
+	    $("#button-open-6").click(function(){
+	    	$.modal.openTab('添加用户', prefix + "/form");
+	    })
+	    
+	    $("#button-open-7").click(function(){
+	    	$.modal.closeTab();
+	    })
+	    
+	     $("#button-open-8").click(function(){
+	    	//tab层
+	    	 layer.tab({
+	    	     area: ['600px', '300px'],
+	    	     tab: [{
+	    	         title: 'TAB1',
+	    	         content: '内容1'
+	    	     },
+	    	     {
+	    	         title: 'TAB2',
+	    	         content: '内容2'
+	    	     },
+	    	     {
+	    	         title: 'TAB3',
+	    	         content: '内容3'
+	    	     }]
+	    	 });
+	    })
+	    
+	    $("#button-open-9").click(function(){
+	    	layer.prompt({title: '输入任何口令,并确认', formType: 1}, function(pass, index){
+	    	  layer.close(index);
+	    	  layer.prompt({title: '随便写点啥,并确认', formType: 2}, function(text, index){
+	    	    layer.close(index);
+	    	    layer.msg('演示完毕!您的口令:'+ pass +'<br>您最后写下了:'+text);
+	    	  });
+	    	});
+	    })
+	    
+	    $("#button-open-10").click(function(){
+	    	layer.open({
+    		  type: 1,
+    		  shade: false,
+    		  title: false, //不显示标题
+    		  content: $('#test'), //捕获的元素,注意:最好该指定的元素要存放在body最外层,否则可能被其它的相对元素所影响
+    		  cancel: function(){
+    		    layer.msg('捕获就是从页面已经存在的元素上,包裹layer的结构', {time: 5000, icon:6});
+    		  }
+    		});
+	    })
+	    
+	    $("#button-open-11").click(function(){
+	    	$.modal.loading("数据加载中");
+	    })
+	    
+	    $("#button-open-12").click(function(){
+	    	$.modal.closeLoading();
+	    })
+	    
+	    $("#button-open-13").click(function(){
+	    	layer.load(0, {shade: false}); // 0代表加载的风格,支持0-2
+	    })
+	    
+	    $("#button-open-14").click(function(){
+	    	$.modal.parentTab('添加用户', prefix + "/form");
+	    })
+	    
+	    $("#button-open-15").click(function(){
+	    	// 需要关闭窗口的url
+	    	$.modal.closeTab(prefix + "/form");
+	    })
+	</script>
+</body>
+</html>

+ 56 - 0
leiSP-admin/src/main/resources/templates/demo/modal/table.html

@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('弹层表格')" />
+</head>
+<body class="gray-bg">
+	<div class="wrapper wrapper-content fadeInRight">
+	    <div class="row">
+	        <div class="col-sm-12">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>弹层框</h5>
+	                </div>
+	                <div class="ibox-content" id="test">
+	                    <p>弹出复选框表格及单选框表格(点击提交后得到数据)。 </p>
+	                    <button type="button" class="btn btn-primary" onclick="selectCheckUser()">弹出表格(复选框)</button>
+	                    <button type="button" class="btn btn-success" onclick="selectRadioUser()">弹出表格(单选框)</button>
+	                </div>
+	            </div>
+	        </div>
+	        <div class="col-sm-12">
+	            <div class="ibox">
+	                <div class="ibox-title">
+	                <h5>弹层框</h5>
+	                </div>
+	                <div class="ibox-content" id="test">
+	                    <p>弹出复选框表格及单选框表格(点击提交后得到数据并回显到父窗体)。 </p>
+	                    <button type="button" class="btn btn-info" onclick="selectUsersToParent()">弹出表格(复选框)</button>
+	                    <p id="userids"> </p>
+	                </div>
+	            </div>
+	        </div>
+	    </div>
+	</div>
+    <th:block th:include="include :: footer" />
+    <script type="text/javascript">
+        var prefix = ctx + "demo/modal";
+        
+        function selectCheckUser(){
+        	$.modal.open("选择用户", prefix + "/check");
+        }
+        
+		function selectRadioUser(){
+			$.modal.open("选择用户", prefix + "/radio");
+        }
+		
+		function selectUsersToParent(){
+			$.modal.open("选择用户", prefix + "/parent");
+        }
+		
+		function selectUsers(){
+			alert(1);
+		}
+	</script>
+</body>
+</html>

+ 86 - 0
leiSP-admin/src/main/resources/templates/demo/modal/table/check.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('check表格页')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        /* 添加用户-选择用户-提交 */
+		function submitHandler() {
+			var rows = $.table.selectFirstColumns();
+			if (rows.length == 0) {
+       			$.modal.alertWarning("请至少选择一条记录");
+       			return;
+       		}
+			alert(rows.join());
+		}
+    </script>
+</body>
+</html>

+ 90 - 0
leiSP-admin/src/main/resources/templates/demo/modal/table/parent.html

@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('表格传值给父页面')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        /* 添加用户-选择用户-提交 */
+		function submitHandler(index, layero) {
+			var rows = $.table.selectFirstColumns();
+			if (rows.length == 0) {
+       			$.modal.alertWarning("请至少选择一条记录");
+       			return;
+       		}
+			$.modal.close();
+			// 父页面的方法
+			// parent.selectUsers();
+			// 父页面的变量
+			parent.$('#userids').html(rows.join());
+		}
+    </script>
+</body>
+</html>

+ 86 - 0
leiSP-admin/src/main/resources/templates/demo/modal/table/radio.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('radio表格页')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            radio: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        /* 添加用户-选择用户-提交 */
+		function submitHandler() {
+			var rows = $.table.selectFirstColumns();
+			if (rows.length == 0) {
+       			$.modal.alertWarning("请至少选择一条记录");
+       			return;
+       		}
+			alert(rows.join());
+		}
+    </script>
+</body>
+</html>

+ 78 - 0
leiSP-admin/src/main/resources/templates/demo/operate/add.html

@@ -0,0 +1,78 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+	<th:block th:include="include :: header('新增用户')" />
+</head>
+<body class="white-bg">
+	<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+		<form class="form-horizontal m" id="form-user-add">
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户编号:</label>
+				<div class="col-sm-8">
+					<input class="form-control" type="text" name="userCode" id="userCode" required>
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户姓名:</label>
+				<div class="col-sm-8">
+					<input class="form-control" type="text" name="userName" id="userName" required>
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户性别:</label>
+                <div class="col-sm-8">
+                    <div class="input-group" style="width: 100%">
+                        <select name="userSex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}">
+			                <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+			            </select>
+                    </div>
+                </div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户手机:</label>
+				<div class="col-sm-8">
+					<input class="form-control" type="text" name="userPhone" id="userPhone">
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户邮箱:</label>
+				<div class="col-sm-8">
+					<input class="form-control" type="text" name="userEmail" id="userEmail">
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户状态:</label>
+				<div class="col-sm-8">
+				    <div class="radio-box" th:each="dict : ${@dict.getType('sys_normal_disable')}">
+						<input type="radio" th:id="${dict.dictCode}" name="status" th:value="${dict.dictValue}" th:checked="${dict.default}">
+						<label th:for="${dict.dictCode}" th:text="${dict.dictLabel}"></label>
+					</div>
+				</div>
+			</div>
+		</form>
+	</div>
+	<th:block th:include="include :: footer" />
+	<script type="text/javascript">
+		var prefix = ctx + "demo/operate";
+		
+		$("#form-user-add").validate({
+			onkeyup: false,
+			rules:{
+				userPhone:{
+					isPhone:true
+				},
+				userEmail:{
+					email:true
+				},
+			},
+		    focusCleanup: true
+		});
+		
+		function submitHandler() {
+	        if ($.validate.form()) {
+	        	$.operate.save(prefix + "/add", $('#form-user-add').serialize());
+	        }
+	    }
+	</script>
+</body>
+</html>

+ 69 - 0
leiSP-admin/src/main/resources/templates/demo/operate/detail.html

@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+	<th:block th:include="include :: header('用户详细')" />
+</head>
+<body class="white-bg">
+	<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+		<form class="form-horizontal m" id="form-user-edit">
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户编号:</label>
+				<div class="form-control-static" th:text="${user.userCode}"></div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户姓名:</label>
+				<div class="col-sm-8">
+				    <div class="form-control-static" th:text="${user.userName}"></div>
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户性别:</label>
+                <div class="col-sm-8">
+                    <div class="form-control-static" th:text="${@dict.getLabel('sys_user_sex', user.status)}"></div>
+                </div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户手机:</label>
+				<div class="col-sm-8">
+				    <div class="form-control-static" th:text="${user.userPhone}"></div>
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户邮箱:</label>
+				<div class="col-sm-8">
+				    <div class="form-control-static" th:text="${user.userEmail}"></div>
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户状态:</label>
+				<div class="col-sm-8">
+				    <div class="form-control-static" th:text="${@dict.getLabel('sys_normal_disable', user.status)}"></div>
+				</div>
+			</div>
+		</form>
+	</div>
+	<th:block th:include="include :: footer" />
+	<script type="text/javascript">
+		var prefix = ctx + "demo/operate";
+		
+		$("#form-user-add").validate({
+			onkeyup: false,
+			rules:{
+				userPhone:{
+					isPhone:true
+				},
+				userEmail:{
+					email:true
+				},
+			},
+		    focusCleanup: true
+		});
+		
+		function submitHandler() {
+	        if ($.validate.form()) {
+	        	$.operate.save(prefix + "/edit", $('#form-user-edit').serialize());
+	        }
+	    }
+	</script>
+</body>
+</html>

+ 79 - 0
leiSP-admin/src/main/resources/templates/demo/operate/edit.html

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+	<th:block th:include="include :: header('修改用户')" />
+</head>
+<body class="white-bg">
+	<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+		<form class="form-horizontal m" id="form-user-edit" th:object="${user}">
+		    <input name="userId" type="hidden"  th:field="*{userId}" />
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户编号:</label>
+				<div class="col-sm-8">
+					<input class="form-control" type="text" name="userCode" id="userCode" th:field="*{userCode}" required>
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户姓名:</label>
+				<div class="col-sm-8">
+					<input class="form-control" type="text" name="userName" id="userName" th:field="*{userName}" required>
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户性别:</label>
+                <div class="col-sm-8">
+                    <div class="input-group" style="width: 100%">
+                        <select name="userSex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}">
+			                <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{userSex}"></option>
+			            </select>
+                    </div>
+                </div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户手机:</label>
+				<div class="col-sm-8">
+					<input class="form-control" type="text" name="userPhone" th:field="*{userPhone}" id="userPhone">
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户邮箱:</label>
+				<div class="col-sm-8">
+					<input class="form-control" type="text" name="userEmail" th:field="*{userEmail}" id="userEmail">
+				</div>
+			</div>
+			<div class="form-group">
+				<label class="col-sm-3 control-label">用户状态:</label>
+				<div class="col-sm-8">
+				    <div class="radio-box" th:each="dict : ${@dict.getType('sys_normal_disable')}">
+						<input type="radio" th:id="${dict.dictCode}" name="status" th:value="${dict.dictValue}" th:field="*{status}">
+						<label th:for="${dict.dictCode}" th:text="${dict.dictLabel}"></label>
+					</div>
+				</div>
+			</div>
+		</form>
+	</div>
+	<th:block th:include="include :: footer" />
+	<script type="text/javascript">
+		var prefix = ctx + "demo/operate";
+		
+		$("#form-user-add").validate({
+			onkeyup: false,
+			rules:{
+				userPhone:{
+					isPhone:true
+				},
+				userEmail:{
+					email:true
+				},
+			},
+		    focusCleanup: true
+		});
+		
+		function submitHandler() {
+	        if ($.validate.form()) {
+	        	$.operate.save(prefix + "/edit", $('#form-user-edit').serialize());
+	        }
+	    }
+	</script>
+</body>
+</html>

+ 77 - 0
leiSP-admin/src/main/resources/templates/demo/operate/other.html

@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('其他操作')" />
+</head>
+<body class="white-bg">
+	<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+	    <form class="form-horizontal" id="form-demo-1">
+	        <div class="form-group">
+	            <label class="col-sm-2 control-label">用户名称:</label>
+	            <div class="col-sm-10">
+	                <input type="text" class="form-control" name="userName"placeholder="请输入用户名称">
+	            </div>
+	        </div>
+	        <div class="form-group">
+	            <label class="col-sm-2 control-label">手机号码:</label>
+	            <div class="col-sm-10">
+	                <input type="text" class="form-control" name="phonenumber" maxlength="11"placeholder="请输入手机号码">
+	            </div>
+	        </div>
+	        <div class="form-group">
+	            <div class="col-sm-offset-2 col-sm-10">
+	                <button type="button" class="btn btn-sm btn-primary" onclick="submit1()"><i class="fa fa-check"></i>保 存(不刷新当前页)</button>&nbsp;
+	            </div>
+	        </div>
+	    </form>
+	    <hr/>
+	    <form class="form-horizontal" id="form-demo-2">
+	        <div class="form-group">
+	            <label class="col-sm-2 control-label">用户名称:</label>
+	            <div class="col-sm-10">
+	                <input type="text" class="form-control" name="userName"placeholder="请输入用户名称">
+	            </div>
+	        </div>
+	        <div class="form-group">
+	            <label class="col-sm-2 control-label">手机号码:</label>
+	            <div class="col-sm-10">
+	                <input type="text" class="form-control" name="phonenumber" maxlength="11"placeholder="请输入手机号码">
+	            </div>
+	        </div>
+	        <div class="form-group">
+	            <div class="col-sm-offset-2 col-sm-10">
+	                <button type="button" class="btn btn-sm btn-primary" onclick="submit2()"><i class="fa fa-check"></i>保 存(刷新当前页)</button>&nbsp;
+	            </div>
+	        </div>
+	    </form>
+    </div>
+    <th:block th:include="include :: footer" />
+	<script type="text/javascript">
+	    var prefix = ctx + "demo/operate";
+	    function submit1(){
+	    	$.operate.saveModal(prefix + "/edit", $('#form-demo-1').serialize());
+	    }
+	    
+	    function submit2(){
+	    	$.ajax({
+	            url: prefix + "/edit",
+	            data: $('#form-demo-2').serialize(),
+	            type: "post",
+	            success: function(result) {
+	            	if (result.code == 0) {
+	            		layer.msg("保存成功,正在刷新数据请稍后……", {
+		            	    icon: 1,
+		            	    time: 500,
+		            	    shade: [0.1, '#8F8F8F']
+		            	},function() {
+		            		location.reload();
+		            	});
+	            	} else {
+	            		alert(result.msg);
+	            	}
+	            }
+	        })
+	    }
+	</script>
+</body>
+</html>

+ 125 - 0
leiSP-admin/src/main/resources/templates/demo/operate/table.html

@@ -0,0 +1,125 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('其他操作')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+     	<div class="btn-group-sm" id="toolbar" role="group">
+	        <a class="btn btn-success" onclick="$.operate.add()">
+	            <i class="fa fa-plus"></i> 新增
+	        </a>
+	        <a class="btn btn-primary single disabled" onclick="$.operate.edit()">
+	            <i class="fa fa-edit"></i> 修改
+	        </a>
+	        <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()">
+	            <i class="fa fa-remove"></i> 删除
+	        </a>
+	        <a class="btn btn-info" onclick="$.table.importExcel()">
+	            <i class="fa fa-upload"></i> 导入
+	        </a>
+	        <a class="btn btn-warning" onclick="$.table.exportExcel()">
+	            <i class="fa fa-download"></i> 导出
+	        </a>
+	        <a class="btn btn-info single disabled" onclick="$.operate.detail()">
+	            <i class="fa fa-search"></i> 详细
+	        </a>
+	        <a class="btn btn-danger" onclick="$.operate.clean()">
+	            <i class="fa fa-trash"></i> 清空
+	        </a>
+        </div>
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/operate";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                importUrl: prefix + "/importData",
+                importTemplateUrl: prefix + "/importTemplate",
+                detailUrl: prefix + "/detail/{id}",
+                cleanUrl: prefix + "/clean",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        search: true,
+		        modalName: "用户",
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#" onclick="$.operate.edit(\'' + row.userId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-info btn-xs" href="#" onclick="$.operate.detail(\'' + row.userId + '\')"><i class="fa fa-search"></i>详细</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#" onclick="$.operate.remove(\'' + row.userId + '\')"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+<!-- 导入区域 -->
+<script id="importTpl" type="text/template">
+<form enctype="multipart/form-data" class="mt20 mb10">
+	<div class="col-xs-offset-1">
+		<input type="file" id="file" name="file"/>
+		<div class="mt10 pt5">
+			<input type="checkbox" id="updateSupport" name="updateSupport" title="如果登录账户已经存在,更新这条数据。"> 是否更新已经存在的用户数据
+			 &nbsp;	<a onclick="$.table.importTemplate()" class="btn btn-default btn-xs"><i class="fa fa-file-excel-o"></i> 下载模板</a>
+		</div>
+		<font color="red" class="pull-left mt10">
+			提示:仅允许导入“xls”或“xlsx”格式文件!
+		</font>
+	</div>
+</form>
+</script>
+</html>

Diferenças do arquivo suprimidas por serem muito extensas
+ 1264 - 0
leiSP-admin/src/main/resources/templates/demo/report/echarts.html


+ 478 - 0
leiSP-admin/src/main/resources/templates/demo/report/metrics.html

@@ -0,0 +1,478 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('图表组合')" />
+</head>
+<body class="gray-bg">
+    <div class="wrapper wrapper-content animated fadeInRight">
+        <div class="row">
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5 class="m-b-md">Q1 销量</h5>
+                        <h2 class="text-navy">
+                                    <i class="fa fa-play fa-rotate-270"></i> 上升
+                                </h2>
+                        <small>更新时间:12天以前</small>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content ">
+                        <h5 class="m-b-md">Q2 销量</h5>
+                        <h2 class="text-navy">
+                                    <i class="fa fa-play fa-rotate-270"></i> 上升
+                                </h2>
+                        <small>更新时间:12天以前</small>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5 class="m-b-md">Q3 销量</h5>
+                        <h2 class="text-danger">
+                                    <i class="fa fa-play fa-rotate-90"></i> 下降
+                                </h2>
+                        <small>更新时间:12天以前</small>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5 class="m-b-md">Q4 销量</h5>
+                        <h2 class="text-danger">
+                                    <i class="fa fa-play fa-rotate-90"></i> 下降
+                                </h2>
+                        <small>更新时间:12天以前</small>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+        <div class="row">
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>本日访问量</h5>
+                        <h2>198 009</h2>
+                        <div id="sparkline1"></div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>本周访问量</h5>
+                        <h2>65 000</h2>
+                        <div id="sparkline2"></div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>本月访问量</h5>
+                        <h2>680 900</h2>
+                        <div id="sparkline3"></div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>平均停留时间</h5>
+                        <h2>00:06:40</h2>
+                        <div id="sparkline4"></div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>使用率</h5>
+                        <h2>65%</h2>
+                        <div class="progress progress-mini">
+                            <div style="width: 68%;" class="progress-bar"></div>
+                        </div>
+
+                        <div class="m-t-sm small">4:32更新</div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>使用率</h5>
+                        <h2>50%</h2>
+                        <div class="progress progress-mini">
+                            <div style="width: 78%;" class="progress-bar"></div>
+                        </div>
+
+                        <div class="m-t-sm small">4:32更新</div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>使用率</h5>
+                        <h2>14%</h2>
+                        <div class="progress progress-mini">
+                            <div style="width: 38%;" class="progress-bar progress-bar-danger"></div>
+                        </div>
+
+                        <div class="m-t-sm small">4:32更新</div>
+                    </div>
+                </div>
+            </div>
+
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>使用率</h5>
+                        <h2>20%</h2>
+                        <div class="progress progress-mini">
+                            <div style="width: 28%;" class="progress-bar progress-bar-danger"></div>
+                        </div>
+
+                        <div class="m-t-sm small">4:32更新</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+
+        <div class="row">
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>百分比</h5>
+                        <h2>42/20</h2>
+                        <div class="text-center">
+                            <div id="sparkline5"></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>百分比</h5>
+                        <h2>100/54</h2>
+                        <div class="text-center">
+                            <div id="sparkline6"></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>百分比</h5>
+                        <h2>685/211</h2>
+                        <div class="text-center">
+                            <div id="sparkline7"></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>百分比</h5>
+                        <h2>240/32</h2>
+                        <div class="text-center">
+                            <div id="sparkline8"></div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>收入</h5>
+                        <h1 class="no-margins">886,200</h1>
+                        <div class="stat-percent font-bold text-navy">98% <i class="fa fa-bolt"></i></div>
+                        <small>总收入</small>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>本月收入</h5>
+                        <h1 class="no-margins">1 738,200</h1>
+                        <div class="stat-percent font-bold text-navy">98% <i class="fa fa-bolt"></i></div>
+                        <small>总收入</small>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>本日收入</h5>
+                        <h1 class="no-margins">-200,100</h1>
+                        <div class="stat-percent font-bold text-danger">12% <i class="fa fa-level-down"></i></div>
+                        <small>总收入</small>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>搜索有收入</h5>
+                        <h1 class="no-margins">54,200</h1>
+                        <div class="stat-percent font-bold text-danger">24% <i class="fa fa-level-down"></i></div>
+                        <small>总收入</small>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>预警</h5>
+                        <table class="table table-stripped small m-t-md">
+                            <tbody>
+                                <tr>
+                                    <td class="no-borders">
+                                        <i class="fa fa-circle text-navy"></i>
+                                    </td>
+                                    <td class="no-borders">
+                                        示例 01
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <i class="fa fa-circle text-navy"></i>
+                                    </td>
+                                    <td>
+                                        示例 02
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <i class="fa fa-circle text-navy"></i>
+                                    </td>
+                                    <td>
+                                        示例 03
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>项目</h5>
+                        <table class="table table-stripped small m-t-md">
+                            <tbody>
+                                <tr>
+                                    <td class="no-borders">
+                                        <i class="fa fa-circle text-navy"></i>
+                                    </td>
+                                    <td class="no-borders">
+                                        示例 01
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <i class="fa fa-circle text-navy"></i>
+                                    </td>
+                                    <td>
+                                        示例 02
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <i class="fa fa-circle text-navy"></i>
+                                    </td>
+                                    <td>
+                                        示例 03
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>消息</h5>
+                        <table class="table table-stripped small m-t-md">
+                            <tbody>
+                                <tr>
+                                    <td class="no-borders">
+                                        <i class="fa fa-circle text-danger"></i>
+                                    </td>
+                                    <td class="no-borders">
+                                        示例 01
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <i class="fa fa-circle text-danger"></i>
+                                    </td>
+                                    <td>
+                                        示例 02
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <i class="fa fa-circle text-danger"></i>
+                                    </td>
+                                    <td>
+                                        示例 03
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-3">
+                <div class="ibox">
+                    <div class="ibox-content">
+                        <h5>通知</h5>
+                        <table class="table table-stripped small m-t-md">
+                            <tbody>
+                                <tr>
+                                    <td class="no-borders">
+                                        <i class="fa fa-circle text-danger"></i>
+                                    </td>
+                                    <td class="no-borders">
+                                        示例 01
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <i class="fa fa-circle text-danger"></i>
+                                    </td>
+                                    <td>
+                                        示例 02
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <i class="fa fa-circle text-danger"></i>
+                                    </td>
+                                    <td>
+                                        示例 03
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: peity-js" />
+    <th:block th:include="include :: sparkline-js" />
+    <script type="text/javascript">
+	    $(document).ready(function () {
+	        $("#sparkline1").sparkline([34, 43, 43, 35, 44, 32, 44, 52], {
+	            type: 'line',
+	            width: '100%',
+	            height: '60',
+	            lineColor: '#1ab394',
+	            fillColor: "#ffffff"
+	        });
+	
+	        $("#sparkline2").sparkline([24, 43, 43, 55, 44, 62, 44, 72], {
+	            type: 'line',
+	            width: '100%',
+	            height: '60',
+	            lineColor: '#1ab394',
+	            fillColor: "#ffffff"
+	        });
+	
+	        $("#sparkline3").sparkline([74, 43, 23, 55, 54, 32, 24, 12], {
+	            type: 'line',
+	            width: '100%',
+	            height: '60',
+	            lineColor: '#ed5565',
+	            fillColor: "#ffffff"
+	        });
+	
+	        $("#sparkline4").sparkline([24, 43, 33, 55, 64, 72, 44, 22], {
+	            type: 'line',
+	            width: '100%',
+	            height: '60',
+	            lineColor: '#ed5565',
+	            fillColor: "#ffffff"
+	        });
+	
+	        $("#sparkline5").sparkline([1, 4], {
+	            type: 'pie',
+	            height: '140',
+	            sliceColors: ['#1ab394', '#F5F5F5']
+	        });
+	
+	        $("#sparkline6").sparkline([5, 3], {
+	            type: 'pie',
+	            height: '140',
+	            sliceColors: ['#1ab394', '#F5F5F5']
+	        });
+	
+	        $("#sparkline7").sparkline([2, 2], {
+	            type: 'pie',
+	            height: '140',
+	            sliceColors: ['#ed5565', '#F5F5F5']
+	        });
+	
+	        $("#sparkline8").sparkline([2, 3], {
+	            type: 'pie',
+	            height: '140',
+	            sliceColors: ['#ed5565', '#F5F5F5']
+	        });
+	    });
+	    
+	    $(function() {
+	        $("span.pie").peity("pie", {
+	            fill: ['#1ab394', '#d7d7d7', '#ffffff']
+	        })
+	
+	        $(".line").peity("line",{
+	            fill: '#1ab394',
+	            stroke:'#169c81',
+	        })
+	
+	        $(".bar").peity("bar", {
+	            fill: ["#1ab394", "#d7d7d7"]
+	        })
+	
+	        $(".bar_dashboard").peity("bar", {
+	            fill: ["#1ab394", "#d7d7d7"],
+	            width:100
+	        })
+	
+	        var updatingChart = $(".updating-chart").peity("line", { fill: '#1ab394',stroke:'#169c81', width: 64 })
+	
+	        setInterval(function() {
+	            var random = Math.round(Math.random() * 10)
+	            var values = updatingChart.text().split(",")
+	            values.shift()
+	            values.push(random)
+	
+	            updatingChart
+	                .text(values.join(","))
+	                .change()
+	        }, 1000);
+	    });
+    </script>
+</body>
+</html>

+ 206 - 0
leiSP-admin/src/main/resources/templates/demo/report/peity.html

@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('图表')" />
+</head>
+<body class="gray-bg">
+    <div class="wrapper wrapper-content animated fadeInDown">
+
+        <div class="row">
+            <div class="col-sm-5">
+                <div class="jumbotron">
+                    <h1>Peity图表</h1>
+                    <p>是一个内嵌数据图形可视化的图表库</p>
+                    <p><a href="http://benpickles.github.io/peity/" target="_blank" class="btn btn-primary btn-lg" role="button">了解 Peity</a>
+                    </p>
+                </div>
+            </div>
+            <div class="col-sm-7">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>饼状图 <small>自定义颜色</small></h5>
+                        <div class="ibox-tools">
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div>
+                        <table class="table table-bordered white-bg">
+                            <thead>
+                                <tr>
+                                    <th>图表</th>
+                                    <th>代码</th>
+                                </tr>
+                            </thead>
+
+                            <tbody>
+                                <tr>
+                                    <td>
+                                        <span class="pie">1/5</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="pie"&gt;1/5&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="pie">226/360</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="pie"&gt;226/360&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="pie">0.52/1.561</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="pie"&gt;0.52/1.561&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="pie">1,4</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="pie"&gt;1,4&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="pie">226,134</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="pie"&gt;226,134&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="pie">0.52,1.041</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="pie"&gt;0.52,1.041&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-12">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>线性图</h5>
+                        <div class="ibox-tools">
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div>
+                        <table class="table table-bordered white-bg">
+                            <thead>
+                                <tr>
+                                    <th>图表</th>
+                                    <th>代码</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                <tr>
+                                    <td>
+                                        <span data-diameter="40" class="updating-chart">5,3,9,6,5,9,7,3,5,2,5,3,9,6,5,9,7,3,5,2</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="line"&gt;5,3,9,6,5,9,7,3,5,2&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="line">5,3,9,6,5,9,7,3,5,2</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="line"&gt;5,3,9,6,5,9,7,3,5,2&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="line">5,3,2,-1,-3,-2,2,3,5,2</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="line"&gt;5,3,2,-1,-3,-2,2,3,5,2&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="line">0,-3,-6,-4,-5,-4,-7,-3,-5,-2</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="line"&gt;0,-3,-6,-4,-5,-4,-7,-3,-5,-2&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="bar">5,3,9,6,5,9,7,3,5,2</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="bar"&gt;5,3,9,6,5,9,7,3,5,2&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span class="bar">5,3,2,-1,-3,-2,2,3,5,2</span>
+                                    </td>
+                                    <td>
+                                        <code>&lt;span class="bar"&gt;5,3,2,-1,-3,-2,2,3,5,2&lt;/span&gt;</code>
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: peity-js" />
+    <script type="text/javascript">
+	    $(function() {
+	        $("span.pie").peity("pie", {
+	            fill: ['#1ab394', '#d7d7d7', '#ffffff']
+	        })
+	
+	        $(".line").peity("line",{
+	            fill: '#1ab394',
+	            stroke:'#169c81',
+	        })
+	
+	        $(".bar").peity("bar", {
+	            fill: ["#1ab394", "#d7d7d7"]
+	        })
+	
+	        $(".bar_dashboard").peity("bar", {
+	            fill: ["#1ab394", "#d7d7d7"],
+	            width:100
+	        })
+	
+	        var updatingChart = $(".updating-chart").peity("line", { fill: '#1ab394',stroke:'#169c81', width: 64 })
+	
+	        setInterval(function() {
+	            var random = Math.round(Math.random() * 10)
+	            var values = updatingChart.text().split(",")
+	            values.shift()
+	            values.push(random)
+	
+	            updatingChart
+	                .text(values.join(","))
+	                .change()
+	        }, 1000);
+	
+	    });
+    </script>
+</body>
+</html>

+ 232 - 0
leiSP-admin/src/main/resources/templates/demo/report/sparkline.html

@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('线状图')" />
+</head>
+<body class="gray-bg">
+    <div class="wrapper wrapper-content animated fadeInDown">
+
+        <div class="row">
+            <div class="col-sm-5">
+                <div class="jumbotron">
+                    <h1>Sparkline</h1>
+                    <p>这是另一个可视化图表库</p>
+                    <p><a href="http://omnipotent.net/jquery.sparkline" target="_blank" class="btn btn-primary btn-lg" role="button">了解 Sparkline</a>
+                    </p>
+                </div>
+            </div>
+            <div class="col-sm-7">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>Sparkline图表 <small>自定义颜色</small></h5>
+                        <div class="ibox-tools">
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div>
+                        <table class="table table-bordered white-bg">
+                            <thead>
+                                <tr>
+                                    <th>图表</th>
+                                    <th>类型</th>
+                                </tr>
+                            </thead>
+
+                            <tbody>
+                                <tr>
+                                    <td>
+                                        <span id="sparkline1"></span>
+                                    </td>
+                                    <td>
+                                        内联线性图
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span id="sparkline2"></span>
+                                    </td>
+                                    <td>
+                                        柱状图
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span id="sparkline3"></span>
+                                    </td>
+                                    <td>
+                                        饼状图
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span id="sparkline4"></span>
+                                    </td>
+                                    <td>
+                                        长线性图
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span id="sparkline5"></span>
+                                    </td>
+                                    <td>
+                                        三态图
+                                    </td>
+                                </tr>
+                                <tr>
+                                    <td>
+                                        <span id="sparkline6"></span>
+                                    </td>
+                                    <td>
+                                        散点图
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-sm-4">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>自定义饼状图尺寸</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content text-center h-200">
+                        <span id="sparkline7"></span>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-4">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>自定义柱状图尺寸</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content text-center h-200">
+                        <span id="sparkline8"></span>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-4">
+                <div class="ibox float-e-margins">
+                    <div class="ibox-title">
+                        <h5>自定义线性图尺寸</h5>
+                        <div class="ibox-tools">
+                            <a class="collapse-link">
+                                <i class="fa fa-chevron-up"></i>
+                            </a>
+                            <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                <i class="fa fa-wrench"></i>
+                            </a>
+                            <ul class="dropdown-menu dropdown-user">
+                                <li><a href="#">选项1</a>
+                                </li>
+                                <li><a href="#">选项2</a>
+                                </li>
+                            </ul>
+                            <a class="close-link">
+                                <i class="fa fa-times"></i>
+                            </a>
+                        </div>
+                    </div>
+                    <div class="ibox-content text-center h-200">
+                        <span id="sparkline9"></span>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: sparkline-js" />
+    <script type="text/javascript">
+	    $(function () {
+	        $("#sparkline1").sparkline([34, 43, 43, 35, 44, 32, 44, 52, 25], {
+	            type: 'line',
+	            lineColor: '#17997f',
+	            fillColor: '#1ab394',
+	        });
+	        $("#sparkline2").sparkline([5, 6, 7, 2, 0, -4, -2, 4], {
+	            type: 'bar',
+	            barColor: '#1ab394',
+	            negBarColor: '#c6c6c6'});
+	
+	        $("#sparkline3").sparkline([1, 1, 2], {
+	            type: 'pie',
+	            sliceColors: ['#1ab394', '#b3b3b3', '#e4f0fb']});
+	
+	        $("#sparkline4").sparkline([34, 43, 43, 35, 44, 32, 15, 22, 46, 33, 86, 54, 73, 53, 12, 53, 23, 65, 23, 63, 53, 42, 34, 56, 76, 15, 54, 23, 44], {
+	            type: 'line',
+	            lineColor: '#17997f',
+	            fillColor: '#ffffff',
+	        });
+	
+	        $("#sparkline5").sparkline([1, 1, 0, 1, -1, -1, 1, -1, 0, 0, 1, 1], {
+	            type: 'tristate',
+	            posBarColor: '#1ab394',
+	            negBarColor: '#bfbfbf'});
+	
+	
+	        $("#sparkline6").sparkline([4, 6, 7, 7, 4, 3, 2, 1, 4, 4, 5, 6, 3, 4, 5, 8, 7, 6, 9, 3, 2, 4, 1, 5, 6, 4, 3, 7, ], {
+	            type: 'discrete',
+	            lineColor: '#1ab394'});
+	
+	        $("#sparkline7").sparkline([52, 12, 44], {
+	            type: 'pie',
+	            height: '150px',
+	            sliceColors: ['#1ab394', '#b3b3b3', '#e4f0fb']});
+	
+	        $("#sparkline8").sparkline([5, 6, 7, 2, 0, 4, 2, 4, 5, 7, 2, 4, 12, 14, 4, 2, 14, 12, 7], {
+	            type: 'bar',
+	            barWidth: 8,
+	            height: '150px',
+	            barColor: '#1ab394',
+	            negBarColor: '#c6c6c6'});
+	
+	        $("#sparkline9").sparkline([34, 43, 43, 35, 44, 32, 15, 22, 46, 33, 86, 54, 73, 53, 12, 53, 23, 65, 23, 63, 53, 42, 34, 56, 76, 15, 54, 23, 44], {
+	            type: 'line',
+	            lineWidth: 1,
+	            height: '150px',
+	            lineColor: '#17997f',
+	            fillColor: '#ffffff',
+	        });
+	    });
+    </script>
+</body>
+</html>

+ 92 - 0
leiSP-admin/src/main/resources/templates/demo/table/button.html

@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('点击按钮加载表格')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 search-collapse">
+				<form id="ordinary-form">
+					<div class="select-list">
+						<ul>
+							<li>
+								用户名称:<input type="text" name="userName"/>
+							</li>
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm" onclick="query()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+							    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+			
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        function query() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        }
+    </script>
+</body>
+</html>

+ 113 - 0
leiSP-admin/src/main/resources/templates/demo/table/child.html

@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('表格父子视图')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        detailView: true,
+				onExpandRow : function(index, row, $detail) {
+					initChildTable(index, row, $detail);
+				},
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+		initChildTable = function(index, row, $detail) {
+			var childTable = $detail.html('<table style="table-layout:fixed"></table>').find('table');
+    	    $(childTable).bootstrapTable({
+    	        url: prefix + "/list",
+    	        method: 'post',
+    	        sidePagination: "server",
+    	        contentType: "application/x-www-form-urlencoded",
+    	        queryParams : {
+                    userName: '测试8'
+				},
+    	        columns: [{
+					field : 'userId', 
+					title : '子表ID'
+				},
+				{
+					field : 'userCode', 
+					title : '子表编号'
+				},
+				{
+					field : 'userName', 
+					title : '子表姓名'
+				},
+				{
+                    field: 'status',
+                    title: '子表状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                }]
+    	    });
+		};
+    </script>
+</body>
+</html>

+ 178 - 0
leiSP-admin/src/main/resources/templates/demo/table/curd.html

@@ -0,0 +1,178 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('动态增删改查')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="btn-group-sm" id="toolbar" role="group">
+	        <a class="btn btn-success" onclick="insertRow()">
+	            <i class="fa fa-plus"></i> 新增行
+	        </a>
+	        <a class="btn btn-danger multiple disabled" onclick="removeRow()">
+	            <i class="fa fa-remove"></i> 删除选择行
+	        </a>
+	        <a class="btn btn-danger" onclick="removeRowByUniqueId()">
+	            <i class="fa fa-remove"></i> 根据值删除行
+	        </a>
+	        <a class="btn btn-danger" onclick="removeRowAll()">
+	            <i class="fa fa-remove"></i> 删除所有行
+	        </a>
+	        <a class="btn btn-info" onclick="updateRow()">
+	            <i class="fa fa-edit"></i> 修改行
+	        </a>
+	        <a class="btn btn-info" onclick="updateRowByUniqueId()">
+	            <i class="fa fa-edit"></i> 根据值修改行
+	        </a>
+	        <a class="btn btn-info" onclick="getSelections()">
+	            <i class="fa fa-search"></i> 查询选择数据
+	        </a>
+	        <a class="btn btn-info" onclick="getRowByUniqueId()">
+	            <i class="fa fa-search"></i> 根据值查询行
+	        </a>
+	        <a class="btn btn-primary" onclick="getData()">
+	            <i class="fa fa-search"></i> 查询所有数据
+	        </a>
+        </div>
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        pagination: false,
+		        uniqueId: "userId",
+		        height: 400,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				}]
+            };
+            $.table.init(options);
+        });
+        
+        /* 新增表格行 */
+        function insertRow(){
+        	var randomId = 100 + ~~(Math.random() * 100)
+        	$("#" + table.options.id).bootstrapTable('insertRow', {
+        		index: 0, // 你想插入到哪,0表示第一行
+                row: {
+                	userId: randomId,
+                	userCode: 2000000 + randomId,
+                	userName: '测试' + randomId,
+                	userPhone: '1588888888',
+                	userEmail: 'ry1@qq.com',
+                	userBalance: 10 + randomId,
+                }
+        	})
+        }
+        
+        /* 删除指定表格行 */
+        function removeRow(){
+        	var ids = $.table.selectColumns("userId");
+        	if (ids.length == 0) {
+    			$.modal.alertWarning("请至少选择一条记录");
+    			return;
+    		}
+        	$("#" + table.options.id).bootstrapTable('remove', {
+        	    field: 'userId',
+        	    values: ids
+        	})
+        }
+        
+        /* 删除行ID值为1的数据 */
+        function removeRowByUniqueId(){
+        	$("#" + table.options.id).bootstrapTable('removeByUniqueId', 1)
+        }
+        
+        /* 删除所有表格行 */
+        function removeRowAll(){
+        	$("#" + table.options.id).bootstrapTable('removeAll')
+        }
+        
+        /* 修改表格行 */
+        function updateRow(){
+        	var randomId = 100 + ~~(Math.random() * 100)
+        	$("#" + table.options.id).bootstrapTable('updateRow', {
+        		index: 0, // 你想修改哪行,0表示第一行
+                row: {
+                	userId: randomId,
+                	userCode: 3000000 + randomId,
+                	userName: '测试' + randomId,
+                	userPhone: '1599999999',
+                	userEmail: 'ry2@qq.com',
+                	userBalance: 50 + randomId,
+                }
+        	})
+        }
+        
+        /* 修改行ID值为1的数据 */
+        function updateRowByUniqueId(){
+        	var randomId = 100 + ~~(Math.random() * 100)
+        	$("#" + table.options.id).bootstrapTable('updateByUniqueId', {
+        		id: 1,
+                row: {
+                	userId: randomId,
+                	userCode: 3000000 + randomId,
+                	userName: '测试' + randomId,
+                	userPhone: '1599999999',
+                	userEmail: 'ry2@qq.com',
+                	userBalance: 50 + randomId,
+                }
+        	})
+        }
+        
+        /* 查询表格所有数据值 */
+        function getData(){
+        	var data = $("#" + table.options.id).bootstrapTable('getData');
+            alert(JSON.stringify(data))
+        }
+        
+        /* 查询行ID值为1的数据 */
+        function getRowByUniqueId(){
+        	var data = $("#" + table.options.id).bootstrapTable('getRowByUniqueId', 1);
+            alert(JSON.stringify(data))
+        }
+        
+        /* 查询表格选择行数据值 */
+        function getSelections(){
+        	var data = $("#" + table.options.id).bootstrapTable('getSelections');
+        	alert(JSON.stringify(data))
+        }
+    </script>
+</body>
+</html>

+ 76 - 0
leiSP-admin/src/main/resources/templates/demo/table/data.html

@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('加载data数据')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                data: [[${users}]],
+                sidePagination: "client",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 86 - 0
leiSP-admin/src/main/resources/templates/demo/table/detail.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('表格细节视图')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        detailView: true,
+		        detailFormatter: detailFormatter,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        function detailFormatter(index, row) {
+        	var html = [];
+        	$.each(row, function(key, value) {
+        		html.push('<p><b>' + key + ':</b> ' + value + '</p>');
+        	});
+        	return html.join('');
+       	}
+    </script>
+</body>
+</html>

+ 128 - 0
leiSP-admin/src/main/resources/templates/demo/table/editable.html

@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('表格行内编辑')" />
+	<th:block th:include="include :: bootstrap-editable-css" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="btn-group-sm" id="toolbar" role="group">
+             <a class="btn btn-info" onclick="getSelections()">
+	            <i class="fa fa-search"></i> 查询选择数据
+	        </a>
+	        <a class="btn btn-primary" onclick="getData()">
+	            <i class="fa fa-search"></i> 获取所有数据
+	        </a>
+        </div>
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+	
+	<th:block th:include="include :: footer" />
+	<th:block th:include="include :: bootstrap-table-editable-js" />
+	
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        showPageGo: true,
+		        onEditableSave: onEditableSave,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号',
+					editable: true
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名',
+					editable : {
+						type : 'text',
+						title : '名称',
+						emptytext : "【名称】为空",
+						validate : function(value) {
+							if (value.length > 30) {
+								return '名称不能超过30个字符';
+							}
+							if (value.length == 0) {
+								return '名称不能为空';
+							}
+						}
+					}
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    editable : {
+						type : 'select',
+						title : '状态',
+						source : [{
+							value : 0,
+							text : "正常"
+						}, {
+							value : 1,
+							text : "停用"
+						}]
+					}
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        function onEditableSave (field, row, oldValue, $el) {
+        	alert("字段名:" + field + ",当前值:" + row[field]  + ",旧值:" + oldValue);
+        }
+        
+        /* 查询表格所有数据值 */
+        function getData(){
+        	var data = $("#" + table.options.id).bootstrapTable('getData');
+            alert(JSON.stringify(data))
+        }
+        
+        /* 查询表格选择行数据值 */
+        function getSelections(){
+        	var data = $("#" + table.options.id).bootstrapTable('getSelections');
+        	alert(JSON.stringify(data))
+        }
+    </script>
+</body>
+</html>

+ 107 - 0
leiSP-admin/src/main/resources/templates/demo/table/event.html

@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('自定义触发事件')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+			    <p class="select-title">自定义触发事件(点击某行/双击某行/单击某格/双击某格/服务器发送数据前触发/数据被加载时触发)</p>
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        onClickRow: onClickRow,
+		        onDblClickRow: onDblClickRow,
+		        onClickCell: onClickCell,
+		        onDblClickCell: onDblClickCell,
+		        responseHandler: responseHandler,
+		        onLoadSuccess: onLoadSuccess,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        function onClickRow(row, $element){
+        	alert("单击行userId:" + row.userId + " userName:" + row.userName);
+        }
+        
+        function onDblClickRow(row, $element){
+        	alert("双击行userId:" + row.userId + " userName:" + row.userName);
+        }
+        
+        function onClickCell(field, value, row, $element){
+        	alert("单击格name:" + field + " value:" + value);
+        }
+        
+        function onDblClickCell(field, value, row, $element){
+        	alert("双击格name:" + field + " value:" + value);
+        }
+        
+        function responseHandler(res){
+        	alert("请求获取数据后处理回调函数");
+        }
+        
+        function onLoadSuccess(data){
+        	alert("当所有数据被加载时触发");
+        }
+    </script>
+</body>
+</html>

+ 81 - 0
leiSP-admin/src/main/resources/templates/demo/table/export.html

@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('导出')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <th:block th:include="include :: bootstrap-table-export-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        showExport: true,
+		        exportOptions: {
+		        	ignoreColumn: [0, 8]  //忽略第一列和最后一列
+		        },
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 145 - 0
leiSP-admin/src/main/resources/templates/demo/table/fixedColumns.html

@@ -0,0 +1,145 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('冻结列')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="btn-group-sm" id="toolbar" role="group">
+				<a class="btn btn-success">
+	                <i class="fa fa-plus"></i> 新增
+	            </a>
+				<a class="btn btn-primary single disabled">
+		            <i class="fa fa-edit"></i> 修改
+		        </a>
+				<a class="btn btn-danger multiple disabled">
+		            <i class="fa fa-remove"></i> 删除
+		        </a>
+	        </div>
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <th:block th:include="include :: bootstrap-table-fixed-columns-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        fixedColumns: true,
+    		    fixedNumber: 3,
+    		    fixedRightNumber: 3,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+				{
+				    field : 'userBalance',
+				    title : '测试1'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试2'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试3'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试4'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试5'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试6'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试7'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试8'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试9'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试10'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试11'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试12'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试13'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试14'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试15'
+				},
+				{
+				    field : 'userBalance',
+				    title : '测试16'
+				}]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 83 - 0
leiSP-admin/src/main/resources/templates/demo/table/footer.html

@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('表格数据汇总')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showFooter: true,
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额',
+				    footerFormatter:function (value) {
+				    	var sumBalance = 0;
+				        for (var i in value) {
+				        	sumBalance += parseFloat(value[i].userBalance);
+				        }
+				        return "总金额:" + sumBalance;
+				    }
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 80 - 0
leiSP-admin/src/main/resources/templates/demo/table/groupHeader.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('组合表头')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-bordered">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        columns : [
+        				[{
+        					title : '基本信息',
+        					align : 'center',
+        					colspan : 6
+        				}, {
+        					title : '其他信息',
+        					align : 'center',
+        					colspan : 3
+        				}
+        			],
+        			[{
+        					checkbox : true
+        				}, {
+        					field : 'userId',
+        					title : '用户ID'
+        				}, {
+        					field : 'userCode',
+        					title : '用户编号'
+        				}, {
+        					field : 'userName',
+        					title : '用户姓名'
+        				}, {
+        					field : 'userPhone',
+        					title : '用户手机'
+        				}, {
+        					field : 'userEmail',
+        					title : '用户邮箱'
+        				}, {
+        					field : 'userBalance',
+        					title : '用户余额'
+        				}, {
+        					field : 'status',
+        					title : '用户状态',
+        					formatter : function (value, row, index) {
+        						return $.table.selectDictLabel(datas, value);
+        					}
+        				}, {
+        					title : '操作',
+        					align : 'center',
+        					formatter : function (value, row, index) {
+        						var actions = [];
+        						actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+        						actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+        						return actions.join('');
+        					}
+        				}
+        			]
+        		]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 79 - 0
leiSP-admin/src/main/resources/templates/demo/table/image.html

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('跳转至指定页')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+				    title: '图片',
+				    formatter: function(value, row, index) {
+				    	// 图片预览(注意:如存储在本地直接获取数据库路径,如有配置context-path需要使用ctx+路径)
+				    	// 如:/profile/upload/2019/08/08/3b7a839aced67397bac694d77611ce72.png
+				    	if(index % 2 == 0){
+				    		return $.table.imageView('#');
+				    	}else {
+				    		return $.table.imageView('#');
+				    	}
+				    }
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 222 - 0
leiSP-admin/src/main/resources/templates/demo/table/multi.html

@@ -0,0 +1,222 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('初始多表格')" />
+</head>
+<body class="gray-bg">
+    <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="form1">
+                    <div class="select-list">
+                        <ul>
+						    <li>
+								用户名称:<input type="text" name="userName"/>
+							</li>
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search('form1', 'bootstrap-table1')"><i class="fa fa-search"></i>&nbsp;搜索</a>
+							    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset('form1', 'bootstrap-table1')"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+            <div class="btn-group-sm" id="toolbar1" role="group">
+                <a class="btn btn-success" onclick="options1()">
+	                <i class="fa fa-search"></i> options
+	            </a>
+	            <a class="btn btn-success" onclick="$.operate.add()">
+	                <i class="fa fa-plus"></i> 新增
+	            </a>
+	            <a class="btn btn-primary single disabled" onclick="$.operate.edit()">
+	                <i class="fa fa-edit"></i> 修改
+	            </a>
+	            <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()">
+	                <i class="fa fa-remove"></i> 删除
+	            </a>
+            </div>
+			<div class="col-xs-12 select-table table-striped">
+				<table id="bootstrap-table1"></table>
+			</div>
+		</div>
+	</div>
+	
+	<div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="form2">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+								用户名称:<input type="text" name="userName"/>
+							</li>
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search('form2', 'bootstrap-table2')"><i class="fa fa-search"></i>&nbsp;搜索</a>
+							    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset('form2', 'bootstrap-table2')"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+			
+            <div class="btn-group-sm" id="toolbar2" role="group">
+                <a class="btn btn-success" onclick="options2()">
+	                <i class="fa fa-search"></i> options
+	            </a>
+	            <a class="btn btn-success" onclick="$.operate.add()">
+	                <i class="fa fa-plus"></i> 新增
+	            </a>
+	            <a class="btn btn-primary single disabled" onclick="$.operate.edit()">
+	                <i class="fa fa-edit"></i> 修改
+	            </a>
+	            <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()">
+	                <i class="fa fa-remove"></i> 删除
+	            </a>
+            </div>
+			<div class="col-xs-12 select-table table-striped">
+				<table id="bootstrap-table2"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/operate";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+            	id: "bootstrap-table1",
+            	toolbar: "toolbar1",
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                removeUrl: prefix + "/remove",
+                updateUrl: prefix + "/edit/{id}",
+		        modalName: "用户",
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="###" onclick="$.operate.edit(\'' + row.userId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="###" onclick="$.operate.remove(\'' + row.userId + '\')"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        
+        $(function() {
+            var options = {
+            	id: "bootstrap-table2",
+            	toolbar: "toolbar2",
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                removeUrl: prefix + "/remove",
+                updateUrl: prefix + "/edit/{id}",
+		        modalName: "用户",
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="###" onclick="$.operate.edit(\'' + row.userId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+		            	actions.push('<a class="btn btn-danger btn-xs" href="###" onclick="$.operate.remove(\'' + row.userId + '\')"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        function options1() {
+        	var temp = "";
+        	var obj = table.config['bootstrap-table1'];
+        	for (var i in obj) {
+        	    temp += i + ":" + obj[i] + "<br/>";
+        	}
+        	$.modal.alert(temp);
+        }
+        
+        function options2() {
+        	var temp = "";
+        	var obj = table.config['bootstrap-table2'];
+        	for (var i in obj) {
+        	    temp += i + ":" + obj[i] + "<br/>";
+        	}
+        	$.modal.alert(temp);
+        }
+    </script>
+</body>
+</html>

+ 106 - 0
leiSP-admin/src/main/resources/templates/demo/table/other.html

@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('其他操作')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+     	<div class="btn-group-sm" id="toolbar" role="group">
+	        <a class="btn btn-success" onclick="$.table.showColumn('userName')">
+	            <i class="fa fa-check"></i> 显示姓名
+	        </a>
+	        <a class="btn btn-danger" onclick="$.table.hideColumn('userName')">
+	            <i class="fa fa-close"></i> 隐藏姓名
+	        </a>
+	        <a class="btn btn-info" onclick="selectColumns()">
+	            <i class="fa fa-search"></i> 获取选中姓名
+	        </a>
+	        <a class="btn btn-warning" onclick="$.table.refresh()">
+	            <i class="fa fa-refresh"></i> 刷新
+	        </a>
+	        <a class="btn btn-danger" onclick="$.table.destroy()">
+	            <i class="fa fa-refresh"></i> 销毁
+	        </a>
+	        <a class="btn btn-primary" onclick="selectFirstColumns()">
+	            <i class="fa fa-search"></i> 获取选中首列值
+	        </a>
+        </div>
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        function selectColumns() {
+        	var column = $.table.selectColumns('userName');
+        	alert(column);
+        }
+        
+        function selectFirstColumns() {
+        	var column = $.table.selectFirstColumns();
+        	alert(column);
+        }
+    </script>
+</body>
+</html>

+ 77 - 0
leiSP-admin/src/main/resources/templates/demo/table/pageGo.html

@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('跳转至指定页')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        showPageGo: true,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 158 - 0
leiSP-admin/src/main/resources/templates/demo/table/params.html

@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('自定义查询参数')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<p class="select-title">通过queryParams方法设置</p>
+				<table id="bootstrap-table"></table>
+			</div>
+			
+			<div class="col-sm-12 search-collapse">
+				<form id="post-form">
+					<div class="select-list">
+						<ul>
+							<li>
+								用户姓名:<input type="text" name="userName" value="测试6"/>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+			<div class="col-sm-12 select-table table-striped">
+				<p class="select-title">通过form自动填充</p>
+				<table id="bootstrap-table-form"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        queryParams: queryParams,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        function queryParams(params) {
+            var search = $.table.queryParams(params);
+            search.userName = '测试1';
+            return search;
+        }
+        
+        
+        $(function() {
+            var options = {
+            	id: "bootstrap-table-form",
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 86 - 0
leiSP-admin/src/main/resources/templates/demo/table/remember.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('翻页记住选择')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+     	<div class="btn-group-sm" id="toolbar" role="group">
+	        <a class="btn btn-success" onclick="checkItem()">
+	            <i class="fa fa-check"></i> 选中项
+	        </a>
+        </div>
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+				<table id="bootstrap-table"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        rememberSelected: true,
+                columns: [{
+                	field: 'state',
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                },
+		        {
+		            title: '操作',
+		            align: 'center',
+		            formatter: function(value, row, index) {
+		            	var actions = [];
+		            	actions.push('<a class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
+						return actions.join('');
+		            }
+		        }]
+            };
+            $.table.init(options);
+        });
+        
+        // 选中数据
+        function checkItem(){
+        	// var arrays = $.table.selectColumns("userId");
+        	var arrays = $.table.selectColumns("userCode");
+        	alert(arrays);
+        }
+    </script>
+</body>
+</html>

+ 75 - 0
leiSP-admin/src/main/resources/templates/demo/table/reorder.html

@@ -0,0 +1,75 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('表格拖拽操作')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 select-table table-striped">
+			    <p class="select-title">按住表格拖拽</p>
+				<table id="bootstrap-table"
+				 data-use-row-attr-func="true"
+				 data-reorderable-rows="true"></table>
+			</div>
+		</div>
+	</div>
+    <div th:include="include :: footer"></div>
+    <th:block th:include="include :: bootstrap-table-reorder-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "demo/table";
+        var datas = [[${@dict.getType('sys_normal_disable')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+		        showSearch: false,
+		        showRefresh: false,
+		        showToggle: false,
+		        showColumns: false,
+		        onReorderRow: function (data) {
+		        	 //当拖拽结束后,data为整个表格的数据
+		            console.log('拖拽结束' + JSON.stringify(data))
+		            return false;
+		        },
+                columns: [{
+		            checkbox: true
+		        },
+				{
+					field : 'userId', 
+					title : '用户ID'
+				},
+				{
+					field : 'userCode', 
+					title : '用户编号'
+				},
+				{
+					field : 'userName', 
+					title : '用户姓名'
+				},
+				{
+					field : 'userPhone', 
+					title : '用户手机'
+				},
+				{
+					field : 'userEmail', 
+					title : '用户邮箱'
+				},
+				{
+				    field : 'userBalance',
+				    title : '用户余额'
+				},
+				{
+                    field: 'status',
+                    title: '用户状态',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                    	return $.table.selectDictLabel(datas, value);
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+    </script>
+</body>
+</html>

+ 202 - 0
leiSP-admin/src/main/resources/templates/demo/table/search.html

@@ -0,0 +1,202 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+	<th:block th:include="include :: header('表格搜索')" />
+	<th:block th:include="include :: bootstrap-select-css" />
+</head>
+<body class="gray-bg">
+    <div class="container-div">
+		<div class="row">
+			<div class="col-sm-12 search-collapse">
+			    <p class="select-title">普通条件查询</p>
+				<form id="ordinary-form">
+					<div class="select-list">
+						<ul>
+							<li>
+								商户编号:<input type="text" name="userId"/>
+							</li>
+							<li>
+								终端编号:<input type="text" name="termId"/>
+							</li>
+							<li>
+								处理状态:<select name="status">
+									<option value="">所有</option>
+									<option value="0">初始</option>
+									<option value="1">处理中</option>
+									<option value="2">交易成功</option>
+									<option value="3">交易失败</option>
+								</select>
+							</li>
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+							    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+
+			<div class="col-sm-12 search-collapse">
+			    <p class="select-title">时间条件查询</p>
+				<form id="time-form">
+					<div class="select-list">
+						<ul>
+							<li>
+								商户编号:<input type="text" name="userId"/>
+							</li>
+							<li>
+								终端编号:<input type="text" name="termId"/>
+							</li>
+							<li class="select-time">
+								<label>创建时间: </label>
+								<input type="text" class="time-input" id="startTime" placeholder="开始时间" name="params[beginTime]"/>
+								<span>-</span>
+								<input type="text" class="time-input" id="endTime" placeholder="结束时间" name="params[endTime]"/>
+							</li>
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+							    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset('time-form')"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+
+			<div class="col-sm-12 search-collapse">
+			    <p class="select-title">多级联动下拉查询</p>
+				<form id="cxselect-form">
+					<div class="select-list">
+						<ul id="element">
+						    <li>
+								商户编号:<input type="text" name="userId"/>
+							</li>
+							<li>
+								充值类型:<select class="type"></select>
+							</li>
+							<li>
+								充值路由:<select class="router"></select>
+							</li>
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+							    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset('cxselect-form')"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+
+			<div class="col-sm-12 search-collapse">
+			    <p class="select-title">下拉多选条件查询</p>
+				<form id="select-form">
+					<div class="select-list">
+						<ul>
+							<li>
+								商户编号:<input type="text" name="userId"/>
+							</li>
+							<li>
+								终端编号:<input type="text" name="termId"/>
+							</li>
+							<li class="select-selectpicker">
+								<label>操作类型: </label><select class="selectpicker" data-none-selected-text="请选择" multiple>
+									<option value="">所有</option>
+									<option value="0">初始</option>
+									<option value="1">处理中</option>
+									<option value="2">交易成功</option>
+									<option value="3">交易失败</option>
+								</select>
+							</li>
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+							    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset('select-form')"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+
+			<div class="col-sm-12 search-collapse">
+			    <p class="select-title">复杂条件查询</p>
+				<form id="complex-form">
+					<div class="select-list">
+						<ul>
+							<li>
+								<label style="width: 80px">商户编号:</label>
+								<input type="text" name="userId"/>
+							</li>
+							<li>
+								<label style="width: 80px">订单号:</label>
+								<input type="text" name="orderNo"/>
+							</li>
+							<li>
+								<label style="width: 80px">日期:</label>
+								<input type="text" class="time-input" placeholder="日期"/>
+							</li>
+							<li class="select-selectpicker">
+								<label style="width: 80px">状态:</label>
+								<select class="selectpicker" data-none-selected-text="请选择" multiple>
+									<option value="">所有</option>
+									<option value="0">初始</option>
+									<option value="1">处理中</option>
+									<option value="2">交易成功</option>
+									<option value="3">交易失败</option>
+								</select>
+							</li>
+							<li>
+								<label style="width: 80px">供货商通道:</label>
+								<select>
+									<option value="">所有</option>
+									<option value="0">腾讯</option>
+									<option value="1">天猫</option>
+									<option value="2">京东</option>
+								</select>
+							</li>
+							<li>
+								<label style="width: 80px">来源:</label>
+								<select>
+									<option value="">所有</option>
+									<option value="0">手机</option>
+									<option value="1">电脑</option>
+									<option value="2">第三方</option>
+								</select>
+							</li>
+							<li>
+								<label style="width: 80px">运营商:</label>
+								<select>
+									<option value="">所有</option>
+									<option value="0">移动</option>
+									<option value="1">电信</option>
+									<option value="2">联通</option>
+								</select>
+							</li>
+							<li class="select-time">
+								<label style="width: 80px">回调时间:</label>
+								<input type="text" class="time-input" placeholder="开始时间"/>
+								<span>-</span>
+								<input type="text" class="time-input" placeholder="结束时间"/>
+							</li>
+
+							<li>
+								<a class="btn btn-primary btn-rounded btn-sm m50" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+							    <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset('complex-form')"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+							</li>
+						</ul>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+	<th:block th:include="include :: footer" />
+	<th:block th:include="include :: bootstrap-select-js" />
+	<th:block th:include="include :: jquery-cxselect-js" />
+
+	<script th:inline="javascript">
+	    // 直接返回获取
+   		var data = [{"v":"taobao","n":"淘宝","s":[{"v":"tm","n":"天猫"},{"v":"jhs","n":"聚划算"}]},{"v":"jd","n":"京东","s":[{"v":"jdcs","n":"京东超市"},{"v":"jdsx","n":"京东生鲜"}]}];
+    	$('#element').cxSelect({
+    	  selects: ['type', 'router'],
+    	  jsonValue: 'v',
+    	  data: data
+    	});
+    </script>
+</body>
+</html>

+ 185 - 0
leiSP-admin/src/main/resources/templates/demo/table/subdata.html

@@ -0,0 +1,185 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+	<th:block th:include="include :: header('主子表提交')" />
+    <th:block th:include="include :: datetimepicker-css" />
+</head>
+<body class="gray-bg">
+    <div class="main-content">
+        <form id="form-add" class="form-horizontal">
+            <input name="deptId" type="hidden" id="treeId"/>
+            <h4 class="form-header h4">客户信息</h4>
+            <div class="row">
+            	<div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">客户名称:</label>
+                        <div class="col-sm-8">
+                            <input name="name" placeholder="请输入客户名称" class="form-control" type="text" maxlength="30">
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">用户性别:</label>
+                        <div class="col-sm-8">
+                            <select name="sex" class="form-control" th:with="type=${@dict.getType('sys_user_sex')}">
+				                <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+				            </select>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">手机号码:</label>
+                        <div class="col-sm-8">
+                            <input id="phonenumber" name="phonenumber" placeholder="请输入手机号码" class="form-control" type="text" maxlength="11">
+                        </div>
+                    </div>
+                </div>
+                <div class="col-sm-6">
+                    <div class="form-group">
+                        <label class="col-sm-4 control-label is-required">生日:</label>
+                        <div class="col-sm-8">
+                            <div class="input-group date">
+		                        <input name="birthday" class="form-control" placeholder="yyyy-MM-dd" type="text">
+		                        <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+		                    </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-sm-12">
+                    <div class="form-group">
+                        <label class="col-xs-2 control-label">备注:</label>
+                        <div class="col-xs-10">
+                            <textarea name="remark" maxlength="500" class="form-control" rows="3"></textarea>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <h4 class="form-header h4">商品数据</h4>
+            <div class="row">
+                <div class="col-sm-12">
+                    <button type="button" class="btn btn-white btn-sm" onclick="addColumn()"><i class="fa fa-plus"> 增加</i></button>
+                    <button type="button" class="btn btn-white btn-sm" onclick="sub.delColumn()"><i class="fa fa-minus"> 删除</i></button>
+                    <div class="col-sm-12 select-table table-striped">
+					    <table id="bootstrap-table"></table>
+					</div>
+                </div>
+            </div>
+        </form>
+    </div>
+      
+    <div class="row">
+        <div class="col-sm-offset-5 col-sm-10">
+            <button type="button" class="btn btn-sm btn-primary" onclick="submitHandler()"><i class="fa fa-check"></i>保 存</button>&nbsp;
+            <button type="button" class="btn btn-sm btn-danger" onclick="closeItem()"><i class="fa fa-reply-all"></i>关 闭 </button>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: datetimepicker-js" />
+    <script th:src="@{/js/jquery.tmpl.js}"></script>
+	<script th:inline="javascript">
+	    $(function() {
+		    var options = {
+                pagination: false,
+		        showSearch: false,
+                showRefresh: false,
+                showToggle: false,
+                showColumns: false,
+		        columns: [{
+		            checkbox: true
+		        },
+		        {
+		        	field: 'index',
+		        	align: 'center',
+		        	title: "序号",
+                    formatter: function (value, row, index) {
+                    	var columnIndex = $.common.sprintf("<input type='hidden' name='index' value='%s'>", $.table.serialNumber(index));
+                    	return columnIndex + $.table.serialNumber(index);
+                    }
+                },
+		        {
+		            field: 'name',
+		            align: 'center',
+		            title: '商品名称',
+		            formatter: function(value, row, index) {
+		            	var html = $.common.sprintf("<input class='form-control' type='text' name='goods[%s].name' value='%s'>", index, value);
+		        		return html;
+                    }
+		        },
+		        {
+		            field: 'weight',
+		            align: 'center',
+		            title: '商品重量',
+		            formatter: function(value, row, index) {
+		            	var html = $.common.sprintf("<input class='form-control' type='text' name='goods[%s].weight' value='%s'>", index, value);
+		        		return html;
+                    }
+		        },
+		        {
+		            field: 'price',
+		            align: 'center',
+		            title: '商品价格',
+		            formatter: function(value, row, index) {
+		            	var html = $.common.sprintf("<input class='form-control' type='text' name='goods[%s].price' value='%s'>", index, value);
+		        		return html;
+                    }
+		        },
+		        {
+		            field: 'type',
+		            align: 'center',
+		            title: '商品种类',
+		            formatter: function(value, row, index) {
+		        		var data = [{ index: index, type: value }];
+		                return $("#goodsTypeTpl").tmpl(data).html();
+                    }
+		        }]
+		    };
+		    $.table.init(options);
+		});
+	    
+	    /* 主子表-提交 */
+        function submitHandler(index, layero){
+        	var data = $("#form-add").serializeArray();
+			$.operate.saveModal("/demo/operate/customer/add", data);
+        }
+	    
+        $("input[name='birthday']").datetimepicker({
+            format: "yyyy-mm-dd",
+            minView: "month",
+            autoclose: true
+        });
+        
+        function addColumn() {
+        	var count = $("#" + table.options.id).bootstrapTable('getData').length;
+        	sub.editColumn();
+        	
+        	$("#" + table.options.id).bootstrapTable('insertRow', {
+        		index: count,
+                row: {
+                	index: $.table.serialNumber(count),
+                	name: "",
+                	weight: "",
+                	price: "",
+                	type: "",
+                }
+        	});
+        }
+    </script>
+</body>
+</html>
+
+<!-- 商品类型 -->
+<script id="goodsTypeTpl" type="text/x-jquery-tmpl">
+<div>
+<select class='form-control' name='goods[${index}].type'>
+    <option value="">所有</option>
+    <option value="0" {{if type==="0"}}selected{{/if}}>寒性</option>
+    <option value="1" {{if type==="1"}}selected{{/if}}>热性</option>
+</select>
+</div>
+</script>

+ 0 - 0
leiSP-admin/src/main/resources/templates/error/404.html


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff