diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..0e40fe8
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+
+# Default ignored files
+/workspace.xml
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..0900958
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..84c0db6
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml
new file mode 100644
index 0000000..6fec8f4
--- /dev/null
+++ b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml
new file mode 100644
index 0000000..9eb8596
--- /dev/null
+++ b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_alibaba_druid_1_1_9.xml b/.idea/libraries/Maven__com_alibaba_druid_1_1_9.xml
new file mode 100644
index 0000000..344bd1f
--- /dev/null
+++ b/.idea/libraries/Maven__com_alibaba_druid_1_1_9.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_alibaba_druid_spring_boot_starter_1_1_9.xml b/.idea/libraries/Maven__com_alibaba_druid_spring_boot_starter_1_1_9.xml
new file mode 100644
index 0000000..7402ccc
--- /dev/null
+++ b/.idea/libraries/Maven__com_alibaba_druid_spring_boot_starter_1_1_9.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_1_2.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_1_2.xml
new file mode 100644
index 0000000..d41bbbc
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_2_0.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_2_0.xml
new file mode 100644
index 0000000..ed7c028
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_1_2.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_1_2.xml
new file mode 100644
index 0000000..a495bd8
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_2_0.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_2_0.xml
new file mode 100644
index 0000000..997e69b
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_2_0.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_2_0.xml
new file mode 100644
index 0000000..32aac0b
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_generator_3_2_0.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_generator_3_2_0.xml
new file mode 100644
index 0000000..6e572fd
--- /dev/null
+++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_generator_3_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_classmate_1_4_0.xml b/.idea/libraries/Maven__com_fasterxml_classmate_1_4_0.xml
new file mode 100644
index 0000000..bbd3a88
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_classmate_1_4_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml
new file mode 100644
index 0000000..06441f4
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml
new file mode 100644
index 0000000..55b3f7b
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9.xml
new file mode 100644
index 0000000..b007cab
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_9_9.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_9_9.xml
new file mode 100644
index 0000000..7fc8036
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_9_9.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_9_9.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_9_9.xml
new file mode 100644
index 0000000..23c806c
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_9_9.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_9_9.xml b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_9_9.xml
new file mode 100644
index 0000000..fe2eb1b
--- /dev/null
+++ b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_9_9.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_2_1.xml b/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_2_1.xml
new file mode 100644
index 0000000..e9b391b
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_2_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml b/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml
new file mode 100644
index 0000000..f19f6eb
--- /dev/null
+++ b/.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml b/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml
new file mode 100644
index 0000000..b8581a6
--- /dev/null
+++ b/.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_zaxxer_HikariCP_3_2_0.xml b/.idea/libraries/Maven__com_zaxxer_HikariCP_3_2_0.xml
new file mode 100644
index 0000000..8f760a2
--- /dev/null
+++ b/.idea/libraries/Maven__com_zaxxer_HikariCP_3_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml b/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml
new file mode 100644
index 0000000..ff49512
--- /dev/null
+++ b/.idea/libraries/Maven__javax_activation_javax_activation_api_1_2_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml b/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml
new file mode 100644
index 0000000..e74f3ab
--- /dev/null
+++ b/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml b/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
new file mode 100644
index 0000000..6978c0b
--- /dev/null
+++ b/.idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml b/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml
new file mode 100644
index 0000000..059f88f
--- /dev/null
+++ b/.idea/libraries/Maven__javax_xml_bind_jaxb_api_2_3_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__junit_junit_4_12.xml b/.idea/libraries/Maven__junit_junit_4_12.xml
new file mode 100644
index 0000000..d411041
--- /dev/null
+++ b/.idea/libraries/Maven__junit_junit_4_12.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__mysql_mysql_connector_java_8_0_17.xml b/.idea/libraries/Maven__mysql_mysql_connector_java_8_0_17.xml
new file mode 100644
index 0000000..a84c3cf
--- /dev/null
+++ b/.idea/libraries/Maven__mysql_mysql_connector_java_8_0_17.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_16.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_16.xml
new file mode 100644
index 0000000..cc556d1
--- /dev/null
+++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_16.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_16.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_16.xml
new file mode 100644
index 0000000..d7404f2
--- /dev/null
+++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_16.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml b/.idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml
new file mode 100644
index 0000000..b3d3858
--- /dev/null
+++ b/.idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__net_minidev_json_smart_2_3.xml b/.idea/libraries/Maven__net_minidev_json_smart_2_3.xml
new file mode 100644
index 0000000..1083023
--- /dev/null
+++ b/.idea/libraries/Maven__net_minidev_json_smart_2_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml
new file mode 100644
index 0000000..fe93f54
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml
new file mode 100644
index 0000000..889bf4f
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_22.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_22.xml
new file mode 100644
index 0000000..7f64b5c
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_22.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_22.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_22.xml
new file mode 100644
index 0000000..6a33338
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_22.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_22.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_22.xml
new file mode 100644
index 0000000..9d4c630
--- /dev/null
+++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_22.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml b/.idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml
new file mode 100644
index 0000000..4d16d46
--- /dev/null
+++ b/.idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_freemarker_freemarker_2_3_28.xml b/.idea/libraries/Maven__org_freemarker_freemarker_2_3_28.xml
new file mode 100644
index 0000000..3471c5b
--- /dev/null
+++ b/.idea/libraries/Maven__org_freemarker_freemarker_2_3_28.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
new file mode 100644
index 0000000..f58bbc1
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
new file mode 100644
index 0000000..78dbe45
--- /dev/null
+++ b/.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_0_17_Final.xml b/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_0_17_Final.xml
new file mode 100644
index 0000000..4025781
--- /dev/null
+++ b/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_0_17_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
new file mode 100644
index 0000000..5f7dd01
--- /dev/null
+++ b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml b/.idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml
new file mode 100644
index 0000000..159204f
--- /dev/null
+++ b/.idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mybatis_mybatis_3_5_2.xml b/.idea/libraries/Maven__org_mybatis_mybatis_3_5_2.xml
new file mode 100644
index 0000000..5a8050c
--- /dev/null
+++ b/.idea/libraries/Maven__org_mybatis_mybatis_3_5_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_0_2.xml b/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_0_2.xml
new file mode 100644
index 0000000..d35eb55
--- /dev/null
+++ b/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_0_2.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_mybatis_mybatis_typehandlers_jsr310_1_0_1.xml b/.idea/libraries/Maven__org_mybatis_mybatis_typehandlers_jsr310_1_0_1.xml
new file mode 100644
index 0000000..3c09f02
--- /dev/null
+++ b/.idea/libraries/Maven__org_mybatis_mybatis_typehandlers_jsr310_1_0_1.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml b/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
new file mode 100644
index 0000000..af41e3b
--- /dev/null
+++ b/.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml b/.idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml
new file mode 100644
index 0000000..0bf8cf2
--- /dev/null
+++ b/.idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml
new file mode 100644
index 0000000..9843fa4
--- /dev/null
+++ b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml b/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml
new file mode 100644
index 0000000..c4c54d6
--- /dev/null
+++ b/.idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_26.xml b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_26.xml
new file mode 100644
index 0000000..087b2a4
--- /dev/null
+++ b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_26.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml
new file mode 100644
index 0000000..6545f77
--- /dev/null
+++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..e098eaa
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..3108be2
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..6256585
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_freemarker_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_freemarker_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..a555724
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_freemarker_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..dd27959
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..e9aa2ba
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..17279d7
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..f38f3a4
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..521383a
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..1290a0a
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..a01bcfe
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_7_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_7_RELEASE.xml
new file mode 100644
index 0000000..5169e85
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_7_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_aop_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_aop_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..3ce8ae7
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_aop_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_beans_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..71780d8
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_beans_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_context_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..da2e132
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_context_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_context_support_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_support_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..3ee481d
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_context_support_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_core_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_core_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..224ad69
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_core_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_expression_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_expression_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..e71b57d
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_expression_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_jcl_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_jcl_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..f50d9e8
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_jcl_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_jdbc_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_jdbc_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..096a5b0
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_jdbc_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_test_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_test_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..6e85969
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_test_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_tx_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_tx_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..42759ee
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_tx_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_web_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_web_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..29e7d75
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_web_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_springframework_spring_webmvc_5_1_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_webmvc_5_1_9_RELEASE.xml
new file mode 100644
index 0000000..67c298f
--- /dev/null
+++ b/.idea/libraries/Maven__org_springframework_spring_webmvc_5_1_9_RELEASE.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_3.xml b/.idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_3.xml
new file mode 100644
index 0000000..aed7fe2
--- /dev/null
+++ b/.idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml
new file mode 100644
index 0000000..7e63769
--- /dev/null
+++ b/.idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..decbc49
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..0291125
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/sp-archetype.iml b/.idea/sp-archetype.iml
new file mode 100644
index 0000000..d6ebd48
--- /dev/null
+++ b/.idea/sp-archetype.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/scripts/sql/sp_sys_dict.sql b/scripts/sql/sp_sys_dict.sql
new file mode 100644
index 0000000..039d690
--- /dev/null
+++ b/scripts/sql/sp_sys_dict.sql
@@ -0,0 +1,51 @@
+/*
+SQLyog Community v13.1.5 (64 bit)
+MySQL - 5.7.24 : Database - sparchetype
+*********************************************************************
+*/
+
+/*!40101 SET NAMES utf8 */;
+
+/*!40101 SET SQL_MODE=''*/;
+
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+CREATE DATABASE /*!32312 IF NOT EXISTS*/`sparchetype` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
+
+USE `sparchetype`;
+
+/*Table structure for table `sp_sys_dict` */
+
+DROP TABLE IF EXISTS `sp_sys_dict`;
+
+CREATE TABLE `sp_sys_dict` (
+ `id` varchar(64) NOT NULL COMMENT 'id',
+ `name` varchar(64) NOT NULL COMMENT '标签名',
+ `value` varchar(64) NOT NULL COMMENT '数据值',
+ `type` varchar(64) NOT NULL COMMENT '类型',
+ `descr` varchar(255) DEFAULT NULL COMMENT '描述',
+ `sort_num` int(11) NOT NULL COMMENT '排序(升序)',
+ `parent_id` varchar(64) DEFAULT NULL COMMENT '父级id',
+ `status` char(1) NOT NULL COMMENT '状态:逻辑已删除值(默认为 1); 逻辑未删除值(默认为 0)',
+ `created` datetime NOT NULL COMMENT '创建时间',
+ `created_by` varchar(64) NOT NULL COMMENT '创建人',
+ `last_upd` datetime NOT NULL COMMENT '最后更新时间',
+ `last_upd_by` varchar(64) NOT NULL COMMENT '最后更新人',
+ PRIMARY KEY (`id`),
+ KEY `idx_sp_sys_dict_name` (`name`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统字典表';
+
+/*Data for the table `sp_sys_dict` */
+
+insert into `sp_sys_dict`(`id`,`name`,`value`,`type`,`descr`,`sort_num`,`parent_id`,`status`,`created`,`created_by`,`last_upd`,`last_upd_by`) values
+('1166284627817877506','test','test','test','test',1,'0','0','2019-08-27 17:41:17','test','2019-08-27 17:41:17','test'),
+('1300490103029792','是','1','yes_no','是/否',1,'0','0','2019-08-26 00:00:00','sp','2019-08-26 16:08:47','sp'),
+('1300490690232352','否','1','yes_no','是/否',2,'0','0','2019-08-26 00:00:00','sp','2019-08-26 16:12:05','sp'),
+('1300670302912544','test','test','test','test',1,'0','0','2019-08-27 15:58:52','test','2019-08-27 15:58:52','test');
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
diff --git a/sparchetype/.gitignore b/sparchetype/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/sparchetype/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
diff --git a/sparchetype/.mvn/wrapper/MavenWrapperDownloader.java b/sparchetype/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..72308aa
--- /dev/null
+++ b/sparchetype/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,114 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL =
+ "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if(mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if(mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: : " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if(!outputFile.getParentFile().exists()) {
+ if(!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/sparchetype/.mvn/wrapper/maven-wrapper.jar b/sparchetype/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..01e6799
Binary files /dev/null and b/sparchetype/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/sparchetype/.mvn/wrapper/maven-wrapper.properties b/sparchetype/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..cd0d451
--- /dev/null
+++ b/sparchetype/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip
diff --git a/sparchetype/mvnw b/sparchetype/mvnw
new file mode 100644
index 0000000..8b9da3b
--- /dev/null
+++ b/sparchetype/mvnw
@@ -0,0 +1,286 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+ # TODO classpath?
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found .mvn/wrapper/maven-wrapper.jar"
+ fi
+else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+ fi
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+ while IFS="=" read key value; do
+ case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+ esac
+ done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Downloading from: $jarUrl"
+ fi
+ wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+
+ if command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ wget "$jarUrl" -O "$wrapperJarPath"
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ curl -o "$wrapperJarPath" "$jarUrl"
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ if [ -e "$javaClass" ]; then
+ if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Compiling MavenWrapperDownloader.java ..."
+ fi
+ # Compiling the Java class
+ ("$JAVA_HOME/bin/javac" "$javaClass")
+ fi
+ if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ # Running the downloader
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Running MavenWrapperDownloader.java ..."
+ fi
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+ echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/sparchetype/mvnw.cmd b/sparchetype/mvnw.cmd
new file mode 100644
index 0000000..fef5a8f
--- /dev/null
+++ b/sparchetype/mvnw.cmd
@@ -0,0 +1,161 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"
+FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO (
+ IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ echo Found %WRAPPER_JAR%
+) else (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"
+ echo Finished downloading %WRAPPER_JAR%
+)
+@REM End of extension
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/sparchetype/pom.xml b/sparchetype/pom.xml
index 5a3e675..9e6e7cb 100644
--- a/sparchetype/pom.xml
+++ b/sparchetype/pom.xml
@@ -1,20 +1,19 @@
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
org.springframework.boot
spring-boot-starter-parent
- 2.1.4.RELEASE
+ 2.1.7.RELEASE
com.songpeng
sparchetype
- 0.0.1
- ${project.artifactId}
+ 0.0.1-SNAPSHOT
+ sparchetype
maven 骨架生成所需项目
jar
- https://gitee.com/iamsongpeng
1.8
@@ -23,19 +22,7 @@
org.springframework.boot
- spring-boot-starter
-
-
- org.springframework.boot
- spring-boot-starter-logging
-
-
-
-
-
- org.springframework.boot
- spring-boot-starter-log4j
- 1.2.5.RELEASE
+ spring-boot-starter-web
@@ -43,97 +30,72 @@
spring-boot-starter-test
test
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
- org.springframework.boot
- spring-boot-starter-security
-
-
-
- org.thymeleaf.extras
- thymeleaf-extras-springsecurity5
-
-
-
org.projectlombok
lombok
- provided
+ true
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.1.2
-
- org.springframework.boot
- spring-boot-starter-thymeleaf
+ com.alibaba
+ druid-spring-boot-starter
+ 1.1.9
-
- net.sourceforge.nekohtml
- nekohtml
- 1.9.22
-
-
-
-
- org.mybatis.spring.boot
- mybatis-spring-boot-starter
- 2.0.1
-
-
-
-
- tk.mybatis
- mapper-spring-boot-starter
- 2.1.5
-
-
-
-
- org.postgresql
- postgresql
- 42.2.2
+ mysql
+ mysql-connector-java
runtime
-
+
- com.github.pagehelper
- pagehelper-spring-boot-starter
- 1.2.10
+ org.mybatis
+ mybatis-typehandlers-jsr310
+ 1.0.1
-
+
- com.alibaba
- druid
- 1.1.16
+ org.springframework.boot
+ spring-boot-starter-freemarker
-
+
- com.alibaba
- fastjson
- 1.2.46
+ com.baomidou
+ mybatis-plus-generator
+ 3.2.0
-
+
- org.apache.commons
- commons-lang3
- 3.9
+ com.fasterxml.jackson.module
+ jackson-module-parameter-names
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jdk8
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
-
-
-
+
+
+
+
+
+
+
diff --git a/sparchetype/src/main/java/com/songpeng/SpArchetypeApplication.java b/sparchetype/src/main/java/com/songpeng/SpArchetypeApplication.java
deleted file mode 100644
index b0fd07c..0000000
--- a/sparchetype/src/main/java/com/songpeng/SpArchetypeApplication.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.songpeng;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-/**
- * 启动类
- *
- * @author songpeng
- * @date 2019-04-19
- */
-@SpringBootApplication
-@tk.mybatis.spring.annotation.MapperScan(basePackages = "com.songpeng.*.mapper")
-public class SpArchetypeApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(SpArchetypeApplication.class, args);
- }
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/blog/controller/client/BlogController.java b/sparchetype/src/main/java/com/songpeng/blog/controller/client/BlogController.java
deleted file mode 100644
index cdef331..0000000
--- a/sparchetype/src/main/java/com/songpeng/blog/controller/client/BlogController.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.songpeng.blog.controller.client;
-
-import com.songpeng.blog.service.BlogService;
-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.RequestMapping;
-
-/**
- * Controller
- * Created by songpeng on 2019/5/11.
- */
-@RequestMapping("/blog")
-@Controller("clientBlogController")
-public class BlogController {
-
- @Autowired
- private BlogService blogService;
-
- @GetMapping
- String blog() {
- return "client/blog/index";
- }
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/blog/service/BlogService.java b/sparchetype/src/main/java/com/songpeng/blog/service/BlogService.java
deleted file mode 100644
index ecbc7df..0000000
--- a/sparchetype/src/main/java/com/songpeng/blog/service/BlogService.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.songpeng.blog.service;
-
-/**
- *
- */
-public interface BlogService {
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/blog/service/impl/BlogServiceImpl.java b/sparchetype/src/main/java/com/songpeng/blog/service/impl/BlogServiceImpl.java
deleted file mode 100644
index cd73723..0000000
--- a/sparchetype/src/main/java/com/songpeng/blog/service/impl/BlogServiceImpl.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.songpeng.blog.service.impl;
-
-import com.songpeng.blog.service.BlogService;
-import org.springframework.stereotype.Service;
-
-/**
- * Controller
- * @author songpeng
- * @date 2019/5/21
- */
-@Service
-public class BlogServiceImpl implements BlogService {
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/advice/ApiAdvice.java b/sparchetype/src/main/java/com/songpeng/common/advice/ApiAdvice.java
deleted file mode 100644
index ef12577..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/advice/ApiAdvice.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.songpeng.common.advice;
-
-import com.songpeng.common.utils.ApiResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpStatus;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.MissingServletRequestParameterException;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * Controller
- *
- * @author songpeng
- * @date 2019-04-20
- */
-@ControllerAdvice
-public class ApiAdvice {
-
- public static final Logger LOGGER = LoggerFactory.getLogger(ApiAdvice.class);
-
- /**
- * 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器
- *
- * @param binder
- */
- @InitBinder
- public void initBinder(WebDataBinder binder) {
-
- }
-
- /**
- * 把值绑定到Model中,使全局@RequestMapping可以获取到该值
- *
- * @param model
- */
- @ModelAttribute
- public void addAttributes(Model model) {
- model.addAttribute("author", "Song Peng");
- }
-
- /**
- * API接口调用异常处理
- *
- * @param e 异常信息
- * @return API调用结果对象
- */
- @ResponseStatus(HttpStatus.OK)
- @ExceptionHandler(MissingServletRequestParameterException.class)
- @ResponseBody
- public ApiResponse handleMissingServletRequestParameterException(HttpServletRequest request, MissingServletRequestParameterException e) throws Exception {
- return ApiResponse.error(ApiResponse.REQUIRED_PARAM_CODE, ApiResponse.REQUIRED_PARAM_MSG);
- }
-
- /**
- * API接口调用异常处理
- *
- * @param e 异常信息
- * @return API调用结果对象
- */
- @ResponseStatus(HttpStatus.OK)
- @ExceptionHandler(Exception.class)
- @ResponseBody
- public ApiResponse handle(HttpServletRequest request, Exception e) throws Exception {
- LOGGER.error("API接口调用异常: {}", request.getRequestURI(), e);
- return ApiResponse.error(ApiResponse.ERROR_CODE, ApiResponse.ERROR_MSG);
- }
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/advice/package-info.java b/sparchetype/src/main/java/com/songpeng/common/advice/package-info.java
deleted file mode 100644
index c899149..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/advice/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * 这里放和处理通用异常相关的模型
- */
-package com.songpeng.common.advice;
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/HttpConverterConfig.java b/sparchetype/src/main/java/com/songpeng/common/config/HttpConverterConfig.java
deleted file mode 100644
index bcd1a1c..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/HttpConverterConfig.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.songpeng.common.config;
-
-import com.alibaba.fastjson.serializer.SerializerFeature;
-import com.alibaba.fastjson.support.config.FastJsonConfig;
-import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
-import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.http.MediaType;
-import org.springframework.http.converter.HttpMessageConverter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 设置 FastJson
- * 这个并不会覆盖掉Jackson,只不过添加了一个比默认的更优先的HttpMessageConverter
- *
- * @author songpeng
- * @date 2019/6/22
- */
-@Configuration
-public class HttpConverterConfig {
-
- @Bean
- public HttpMessageConverters fastJsonHttpMessageConverters() {
- //1.需要定义一个convert转换消息的对象
- FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
- //2:添加fastJson的配置信息
- FastJsonConfig fastJsonConfig = new FastJsonConfig();
- //TODO 第一个SerializerFeature.PrettyFormat可以省略,毕竟这会造成额外的内存消耗和流量,
- //第二个是用来指定当属性值为null是是否输出:pro:null SerializerFeature.SkipTransientField
- //WriteNullListAsEmpty:List字段如果为null,输出为[],而非null。
- //WriteNullStringAsEmpty:字符类型字段如果为null,输出为"",而非null。
- //DisableCircularReferenceDetect:消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
- //WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null。
- //WriteMapNullValue:是否输出值为null的字段,默认为false。
- fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect,
- SerializerFeature.WriteMapNullValue,
- SerializerFeature.WriteNullListAsEmpty,
- SerializerFeature.WriteNullStringAsEmpty,
- SerializerFeature.WriteNullBooleanAsFalse
- );
-// fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
- // 3.处理中文乱码问题
- List fastMediaTypes = new ArrayList<>();
- fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
- //4.在convert中添加配置信息
- fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
- fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
- HttpMessageConverter> converter = fastJsonHttpMessageConverter;
- return new HttpMessageConverters(converter);
- }
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/WebMvcConfig.java b/sparchetype/src/main/java/com/songpeng/common/config/WebMvcConfig.java
deleted file mode 100644
index e7a3dc3..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/WebMvcConfig.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.songpeng.common.config;
-
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-
-/**
- * 视图类配置
- *
- * @author songpeng
- * @date 2019/6/17
- */
-@Configuration
-public class WebMvcConfig implements WebMvcConfigurer {
- @Override
- public void addViewControllers(ViewControllerRegistry registry) {
- registry.addViewController("/sign_in").setViewName("login");
- registry.addViewController("/sign_up").setViewName("registry");
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomAccessDecisionManager.java b/sparchetype/src/main/java/com/songpeng/common/config/security/CustomAccessDecisionManager.java
deleted file mode 100644
index af70aa1..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomAccessDecisionManager.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.songpeng.common.config.security;
-
-import org.springframework.security.access.AccessDecisionManager;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.authentication.InsufficientAuthenticationException;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
-
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- * @author songpeng
- * @date 2019/6/20
- */
-@Component
-public class CustomAccessDecisionManager implements AccessDecisionManager {
-
- /**
- * decide 方法是判定是否拥有权限的决策方法,
- * authentication 是释CustomUserService中循环添加到 GrantedAuthority 对象中的权限信息集合.
- * object 包含客户端发起的请求的requset信息,可转换为 HttpServletRequest request = ((FilterInvocation) object).getHttpRequest();
- * configAttributes 为MyInvocationSecurityMetadataSource的getAttributes(Object object)这个方法返回的结果,
- * 此方法是为了判定用户请求的url 是否在权限表中,如果在权限表中,则返回给 decide 方法,用来判定用户是否有此权限。如果不在权限表中则放行。
- *
- * @param authentication
- * @param object
- * @param collection
- * @throws AccessDeniedException
- * @throws InsufficientAuthenticationException
- */
- @Override
- public void decide(Authentication authentication, Object object, Collection collection) throws AccessDeniedException, InsufficientAuthenticationException {
- if (CollectionUtils.isEmpty(collection)) {
- return;
- }
- for (ConfigAttribute configAttribute : collection) {
- String needRole = configAttribute.getAttribute();
- for (GrantedAuthority ga : authentication.getAuthorities()) {
- if (needRole.trim().equals(ga.getAuthority().trim()) || needRole.trim().equals("ROLE_ANONYMOUS")) {
- return;
- }
- }
- }
- throw new AccessDeniedException("无权限");
- }
-
- @Override
- public boolean supports(ConfigAttribute configAttribute) {
- return true;
- }
-
- @Override
- public boolean supports(Class> aClass) {
- return true;
- }
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomFilterInvocationSecurityMetadataSource.java b/sparchetype/src/main/java/com/songpeng/common/config/security/CustomFilterInvocationSecurityMetadataSource.java
deleted file mode 100644
index 4b816f9..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomFilterInvocationSecurityMetadataSource.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package com.songpeng.common.config.security;
-
-import com.songpeng.common.utils.StringUtil;
-import com.songpeng.system.domain.SysMenu;
-import com.songpeng.system.domain.SysRole;
-import com.songpeng.system.service.SysMenuService;
-import com.songpeng.system.service.SysRoleService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.env.PropertySource;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.access.SecurityConfig;
-import org.springframework.security.web.FilterInvocation;
-import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
-import org.springframework.stereotype.Component;
-import org.springframework.util.AntPathMatcher;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.PathMatcher;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 权限资源: 获取请求url需要的权限
- * 主要责任就是当访问一个url时返回这个url所需要的访问权限
- *
- * @author SongPeng
- * @date 2019/6/21
- */
-@Component
-public class CustomFilterInvocationSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomFilterInvocationSecurityMetadataSource.class);
-
- @Value("${security.ignoring}")
- private String securityIgnoring;
-
- @Value("${security.intercept}")
- private String securityIntercept;
-
- @Autowired
- private SysMenuService sysMenuService;
-
- @Autowired
- private SysRoleService sysRoleService;
-
- private PathMatcher matcher = new AntPathMatcher();
-
- private String indexUrl = "/index.html";
-
- /**
- * 方法返回本次访问需要的权限,可以有多个权限。
- * 在上面的实现中如果没有匹配的url直接返回null,
- * 也就是没有配置权限的url默认都为白名单,想要换成默认是黑名单只要修改这里即可
- *
- * @param object
- * @return
- * @throws IllegalArgumentException
- */
- @Override
- public Collection getAttributes(Object object) throws IllegalArgumentException {
- //获取当前访问url
- String url = ((FilterInvocation) object).getRequestUrl();
- LOGGER.info("获取当前访问url = {}", url);
- int firstQuestionMarkIndex = url.indexOf("?");
- if (firstQuestionMarkIndex != -1) {
- url = url.substring(0, firstQuestionMarkIndex);
- }
- List result = new ArrayList<>();
-
- try {
- //设置不拦截
- if (StringUtil.isNotBlank(securityIgnoring)) {
- String[] paths = securityIgnoring.split(",");
- //判断是否符合规则
- for (String path : paths) {
- String temp = StringUtil.clearSpace(path);
- if (matcher.match(temp, url)) {
- ConfigAttribute attribute = new SecurityConfig("ROLE_ANONYMOUS");
- result.add(attribute);
- return result;
- }
- }
- }
-
- //如果不是拦截列表里的
- if (!isIntercept(url)) {
- ConfigAttribute attribute = new SecurityConfig("ROLE_ANONYMOUS");
- result.add(attribute);
- return result;
- }
-
- //查询匹配的url
- List menuList = sysMenuService.getMenusByUrl(url);
- if (!CollectionUtils.isEmpty(menuList)) {
- for (SysMenu menu : menuList) {
- //查询拥有该菜单权限的角色列表
- List roles = sysRoleService.getRolesByMenuId(menu.getId());
- if (!CollectionUtils.isEmpty(roles)) {
- for (SysRole role : roles) {
-// ConfigAttribute conf = new SecurityConfig(role.getCode());
- ConfigAttribute conf = new SecurityConfig("ROLE_" + role.getCode().toUpperCase());
- result.add(conf);
- }
- }
- }
- }
- } catch (Exception e) {
- LOGGER.error("获取本次访问需要的权限异常", e);
- }
- return result;
- }
-
- @Override
- public Collection getAllConfigAttributes() {
- return null;
- }
-
- @Override
- public boolean supports(Class> aClass) {
- return true;
- }
-
- /**
- * 判断是否需要过滤
- *
- * @param url
- * @return
- */
- public boolean isIntercept(String url) {
- if (StringUtil.isNotBlank(securityIntercept)) {
- String[] filterPaths = securityIntercept.split(",");
- for (String filter : filterPaths) {
- if (matcher.match(StringUtil.clearSpace(filter), url) & !matcher.match(indexUrl, url)) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- public String getIndexUrl() {
- return indexUrl;
- }
-
- public void setIndexUrl(String indexUrl) {
- this.indexUrl = indexUrl;
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthEntryPoint.java b/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthEntryPoint.java
deleted file mode 100644
index d05ec51..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthEntryPoint.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.songpeng.common.config.security;
-
-import com.songpeng.common.utils.StringUtil;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.AuthenticationEntryPoint;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * 授权认证失败后调用
- */
-public class CustomLoginAuthEntryPoint implements AuthenticationEntryPoint {
-
- private String loginUrl = "/login.html";
-
- @Value("${security.logoutSuccessUrl}")
- private String securityLogoutSuccessUrl;
-
- @Override
- public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
-
- if (StringUtil.isNotBlank(securityLogoutSuccessUrl)) {
- loginUrl = securityLogoutSuccessUrl;
- }
- if (isAjaxRequest(request)) {
- response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage());
- } else {
- response.sendRedirect(loginUrl);
- }
- }
-
- public static boolean isAjaxRequest(HttpServletRequest request) {
- String ajaxFlag = request.getHeader("X-Requested-With");
- return ajaxFlag != null && "XMLHttpRequest".equals(ajaxFlag);
- }
-
- public String getLoginUrl() {
- return loginUrl;
- }
-
- public void setLoginUrl(String loginUrl) {
- this.loginUrl = loginUrl;
- }
-
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthFailureHandler.java b/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthFailureHandler.java
deleted file mode 100644
index fa1fcc5..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthFailureHandler.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.songpeng.common.config.security;
-
-import com.songpeng.common.utils.ApiResponse;
-import com.songpeng.common.utils.JsonUtil;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.CredentialsExpiredException;
-import org.springframework.security.authentication.DisabledException;
-import org.springframework.security.authentication.LockedException;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.AuthenticationFailureHandler;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * 登陆失败处理
- */
-public class CustomLoginAuthFailureHandler implements AuthenticationFailureHandler {
-
- @Override
- public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
- ApiResponse responseData;
- //密码错误
- if (exception instanceof BadCredentialsException) {
- responseData = ApiResponse.error("密码错误");
- } else if (exception instanceof LockedException) {
- //账户被锁
- responseData = ApiResponse.error("用户被锁定");
- } else if (exception instanceof DisabledException) {
- //账户未启用
- responseData = ApiResponse.error("用户未启用");
- } else if (exception instanceof CredentialsExpiredException) {
- //账户过期
- responseData = ApiResponse.error("用户已过期");
- } else {
- //其他情况
- responseData = ApiResponse.error(exception.getMessage());
- }
- JsonUtil.writeJson(response, responseData);
- }
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthSuccessHandler.java b/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthSuccessHandler.java
deleted file mode 100644
index f1d60fe..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginAuthSuccessHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.songpeng.common.config.security;
-
-import com.songpeng.common.utils.ApiResponse;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.WebAttributes;
-import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
-import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
-import org.springframework.security.web.savedrequest.RequestCache;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 登陆成功处理
- */
-public class CustomLoginAuthSuccessHandler implements AuthenticationSuccessHandler {
- private RequestCache requestCache = new HttpSessionRequestCache();
- private String authSuccessUrl = "index.html";
-
- @Override
- public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
- Map data = new HashMap<>(2);
- data.put("index", request.getContextPath() + authSuccessUrl);
- ApiResponse baseMessage = ApiResponse.ok(data);
- requestCache.removeRequest(request, response);
- clearAuthenticationAttributes(request);
- response.sendRedirect(authSuccessUrl);
- }
-
- protected final void clearAuthenticationAttributes(HttpServletRequest request) {
- HttpSession session = request.getSession(false);
- if (null == session) {
- return;
- }
- session.removeAttribute(WebAttributes.AUTHENTICATION_EXCEPTION);
- }
-
- public void setRequestCache(RequestCache requestCache) {
- this.requestCache = requestCache;
- }
-
- public String getAuthSuccessUrl() {
- return authSuccessUrl;
- }
-
- public void setAuthSuccessUrl(String authSuccessUrl) {
- this.authSuccessUrl = authSuccessUrl;
- }
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginFilter.java b/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginFilter.java
deleted file mode 100644
index 58daf09..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLoginFilter.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.songpeng.common.config.security;
-
-import com.songpeng.common.utils.StringUtil;
-import org.springframework.security.authentication.AuthenticationServiceException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * 用户登陆
- */
-public class CustomLoginFilter extends AbstractAuthenticationProcessingFilter {
- private static final String SPRING_SECURITY_RESTFUL_USERNAME_KEY = "username";
- private static final String SPRING_SECURITY_RESTFUL_PASSWORD_KEY = "password";
- private static final String SPRING_SECURITY_RESTFUL_LOGIN_URL = "/login";
- private String usernameParameter = SPRING_SECURITY_RESTFUL_USERNAME_KEY;
- private String passwordParameter = SPRING_SECURITY_RESTFUL_PASSWORD_KEY;
- private boolean postOnly = true;
- public CustomLoginFilter() {
- super(new AntPathRequestMatcher(SPRING_SECURITY_RESTFUL_LOGIN_URL, "POST"));
- }
- @Override
- public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
- if (postOnly && !request.getMethod().equals("POST")) {
- throw new AuthenticationServiceException(
- "Authentication method not supported: " + request.getMethod());
- }
- String username = obtainUsername(request);
- String password = obtainPassword(request);
- if (StringUtil.isBlank(username)) {
- username = "";
- }
- if (StringUtil.isBlank(password)) {
- password = "";
- }
- username = username.trim();
- UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
- username, password);
- // Allow subclasses to set the "details" property
- setDetails(request, authRequest);
- return this.getAuthenticationManager().authenticate(authRequest);
- }
- private void setDetails(HttpServletRequest request,
- UsernamePasswordAuthenticationToken authRequest) {
- authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
- }
- private String obtainPassword(HttpServletRequest request) {
- return request.getParameter(passwordParameter);
- }
- private String obtainUsername(HttpServletRequest request) {
- return request.getParameter(usernameParameter);
- }
- public String getUsernameParameter() {
- return usernameParameter;
- }
- public void setUsernameParameter(String usernameParameter) {
- this.usernameParameter = usernameParameter;
- }
- public String getPasswordParameter() {
- return passwordParameter;
- }
- public void setPasswordParameter(String passwordParameter) {
- this.passwordParameter = passwordParameter;
- }
- public boolean isPostOnly() {
- return postOnly;
- }
- public void setPostOnly(boolean postOnly) {
- this.postOnly = postOnly;
- }
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLogoutSuccessHandler.java b/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLogoutSuccessHandler.java
deleted file mode 100644
index 6eec59d..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomLogoutSuccessHandler.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.songpeng.common.config.security;
-
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-
-/**
- * 登出成功处理
- */
-public class CustomLogoutSuccessHandler implements LogoutSuccessHandler {
-
- private String loginUrl = "/login.html";
-
- @Override
- public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
- response.sendRedirect(request.getContextPath() + loginUrl);
- }
-
- public String getLoginUrl() {
- return loginUrl;
- }
-
- public void setLoginUrl(String loginUrl) {
- this.loginUrl = loginUrl;
- }
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomSecurityInterceptor.java b/sparchetype/src/main/java/com/songpeng/common/config/security/CustomSecurityInterceptor.java
deleted file mode 100644
index 576ea8c..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/CustomSecurityInterceptor.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.songpeng.common.config.security;
-
-import org.springframework.security.access.SecurityMetadataSource;
-import org.springframework.security.access.intercept.AbstractSecurityInterceptor;
-import org.springframework.security.access.intercept.InterceptorStatusToken;
-import org.springframework.security.web.FilterInvocation;
-import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
-
-import javax.servlet.*;
-import java.io.IOException;
-
-/**
- *
- * @author SongPeng
- * @date 2019/6/22
- */
-public class CustomSecurityInterceptor extends AbstractSecurityInterceptor implements Filter {
- private FilterInvocationSecurityMetadataSource securityMetadataSource;
-
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- }
-
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
- FilterInvocation fi = new FilterInvocation(request, response, chain);
- invoke(fi);
- }
-
- @Override
- public void destroy() {
- }
-
- @Override
- public Class> getSecureObjectClass() {
- return FilterInvocation.class;
- }
-
- @Override
- public SecurityMetadataSource obtainSecurityMetadataSource() {
- return this.securityMetadataSource;
- }
-
- public void invoke(FilterInvocation fi) throws IOException {
- //fi里面有一个被拦截的url
- //里面调用MyInvocationSecurityMetadataSource的getAttributes(Object object)这个方法获取fi对应的所有权限
- //再调用MyAccessDecisionManager的decide方法来校验用户的权限是否足够
- InterceptorStatusToken token = super.beforeInvocation(fi);
- try {
- //执行下一个拦截器
- fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
- } catch (ServletException e) {
- super.afterInvocation(token, null);
- }
- }
-
- public FilterInvocationSecurityMetadataSource getSecurityMetadataSource() {
- return securityMetadataSource;
- }
-
- public void setSecurityMetadataSource(FilterInvocationSecurityMetadataSource securityMetadataSource) {
- this.securityMetadataSource = securityMetadataSource;
- }
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/config/security/WebSecurityConfig.java b/sparchetype/src/main/java/com/songpeng/common/config/security/WebSecurityConfig.java
deleted file mode 100644
index 7d36c2e..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/config/security/WebSecurityConfig.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package com.songpeng.common.config.security;
-
-import com.songpeng.common.utils.StringUtil;
-import com.songpeng.system.service.impl.SysUserServiceImpl;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-
-/**
- * Controller
- *
- * @author songpeng
- * @date 2019/5/23
- */
-@Configuration
-@EnableWebSecurity
-public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(WebSecurityConfig.class);
-
- @Value("${security.ignoring}")
- private String securityIgnoring;
-
- @Value("${security.successUrl}")
- private String securitySuccessUrl;
-
- @Value("${security.logoutSuccessUrl}")
- private String securityLogoutSuccessUrl;
-
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- String[] paths = null;
- //设置不拦截
- if (StringUtil.isNotBlank(securityIgnoring)) {
- paths = securityIgnoring.split(",");
- paths = StringUtil.clearSpace(paths);
- }
-
- //设置过滤器
- // TODO 1. csrf 暂时关闭
- http.authorizeRequests().antMatchers(paths).permitAll()
- .and()
- .httpBasic()
- .authenticationEntryPoint(getCustomLoginAuthEntryPoint())
- .and()
- .addFilterAt(getCustomLoginFilter(), UsernamePasswordAuthenticationFilter.class)
- .addFilterAt(getCustomSecurityInterceptor(), FilterSecurityInterceptor.class)
- .logout().logoutSuccessHandler(getCustomLogoutSuccessHandler())
- .and()
- .csrf().disable()
- .authorizeRequests()
- .anyRequest().authenticated()
- .and()
- .formLogin()
- .loginProcessingUrl("/login")
- .loginPage("/sign_in")
- .permitAll()
- .and()
- .logout()
- .logoutUrl("/sign_in")
- .permitAll();
-
- LOGGER.debug("配置忽略验证url");
- }
-
- @Autowired
- @Override
- protected void configure(AuthenticationManagerBuilder auth) throws Exception {
- auth.authenticationProvider(getDaoAuthenticationProvider());
- }
-
- /**
- * spring security 配置
- *
- * @return
- */
- @Bean
- public CustomLoginAuthEntryPoint getCustomLoginAuthEntryPoint() {
- return new CustomLoginAuthEntryPoint();
- }
-
- /**
- * 用户验证
- *
- * @return
- */
- @Bean
- public DaoAuthenticationProvider getDaoAuthenticationProvider() {
- DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
- provider.setUserDetailsService(new SysUserServiceImpl());
- provider.setHideUserNotFoundExceptions(false);
- provider.setPasswordEncoder(new BCryptPasswordEncoder());
- return provider;
- }
-
- /**
- * 登陆
- *
- * @return
- */
- @Bean
- public CustomLoginFilter getCustomLoginFilter() {
- CustomLoginFilter filter = new CustomLoginFilter();
- try {
- filter.setAuthenticationManager(this.authenticationManagerBean());
- } catch (Exception e) {
- LOGGER.error("登录失败", e);
- }
- filter.setAuthenticationSuccessHandler(getCustomLoginAuthSuccessHandler());
- filter.setAuthenticationFailureHandler(getCustomLoginAuthFailureHandler());
-
- return filter;
- }
-
- @Bean
- public CustomLoginAuthSuccessHandler getCustomLoginAuthSuccessHandler() {
- CustomLoginAuthSuccessHandler handler = new CustomLoginAuthSuccessHandler();
- if (StringUtil.isNotBlank(securitySuccessUrl)) {
- handler.setAuthSuccessUrl(securitySuccessUrl);
- }
- return handler;
- }
-
- @Bean
- public CustomLoginAuthFailureHandler getCustomLoginAuthFailureHandler() {
- return new CustomLoginAuthFailureHandler();
- }
-
- /**
- * 登出
- *
- * @return
- */
- @Bean
- public CustomLogoutSuccessHandler getCustomLogoutSuccessHandler() {
- CustomLogoutSuccessHandler handler = new CustomLogoutSuccessHandler();
- if (StringUtil.isNotBlank(securityLogoutSuccessUrl)) {
- handler.setLoginUrl(securityLogoutSuccessUrl);
- }
- return handler;
- }
-
- /**
- * 过滤器
- *
- * @return
- */
- @Bean
- public CustomSecurityInterceptor getCustomSecurityInterceptor() {
- CustomSecurityInterceptor interceptor = new CustomSecurityInterceptor();
- interceptor.setAccessDecisionManager(getCustomAccessDecisionManager());
- interceptor.setSecurityMetadataSource(getCustomMetadataSourceService());
- try {
- interceptor.setAuthenticationManager(this.authenticationManagerBean());
- } catch (Exception e) {
- LOGGER.error("", e);
- }
- return interceptor;
- }
-
- @Bean
- public CustomAccessDecisionManager getCustomAccessDecisionManager() {
- return new CustomAccessDecisionManager();
- }
-
- @Bean
- public CustomFilterInvocationSecurityMetadataSource getCustomMetadataSourceService() {
- CustomFilterInvocationSecurityMetadataSource sourceService = new CustomFilterInvocationSecurityMetadataSource();
- if (StringUtil.isNotBlank(securitySuccessUrl)) {
- sourceService.setIndexUrl(securitySuccessUrl);
- }
- return sourceService;
- }
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/ApiResponse.java b/sparchetype/src/main/java/com/songpeng/common/utils/ApiResponse.java
deleted file mode 100644
index 7b7fc60..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/utils/ApiResponse.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.songpeng.common.utils;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * API 接口统一返回对象
- *
- * @author songpeng
- * @date 2019-04-20
- */
-public class ApiResponse extends HashMap {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * 成功编码
- */
- public static final int SUCCESS_CODE = 0;
-
- /**
- * 成功信息
- */
- public static final String SUCCESS_MSG = "成功";
-
- /**
- * 非法调用编码
- */
- public static final int ILLEGAL_CALL_CODE = 94;
-
- /**
- * 非法调用信息
- */
- public static final String ILLEGAL_CALL_MSG = "非法调用";
-
- /**
- * 签名校验失败编码
- */
- public static final int SIGNATURE_ERROR_CODE = 95;
-
- /**
- * 签名校验失败信息
- */
- public static final String SIGNATURE_ERROR_MSG = "签名校验失败";
-
- /**
- * 参数缺失错误
- */
- public static final int REQUIRED_PARAM_CODE = 96;
-
- /**
- * 参数缺失信息
- */
- public static final String REQUIRED_PARAM_MSG = "参数缺失";
-
- /**
- * 参数错误
- */
- public static final int FAIL_PARAM_CODE = 97;
-
- /**
- * 参数错误信息
- */
- public static final String FAIL_PARAM_MSG = "参数错误";
-
- /**
- * 失败编码
- */
- public static final int FAIL_CODE = 98;
-
- /**
- * 失败信息
- */
- public static final String FAIL_MSG = "失败";
-
- /**
- * 异常编码
- */
- public static final int ERROR_CODE = 99;
-
- /**
- * 异常信息
- */
- public static final String ERROR_MSG = "接口异常";
-
- private static final String MSG = "msg";
-
- private static final String CODE = "code";
-
- public ApiResponse() {
- put(CODE, SUCCESS_CODE);
- put(MSG, SUCCESS_MSG);
- }
-
- @Override
- public Object put(String key, Object value) {
- super.put(key, value);
- return this;
- }
-
- public static ApiResponse ok() {
- return new ApiResponse();
- }
-
- public static ApiResponse ok(Map map) {
- ApiResponse response = new ApiResponse();
- response.putAll(map);
- return response;
- }
-
- public static ApiResponse ok(String msg) {
- ApiResponse response = new ApiResponse();
- response.put(MSG, msg);
- return response;
- }
-
- public static ApiResponse error() {
- return error(FAIL_CODE, FAIL_MSG);
- }
-
- public static ApiResponse error(String msg) {
- return error(FAIL_CODE, msg);
- }
-
- public static ApiResponse error(int code, String msg) {
- ApiResponse response = new ApiResponse();
- response.put(CODE, code);
- response.put(MSG, msg);
- return response;
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/CustomMapper.java b/sparchetype/src/main/java/com/songpeng/common/utils/CustomMapper.java
deleted file mode 100644
index a54b5ce..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/utils/CustomMapper.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.songpeng.common.utils;
-
-import tk.mybatis.mapper.common.Mapper;
-import tk.mybatis.mapper.common.MySqlMapper;
-
-/**
- * @author songpeng
- * @date 2019/05/22
- */
-public interface CustomMapper extends Mapper, MySqlMapper {
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/DateUtil.java b/sparchetype/src/main/java/com/songpeng/common/utils/DateUtil.java
deleted file mode 100644
index 88eb30f..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/utils/DateUtil.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package com.songpeng.common.utils;/**
- * Created by yushunwei on 2019/5/21.
- */
-
-import org.apache.commons.lang3.time.DateFormatUtils;
-
-import java.sql.Timestamp;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * Controller
- * Created by songpeng on 2019/5/21.
- */
-public class DateUtil extends org.apache.commons.lang3.time.DateUtils {
- private static String[] parsePatterns = new String[]{"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy-MM-dd HH:mm:ss.E", "yyyy-MM-dd HH:mm:ss.0", "yyyy-MM-dd 00:00:00.0"};
- public static String datePatterns = "yyyy-MM-dd";
- public static String dateTimePatterns = "yyyy-MM-dd HH:mm:ss";
-
- public DateUtil() {
- }
-
- public static String getDate() {
- return getDate("yyyy-MM-dd");
- }
-
- public static String getDate(String pattern) {
- return DateFormatUtils.format(new Date(), pattern);
- }
-
- public static String formatDateTime(Date date) {
- return formatDate(date, "yyyy-MM-dd HH:mm:ss");
- }
-
- public static String getTime() {
- return formatDate(new Date(), "HH:mm:ss");
- }
-
- public static String getDateTime() {
- return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
- }
-
- public static String getYear() {
- return formatDate(new Date(), "yyyy");
- }
-
- public static String getMonth() {
- return formatDate(new Date(), "MM");
- }
-
- public static String getDay() {
- return formatDate(new Date(), "dd");
- }
-
- public static String getWeek() {
- return formatDate(new Date(), "E");
- }
-
- public static Date parseDate(Object str) {
- if (str == null) {
- return null;
- } else {
- try {
- return parseDate(str.toString(), parsePatterns);
- } catch (ParseException var2) {
- return null;
- }
- }
- }
-
- public static long pastDays(Date date) {
- long t = System.currentTimeMillis() - date.getTime();
- return t / 86400000L;
- }
-
- public static Date getDateStart(Date date) {
- if (date == null) {
- return null;
- } else {
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
- try {
- date = sdf.parse(formatDate(date, "yyyy-MM-dd") + " 00:00:00");
- } catch (ParseException var3) {
- var3.printStackTrace();
- }
-
- return date;
- }
- }
-
- public static Date getDateEnd(Date date) {
- if (date == null) {
- return null;
- } else {
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
- try {
- date = sdf.parse(formatDate(date, "yyyy-MM-dd") + " 23:59:59");
- } catch (ParseException var3) {
- var3.printStackTrace();
- }
-
- return date;
- }
- }
-
- public static String formatDate(Date date, Object... pattern) {
- String formatDate = null;
- if (pattern != null && pattern.length > 0) {
- formatDate = DateFormatUtils.format(date, pattern[0].toString());
- } else {
- formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
- }
-
- return formatDate;
- }
-
- public static boolean isDate(String timeString) {
- SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
- format.setLenient(false);
-
- try {
- format.parse(timeString);
- return true;
- } catch (Exception var3) {
- return false;
- }
- }
-
- public static Timestamp getSysTimestamp() {
- return new Timestamp(System.currentTimeMillis());
- }
-
- public static Date getSysDate() {
- return new Date();
- }
-
- public static String getDateRandom() {
- String s = (new SimpleDateFormat("yyyyMMddHHmmssSSS")).format(new Date());
- return s;
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/FileType.java b/sparchetype/src/main/java/com/songpeng/common/utils/FileType.java
deleted file mode 100644
index 1f478c9..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/utils/FileType.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.songpeng.common.utils;
-
-/**
- * 根据文件名称判断类型
- * 备注:文件类型不完善,有需要的自行添加
- *
- * @author SongPeng
- */
-public class FileType {
- public static int fileType(String fileName) {
- if (StringUtil.isBlank(fileName)) {
- fileName = "文件名为空!";
- return 500;
-
- } else {
- // 获取文件后缀名并转化为写,用于后续比较
- String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()).toLowerCase();
- // 创建图片类型数组0
- String[] img = {"bmp", "jpg", "jpeg", "png", "tiff", "gif", "pcx", "tga", "exif", "fpx", "svg", "psd",
- "cdr", "pcd", "dxf", "ufo", "eps", "ai", "raw", "wmf"};
- for (int i = 0; i < img.length; i++) {
- if (img[i].equals(fileType)) {
- return 0;
- }
- }
-
- // 创建文档类型数组1
- String[] document = {"txt", "doc", "docx", "xls", "htm", "html", "jsp", "rtf", "wpd", "pdf", "ppt"};
- for (int i = 0; i < document.length; i++) {
- if (document[i].equals(fileType)) {
- return 1;
- }
- }
- // 创建视频类型数组2
- String[] video = {"mp4", "avi", "mov", "wmv", "asf", "navi", "3gp", "mkv", "f4v", "rmvb", "webm"};
- for (int i = 0; i < video.length; i++) {
- if (video[i].equals(fileType)) {
- return 2;
- }
- }
- // 创建音乐类型数组3
- String[] music = {"mp3", "wma", "wav", "mod", "ra", "cd", "md", "asf", "aac", "vqf", "ape", "mid", "ogg",
- "m4a", "vqf"};
- for (int i = 0; i < music.length; i++) {
- if (music[i].equals(fileType)) {
- return 3;
- }
- }
-
- }
- //4
- return 99;
- }
-}
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/JsonUtil.java b/sparchetype/src/main/java/com/songpeng/common/utils/JsonUtil.java
deleted file mode 100644
index 0bdc566..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/utils/JsonUtil.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.songpeng.common.utils;
-
-import com.alibaba.fastjson.JSONObject;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.PrintWriter;
-
-/**
- * @author songpeng
- * @date 2019/6/22
- */
-public class JsonUtil {
-
- public static void writeJson(HttpServletResponse response, ApiResponse responseData) {
- PrintWriter writer;
- response.setStatus(HttpServletResponse.SC_OK);
- response.setContentType("application/json");
- response.setCharacterEncoding("UTF-8");
- try {
- writer = response.getWriter();
- writer.write(JSONObject.toJSONString(responseData));
- writer.flush();
- writer.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/PageRequest.java b/sparchetype/src/main/java/com/songpeng/common/utils/PageRequest.java
deleted file mode 100644
index caf4111..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/utils/PageRequest.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package com.songpeng.common.utils;
-
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-/**
- * Controller
- * Created by songpeng on 2019/5/21
- */
-public class PageRequest implements Serializable {
-
- private static final long serialVersionUID = -8202259155259850600L;
-
- private Integer pageNum = 1;
- private Integer pageSize = 10;
- private String order;
- private String sort;
- private Map params = new HashMap();
-
- public PageRequest() {
- }
-
- public Integer getPageNum() {
- return pageNum;
- }
-
- public void setPageNum(Integer pageNum) {
- this.pageNum = pageNum;
- }
-
- public Integer getPageSize() {
- return pageSize;
- }
-
- public void setPageSize(Integer pageSize) {
- this.pageSize = pageSize;
- }
-
- public String getOrder() {
- return this.order;
- }
-
- public void setOrder(String order) {
- this.order = order;
- }
-
- public String getSort() {
- return this.sort;
- }
-
- public void setSort(String sort) {
- this.sort = sort;
- }
-
- public Map getParams() {
- String key;
- if (StringUtil.isNotEmpty(this.order)) {
- String[] orders = this.order.split(",");
- String[] sorts = this.sort.split(",");
- key = "";
- int i = 0;
-
- for (int j = orders.length; i < j; ++i) {
- key = StringUtil.assemblyString(new String[]{key, orders[i], " ", sorts[i], ","});
- }
-
- this.params.put("orderByClause", key.substring(0, key.length() - 1));
- }
-
- Iterator var6 = this.params.entrySet().iterator();
-
- while (true) {
- Object value;
- do {
- do {
- do {
- if (!var6.hasNext()) {
- return this.params;
- }
-
- Map.Entry entry = (Map.Entry) var6.next();
- key = (String) entry.getKey();
- value = entry.getValue();
- } while (value == null);
- } while (StringUtil.isBlank(String.valueOf(value)));
-
- if ((key.endsWith("IN") || key.endsWith("NI")) && value instanceof String) {
- this.params.put(key, Arrays.asList(value.toString().split(",")));
- }
- } while (!key.endsWith("TimeEnd") && !key.endsWith("DateEnd"));
-
- if (String.valueOf(value).length() == 10) {
- this.params.put(key, DateUtil.formatDateTime(DateUtil.getDateEnd(DateUtil.parseDate(value))));
- }
- }
- }
-
- public void setParams(Map params) {
- this.params = params;
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/PasswordEncoderUtil.java b/sparchetype/src/main/java/com/songpeng/common/utils/PasswordEncoderUtil.java
deleted file mode 100644
index 9245c65..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/utils/PasswordEncoderUtil.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.songpeng.common.utils;
-
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-
-/**
- * @author songpeng
- * @date 2019/6/18
- */
-public class PasswordEncoderUtil {
-
- /**
- * 使用构造方法生成对象
- */
- private static PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
-
- /**
- * 对密码使用BCryptPasswordEncoder加密方式进行加密
- */
- public static String passwordEncoder(String password) {
- return passwordEncoder.encode(password);
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/StringUtil.java b/sparchetype/src/main/java/com/songpeng/common/utils/StringUtil.java
deleted file mode 100644
index caa58b4..0000000
--- a/sparchetype/src/main/java/com/songpeng/common/utils/StringUtil.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package com.songpeng.common.utils;
-
-import java.net.URLEncoder;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.regex.Pattern;
-
-/**
- * Controller
- * Created by songpeng on 2019/5/21.
- */
-public class StringUtil extends org.apache.commons.lang3.StringUtils {
-
- private static final Pattern DANGER_CHAR_PATTERN = Pattern.compile("['|\"|\\|<|>]");
-
- public StringUtil() {
- }
-
- public static String maptToUrlParam(Map paramMap, String encode) throws Exception {
- String params = "";
- Set paramKey = paramMap.keySet();
- Iterator it = paramKey.iterator();
- StringBuffer sb = new StringBuffer();
-
- while (it.hasNext()) {
- String tempKey = (String) it.next();
- String tempValue = paramMap.get(tempKey) != null ? URLEncoder.encode(paramMap.get(tempKey).toString(), encode) : "";
- if (sb.length() == 0) {
- sb.append(tempKey + "=" + tempValue);
- } else {
- sb.append("&" + tempKey + "=" + tempValue);
- }
- }
-
- return params;
- }
-
- public static String assemblyString(String... strParam) {
- StringBuffer stringBuffer = new StringBuffer();
- String[] var2 = strParam;
- int var3 = strParam.length;
-
- for (int var4 = 0; var4 < var3; ++var4) {
- String string = var2[var4];
- stringBuffer.append(string);
- }
-
- return stringBuffer.toString();
- }
-
- public static String uuid() {
- return UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
- }
-
- public static boolean isNumeric(Object obj) {
- if (obj == null) {
- return false;
- } else {
- char[] chars = obj.toString().toCharArray();
- int length = chars.length;
- if (length < 1) {
- return false;
- } else {
- int i = 0;
- if (length > 1 && chars[0] == '-') {
- i = 1;
- }
-
- while (i < length) {
- if (!Character.isDigit(chars[i])) {
- return false;
- }
-
- ++i;
- }
-
- return true;
- }
- }
- }
-
- public static String[] replaceDanger(String[] values) {
- if (values == null) {
- return null;
- } else {
- int count = values.length;
- String[] _values = new String[count];
-
- for (int i = 0; i < count; ++i) {
- _values[i] = replaceDanger(values[i]);
- }
-
- return _values;
- }
- }
-
- public static String replaceDanger(String value) {
- if (!isBlank(value) && isDanger(value)) {
- char[] chars = value.toCharArray();
- StringBuffer sb = new StringBuffer();
-
- for (int i = 0; i < chars.length; ++i) {
- char c = chars[i];
- switch (c) {
- case '"':
- sb.append(""");
- break;
- case '\'':
- sb.append("'");
- break;
- case '<':
- sb.append("<");
- break;
- case '>':
- sb.append(">");
- break;
- default:
- sb.append(c);
- }
- }
-
- return sb.toString();
- } else {
- return value;
- }
- }
-
- public static String[] escapeDanger(String[] values) {
- if (values == null) {
- return null;
- } else {
- int count = values.length;
- String[] _values = new String[count];
-
- for (int i = 0; i < count; ++i) {
- _values[i] = escapeDanger(values[i]);
- }
-
- return _values;
- }
- }
-
- public static String escapeDanger(String value) {
- return !isBlank(value) && isDanger(value) ? value.replaceAll("(?
+ * 系统字典表 前端控制器
+ *
+ *
+ * @author SongPeng
+ * @since 2019-08-26
+ */
+@RestController
+@RequestMapping("/admin/sys/dict")
+public class SysDictController extends BaseController {
+
+ @Autowired
+ private ISysDictService sysDictService;
+
+ @PostMapping("add")
+ public String add(SysDict sysDict) {
+ sysDict.setCreated(LocalDateTime.now()).setCreatedBy("test").setLastUpd(LocalDateTime.now()).setLastUpdBy("test");
+ boolean save = sysDictService.save(sysDict);
+ return "success: " + save;
+ }
+}
diff --git a/sparchetype/src/main/java/com/songpeng/sparchetype/common/dto/SysDictDto.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/dto/SysDictDto.java
new file mode 100644
index 0000000..6b52ff1
--- /dev/null
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/dto/SysDictDto.java
@@ -0,0 +1,8 @@
+package com.songpeng.sparchetype.common.dto;
+
+/**
+ * @author SongPeng
+ * @date 2019/9/30 9:49
+ */
+public class SysDictDto {
+}
diff --git a/sparchetype/src/main/java/com/songpeng/sparchetype/common/entity/SysDict.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/entity/SysDict.java
new file mode 100644
index 0000000..9729bc3
--- /dev/null
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/entity/SysDict.java
@@ -0,0 +1,60 @@
+package com.songpeng.sparchetype.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.songpeng.sparchetype.common.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ *
+ * 系统字典表
+ *
+ *
+ * @author SongPeng
+ * @since 2019-08-26
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sp_sys_dict")
+public class SysDict extends BaseEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 标签名
+ */
+ private String name;
+
+ /**
+ * 数据值
+ */
+ private String value;
+
+ /**
+ * 类型
+ */
+ private String type;
+
+ /**
+ * 描述
+ */
+ private String descr;
+
+ /**
+ * 排序(升序)
+ */
+ private Integer sortNum;
+
+ /**
+ * 父级id
+ */
+ private String parentId;
+
+ /**
+ * 状态:逻辑已删除值(默认为 1); 逻辑未删除值(默认为 0)
+ */
+ private String status;
+
+}
diff --git a/sparchetype/src/main/java/com/songpeng/sparchetype/common/mapper/SysDictMapper.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/mapper/SysDictMapper.java
new file mode 100644
index 0000000..95a27cf
--- /dev/null
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/mapper/SysDictMapper.java
@@ -0,0 +1,16 @@
+package com.songpeng.sparchetype.common.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.songpeng.sparchetype.common.entity.SysDict;
+
+/**
+ *
+ * 系统字典表 Mapper 接口
+ *
+ *
+ * @author SongPeng
+ * @since 2019-08-26
+ */
+public interface SysDictMapper extends BaseMapper {
+
+}
diff --git a/sparchetype/src/main/java/com/songpeng/sparchetype/common/service/ISysDictService.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/service/ISysDictService.java
new file mode 100644
index 0000000..1aa6cd7
--- /dev/null
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/service/ISysDictService.java
@@ -0,0 +1,16 @@
+package com.songpeng.sparchetype.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.songpeng.sparchetype.common.entity.SysDict;
+
+/**
+ *
+ * 系统字典表 服务类
+ *
+ *
+ * @author SongPeng
+ * @since 2019-08-26
+ */
+public interface ISysDictService extends IService {
+
+}
diff --git a/sparchetype/src/main/java/com/songpeng/sparchetype/common/service/impl/SysDictServiceImpl.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/service/impl/SysDictServiceImpl.java
new file mode 100644
index 0000000..71100fc
--- /dev/null
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/service/impl/SysDictServiceImpl.java
@@ -0,0 +1,20 @@
+package com.songpeng.sparchetype.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.songpeng.sparchetype.common.entity.SysDict;
+import com.songpeng.sparchetype.common.mapper.SysDictMapper;
+import com.songpeng.sparchetype.common.service.ISysDictService;
+import org.springframework.stereotype.Service;
+
+/**
+ *
+ * 系统字典表 服务实现类
+ *
+ *
+ * @author SongPeng
+ * @since 2019-08-26
+ */
+@Service
+public class SysDictServiceImpl extends ServiceImpl implements ISysDictService {
+
+}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/ByteUtil.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/ByteUtil.java
similarity index 98%
rename from sparchetype/src/main/java/com/songpeng/common/utils/ByteUtil.java
rename to sparchetype/src/main/java/com/songpeng/sparchetype/common/util/ByteUtil.java
index 56074ab..9d7e14d 100644
--- a/sparchetype/src/main/java/com/songpeng/common/utils/ByteUtil.java
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/ByteUtil.java
@@ -1,11 +1,11 @@
-package com.songpeng.common.utils;
+package com.songpeng.sparchetype.common.util;
import java.util.regex.Pattern;
/**
* ByteUtil
*
- * @author songpeng
+ * @author SongPeng
* @date 2019/5/23
*/
public class ByteUtil {
diff --git a/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/CodeGenerator.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/CodeGenerator.java
new file mode 100644
index 0000000..9d15e07
--- /dev/null
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/CodeGenerator.java
@@ -0,0 +1,140 @@
+package com.songpeng.sparchetype.common.util;
+
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * 代码生成器
+ *
+ * @author SongPeng
+ * @date 2019/8/26
+ */
+public class CodeGenerator {
+
+ /**
+ * 代码生成器:配置及启动入口
+ */
+ public static void main(String[] args) {
+ // 代码生成器
+ AutoGenerator mpg = new AutoGenerator();
+
+ // 全局配置
+ GlobalConfig gc = new GlobalConfig();
+ String projectPath = System.getProperty("user.dir");
+ gc.setOutputDir(projectPath + "/src/main/java");
+ gc.setAuthor("SongPeng");
+ gc.setOpen(false);
+ // gc.setSwagger2(true); 实体属性 Swagger2 注解
+ mpg.setGlobalConfig(gc);
+
+ // 数据源配置
+ DataSourceConfig dsc = new DataSourceConfig();
+ dsc.setUrl("jdbc:mysql://127.0.0.1:3306/sparchetype?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT");
+ // dsc.setSchemaName("public");
+ dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+ dsc.setUsername("root");
+ dsc.setPassword("123456");
+ mpg.setDataSource(dsc);
+
+ // 包配置
+ PackageConfig pc = new PackageConfig();
+ pc.setModuleName(scanner("模块名"));
+ pc.setParent("com.songpeng.sparchetype");
+ mpg.setPackageInfo(pc);
+
+ // 自定义配置
+ InjectionConfig cfg = new InjectionConfig() {
+ @Override
+ public void initMap() {
+ // to do nothing
+ }
+ };
+
+ // 如果模板引擎是 freemarker
+ String templatePath = "/templates/mapper.xml.ftl";
+
+ // 自定义输出配置
+ List focList = new ArrayList<>();
+ // 自定义配置会被优先输出
+ focList.add(new FileOutConfig(templatePath) {
+ @Override
+ public String outputFile(TableInfo tableInfo) {
+ // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+ return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+ + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+ }
+ });
+ /*
+ cfg.setFileCreate(new IFileCreate() {
+ @Override
+ public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
+ // 判断自定义文件夹是否需要创建
+ checkDir("调用默认方法创建的目录");
+ return false;
+ }
+ });
+ */
+ cfg.setFileOutConfigList(focList);
+ mpg.setCfg(cfg);
+
+ // 配置模板
+ TemplateConfig templateConfig = new TemplateConfig();
+
+ // 配置自定义输出模板
+ //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
+ // templateConfig.setEntity("templates/entity2.java");
+ // templateConfig.setService();
+ // templateConfig.setController();
+
+ templateConfig.setXml(null);
+ mpg.setTemplate(templateConfig);
+
+ // 策略配置
+ StrategyConfig strategy = new StrategyConfig();
+ strategy.setNaming(NamingStrategy.underline_to_camel);
+ strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+ strategy.setSuperEntityClass("com.songpeng.sparchetype.common.BaseEntity");
+ strategy.setEntityLombokModel(true);
+ strategy.setRestControllerStyle(true);
+ // 公共父类
+ strategy.setSuperControllerClass("com.songpeng.sparchetype.common.BaseController");
+ // 写于父类中的公共字段
+ strategy.setSuperEntityColumns("id", "created", "created_by", "last_upd", "last_upd_by");
+ strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
+ strategy.setControllerMappingHyphenStyle(true);
+ strategy.setTablePrefix(pc.getModuleName() + "_");
+ mpg.setStrategy(strategy);
+ mpg.setTemplateEngine(new FreemarkerTemplateEngine());
+ mpg.execute();
+ }
+
+ /**
+ *
+ * 读取控制台内容
+ *
+ */
+ public static String scanner(String tip) {
+ Scanner scanner = new Scanner(System.in);
+ StringBuilder help = new StringBuilder();
+ help.append("请输入" + tip + ":");
+ System.out.println(help.toString());
+ if (scanner.hasNext()) {
+ String ipt = scanner.next();
+ if (StringUtils.isNotEmpty(ipt)) {
+ return ipt;
+ }
+ }
+ throw new MybatisPlusException("请输入正确的" + tip + "!");
+ }
+}
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/HashUtil.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/HashUtil.java
similarity index 98%
rename from sparchetype/src/main/java/com/songpeng/common/utils/HashUtil.java
rename to sparchetype/src/main/java/com/songpeng/sparchetype/common/util/HashUtil.java
index a1d2dfd..896bd89 100644
--- a/sparchetype/src/main/java/com/songpeng/common/utils/HashUtil.java
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/HashUtil.java
@@ -1,4 +1,4 @@
-package com.songpeng.common.utils;
+package com.songpeng.sparchetype.common.util;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
@@ -12,7 +12,7 @@ import javax.crypto.spec.SecretKeySpec;
/**
* Utility class for hashing.
*
- * @author songpeng
+ * @author SongPeng
* @date 2019/5/23
*/
public class HashUtil {
diff --git a/sparchetype/src/main/java/com/songpeng/common/utils/IdUtil.java b/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/IdUtil.java
similarity index 98%
rename from sparchetype/src/main/java/com/songpeng/common/utils/IdUtil.java
rename to sparchetype/src/main/java/com/songpeng/sparchetype/common/util/IdUtil.java
index 7a53ced..174c9da 100644
--- a/sparchetype/src/main/java/com/songpeng/common/utils/IdUtil.java
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/common/util/IdUtil.java
@@ -1,4 +1,4 @@
-package com.songpeng.common.utils;
+package com.songpeng.sparchetype.common.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -44,7 +44,7 @@ import java.util.regex.Pattern;
*
* 参考链接:https://mp.weixin.qq.com/s/C6QkzzUMPiYov8GO8zJTLA
*
- * @author songpeng
+ * @author SongPeng
* @date 2019/05/23
*/
public final class IdUtil {
diff --git a/sparchetype/src/main/java/com/songpeng/sparchetype/system/controller/admin/SysLoginController.java b/sparchetype/src/main/java/com/songpeng/sparchetype/system/controller/admin/SysLoginController.java
new file mode 100644
index 0000000..7dacc69
--- /dev/null
+++ b/sparchetype/src/main/java/com/songpeng/sparchetype/system/controller/admin/SysLoginController.java
@@ -0,0 +1,42 @@
+package com.songpeng.sparchetype.system.controller.admin;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * @author SongPeng
+ * @date 2019/9/27 16:05
+ */
+@Controller
+public class SysLoginController {
+
+ /**
+ * 博客主页
+ *
+ * @param model
+ * @return
+ */
+ @GetMapping({"/", ""})
+ public String welcome(Model model) {
+ return "redirect:/blog";
+ }
+
+ /**
+ * 后台管理首页
+ *
+ * @param model
+ * @return
+ */
+ @GetMapping("/index")
+ public String index(Model model) {
+ // TODO 菜单树
+ return "index";
+ }
+
+ @GetMapping("/admin/welcome")
+ public String welcomePage(Model model) {
+ // TODO 菜单树
+ return "admin/welcome";
+ }
+}
diff --git a/sparchetype/src/main/java/com/songpeng/system/controller/admin/SysUserController.java b/sparchetype/src/main/java/com/songpeng/system/controller/admin/SysUserController.java
deleted file mode 100644
index 05d2b25..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/controller/admin/SysUserController.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.songpeng.system.controller.admin;
-
-import com.github.pagehelper.PageInfo;
-import com.songpeng.common.utils.ApiResponse;
-import com.songpeng.common.utils.PageRequest;
-import com.songpeng.system.domain.SysUser;
-import com.songpeng.system.dto.SysUserDto;
-import com.songpeng.system.service.SysUserService;
-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.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 用户 Controller
- *
- * @author songpeng
- * @date 2019-04-19
- */
-@RequestMapping("/admin/sys/user")
-@Controller("adminUserController")
-public class SysUserController {
-
- /**
- * 日志记录器
- */
- private static final Logger LOGGER = LoggerFactory.getLogger(SysUserController.class);
-
- @Autowired
- private SysUserService sysUserService;
-
- @RequestMapping("/page")
- @ResponseBody
- public ApiResponse getPage(PageRequest pageRequest) {
- LOGGER.info("获取用户列表");
- PageInfo pageInfo = sysUserService.getPage(pageRequest);
- Map result = new HashMap<>(2);
- result.put("result", pageInfo);
- return ApiResponse.ok(result);
- }
-
- @PostMapping("/add")
- @ResponseBody
- public ApiResponse add(SysUser sysUser, String[] roles) {
- sysUserService.add(sysUser, roles);
- return ApiResponse.ok();
- }
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/controller/client/LoginController.java b/sparchetype/src/main/java/com/songpeng/system/controller/client/LoginController.java
deleted file mode 100644
index 4055517..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/controller/client/LoginController.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package com.songpeng.system.controller.client;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-/**
- * 登录 Controller
- *
- * @author songpeng
- * @date 2019-04-19
- */
-@Controller("clientLoginController")
-public class LoginController {
-
- /**
- * 日志记录器
- */
- private static final Logger logger = LoggerFactory.getLogger(LoginController.class);
-
- /**
- * 访问首页
- *
- * @param model
- * @return
- */
- @GetMapping({"/", ""})
- String welcome(Model model) {
- return "redirect:/blog";
- }
-
- /**
- * 访问后台管理系统首页
- *
- * @param model
- * @return
- */
- @GetMapping({"/index"})
- String index(Model model) {
-// List> menus = menuService.listMenuTree(getUserId());
-// model.addAttribute("menus", menus);
-// model.addAttribute("name", getUser().getName());
-// FileDO fileDO = fileService.get(getUser().getPicId());
-// if (fileDO != null && fileDO.getUrl() != null) {
-// if (fileService.isExist(fileDO.getUrl())) {
-// model.addAttribute("picUrl", fileDO.getUrl());
-// } else {
-// model.addAttribute("picUrl", "/img/photo_s.jpg");
-// }
-// } else {
-// model.addAttribute("picUrl", "/img/photo_s.jpg");
-// }
-// model.addAttribute("username", getUser().getUsername());
- return "admin/index";
- }
-
- @GetMapping("/main")
- String main() {
- return "admin/main";
- }
-
- @RequestMapping("/personal_center")
- @ResponseBody
- String loginSuccess() {
- return "success";
- }
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/domain/SysMenu.java b/sparchetype/src/main/java/com/songpeng/system/domain/SysMenu.java
deleted file mode 100644
index eac239a..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/domain/SysMenu.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package com.songpeng.system.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 系统菜单
- *
- * @author songpeng
- * @date 2019/5/23
- */
-@Table(name = "SYS_MENU")
-public class SysMenu implements Serializable {
-
- private static final long serialVersionUID = -3876673376417160668L;
-
- @Id
- @Column(name = "ID")
- private String id;
- @Column(name = "NAME")
- private String name;
- @Column(name = "URL")
- private String url;
- @Column(name = "PARENT_ID")
- private String parentId;
- @Column(name = "SORT_NUM")
- private String sortNum;
- @Column(name = "TYPE")
- private String type;
- @Column(name = "PERMISSION")
- private String permission;
- @Column(name = "ICON")
- private String icon;
- @Column(name = "DESCRIPTION")
- private String description;
- @Column(name = "CREATED")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date created;
- @Column(name = "CREATED_BY")
- private String createdBy;
- @Column(name = "LAST_UPD")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date lastUpd;
- @Column(name = "LAST_UPD_BY")
- private String lastUpdBy;
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getUrl() {
- return url;
- }
-
- public void setUrl(String url) {
- this.url = url;
- }
-
- public String getParentId() {
- return parentId;
- }
-
- public void setParentId(String parentId) {
- this.parentId = parentId;
- }
-
- public String getSortNum() {
- return sortNum;
- }
-
- public void setSortNum(String sortNum) {
- this.sortNum = sortNum;
- }
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- public String getPermission() {
- return permission;
- }
-
- public void setPermission(String permission) {
- this.permission = permission;
- }
-
- public String getIcon() {
- return icon;
- }
-
- public void setIcon(String icon) {
- this.icon = icon;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public Date getCreated() {
- return created;
- }
-
- public void setCreated(Date created) {
- this.created = created;
- }
-
- public String getCreatedBy() {
- return createdBy;
- }
-
- public void setCreatedBy(String createdBy) {
- this.createdBy = createdBy;
- }
-
- public Date getLastUpd() {
- return lastUpd;
- }
-
- public void setLastUpd(Date lastUpd) {
- this.lastUpd = lastUpd;
- }
-
- public String getLastUpdBy() {
- return lastUpdBy;
- }
-
- public void setLastUpdBy(String lastUpdBy) {
- this.lastUpdBy = lastUpdBy;
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/domain/SysRole.java b/sparchetype/src/main/java/com/songpeng/system/domain/SysRole.java
deleted file mode 100644
index 0e5a309..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/domain/SysRole.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package com.songpeng.system.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 系统角色
- *
- * @author songpeng
- * @date 2019/5/23
- */
-@Table(name = "SYS_ROLE")
-public class SysRole implements Serializable {
-
- private static final long serialVersionUID = -3876673376417160668L;
-
- @Id
- @Column(name = "ID")
- private Long id;
- @Column(name = "NAME")
- private String name;
- @Column(name = "CODE")
- private String code;
- @Column(name = "STATUS")
- private String status;
- @Column(name = "CREATED")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date created;
- @Column(name = "CREATED_BY")
- private String createdBy;
- @Column(name = "LAST_UPD")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date lastUpd;
- @Column(name = "LAST_UPD_BY")
- private String lastUpdBy;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getCode() {
- return code;
- }
-
- public void setCode(String code) {
- this.code = code;
- }
-
- public String getStatus() {
- return status;
- }
-
- public void setStatus(String status) {
- this.status = status;
- }
-
- public Date getCreated() {
- return created;
- }
-
- public void setCreated(Date created) {
- this.created = created;
- }
-
- public String getCreatedBy() {
- return createdBy;
- }
-
- public void setCreatedBy(String createdBy) {
- this.createdBy = createdBy;
- }
-
- public Date getLastUpd() {
- return lastUpd;
- }
-
- public void setLastUpd(Date lastUpd) {
- this.lastUpd = lastUpd;
- }
-
- public String getLastUpdBy() {
- return lastUpdBy;
- }
-
- public void setLastUpdBy(String lastUpdBy) {
- this.lastUpdBy = lastUpdBy;
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/domain/SysUser.java b/sparchetype/src/main/java/com/songpeng/system/domain/SysUser.java
deleted file mode 100644
index 93030eb..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/domain/SysUser.java
+++ /dev/null
@@ -1,299 +0,0 @@
-package com.songpeng.system.domain;
-
-import com.alibaba.fastjson.annotation.JSONField;
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import java.io.Serializable;
-import java.util.Date;
-
-/**
- * 系统用户
- *
- * @author songpeng
- * @date 2019/05/21
- */
-@Table(name = "SYS_USER")
-public class SysUser implements Serializable {
-
- private static final long serialVersionUID = -583330206794726157L;
-
- @Id
- @Column(name = "ID")
- private String id;
- @Column(name = "NAME")
- private String name;
- @Column(name = "USERNAME")
- private String username;
- @JSONField(serialize = false)
- @Column(name = "PASSWORD")
- private String password;
- @Column(name = "DEPT_ID")
- private String deptId;
- @Column(name = "EMAIL")
- private String email;
- @Column(name = "MOBILE")
- private String mobile;
- @Column(name = "TEL")
- private String tel;
- @Column(name = "SEX")
- private String sex;
- @Column(name = "BIRTHDAY")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date birthday;
- @Column(name = "PIC_ID")
- private String picId;
- @Column(name = "ID_CARD")
- private String idCard;
- @Column(name = "HOBBY")
- private String hobby;
- @Column(name = "PROVINCE")
- private String province;
- @Column(name = "CITY")
- private String city;
- @Column(name = "DISTRICT")
- private String district;
- @Column(name = "STREET")
- private String street;
- @Column(name = "STREET_NUMBER")
- private String streetNumber;
- @Column(name = "DESCRIPTION")
- private String description;
- @Column(name = "STATUS")
- private String status;
- @Column(name = "CREATED")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date created;
- @Column(name = "CREATED_BY")
- private String createdBy;
- @Column(name = "LAST_UPD")
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
- private Date lastUpd;
- @Column(name = "LAST_UPD_BY")
- private String lastUpdBy;
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- 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 getDeptId() {
- return deptId;
- }
-
- public void setDeptId(String deptId) {
- this.deptId = deptId;
- }
-
- public String getEmail() {
- return email;
- }
-
- public void setEmail(String email) {
- this.email = email;
- }
-
- public String getMobile() {
- return mobile;
- }
-
- public void setMobile(String mobile) {
- this.mobile = mobile;
- }
-
- public String getTel() {
- return tel;
- }
-
- public void setTel(String tel) {
- this.tel = tel;
- }
-
- public String getSex() {
- return sex;
- }
-
- public void setSex(String sex) {
- this.sex = sex;
- }
-
- public Date getBirthday() {
- return birthday;
- }
-
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
-
- public String getPicId() {
- return picId;
- }
-
- public void setPicId(String picId) {
- this.picId = picId;
- }
-
- public String getIdCard() {
- return idCard;
- }
-
- public void setIdCard(String idCard) {
- this.idCard = idCard;
- }
-
- public String getHobby() {
- return hobby;
- }
-
- public void setHobby(String hobby) {
- this.hobby = hobby;
- }
-
- public String getProvince() {
- return province;
- }
-
- public void setProvince(String province) {
- this.province = province;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getDistrict() {
- return district;
- }
-
- public void setDistrict(String district) {
- this.district = district;
- }
-
- public String getStreet() {
- return street;
- }
-
- public void setStreet(String street) {
- this.street = street;
- }
-
- public String getStreetNumber() {
- return streetNumber;
- }
-
- public void setStreetNumber(String streetNumber) {
- this.streetNumber = streetNumber;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getStatus() {
- return status;
- }
-
- public void setStatus(String status) {
- this.status = status;
- }
-
- public Date getCreated() {
- return created;
- }
-
- public void setCreated(Date created) {
- this.created = created;
- }
-
- public String getCreatedBy() {
- return createdBy;
- }
-
- public void setCreatedBy(String createdBy) {
- this.createdBy = createdBy;
- }
-
- public Date getLastUpd() {
- return lastUpd;
- }
-
- public void setLastUpd(Date lastUpd) {
- this.lastUpd = lastUpd;
- }
-
- public String getLastUpdBy() {
- return lastUpdBy;
- }
-
- public void setLastUpdBy(String lastUpdBy) {
- this.lastUpdBy = lastUpdBy;
- }
-
- @Override
- public String toString() {
- final StringBuffer sb = new StringBuffer("SysUser{");
- sb.append("id='").append(id).append('\'');
- sb.append(", name='").append(name).append('\'');
- sb.append(", username='").append(username).append('\'');
- sb.append(", password='").append(password).append('\'');
- sb.append(", deptId='").append(deptId).append('\'');
- sb.append(", email='").append(email).append('\'');
- sb.append(", mobile='").append(mobile).append('\'');
- sb.append(", tel='").append(tel).append('\'');
- sb.append(", sex='").append(sex).append('\'');
- sb.append(", birthday=").append(birthday);
- sb.append(", picId='").append(picId).append('\'');
- sb.append(", idCard='").append(idCard).append('\'');
- sb.append(", hobby='").append(hobby).append('\'');
- sb.append(", province='").append(province).append('\'');
- sb.append(", city='").append(city).append('\'');
- sb.append(", district='").append(district).append('\'');
- sb.append(", street='").append(street).append('\'');
- sb.append(", streetNumber='").append(streetNumber).append('\'');
- sb.append(", description='").append(description).append('\'');
- sb.append(", status='").append(status).append('\'');
- sb.append(", created=").append(created);
- sb.append(", createdBy='").append(createdBy).append('\'');
- sb.append(", lastUpd=").append(lastUpd);
- sb.append(", lastUpdBy='").append(lastUpdBy).append('\'');
- sb.append('}');
- return sb.toString();
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/dto/SysUserDto.java b/sparchetype/src/main/java/com/songpeng/system/dto/SysUserDto.java
deleted file mode 100644
index e26d80f..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/dto/SysUserDto.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.songpeng.system.dto;
-
-import com.songpeng.common.utils.StringUtil;
-import com.songpeng.system.domain.SysRole;
-import com.songpeng.system.domain.SysUser;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.util.CollectionUtils;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 系统用户 dto
- *
- * @author songpeng
- * @date 2019/5/23
- */
-public class SysUserDto extends SysUser implements UserDetails {
-
- /**
- * 用户角色集合
- */
- private List roleList;
-
- @Override
- public Collection extends GrantedAuthority> getAuthorities() {
- List authorityList = new ArrayList<>();
- authorityList.add(new SimpleGrantedAuthority("ROLE_USER"));
-
- // 加入角色权限
- if (!CollectionUtils.isEmpty(roleList)) {
- for (SysRole role : roleList) {
- if (StringUtil.isNotBlank(role.getCode())) {
- authorityList.add(new SimpleGrantedAuthority("ROLE_" + role.getCode().toUpperCase()));
- }
- }
- }
- return null;
- }
-
- /**
- * 账户是否过期,过期无法验证
- *
- * @return
- */
- @Override
- public boolean isAccountNonExpired() {
- return true;
- }
-
- /**
- * 指定用户是否被锁定或者解锁,锁定的用户无法进行身份验证
- *
- * @return
- */
- @Override
- public boolean isAccountNonLocked() {
- return true;
- }
-
- /**
- * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
- * 帐户密码是否过期,一般有的密码要求性高的系统会使用到,比较每隔一段时间就要求用户重置密码
- *
- * @return
- */
- @Override
- public boolean isCredentialsNonExpired() {
- return true;
- }
-
- /**
- * 是否被禁用,禁用的用户不能身份验证
- *
- * @return
- */
- @Override
- public boolean isEnabled() {
- return true;
- }
-
- public List getRoleList() {
- return roleList;
- }
-
- public void setRoleList(List roleList) {
- this.roleList = roleList;
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/enmus/ESysUser.java b/sparchetype/src/main/java/com/songpeng/system/enmus/ESysUser.java
deleted file mode 100644
index 2f89f88..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/enmus/ESysUser.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.songpeng.system.enmus;
-
-/**
- * 用户对象枚举
- *
- * @author songpeng
- * @date 2019/6/15
- */
-public enum ESysUser {
- /**
- * 用户状态:已删除
- */
- STATUS_DELETED("0", "删除"),
-
- /**
- * 用户状态:正常
- */
- STATUS_NORMAL("1", "正常"),
-
- /**
- * 用户状态:禁用
- */
- STATUS_DISABLED("2", "禁用");
-
- private String value;
-
- private String desc;
-
- ESysUser(String value, String desc) {
- this.value = value;
- this.desc = desc;
- }
-
- public String getValue() {
- return value;
- }
-
- public void setValue(String value) {
- this.value = value;
- }
-
- public String getDesc() {
- return desc;
- }
-
- public void setDesc(String desc) {
- this.desc = desc;
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/mapper/SysMenuMapper.java b/sparchetype/src/main/java/com/songpeng/system/mapper/SysMenuMapper.java
deleted file mode 100644
index ae4a943..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/mapper/SysMenuMapper.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.songpeng.system.mapper;
-
-import com.songpeng.common.utils.CustomMapper;
-import com.songpeng.system.domain.SysMenu;
-
-public interface SysMenuMapper extends CustomMapper {
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/mapper/SysRoleMapper.java b/sparchetype/src/main/java/com/songpeng/system/mapper/SysRoleMapper.java
deleted file mode 100644
index ec703ce..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/mapper/SysRoleMapper.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.songpeng.system.mapper;
-
-import com.songpeng.common.utils.CustomMapper;
-import com.songpeng.system.domain.SysRole;
-
-import java.util.List;
-
-public interface SysRoleMapper extends CustomMapper {
-
- List getRolesByUserId(String userId);
-
- List getRolesByMenuId(String menuId);
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/mapper/SysUserMapper.java b/sparchetype/src/main/java/com/songpeng/system/mapper/SysUserMapper.java
deleted file mode 100644
index 3e315d5..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/mapper/SysUserMapper.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.songpeng.system.mapper;
-
-import com.songpeng.common.utils.CustomMapper;
-import com.songpeng.system.domain.SysUser;
-import com.songpeng.system.dto.SysUserDto;
-
-import java.util.List;
-import java.util.Map;
-
-public interface SysUserMapper extends CustomMapper {
-
- List getPage(Map params);
-
- List getSysUserDtosRoles(Map paramMap);
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/package-info.java b/sparchetype/src/main/java/com/songpeng/system/package-info.java
deleted file mode 100644
index 4d9c3fb..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/package-info.java
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * 这里放和异常相关的模型
- * 异常码需要继承通用异常码接口, {@link com.songpeng.common.lang.ex.CommonErrorCode}
- * 自定义异常需要继承通用异常接口, {@link com.songpeng.common.lang.ex.CommonException}
- * 非特别定制可以直接继承通用异常类, {@link com.songpeng.common.lang.ex.GenericException}
- * 如果想使用快速构造异常可以继承通用快速异常类, 但是会丢失异常堆栈信息, {@link com.songpeng.common.lang.ex.FastGenericException}
- * 自定义异常类需要配置 config/common.properties 中的 assertutil.exception.class.name项
,
- * {@link com.songpeng.common.config.ConfigKeyEnum#ASSERTUTIL_EXCEPTION_CLASS_NAME}
- * 自定义异常与通用异常工具配合使用更佳, {@link com.songpeng.common.utils.AssertUtil}
- */
-package com.songpeng.system;
\ No newline at end of file
diff --git a/sparchetype/src/main/java/com/songpeng/system/service/SysMenuService.java b/sparchetype/src/main/java/com/songpeng/system/service/SysMenuService.java
deleted file mode 100644
index 70d5475..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/service/SysMenuService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.songpeng.system.service;
-
-import com.songpeng.system.domain.SysMenu;
-
-import java.util.List;
-
-/**
- * SysMenuService
- *
- * @author songpeng
- * @date 2019/4/20
- */
-public interface SysMenuService {
-
- /**
- * 根据url查询所属菜单
- *
- * @param url
- * @return
- */
- List getMenusByUrl(String url);
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/service/SysRoleService.java b/sparchetype/src/main/java/com/songpeng/system/service/SysRoleService.java
deleted file mode 100644
index 85491cb..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/service/SysRoleService.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.songpeng.system.service;
-
-import com.songpeng.system.domain.SysRole;
-
-import java.util.List;
-
-/**
- * UserService
- *
- * @author songpeng
- * @date 2019/4/20
- */
-public interface SysRoleService {
- List getRolesByMenuId(String menuId);
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/service/SysUserService.java b/sparchetype/src/main/java/com/songpeng/system/service/SysUserService.java
deleted file mode 100644
index 5be8e50..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/service/SysUserService.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.songpeng.system.service;
-
-import com.github.pagehelper.PageInfo;
-import com.songpeng.common.utils.PageRequest;
-import com.songpeng.system.domain.SysUser;
-import com.songpeng.system.dto.SysUserDto;
-
-import java.util.Map;
-
-/**
- * UserService
- *
- * @author songpeng
- * @date 2019/4/20
- */
-public interface SysUserService {
-
- /**
- * 获取用户分页
- *
- * @param pageRequest
- * @return
- */
- PageInfo getPage(PageRequest pageRequest);
-
- /**
- * 获取用户信息(包含权限)
- *
- * @param paramMap
- * @return
- */
- SysUserDto getUserDtoRoles(Map paramMap);
-
- void add(SysUser sysUser, String[] roles);
-
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/service/impl/SysMenuServiceImpl.java b/sparchetype/src/main/java/com/songpeng/system/service/impl/SysMenuServiceImpl.java
deleted file mode 100644
index e32eda0..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/service/impl/SysMenuServiceImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.songpeng.system.service.impl;
-
-import com.songpeng.system.domain.SysMenu;
-import com.songpeng.system.mapper.SysMenuMapper;
-import com.songpeng.system.service.SysMenuService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.AntPathMatcher;
-import org.springframework.util.PathMatcher;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author songpeng
- * @date 2019/6/21
- */
-@Service
-public class SysMenuServiceImpl implements SysMenuService {
-
- @Autowired
- private SysMenuMapper sysMenuMapper;
-
- /**
- * 根据url查询所属菜单
- *
- * @param url
- * @return
- */
- @Override
- public List getMenusByUrl(String url) {
- List menuList = sysMenuMapper.selectAll();
- List menus = new ArrayList<>();
- if (menuList != null) {
- menus.addAll(menuList.stream().filter(menu -> urlMatcher(menu.getUrl(), url)).collect(Collectors.toList()));
- }
- return menus;
- }
-
- /**
- * url 匹配
- *
- * @param permstr
- * @param url
- * @return
- */
- private boolean urlMatcher(String permstr, String url) {
- if (permstr == null) {
- return false;
- }
- PathMatcher matcher = new AntPathMatcher();
- return matcher.match(permstr, url);
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/service/impl/SysRoleServiceImpl.java b/sparchetype/src/main/java/com/songpeng/system/service/impl/SysRoleServiceImpl.java
deleted file mode 100644
index 1c5ba45..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/service/impl/SysRoleServiceImpl.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.songpeng.system.service.impl;
-
-import com.songpeng.system.domain.SysRole;
-import com.songpeng.system.mapper.SysRoleMapper;
-import com.songpeng.system.service.SysRoleService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * @author songpeng
- * @date 2019/6/21
- */
-@Service
-public class SysRoleServiceImpl implements SysRoleService {
-
- @Autowired
- private SysRoleMapper sysRoleMapper;
-
- @Override
- public List getRolesByMenuId(String menuId) {
- return sysRoleMapper.getRolesByMenuId(menuId);
- }
-}
diff --git a/sparchetype/src/main/java/com/songpeng/system/service/impl/SysUserServiceImpl.java b/sparchetype/src/main/java/com/songpeng/system/service/impl/SysUserServiceImpl.java
deleted file mode 100644
index fdc7197..0000000
--- a/sparchetype/src/main/java/com/songpeng/system/service/impl/SysUserServiceImpl.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package com.songpeng.system.service.impl;
-
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
-import com.songpeng.common.utils.IdUtil;
-import com.songpeng.common.utils.PageRequest;
-import com.songpeng.common.utils.PasswordEncoderUtil;
-import com.songpeng.common.utils.StringUtil;
-import com.songpeng.system.domain.SysUser;
-import com.songpeng.system.dto.SysUserDto;
-import com.songpeng.system.enmus.ESysUser;
-import com.songpeng.system.mapper.SysUserMapper;
-import com.songpeng.system.service.SysUserService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * UserServiceImpl
- *
- * @author songpeng
- * @date 2019/4/20
- */
-@Service
-public class SysUserServiceImpl implements SysUserService, UserDetailsService {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(SysUserServiceImpl.class);
-
- @Autowired
- private SysUserMapper sysUserMapper;
-
- /**
- * 实现 spring security UserDetailsService 中的方法
- *
- * @param username
- * @return
- * @throws UsernameNotFoundException
- */
- @Override
- public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
- if (StringUtil.isBlank(username)) {
- throw new BadCredentialsException("用户名不能为空!");
- }
-
- // 根据用户名和正常状态获取用户信息
- Map paraMap = new HashMap(1) {{
- put("username", username);
- }};
- SysUserDto userDto = getUserDtoRoles(paraMap);
-
- if (userDto == null) {
- LOGGER.error("未找到用户名为 {} 的用户信息", username);
- throw new BadCredentialsException("未找到用户名为 " + username + " 的用户信息");
- }
-
- return userDto;
- }
-
- /**
- * 用户分页查询
- *
- * @param pageRequest
- * @return
- */
- @Override
- public PageInfo getPage(PageRequest pageRequest) {
- // 将参数传给这个方法就可以实现物理分页了
- PageHelper.startPage(pageRequest.getPageNum(), pageRequest.getPageSize());
- List users = sysUserMapper.getPage(pageRequest.getParams());
- PageInfo result = new PageInfo(users);
- return result;
- }
-
- @Override
- public SysUserDto getUserDtoRoles(Map paramMap) {
- List userDtos = sysUserMapper.getSysUserDtosRoles(paramMap);
- return userDtos.isEmpty() ? null : userDtos.get(0);
- }
-
- /**
- * 创建用户
- *
- * @param sysUser
- * @param roles
- */
- @Override
- public void add(SysUser sysUser, String[] roles) {
- sysUser.setId(IdUtil.nextId());
- sysUser.setPassword(PasswordEncoderUtil.passwordEncoder(sysUser.getPassword()));
- sysUser.setStatus(ESysUser.STATUS_NORMAL.getValue());
- LOGGER.info("user insert id: {}", sysUser.getId());
- sysUserMapper.insertSelective(sysUser);
- }
-
-}
diff --git a/sparchetype/src/main/resources/application-dev.yml b/sparchetype/src/main/resources/application-dev.yml
deleted file mode 100644
index e69de29..0000000
diff --git a/sparchetype/src/main/resources/application-pro.yml b/sparchetype/src/main/resources/application-pro.yml
deleted file mode 100644
index e69de29..0000000
diff --git a/sparchetype/src/main/resources/application.yml b/sparchetype/src/main/resources/application.yml
index 513d955..25876f1 100644
--- a/sparchetype/src/main/resources/application.yml
+++ b/sparchetype/src/main/resources/application.yml
@@ -2,54 +2,34 @@ server:
port: 9090
spring:
- thymeleaf:
- cache: false # 开发时关闭缓存,不然没法看到实时页面
- mode: LEGACYHTML5 # 用非严格的 HTML
- encoding: UTF-8
- servlet:
- content-type: text/html
- prefix: classpath:/templates/
- suffix: .html
+ mvc:
+ view:
+ prefix: /templates/
+ suffix: .ftl
+ static-path-pattern: /static/**
+ freemarker:
+ suffix: .ftl
+ templateEncoding: UTF-8
+ templateLoaderPath: classpath:/templates/
+ cache: false
+ expose-spring-macro-helpers: false
+ request-context-attribute: request
datasource:
type: com.alibaba.druid.pool.DruidDataSource
- driver-class-name: org.postgresql.Driver
- url: jdbc:postgresql://localhost:5432/sparchetype
- username: postgres
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: jdbc:mysql://127.0.0.1:3306/sparchetype?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Hongkong
+ username: root
password: 123456
druid:
- #初始化连接大小
initial-size: 8
- #最小空闲连接数
min-idle: 5
- #最大连接数
max-active: 10
- #查询超时时间
query-timeout: 6000
- #事务查询超时时间
transaction-query-timeout: 6000
- #关闭空闲连接超时时间
remove-abandoned-timeout: 1800
filters: stat,config
-mybatis:
- mapper-locations: mybatis/**/*Mapper.xml
- type-aliases-package: com.songpeng.**.domain
- configuration:
- log-impl: org.apache.ibatis.logging.log4j.Log4jImpl
-mapper:
- mappers:
- - com.songpeng.common.utils.CustomMapper
- not-empty: false
- identity: POSTGRESQL
-
-pagehelper:
- helperDialect: postgresql
- reasonable: true
- supportMethodsArguments: true
- params: count=countSql
-
-security:
- ignoring: "/, /css/**, /fonts/**, /img/**, /js/**, /lib/**, /favicon.ico, /blog, /sign_in, /client/**"
- intercept: "/**/*.jsp, /**/*.html, /admin/**"
- successUrl: "/sign_in"
- logoutSuccessUrl: "/sign_in"
\ No newline at end of file
+logging:
+ level:
+ root: info
+ com.songpeng: debug
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/log4j.properties b/sparchetype/src/main/resources/log4j.properties
deleted file mode 100644
index bafa445..0000000
--- a/sparchetype/src/main/resources/log4j.properties
+++ /dev/null
@@ -1,35 +0,0 @@
-log4j.rootCategory=info,file_info,file_error,stdout
-log4j.logger.org.springframework.web.filter.CommonsRequestLoggingFilter=debug,file_info,stdout
-log4j.additivity.org.springframework.web.filter.CommonsRequestLoggingFilter=false
-
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
-
-log4j.appender.file_info=org.apache.log4j.RollingFileAppender
-log4j.appender.file_info.layout=org.apache.log4j.PatternLayout
-log4j.appender.file_info.MaxFileSize=100MB
-log4j.appender.file_info.MaxBackupIndex=10
-log4j.appender.file_info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n
-log4j.appender.file_info.Threshold=DEBUG
-log4j.appender.file_info.append=true
-log4j.appender.file_info.File=/opt/logs/busi/sp_blog-info.log
-
-log4j.appender.file_error=org.apache.log4j.RollingFileAppender
-log4j.appender.file_error.layout=org.apache.log4j.PatternLayout
-log4j.appender.file_error.MaxFileSize=100MB
-log4j.appender.file_error.MaxBackupIndex=10
-log4j.appender.file_error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-30c{1}) [TxId : %X{PtxId} , SpanId : %X{PspanId}] [ET:%X{ENV_TYPE},AN:%X{APP_NAME},SN:%X{SERVICE_NAME},CN:%X{CONTAINER_NAME},CI:%X{CONTAINER_IP}] %m%n
-log4j.appender.file_error.Threshold=ERROR
-log4j.appender.file_error.append=true
-log4j.appender.file_error.File=/opt/logs/busi/sp_blog-error.log
-
-#\u6253\u5370sql\u90E8\u5206
-log4j.logger.java.sql=DEBUG
-log4j.logger.java.sql.Connection = DEBUG
-log4j.logger.java.sql.Statement = DEBUG
-log4j.logger.java.sql.PreparedStatement = DEBUG
-log4j.logger.java.sql.ResultSet = DEBUG
-#\u914D\u7F6Elogger\u626B\u63CF\u7684\u5305\u8DEF\u5F84 \u8FD9\u6837\u624D\u4F1A\u6253\u5370sql
-log4j.logger.com.songpeng=DEBUG
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/mapper/common/SysDictMapper.xml b/sparchetype/src/main/resources/mapper/common/SysDictMapper.xml
new file mode 100644
index 0000000..bce50c0
--- /dev/null
+++ b/sparchetype/src/main/resources/mapper/common/SysDictMapper.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/sparchetype/src/main/resources/mybatis/system/SysMenuMapper.xml b/sparchetype/src/main/resources/mybatis/system/SysMenuMapper.xml
deleted file mode 100644
index fd61bed..0000000
--- a/sparchetype/src/main/resources/mybatis/system/SysMenuMapper.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/mybatis/system/SysRoleMapper.xml b/sparchetype/src/main/resources/mybatis/system/SysRoleMapper.xml
deleted file mode 100644
index d82b825..0000000
--- a/sparchetype/src/main/resources/mybatis/system/SysRoleMapper.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/mybatis/system/SysUserMapper.xml b/sparchetype/src/main/resources/mybatis/system/SysUserMapper.xml
deleted file mode 100644
index 6efdb0b..0000000
--- a/sparchetype/src/main/resources/mybatis/system/SysUserMapper.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/static/css/admin.css b/sparchetype/src/main/resources/static/css/admin.css
new file mode 100644
index 0000000..80f9ec0
--- /dev/null
+++ b/sparchetype/src/main/resources/static/css/admin.css
@@ -0,0 +1,621 @@
+* {
+ margin: 0px;
+ padding: 0px;
+}
+a {
+ text-decoration: none;
+}
+html {
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+body {
+ width: 100%;
+ min-height: 100%;
+}
+.fr {
+ float: right;
+}
+.font16 {
+ font-size: 16px;
+}
+.rightMenu {
+ position: absolute;
+ width: 120px;
+ line-height: 24px;
+ z-index: 999;
+ background: #FFF;
+ border: 1px solid #F2F2F2;
+ border-bottom: none;
+ border-radius: 3px;
+ display: none;
+}
+.rightMenu li {
+ display: block;
+ padding: 4px 10px;
+ color: #CCC;
+ border-bottom: 1px solid #F2F2F2;
+}
+.rightMenu li:hover {
+ background: #EEE;
+ color: #666;
+}
+/**treeselect*/
+.layui-form-select .layui-tree {
+ display: none;
+ position: absolute;
+ left: 0;
+ top: 42px;
+ padding: 5px 0;
+ z-index: 999;
+ min-width: 100%;
+ border: 1px solid #d2d2d2;
+ max-height: 300px;
+ overflow-y: auto;
+ background-color: #fff;
+ border-radius: 2px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);
+ box-sizing: border-box;
+}
+.layui-form-selected .layui-tree {
+ display: block;
+}
+.weadmin-trailer {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 100%;
+ width: 100%;
+ padding: 15px;
+ display: flex;
+ justify-content: center;
+ flex-direction: column;
+ text-align: center;
+ box-sizing: border-box;
+ font-size: 20px;
+ font-weight: 300;
+ color: #ccc;
+}
+.login-bg {
+ /*background: #eeeeee 0 0 no-repeat;*/
+ background: url(../images/bg.png) no-repeat center;
+ background-size: cover;
+ overflow: hidden;
+}
+.login {
+ margin: 120px auto 0 auto;
+ min-height: 420px;
+ max-width: 420px;
+ padding: 40px;
+ background-color: #ffffff;
+ margin-left: auto;
+ margin-right: auto;
+ border-radius: 4px;
+ /* overflow-x: hidden; */
+ box-sizing: border-box;
+}
+.login a.logo {
+ display: block;
+ height: 58px;
+ width: 167px;
+ margin: 0 auto 30px auto;
+ background-size: 167px 42px;
+}
+.login .message {
+ margin: 10px 0 0 -58px;
+ padding: 18px 10px 18px 60px;
+ background: #189F92;
+ position: relative;
+ color: #fff;
+ font-size: 16px;
+}
+.login #darkbannerwrap {
+ background: url(../images/aiwrap.png);
+ width: 18px;
+ height: 10px;
+ margin: 0 0 20px -58px;
+ position: relative;
+}
+.login input[type=text],
+.login input[type=file],
+.login input[type=password],
+.login input[type=email],
+.login select {
+ border: 1px solid #DCDEE0;
+ vertical-align: middle;
+ border-radius: 3px;
+ height: 50px;
+ padding: 0px 16px;
+ font-size: 14px;
+ color: #555555;
+ outline: none;
+ width: 100%;
+ box-sizing: border-box;
+}
+.login input[type=text]:focus,
+.login input[type=file]:focus,
+.login input[type=password]:focus,
+.login input[type=email]:focus,
+.login select:focus {
+ border: 1px solid #27A9E3;
+}
+.login input[type=submit],
+.login input[type=button] {
+ display: inline-block;
+ padding: 12px 24px;
+ margin: 0px;
+ font-size: 18px;
+ line-height: 24px;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: middle;
+ cursor: pointer;
+ color: #ffffff;
+ background-color: #189F92;
+ border-radius: 3px;
+ border: none;
+ -webkit-appearance: none;
+ outline: none;
+ width: 100%;
+}
+.login hr {
+ background: #fff 0 0 no-repeat;
+}
+.login hr.hr15 {
+ height: 15px;
+ border: none;
+ margin: 0px;
+ padding: 0px;
+ width: 100%;
+}
+.login hr.hr20 {
+ height: 20px;
+ border: none;
+ margin: 0px;
+ padding: 0px;
+ width: 100%;
+}
+.weadmin-body {
+ padding: 20px;
+}
+.weadmin-nav {
+ padding: 0 20px;
+ position: relative;
+ z-index: 99;
+ border-bottom: 1px solid #e5e5e5;
+ line-height: 39px;
+ height: 39px;
+ overflow: hidden;
+}
+.weadmin-block {
+ display: block;
+ margin-bottom: 10px;
+ padding: 5px;
+ line-height: 22px;
+ /* border-left: 5px solid #009688; */
+ border-radius: 0 2px 2px 0;
+ background-color: #f2f2f2;
+}
+.we-search {
+ margin-bottom: 20px;
+ font-size: 16px;
+}
+.we-search input.layui-input {
+ width: 190px;
+}
+.we-red {
+ color: red;
+}
+.page {
+ margin-top: 20px;
+ text-align: center;
+}
+.page a {
+ display: inline-block;
+ background: #fff 0 0 no-repeat;
+ color: #888;
+ padding: 10px;
+ min-width: 15px;
+ border: 1px solid #E2E2E2;
+}
+.page span {
+ display: inline-block;
+ padding: 10px;
+ min-width: 15px;
+ border: 1px solid #E2E2E2;
+}
+.page span.current {
+ display: inline-block;
+ background: #009688 0 0 no-repeat;
+ color: #fff;
+ padding: 10px;
+ min-width: 15px;
+ border: 1px solid #009688;
+}
+.page .pagination li {
+ display: inline-block;
+ margin-right: 5px;
+ text-align: center;
+}
+.page .pagination li.active span {
+ background: #009688 0 0 no-repeat;
+ color: #fff;
+ border: 1px solid #009688;
+}
+/*登录样式*/
+/*头部*/
+.container {
+ width: 100%;
+ height: 45px;
+ background-color: #222;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+}
+.container .logo a {
+ float: left;
+ color: #fff;
+ font-size: 18px;
+ padding-left: 20px;
+ line-height: 45px;
+ width: 200px;
+}
+.container .right {
+ background-color: rgba(0, 0, 0, 0);
+ float: right;
+}
+.container .left_open {
+ height: 45px;
+ float: left;
+}
+.container .left_open i {
+ display: block;
+ background: rgba(255, 255, 255, 0.1) 0 0 no-repeat;
+ color: #fff;
+ width: 32px;
+ height: 32px;
+ line-height: 32px;
+ border-radius: 3px;
+ text-align: center;
+ margin-top: 7px;
+ cursor: pointer;
+}
+.container .left_open i:hover {
+ background: rgba(255, 255, 255, 0.3) 0 0 no-repeat;
+}
+.container .left {
+ background-color: rgba(0, 0, 0, 0);
+ float: left;
+}
+.container .layui-nav-item {
+ line-height: 45px;
+}
+.container .layui-nav-child {
+ top: 50px;
+}
+.container .layui-nav-child i {
+ margin-right: 10px;
+}
+.layui-nav .layui-nav-item a {
+ color: #fff;
+}
+.layui-nav .layui-nav-child a {
+ color: #333;
+}
+.left-nav {
+ position: absolute;
+ top: 46px;
+ bottom: 42px;
+ left: 0;
+ z-index: 2;
+ padding-top: 10px;
+ background-color: #EEEEEE;
+ width: 220px;
+ max-width: 220px;
+ overflow: auto;
+ overflow-x: hidden;
+ border-right: 1px solid #e5e5e5;
+}
+.left-nav #nav .current {
+ background-color: rgba(0, 0, 0, 0.3);
+}
+.left-nav #nav li {
+ border-bottom: 1px solid #e5e5e5;
+}
+.left-nav #nav li:hover > a {
+ /*color: blue;*/
+}
+.left-nav #nav li a {
+ font-size: 14px;
+ padding: 10px 15px 10px 20px;
+ display: block;
+ cursor: pointer;
+}
+.left-nav #nav li a cite {
+ font-size: 14px;
+}
+.left-nav #nav li .opened {
+ display: block;
+}
+.left-nav #nav li .opened:hover {
+ /*background: #fff 0 0 no-repeat;*/
+}
+.left-nav #nav li .sub-menu {
+ display: none;
+}
+.left-nav #nav li .sub-menu li:hover {
+ /*color: blue;*/
+ /*background: #fff 0 0 no-repeat;*/
+}
+.left-nav #nav li .sub-menu li a {
+ padding: 12px 15px 12px 30px;
+ font-size: 14px;
+ cursor: pointer;
+}
+.left-nav #nav li .sub-menu li a i {
+ font-size: 12px;
+}
+.left-nav #nav li .sub-menu li a:hover {
+ color: #148cf1;
+}
+.left-nav #nav li .sub-menu li .sub-menu li a {
+ padding-left: 45px;
+}
+.left-nav #nav li .nav_right {
+ float: right;
+ font-size: 16px;
+ transform: rotate(180deg);
+}
+.left-nav #nav li a i {
+ padding-right: 10px;
+ line-height: 14px;
+}
+.x-slide_left {
+ width: 17px;
+ height: 61px;
+ background: url(../images/icon.png) 0 0 no-repeat;
+ position: absolute;
+ top: 200px;
+ left: 221px;
+ cursor: pointer;
+ z-index: 3;
+}
+.page-content {
+ position: absolute;
+ top: 46px;
+ right: 0;
+ bottom: 42px;
+ left: 221px;
+ overflow: hidden;
+ z-index: 1;
+}
+.page-content-bg {
+ position: absolute;
+ top: 46px;
+ right: 0;
+ bottom: 42px;
+ left: 221px;
+ background: rgba(0, 0, 0, 0.5) 0 0 no-repeat;
+ overflow: hidden;
+ z-index: 100;
+ display: none;
+}
+.page-content .tab {
+ height: 100%;
+ width: 100%;
+ background: #EFEEF0 0 0 no-repeat;
+ margin: 0px;
+}
+.page-content .layui-tab-title {
+ /*padding-top: 5px;*/
+ height: 35px;
+ background: #EFEEF0 0 0 no-repeat;
+ position: relative;
+ z-index: 100;
+}
+.page-content .layui-tab-title li {
+ line-height: 35px;
+}
+.page-content .layui-tab-title li .layui-tab-close {
+ border-radius: 50%;
+}
+.page-content .layui-tab-title .layui-this:after {
+ height: 36px;
+}
+.page-content .layui-tab-title .layui-this {
+ background: #fff 0 0 no-repeat;
+}
+.page-content .layui-tab-bar {
+ height: 34px;
+ line-height: 35px;
+}
+.page-content .layui-tab-content {
+ position: absolute;
+ top: 36px;
+ bottom: 0px;
+ width: 100%;
+ background: #fff 0 0 no-repeat;
+ padding: 0px;
+ overflow: hidden;
+}
+.page-content .layui-tab-content .layui-tab-item {
+ width: 100%;
+ height: 100%;
+}
+.page-content .layui-tab-content .layui-tab-item iframe {
+ width: 100%;
+ height: 100%;
+}
+.welcome-footer {
+ padding: 30px 0;
+ line-height: 30px;
+ text-align: center;
+ background-color: #eee;
+ color: #666;
+ font-weight: 300;
+}
+body .layui-layout-admin .footer-demo {
+ height: auto;
+ padding: 15px 0;
+ line-height: 26px;
+}
+.welcome-footer a {
+ padding: 0 5px;
+}
+table th,
+table td {
+ word-break: break-all;
+}
+.footer {
+ position: fixed;
+ bottom: 0px;
+ width: 100%;
+ background-color: #222;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+ line-height: 41px;
+ color: #fff;
+ /*padding-left: 10px;*/
+}
+.footer .copyright {
+ margin-left: 10px;
+}
+@media screen and (max-width: 768px) {
+ .fast-add {
+ display: none;
+ }
+ .layui-nav .to-index {
+ display: none;
+ }
+ .container .logo a {
+ width: 140px;
+ }
+ .container .left_open {
+ /*float: right;*/
+ }
+ .left-nav {
+ left: -221px;
+ }
+ .page-content {
+ left: 0px;
+ }
+ .page-content .layui-tab-content .layui-tab-item {
+ -webkit-overflow-scrolling: touch;
+ overflow-y: scroll;
+ }
+ .we-search input.layui-input {
+ width: 100%;
+ margin: 10px;
+ }
+}
+.we-changelog .layui-timeline-title h3 {
+ display: inline-block;
+}
+.we-changelog .layui-timeline-title .layui-badge-rim {
+ top: -2px;
+ left: 10px;
+}
+.weadmin-shortcut {
+ height: 185px!important;
+ background-color: #fff;
+}
+.weadmin-shortcut .layui-carousel,
+.weadmin-shortcut > [carousel-item] > * {
+ background-color: #fff;
+}
+.weadmin-shortcut .layui-col-space10 {
+ margin: 0;
+}
+.weadmin-shortcut li {
+ text-align: center;
+}
+.weadmin-shortcut li a {
+ display: block;
+}
+.weadmin-shortcut li .layui-icon {
+ display: inline-block;
+ width: 100%;
+ height: 120px;
+ line-height: 120px;
+ text-align: center;
+ border-radius: 2px;
+ font-size: 30px;
+ background-color: #F8F8F8;
+ color: #333;
+ transition: all .3s;
+ -webkit-transition: all .3s;
+}
+.weadmin-shortcut li:hover .layui-icon {
+ background-color: #f2f2f2;
+}
+.weadmin-shortcut li cite {
+ position: relative;
+ top: 2px;
+ display: block;
+ color: #333333;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+ font-size: 16px;
+}
+.weadmin-shortcut li p {
+ font-size: 12px;
+ line-height: 16px;
+ color: #666666;
+ margin-top: 5px;
+}
+.weadmin-shortcut li p span {
+ text-align: left;
+ display: inline-block;
+}
+.weadmin-shortcut .layui-carousel-ind {
+ position: absolute;
+ top: -41px;
+ text-align: right;
+}
+.weadmin-shortcut .layui-carousel-ind ul {
+ background: 0 0;
+}
+.weadmin-shortcut .layui-carousel-ind ul li {
+ background-color: #e2e2e2;
+}
+.weadmin-shortcut .layui-carousel-ind ul li:hover {
+ background-color: #c2c2c2;
+}
+.weadmin-shortcut .layui-carousel-ind ul li.layui-this {
+ background-color: #999;
+}
+.weadmin-text p {
+ margin-bottom: 10px;
+ text-indent: 2em;
+}
+.layui-card-header.layui-elem-quote {
+ line-height: 22px;
+ height: 22px;
+ padding: 15px;
+}
+.weadmin-notice {
+ height: 60px!important;
+}
+.weadmin-notice a {
+ display: block;
+ text-align: center;
+ line-height: 60px;
+}
+.weadmin-notice .layui-carousel-ind {
+ position: absolute;
+ top: -56px;
+ text-align: right;
+}
+.weadmin-notice .layui-carousel-ind ul {
+ background: 0 0;
+}
+.weadmin-notice .layui-carousel-ind ul li {
+ background-color: #e2e2e2;
+}
+.weadmin-notice .layui-carousel-ind ul li:hover {
+ background-color: #c2c2c2;
+}
+.weadmin-notice .layui-carousel-ind ul li.layui-this {
+ background-color: #999;
+}
+/*# sourceMappingURL=weadmin.css.map */
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/static/css/client/blog.css b/sparchetype/src/main/resources/static/css/client/blog.css
deleted file mode 100644
index 8f3ce63..0000000
--- a/sparchetype/src/main/resources/static/css/client/blog.css
+++ /dev/null
@@ -1,236 +0,0 @@
-body{background: #fff;}
-
-/** 首页 */
-
-/*导航部分*/
-.nav{width: 100%; height: 80px; box-shadow: 0 3px 3px 0 #CCC; background: #FFF; position: fixed; left: 0; top: 0; z-index: 999; overflow: hidden; transition: 0.3s}
-.nav.index{background: rgba(255, 255, 255 ,0.8); box-shadow: 0 0 0 0 rgba(0,0,0,0.05);}
-.nav.scroll{ background: #FFF; box-shadow: 0 3px 3px 0 rgba(0,0,0,0.05); transition: 0.3s}
-.nav .layui-container{position: relative; transition: all 400ms ease-out;}
-.nav .nav-logo{height: 100%; position: absolute; top: 0; left: 15px; line-height: 80px;}
-.nav .nav-list{display: inline-block; height: 80px;}
-.nav .nav-list button{width: 25px; height: 30px; position: absolute; top: 30px; right: 15px; background-color: transparent; border: none; outline: none; cursor: pointer;}
-.nav .nav-list button span{display: block; width: 25px; height: 2px; background: #2db5a3; margin-bottom: 6px; transition: 0.5s;}
-.nav .nav-list button span.spa1{transform: rotate(45deg);}
-.nav .nav-list button span.spa3{transform: rotate(-45deg) translate(5px,-5px);}
-.nav .layui-nav{width: 100%; position: absolute; top: 80px; right: 0; color: #000; background: transparent;}
-.nav .layui-nav .layui-nav-item{display: block; line-height: 60px;}
-.nav .layui-nav *{font-size: 18px;}
-.nav .layui-nav .layui-nav-item a{padding: 0 0; color: #000;}
-.nav .layui-nav-bar,
-.nav .layui-nav .layui-this:after{height: 2px; background-color: #2db5a3;}
-.nav .layui-nav .layui-this a
-,.nav .layui-nav .layui-nav-item a:hover{color: #2db5a3;}
-
-/*轮播*/
-#banner img{min-width: 100%; height: 898px;}
-#banner .panel{width: 400px; position: absolute; top: 25%; left: 50%; margin-left: -200px; text-align: center;}
-#banner .panel p{color: #8c8c8c; font-size: 44px; line-height: 80px; letter-spacing: 15px;}
-#banner .panel p.title{color: #4a4a4a; font-size: 54px; letter-spacing: 10px;}
-
-/*主体—产品*/
-.main-product{padding-top: 90px; padding-bottom: 130px;}
-.main-product p{font-size: 16px; color: #ababab; line-height: 28px;}
-.main-product p.title
-,.main-service p.title{color: #484848; font-size: 24px; text-align: center; line-height: 160px;}
-.main-product p.title span
-,.main-service p.title span{color: #2db5a3;}
-.main-product .content{border: 1px solid #DEDEDE; padding: 30px 36px 0 36px; text-align: center; transition: 0.3s;}
-.main-product .content p.label{font-size: 18px; color: #939393; line-height: 46px; padding-top: 6px;}
-.main-product .content a{font-size: 18px; color: #a1d8cb; line-height: 68px;}
-.main-product .content:hover{box-shadow: 0 0 3px 3px #EEE; transition: 0.3s;}
-.main-product .content img{transition: 2s;}
-.main-product .content img:hover{transform: rotateY(180deg);}
-
-/*主体-服务*/
-.main-service{background: #f8f8f8;}
-.main-service .content{position: relative;}
-.main-service .content .content-left{width: 50%;}
-.main-service .content .content-left img{width: 100%;}
-.main-service .content .content-right{box-sizing: border-box; background: #FFF; padding: 58px 40px 0 48px; width: 50%; height: 100%; position: absolute; top: 0; right: 0; transition: 0.3s; overflow: hidden;}
-.main-service .content .content-right p{color: #adadad; line-height: 32px; overflow: hidden; text-overflow: ellipsis;}
-.main-service .content .content-right p.label{font-size: 16px; color: #4a4a4a;}
-.main-service .content .content-right span{display: block; width: 50px; height: 2px; background: #2cb6a1; margin-bottom: 23px;}
-.main-service .content .content-right:hover{box-shadow: 2px 2px 2px #EEE; transition: 0.3s;}
-.main-service .service-more{padding-top: 80px; padding-bottom: 80px; text-align: center;}
-.main-service .service-more a{padding: 10px 62px; font-size: 23px; line-height: 46px;color: #FFF; background: #7fd3c6; border-radius: 3px;}
-
-/*底部*/
-.footer{padding-bottom: 70px; background: #5e6664;}
-.footer .footer-web{padding-top: 50px; padding-bottom: 63px;}
-.footer .footer-web a{color: #a5aaa9; line-height: 22px; margin-right: 20px; transition: 0.3s;}
-.footer .footer-web a:hover{color: #dce1e0; transition: 0.3s;}
-.footer .footer-contact{color: #fff;}
-.footer .footer-contact a{color: #a5aaa9;}
-.footer .footer-contact .contact-top{padding-top: 20px; line-height: 30px;}
-.footer .footer-contact .contact-bottom{line-height: 35px;}
-
-
-/** 产品 */
-.banner{height: 320px; margin-top: 80px;}
-.banner.product{background: url(../img/nav_img1.jpg) no-repeat center top; background-size: cover;}
-.main.product{padding: 30px 0 75px 0;}
-.main.product .content{padding: 50px 0; border-bottom: 1px solid #e8e8e8;}
-.main.product .content .content-img{text-align: center;}
-.main.product .content .content-img img{max-width: 100%;}
-.main.product .content .label{color: #565656; font-size: 30px; line-height: 78px; margin-top: 32px;}
-.main.product .content .detail{font-size: 16px; line-height: 28px; color: #d7d7d7; padding-bottom: 30px;}
-.main.product .content a{color: #a0d2cc; font-size: 16px; line-height: 38px; padding:10px 11px 10px 23px; border: 1px solid #a0d2cc; border-radius: 3px;}
-
-
-/** 动态 */
-.banner.news{background: url(../img/nav_img3.jpg) no-repeat center top; background-size: cover;}
-.banner .title{padding-top: 170px;}
-.banner .title.active{padding-top: 120px; transition: 1.5s;}
-.banner .title p{color: #606060; font-size: 36px; text-align: center; line-height: 50px; letter-spacing: 5px;}
-.banner .title p.en{font-size: 20px; letter-spacing: 3px;}
-.main-news{padding: 70px 0 80px 0;}
-.main-news .content > div{padding-bottom: 40px; border-bottom: 1px dashed #eaeaea; position: relative;}
-.main-news .content .news-img{display: inline-block; width: 30%; vertical-align: top;}
-.main-news .content .news-img img{max-width: 90%;}
-.main-news .content .news-panel{display: inline-block; width: 70%; vertical-align: top; padding-left: 5px; box-sizing: border-box;}
-.main-news .content .news-panel strong a{display: block; color: #555; font-size: 18px; line-height: 26px; overflow: hidden; text-overflow:ellipsis; white-space: nowrap;}
-.main-news .content .news-panel p.detail{color: #777; line-height: 24px;}
-.main-news .content .news-panel p.read-push{color: #AAA; padding-top: 5px;}
-.main-news #newsPage .layui-laypage{display: block; text-align: center; margin-top: 70px;}
-.main-news #newsPage .layui-laypage a,.main-news #newsPage .layui-laypage span{font-size: 18px; line-height: 40px; height: 40px; margin-right: 20px; border-radius: 3px; color: #e3e3e3;}
-/*动态详情页*/
-.main-newsdate{margin-top: 80px; text-align: center;}
-.main-newsdate .news{text-align: left; line-height: 104px;}
-.main-newsdate h1{padding-top: 6px;}
-.main-newsdate .pushtime{color: #686868; font-size: 18px; line-height: 82px;}
-.main-newsdate .introTop{padding-bottom: 28px; font-size: 18px; line-height: 20px; text-align: left;}
-.main-newsdate .introBott{font-size: 18px; line-height: 42px; text-align: justify; padding: 40px 0 102px 0;}
-.main-newsdate img{max-width: 100%;}
-
-
-/** 案例 */
-.banner.case{background: url(../img/nav_img2.jpg) no-repeat center top; background-size: cover;}
-.main-case{padding: 30px 0 75px;}
-.main-case .content{width: 48%; text-align: center; padding-top: 120px; padding-bottom: 20px; border-bottom: 2px solid #c9c9c9;}
-.main-case .content.even{margin-left: 2%;}
-.main-case .content .case-img{border: 1px solid #e2e2e2; overflow: hidden;}
-.main-case .content .case-img img{width: 100%; transition: 2s;}
-.main-case .content .case-img img:hover{transform: scale(1.2,1.2); transition: 2s;}
-.main-case .content p.lable{padding-top: 13px; font-size: 30px; line-height: 76px;}
-.main-case .content p{font-size: 18px; line-height: 32px; color: #505050;}
-.main-case #casePage .layui-laypage{display: block; text-align: center; margin-top: 100px;}
-.main-case #casePage .layui-laypage a,.main-case #casePage .layui-laypage span{font-size: 18px; line-height: 40px; height: 40px; margin-right: 20px; border-radius: 3px; color: #e3e3e3;}
-
-
-/** 关于 */
-.banner.about{background: url(../img/nav_img4.jpg) no-repeat center top; background-size: cover;}
-.main-about{padding-bottom: 130px;}
-.main-about ul.aboutab{padding: 100px 0; text-align: center;}
-.main-about ul.aboutab li{display: inline-block; padding: 0 22px; margin-left: 15px; font-size: 20px; line-height: 46px; color: #b5b5b5; border: 1px solid #e2e2e2; border-radius: 3px; cursor: pointer;}
-.main-about ul.aboutab li:first-child{margin-left: 0;}
-.main-about ul.aboutab li.layui-this
-,.main-about ul.aboutab li:hover{color: #2ab5a3; border-color: #afddd7; transition: 0.3s;}
-.main-about .tabJob, .main-about .tabCour{display: none;}
-/*公司简介*/
-.main-about .tabIntro{padding-bottom: 15px;}
-.main-about .tabIntro .content{vertical-align: middle;}
-.main-about .tabIntro .content .img{width: 50%;}
-.main-about .tabIntro .content .img img{width: 100%;}
-.main-about .tabIntro .content .panel{width: 50%;}
-.main-about .tabIntro .content p{padding: 0 20px; line-height: 24px; text-align: justify;}
-.main-about .tabIntro .p_hidden{padding: 0 20px; display: none;}
-/*招贤纳士*/
-.main-about .tabJob .content{padding: 0 0 40px 20px; border: 1px solid #e2e2e2; border-top: 4px solid #65d0c5; margin-top: 90px;}
-.main-about .tabJob .content:first-child{margin-top: 10px;}
-.main-about .tabJob .content p{font-size: 18px; line-height: 40px;}
-.main-about .tabJob .content p.title{font-size: 24px; color: #545454; line-height: 60px;}
-.main-about .tabJob .content ol{padding-left: 20px; list-style-type: none; counter-reset: sectioncounter;}
-.main-about .tabJob .content ol li{color: #8d8d8d; font-size: 16px; line-height: 30px;}
-.main-about .tabJob .content ol li:before {content: counter(sectioncounter) "、"; counter-increment: sectioncounter;}
-/*发展历程*/
-.main-about .tabCour p.title{font-size: 28px; line-height: 28px; text-align: center;}
-.main-about .tabCour .timeline{position: relative; margin-top: 75px;}
-.main-about .tabCour .timeline:before{position: absolute; top: 0; bottom: 0; content: ""; width: 2px; background-color: #e2e2e2; left: 50px;}
-.main-about .tabCour .timeline li{position: relative; padding-top: 70px;}
-.main-about .tabCour .timeline li:first-child{padding-top: 0;}
-.main-about .tabCour .timeline li .cour-img{position: absolute; left: 0; width: 100px; border-radius: 50%;}
-.main-about .tabCour .timeline li .cour-img img{width: 100%;}
-.main-about .tabCour .timeline li .cour-panel{padding-top: 20px; padding-left: 120px; text-align: left;}
-.main-about .tabCour .timeline li .cour-panel p.label{font-size: 18px; color: #000;}
-.main-about .tabCour .timeline li .cour-panel p{color: #949494; line-height: 30px;}
-
-
-@media screen and (max-width: 480px){
- .main-service .content .content-right{padding: 10px 10px 0 10px;}
- .main-service .content .content-right p{line-height: 24px;}
- .main-news .content .news-panel p.read-push{font-size: 12px;}
- .main-case .content{padding-top: 60px;}
- .main-case .content p.lable{padding-top: 10px; font-size: 18px; line-height: 48px;}
- .main-case .content p{font-size: 12px; line-height: 20px; color: #505050;}
- .main-about ul.aboutab{padding: 70px 0;}
- .main-about ul.aboutab li{padding: 0 15px; font-size: 16px; box-sizing: border-box;}
- .main-about .tabIntro .content .img{width: 100%;}
- .main-about .tabIntro .content .panel{width: 100%;}
- .main-about .tabIntro .content .panel.p_block{display: none;}
- .main-about .tabIntro .p_hidden{display: block;}
- .main-news #newsPage .layui-laypage a,.main-news #newsPage .layui-laypage span
- ,.main-case #casePage .layui-laypage a,.main-case #casePage .layui-laypage span{padding: 0 12px; font-size: 14px; line-height: 30px; height: 30px; margin-right: 4px;}
-}
-/*小屏幕*/
-@media screen and (min-width: 768px){
- .nav{max-height: 80px;}
- .nav.index{background: rgba(255, 255, 255 ,0.3);}
- .nav .nav-list button{display: none;}
- .nav .layui-nav{width: auto; position: absolute; top: 0; padding: 0 5px; border-radius: 0; margin: 0;}
- .nav .layui-nav .layui-nav-item{display: inline-block; margin:0 53px; line-height: 80px;}
- .main-product p.title
- ,.main-service p.title{font-size: 36px; line-height: 216px;}
- .main.product .content .content-img{text-align: left;}
- .main-news .content .news-panel strong a{font-size: 20px; line-height: 30px;}
- .main-news .content .news-panel p.read-push{padding-top: 0; position: absolute; bottom: 40px;}
- .main-newsdate .pushtime{line-height: 142px;}
- .main-case .content{width: 45%;}
- .main-case .content.even{margin-left: 9%;}
- .main-about ul.aboutab li{padding: 0 32px; font-size: 24px; margin-left: 30px; line-height: 50px;}
- .main-about .tabIntro .content p{padding: 0 30px; font-size: 18px; line-height: 30px;}
- .main-about .tabJob .content p{font-size: 24px; line-height: 50px;}
- .main-about .tabJob .content p.title{font-size: 30px; line-height: 90px;}
- .main-about .tabJob .content ol li{font-size: 20px; line-height: 60px;}
- .main-about .tabCour .timeline:before{left: 50%;}
- .main-about .tabCour .timeline li{min-height: 195px; padding-top: 95px;}
- .main-about .tabCour .timeline li .cour-img{left: 50%; margin-left: -97.5px; width: 195px;}
- .main-about .tabCour .timeline li .cour-panel{padding-top: 55px; padding-left: 0;}
- .main-about .tabCour .timeline li.odd .cour-panel{text-align: right;}
-}
-@media screen and (min-width: 768px) and (max-width: 992px){
- .main.product .content div.right{padding-left: 20px;}
- .nav .layui-nav .layui-nav-item{margin:0 33px;}
- .main-service .content .content-right{padding: 10px 10px 0 15px;}
- .main-service .content .content-right span{margin-bottom: 20px;}
- .main-service .content .content-right p{line-height: 28px;}
- .main.product .content .label{line-height: 40px; margin-top: 0;}
- .main.product .content .detail{padding-bottom: 10px;}
-}
-/*大屏幕*/
-@media screen and (min-width: 992px){
- .main.product .content{padding: 100px 0;}
- .main.product .content div.right{padding-left: 0;}
- .main-news .content .news-img{width: 20%;}
- .main-news .content .news-panel{width: 80%;}
- .main-case .content{width: 31%;}
- .main-case .content.even{margin-left: 0;}
- .main-case .content.center{margin-right: 3%; margin-left: 3%;}
- .main-about .tabIntro .content p{padding: 0 50px; font-size: 20px; line-height: 40px;}
-}
-/*超大屏幕*/
-@media screen and (min-width: 1200px) {
- .main-news .content .news-img{width: 35%;}
- .main-news .content .news-panel{width: 65%;}
- .main-news .content:nth-child(odd){padding-right: 20px;}
- .main-news .content:nth-child(even){padding-left: 20px;}
- .main-about .tabCour .timeline li .cour-panel{padding-left: 50px;}
- .main-about .tabCour .timeline li.odd .cour-panel{padding-left: 0; padding-right: 50px;}
-}
-@media screen and (min-width: 1300px) {
- .layui-container{width: 1200px; padding: 0;}
- .main-about .tabJob .content:last-child{margin-bottom: 180px;}
- .nav .nav-logo{position: absolute; top: 0; left: 0;}
- .layui-col-space80{margin: -40px;}
- .layui-col-space80>*{padding: 40px;}
-}
diff --git a/sparchetype/src/main/resources/static/css/font.css b/sparchetype/src/main/resources/static/css/font.css
new file mode 100644
index 0000000..b83e5b4
--- /dev/null
+++ b/sparchetype/src/main/resources/static/css/font.css
@@ -0,0 +1,16 @@
+@font-face {
+ font-family: 'iconfont';
+ src: url('../fonts/iconfont.eot');
+ src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/iconfont.woff') format('woff'),
+ url('../fonts/iconfont.ttf') format('truetype'),
+ url('../fonts/iconfont.svg#iconfont') format('svg');
+}
+.iconfont{
+ font-family:"iconfont" !important;
+ font-size:16px;font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -webkit-text-stroke-width: 0.2px;
+ -moz-osx-font-smoothing: grayscale;
+}
+
diff --git a/sparchetype/src/main/resources/static/favicon.ico b/sparchetype/src/main/resources/static/favicon.ico
index 14124ae..457962f 100644
Binary files a/sparchetype/src/main/resources/static/favicon.ico and b/sparchetype/src/main/resources/static/favicon.ico differ
diff --git a/sparchetype/src/main/resources/static/fonts/iconfont.eot b/sparchetype/src/main/resources/static/fonts/iconfont.eot
new file mode 100644
index 0000000..df5334a
Binary files /dev/null and b/sparchetype/src/main/resources/static/fonts/iconfont.eot differ
diff --git a/sparchetype/src/main/resources/static/fonts/iconfont.svg b/sparchetype/src/main/resources/static/fonts/iconfont.svg
new file mode 100644
index 0000000..f6f082e
--- /dev/null
+++ b/sparchetype/src/main/resources/static/fonts/iconfont.svg
@@ -0,0 +1,477 @@
+
+
+
+
diff --git a/sparchetype/src/main/resources/static/fonts/iconfont.ttf b/sparchetype/src/main/resources/static/fonts/iconfont.ttf
new file mode 100644
index 0000000..ccf533e
Binary files /dev/null and b/sparchetype/src/main/resources/static/fonts/iconfont.ttf differ
diff --git a/sparchetype/src/main/resources/static/fonts/iconfont.woff b/sparchetype/src/main/resources/static/fonts/iconfont.woff
new file mode 100644
index 0000000..d06756c
Binary files /dev/null and b/sparchetype/src/main/resources/static/fonts/iconfont.woff differ
diff --git a/sparchetype/src/main/resources/static/image/aiwrap.png b/sparchetype/src/main/resources/static/image/aiwrap.png
new file mode 100644
index 0000000..36fd481
Binary files /dev/null and b/sparchetype/src/main/resources/static/image/aiwrap.png differ
diff --git a/sparchetype/src/main/resources/static/image/bg.png b/sparchetype/src/main/resources/static/image/bg.png
new file mode 100644
index 0000000..c518e9d
Binary files /dev/null and b/sparchetype/src/main/resources/static/image/bg.png differ
diff --git a/sparchetype/src/main/resources/static/image/mapico1.png b/sparchetype/src/main/resources/static/image/mapico1.png
new file mode 100644
index 0000000..def7722
Binary files /dev/null and b/sparchetype/src/main/resources/static/image/mapico1.png differ
diff --git a/sparchetype/src/main/resources/static/image/mapico2.png b/sparchetype/src/main/resources/static/image/mapico2.png
new file mode 100644
index 0000000..5e00fd4
Binary files /dev/null and b/sparchetype/src/main/resources/static/image/mapico2.png differ
diff --git a/sparchetype/src/main/resources/static/image/mapico3.png b/sparchetype/src/main/resources/static/image/mapico3.png
new file mode 100644
index 0000000..bd4f9b6
Binary files /dev/null and b/sparchetype/src/main/resources/static/image/mapico3.png differ
diff --git a/sparchetype/src/main/resources/static/image/mapico4.png b/sparchetype/src/main/resources/static/image/mapico4.png
new file mode 100644
index 0000000..24ea5dd
Binary files /dev/null and b/sparchetype/src/main/resources/static/image/mapico4.png differ
diff --git a/sparchetype/src/main/resources/static/img/Big_icon1.png b/sparchetype/src/main/resources/static/img/Big_icon1.png
deleted file mode 100644
index 932c27f..0000000
Binary files a/sparchetype/src/main/resources/static/img/Big_icon1.png and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/Big_icon2.png b/sparchetype/src/main/resources/static/img/Big_icon2.png
deleted file mode 100644
index b4ffd01..0000000
Binary files a/sparchetype/src/main/resources/static/img/Big_icon2.png and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/Big_icon3.png b/sparchetype/src/main/resources/static/img/Big_icon3.png
deleted file mode 100644
index 010f6d8..0000000
Binary files a/sparchetype/src/main/resources/static/img/Big_icon3.png and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/Big_icon4.png b/sparchetype/src/main/resources/static/img/Big_icon4.png
deleted file mode 100644
index a663d49..0000000
Binary files a/sparchetype/src/main/resources/static/img/Big_icon4.png and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/QRcode.jpg b/sparchetype/src/main/resources/static/img/QRcode.jpg
deleted file mode 100644
index e48eb91..0000000
Binary files a/sparchetype/src/main/resources/static/img/QRcode.jpg and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/banner1.jpg b/sparchetype/src/main/resources/static/img/banner1.jpg
deleted file mode 100644
index 0a1c583..0000000
Binary files a/sparchetype/src/main/resources/static/img/banner1.jpg and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/banner2.jpg b/sparchetype/src/main/resources/static/img/banner2.jpg
deleted file mode 100644
index 40de5f2..0000000
Binary files a/sparchetype/src/main/resources/static/img/banner2.jpg and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/home_img1.jpg b/sparchetype/src/main/resources/static/img/home_img1.jpg
deleted file mode 100644
index e45a108..0000000
Binary files a/sparchetype/src/main/resources/static/img/home_img1.jpg and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/home_img2.jpg b/sparchetype/src/main/resources/static/img/home_img2.jpg
deleted file mode 100644
index a2683f9..0000000
Binary files a/sparchetype/src/main/resources/static/img/home_img2.jpg and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/home_img3.jpg b/sparchetype/src/main/resources/static/img/home_img3.jpg
deleted file mode 100644
index 5672fa2..0000000
Binary files a/sparchetype/src/main/resources/static/img/home_img3.jpg and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/home_img4.jpg b/sparchetype/src/main/resources/static/img/home_img4.jpg
deleted file mode 100644
index 561127a..0000000
Binary files a/sparchetype/src/main/resources/static/img/home_img4.jpg and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/img/logo.png b/sparchetype/src/main/resources/static/img/logo.png
deleted file mode 100644
index a3a09f5..0000000
Binary files a/sparchetype/src/main/resources/static/img/logo.png and /dev/null differ
diff --git a/sparchetype/src/main/resources/static/js/admin.js b/sparchetype/src/main/resources/static/js/admin.js
new file mode 100644
index 0000000..a1e3a48
--- /dev/null
+++ b/sparchetype/src/main/resources/static/js/admin.js
@@ -0,0 +1,487 @@
+/*
+ * @Author: https://github.com/WangEn
+ * @Author: https://gitee.com/lovetime/
+ * @Date: 2018-01-01
+ * @lastModify 2019-06-20 17:23:47
+ * +----------------------------------------------------------------------
+ * | Weadmin [ 后台管理模板 ]
+ * | 基于Layui http://www.layui.com/
+ * +----------------------------------------------------------------------
+ */
+
+layui.define(['jquery', 'form', 'layer', 'element'], function(exports) {
+ var $ = layui.jquery,
+ form = layui.form,
+ layer = layui.layer,
+ element = layui.element;
+ var menu = [];
+ var curMenu;
+
+ /*
+ * @todo 初始化加载完成执行方法
+ * 打开或刷新后执行
+ */
+ $(function() {
+
+ /*
+ * @todo 读取本地存储中记录的已打开的tab项
+ * 刷新后,读取记录,打开原来已打开的tab项
+ */
+
+ /*
+ * @todo table事件
+ */
+ tableCheck = {
+ init: function() {
+ $(".layui-form-checkbox").click(function(event) {
+ if($(this).hasClass('layui-form-checked')) {
+ $(this).removeClass('layui-form-checked');
+ if($(this).hasClass('header')) {
+ $(".layui-form-checkbox").removeClass('layui-form-checked');
+ }
+ } else {
+ $(this).addClass('layui-form-checked');
+ if($(this).hasClass('header')) {
+ $(".layui-form-checkbox").addClass('layui-form-checked');
+ }
+ }
+ });
+ },
+ getData: function() {
+ var obj = $(".layui-form-checked").not('.header');
+ var arr = [];
+ obj.each(function(index, el) {
+ arr.push(obj.eq(index).attr('data-id'));
+ });
+ return arr;
+ }
+ }
+ //开启表格多选
+ tableCheck.init();
+ //延时加载
+ setTimeout(function() {
+ if(sessionStorage.getItem("menu")) {
+ menu = JSON.parse(sessionStorage.getItem("menu"));
+ for(var i = 0; i < menu.length; i++) {
+ tab.tabAdd(menu[i].title, menu[i].url, menu[i].id);
+ }
+ } else {
+ return false;
+ }
+ if(sessionStorage.getItem("curMenu")) {
+ $('.layui-tab-title').find('layui-this').removeClass('layui-class');
+ curMenu = JSON.parse(sessionStorage.getItem("curMenu"));
+ id = curMenu.id;
+ if(id) { //因为默认桌面首页不存在lay-id,所以要对此判断
+ $('.layui-tab-title li[lay-id="' + id + '"]').addClass('layui-this');
+ tab.tabChange(id);
+ } else {
+ $(".layui-tab-title li").eq(0).addClass('layui-this'); //未生效
+ $('.layui-tab-content iframe').eq(0).parent().addClass('layui-show');
+ }
+ } else {
+ $(".layui-tab-title li").eq(0).addClass('layui-this'); //未生效
+ $('.layui-tab-content iframe').eq(0).parent().addClass('layui-show');
+ }
+ }, 100);
+ //点击tab标题时,触发reloadTab函数
+ $('#tabName').on('click','li',function(){
+ reloadTab(this);
+ });
+
+ //初始化加载结束
+ });
+
+ /*
+ * @todo 左侧导航菜单的显示和隐藏
+ */
+ // $('.container .left_open i').click(function(event) {
+ $('.container').on('click', '.left_open i', function(event) {
+ if($('.left-nav').css('left') == '0px') {
+ //此处左侧菜单是显示状态,点击隐藏
+ $('.left-nav').animate({
+ left: '-221px'
+ }, 100);
+ $('.page-content').animate({
+ left: '0px'
+ }, 100);
+ $('.page-content-bg').hide();
+ } else {
+ //此处左侧菜单是隐藏状态,点击显示
+ $('.left-nav').animate({
+ left: '0px'
+ }, 100);
+ $('.page-content').animate({
+ left: '221px'
+ }, 100);
+ //点击显示后,判断屏幕宽度较小时显示遮罩背景
+ if($(window).width() < 768) {
+ $('.page-content-bg').show();
+ }
+ }
+ });
+ //点击遮罩背景,左侧菜单隐藏
+ $('.page-content-bg').click(function(event) {
+ $('.left-nav').animate({
+ left: '-221px'
+ }, 100);
+ $('.page-content').animate({
+ left: '0px'
+ }, 100);
+ $(this).hide();
+ });
+
+ /*
+ * @todo 左侧菜单事件
+ * 如果有子级就展开,没有就打开frame
+ */
+ $('body').on('click', '.left-nav #nav li', function(event) {
+ if($(this).children('.sub-menu').length) {
+ if($(this).hasClass('open')) {
+ $(this).removeClass('open');
+ $(this).find('.nav_right').html('');
+ $(this).children('.sub-menu').stop().slideUp();
+ $(this).siblings().children('.sub-menu').slideUp();
+ } else {
+ $(this).addClass('open');
+ $(this).children('a').find('.nav_right').html('');
+ $(this).children('.sub-menu').stop().slideDown();
+ $(this).siblings().children('.sub-menu').stop().slideUp();
+ $(this).siblings().find('.nav_right').html('');
+ $(this).siblings().removeClass('open');
+ }
+ } else {
+ var url = $(this).children('a').attr('_href');
+ var title = $(this).find('cite').html();
+ var index = $('.left-nav #nav li').index($(this));
+
+ for(var i = 0; i < $('.weIframe').length; i++) {
+ if($('.weIframe').eq(i).attr('tab-id') == index + 1) {
+ tab.tabChange(index + 1);
+ event.stopPropagation();
+ return;
+ }
+ };
+
+ tab.tabAdd(title, url, index + 1);
+ tab.tabChange(index + 1);
+ }
+ event.stopPropagation(); //不触发任何前辈元素上的事件处理函数
+ });
+
+ /*
+ * @todo tab触发事件:增加、删除、切换
+ */
+ var tab = {
+ tabAdd: function(title, url, id) {
+ //判断当前id的元素是否存在于tab中
+ var li = $("#WeTabTip li[lay-id=" + id + "]").length;
+ //console.log(li);
+ if(li > 0) {
+ //tab已经存在,直接切换到指定Tab项
+ //console.log(">0");
+ element.tabChange('wenav_tab', id); //切换到:用户管理
+ } else {
+ //该id不存在,新增一个Tab项
+ //console.log("<0");
+ element.tabAdd('wenav_tab', {
+ title: title,
+ content: '',
+ id: id
+ });
+ //当前窗口内容
+ setStorageMenu(title, url, id);
+
+ }
+ CustomRightClick(id); //绑定右键菜单
+ FrameWH(); //计算框架高度
+
+ },
+ tabDelete: function(id) {
+ element.tabDelete("wenav_tab", id); //删除
+ removeStorageMenu(id);
+
+ },
+ tabChange: function(id) {
+ //切换到指定Tab项
+ element.tabChange('wenav_tab', id);
+ },
+ tabDeleteAll: function(ids) { //删除所有
+ $.each(ids, function(i, item) {
+ element.tabDelete("wenav_tab", item);
+ })
+ sessionStorage.removeItem('menu');
+ }
+ };
+
+ /*
+ * @todo 监听右键事件,绑定右键菜单
+ * 先取消默认的右键事件,再绑定菜单,触发不同的点击事件
+ */
+ function CustomRightClick(id) {
+ //取消右键
+ $('.layui-tab-title li').on('contextmenu', function() {
+ return false;
+ })
+ $('.layui-tab-title,.layui-tab-title li').on('click', function() {
+ $('.rightMenu').hide();
+ });
+ //桌面点击右击
+ $('.layui-tab-title li').on('contextmenu', function(e) {
+ var aid = $(this).attr("lay-id"); //获取右键时li的lay-id属性
+ var popupmenu = $(".rightMenu");
+ popupmenu.find("li").attr("data-id", aid);
+ //console.log("popopmenuId:" + popupmenu.find("li").attr("data-id"));
+ l = ($(document).width() - e.clientX) < popupmenu.width() ? (e.clientX - popupmenu.width()) : e.clientX;
+ t = ($(document).height() - e.clientY) < popupmenu.height() ? (e.clientY - popupmenu.height()) : e.clientY;
+ popupmenu.css({
+ left: l,
+ top: t
+ }).show();
+ //alert("右键菜单")
+ return false;
+ });
+ }
+ $("#rightMenu li").click(function() {
+ var type = $(this).attr("data-type");
+ var layId = $(this).attr("data-id")
+ if(type == "current") {
+ //console.log("close this:" + layId);
+ tab.tabDelete(layId);
+ } else if(type == "all") {
+ //console.log("closeAll");
+ var tabtitle = $(".layui-tab-title li");
+ var ids = new Array();
+ $.each(tabtitle, function(i) {
+ ids[i] = $(this).attr("lay-id");
+ })
+ tab.tabDeleteAll(ids);
+ } else if(type == "fresh") {
+ //console.log("fresh:" + layId);
+ tab.tabChange($(this).attr("data-id"));
+ var othis = $('.layui-tab-title').find('>li[lay-id="' + layId + '"]'),
+ index = othis.parent().children('li').index(othis),
+ parents = othis.parents('.layui-tab').eq(0),
+ item = parents.children('.layui-tab-content').children('.layui-tab-item'),
+ src = item.eq(index).find('iframe').attr("src");
+ item.eq(index).find('iframe').attr("src", src);
+ } else if(type == "other") {
+ var thisId = layId;
+ $('.layui-tab-title').find('li').each(function(i, o) {
+ var layId = $(o).attr('lay-id');
+ if(layId != thisId && layId != 0) {
+ tab.tabDelete(layId);
+ }
+ });
+ }
+ $('.rightMenu').hide();
+ });
+
+ /*
+ * @todo 重新计算iframe高度
+ */
+ function FrameWH() {
+ var h = $(window).height() - 164;
+ $("iframe").css("height", h + "px");
+ }
+ $(window).resize(function() {
+ FrameWH();
+ });
+
+ /*
+ * @todo 弹出层,弹窗方法
+ * layui.use 加载layui.define 定义的模块,当外部 js 或 onclick调用 use 内部函数时,需要在 use 中定义 window 函数供外部引用
+ * http://blog.csdn.net/xcmonline/article/details/75647144
+ */
+ /*
+ 参数解释:
+ title 标题
+ url 请求的url
+ id 需要操作的数据id
+ w 弹出层宽度(缺省调默认值)
+ h 弹出层高度(缺省调默认值)
+ */
+ window.WeAdminShow = function(title, url, w, h) {
+ if(title == null || title == '') {
+ title = false;
+ };
+ if(url == null || url == '') {
+ url = "404.html";
+ };
+ if(w == null || w == '') {
+ w = ($(window).width() * 0.9);
+ };
+ if(h == null || h == '') {
+ h = ($(window).height() - 50);
+ };
+ layer.open({
+ type: 2,
+ area: [w + 'px', h + 'px'],
+ fix: false, //不固定
+ maxmin: true,
+ shadeClose: true,
+ shade: 0.4,
+ title: title,
+ content: url
+ });
+ }
+ /*弹出层+传递ID参数*/
+ window.WeAdminEdit = function(title, url, id, w, h) {
+ if(title == null || title == '') {
+ title = false;
+ };
+ if(url == null || url == '') {
+ url = "404.ftl";
+ };
+ if(w == null || w == '') {
+ w = ($(window).width() * 0.9);
+ };
+ if(h == null || h == '') {
+ h = ($(window).height() - 50);
+ };
+ layer.open({
+ type: 2,
+ area: [w + 'px', h + 'px'],
+ fix: false, //不固定
+ maxmin: true,
+ shadeClose: true,
+ shade: 0.4,
+ title: title,
+ content: url,
+ success: function(layero, index) {
+ //向iframe页的id=house的元素传值 // 参考 https://yq.aliyun.com/ziliao/133150
+ var body = layer.getChildFrame('body', index);
+ body.contents().find("#dataId").val(id);
+ console.log(id);
+ },
+ error: function(layero, index) {
+ alert("aaa");
+ }
+ });
+ }
+
+ /**
+ *@todo tab监听:点击tab项对应的关闭按钮事件
+ */
+ $('.layui-tab-close').click(function(event) {
+ $('.layui-tab-title li').eq(0).find('i').remove();
+ });
+ /**
+ *@todo tab切换监听
+ * tab切换监听不能写字初始化加载$(function())方法内,否则不执行
+ */
+ element.on('tab(wenav_tab)', function(data) {
+ //console.log(this); //当前Tab标题所在的原始DOM元素
+ setStorageCurMenu();
+ });
+ /*
+ * @todo 监听layui Tab项的关闭按钮,改变本地存储
+ */
+ element.on('tabDelete(wenav_tab)', function(data) {
+ var layId = $(this).parent('li').attr('lay-id');
+ //console.log(layId);
+ removeStorageMenu(layId);
+ });
+ /**
+ *@todo 本地存储 localStorage
+ * 为了保持统一,将sessionStorage更换为存储周期更长的localStorage
+ */
+ //本地存储记录所有打开的窗口
+ function setStorageMenu(title, url, id) {
+ var menu = JSON.parse(sessionStorage.getItem('menu'));
+ if(menu) {
+ var deep = false;
+ for(var i = 0; i < menu.length; i++) {
+ if(menu[i].id == id) {
+ deep = true;
+ menu[i].title = title;
+ menu[i].url = url;
+ menu[i].id = id;
+ }
+ }
+ if(!deep) {
+ menu.push({
+ title: title,
+ url: url,
+ id: id
+ })
+ }
+ } else {
+ var menu = [{
+ title: title,
+ url: url,
+ id: id
+ }]
+ }
+ sessionStorage.setItem('menu', JSON.stringify(menu));
+ }
+ //本地存储记录当前打开窗口
+ function setStorageCurMenu() {
+ var curMenu = sessionStorage.getItem('curMenu');
+ var text = $('.layui-tab-title').find('.layui-this').text();
+ text = text.split('ဆ')[0];
+ var url = $('.layui-tab-content').find('.layui-show').find('.weIframe').attr('src');
+ var id = $('.layui-tab-title').find('.layui-this').attr('lay-id');
+ //console.log(text);
+ curMenu = {
+ title: text,
+ url: url,
+ id: id
+ }
+ sessionStorage.setItem('curMenu', JSON.stringify(curMenu));
+ }
+ //本地存储中移除删除的元素
+ function removeStorageMenu(id) {
+ var menu = JSON.parse(sessionStorage.getItem('menu'));
+ //var curMenu = JSON.parse(localStorage.getItem('curMenu'));
+ if(menu) {
+ var deep = false;
+ for(var i = 0; i < menu.length; i++) {
+ if(menu[i].id == id) {
+ deep = true;
+ menu.splice(i, 1);
+ }
+ }
+ } else {
+ return false;
+ }
+ sessionStorage.setItem('menu', JSON.stringify(menu));
+ }
+
+ /**
+ * 模拟登录
+ * localStorage模拟登录及退出
+ */
+ var login = localStorage.getItem('login');
+ $('.loginout').click(function() {
+ login = 0;
+ localStorage.setItem('login', login);
+ });
+ $('.loginin').click(function() {
+ login = 1;
+ localStorage.setItem('login', login);
+ });
+
+ /*
+ *Tab加载后刷新
+ * 判断是刷新后第一次点击时,刷新frame子页面
+ * */
+ window.reloadTab = function(which){
+ var len = $('.layui-tab-title').children('li').length;
+ var layId = $(which).attr('lay-id');
+ var i=1;
+ if($(which).attr('data-bit')){
+ return false; //判断页面打开后第一次点击,执行刷新
+ }else{
+ $(which).attr('data-bit',i);
+ var frame = $('.weIframe[tab-id='+layId+']');
+ frame.attr('src', frame.attr('src'));
+ console.log("reload:"+$(which).attr('data-bit'));
+ }
+ }
+ /**
+ *@todo Frame内部的按钮点击打开其他frame的tab
+ */
+
+ exports('admin', {});
+});
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/static/js/menu.js b/sparchetype/src/main/resources/static/js/menu.js
new file mode 100644
index 0000000..1b47dd7
--- /dev/null
+++ b/sparchetype/src/main/resources/static/js/menu.js
@@ -0,0 +1,72 @@
+/*
+ * @Author: https://github.com/WangEn
+ * @Author: https://gitee.com/lovetime/
+ * @Date: 2019-06-18
+ * @lastModify 2019-06-20 11:45:41
+ * +----------------------------------------------------------------------
+ * | Weadmin [ 后台管理模板 ]
+ * | 基于Layui http://www.layui.com/
+ * +----------------------------------------------------------------------
+ */
+/**
+ * 扩展一个Menu模块,动态获取左侧菜单
+ * 目前多级子菜单是通过延时循环获取的方式
+ * 也可以采用点击时获取下级子菜单的方式
+ * 当然,具体的情况要参照自己的需求及api返回结构
+ **/
+
+layui.define('jquery', function(exports) {
+ var $ = layui.jquery;
+ var menu = {
+ getMenu: function(curl) {
+ var that = this;
+ if (!$('#side-nav').length) {
+ return;
+ }
+ $.getJSON(curl, function(res) {
+ var menuList = res.data;
+ var items = [];
+ var _ul = $('').addClass('nav').attr('id', 'nav');
+ $.each(menuList, function(index, val) {
+ var item = '';
+
+ items.push(item);
+ if (val.children && val.children.length) {
+ //有二级子菜单
+ setTimeout(function() {
+ that.getSubMenu(val.id, val.children);
+ }, 500);
+ }
+ });
+ $('#side-nav').empty();
+ _ul.append(items.join(''));
+ $('#side-nav').append(_ul);
+ });
+ },
+ /**
+ * @param {Object} id 上级子菜单id,拼接menu获取元素
+ * @param {Object} subList 子菜单列表
+ */
+ getSubMenu: function(id, subList) {
+ var that = this;
+ var subItems = [];
+ var subUl = $('').addClass('sub-menu');
+ $.each(subList, function(idx, sub) {
+ var subItem = '';
+ subItems.push(subItem);
+ if (sub.children && sub.children.length) {
+ setTimeout(function() {
+ that.getSubMenu(sub.id, sub.children);
+ }, 1500);
+ }
+ });
+ subUl.append(subItems.join(''));
+ $('#menu' + id).append(subUl);
+ }
+ };
+
+ exports('menu', menu);
+});
diff --git a/sparchetype/src/main/resources/static/json/menu.json b/sparchetype/src/main/resources/static/json/menu.json
new file mode 100644
index 0000000..30cd84a
--- /dev/null
+++ b/sparchetype/src/main/resources/static/json/menu.json
@@ -0,0 +1,162 @@
+{
+ "status": 0,
+ "msg": "ok",
+ "data": [{
+ "id": 1,
+ "name": "会员管理",
+ "icon": "",
+ "url": "",
+ "children": [{
+ "id": 2,
+ "name": "会员列表",
+ "icon": "",
+ "url": "./pages/member/list.html"
+ }, {
+ "id": 3,
+ "name": "会员删除",
+ "icon": "",
+ "url": "./pages/member/del.html"
+ }, {
+ "id": 4,
+ "name": "会员管理",
+ "icon": "",
+ "url": "",
+ "children": [{
+ "id": 5,
+ "name": "输入框操作",
+ "icon": "",
+ "url": "./pages/member/addInput.html"
+ }, {
+ "id": 6,
+ "name": "三级菜单演示",
+ "icon": "",
+ "url": "./pages/404.html"
+ }, {
+ "id": 7,
+ "name": "导航菜单演示",
+ "icon": "",
+ "url": "./pages/404.html"
+ }]
+ }]
+ },
+ {
+ "id": 8,
+ "name": "文章管理",
+ "icon": "",
+ "url": "",
+ "children": [{
+ "id": 9,
+ "name": "文章列表",
+ "icon": "",
+ "url": "./pages/article/list.html"
+ }, {
+ "id": 10,
+ "name": "分类管理",
+ "icon": "",
+ "url": "./pages/article/category.html"
+ }]
+ },
+ {
+ "id": 11,
+ "name": "订单管理",
+ "icon": "",
+ "url": "",
+ "children": [{
+ "id": 12,
+ "name": "订单列表",
+ "icon": "",
+ "url": "./pages/order/list.html"
+ }]
+ },
+ {
+ "id": 13,
+ "name": "管理员权限",
+ "icon": "",
+ "url": "",
+ "children": [{
+ "id": 14,
+ "name": "管理员列表",
+ "icon": "",
+ "url": "./pages/admin/list.html"
+ },
+ {
+ "id": 15,
+ "name": "角色管理",
+ "icon": "",
+ "url": "./pages/admin/role.html"
+ },
+ {
+ "id": 16,
+ "name": "权限分类",
+ "icon": "",
+ "url": "./pages/admin/cate.html"
+ },
+ {
+ "id": 17,
+ "name": "权限管理",
+ "icon": "",
+ "url": "./pages/admin/rule.html"
+ }]
+ },
+ {
+ "id": 18,
+ "name": "系统统计",
+ "icon": "",
+ "url": "",
+ "children": [{
+ "id": 19,
+ "name": "拆线图",
+ "icon": "",
+ "url": "./pages/echarts/echarts1.html"
+ },
+ {
+ "id": 20,
+ "name": "柱状图",
+ "icon": "",
+ "url": "./pages/echarts/echarts2.html"
+ },
+ {
+ "id": 21,
+ "name": "地图",
+ "icon": "",
+ "url": "./pages/echarts/echarts3.html"
+ },
+ {
+ "id": 22,
+ "name": "饼图",
+ "icon": "",
+ "url": "./pages/echarts/echarts4.html"
+ },
+ {
+ "id": 23,
+ "name": "雷达图",
+ "icon": "",
+ "url": "./pages/echarts/echarts5.html"
+ },
+ {
+ "id": 24,
+ "name": "k线图",
+ "icon": "",
+ "url": "./pages/echarts/echarts6.html"
+ },
+ {
+ "id": 25,
+ "name": "热力图",
+ "icon": "",
+ "url": "./pages/echarts/echarts7.html"
+ },
+ {
+ "id": 26,
+ "name": "仪表图",
+ "icon": "",
+ "url": "./pages/echarts/echarts8.html"
+ },
+ {
+ "id": 27,
+ "name": "地图DIY实例",
+ "icon": "",
+ "url": "./pages/echarts/echarts9.html"
+ }]
+ }
+ ]
+}
diff --git a/sparchetype/src/main/resources/static/lib/jquery/jquery-3.4.1.min.js b/sparchetype/src/main/resources/static/lib/jquery/jquery-3.4.1.min.js
new file mode 100644
index 0000000..a1c07fd
--- /dev/null
+++ b/sparchetype/src/main/resources/static/lib/jquery/jquery-3.4.1.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/
-
diff --git a/sparchetype/src/main/resources/templates/admin/index.html b/sparchetype/src/main/resources/templates/admin/index.html
deleted file mode 100644
index 40d747b..0000000
--- a/sparchetype/src/main/resources/templates/admin/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
- 面向学习型的开源框架,简洁高效,减少过渡封装,展现技术本质
-
-
-
-
-
-
-
-
-
diff --git a/sparchetype/src/main/resources/templates/admin/main.html b/sparchetype/src/main/resources/templates/admin/main.html
deleted file mode 100644
index 2187db6..0000000
--- a/sparchetype/src/main/resources/templates/admin/main.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
- 欢迎页
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/templates/admin/system/user/list.html b/sparchetype/src/main/resources/templates/admin/system/user/list.html
deleted file mode 100644
index e69de29..0000000
diff --git a/sparchetype/src/main/resources/templates/admin/welcome.ftl b/sparchetype/src/main/resources/templates/admin/welcome.ftl
new file mode 100644
index 0000000..9d2e5d5
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/admin/welcome.ftl
@@ -0,0 +1,420 @@
+
+
+
+
+ 欢迎页面-WeAdmin Frame型后台管理系统-WeAdmin 1.0
+
+
+
+ <#include "../common/common.ftl">
+
+
+
+
+
欢迎使用WeAdmin 后台模版!
+
+
+
+
+
+
+
+
Layui发版以来一直受到不少猿的推崇,作为其中的小白,我也一直在推崇和学习中挣扎,WeAdmin无他,也只是小白实操的一个记录。
+
更多的疑难解答,建议移步查看layui文档或者进入Fly社区搜索。
+
更完善的商业使用,强烈建议移步layuiAdmin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/templates/blog/index.ftl b/sparchetype/src/main/resources/templates/blog/index.ftl
new file mode 100644
index 0000000..4cc130e
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/blog/index.ftl
@@ -0,0 +1,10 @@
+
+
+
+
+ Title
+
+
+ blog index
+
+
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/templates/client/blog/include.html b/sparchetype/src/main/resources/templates/client/blog/include.html
deleted file mode 100644
index 4e39f81..0000000
--- a/sparchetype/src/main/resources/templates/client/blog/include.html
+++ /dev/null
@@ -1,170 +0,0 @@
-
-
-
-
-
-
- 在进步的编程运动员
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/sparchetype/src/main/resources/templates/client/blog/index.html b/sparchetype/src/main/resources/templates/client/blog/index.html
deleted file mode 100644
index c648dd9..0000000
--- a/sparchetype/src/main/resources/templates/client/blog/index.html
+++ /dev/null
@@ -1,273 +0,0 @@
-
-
-
-
-
- 网络公司-首页
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
专为前端而研制的核心产品
-
-
-
-
-
-
JS基础库
-
从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流。
-
-
查看产品 >
-
-
-
-
-
-
-
CSS处理
-
从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流。
-
-
查看产品 >
-
-
-
-
-
-
-
兼容性
-
从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流。
-
-
查看产品 >
-
-
-
-
-
-
-
响应式
-
从小屏逐步扩展到大屏,最终实现所有屏幕适配,适应移动互联潮流。
-
-
查看产品 >
-
-
-
-
-
-
-
-
为客户打造完美的专业服务
-
-
-
-
-
-
1 对 1 前端指导
-
-
更有多个包含不同主题的Web组件,可快速构建界面出色、体验优秀的跨屏页面,大幅提升开发效率。
-
-
-
-
-
-
-
-
1 对 1 前端指导
-
-
更有多个包含不同主题的Web组件,可快速构建界面出色、体验优秀的跨屏页面,大幅提升开发效率。
-
-
-
-
-
-
-
-
1 对 1 前端指导
-
-
更有多个包含不同主题的Web组件,可快速构建界面出色、体验优秀的跨屏页面,大幅提升开发效率。
-
-
-
-
-
-
-
-
1 对 1 前端指导
-
-
更有多个包含不同主题的Web组件,可快速构建界面出色、体验优秀的跨屏页面,大幅提升开发效率。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/templates/codegenerator/controller.java.ftl b/sparchetype/src/main/resources/templates/codegenerator/controller.java.ftl
new file mode 100644
index 0000000..3d3728b
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/codegenerator/controller.java.ftl
@@ -0,0 +1,39 @@
+package ${package.Controller};
+
+
+ import org.springframework.web.bind.annotation.RequestMapping;
+
+<#if restControllerStyle>
+ import org.springframework.web.bind.annotation.RestController;
+<#else>
+ import org.springframework.stereotype.Controller;
+#if>
+<#if superControllerClassPackage??>
+ import ${superControllerClassPackage};
+#if>
+
+ /**
+ *
+ * ${table.comment!} 前端控制器
+ *
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+<#if restControllerStyle>
+ @RestController
+<#else>
+ @Controller
+#if>
+ @RequestMapping("<#if package.ModuleName??>/${package.ModuleName}#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}#if>")
+<#if kotlin>
+ class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()#if>
+<#else>
+ <#if superControllerClass??>
+ public class ${table.controllerName} extends ${superControllerClass} {
+ <#else>
+ public class ${table.controllerName} {
+ #if>
+
+ }
+#if>
diff --git a/sparchetype/src/main/resources/templates/codegenerator/entity.java.ftl b/sparchetype/src/main/resources/templates/codegenerator/entity.java.ftl
new file mode 100644
index 0000000..9aabaa9
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/codegenerator/entity.java.ftl
@@ -0,0 +1,152 @@
+package ${package.Entity};
+
+<#list table.importPackages as pkg>
+ import ${pkg};
+#list>
+<#if swagger2>
+ import io.swagger.annotations.ApiModel;
+ import io.swagger.annotations.ApiModelProperty;
+#if>
+<#if entityLombokModel>
+ import lombok.Data;
+ import lombok.EqualsAndHashCode;
+ import lombok.experimental.Accessors;
+#if>
+
+ /**
+ *
+ * ${table.comment!}
+ *
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+<#if entityLombokModel>
+ @Data
+ <#if superEntityClass??>
+ @EqualsAndHashCode(callSuper = true)
+ <#else>
+ @EqualsAndHashCode(callSuper = false)
+ #if>
+ @Accessors(chain = true)
+#if>
+<#if table.convert>
+ @TableName("${table.name}")
+#if>
+<#if swagger2>
+ @ApiModel(value="${entity}对象", description="${table.comment!}")
+#if>
+<#if superEntityClass??>
+ public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}>#if> {
+<#elseif activeRecord>
+ public class ${entity} extends Model<${entity}> {
+<#else>
+ public class ${entity} implements Serializable {
+#if>
+
+<#if entitySerialVersionUID>
+ private static final long serialVersionUID = 1L;
+#if>
+<#-- ---------- BEGIN 字段循环遍历 ---------->
+<#list table.fields as field>
+ <#if field.keyFlag>
+ <#assign keyPropertyName="${field.propertyName}"/>
+ #if>
+
+ <#if field.comment!?length gt 0>
+ <#if swagger2>
+ @ApiModelProperty(value = "${field.comment}")
+ <#else>
+ /**
+ * ${field.comment}
+ */
+ #if>
+ #if>
+ <#if field.keyFlag>
+ <#-- 主键 -->
+ <#if field.keyIdentityFlag>
+ @TableId(value = "${field.name}", type = IdType.AUTO)
+ <#elseif idType??>
+ @TableId(value = "${field.name}", type = IdType.${idType})
+ <#elseif field.convert>
+ @TableId("${field.name}")
+ #if>
+ <#-- 普通字段 -->
+ <#elseif field.fill??>
+ <#-- ----- 存在字段填充设置 ----->
+ <#if field.convert>
+ @TableField(value = "${field.name}", fill = FieldFill.${field.fill})
+ <#else>
+ @TableField(fill = FieldFill.${field.fill})
+ #if>
+ <#elseif field.convert>
+ @TableField("${field.name}")
+ #if>
+<#-- 乐观锁注解 -->
+ <#if (versionFieldName!"") == field.name>
+ @Version
+ #if>
+<#-- 逻辑删除注解 -->
+ <#if (logicDeleteFieldName!"") == field.name>
+ @TableLogic
+ #if>
+ private ${field.propertyType} ${field.propertyName};
+#list>
+<#------------ END 字段循环遍历 ---------->
+
+<#if !entityLombokModel>
+ <#list table.fields as field>
+ <#if field.propertyType == "boolean">
+ <#assign getprefix="is"/>
+ <#else>
+ <#assign getprefix="get"/>
+ #if>
+ public ${field.propertyType} ${getprefix}${field.capitalName}() {
+ return ${field.propertyName};
+ }
+
+ <#if entityBuilderModel>
+ public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ <#else>
+ public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
+ #if>
+ this.${field.propertyName} = ${field.propertyName};
+ <#if entityBuilderModel>
+ return this;
+ #if>
+ }
+ #list>
+#if>
+
+<#if entityColumnConstant>
+ <#list table.fields as field>
+ public static final String ${field.name?upper_case} = "${field.name}";
+
+ #list>
+#if>
+<#if activeRecord>
+ @Override
+ protected Serializable pkVal() {
+ <#if keyPropertyName??>
+ return this.${keyPropertyName};
+ <#else>
+ return null;
+ #if>
+ }
+
+#if>
+<#if !entityLombokModel>
+ @Override
+ public String toString() {
+ return "${entity}{" +
+ <#list table.fields as field>
+ <#if field_index==0>
+ "${field.propertyName}=" + ${field.propertyName} +
+ <#else>
+ ", ${field.propertyName}=" + ${field.propertyName} +
+ #if>
+ #list>
+ "}";
+ }
+#if>
+}
diff --git a/sparchetype/src/main/resources/templates/codegenerator/mapper.java.ftl b/sparchetype/src/main/resources/templates/codegenerator/mapper.java.ftl
new file mode 100644
index 0000000..715bf30
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/codegenerator/mapper.java.ftl
@@ -0,0 +1,20 @@
+package ${package.Mapper};
+
+ import ${package.Entity}.${entity};
+ import ${superMapperClassPackage};
+
+ /**
+ *
+ * ${table.comment!} Mapper 接口
+ *
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+<#if kotlin>
+ interface ${table.mapperName} : ${superMapperClass}<${entity}>
+<#else>
+ public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
+
+ }
+#if>
diff --git a/sparchetype/src/main/resources/templates/codegenerator/mapper.xml.ftl b/sparchetype/src/main/resources/templates/codegenerator/mapper.xml.ftl
new file mode 100644
index 0000000..63f5115
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/codegenerator/mapper.xml.ftl
@@ -0,0 +1,39 @@
+
+
+
+
+ <#if enableCache>
+
+
+
+ #if>
+ <#if baseResultMap>
+
+
+ <#list table.fields as field>
+ <#if field.keyFlag><#--生成主键排在第一位-->
+
+ #if>
+ #list>
+ <#list table.commonFields as field><#--生成公共字段 -->
+
+ #list>
+ <#list table.fields as field>
+ <#if !field.keyFlag><#--生成普通字段 -->
+
+ #if>
+ #list>
+
+
+ #if>
+ <#if baseColumnList>
+
+
+ <#list table.commonFields as field>
+ ${field.name},
+ #list>
+ ${table.fieldNames}
+
+
+ #if>
+
diff --git a/sparchetype/src/main/resources/templates/codegenerator/service.java.ftl b/sparchetype/src/main/resources/templates/codegenerator/service.java.ftl
new file mode 100644
index 0000000..de0549b
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/codegenerator/service.java.ftl
@@ -0,0 +1,20 @@
+package ${package.Service};
+
+ import ${package.Entity}.${entity};
+ import ${superServiceClassPackage};
+
+ /**
+ *
+ * ${table.comment!} 服务类
+ *
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+<#if kotlin>
+ interface ${table.serviceName} : ${superServiceClass}<${entity}>
+<#else>
+ public interface ${table.serviceName} extends ${superServiceClass}<${entity}> {
+
+ }
+#if>
diff --git a/sparchetype/src/main/resources/templates/codegenerator/serviceImpl.java.ftl b/sparchetype/src/main/resources/templates/codegenerator/serviceImpl.java.ftl
new file mode 100644
index 0000000..17c7472
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/codegenerator/serviceImpl.java.ftl
@@ -0,0 +1,26 @@
+package ${package.ServiceImpl};
+
+ import ${package.Entity}.${entity};
+ import ${package.Mapper}.${table.mapperName};
+ import ${package.Service}.${table.serviceName};
+ import ${superServiceImplClassPackage};
+ import org.springframework.stereotype.Service;
+
+ /**
+ *
+ * ${table.comment!} 服务实现类
+ *
+ *
+ * @author ${author}
+ * @since ${date}
+ */
+ @Service
+<#if kotlin>
+ open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} {
+
+ }
+<#else>
+ public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} {
+
+ }
+#if>
diff --git a/sparchetype/src/main/resources/templates/common/common.ftl b/sparchetype/src/main/resources/templates/common/common.ftl
new file mode 100644
index 0000000..f8e28f1
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/common/common.ftl
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/sparchetype/src/main/resources/templates/index.ftl b/sparchetype/src/main/resources/templates/index.ftl
new file mode 100644
index 0000000..ccc78a4
--- /dev/null
+++ b/sparchetype/src/main/resources/templates/index.ftl
@@ -0,0 +1,131 @@
+
+
+
+
+ 后台管理-WeAdmin Frame型后台管理系统-WeAdmin 1.0
+
+
+
+
+ <#include "./common/common.ftl">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sparchetype/src/main/resources/templates/login.html b/sparchetype/src/main/resources/templates/login.html
deleted file mode 100644
index 7cc7f45..0000000
--- a/sparchetype/src/main/resources/templates/login.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
- BootDo
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/sparchetype/src/main/resources/templates/registry.html b/sparchetype/src/main/resources/templates/registry.html
deleted file mode 100644
index c12eef8..0000000
--- a/sparchetype/src/main/resources/templates/registry.html
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-注册页面
-
-
diff --git a/sparchetype/src/test/java/com/songpeng/SparchetypeApplicationTests.java b/sparchetype/src/test/java/com/songpeng/SparchetypeApplicationTests.java
deleted file mode 100644
index c3196b2..0000000
--- a/sparchetype/src/test/java/com/songpeng/SparchetypeApplicationTests.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.songpeng;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.test.context.junit4.SpringRunner;
-
-@RunWith(SpringRunner.class)
-@SpringBootTest
-public class SparchetypeApplicationTests {
-
- @Test
- public void contextLoads() {
- }
-
-}
diff --git a/sparchetype/src/test/java/com/songpeng/sparchetype/SparchetypeApplicationTests.java b/sparchetype/src/test/java/com/songpeng/sparchetype/SparchetypeApplicationTests.java
new file mode 100644
index 0000000..4bc7565
--- /dev/null
+++ b/sparchetype/src/test/java/com/songpeng/sparchetype/SparchetypeApplicationTests.java
@@ -0,0 +1,29 @@
+package com.songpeng.sparchetype;
+
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class SparchetypeApplicationTests {
+
+ @Test
+ public void contextLoads() {
+ }
+
+}
diff --git a/sparchetype/src/test/java/com/songpeng/sparchetype/blog/SysDictTest.java b/sparchetype/src/test/java/com/songpeng/sparchetype/blog/SysDictTest.java
new file mode 100644
index 0000000..0477939
--- /dev/null
+++ b/sparchetype/src/test/java/com/songpeng/sparchetype/blog/SysDictTest.java
@@ -0,0 +1,32 @@
+package com.songpeng.sparchetype.blog;
+
+import com.songpeng.sparchetype.common.entity.SysDict;
+import com.songpeng.sparchetype.common.mapper.SysDictMapper;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class SysDictTest {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SysDictTest.class);
+
+ @Autowired
+ private SysDictMapper sysDictMapper;
+
+ @Test
+ public void testSelect() {
+ LOGGER.info("----- selectAll method test ------");
+ List sysDicts = sysDictMapper.selectList(null);
+ //Assert.assertEquals(5, sysDicts.size());
+ sysDicts.forEach(System.out::println);
+ }
+}