├── .gitignore ├── .idea ├── .name ├── artifacts │ ├── iweb_java_war.xml │ └── iweb_java_war_exploded.xml ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── inspectionProfiles │ ├── Project_Default.xml │ └── profiles_settings.xml ├── libraries │ ├── Maven__antlr_antlr_2_7_7.xml │ ├── Maven__aopalliance_aopalliance_1_0.xml │ ├── Maven__ch_qos_logback_logback_classic_1_1_3.xml │ ├── Maven__ch_qos_logback_logback_core_1_1_3.xml │ ├── Maven__com_alibaba_druid_1_0_15.xml │ ├── Maven__com_alibaba_fastjson_1_2_7.xml │ ├── Maven__com_github_subchen_jetbrick_commons_2_0_6.xml │ ├── Maven__com_github_subchen_jetbrick_template_2_0_12.xml │ ├── Maven__com_github_subchen_jetbrick_template_springmvc_2_0_12.xml │ ├── Maven__com_github_subchen_jetbrick_template_web_2_0_12.xml │ ├── Maven__dom4j_dom4j_1_6_1.xml │ ├── Maven__javax_servlet_javax_servlet_api_3_1_0.xml │ ├── Maven__javax_servlet_jsp_jsp_api_2_1.xml │ ├── Maven__javax_servlet_jsp_jstl_jstl_api_1_2.xml │ ├── Maven__javax_servlet_servlet_api_2_5.xml │ ├── Maven__mysql_mysql_connector_java_5_1_36.xml │ ├── Maven__net_sf_ehcache_ehcache_2_10_1.xml │ ├── Maven__org_abego_treelayout_org_abego_treelayout_core_1_0_1.xml │ ├── Maven__org_antlr_antlr4_annotations_4_3.xml │ ├── Maven__org_antlr_antlr4_runtime_4_3.xml │ ├── Maven__org_apache_geronimo_specs_geronimo_jta_1_1_spec_1_1_1.xml │ ├── Maven__org_aspectj_aspectjrt_1_8_6.xml │ ├── Maven__org_aspectj_aspectjweaver_1_8_6.xml │ ├── Maven__org_hibernate_common_hibernate_commons_annotations_5_0_0_Final.xml │ ├── Maven__org_hibernate_hibernate_core_5_0_1_Final.xml │ ├── Maven__org_hibernate_hibernate_entitymanager_5_0_1_Final.xml │ ├── Maven__org_hibernate_javax_persistence_hibernate_jpa_2_1_api_1_0_0_Final.xml │ ├── Maven__org_javassist_javassist_3_18_1_GA.xml │ ├── Maven__org_jboss_jandex_1_2_2_Final.xml │ ├── Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml │ ├── Maven__org_slf4j_jcl_over_slf4j_1_7_12.xml │ ├── Maven__org_slf4j_slf4j_api_1_7_12.xml │ ├── Maven__org_springframework_spring_aop_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_beans_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_context_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_context_support_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_core_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_expression_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_jdbc_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_orm_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_tx_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_web_4_2_1_RELEASE.xml │ ├── Maven__org_springframework_spring_webmvc_4_2_1_RELEASE.xml │ ├── Maven__taglibs_standard_1_1_2.xml │ └── Maven__xml_apis_xml_apis_1_0_b2.xml ├── misc.xml ├── modules.xml ├── vcs.xml └── workspace.xml ├── README.md ├── dbinit.sql ├── iweb-java.iml ├── pom.xml ├── screenshot ├── screenshot-1.png └── screenshot-2.png └── src └── main ├── java └── io │ └── github │ └── igordonxiao │ ├── bean │ ├── Constants.java │ ├── Page.java │ └── Platform.java │ ├── controller │ ├── IndexController.java │ ├── MainController.java │ ├── error │ │ └── ErrorMappingController.java │ └── sys │ │ ├── BaseController.java │ │ └── SysController.java │ ├── dao │ └── sys │ │ ├── IGenericDao.java │ │ ├── IMenuDao.java │ │ ├── IUserDao.java │ │ └── impl │ │ ├── GenericDao.java │ │ ├── MenuDao.java │ │ └── UserDao.java │ ├── dto │ └── RequestPagination.java │ ├── entity │ └── sys │ │ ├── Menu.java │ │ └── User.java │ ├── helper │ ├── BisHelper.java │ └── MenuComparator.java │ ├── http │ ├── JSONResult.java │ └── ResultState.java │ ├── interceptor │ ├── SessionIntercepter.java │ └── WebRootInterceptor.java │ ├── resolver │ └── CustomSimpleMappingExceptionResolver.java │ ├── service │ └── sys │ │ ├── IGenericService.java │ │ ├── IMenuService.java │ │ ├── IUserService.java │ │ └── impl │ │ ├── GenericService.java │ │ ├── MenuService.java │ │ └── UserService.java │ └── util │ ├── PwdUtil.java │ └── RequestUtil.java ├── resources ├── ehcache.xml ├── jdbc.properties ├── logback.xml ├── spring-hibernate.xml ├── spring-mvc.xml └── spring.xml └── webapp ├── WEB-INF ├── jetbrick-template.properties ├── view │ ├── error │ │ ├── 404.jetx │ │ └── 500.jetx │ ├── include │ │ ├── env.jetx │ │ ├── main-aside-left.jetx │ │ ├── main-aside-right.jetx │ │ ├── main-content-foot.jetx │ │ ├── main-content-head.jetx │ │ ├── page-foot.jetx │ │ └── page-head.jetx │ ├── index.jetx │ ├── login.jetx │ ├── main.jetx │ └── mainIndex.jetx └── web.xml └── static ├── lib ├── bootstrap │ ├── css │ │ ├── animate.min.css │ │ ├── bootstrap.min.css │ │ ├── font-awesome.min.css │ │ ├── login.min.css │ │ ├── patterns │ │ │ └── header-profile.png │ │ ├── plugins │ │ │ ├── awesome-bootstrap-checkbox │ │ │ │ └── awesome-bootstrap-checkbox.css │ │ │ ├── blueimp │ │ │ │ └── css │ │ │ │ │ └── blueimp-gallery.min.css │ │ │ ├── bootstraptable │ │ │ │ └── bootstrap-table.min.css │ │ │ ├── chosen │ │ │ │ └── chosen.css │ │ │ ├── clockpicker │ │ │ │ └── clockpicker.css │ │ │ ├── codemirror │ │ │ │ ├── ambiance.css │ │ │ │ └── codemirror.css │ │ │ ├── colorpicker │ │ │ │ └── css │ │ │ │ │ └── bootstrap-colorpicker.min.css │ │ │ ├── cropper │ │ │ │ └── cropper.min.css │ │ │ ├── dataTables │ │ │ │ └── dataTables.bootstrap.css │ │ │ ├── datapicker │ │ │ │ └── datepicker3.css │ │ │ ├── dropzone │ │ │ │ ├── basic.css │ │ │ │ └── dropzone.css │ │ │ ├── footable │ │ │ │ └── footable.core.css │ │ │ ├── fullcalendar │ │ │ │ ├── fullcalendar.css │ │ │ │ └── fullcalendar.print.css │ │ │ ├── iCheck │ │ │ │ └── custom.css │ │ │ ├── ionRangeSlider │ │ │ │ ├── ion.rangeSlider.css │ │ │ │ └── ion.rangeSlider.skinFlat.css │ │ │ ├── jasny │ │ │ │ └── jasny-bootstrap.min.css │ │ │ ├── jqgrid │ │ │ │ └── ui.jqgrid.css@0820 │ │ │ ├── jsTree │ │ │ │ └── style.min.css │ │ │ ├── markdown │ │ │ │ └── bootstrap-markdown.min.css │ │ │ ├── morris │ │ │ │ └── morris-0.4.3.min.css │ │ │ ├── nouslider │ │ │ │ └── jquery.nouislider.css │ │ │ ├── simditor │ │ │ │ └── simditor.css │ │ │ ├── steps │ │ │ │ └── jquery.steps.css │ │ │ ├── summernote │ │ │ │ ├── summernote-bs3.css │ │ │ │ └── summernote.css │ │ │ ├── sweetalert │ │ │ │ └── sweetalert.css │ │ │ ├── switchery │ │ │ │ └── switchery.css │ │ │ ├── toastr │ │ │ │ └── toastr.min.css │ │ │ ├── treeview │ │ │ │ └── bootstrap-treeview.css │ │ │ └── webuploader │ │ │ │ └── webuploader.css │ │ └── style.min.css │ ├── fonts │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.woff │ │ ├── fontawesome-webfont.woff2 │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ ├── bootstrap.min.js │ │ ├── contabs.min.js │ │ ├── content.min.js │ │ ├── hplus.min.js │ │ ├── jquery-2.1.1.min.js │ │ ├── jquery-ui-1.10.4.min.js │ │ ├── jquery-ui.custom.min.js │ │ ├── plugins │ │ ├── beautifyhtml │ │ │ └── beautifyhtml.js │ │ ├── blueimp │ │ │ └── jquery.blueimp-gallery.min.js │ │ ├── bootstraptable │ │ │ ├── bootstrap-table-zh-CN.min.js │ │ │ └── bootstrap-table.min.js │ │ ├── chartJs │ │ │ └── Chart.min.js │ │ ├── chosen │ │ │ └── chosen.jquery.js │ │ ├── clockpicker │ │ │ └── clockpicker.js │ │ ├── codemirror │ │ │ ├── codemirror.js │ │ │ └── mode │ │ │ │ └── javascript │ │ │ │ └── javascript.js │ │ ├── colorpicker │ │ │ └── bootstrap-colorpicker.min.js │ │ ├── cropper │ │ │ └── cropper.min.js │ │ ├── dataTables │ │ │ ├── dataTables.bootstrap.js │ │ │ └── jquery.dataTables.js │ │ ├── datapicker │ │ │ └── bootstrap-datepicker.js │ │ ├── diff_match_patch │ │ │ └── diff_match_patch.js │ │ ├── dropzone │ │ │ └── dropzone.js │ │ ├── easypiechart │ │ │ └── jquery.easypiechart.js │ │ ├── echarts │ │ │ └── echarts-all.js │ │ ├── fancybox │ │ │ ├── jquery.fancybox.css │ │ │ └── jquery.fancybox.js │ │ ├── flot │ │ │ ├── curvedLines.js │ │ │ ├── jquery.flot.js │ │ │ ├── jquery.flot.pie.js │ │ │ ├── jquery.flot.resize.js │ │ │ ├── jquery.flot.spline.js │ │ │ ├── jquery.flot.symbol.js │ │ │ └── jquery.flot.tooltip.min.js │ │ ├── footable │ │ │ └── footable.all.min.js │ │ ├── fullcalendar │ │ │ └── fullcalendar.min.js │ │ ├── gritter │ │ │ ├── jquery.gritter.css │ │ │ └── jquery.gritter.min.js │ │ ├── handlebars │ │ │ └── handlebars-v4.0.2.js │ │ ├── iCheck │ │ │ └── icheck.min.js │ │ ├── ionRangeSlider │ │ │ └── ion.rangeSlider.min.js │ │ ├── jasny │ │ │ └── jasny-bootstrap.min.js │ │ ├── jeditable │ │ │ └── jquery.jeditable.js │ │ ├── jqgrid │ │ │ ├── i18n │ │ │ │ └── grid.locale-cn.js@0820 │ │ │ └── jquery.jqGrid.min.js@0820 │ │ ├── jquery-ui │ │ │ └── jquery-ui.min.js │ │ ├── jsKnob │ │ │ └── jquery.knob.js │ │ ├── jsTree │ │ │ └── jstree.min.js │ │ ├── jvectormap │ │ │ ├── jquery-jvectormap-1.2.2.min.js │ │ │ └── jquery-jvectormap-world-mill-en.js │ │ ├── layer │ │ │ ├── extend │ │ │ │ └── layer.ext.js │ │ │ ├── laydate │ │ │ │ └── laydate.js │ │ │ ├── layer.min.js │ │ │ ├── layim │ │ │ │ ├── layim.css │ │ │ │ └── layim.js │ │ │ └── skin │ │ │ │ ├── default │ │ │ │ ├── icon-ext.png │ │ │ │ ├── icon.png │ │ │ │ ├── loading-0.gif │ │ │ │ ├── loading-1.gif │ │ │ │ └── loading-2.gif │ │ │ │ ├── layer.css │ │ │ │ ├── layer.ext.css │ │ │ │ └── moon │ │ │ │ ├── default.png │ │ │ │ └── style.css │ │ ├── markdown │ │ │ ├── bootstrap-markdown.js │ │ │ ├── bootstrap-markdown.zh.js │ │ │ ├── markdown.js │ │ │ └── to-markdown.js │ │ ├── metisMenu │ │ │ └── jquery.metisMenu.js │ │ ├── morris │ │ │ ├── morris.js │ │ │ └── raphael-2.1.0.min.js │ │ ├── nestable │ │ │ └── jquery.nestable.js │ │ ├── nouslider │ │ │ └── jquery.nouislider.min.js │ │ ├── pace │ │ │ └── pace.min.js │ │ ├── peity │ │ │ └── jquery.peity.min.js │ │ ├── preetyTextDiff │ │ │ └── jquery.pretty-text-diff.min.js │ │ ├── prettyfile │ │ │ └── bootstrap-prettyfile.js │ │ ├── rickshaw │ │ │ ├── rickshaw.min.js │ │ │ └── vendor │ │ │ │ └── d3.v3.js │ │ ├── simditor │ │ │ ├── hotkeys.js │ │ │ ├── module.js │ │ │ ├── simditor.js │ │ │ └── uploader.js │ │ ├── slimscroll │ │ │ └── jquery.slimscroll.min.js │ │ ├── sparkline │ │ │ └── jquery.sparkline.min.js │ │ ├── staps │ │ │ └── jquery.steps.min.js │ │ ├── suggest │ │ │ └── bootstrap-suggest.min.js │ │ ├── summernote │ │ │ ├── summernote-zh-CN.js │ │ │ └── summernote.min.js │ │ ├── sweetalert │ │ │ └── sweetalert.min.js │ │ ├── switchery │ │ │ └── switchery.js │ │ ├── toastr │ │ │ └── toastr.min.js │ │ ├── treeview │ │ │ └── bootstrap-treeview.js │ │ ├── validate │ │ │ ├── jquery.validate.min.js │ │ │ └── messages_zh.min.js │ │ └── webuploader │ │ │ └── webuploader.min.js │ │ └── welcome.js ├── css │ └── normalize.css └── js │ ├── base64.min.js │ ├── jquery-2.1.4.min.js │ └── jquery.cookie.js └── src ├── css ├── compoent.css └── login.css ├── img ├── avatar │ └── avatar.png ├── icon │ └── i │ │ └── icon-statistics.png └── logo │ └── iweb.png └── js ├── common.js ├── componet.js └── main.js /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | .idea 3 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | iweb-java -------------------------------------------------------------------------------- /.idea/artifacts/iweb_java_war.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | $PROJECT_DIR$/target 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__antlr_antlr_2_7_7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__aopalliance_aopalliance_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__ch_qos_logback_logback_classic_1_1_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__ch_qos_logback_logback_core_1_1_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_alibaba_druid_1_0_15.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_alibaba_fastjson_1_2_7.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_subchen_jetbrick_commons_2_0_6.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_subchen_jetbrick_template_2_0_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_subchen_jetbrick_template_springmvc_2_0_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__com_github_subchen_jetbrick_template_web_2_0_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__dom4j_dom4j_1_6_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__javax_servlet_javax_servlet_api_3_1_0.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__javax_servlet_jsp_jsp_api_2_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__javax_servlet_jsp_jstl_jstl_api_1_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__javax_servlet_servlet_api_2_5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__mysql_mysql_connector_java_5_1_36.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__net_sf_ehcache_ehcache_2_10_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_abego_treelayout_org_abego_treelayout_core_1_0_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_antlr_antlr4_annotations_4_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_antlr_antlr4_runtime_4_3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_apache_geronimo_specs_geronimo_jta_1_1_spec_1_1_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_aspectj_aspectjrt_1_8_6.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_aspectj_aspectjweaver_1_8_6.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_5_0_0_Final.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_hibernate_hibernate_core_5_0_1_Final.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_hibernate_hibernate_entitymanager_5_0_1_Final.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_hibernate_javax_persistence_hibernate_jpa_2_1_api_1_0_0_Final.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_javassist_javassist_3_18_1_GA.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_jboss_jandex_1_2_2_Final.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_0_Final.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_12.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_aop_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_beans_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_context_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_context_support_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_core_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_expression_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_jdbc_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_orm_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_tx_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_web_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__org_springframework_spring_webmvc_4_2_1_RELEASE.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__taglibs_standard_1_1_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/libraries/Maven__xml_apis_xml_apis_1_0_b2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | $USER_HOME$/.subversion 31 | 32 | 33 | 34 | 35 | 36 | 1.8 37 | 38 | 43 | 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## A backend web management system template with Java 8, Spring 4, Hibernate 5 and more... 2 | ## It's just a seed yet, you have to raise it follow your own business demands. 3 | 4 | ### MAIN FRAMEWORKS 5 | 1. Spring4+SpringMVC+Hibernate5 6 | 2. Logback 7 | 3. Druid 8 | 4. Jetbrick-template 9 | 5. EhCache 10 | 11 | ### FRONT END 12 | 1. jQuery & Bootstrap v3.3.4 13 | 2. Fontawesome icons 14 | 3. Many resource code are from site [h+ v3.2.0](http://www.zi-han.net/theme/hplus/), if you like that template could contact it's author to purchase one and you can get more services. 15 | 16 | ### REQUIRED 17 | 1. JDK 1.8 or higher 18 | 2. MySQL server(InnoDB) 19 | 20 | ### CONTAINS BY DEFAULT 21 | 1. System User Login 22 | 2. System Menu Model 23 | 3. Generic DAO & Generic Service 24 | 4. Some Uesful Tools 25 | 26 | ### HOW TO 27 | 1. Create a database named `iweb-java`; 28 | 2. Import sql file `dbinit.sql` to the database; 29 | 3. Modify database username and password in file `jdbc.properties` whitch under directory `src/main/resources`; 30 | 4. Compile(with Maven) & deploy this web project; 31 | 5. Access `localhost:[port]` and login with user(admin:admin) 32 | 33 | ### SECOND DEVELOPMENT 34 | 1. Add all your own business backend code into `bis` packages(DAOs,Services,Controllers) 35 | 2. Add others what you want 36 | 37 | 38 | ### SCREENSHOT 39 | 40 | 41 | 42 | 43 | 44 | ### LICENSE 45 | The MIT License (MIT) 46 | 47 | -------------------------------------------------------------------------------- /dbinit.sql: -------------------------------------------------------------------------------- 1 | SET NAMES utf8; 2 | SET FOREIGN_KEY_CHECKS = 0; 3 | 4 | -- ---------------------------- 5 | -- Table structure for `sys_menu` 6 | -- ---------------------------- 7 | DROP TABLE IF EXISTS `sys_menu`; 8 | CREATE TABLE `sys_menu` ( 9 | `id` bigint(11) NOT NULL, 10 | `name` varchar(100) NOT NULL COMMENT '菜单名称', 11 | `icon_class` varchar(100) DEFAULT NULL COMMENT '菜单图标,只支持font awesome', 12 | `href` varchar(255) DEFAULT NULL COMMENT '菜单链接地址', 13 | `level` int(20) DEFAULT NULL COMMENT '等级', 14 | `parent_id` bigint(11) DEFAULT NULL COMMENT '父级ID', 15 | `sequence` int(11) DEFAULT NULL COMMENT '排序字段', 16 | PRIMARY KEY (`id`), 17 | KEY `FK2jrf4gb0gjqi8882gxytpxnhe` (`parent_id`), 18 | CONSTRAINT `FK2jrf4gb0gjqi8882gxytpxnhe` FOREIGN KEY (`parent_id`) REFERENCES `sys_menu` (`id`) 19 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 20 | 21 | -- ---------------------------- 22 | -- Records of `sys_menu` 23 | -- ---------------------------- 24 | BEGIN; 25 | INSERT INTO `sys_menu` VALUES ('1', '经营分析', 'fa fa-bar-chart-o', null, '1', null, '1'), ('2', '市场分析', 'fa fa-table', null, '2', '1', '1'), ('3', '销售状况', 'fa fa-area-chart', null, '1', null, '2'), ('4', '竟品分析', 'fa fa-cubes', null, '2', '3', '1'), ('5', '区域市场', 'fa fa-building-o', null, '2', '3', '2'), ('6', '广告拓展', 'fa fa-suitcase', null, '2', '3', '3'); 26 | COMMIT; 27 | 28 | -- ---------------------------- 29 | -- Table structure for `sys_user` 30 | -- ---------------------------- 31 | DROP TABLE IF EXISTS `sys_user`; 32 | CREATE TABLE `sys_user` ( 33 | `id` int(11) NOT NULL AUTO_INCREMENT, 34 | `user_name` varchar(50) NOT NULL COMMENT '用户名', 35 | `password` varchar(255) NOT NULL COMMENT '密码', 36 | `nick_name` varchar(255) DEFAULT NULL COMMENT '昵称', 37 | PRIMARY KEY (`id`) 38 | ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 39 | 40 | -- ---------------------------- 41 | -- Records of `sys_user` 42 | -- ---------------------------- 43 | BEGIN; 44 | INSERT INTO `sys_user` VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', 'Gordon'); 45 | COMMIT; 46 | 47 | SET FOREIGN_KEY_CHECKS = 1; 48 | -------------------------------------------------------------------------------- /screenshot/screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/screenshot/screenshot-1.png -------------------------------------------------------------------------------- /screenshot/screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/screenshot/screenshot-2.png -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/bean/Constants.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.bean; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | public interface Constants { 7 | //全局日志 8 | public static final Logger LOG = LoggerFactory.getLogger(Constants.class); 9 | 10 | public static final String USERID_IN_SESSION = "userInSession"; 11 | 12 | /** 13 | * Session失效时间,单位秒 14 | */ 15 | public static final int MAX_SESSION_INACTIVE_INTERVAL = 3600; 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/bean/Page.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.bean; 2 | 3 | import java.util.List; 4 | 5 | import org.hibernate.criterion.MatchMode; 6 | 7 | import com.alibaba.fastjson.annotation.JSONField; 8 | 9 | public class Page { 10 | 11 | public enum OrderType { 12 | asc, desc 13 | } 14 | 15 | private static final Integer MAX_PAGE_SIZE = 500;//分页允许最大数 16 | 17 | private List list;//分页数据 18 | 19 | private Integer pageSize = 10;//分页大小 20 | 21 | private Integer nowPage = 1;//分页页码 22 | 23 | @JSONField(serialize = false) 24 | private String orderBy;//排序字段 25 | 26 | @JSONField(serialize = false) 27 | private OrderType orderType = OrderType.asc;//排序方式 28 | 29 | private Integer totalCount = 0;//总条数 30 | 31 | private Integer maxPage = 0;//总页数 32 | 33 | @JSONField(serialize = false) 34 | private String property;//关键字检索字段名称 35 | 36 | @JSONField(serialize = false) 37 | private String keyWords;//关键字检索关键字 38 | 39 | @JSONField(serialize = false) 40 | private MatchMode matchMode = MatchMode.ANYWHERE;//关键字检索的匹配模式 41 | 42 | public List getList() { 43 | return list; 44 | } 45 | 46 | public void setList(List list) { 47 | this.list = list; 48 | } 49 | 50 | public Integer getPageSize() { 51 | return pageSize; 52 | } 53 | 54 | public void setPageSize(Integer pageSize) { 55 | this.pageSize = pageSize < 1 ? 1 : pageSize > MAX_PAGE_SIZE ? MAX_PAGE_SIZE : pageSize; 56 | } 57 | 58 | public Integer getNowPage() { 59 | return nowPage; 60 | } 61 | 62 | public void setNowPage(Integer nowPage) { 63 | this.nowPage = nowPage; 64 | } 65 | 66 | public String getOrderBy() { 67 | return orderBy; 68 | } 69 | 70 | public void setOrderBy(String orderBy) { 71 | this.orderBy = orderBy; 72 | } 73 | 74 | public Integer getTotalCount() { 75 | return totalCount; 76 | } 77 | 78 | public void setTotalCount(Integer totalCount) { 79 | this.totalCount = totalCount; 80 | } 81 | 82 | public boolean hasNext() { 83 | return totalCount > pageSize * nowPage ? true : false; 84 | } 85 | 86 | public Integer getMaxPage() { 87 | this.maxPage = this.totalCount / this.pageSize; 88 | return this.totalCount % this.pageSize > 0 ? ++this.maxPage : this.maxPage; 89 | } 90 | 91 | public void setMaxPage(Integer maxPage) { 92 | this.maxPage = maxPage; 93 | } 94 | 95 | public OrderType getOrderType() { 96 | return orderType; 97 | } 98 | 99 | public void setOrderType(OrderType orderType) { 100 | this.orderType = orderType; 101 | } 102 | 103 | public String getProperty() { 104 | return property; 105 | } 106 | 107 | public void setProperty(String property) { 108 | this.property = property; 109 | } 110 | 111 | public String getKeyWords() { 112 | return keyWords; 113 | } 114 | 115 | public void setKeyWords(String keyWords) { 116 | this.keyWords = keyWords; 117 | } 118 | 119 | public MatchMode getMatchMode() { 120 | return matchMode; 121 | } 122 | 123 | public void setMatchMode(MatchMode matchMode) { 124 | this.matchMode = matchMode; 125 | } 126 | 127 | } 128 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/bean/Platform.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.bean; 2 | 3 | /** 4 | * Created by gordon on 15/10/21. 5 | */ 6 | public enum Platform { 7 | //默认0,安卓-1,IOS-2,webapp-3 8 | ALL(0), Android(1), iOS(2), WebApp(3); 9 | 10 | private int patformCode; 11 | 12 | private Platform(int patformCode) { 13 | 14 | this.patformCode = patformCode; 15 | 16 | } 17 | 18 | @Override 19 | public String toString() { 20 | 21 | return String.valueOf(this.patformCode); 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/controller/IndexController.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.controller; 2 | 3 | import io.github.igordonxiao.bean.Constants; 4 | import io.github.igordonxiao.controller.sys.BaseController; 5 | import io.github.igordonxiao.entity.sys.User; 6 | import io.github.igordonxiao.service.sys.IUserService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.ui.ModelMap; 10 | import org.springframework.util.StringUtils; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RequestMethod; 13 | import org.springframework.web.servlet.mvc.support.RedirectAttributes; 14 | 15 | import javax.servlet.http.HttpServletRequest; 16 | import javax.servlet.http.HttpServletResponse; 17 | import javax.servlet.http.HttpSession; 18 | 19 | /** 20 | * Created by gordon on 15/9/16. 21 | */ 22 | @Controller 23 | @RequestMapping("/") 24 | public class IndexController extends BaseController { 25 | @Autowired 26 | private IUserService userService; 27 | 28 | @RequestMapping(method = RequestMethod.GET) 29 | public String index(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) { 30 | return "login"; 31 | } 32 | 33 | @RequestMapping(value = "login", method = RequestMethod.POST) 34 | public String login(User user, ModelMap modelMap, RedirectAttributes attr, HttpSession session, HttpServletRequest request, HttpServletResponse response){ 35 | if(user == null || StringUtils.isEmpty(user.getUserName()) || StringUtils.isEmpty(user.getPassword())){ 36 | modelMap.put("error", "用户名或密码不能为空"); 37 | return "login"; 38 | } 39 | 40 | User userDB = this.userService.checkLogin(user); 41 | if(userDB == null || userDB.getId() == null){ 42 | modelMap.put("error", "用户名或密码错误"); 43 | return "login"; 44 | } 45 | userDB.setPassword(null); 46 | // store user into session 47 | session.setAttribute(Constants.USERID_IN_SESSION, userDB); 48 | session.setMaxInactiveInterval(Constants.MAX_SESSION_INACTIVE_INTERVAL); 49 | //attr.addFlashAttribute("user", userDB); 50 | return "redirect:/main"; 51 | } 52 | 53 | @RequestMapping(value = "logout", method = RequestMethod.GET) 54 | public String logout(ModelMap modelMap, RedirectAttributes attr, HttpSession session, HttpServletRequest request, HttpServletResponse response){ 55 | session.removeAttribute(Constants.USERID_IN_SESSION); 56 | return "redirect:/"; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/controller/MainController.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.controller; 2 | 3 | import io.github.igordonxiao.bean.Constants; 4 | import io.github.igordonxiao.controller.sys.BaseController; 5 | import io.github.igordonxiao.entity.sys.User; 6 | import org.springframework.stereotype.Controller; 7 | import org.springframework.ui.ModelMap; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestMethod; 10 | 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | import javax.servlet.http.HttpSession; 14 | 15 | /** 16 | * Created by gordon on 15/9/16. 17 | */ 18 | @Controller 19 | @RequestMapping("/main") 20 | public class MainController extends BaseController { 21 | 22 | @RequestMapping(method = RequestMethod.GET) 23 | public String main(ModelMap modelMap, HttpSession session, HttpServletRequest request, HttpServletResponse response) { 24 | Object userInSession = session.getAttribute(Constants.USERID_IN_SESSION); 25 | if(userInSession != null){ 26 | modelMap.put("user", (User)userInSession); 27 | return "main"; 28 | } else { 29 | modelMap.put("error", "请先登录"); 30 | return "login"; 31 | } 32 | } 33 | 34 | @RequestMapping(value ="/index", method = RequestMethod.GET) 35 | public String mainIndex(ModelMap modelMap) { 36 | return "mainIndex"; 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/controller/error/ErrorMappingController.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.controller.error; 2 | 3 | import io.github.igordonxiao.controller.sys.BaseController; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.ui.ModelMap; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RequestMethod; 8 | 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | 12 | /** 13 | * Created by gordon on 15/10/26. 14 | */ 15 | @Controller 16 | @RequestMapping("/error") 17 | public class ErrorMappingController extends BaseController{ 18 | 19 | @RequestMapping(value = "/404", method = RequestMethod.GET) 20 | public String errorFor404(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) { 21 | return "error/404"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/controller/sys/BaseController.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.controller.sys; 2 | 3 | import org.springframework.web.servlet.ModelAndView; 4 | import org.springframework.web.servlet.mvc.AbstractController; 5 | 6 | import javax.servlet.http.HttpServletRequest; 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | /** 10 | * Created by gordon on 15/10/23. 11 | */ 12 | public abstract class BaseController extends AbstractController { 13 | @Override 14 | protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { 15 | return null; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/controller/sys/SysController.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.controller.sys; 2 | 3 | import io.github.igordonxiao.entity.sys.User; 4 | import io.github.igordonxiao.http.JSONResult; 5 | import io.github.igordonxiao.http.ResultState; 6 | import io.github.igordonxiao.service.sys.IMenuService; 7 | import io.github.igordonxiao.service.sys.IUserService; 8 | import org.springframework.stereotype.Controller; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RequestMethod; 11 | import org.springframework.web.bind.annotation.ResponseBody; 12 | 13 | import javax.annotation.Resource; 14 | 15 | /** 16 | * Created by gordon on 15/10/20. 17 | */ 18 | @Controller 19 | @RequestMapping("/sys") 20 | public class SysController extends BaseController{ 21 | @Resource 22 | IUserService userService; 23 | @Resource 24 | IMenuService menuService; 25 | 26 | 27 | @RequestMapping(value = "/user", method = RequestMethod.GET) 28 | @ResponseBody 29 | JSONResult getUser(){ 30 | User user = this.userService.get(1L); 31 | return new JSONResult(ResultState.success, user); 32 | } 33 | 34 | @RequestMapping(value = "/menu", method = RequestMethod.GET) 35 | @ResponseBody 36 | JSONResult getMenu(){ 37 | return new JSONResult(ResultState.success, this.menuService.getMenu()); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/dao/sys/IGenericDao.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.dao.sys; 2 | 3 | import io.github.igordonxiao.bean.Page; 4 | import org.hibernate.Criteria; 5 | import org.hibernate.Session; 6 | import org.hibernate.criterion.DetachedCriteria; 7 | 8 | import java.io.Serializable; 9 | import java.util.List; 10 | 11 | public interface IGenericDao { 12 | 13 | void setEntityClass(Class entityClass); 14 | 15 | /** 16 | * 获取hibernate session对象 17 | * 18 | * @return 19 | */ 20 | Session getSession(); 21 | 22 | /** 23 | * 创建一个criteria 24 | * 25 | * @return 26 | */ 27 | Criteria getCriteria(); 28 | 29 | /** 30 | * 通过id加载实体 31 | * 32 | * @param id 33 | * @return 实体对象 34 | */ 35 | T load(PK id); 36 | 37 | /** 38 | * 通过id加载实体 39 | * 40 | * @param id 41 | * @return 实体对象 42 | */ 43 | T get(PK id); 44 | 45 | /** 46 | * 根据ID数组获取实体对象集合. 47 | * 48 | * @param ids 49 | * @return 实体对象集合 50 | */ 51 | List get(PK[] ids); 52 | 53 | /** 54 | * 根据属性名和属性值获取实体对象. 55 | * 56 | * @param propertyName 57 | * @param value 58 | * @return 实体对象 59 | */ 60 | T get(String propertyName, Object value); 61 | 62 | /** 63 | * 根据DetachedCriteria获取对象 64 | * 65 | * @param criteria 66 | * @return 67 | */ 68 | T get(DetachedCriteria criteria); 69 | 70 | /** 71 | * 根据属性名和属性值获取实体对象集合. 72 | * 73 | * @param propertyName 74 | * @param value 75 | * @return 实体对象集合 76 | */ 77 | List getList(String propertyName, Object value); 78 | 79 | /** 80 | * 获取所有实体对象总数. 81 | * 82 | * @return 实体对象总数 83 | */ 84 | Integer getCount(); 85 | 86 | /** 87 | * 根据DetachedCriteria获取实体数量 88 | * 89 | * @param criteria 90 | * @return 91 | */ 92 | Integer getCount(DetachedCriteria criteria); 93 | 94 | /** 95 | * 保存实体对象. 96 | * 97 | * @param entity 98 | * @return ID 99 | */ 100 | PK save(T entity); 101 | 102 | /** 103 | * 保存或更新一个对象 104 | * 105 | * @param entity 106 | */ 107 | void saveOrUpdate(T entity); 108 | 109 | /** 110 | * 更新实体对象. 111 | * 112 | * @param entity 113 | */ 114 | void update(T entity); 115 | 116 | /** 117 | * 合并一个对象 118 | * 119 | * @param entity 120 | */ 121 | void merge(T entity); 122 | 123 | /** 124 | * 删除实体对象. 125 | * 126 | * @param entity 127 | * @return 128 | */ 129 | void delete(T entity); 130 | 131 | /** 132 | * 根据ID删除实体对象. 133 | * 134 | * @param id 135 | */ 136 | void delete(PK id); 137 | 138 | /** 139 | * 根据ID数组删除实体对象. 140 | * 141 | * @param ids 142 | */ 143 | void delete(PK[] ids); 144 | 145 | /** 146 | * 根据实体集合删除实体对象 147 | * 148 | * @param list 149 | */ 150 | void delete(List list); 151 | 152 | /** 153 | * 获取全部列表 154 | * 155 | * @return 156 | */ 157 | List list(); 158 | 159 | /** 160 | * 根据DetachedCriteria 获取列表 161 | * 162 | * @param criteria 163 | * @return 164 | */ 165 | List list(DetachedCriteria criteria); 166 | 167 | /** 168 | * 执行criteria查询获得一个结果 169 | * 170 | * @param criteria 171 | * @return 172 | */ 173 | Object findObject(DetachedCriteria criteria); 174 | 175 | /** 176 | * DetachedCriteria分页查询 177 | * 178 | * @param criteria 179 | * @param pageSize 180 | * @param pageNumber 181 | * @return 182 | */ 183 | List page(DetachedCriteria criteria, Integer pageSize, Integer pageNumber); 184 | 185 | /** 186 | * 根据DetachedCriteria和Page对象获取分页page对象 187 | * 188 | * @param criteria 189 | * @param page 190 | * @return 191 | */ 192 | Page getPage(DetachedCriteria criteria, Page page); 193 | } -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/dao/sys/IMenuDao.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.dao.sys; 2 | 3 | import io.github.igordonxiao.entity.sys.Menu; 4 | 5 | /** 6 | * Created by gordon on 15/10/20. 7 | */ 8 | public interface IMenuDao extends IGenericDao { 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/dao/sys/IUserDao.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.dao.sys; 2 | 3 | import io.github.igordonxiao.entity.sys.User; 4 | 5 | public interface IUserDao extends IGenericDao { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/dao/sys/impl/MenuDao.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.dao.sys.impl; 2 | 3 | import io.github.igordonxiao.dao.sys.IMenuDao; 4 | import io.github.igordonxiao.entity.sys.Menu; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * Created by gordon on 15/10/20. 9 | */ 10 | @Repository("menuDao") 11 | public class MenuDao extends GenericDao implements IMenuDao { 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/dao/sys/impl/UserDao.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.dao.sys.impl; 2 | 3 | import io.github.igordonxiao.dao.sys.IUserDao; 4 | import io.github.igordonxiao.entity.sys.User; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository("userDao") 8 | public class UserDao extends GenericDao implements IUserDao { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/dto/RequestPagination.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.dto; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * bootstrap table 前台请求分页对象 7 | * Created by gordon on 15/10/29. 8 | */ 9 | public class RequestPagination implements Serializable{ 10 | private static final long serialVersionUID = 695994468169044L; 11 | public enum Order { 12 | asc("asc"), 13 | desc("desc"), 14 | ; 15 | 16 | private final String rule; 17 | 18 | Order(String rule) { 19 | this.rule = rule; 20 | } 21 | 22 | public String getRule() { 23 | return this.rule; 24 | } 25 | } 26 | private Integer limit; 27 | private Integer offset; 28 | private String orderField; 29 | private Order order; 30 | 31 | public Integer getLimit() { 32 | return limit; 33 | } 34 | 35 | public void setLimit(Integer limit) { 36 | this.limit = limit; 37 | } 38 | 39 | public Integer getOffset() { 40 | return offset; 41 | } 42 | 43 | public void setOffset(Integer offset) { 44 | this.offset = offset; 45 | } 46 | 47 | public String getOrderField() { 48 | return orderField; 49 | } 50 | 51 | public void setOrderField(String orderField) { 52 | this.orderField = orderField; 53 | } 54 | 55 | public Order getOrder() { 56 | return order; 57 | } 58 | 59 | public void setOrder(Order order) { 60 | this.order = order; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/entity/sys/Menu.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.entity.sys; 2 | 3 | import javax.persistence.*; 4 | import java.io.Serializable; 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | /** 9 | * Created by gordon on 15/10/20. 10 | */ 11 | @Entity 12 | @Table(name="sys_menu") 13 | public class Menu implements Serializable { 14 | private static final long serialVersionUID = 292874408169044L; 15 | @Id 16 | @GeneratedValue(strategy= GenerationType.IDENTITY) 17 | @Column(name="id") 18 | private Long id; 19 | /** 20 | * 名称 21 | */ 22 | @Column(name="name", nullable = false) 23 | private String name; 24 | /** 25 | * 图标,支持Font Awesome 26 | */ 27 | @Column(name = "icon_class") 28 | private String iconClass; 29 | /** 30 | * 菜单链接 31 | */ 32 | @Column(name = "href") 33 | private String href; 34 | 35 | /** 36 | * 菜单级别 37 | */ 38 | @Column(name = "level") 39 | private Integer level; 40 | 41 | /** 42 | * 排序 43 | */ 44 | @Column(name = "sequence") 45 | private Integer sequence; 46 | 47 | /** 48 | * 父级菜单 49 | */ 50 | @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 51 | @JoinColumn(name = "parent_id") 52 | private Menu parent; 53 | 54 | /** 55 | * 子菜单 56 | */ 57 | @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER) 58 | private List children = new ArrayList<>(); 59 | 60 | public Long getId() { 61 | return id; 62 | } 63 | 64 | public void setId(Long id) { 65 | this.id = id; 66 | } 67 | 68 | public String getName() { 69 | return name; 70 | } 71 | 72 | public void setName(String name) { 73 | this.name = name; 74 | } 75 | 76 | public String getIconClass() { 77 | return iconClass; 78 | } 79 | 80 | public void setIconClass(String iconClass) { 81 | this.iconClass = iconClass; 82 | } 83 | 84 | public String getHref() { 85 | return href; 86 | } 87 | 88 | public void setHref(String href) { 89 | this.href = href; 90 | } 91 | 92 | public Integer getLevel() { 93 | return level; 94 | } 95 | 96 | public void setLevel(Integer level) { 97 | this.level = level; 98 | } 99 | 100 | public Integer getSequence() { 101 | return sequence; 102 | } 103 | 104 | public void setSequence(Integer sequence) { 105 | this.sequence = sequence; 106 | } 107 | 108 | public Menu getParent() { 109 | return parent; 110 | } 111 | 112 | public void setParent(Menu parent) { 113 | this.parent = parent; 114 | } 115 | 116 | public List getChildren() { 117 | return children; 118 | } 119 | 120 | public void setChildren(List children) { 121 | this.children = children; 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/entity/sys/User.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.entity.sys; 2 | 3 | import javax.persistence.*; 4 | import java.io.Serializable; 5 | 6 | @Entity 7 | @Table(name="sys_user") 8 | public class User implements Serializable{ 9 | private static final long serialVersionUID = 192879408189044L; 10 | @Id 11 | @GeneratedValue(strategy=GenerationType.IDENTITY) 12 | @Column(name="id") 13 | private Long id; 14 | @Column(name="user_name",length=50,nullable=false) 15 | private String userName; 16 | @Column(name="password",length=255,nullable=false) 17 | private String password; 18 | @Column(name = "nick_name") 19 | private String nickName; 20 | 21 | public Long getId() { 22 | return id; 23 | } 24 | public void setId(Long id) { 25 | this.id = id; 26 | } 27 | 28 | public String getUserName() { 29 | return userName; 30 | } 31 | 32 | public void setUserName(String userName) { 33 | this.userName = userName; 34 | } 35 | 36 | public String getPassword() { 37 | return password; 38 | } 39 | public void setPassword(String password) { 40 | this.password = password; 41 | } 42 | 43 | public String getNickName() { 44 | return nickName; 45 | } 46 | 47 | public void setNickName(String nickName) { 48 | this.nickName = nickName; 49 | } 50 | 51 | public User() { 52 | super(); 53 | } 54 | 55 | public User(String username, String password) { 56 | super(); 57 | this.userName = username; 58 | this.password = password; 59 | } 60 | public User(String username) { 61 | super(); 62 | this.userName = username; 63 | } 64 | public User(Long id) { 65 | super(); 66 | this.id = id; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/helper/BisHelper.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.helper; 2 | 3 | import io.github.igordonxiao.bean.Platform; 4 | 5 | /** 6 | * Created by gordon on 15/10/21. 7 | */ 8 | public class BisHelper { 9 | private BisHelper(){ 10 | 11 | } 12 | 13 | /** 14 | * 将数字转化为Platform枚举类型,超出定义的数字默认为所有平台 15 | * @param paltformCode 16 | * @return Platform 17 | */ 18 | public static Platform generatePlatform(Integer paltformCode){ 19 | for (Platform platform : Platform.values()) { 20 | if(platform.ordinal() == paltformCode){ 21 | return platform; 22 | } 23 | } 24 | return Platform.ALL; 25 | } 26 | 27 | /** 28 | * 转型为Integer 29 | * @param object 30 | * @return 31 | */ 32 | public static Integer objectTransForInteger(Object object){ 33 | return object == null? null: new Integer(object.toString()); 34 | } 35 | 36 | /** 37 | * 转型为Long 38 | * @param object 39 | * @return 40 | */ 41 | public static Long objectTransForLong(Object object){ 42 | return object == null? null:new Long(object.toString()); 43 | } 44 | 45 | /** 46 | * 转型为Double 47 | * @param object 48 | * @return 49 | */ 50 | public static Double objectTransForDouble(Object object){ 51 | return object == null? null:new Double(object.toString()); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/helper/MenuComparator.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.helper; 2 | 3 | import io.github.igordonxiao.entity.sys.Menu; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * Created by gordon on 15/10/23. 9 | */ 10 | public class MenuComparator implements Comparator { 11 | @Override 12 | public int compare(Menu menu1, Menu menu2) { 13 | return menu1.getSequence() - menu2.getSequence(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/http/JSONResult.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.http; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * Created by gordon on 15/9/16. 9 | */ 10 | public class JSONResult implements Serializable { 11 | private static final long serialVersionUID = 1013123223232L; 12 | 13 | public JSONResult(ResultState resultState){ 14 | this.resultState = resultState; 15 | } 16 | 17 | public JSONResult(ResultState resultState, String msg) { 18 | this.resultState = resultState; 19 | this.msg = msg; 20 | } 21 | 22 | public JSONResult(ResultState resultState, String msg, Object data) { 23 | this.resultState = resultState; 24 | this.msg = msg; 25 | this.data = data; 26 | } 27 | 28 | public JSONResult(ResultState resultState, Object data) { 29 | this.resultState = resultState; 30 | this.data = data; 31 | } 32 | 33 | /** 34 | * 返回状态 35 | */ 36 | private ResultState resultState; 37 | 38 | /** 39 | * 返回消息 40 | */ 41 | private String msg; 42 | 43 | /** 44 | * 返回的错误码 45 | */ 46 | private String errorCode; 47 | 48 | /** 49 | * 返回数据 50 | */ 51 | private Object data; 52 | 53 | public ResultState getResultState() { 54 | return resultState; 55 | } 56 | 57 | public void setResultState(ResultState resultState) { 58 | this.resultState = resultState; 59 | } 60 | 61 | public String getMsg() { 62 | return msg; 63 | } 64 | 65 | public void setMsg(String msg) { 66 | this.msg = msg; 67 | } 68 | 69 | public String getErrorCode() { 70 | return errorCode; 71 | } 72 | 73 | public void setErrorCode(String errorCode) { 74 | this.errorCode = errorCode; 75 | } 76 | 77 | public Object getData() { 78 | return data; 79 | } 80 | 81 | public void setData(Object data) { 82 | this.data = data; 83 | } 84 | 85 | @Override 86 | public String toString() { 87 | return JSON.toJSONString(this); 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/http/ResultState.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.http; 2 | 3 | /** 4 | * Created by gordon on 15/9/16. 5 | */ 6 | public enum ResultState { 7 | success("success"), 8 | failure("failure"), 9 | ; 10 | 11 | private final String state; 12 | 13 | ResultState(String state) { 14 | this.state = state; 15 | } 16 | 17 | public String getState() { 18 | return this.state; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/interceptor/SessionIntercepter.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.interceptor; 2 | 3 | import io.github.igordonxiao.bean.Constants; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | import org.springframework.web.servlet.ModelAndView; 7 | import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 8 | 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import javax.servlet.http.HttpSession; 12 | 13 | /** 14 | * Created by gordon on 15/10/22. 15 | * 拦截main页面及bis业务接口 16 | */ 17 | 18 | public class SessionIntercepter extends HandlerInterceptorAdapter { 19 | private static final Logger log = LoggerFactory.getLogger(SessionIntercepter.class); 20 | 21 | /** 22 | * 在业务处理器处理请求之前被调用 23 | * 如果返回false 24 | * 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 25 | * 如果返回true 26 | * 执行下一个拦截器,直到所有的拦截器都执行完毕 27 | * 再执行被拦截的Controller 28 | * 然后进入拦截器链, 29 | * 从最后一个拦截器往回执行所有的postHandle() 30 | * 接着再从最后一个拦截器往回执行所有的afterCompletion() 31 | */ 32 | @Override 33 | public boolean preHandle(HttpServletRequest request, 34 | HttpServletResponse response, Object handler) throws Exception { 35 | // 检查用户是否有登录 36 | // get user from sessiion 37 | HttpSession session = request.getSession(); 38 | Object userInSession = session.getAttribute(Constants.USERID_IN_SESSION); 39 | if(userInSession == null){ 40 | request.setAttribute("error", "请先登录"); 41 | request.getRequestDispatcher("/").forward(request, response); 42 | return false; 43 | } 44 | return true; 45 | } 46 | 47 | 48 | /** 49 | * 在业务处理器处理请求执行完成后,生成视图之前执行的动作 50 | * 可在modelAndView中加入数据,比如当前时间 51 | */ 52 | @Override 53 | public void postHandle(HttpServletRequest request, 54 | HttpServletResponse response, Object handler, 55 | ModelAndView modelAndView) throws Exception { 56 | } 57 | 58 | /** 59 | * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 60 | * 61 | * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion() 62 | */ 63 | @Override 64 | public void afterCompletion(HttpServletRequest request, 65 | HttpServletResponse response, Object handler, Exception ex) 66 | throws Exception { 67 | 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/interceptor/WebRootInterceptor.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.interceptor; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import io.github.igordonxiao.util.RequestUtil; 7 | import org.springframework.web.servlet.ModelAndView; 8 | import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 9 | 10 | public class WebRootInterceptor extends HandlerInterceptorAdapter { 11 | 12 | @Override 13 | public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 14 | ModelAndView modelAndView) throws Exception { 15 | request.setAttribute("webRoot", RequestUtil.getAppURL(request));//项目根路径 16 | super.postHandle(request, response, handler, modelAndView); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/resolver/CustomSimpleMappingExceptionResolver.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.resolver; 2 | 3 | import io.github.igordonxiao.http.JSONResult; 4 | import io.github.igordonxiao.http.ResultState; 5 | import org.slf4j.Logger; 6 | import org.slf4j.LoggerFactory; 7 | import org.springframework.web.servlet.ModelAndView; 8 | import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver; 9 | 10 | import javax.servlet.http.HttpServletRequest; 11 | import javax.servlet.http.HttpServletResponse; 12 | import java.io.IOException; 13 | import java.io.PrintWriter; 14 | 15 | /** 16 | * Created by gordon on 15/10/26. 17 | */ 18 | public class CustomSimpleMappingExceptionResolver extends SimpleMappingExceptionResolver { 19 | private static final Logger log = LoggerFactory.getLogger(CustomSimpleMappingExceptionResolver.class); 20 | 21 | @Override 22 | protected ModelAndView doResolveException(HttpServletRequest request, 23 | HttpServletResponse response, Object handler, Exception ex) { 24 | String viewName = determineViewName(ex, request); 25 | 26 | if (viewName != null) { 27 | if (!(request.getHeader("accept").contains("application/json")|| (request 28 | .getHeader("X-Requested-With") != null && request 29 | .getHeader("X-Requested-With").contains("XMLHttpRequest")))) { 30 | 31 | Integer statusCode = determineStatusCode(request, viewName); 32 | if (statusCode != null) { 33 | applyStatusCodeIfPossible(request, response, statusCode); 34 | } 35 | return getModelAndView(viewName, ex, request); 36 | } else { 37 | // Ajax请求返回JSON错误数据 38 | try { 39 | JSONResult errorJSONResult = new JSONResult(ResultState.failure, ex.getMessage()); 40 | response.setCharacterEncoding("UTF-8"); 41 | PrintWriter out = response.getWriter(); 42 | response.setHeader("content-type", "application/json;charset=UTF-8"); 43 | out.write(errorJSONResult.toString()); 44 | } catch (IOException e) { 45 | log.error(e.getMessage(), e); 46 | } 47 | return null; 48 | 49 | } 50 | } else { 51 | return null; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/service/sys/IGenericService.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.service.sys; 2 | 3 | import io.github.igordonxiao.dao.sys.IGenericDao; 4 | 5 | import java.io.Serializable; 6 | import java.util.List; 7 | 8 | public interface IGenericService { 9 | 10 | /** 11 | * 返回genericDao 12 | * @return IGenericDao 13 | */ 14 | IGenericDao getGenericDao(); 15 | 16 | /** 17 | * 通过id加载po实例 18 | * 19 | * @param id 20 | * @return 实体对象 21 | */ 22 | T load(PK id); 23 | 24 | /** 25 | * 通过id加载po实例 26 | * 27 | * @param id 28 | * @return 实体对象 29 | */ 30 | T get(PK id); 31 | 32 | /** 33 | * 根据ID数组获取实体对象集合. 34 | * 35 | * @param ids 36 | * @return 实体对象集合 37 | */ 38 | List get(PK[] ids); 39 | 40 | /** 41 | * 根据属性名和属性值获取实体对象. 42 | * 43 | * @param propertyName 44 | * @param value 45 | * @return 实体对象 46 | */ 47 | T get(String propertyName, Object value); 48 | 49 | 50 | /** 51 | * 根据属性名和属性值获取实体对象集合. 52 | * 53 | * @param propertyName 54 | * @param value 55 | * @return 实体对象集合 56 | */ 57 | List getList(String propertyName, Object value); 58 | 59 | /** 60 | * 获取所有实体对象总数. 61 | * 62 | * @return 实体对象总数 63 | */ 64 | Integer getAllCount(); 65 | 66 | 67 | /** 68 | * 保存实体对象. 69 | * 70 | * @param entity 71 | * @return ID 72 | */ 73 | PK save(T entity); 74 | 75 | /** 76 | * 保存或更新一个对象 77 | * 78 | * @param entity 79 | */ 80 | void saveOrUpdate(T entity); 81 | 82 | /** 83 | * 更新实体对象. 84 | * 85 | * @param entity 86 | */ 87 | void update(T entity); 88 | 89 | /** 90 | * 合并一个对象 91 | * 92 | * @param entity 93 | */ 94 | void merge(T entity); 95 | 96 | /** 97 | * 删除实体对象. 98 | * 99 | * @param entity 100 | * @return 101 | */ 102 | void delete(T entity); 103 | 104 | /** 105 | * 根据ID删除实体对象. 106 | * 107 | * @param id 108 | */ 109 | void delete(PK id); 110 | 111 | /** 112 | * 根据ID数组删除实体对象. 113 | * 114 | * @param ids 115 | */ 116 | void delete(PK[] ids); 117 | 118 | /** 119 | * 根据实体集合删除实体对象 120 | * 121 | * @param list 122 | */ 123 | void delete(List list); 124 | 125 | /** 126 | * 获取全部列表 127 | * 128 | * @return 129 | */ 130 | List list(); 131 | } 132 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/service/sys/IMenuService.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.service.sys; 2 | 3 | import io.github.igordonxiao.entity.sys.Menu; 4 | 5 | import java.util.List; 6 | 7 | public interface IMenuService extends IGenericService { 8 | /** 9 | * 获取所有的菜单 10 | * @return List 11 | */ 12 | List getMenu(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/service/sys/IUserService.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.service.sys; 2 | 3 | import io.github.igordonxiao.entity.sys.User; 4 | import io.github.igordonxiao.bean.Page; 5 | 6 | public interface IUserService extends IGenericService { 7 | 8 | /** 9 | * 检查用户登录 10 | * @param user 11 | * @return User 12 | */ 13 | User checkLogin(User user); 14 | 15 | /** 16 | * 获取用户的分页对象 17 | * 18 | * @param pageSize 19 | * @param nowPage 20 | * @return 21 | */ 22 | Page getUserPage(Integer pageSize, Integer nowPage); 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/service/sys/impl/GenericService.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.service.sys.impl; 2 | 3 | import io.github.igordonxiao.dao.sys.IGenericDao; 4 | import io.github.igordonxiao.service.sys.IGenericService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.io.Serializable; 9 | import java.util.List; 10 | 11 | @Service("genericService") 12 | public abstract class GenericService implements IGenericService { 13 | @Autowired 14 | private IGenericDao genericDao; 15 | 16 | @Override 17 | public IGenericDao getGenericDao() { 18 | return genericDao; 19 | } 20 | 21 | @Override 22 | public T load(PK id) { 23 | return this.genericDao.load(id); 24 | } 25 | 26 | @Override 27 | public T get(PK id) { 28 | return this.genericDao.get(id); 29 | } 30 | 31 | @Override 32 | public List get(PK[] ids) { 33 | return this.genericDao.get(ids); 34 | } 35 | 36 | @Override 37 | public T get(String propertyName, Object value) { 38 | return this.genericDao.get(propertyName, value); 39 | } 40 | 41 | @Override 42 | public List getList(String propertyName, Object value) { 43 | return this.genericDao.getList(propertyName, value); 44 | } 45 | 46 | @Override 47 | public Integer getAllCount() { 48 | return this.genericDao.getCount(); 49 | } 50 | 51 | @Override 52 | public PK save(T entity) { 53 | return this.genericDao.save(entity); 54 | } 55 | 56 | @Override 57 | public void saveOrUpdate(T entity) { 58 | this.genericDao.saveOrUpdate(entity); 59 | } 60 | 61 | @Override 62 | public void update(T entity) { 63 | this.genericDao.update(entity); 64 | } 65 | 66 | @Override 67 | public void merge(T entity) { 68 | this.genericDao.merge(entity); 69 | } 70 | 71 | @Override 72 | public void delete(T entity) { 73 | this.genericDao.delete(entity); 74 | } 75 | 76 | @Override 77 | public void delete(PK id) { 78 | this.genericDao.delete(id); 79 | } 80 | 81 | @Override 82 | public void delete(PK[] ids) { 83 | this.genericDao.delete(ids); 84 | } 85 | 86 | @Override 87 | public void delete(List list) { 88 | this.genericDao.delete(list); 89 | } 90 | 91 | @Override 92 | public List list() { 93 | return this.genericDao.list(); 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/service/sys/impl/MenuService.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.service.sys.impl; 2 | 3 | import io.github.igordonxiao.entity.sys.Menu; 4 | import io.github.igordonxiao.helper.MenuComparator; 5 | import io.github.igordonxiao.service.sys.IMenuService; 6 | import org.springframework.cache.annotation.Cacheable; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.List; 10 | import java.util.stream.Collectors; 11 | 12 | /** 13 | * Created by gordon on 15/10/20. 14 | */ 15 | @Service("menuService") 16 | public class MenuService extends GenericService implements IMenuService { 17 | @Override 18 | @Cacheable("menuCache") 19 | public List getMenu() { 20 | return this.getList("level", 1).stream().sorted(new MenuComparator()).peek(menu -> { 21 | List children = menu.getChildren(); 22 | if (children != null && children.size() > 0) { 23 | menu.setChildren(children.stream().sorted(new MenuComparator()).collect(Collectors.toList())); 24 | } 25 | }).collect(Collectors.toList()); 26 | //return this.getList("level", 1); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/service/sys/impl/UserService.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.service.sys.impl; 2 | 3 | import io.github.igordonxiao.bean.Page; 4 | import io.github.igordonxiao.dao.sys.IUserDao; 5 | import io.github.igordonxiao.entity.sys.User; 6 | import io.github.igordonxiao.service.sys.IUserService; 7 | import io.github.igordonxiao.util.PwdUtil; 8 | import org.hibernate.criterion.DetachedCriteria; 9 | import org.hibernate.criterion.Restrictions; 10 | import org.slf4j.Logger; 11 | import org.slf4j.LoggerFactory; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.stereotype.Service; 14 | 15 | @Service("userService") 16 | public class UserService extends GenericService implements IUserService { 17 | private static final Logger log = LoggerFactory.getLogger(UserService.class); 18 | 19 | @Autowired 20 | private IUserDao userDao; 21 | 22 | @Override 23 | public User checkLogin(User user) { 24 | DetachedCriteria criteria = DetachedCriteria.forClass(User.class); 25 | criteria.add(Restrictions.eq("userName", user.getUserName())).add(Restrictions.eq("password", PwdUtil.md5(user.getPassword()))); 26 | return (User)this.userDao.findObject(criteria); 27 | } 28 | 29 | @Override 30 | public Page getUserPage(Integer pageSize, Integer nowPage) { 31 | DetachedCriteria criteria = DetachedCriteria.forClass(User.class); 32 | Page page = new Page(); 33 | page.setOrderBy("id"); 34 | page.setPageSize(pageSize); 35 | page.setNowPage(nowPage); 36 | return userDao.getPage(criteria, page); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/util/PwdUtil.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.util; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | import java.math.BigInteger; 5 | import java.security.MessageDigest; 6 | import java.util.Base64; 7 | 8 | import io.github.igordonxiao.bean.Constants; 9 | 10 | /** 11 | * 工具类-密码加密 12 | */ 13 | public class PwdUtil { 14 | 15 | /** 16 | * MD5加密 17 | * 18 | * @param content 待加密文本 19 | * @return 20 | */ 21 | public static String md5(String content) { 22 | return encryption("MD5", content); 23 | } 24 | 25 | /** 26 | * SHA-1加密 27 | * 28 | * @param content 待加密文本 29 | * @return 30 | */ 31 | public static String sha1(String content) { 32 | return encryption("SHA-1", content); 33 | } 34 | 35 | /** 36 | * MD5、SHA-1 等通用加密方法 37 | * 38 | * @param type 39 | * @param content 40 | * @return 41 | */ 42 | private static String encryption(String type, String content) { 43 | MessageDigest curAlg = null; 44 | try { 45 | curAlg = MessageDigest.getInstance(type); 46 | byte[] b = content.getBytes("UTF-8"); 47 | curAlg.update(b); 48 | byte[] hash = curAlg.digest(); 49 | StringBuffer hexString = new StringBuffer(); 50 | for (int i = 0; i < hash.length; i++) { 51 | int v = hash[i] & 0xFF; 52 | if (v < 16) { 53 | hexString.append(0); 54 | } 55 | hexString.append(Integer.toString(v, 16)); 56 | } 57 | return hexString.toString(); 58 | } catch (Exception e) { 59 | Constants.LOG.error(e.getMessage()); 60 | } 61 | return ""; 62 | } 63 | 64 | /** 65 | * 字符串 base64编码 66 | * 67 | * @param str 68 | * @return 69 | */ 70 | public static String strToBase64(Object obj) { 71 | 72 | try { 73 | return Base64.getEncoder().encodeToString(obj.toString().getBytes("UTF-8")); 74 | } catch (UnsupportedEncodingException e) { 75 | Constants.LOG.info(e.getMessage()); 76 | return Base64.getEncoder().encodeToString(obj.toString().getBytes()); 77 | } 78 | } 79 | 80 | /** 81 | * base64编码的字符串解码 82 | * 83 | * @param b64Str 84 | * @return 85 | */ 86 | public static String base64ToStr(String b64Str) { 87 | try { 88 | return new String(Base64.getDecoder().decode(b64Str), "UTF-8"); 89 | } catch (UnsupportedEncodingException e) { 90 | Constants.LOG.info(e.getMessage()); 91 | return new String(Base64.getDecoder().decode(b64Str)); 92 | } 93 | } 94 | 95 | 96 | private static final int RADIX = 36;//可逆加密结果的进制(36表示36进制,表示加密结果可以为0-9,a-z一共36个字符) 97 | private static final String SEED = "MySEED2015";//可逆加密种子(种子不一样加密出来的结果不一样) 98 | 99 | /** 100 | * 可逆加密 101 | * 102 | * @param password 103 | * @return 104 | */ 105 | public static final String xorEncrypt(String content) { 106 | if (content == null || content.length() == 0) return ""; 107 | BigInteger bi_content = new BigInteger(content.getBytes()); 108 | BigInteger bi = new BigInteger(SEED, RADIX); 109 | bi = bi.xor(bi_content); 110 | return bi.toString(RADIX).toLowerCase(); 111 | } 112 | 113 | /** 114 | * 可逆加密的解密 115 | * 116 | * @param encrypted 117 | * @return 118 | */ 119 | public static final String xorDecrypt(String encrypted) { 120 | if (encrypted == null || encrypted.length() == 0) return ""; 121 | BigInteger bi_confuse = new BigInteger(SEED, RADIX); 122 | try { 123 | BigInteger bi = new BigInteger(encrypted.toLowerCase(), RADIX); 124 | bi = bi.xor(bi_confuse); 125 | return new String(bi.toByteArray()); 126 | } catch (Exception e) { 127 | Constants.LOG.info(e.getMessage()); 128 | return ""; 129 | } 130 | } 131 | 132 | public static void main(String[] args) { 133 | System.out.println(PwdUtil.md5("admin")); 134 | } 135 | 136 | } 137 | -------------------------------------------------------------------------------- /src/main/java/io/github/igordonxiao/util/RequestUtil.java: -------------------------------------------------------------------------------- 1 | package io.github.igordonxiao.util; 2 | 3 | import javax.servlet.http.Cookie; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | 7 | /** 8 | * 设置cookies的便利类 9 | */ 10 | public final class RequestUtil { 11 | 12 | private RequestUtil() { 13 | } 14 | 15 | /** 16 | * 设置Cookie 17 | * 18 | * @param request 19 | * @param response 20 | * @param name 21 | * @param value 22 | * @param expiry 23 | */ 24 | public static void setCookie(HttpServletRequest request, HttpServletResponse response, String name, String value, Integer expiry) { 25 | Cookie cookie = new Cookie(name, value); 26 | if ("https".equalsIgnoreCase(request.getScheme())) { 27 | cookie.setSecure(true); 28 | }//如果是HTTPS 则设置 secure 为 true 29 | cookie.setHttpOnly(true); 30 | cookie.setPath("/"); 31 | cookie.setMaxAge(expiry); 32 | response.addCookie(cookie); 33 | } 34 | 35 | /** 36 | * 获取Cookie 37 | * 38 | * @param request 39 | * @param name 获取Cookie的名称 40 | * @return 41 | */ 42 | public static Cookie getCookie(HttpServletRequest request, String name) { 43 | Cookie[] cookies = request.getCookies(); 44 | Cookie returnCookie = null; 45 | if (cookies == null) { 46 | return returnCookie; 47 | } 48 | for (final Cookie thisCookie : cookies) { 49 | if (thisCookie.getName().equals(name) && !"".equals(thisCookie.getValue())) { 50 | returnCookie = thisCookie; 51 | break; 52 | } 53 | } 54 | return returnCookie; 55 | } 56 | 57 | /** 58 | * 删除Cookie 59 | * 60 | * @param request 61 | * @param response 62 | * @param name 63 | */ 64 | public static void deleteCookie(HttpServletResponse response, String name) { 65 | Cookie cookie = new Cookie(name, ""); 66 | deleteCookie(response, cookie); 67 | } 68 | 69 | /** 70 | * 删除Cookie 71 | * 72 | * @param response 73 | * @param cookie 74 | */ 75 | public static void deleteCookie(HttpServletResponse response, Cookie cookie) { 76 | if (cookie != null) { 77 | cookie.setMaxAge(0); 78 | cookie.setPath("/"); 79 | response.addCookie(cookie); 80 | } 81 | } 82 | 83 | /** 84 | * 获取当前项目的webroot的方法 85 | * 86 | * @param request 当前请求 87 | * @return 88 | */ 89 | public static String getAppURL(HttpServletRequest request) { 90 | if (request == null) 91 | return ""; 92 | 93 | StringBuffer url = new StringBuffer(); 94 | int port = request.getServerPort(); 95 | if (port < 0) { 96 | port = 80; // Work around java.net.URL bug 97 | } 98 | String scheme = request.getScheme(); 99 | url.append(scheme); 100 | url.append("://"); 101 | url.append(request.getServerName()); 102 | if ((scheme.equals("http") && (port != 80)) || (scheme.equals("https") && (port != 443))) { 103 | url.append(':'); 104 | url.append(port); 105 | } 106 | url.append(request.getContextPath()); 107 | return url.toString(); 108 | } 109 | 110 | } 111 | -------------------------------------------------------------------------------- /src/main/resources/ehcache.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 14 | -------------------------------------------------------------------------------- /src/main/resources/jdbc.properties: -------------------------------------------------------------------------------- 1 | jdbc.url=jdbc:mysql://localhost:3306/iweb-java?UseUnicode=true&characterEncoding=utf8 2 | jdbc.username=root 3 | 4 | #数据库密码加密命令: java -cp druid.jar com.alibaba.druid.filter.config.ConfigTools you_password 5 | #详情请参考这里 https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter 6 | #若密码不想加密请删除datasource配置中filters中的config 以及 删除connectionProperties 属性 7 | jdbc.password=root 8 | 9 | jdbc.driver=com.mysql.jdbc.Driver 10 | jdbc.validationsql=SELECT 1 11 | 12 | # Hibernate 13 | hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 14 | hibernate.hbm2ddl.auto=update 15 | hibernate.show_sql=true 16 | hibernate.format_sql=false -------------------------------------------------------------------------------- /src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | [%d{yyyy-MM-dd HH:mm:ss}] [%-5level] [%F-%M:%L] - %msg%n 9 | 10 | 11 | 12 | 13 | ${log.base}/iweb-java.log 14 | 15 | ${log.base}/iweb-java.%d{yyyyMMdd}.log 16 | 30 17 | 18 | 19 | [%d{yyyy-MM-dd HH:mm:ss}] [%-5level] [%F-%M:%L] - %msg%n 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | ERROR 30 | ACCEPT 31 | DENY 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /src/main/resources/spring-mvc.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | text/html;charset=UTF-8 22 | application/json 23 | 24 | 25 | 26 | 27 | WriteMapNullValue 28 | QuoteFieldNames 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | utf-8 54 | utf-8 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 500 70 | 404 71 | 72 | 73 | 74 | 75 | error/500 76 | error/500 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /src/main/resources/spring.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | io.github.igordonxiao.service.* 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jetbrick-template.properties: -------------------------------------------------------------------------------- 1 | jetx.template.loaders = $loader 2 | $loader = jetbrick.template.loader.ServletResourceLoader 3 | $loader.reloadable = true -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/error/404.jetx: -------------------------------------------------------------------------------- 1 | 2 | #define(Map ENV) 3 | #include("../include/env.jetx", {}, "ENV") 4 | 5 | 6 | #include("../include/page-head.jetx") 7 | 8 | 9 | 10 | 11 |
12 |

404

13 |

抱歉,没有找到您要的页面

14 |
15 |
16 |
17 | 回到首页 18 |
19 |
20 | 21 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/error/500.jetx: -------------------------------------------------------------------------------- 1 | 2 | #define(Map ENV) 3 | #include("../include/env.jetx", {}, "ENV") 4 | 5 | 6 | #include("../include/page-head.jetx") 7 | 8 | 9 | 10 | 11 |
12 |

500

13 |

服务器内部错误

14 | 15 |
16 |

服务器好像出错了...

17 |
18 |
19 | 20 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/include/env.jetx: -------------------------------------------------------------------------------- 1 | #return({version: "0.1.5"}) -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/include/main-aside-left.jetx: -------------------------------------------------------------------------------- 1 | 2 | 40 | 41 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/include/main-aside-right.jetx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/include/main-content-foot.jetx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/include/main-content-head.jetx: -------------------------------------------------------------------------------- 1 |
2 | 49 |
50 |
51 | 53 | 58 | 60 |
61 | 64 | 73 |
74 | 退出 75 |
-------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/include/page-foot.jetx: -------------------------------------------------------------------------------- 1 | 2 | #define(Map ENV) 3 | #include("env.jetx", {}, "ENV") 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/include/page-head.jetx: -------------------------------------------------------------------------------- 1 | 2 | #define(Map ENV) 3 | #include("env.jetx", {}, "ENV") 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | iweb-java后台管理系统 13 | 14 | 15 | 16 | 17 | 18 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/index.jetx: -------------------------------------------------------------------------------- 1 |

Welcome

-------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/login.jetx: -------------------------------------------------------------------------------- 1 |  2 | #define(Map ENV) 3 | #include("include/env.jetx", {}, "ENV") 4 | 5 | 6 | #include("include/page-head.jetx") 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 |

15 |

16 |
17 |
18 |

iweb-java-登录

19 | 后台管理系统 20 | 37 |
38 |
39 | 40 | #include("include/page-foot.jetx") 41 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/main.jetx: -------------------------------------------------------------------------------- 1 |  2 | #define(Map ENV) 3 | #include("include/env.jetx", {}, "ENV") 4 | 5 | 6 | #include("include/page-head.jetx") 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | #include("include/main-aside-left.jetx") 15 | 16 | 17 | 18 |
19 | #include("/WEB-INF/view/include/main-content-head.jetx") 20 |
21 | 22 |
23 | #include("include/main-content-foot.jetx") 24 |
25 | 26 |
27 | 28 | #include("include/main-aside-right.jetx") 29 | 30 | 31 | 32 | #include("include/page-foot.jetx") 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/view/mainIndex.jetx: -------------------------------------------------------------------------------- 1 | 2 | #define(Map ENV) 3 | #include("include/env.jetx", {}, "ENV") 4 | 5 | 6 | #include("include/page-head.jetx") 7 | 8 | 9 | 10 | 11 |
12 |
13 |
14 |

iweb-java后台管理系统

15 |
16 |
17 |
18 | 19 | 20 | 21 | #include("include/page-foot.jetx") 22 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/login.min.css: -------------------------------------------------------------------------------- 1 | html { 2 | height: 100%; 3 | } 4 | 5 | body.signin { 6 | background: #18c8f6; 7 | height: auto; 8 | background: url(../img/login-background.jpg) no-repeat center fixed; 9 | -webkit-background-size: cover; 10 | -moz-background-size: cover; 11 | -o-background-size: cover; 12 | background-size: cover; 13 | color: rgba(255,255,255,.95); 14 | } 15 | 16 | .signinpanel { 17 | width: 750px; 18 | margin: 10% auto 0 auto; 19 | } 20 | 21 | .signinpanel .logopanel { 22 | float: none; 23 | width: auto; 24 | padding: 0; 25 | background: 0 0; 26 | } 27 | 28 | .signinpanel .signin-info ul { 29 | list-style: none; 30 | padding: 0; 31 | margin: 20px 0; 32 | } 33 | 34 | .signinpanel .form-control { 35 | display: block; 36 | margin-top: 15px; 37 | } 38 | 39 | .signinpanel .uname { 40 | background: #fff url(../img/user.png) no-repeat 95% center; 41 | color: #333; 42 | } 43 | 44 | .signinpanel .pword { 45 | background: #fff url(../img/locked.png) no-repeat 95% center; 46 | color: #333; 47 | } 48 | 49 | .signinpanel .btn { 50 | margin-top: 15px; 51 | } 52 | 53 | .signinpanel form { 54 | background: rgba(255,255,255,.2); 55 | border: 1px solid rgba(255,255,255,.3); 56 | -moz-box-shadow: 0 3px 0 rgba(12,12,12,.03); 57 | -webkit-box-shadow: 0 3px 0 rgba(12,12,12,.03); 58 | box-shadow: 0 3px 0 rgba(12,12,12,.03); 59 | -moz-border-radius: 3px; 60 | -webkit-border-radius: 3px; 61 | border-radius: 3px; 62 | padding: 30px; 63 | } 64 | 65 | .signup-footer { 66 | border-top: solid 1px rgba(255,255,255,.3); 67 | margin: 20px 0; 68 | padding-top: 15px; 69 | } 70 | 71 | @media screen and (max-width:768px) { 72 | .signinpanel, .signuppanel { 73 | margin: 0 auto; 74 | width: 420px !important; 75 | padding: 20px; 76 | } 77 | 78 | .signinpanel form { 79 | margin-top: 20px; 80 | } 81 | 82 | .signup-footer { 83 | margin-bottom: 10px; 84 | } 85 | 86 | .signuppanel .form-control { 87 | margin-bottom: 10px; 88 | } 89 | 90 | .signup-footer .pull-left, .signup-footer .pull-right { 91 | float: none !important; 92 | text-align: center; 93 | } 94 | 95 | .signinpanel .signin-info ul { 96 | display: none; 97 | } 98 | } 99 | 100 | @media screen and (max-width:320px) { 101 | .signinpanel, .signuppanel { 102 | margin: 0 20px; 103 | width: auto; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/patterns/header-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/lib/bootstrap/css/patterns/header-profile.png -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/colorpicker/css/bootstrap-colorpicker.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Colorpicker 3 | * http://mjolnic.github.io/bootstrap-colorpicker/ 4 | * 5 | * Originally written by (c) 2012 Stefan Petre 6 | * Licensed under the Apache License v2.0 7 | * http://www.apache.org/licenses/LICENSE-2.0.txt 8 | * 9 | */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("../img/bootstrap-colorpicker/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue.png")}.colorpicker-alpha{display:none;background-image:url("../img/bootstrap-colorpicker/alpha.png")}.colorpicker{top:0;left:0;z-index:25000!important;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("../img/bootstrap-colorpicker/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-element .input-group-addon i,.colorpicker-element .add-on i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("../img/bootstrap-colorpicker/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block} -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/cropper/cropper.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Cropper v0.7.6-beta 3 | * https://github.com/fengyuanchen/cropper 4 | * 5 | * Copyright 2014 Fengyuan Chen 6 | * Released under the MIT license 7 | */ 8 | 9 | .cropper-container{position:relative;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.cropper-container img{width:100%;height:100%;min-width:0!important;min-height:0!important;max-width:none!important;max-height:none!important}.cropper-modal,.cropper-canvas{position:absolute;top:0;right:0;bottom:0;left:0}.cropper-canvas{background-color:#fff;opacity:0;filter:alpha(opacity=0)}.cropper-modal{background-color:#000;opacity:.5;filter:alpha(opacity=50)}.cropper-dragger{position:absolute;top:10%;left:10%;width:80%;height:80%}.cropper-viewer{display:block;width:100%;height:100%;overflow:hidden;outline-width:1px;outline-style:solid;outline-color:#69f;outline-color:rgba(51,102,255,.75)}.cropper-dashed{position:absolute;display:block;border:0 dashed #fff;opacity:.5;filter:alpha(opacity=50)}.cropper-dashed.dashed-h{top:33.3%;left:0;width:100%;height:33.3%;border-top-width:1px;border-bottom-width:1px}.cropper-dashed.dashed-v{top:0;left:33.3%;width:33.3%;height:100%;border-right-width:1px;border-left-width:1px}.cropper-face,.cropper-line,.cropper-point{position:absolute;display:block;width:100%;height:100%;opacity:.1;filter:alpha(opacity=10)}.cropper-face{top:0;left:0;cursor:move;background-color:#fff}.cropper-line{background-color:#69f}.cropper-line.line-e{top:0;right:-3px;width:5px;cursor:e-resize}.cropper-line.line-n{top:-3px;left:0;height:5px;cursor:n-resize}.cropper-line.line-w{top:0;left:-3px;width:5px;cursor:w-resize}.cropper-line.line-s{bottom:-3px;left:0;height:5px;cursor:s-resize}.cropper-point{width:5px;height:5px;background-color:#69f;opacity:.75;filter:alpha(opacity=75)}.cropper-point.point-e{top:50%;right:-3px;margin-top:-3px;cursor:e-resize}.cropper-point.point-n{top:-3px;left:50%;margin-left:-3px;cursor:n-resize}.cropper-point.point-w{top:50%;left:-3px;margin-top:-3px;cursor:w-resize}.cropper-point.point-s{bottom:-3px;left:50%;margin-left:-3px;cursor:s-resize}.cropper-point.point-ne{top:-3px;right:-3px;cursor:ne-resize}.cropper-point.point-nw{top:-3px;left:-3px;cursor:nw-resize}.cropper-point.point-sw{bottom:-3px;left:-3px;cursor:sw-resize}.cropper-point.point-se{right:-3px;bottom:-3px;width:20px;height:20px;cursor:se-resize;opacity:1;filter:alpha(opacity=100)}.cropper-point.point-se:before{position:absolute;right:-50%;bottom:-50%;display:block;width:200%;height:200%;content:" ";background-color:#69f;opacity:0;filter:alpha(opacity=0)}@media (min-width:768px){.cropper-point.point-se{width:15px;height:15px}}@media (min-width:992px){.cropper-point.point-se{width:10px;height:10px}}@media (min-width:1200px){.cropper-point.point-se{width:5px;height:5px;opacity:.75;filter:alpha(opacity=75)}}.cropper-hidden{display:none!important}.cropper-invisible{position:fixed;top:0;left:0;z-index:-1;width:auto!important;max-width:none!important;height:auto!important;max-height:none!important;opacity:0;filter:alpha(opacity=0)}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-canvas,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed} -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/fullcalendar/fullcalendar.print.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * FullCalendar v1.6.4 Print Stylesheet 3 | * Docs & License: http://arshaw.com/fullcalendar/ 4 | * (c) 2013 Adam Shaw 5 | */ 6 | 7 | /* 8 | * Include this stylesheet on your page to get a more printer-friendly calendar. 9 | * When including this stylesheet, use the media='print' attribute of the tag. 10 | * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css. 11 | */ 12 | 13 | 14 | /* Events 15 | -----------------------------------------------------*/ 16 | 17 | .fc-event { 18 | background: #fff !important; 19 | color: #000 !important; 20 | } 21 | 22 | /* for vertical events */ 23 | 24 | .fc-event-bg { 25 | display: none !important; 26 | } 27 | 28 | .fc-event .ui-resizable-handle { 29 | display: none !important; 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/iCheck/custom.css: -------------------------------------------------------------------------------- 1 | /* iCheck plugin Square skin, green 2 | ----------------------------------- */ 3 | .icheckbox_square-green, 4 | .iradio_square-green { 5 | display: inline-block; 6 | *display: inline; 7 | vertical-align: middle; 8 | margin: 0; 9 | padding: 0; 10 | width: 22px; 11 | height: 22px; 12 | background: url(green.png) no-repeat; 13 | border: none; 14 | cursor: pointer; 15 | } 16 | 17 | .icheckbox_square-green { 18 | background-position: 0 0; 19 | } 20 | .icheckbox_square-green.hover { 21 | background-position: -24px 0; 22 | } 23 | .icheckbox_square-green.checked { 24 | background-position: -48px 0; 25 | } 26 | .icheckbox_square-green.disabled { 27 | background-position: -72px 0; 28 | cursor: default; 29 | } 30 | .icheckbox_square-green.checked.disabled { 31 | background-position: -96px 0; 32 | } 33 | 34 | .iradio_square-green { 35 | background-position: -120px 0; 36 | } 37 | .iradio_square-green.hover { 38 | background-position: -144px 0; 39 | } 40 | .iradio_square-green.checked { 41 | background-position: -168px 0; 42 | } 43 | .iradio_square-green.disabled { 44 | background-position: -192px 0; 45 | cursor: default; 46 | } 47 | .iradio_square-green.checked.disabled { 48 | background-position: -216px 0; 49 | } 50 | 51 | /* HiDPI support */ 52 | @media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { 53 | .icheckbox_square-green, 54 | .iradio_square-green { 55 | background-image: url(green@2x.png); 56 | -webkit-background-size: 240px 24px; 57 | background-size: 240px 24px; 58 | } 59 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/ionRangeSlider/ion.rangeSlider.css: -------------------------------------------------------------------------------- 1 | /* Ion.RangeSlider 2 | // css version 1.8.5 3 | // by Denis Ineshin | ionden.com 4 | // ===================================================================================================================*/ 5 | 6 | /* ===================================================================================================================== 7 | // RangeSlider */ 8 | 9 | .irs { 10 | position: relative; display: block; 11 | } 12 | .irs-line { 13 | position: relative; display: block; 14 | overflow: hidden; 15 | } 16 | .irs-line-left, .irs-line-mid, .irs-line-right { 17 | position: absolute; display: block; 18 | top: 0; 19 | } 20 | .irs-line-left { 21 | left: 0; width: 10%; 22 | } 23 | .irs-line-mid { 24 | left: 10%; width: 80%; 25 | } 26 | .irs-line-right { 27 | right: 0; width: 10%; 28 | } 29 | 30 | .irs-diapason { 31 | position: absolute; display: block; 32 | left: 0; width: 100%; 33 | } 34 | .irs-slider { 35 | position: absolute; display: block; 36 | cursor: default; 37 | z-index: 1; 38 | } 39 | .irs-slider.single { 40 | left: 10px; 41 | } 42 | .irs-slider.single:before { 43 | position: absolute; display: block; content: ""; 44 | top: -30%; left: -30%; 45 | width: 160%; height: 160%; 46 | background: rgba(0,0,0,0.0); 47 | } 48 | .irs-slider.from { 49 | left: 100px; 50 | } 51 | .irs-slider.from:before { 52 | position: absolute; display: block; content: ""; 53 | top: -30%; left: -30%; 54 | width: 130%; height: 160%; 55 | background: rgba(0,0,0,0.0); 56 | } 57 | .irs-slider.to { 58 | left: 300px; 59 | } 60 | .irs-slider.to:before { 61 | position: absolute; display: block; content: ""; 62 | top: -30%; left: 0; 63 | width: 130%; height: 160%; 64 | background: rgba(0,0,0,0.0); 65 | } 66 | .irs-slider.last { 67 | z-index: 2; 68 | } 69 | 70 | .irs-min { 71 | position: absolute; display: block; 72 | left: 0; 73 | cursor: default; 74 | } 75 | .irs-max { 76 | position: absolute; display: block; 77 | right: 0; 78 | cursor: default; 79 | } 80 | 81 | .irs-from, .irs-to, .irs-single { 82 | position: absolute; display: block; 83 | top: 0; left: 0; 84 | cursor: default; 85 | white-space: nowrap; 86 | } 87 | 88 | 89 | .irs-grid { 90 | position: absolute; display: none; 91 | bottom: 0; left: 0; 92 | width: 100%; height: 20px; 93 | } 94 | .irs-with-grid .irs-grid { 95 | display: block; 96 | } 97 | .irs-grid-pol { 98 | position: absolute; 99 | top: 0; left: 0; 100 | width: 1px; height: 8px; 101 | background: #000; 102 | } 103 | .irs-grid-pol.small { 104 | height: 4px; 105 | } 106 | .irs-grid-text { 107 | position: absolute; 108 | bottom: 0; left: 0; 109 | width: 100px; 110 | white-space: nowrap; 111 | text-align: center; 112 | font-size: 9px; line-height: 9px; 113 | color: #000; 114 | } 115 | 116 | .irs-disable-mask { 117 | position: absolute; display: block; 118 | top: 0; left: 0; 119 | width: 100%; height: 100%; 120 | cursor: default; 121 | background: rgba(0,0,0,0.0); 122 | z-index: 2; 123 | } 124 | .irs-disabled { 125 | opacity: 0.4; 126 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/ionRangeSlider/ion.rangeSlider.skinFlat.css: -------------------------------------------------------------------------------- 1 | /* Ion.RangeSlider, Flat UI Skin 2 | // css version 1.8.5 3 | // by Denis Ineshin | ionden.com 4 | // ===================================================================================================================*/ 5 | 6 | /* ===================================================================================================================== 7 | // Skin details */ 8 | 9 | .irs-line-mid, 10 | .irs-line-left, 11 | .irs-line-right, 12 | .irs-diapason, 13 | .irs-slider { 14 | background: url(../images/sprite-skin-flat.png) repeat-x; 15 | } 16 | 17 | .irs { 18 | height: 40px; 19 | } 20 | .irs-with-grid { 21 | height: 60px; 22 | } 23 | .irs-line { 24 | height: 12px; top: 25px; 25 | } 26 | .irs-line-left { 27 | height: 12px; 28 | background-position: 0 -30px; 29 | } 30 | .irs-line-mid { 31 | height: 12px; 32 | background-position: 0 0; 33 | } 34 | .irs-line-right { 35 | height: 12px; 36 | background-position: 100% -30px; 37 | } 38 | 39 | .irs-diapason { 40 | height: 12px; top: 25px; 41 | background-position: 0 -60px; 42 | } 43 | 44 | .irs-slider { 45 | width: 16px; height: 18px; 46 | top: 22px; 47 | background-position: 0 -90px; 48 | } 49 | #irs-active-slider, .irs-slider:hover { 50 | background-position: 0 -120px; 51 | } 52 | 53 | .irs-min, .irs-max { 54 | color: #999; 55 | font-size: 10px; line-height: 1.333; 56 | text-shadow: none; 57 | top: 0; padding: 1px 3px; 58 | background: #e1e4e9; 59 | border-radius: 4px; 60 | } 61 | 62 | .irs-from, .irs-to, .irs-single { 63 | color: #fff; 64 | font-size: 10px; line-height: 1.333; 65 | text-shadow: none; 66 | padding: 1px 5px; 67 | background: #ed5565; 68 | border-radius: 4px; 69 | } 70 | .irs-from:after, .irs-to:after, .irs-single:after { 71 | position: absolute; display: block; content: ""; 72 | bottom: -6px; left: 50%; 73 | width: 0; height: 0; 74 | margin-left: -3px; 75 | overflow: hidden; 76 | border: 3px solid transparent; 77 | border-top-color: #ed5565; 78 | } 79 | 80 | 81 | .irs-grid-pol { 82 | background: #e1e4e9; 83 | } 84 | .irs-grid-text { 85 | color: #999; 86 | } 87 | 88 | .irs-disabled { 89 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/markdown/bootstrap-markdown.min.css: -------------------------------------------------------------------------------- 1 | .md-editor{display:block;border:1px solid #ddd}.md-editor .md-footer,.md-editor>.md-header{display:block;padding:6px 4px;background:#f5f5f5}.md-editor>.md-header{margin:0}.md-editor>.md-preview{background:#fff;border-top:1px dashed #ddd;border-bottom:1px dashed #ddd;min-height:10px;overflow:auto}.md-editor>textarea{font-family:Menlo, Monaco, Consolas, "Courier New", monospace;font-size:14px;outline:0;margin:0;display:block;padding:15px;width:100%;border:0;border-top:1px dashed #ddd;border-bottom:1px dashed #ddd;border-radius:0;box-shadow:none;background:#fafafa}.md-editor>textarea:focus{box-shadow:none;background:#fff}.md-editor.active{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6)}.md-editor .md-controls{float:right;padding:3px}.md-editor .md-controls .md-control{right:5px;color:#bebebe;padding:3px 3px 3px 10px}.md-editor .md-controls .md-control:hover{color:#333}.md-editor.md-fullscreen-mode{width:100%;height:100%;position:fixed;top:0;left:0;z-index:99999;padding:60px 30px 15px;background:#fff!important;border:0!important}.md-editor.md-fullscreen-mode .md-footer{display:none}.md-editor.md-fullscreen-mode .md-input,.md-editor.md-fullscreen-mode .md-preview{margin:0 auto!important;height:100%!important;font-size:20px!important;padding:20px!important;color:#999;line-height:1.6em!important;resize:none!important;box-shadow:none!important;background:#fff!important;border:0!important}.md-editor.md-fullscreen-mode .md-preview{color:#333;overflow:auto}.md-editor.md-fullscreen-mode .md-input:focus,.md-editor.md-fullscreen-mode .md-input:hover{color:#333;background:#fff!important}.md-editor.md-fullscreen-mode .md-header{background:0 0;text-align:center;position:fixed;width:100%;top:20px}.md-editor.md-fullscreen-mode .btn-group{float:none}.md-editor.md-fullscreen-mode .btn{border:0;background:0 0;color:#b3b3b3}.md-editor.md-fullscreen-mode .btn.active,.md-editor.md-fullscreen-mode .btn:active,.md-editor.md-fullscreen-mode .btn:focus,.md-editor.md-fullscreen-mode .btn:hover{box-shadow:none;color:#333}.md-editor.md-fullscreen-mode .md-fullscreen-controls{position:absolute;top:20px;right:20px;text-align:right;z-index:1002;display:block}.md-editor.md-fullscreen-mode .md-fullscreen-controls a{color:#b3b3b3;clear:right;margin:10px;width:30px;height:30px;text-align:center}.md-editor.md-fullscreen-mode .md-fullscreen-controls a:hover{color:#333;text-decoration:none}.md-editor.md-fullscreen-mode .md-editor{height:100%!important;position:relative}.md-editor .md-fullscreen-controls{display:none}.md-nooverflow{overflow:hidden;position:fixed;width:100%} -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/morris/morris-0.4.3.min.css: -------------------------------------------------------------------------------- 1 | .morris-hover{position:absolute;z-index:1000;}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255, 255, 255, 0.8);border:solid 2px rgba(230, 230, 230, 0.8);font-family:sans-serif;font-size:12px;text-align:center;}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0;} 2 | .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0;} -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/nouslider/jquery.nouislider.css: -------------------------------------------------------------------------------- 1 | 2 | /* Functional styling; 3 | * These styles are required for noUiSlider to function. 4 | * You don't need to change these rules to apply your design. 5 | */ 6 | .noUi-target, 7 | .noUi-target * { 8 | -webkit-touch-callout: none; 9 | -webkit-user-select: none; 10 | -ms-touch-action: none; 11 | -ms-user-select: none; 12 | -moz-user-select: none; 13 | -moz-box-sizing: border-box; 14 | box-sizing: border-box; 15 | } 16 | .noUi-base { 17 | width: 100%; 18 | height: 100%; 19 | position: relative; 20 | } 21 | .noUi-origin { 22 | position: absolute; 23 | right: 0; 24 | top: 0; 25 | left: 0; 26 | bottom: 0; 27 | } 28 | .noUi-handle { 29 | position: relative; 30 | z-index: 1; 31 | } 32 | .noUi-stacking .noUi-handle { 33 | /* This class is applied to the lower origin when 34 | its values is > 50%. */ 35 | z-index: 10; 36 | } 37 | .noUi-stacking + .noUi-origin { 38 | /* Fix stacking order in IE7, which incorrectly 39 | creates a new context for the origins. */ 40 | *z-index: -1; 41 | } 42 | .noUi-state-tap .noUi-origin { 43 | -webkit-transition: left 0.3s, top 0.3s; 44 | transition: left 0.3s, top 0.3s; 45 | } 46 | .noUi-state-drag * { 47 | cursor: inherit !important; 48 | } 49 | 50 | /* Slider size and handle placement; 51 | */ 52 | .noUi-horizontal { 53 | height: 18px; 54 | } 55 | .noUi-horizontal .noUi-handle { 56 | width: 34px; 57 | height: 28px; 58 | left: -17px; 59 | top: -6px; 60 | } 61 | .noUi-horizontal.noUi-extended { 62 | padding: 0 15px; 63 | } 64 | .noUi-horizontal.noUi-extended .noUi-origin { 65 | right: -15px; 66 | } 67 | .noUi-vertical { 68 | width: 18px; 69 | } 70 | .noUi-vertical .noUi-handle { 71 | width: 28px; 72 | height: 34px; 73 | left: -6px; 74 | top: -17px; 75 | } 76 | .noUi-vertical.noUi-extended { 77 | padding: 15px 0; 78 | } 79 | .noUi-vertical.noUi-extended .noUi-origin { 80 | bottom: -15px; 81 | } 82 | 83 | /* Styling; 84 | */ 85 | .noUi-background { 86 | background: #FAFAFA; 87 | box-shadow: inset 0 1px 1px #f0f0f0; 88 | } 89 | .noUi-connect { 90 | background: #3FB8AF; 91 | box-shadow: inset 0 0 3px rgba(51,51,51,0.45); 92 | -webkit-transition: background 450ms; 93 | transition: background 450ms; 94 | } 95 | .noUi-origin { 96 | border-radius: 2px; 97 | } 98 | .noUi-target { 99 | border-radius: 4px; 100 | border: 1px solid #D3D3D3; 101 | box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB; 102 | } 103 | .noUi-target.noUi-connect { 104 | box-shadow: inset 0 0 3px rgba(51,51,51,0.45), 0 3px 6px -5px #BBB; 105 | } 106 | 107 | /* Handles and cursors; 108 | */ 109 | .noUi-dragable { 110 | cursor: w-resize; 111 | } 112 | .noUi-vertical .noUi-dragable { 113 | cursor: n-resize; 114 | } 115 | .noUi-handle { 116 | border: 1px solid #D9D9D9; 117 | border-radius: 3px; 118 | background: #FFF; 119 | cursor: default; 120 | box-shadow: inset 0 0 1px #FFF, 121 | inset 0 1px 7px #EBEBEB, 122 | 0 3px 6px -3px #BBB; 123 | } 124 | .noUi-active { 125 | box-shadow: inset 0 0 1px #FFF, 126 | inset 0 1px 7px #DDD, 127 | 0 3px 6px -3px #BBB; 128 | } 129 | 130 | /* Handle stripes; 131 | */ 132 | .noUi-handle:before, 133 | .noUi-handle:after { 134 | content: ""; 135 | display: block; 136 | position: absolute; 137 | height: 14px; 138 | width: 1px; 139 | background: #E8E7E6; 140 | left: 14px; 141 | top: 6px; 142 | } 143 | .noUi-handle:after { 144 | left: 17px; 145 | } 146 | .noUi-vertical .noUi-handle:before, 147 | .noUi-vertical .noUi-handle:after { 148 | width: 14px; 149 | height: 1px; 150 | left: 6px; 151 | top: 14px; 152 | } 153 | .noUi-vertical .noUi-handle:after { 154 | top: 17px; 155 | } 156 | 157 | /* Disabled state; 158 | */ 159 | [disabled].noUi-connect, 160 | [disabled] .noUi-connect { 161 | background: #B8B8B8; 162 | } 163 | [disabled] .noUi-handle { 164 | cursor: not-allowed; 165 | } 166 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/switchery/switchery.css: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * Main stylesheet for Switchery. 4 | * http://abpetkov.github.io/switchery/ 5 | * 6 | */ 7 | 8 | .switchery { 9 | background-color: #fff; 10 | border: 1px solid #dfdfdf; 11 | border-radius: 20px; 12 | cursor: pointer; 13 | display: inline-block; 14 | height: 30px; 15 | position: relative; 16 | vertical-align: middle; 17 | width: 50px; 18 | 19 | -webkit-box-sizing: content-box; 20 | -moz-box-sizing: content-box; 21 | box-sizing: content-box; 22 | } 23 | 24 | .switchery > small { 25 | background: #fff; 26 | border-radius: 100%; 27 | box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); 28 | height: 30px; 29 | position: absolute; 30 | top: 0; 31 | width: 30px; 32 | } -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/treeview/bootstrap-treeview.css: -------------------------------------------------------------------------------- 1 | /* ========================================================= 2 | * bootstrap-treeview.css v1.0.0 3 | * ========================================================= 4 | * Copyright 2013 Jonathan Miles 5 | * Project URL : http://www.jondmiles.com/bootstrap-treeview 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================= */ 19 | 20 | .list-group-item { 21 | cursor: pointer; 22 | } 23 | 24 | /*.list-group-item:hover { 25 | background-color: #f5f5f5; 26 | }*/ 27 | 28 | span.indent { 29 | margin-left: 10px; 30 | margin-right: 10px; 31 | } 32 | 33 | span.icon { 34 | margin-right: 5px; 35 | } 36 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/css/plugins/webuploader/webuploader.css: -------------------------------------------------------------------------------- 1 | .webuploader-container { 2 | position: relative; 3 | } 4 | .webuploader-element-invisible { 5 | position: absolute !important; 6 | clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ 7 | clip: rect(1px,1px,1px,1px); 8 | } 9 | .webuploader-pick { 10 | position: relative; 11 | display: inline-block; 12 | cursor: pointer; 13 | background: #00b7ee; 14 | padding: 10px 15px; 15 | color: #fff; 16 | text-align: center; 17 | border-radius: 3px; 18 | overflow: hidden; 19 | } 20 | .webuploader-pick-hover { 21 | background: #00a2d4; 22 | } 23 | 24 | .webuploader-pick-disable { 25 | opacity: 0.6; 26 | pointer-events:none; 27 | } 28 | 29 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/lib/bootstrap/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/lib/bootstrap/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/lib/bootstrap/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/content.min.js: -------------------------------------------------------------------------------- 1 | function $childNode(o){return window.frames[o]}function animationHover(o,e){o=$(o),o.hover(function(){o.addClass("animated "+e)},function(){window.setTimeout(function(){o.removeClass("animated "+e)},2e3)})}function WinMove(){var o="[class*=col]",e=".ibox-title",i="[class*=col]";$(o).sortable({handle:e,connectWith:i,tolerance:"pointer",forcePlaceholderSize:!0,opacity:.8}).disableSelection()}var $parentNode=window.parent.document;if($(".tooltip-demo").tooltip({selector:"[data-toggle=tooltip]",container:"body"}),$(".modal").appendTo("body"),$("[data-toggle=popover]").popover(),$(".collapse-link").click(function(){var o=$(this).closest("div.ibox"),e=$(this).find("i"),i=o.find("div.ibox-content");i.slideToggle(200),e.toggleClass("fa-chevron-up").toggleClass("fa-chevron-down"),o.toggleClass("").toggleClass("border-bottom"),setTimeout(function(){o.resize(),o.find("[id^=map-]").resize()},50)}),$(".close-link").click(function(){var o=$(this).closest("div.ibox");o.remove()}),top==this){var gohome='
';/*$("body").append(gohome)*/} -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/hplus.min.js: -------------------------------------------------------------------------------- 1 | function NavToggle() { 2 | $(".navbar-minimalize").trigger("click") 3 | } 4 | function SmoothlyMenu() { 5 | $("body").hasClass("mini-navbar") ? $("body").hasClass("fixed-sidebar") ? ($("#side-menu").hide(), setTimeout(function () { $("#side-menu").fadeIn(500) }, 300)) : $("#side-menu").removeAttr("style") : ($("#side-menu").hide(), setTimeout(function () { $("#side-menu").fadeIn(500) }, 100)) 6 | } 7 | function localStorageSupport() { 8 | return "localStorage" in window && null !== window.localStorage 9 | } 10 | layer.config({ 11 | extend: ["skin/moon/style.css"], skin: "layer-ext-moon" 12 | }), 13 | $(document).ready(function () { 14 | function a() { 15 | var a = $("body > #wrapper").height() - 61; $(".sidebard-panel").css("min-height", a + "px") 16 | } 17 | $("#side-menu").metisMenu(), $(".right-sidebar-toggle").click(function () { 18 | $("#right-sidebar").toggleClass("sidebar-open") 19 | }), $(".sidebar-container").slimScroll({ height: "100%", railOpacity: .4, wheelStep: 10 }), $(".open-small-chat").click(function () { 20 | $(this).children().toggleClass("fa-comments").toggleClass("fa-remove"), $(".small-chat-box").toggleClass("active") 21 | }), $(".small-chat-box .content").slimScroll({ height: "234px", railOpacity: .4 }), $(".check-link").click(function () { var a = $(this).find("i"), e = $(this).next("span"); return a.toggleClass("fa-check-square").toggleClass("fa-square-o"), e.toggleClass("todo-completed"), !1 }), $(function () { 22 | $(".sidebar-collapse").slimScroll({ height: "100%", railOpacity: .9, alwaysVisible: !1 }) 23 | }), $(".navbar-minimalize").click(function () { 24 | $("body").toggleClass("mini-navbar"), SmoothlyMenu() 25 | }), a(), $(window).bind("load resize click scroll", function () { 26 | $("body").hasClass("body-small") || a() 27 | }), $(window).scroll(function () { 28 | $(window).scrollTop() > 0 && !$("body").hasClass("fixed-nav") ? $("#right-sidebar").addClass("sidebar-top") : $("#right-sidebar").removeClass("sidebar-top") 29 | }), $(".full-height-scroll").slimScroll({ height: "100%" }), $("#side-menu>li").click(function () { 30 | $("body").hasClass("mini-navbar") && NavToggle() 31 | }), $("#side-menu>li li a").click(function () { 32 | $(window).width() < 769 && NavToggle() 33 | }), $(".nav-close").click(NavToggle) 34 | }), 35 | $(window).bind("load resize", function () { 36 | $(this).width() < 769 && ($("body").addClass("mini-navbar"), $(".navbar-static-side").fadeIn()) 37 | }), $(function () { 38 | //if ($.get("skin-config.html", function (a) { 39 | // $("body").append(a) 40 | //}), localStorageSupport) { 41 | // var a = localStorage.getItem("collapse_menu"); 42 | // var e = localStorage.getItem("fixednavbar"); 43 | // var i = localStorage.getItem("boxedlayout"); 44 | // var l = $("body"); "on" == a && (l.hasClass("body-small") || l.addClass("mini-navbar")), "on" == e && ($(".navbar-static-top").removeClass("navbar-static-top").addClass("navbar-fixed-top"), l.addClass("fixed-nav")), "on" == i && l.addClass("boxed-layout") 45 | //} 46 | }); -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/bootstraptable/bootstrap-table-zh-CN.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * bootstrap-table - v1.9.1 - 2015-10-25 3 | * https://github.com/wenzhixin/bootstrap-table 4 | * Copyright (c) 2015 zhixin wen 5 | * Licensed MIT License 6 | */ 7 | !function(a){"use strict";a.fn.bootstrapTable.locales["zh-CN"]={formatLoadingMessage:function(){return"正在努力地加载数据中,请稍候……"},formatRecordsPerPage:function(a){return"每页显示 "+a+" 条记录"},formatShowingRows:function(a,b,c){return"显示第 "+a+" 到第 "+b+" 条记录,总共 "+c+" 条记录"},formatSearch:function(){return"搜索"},formatNoMatches:function(){return"没有找到匹配的记录"},formatPaginationSwitch:function(){return"隐藏/显示分页"},formatRefresh:function(){return"刷新"},formatToggle:function(){return"切换"},formatColumns:function(){return"列"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["zh-CN"])}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/flot/jquery.flot.resize.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin for automatically redrawing plots as the placeholder resizes. 2 | 3 | Copyright (c) 2007-2013 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | It works by listening for changes on the placeholder div (through the jQuery 7 | resize event plugin) - if the size changes, it will redraw the plot. 8 | 9 | There are no options. If you need to disable the plugin for some plots, you 10 | can just fix the size of their placeholders. 11 | 12 | */ 13 | 14 | /* Inline dependency: 15 | * jQuery resize event - v1.1 - 3/14/2010 16 | * http://benalman.com/projects/jquery-resize-plugin/ 17 | * 18 | * Copyright (c) 2010 "Cowboy" Ben Alman 19 | * Dual licensed under the MIT and GPL licenses. 20 | * http://benalman.com/about/license/ 21 | */ 22 | 23 | (function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this); 24 | 25 | (function ($) { 26 | var options = { }; // no options 27 | 28 | function init(plot) { 29 | function onResize() { 30 | var placeholder = plot.getPlaceholder(); 31 | 32 | // somebody might have hidden us and we can't plot 33 | // when we don't have the dimensions 34 | if (placeholder.width() == 0 || placeholder.height() == 0) 35 | return; 36 | 37 | plot.resize(); 38 | plot.setupGrid(); 39 | plot.draw(); 40 | } 41 | 42 | function bindEvents(plot, eventHolder) { 43 | plot.getPlaceholder().resize(onResize); 44 | } 45 | 46 | function shutdown(plot, eventHolder) { 47 | plot.getPlaceholder().unbind("resize", onResize); 48 | } 49 | 50 | plot.hooks.bindEvents.push(bindEvents); 51 | plot.hooks.shutdown.push(shutdown); 52 | } 53 | 54 | $.plot.plugins.push({ 55 | init: init, 56 | options: options, 57 | name: 'resize', 58 | version: '1.0' 59 | }); 60 | })(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/flot/jquery.flot.symbol.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin that adds some extra symbols for plotting points. 2 | 3 | Copyright (c) 2007-2014 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | The symbols are accessed as strings through the standard symbol options: 7 | 8 | series: { 9 | points: { 10 | symbol: "square" // or "diamond", "triangle", "cross" 11 | } 12 | } 13 | 14 | */ 15 | 16 | (function ($) { 17 | function processRawData(plot, series, datapoints) { 18 | // we normalize the area of each symbol so it is approximately the 19 | // same as a circle of the given radius 20 | 21 | var handlers = { 22 | square: function (ctx, x, y, radius, shadow) { 23 | // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 24 | var size = radius * Math.sqrt(Math.PI) / 2; 25 | ctx.rect(x - size, y - size, size + size, size + size); 26 | }, 27 | diamond: function (ctx, x, y, radius, shadow) { 28 | // pi * r^2 = 2s^2 => s = r * sqrt(pi/2) 29 | var size = radius * Math.sqrt(Math.PI / 2); 30 | ctx.moveTo(x - size, y); 31 | ctx.lineTo(x, y - size); 32 | ctx.lineTo(x + size, y); 33 | ctx.lineTo(x, y + size); 34 | ctx.lineTo(x - size, y); 35 | }, 36 | triangle: function (ctx, x, y, radius, shadow) { 37 | // pi * r^2 = 1/2 * s^2 * sin (pi / 3) => s = r * sqrt(2 * pi / sin(pi / 3)) 38 | var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 3)); 39 | var height = size * Math.sin(Math.PI / 3); 40 | ctx.moveTo(x - size/2, y + height/2); 41 | ctx.lineTo(x + size/2, y + height/2); 42 | if (!shadow) { 43 | ctx.lineTo(x, y - height/2); 44 | ctx.lineTo(x - size/2, y + height/2); 45 | } 46 | }, 47 | cross: function (ctx, x, y, radius, shadow) { 48 | // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 49 | var size = radius * Math.sqrt(Math.PI) / 2; 50 | ctx.moveTo(x - size, y - size); 51 | ctx.lineTo(x + size, y + size); 52 | ctx.moveTo(x - size, y + size); 53 | ctx.lineTo(x + size, y - size); 54 | } 55 | }; 56 | 57 | var s = series.points.symbol; 58 | if (handlers[s]) 59 | series.points.symbol = handlers[s]; 60 | } 61 | 62 | function init(plot) { 63 | plot.hooks.processDatapoints.push(processRawData); 64 | } 65 | 66 | $.plot.plugins.push({ 67 | init: init, 68 | name: 'symbols', 69 | version: '1.0' 70 | }); 71 | })(jQuery); 72 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/flot/jquery.flot.tooltip.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jquery.flot.tooltip 3 | * 4 | * description: easy-to-use tooltips for Flot charts 5 | * version: 0.6.2 6 | * author: Krzysztof Urbas @krzysu [myviews.pl] 7 | * website: https://github.com/krzysu/flot.tooltip 8 | * 9 | * build on 2013-09-30 10 | * released under MIT License, 2012 11 | */ 12 | (function(t){var o={tooltip:!1,tooltipOpts:{content:"%s | X: %x | Y: %y",xDateFormat:null,yDateFormat:null,shifts:{x:10,y:20},defaultTheme:!0,onHover:function(){}}},i=function(t){this.tipPosition={x:0,y:0},this.init(t)};i.prototype.init=function(o){function i(t){var o={};o.x=t.pageX,o.y=t.pageY,s.updateTooltipPosition(o)}function e(t,o,i){var e=s.getDomElement();if(i){var n;n=s.stringFormat(s.tooltipOptions.content,i),e.html(n),s.updateTooltipPosition({x:o.pageX,y:o.pageY}),e.css({left:s.tipPosition.x+s.tooltipOptions.shifts.x,top:s.tipPosition.y+s.tooltipOptions.shifts.y}).show(),"function"==typeof s.tooltipOptions.onHover&&s.tooltipOptions.onHover(i,e)}else e.hide().html("")}var s=this;o.hooks.bindEvents.push(function(o,n){s.plotOptions=o.getOptions(),s.plotOptions.tooltip!==!1&&void 0!==s.plotOptions.tooltip&&(s.tooltipOptions=s.plotOptions.tooltipOpts,s.getDomElement(),t(o.getPlaceholder()).bind("plothover",e),t(n).bind("mousemove",i))}),o.hooks.shutdown.push(function(o,s){t(o.getPlaceholder()).unbind("plothover",e),t(s).unbind("mousemove",i)})},i.prototype.getDomElement=function(){var o;return t("#flotTip").length>0?o=t("#flotTip"):(o=t("
").attr("id","flotTip"),o.appendTo("body").hide().css({position:"absolute"}),this.tooltipOptions.defaultTheme&&o.css({background:"#fff","z-index":"100",padding:"0.4em 0.6em","border-radius":"0.5em","font-size":"0.8em",border:"1px solid #111",display:"none","white-space":"nowrap"})),o},i.prototype.updateTooltipPosition=function(o){var i=t("#flotTip").outerWidth()+this.tooltipOptions.shifts.x,e=t("#flotTip").outerHeight()+this.tooltipOptions.shifts.y;o.x-t(window).scrollLeft()>t(window).innerWidth()-i&&(o.x-=i),o.y-t(window).scrollTop()>t(window).innerHeight()-e&&(o.y-=e),this.tipPosition.x=o.x,this.tipPosition.y=o.y},i.prototype.stringFormat=function(t,o){var i=/%p\.{0,1}(\d{0,})/,e=/%s/,s=/%x\.{0,1}(?:\d{0,})/,n=/%y\.{0,1}(?:\d{0,})/;return"function"==typeof t&&(t=t(o.series.label,o.series.data[o.dataIndex][0],o.series.data[o.dataIndex][1],o)),o.series.percent!==void 0&&(t=this.adjustValPrecision(i,t,o.series.percent)),o.series.label!==void 0&&(t=t.replace(e,o.series.label)),this.isTimeMode("xaxis",o)&&this.isXDateFormat(o)&&(t=t.replace(s,this.timestampToDate(o.series.data[o.dataIndex][0],this.tooltipOptions.xDateFormat))),this.isTimeMode("yaxis",o)&&this.isYDateFormat(o)&&(t=t.replace(n,this.timestampToDate(o.series.data[o.dataIndex][1],this.tooltipOptions.yDateFormat))),"number"==typeof o.series.data[o.dataIndex][0]&&(t=this.adjustValPrecision(s,t,o.series.data[o.dataIndex][0])),"number"==typeof o.series.data[o.dataIndex][1]&&(t=this.adjustValPrecision(n,t,o.series.data[o.dataIndex][1])),o.series.xaxis.tickFormatter!==void 0&&(t=t.replace(s,o.series.xaxis.tickFormatter(o.series.data[o.dataIndex][0],o.series.xaxis))),o.series.yaxis.tickFormatter!==void 0&&(t=t.replace(n,o.series.yaxis.tickFormatter(o.series.data[o.dataIndex][1],o.series.yaxis))),t},i.prototype.isTimeMode=function(t,o){return o.series[t].options.mode!==void 0&&"time"===o.series[t].options.mode},i.prototype.isXDateFormat=function(){return this.tooltipOptions.xDateFormat!==void 0&&null!==this.tooltipOptions.xDateFormat},i.prototype.isYDateFormat=function(){return this.tooltipOptions.yDateFormat!==void 0&&null!==this.tooltipOptions.yDateFormat},i.prototype.timestampToDate=function(o,i){var e=new Date(o);return t.plot.formatDate(e,i)},i.prototype.adjustValPrecision=function(t,o,i){var e,s=o.match(t);return null!==s&&""!==RegExp.$1&&(e=RegExp.$1,i=i.toFixed(e),o=o.replace(t,i)),o};var e=function(t){new i(t)};t.plot.plugins.push({init:e,options:o,name:"tooltip",version:"0.6.1"})})(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/gritter/jquery.gritter.css: -------------------------------------------------------------------------------- 1 | /* the norm */ 2 | #gritter-notice-wrapper { 3 | position:fixed; 4 | top:40px; 5 | right:20px; 6 | width:301px; 7 | z-index:9999; 8 | 9 | -webkit-animation-duration: 1s; 10 | animation-duration: 1s; 11 | -webkit-animation-fill-mode: both; 12 | animation-fill-mode: both; 13 | 14 | -webkit-animation-name: bounceIn; 15 | animation-name: bounceIn; 16 | } 17 | @keyframes bounceIn { 18 | 0% { 19 | opacity: 0; 20 | -webkit-transform: scale(.3); 21 | -ms-transform: scale(.3); 22 | transform: scale(.3); 23 | } 24 | 25 | 50% { 26 | opacity: 1; 27 | -webkit-transform: scale(1.05); 28 | -ms-transform: scale(1.05); 29 | transform: scale(1.05); 30 | } 31 | 32 | 70% { 33 | -webkit-transform: scale(.9); 34 | -ms-transform: scale(.9); 35 | transform: scale(.9); 36 | } 37 | 38 | 100% { 39 | opacity: 1; 40 | -webkit-transform: scale(1); 41 | -ms-transform: scale(1); 42 | transform: scale(1); 43 | } 44 | } 45 | #gritter-notice-wrapper.top-left { 46 | left: 20px; 47 | right: auto; 48 | } 49 | #gritter-notice-wrapper.bottom-right { 50 | top: auto; 51 | left: auto; 52 | bottom: 20px; 53 | right: 20px; 54 | } 55 | #gritter-notice-wrapper.bottom-left { 56 | top: auto; 57 | right: auto; 58 | bottom: 20px; 59 | left: 20px; 60 | } 61 | .gritter-item-wrapper { 62 | position:relative; 63 | margin:0 0 10px 0; 64 | background:url('images/ie-spacer.gif'); /* ie7/8 fix */ 65 | } 66 | 67 | .hover .gritter-top { 68 | /*background-position:right -30px;*/ 69 | } 70 | .gritter-bottom { 71 | height:8px; 72 | margin:0; 73 | } 74 | 75 | .gritter-item { 76 | display:block; 77 | background-color: rgba(39,58,75,0.8); 78 | border-radius: 4px; 79 | color:#eee; 80 | padding:10px 11px 10px 11px; 81 | font-size: 11px; 82 | font-family:verdana; 83 | } 84 | .hover .gritter-item { 85 | background-position:right -40px; 86 | } 87 | .gritter-item p { 88 | padding:0; 89 | margin:0; 90 | word-wrap:break-word; 91 | } 92 | 93 | .gritter-item a:hover { 94 | color: #f8ac59; 95 | text-decoration: underline; 96 | } 97 | .gritter-close { 98 | display:none; 99 | position:absolute; 100 | top:5px; 101 | right:3px; 102 | background:url(images/gritter.png) no-repeat left top; 103 | cursor:pointer; 104 | width:30px; 105 | height:30px; 106 | text-indent:-9999em; 107 | } 108 | .gritter-title { 109 | font-size:12px; 110 | font-weight:bold; 111 | padding:0 0 7px 0; 112 | display:block; 113 | text-transform: uppercase; 114 | } 115 | .gritter-image { 116 | width:48px; 117 | height:48px; 118 | float:left; 119 | } 120 | .gritter-with-image, 121 | .gritter-without-image { 122 | padding:0; 123 | } 124 | .gritter-with-image { 125 | width:220px; 126 | float:right; 127 | } 128 | /* for the light (white) version of the gritter notice */ 129 | .gritter-light .gritter-item, 130 | .gritter-light .gritter-bottom, 131 | .gritter-light .gritter-top, 132 | .gritter-light .gritter-close { 133 | background-image: url(images/gritter-light.png); 134 | color: #222; 135 | } 136 | .gritter-light .gritter-title { 137 | text-shadow: none; 138 | } 139 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/gritter/jquery.gritter.min.js: -------------------------------------------------------------------------------- 1 | (function(b){b.gritter={};b.gritter.options={position:"",class_name:"",fade_in_speed:"medium",fade_out_speed:1000,time:6000};b.gritter.add=function(f){try{return a.add(f||{})}catch(d){var c="Gritter Error: "+d;(typeof(console)!="undefined"&&console.error)?console.error(c,f):alert(c)}};b.gritter.remove=function(d,c){a.removeSpecific(d,c||{})};b.gritter.removeAll=function(c){a.stop(c||{})};var a={position:"",fade_in_speed:"",fade_out_speed:"",time:"",_custom_timer:0,_item_count:0,_is_setup:0,_tpl_close:'Close Notification',_tpl_title:'[[title]]',_tpl_item:'',_tpl_wrap:'
',add:function(g){if(typeof(g)=="string"){g={text:g}}if(g.text===null){throw'You must supply "text" parameter.'}if(!this._is_setup){this._runSetup()}var k=g.title,n=g.text,e=g.image||"",l=g.sticky||false,m=g.class_name||b.gritter.options.class_name,j=b.gritter.options.position,d=g.time||"";this._verifyWrapper();this._item_count++;var f=this._item_count,i=this._tpl_item;b(["before_open","after_open","before_close","after_close"]).each(function(p,q){a["_"+q+"_"+f]=(b.isFunction(g[q]))?g[q]:function(){}});this._custom_timer=0;if(d){this._custom_timer=d}var c=(e!="")?'image':"",h=(e!="")?"gritter-with-image":"gritter-without-image";if(k){k=this._str_replace("[[title]]",k,this._tpl_title)}else{k=""}i=this._str_replace(["[[title]]","[[text]]","[[close]]","[[image]]","[[number]]","[[class_name]]","[[item_class]]"],[k,n,this._tpl_close,c,this._item_count,h,m],i);if(this["_before_open_"+f]()===false){return false}b("#gritter-notice-wrapper").addClass(j).append(i);var o=b("#gritter-item-"+this._item_count);o.fadeIn(this.fade_in_speed,function(){a["_after_open_"+f](b(this))});if(!l){this._setFadeTimer(o,f)}b(o).bind("mouseenter mouseleave",function(p){if(p.type=="mouseenter"){if(!l){a._restoreItemIfFading(b(this),f)}}else{if(!l){a._setFadeTimer(b(this),f)}}a._hoverState(b(this),p.type)});b(o).find(".gritter-close").click(function(){a.removeSpecific(f,{},null,true);return false;});return f},_countRemoveWrapper:function(c,d,f){d.remove();this["_after_close_"+c](d,f);if(b(".gritter-item-wrapper").length==0){b("#gritter-notice-wrapper").remove()}},_fade:function(g,d,j,f){var j=j||{},i=(typeof(j.fade)!="undefined")?j.fade:true,c=j.speed||this.fade_out_speed,h=f;this["_before_close_"+d](g,h);if(f){g.unbind("mouseenter mouseleave")}if(i){g.animate({opacity:0},c,function(){g.animate({height:0},300,function(){a._countRemoveWrapper(d,g,h)})})}else{this._countRemoveWrapper(d,g)}},_hoverState:function(d,c){if(c=="mouseenter"){d.addClass("hover");d.find(".gritter-close").show()}else{d.removeClass("hover");d.find(".gritter-close").hide()}},removeSpecific:function(c,g,f,d){if(!f){var f=b("#gritter-item-"+c)}this._fade(f,c,g||{},d)},_restoreItemIfFading:function(d,c){clearTimeout(this["_int_id_"+c]);d.stop().css({opacity:"",height:""})},_runSetup:function(){for(opt in b.gritter.options){this[opt]=b.gritter.options[opt]}this._is_setup=1},_setFadeTimer:function(f,d){var c=(this._custom_timer)?this._custom_timer:this.time;this["_int_id_"+d]=setTimeout(function(){a._fade(f,d)},c)},stop:function(e){var c=(b.isFunction(e.before_close))?e.before_close:function(){};var f=(b.isFunction(e.after_close))?e.after_close:function(){};var d=b("#gritter-notice-wrapper");c(d);d.fadeOut(function(){b(this).remove();f()})},_str_replace:function(v,e,o,n){var k=0,h=0,t="",m="",g=0,q=0,l=[].concat(v),c=[].concat(e),u=o,d=c instanceof Array,p=u instanceof Array;u=[].concat(u);if(n){this.window[n]=0}for(k=0,g=u.length;k 4 | */ 5 | (function ($) { 6 | $.fn.markdown.messages.zh = { 7 | 'Bold': "粗体", 8 | 'Italic': "斜体", 9 | 'Heading': "标题", 10 | 'URL/Link': "链接", 11 | 'Image': "图片", 12 | 'List': "列表", 13 | 'Unordered List': "无序列表", 14 | 'Ordered List': "有序列表", 15 | 'Code': "代码", 16 | 'Quote': "引用", 17 | 'Preview': "预览", 18 | 'strong text': "粗体", 19 | 'emphasized text': "强调", 20 | 'heading text': "标题", 21 | 'enter link description here': "输入链接说明", 22 | 'Insert Hyperlink': "URL地址", 23 | 'enter image description here': "输入图片说明", 24 | 'Insert Image Hyperlink': "图片URL地址", 25 | 'enter image title here': "在这里输入图片标题", 26 | 'list text here': "这里是列表文本", 27 | 'code text here': "这里输入代码", 28 | 'quote here': "这里输入引用文本" 29 | 30 | 31 | }; 32 | }(jQuery)); 33 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/peity/jquery.peity.min.js: -------------------------------------------------------------------------------- 1 | // Peity jQuery plugin version 2.0.3 2 | // (c) 2014 Ben Pickles 3 | // 4 | // http://benpickles.github.io/peity 5 | // 6 | // Released under MIT license. 7 | (function(e,q,h){var o=function(a,b){var c=q.createElementNS("http://www.w3.org/2000/svg",a);e.each(b,function(a,b){c.setAttribute(a,b)});return c},t="createElementNS"in q&&o("svg",{}).createSVGRect,r=1/(window.devicePixelRatio||1),j=e.fn.peity=function(a,b){t&&this.each(function(){var c=e(this),d=c.data("peity");if(d)a&&(d.type=a),e.extend(d.opts,b);else{var f=j.defaults[a],g={};e.each(c.data(),function(a,b){a in f&&(g[a]=b)});var h=e.extend({},f,g,b),d=new s(c,a,h);c.change(function(){d.draw()}).data("peity", 8 | d)}d.draw()});return this},s=function(a,b,c){this.$el=a;this.type=b;this.opts=c},m=s.prototype;m.draw=function(){j.graphers[this.type].call(this,this.opts)};m.fill=function(){var a=this.opts.fill,b=a;e.isFunction(b)||(b=function(b,d){return a[d%a.length]});return b};m.prepare=function(a,b){var c;this.svg?c=e(this.svg).empty():(this.svg=o("svg",{"class":"peity"}),this.$el.hide().after(this.svg),c=e(this.svg).data("peity",this));this.svg.setAttribute("height",b);this.svg.setAttribute("width",a);return c}; 9 | m.values=function(){return e.map(this.$el.text().split(this.opts.delimiter),function(a){return parseFloat(a)})};j.defaults={};j.graphers={};j.register=function(a,b,c){this.defaults[a]=b;this.graphers[a]=c};j.register("pie",{delimiter:null,diameter:16,fill:["#ff9900","#fff4dd","#ffc66e"]},function(a){if(!a.delimiter){var b=this.$el.text().match(/[^0-9\.]/);a.delimiter=b?b[0]:","}b=this.values();if("/"==a.delimiter)var c=b[0],b=[c,h.max(0,b[1]-c)];for(var d=0,c=b.length,f=0;de?1:0,1,q,r,"Z"].join(" ")});i=l}k.setAttribute("fill",j.call(this,n,d,b));this.svg.appendChild(k)}}});j.register("line",{delimiter:",",fill:"#c6d9fd",height:16,max:null, 11 | min:0,stroke:"#4d89f9",strokeWidth:1,width:32},function(a){var b=this.values();1==b.length&&b.push(b[0]);for(var c=h.max.apply(h,b.concat([a.max])),d=h.min.apply(h,b.concat([a.min])),f=this.prepare(a.width,a.height),g=f.width(),f=f.height()-a.strokeWidth,e=g/(b.length-1),c=c-d,j=0==c?f:f/c,m=f+d*j,c=[0,m],i=0;i=d&&0k&&(l+=k,k=-k);n=o("rect",{fill:m.call(this,n,i,b),x:i*g,y:l,width:g-a,height:k});this.svg.appendChild(n)}})})(jQuery,document,Math); 14 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/preetyTextDiff/jquery.pretty-text-diff.min.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 1.7.1 2 | 3 | /* 4 | @preserve jQuery.PrettyTextDiff 1.0.4 5 | See https://github.com/arnab/jQuery.PrettyTextDiff/ 6 | */ 7 | 8 | (function() { 9 | var $; 10 | 11 | $ = jQuery; 12 | 13 | $.fn.extend({ 14 | prettyTextDiff: function(options) { 15 | var dmp, settings; 16 | settings = { 17 | originalContainer: ".original", 18 | changedContainer: ".changed", 19 | diffContainer: ".diff", 20 | cleanup: true, 21 | debug: false 22 | }; 23 | settings = $.extend(settings, options); 24 | $.fn.prettyTextDiff.debug("Options: ", settings, settings); 25 | dmp = new diff_match_patch(); 26 | return this.each(function() { 27 | var changed, diff_as_html, diffs, original; 28 | if (settings.originalContent && settings.changedContent) { 29 | original = $('
').html(settings.originalContent).text(); 30 | changed = $('
').html(settings.changedContent).text(); 31 | } else { 32 | original = $(settings.originalContainer, this).text(); 33 | changed = $(settings.changedContainer, this).text(); 34 | } 35 | $.fn.prettyTextDiff.debug("Original text found: ", original, settings); 36 | $.fn.prettyTextDiff.debug("Changed text found: ", changed, settings); 37 | diffs = dmp.diff_main(original, changed); 38 | if (settings.cleanup) { 39 | dmp.diff_cleanupSemantic(diffs); 40 | } 41 | $.fn.prettyTextDiff.debug("Diffs: ", diffs, settings); 42 | diff_as_html = $.map(diffs, function(diff) { 43 | return $.fn.prettyTextDiff.createHTML(diff); 44 | }); 45 | $(settings.diffContainer, this).html(diff_as_html.join('')); 46 | return this; 47 | }); 48 | } 49 | }); 50 | 51 | $.fn.prettyTextDiff.debug = function(message, object, settings) { 52 | if (settings.debug) { 53 | return console.log(message, object); 54 | } 55 | }; 56 | 57 | $.fn.prettyTextDiff.createHTML = function(diff) { 58 | var data, html, operation, pattern_amp, pattern_gt, pattern_lt, pattern_para, text; 59 | html = []; 60 | pattern_amp = /&/g; 61 | pattern_lt = //g; 63 | pattern_para = /\n/g; 64 | operation = diff[0], data = diff[1]; 65 | text = data.replace(pattern_amp, '&').replace(pattern_lt, '<').replace(pattern_gt, '>').replace(pattern_para, '
'); 66 | switch (operation) { 67 | case DIFF_INSERT: 68 | return '' + text + ''; 69 | case DIFF_DELETE: 70 | return '' + text + ''; 71 | case DIFF_EQUAL: 72 | return '' + text + ''; 73 | } 74 | }; 75 | 76 | }).call(this); 77 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/prettyfile/bootstrap-prettyfile.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery and Bootsrap3 Plugin prettyFile 3 | * 4 | * version 2.0, Jan 20th, 2014 5 | * by episage, sujin2f 6 | * Git repository : https://github.com/episage/bootstrap-3-pretty-file-upload 7 | */ 8 | ( function( $ ) { 9 | $.fn.extend({ 10 | prettyFile: function( options ) { 11 | var defaults = { 12 | text : "选择文件" 13 | }; 14 | 15 | var options = $.extend(defaults, options); 16 | var plugin = this; 17 | 18 | function make_form( $el, text ) { 19 | $el.wrap('
'); 20 | 21 | $el.hide(); 22 | $el.after( '\ 23 |
\ 24 | \ 25 | \ 26 | \ 27 | \ 28 |
\ 29 | ' ); 30 | 31 | return $el.parent(); 32 | }; 33 | 34 | function bind_change( $wrap, multiple ) { 35 | $wrap.find( 'input[type="file"]' ).change(function () { 36 | // When original file input changes, get its value, show it in the fake input 37 | var files = $( this )[0].files, 38 | info = ''; 39 | 40 | if ( files.length == 0 ) 41 | return false; 42 | 43 | if ( !multiple || files.length == 1 ) { 44 | var path = $( this ).val().split('\\'); 45 | info = path[path.length - 1]; 46 | } else if ( files.length > 1 ) { 47 | // Display number of selected files instead of filenames 48 | info = "已选择了" + files.length + ' 个文件'; 49 | } 50 | 51 | $wrap.find('.input-append input').val( info ); 52 | }); 53 | }; 54 | 55 | function bind_button( $wrap, multiple ) { 56 | $wrap.find( '.input-append' ).click( function( e ) { 57 | e.preventDefault(); 58 | $wrap.find( 'input[type="file"]' ).click(); 59 | }); 60 | }; 61 | 62 | return plugin.each( function() { 63 | $this = $( this ); 64 | 65 | if ( $this ) { 66 | var multiple = $this.attr( 'multiple' ); 67 | 68 | $wrap = make_form( $this, options.text ); 69 | bind_change( $wrap, multiple ); 70 | bind_button( $wrap ); 71 | } 72 | }); 73 | } 74 | }); 75 | }( jQuery )); 76 | 77 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/summernote/summernote-zh-CN.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | $.extend($.summernote.lang, { 3 | 'zh-CN': { 4 | font: { 5 | bold: '粗体', 6 | italic: '斜体', 7 | underline: '下划线', 8 | strikethrough: '删除线', 9 | clear: '清除格式', 10 | height: '行高', 11 | name: '字体', 12 | size: '字号' 13 | }, 14 | image: { 15 | image: '图片', 16 | insert: '插入图片', 17 | resizeFull: '调整至 100%', 18 | resizeHalf: '调整至 50%', 19 | resizeQuarter: '调整至 25%', 20 | floatLeft: '左浮动', 21 | floatRight: '右浮动', 22 | floatNone: '不浮动', 23 | dragImageHere: '将图片拖至此处', 24 | selectFromFiles: '从本地上传', 25 | url: '图片地址' 26 | }, 27 | link: { 28 | link: '链接', 29 | insert: '插入链接', 30 | unlink: '去除链接', 31 | edit: '编辑链接', 32 | textToDisplay: '显示文本', 33 | url: '链接地址', 34 | openInNewWindow: '在新窗口打开' 35 | }, 36 | video: { 37 | video: '视频', 38 | videoLink: '视频链接', 39 | insert: '插入视频', 40 | url: '视频地址', 41 | providers: '(优酷, Instagram, DailyMotion, Youtube等)' 42 | }, 43 | table: { 44 | table: '表格' 45 | }, 46 | hr: { 47 | insert: '水平线' 48 | }, 49 | style: { 50 | style: '样式', 51 | normal: '普通', 52 | blockquote: '引用', 53 | pre: '代码', 54 | h1: '标题 1', 55 | h2: '标题 2', 56 | h3: '标题 3', 57 | h4: '标题 4', 58 | h5: '标题 5', 59 | h6: '标题 6' 60 | }, 61 | lists: { 62 | unordered: '无序列表', 63 | ordered: '有序列表' 64 | }, 65 | options: { 66 | help: '帮助', 67 | fullscreen: '全屏', 68 | codeview: '源代码' 69 | }, 70 | paragraph: { 71 | paragraph: '段落', 72 | outdent: '减少缩进', 73 | indent: '增加缩进', 74 | left: '左对齐', 75 | center: '居中对齐', 76 | right: '右对齐', 77 | justify: '两端对齐' 78 | }, 79 | color: { 80 | recent: '最近使用', 81 | more: '更多', 82 | background: '背景', 83 | foreground: '前景', 84 | transparent: '透明', 85 | setTransparent: '透明', 86 | reset: '重置', 87 | resetToDefault: '默认' 88 | }, 89 | shortcut: { 90 | shortcuts: '快捷键', 91 | close: '关闭', 92 | textFormatting: '文本格式', 93 | action: '动作', 94 | paragraphFormatting: '段落格式', 95 | documentStyle: '文档样式' 96 | }, 97 | history: { 98 | undo: '撤销', 99 | redo: '重做' 100 | } 101 | } 102 | }); 103 | })(jQuery); 104 | -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/toastr/toastr.min.js: -------------------------------------------------------------------------------- 1 | !function(e){e(["jquery"],function(e){return function(){function t(e,t,n){return f({type:O.error,iconClass:g().iconClasses.error,message:e,optionsOverride:n,title:t})}function n(t,n){return t||(t=g()),v=e("#"+t.containerId),v.length?v:(n&&(v=c(t)),v)}function i(e,t,n){return f({type:O.info,iconClass:g().iconClasses.info,message:e,optionsOverride:n,title:t})}function o(e){w=e}function s(e,t,n){return f({type:O.success,iconClass:g().iconClasses.success,message:e,optionsOverride:n,title:t})}function a(e,t,n){return f({type:O.warning,iconClass:g().iconClasses.warning,message:e,optionsOverride:n,title:t})}function r(e){var t=g();v||n(t),l(e,t)||u(t)}function d(t){var i=g();return v||n(i),t&&0===e(":focus",t).length?void h(t):void(v.children().length&&v.remove())}function u(t){for(var n=v.children(),i=n.length-1;i>=0;i--)l(e(n[i]),t)}function l(t,n){return t&&0===e(":focus",t).length?(t[n.hideMethod]({duration:n.hideDuration,easing:n.hideEasing,complete:function(){h(t)}}),!0):!1}function c(t){return v=e("
").attr("id",t.containerId).addClass(t.positionClass).attr("aria-live","polite").attr("role","alert"),v.appendTo(e(t.target)),v}function p(){return{tapToDismiss:!0,toastClass:"toast",containerId:"toast-container",debug:!1,showMethod:"fadeIn",showDuration:300,showEasing:"swing",onShown:void 0,hideMethod:"fadeOut",hideDuration:1e3,hideEasing:"swing",onHidden:void 0,extendedTimeOut:1e3,iconClasses:{error:"toast-error",info:"toast-info",success:"toast-success",warning:"toast-warning"},iconClass:"toast-info",positionClass:"toast-top-right",timeOut:5e3,titleClass:"toast-title",messageClass:"toast-message",target:"body",closeHtml:'',newestOnTop:!0,preventDuplicates:!1,progressBar:!1}}function m(e){w&&w(e)}function f(t){function i(t){return!e(":focus",l).length||t?(clearTimeout(O.intervalId),l[r.hideMethod]({duration:r.hideDuration,easing:r.hideEasing,complete:function(){h(l),r.onHidden&&"hidden"!==b.state&&r.onHidden(),b.state="hidden",b.endTime=new Date,m(b)}})):void 0}function o(){(r.timeOut>0||r.extendedTimeOut>0)&&(u=setTimeout(i,r.extendedTimeOut),O.maxHideTime=parseFloat(r.extendedTimeOut),O.hideEta=(new Date).getTime()+O.maxHideTime)}function s(){clearTimeout(u),O.hideEta=0,l.stop(!0,!0)[r.showMethod]({duration:r.showDuration,easing:r.showEasing})}function a(){var e=(O.hideEta-(new Date).getTime())/O.maxHideTime*100;f.width(e+"%")}var r=g(),d=t.iconClass||r.iconClass;if("undefined"!=typeof t.optionsOverride&&(r=e.extend(r,t.optionsOverride),d=t.optionsOverride.iconClass||d),r.preventDuplicates){if(t.message===C)return;C=t.message}T++,v=n(r,!0);var u=null,l=e("
"),c=e("
"),p=e("
"),f=e("
"),w=e(r.closeHtml),O={intervalId:null,hideEta:null,maxHideTime:null},b={toastId:T,state:"visible",startTime:new Date,options:r,map:t};return t.iconClass&&l.addClass(r.toastClass).addClass(d),t.title&&(c.append(t.title).addClass(r.titleClass),l.append(c)),t.message&&(p.append(t.message).addClass(r.messageClass),l.append(p)),r.closeButton&&(w.addClass("toast-close-button").attr("role","button"),l.prepend(w)),r.progressBar&&(f.addClass("toast-progress"),l.prepend(f)),l.hide(),r.newestOnTop?v.prepend(l):v.append(l),l[r.showMethod]({duration:r.showDuration,easing:r.showEasing,complete:r.onShown}),r.timeOut>0&&(u=setTimeout(i,r.timeOut),O.maxHideTime=parseFloat(r.timeOut),O.hideEta=(new Date).getTime()+O.maxHideTime,r.progressBar&&(O.intervalId=setInterval(a,10))),l.hover(s,o),!r.onclick&&r.tapToDismiss&&l.click(i),r.closeButton&&w&&w.click(function(e){e.stopPropagation?e.stopPropagation():void 0!==e.cancelBubble&&e.cancelBubble!==!0&&(e.cancelBubble=!0),i(!0)}),r.onclick&&l.click(function(){r.onclick(),i()}),m(b),r.debug&&console&&console.log(b),l}function g(){return e.extend({},p(),b.options)}function h(e){v||(v=n()),e.is(":visible")||(e.remove(),e=null,0===v.children().length&&(v.remove(),C=void 0))}var v,w,C,T=0,O={error:"error",info:"info",success:"success",warning:"warning"},b={clear:r,remove:d,error:t,getContainer:n,info:i,options:{},subscribe:o,success:s,version:"2.1.0",warning:a};return b}()})}("function"==typeof define&&define.amd?define:function(e,t){"undefined"!=typeof module&&module.exports?module.exports=t(require("jquery")):window.toastr=t(window.jQuery)}); 2 | //# sourceMappingURL=/toastr.js.map -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/plugins/validate/messages_zh.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.13.1 - 10/14/2014 2 | * http://jqueryvalidation.org/ 3 | * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */ 4 | ! function (a) { 5 | "function" == typeof define && define.amd ? define(["jquery", "jquery.validate.min"], a) : a(jQuery) 6 | }(function (a) { 7 | var icon = " "; 8 | a.extend(a.validator.messages, { 9 | required: icon + "必填", 10 | remote: icon + "请修正此栏位", 11 | email: icon + "请输入有效的电子邮件", 12 | url: icon + "请输入有效的网址", 13 | date: icon + "请输入有效的日期", 14 | dateISO: icon + "请输入有效的日期 (YYYY-MM-DD)", 15 | number: icon + "请输入正确的数字", 16 | digits: icon + "只能输入数字", 17 | creditcard: icon + "请输入有效的信用卡号码", 18 | equalTo: icon + "你的输入不相同", 19 | extension: icon + "请输入有效的后缀", 20 | maxlength: a.validator.format(icon + "最多 {0} 个字"), 21 | minlength: a.validator.format(icon + "最少 {0} 个字"), 22 | rangelength: a.validator.format(icon + "请输入长度为 {0} 至 {1} 之间的字串"), 23 | range: a.validator.format(icon + "请输入 {0} 至 {1} 之间的数值"), 24 | max: a.validator.format(icon + "请输入不大于 {0} 的数值"), 25 | min: a.validator.format(icon + "请输入不小于 {0} 的数值") 26 | }) 27 | }); -------------------------------------------------------------------------------- /src/main/webapp/static/lib/bootstrap/js/welcome.js: -------------------------------------------------------------------------------- 1 | //欢迎信息 2 | 3 | layer.config({ 4 | extend: ['extend/layer.ext.js', 'skin/moon/style.css'], 5 | skin: 'layer-ext-moon' 6 | }); 7 | 8 | layer.ready(function () { 9 | 10 | var html = $('#welcome-template').html(); 11 | $('a.viewlog').click(function () { 12 | logs(); 13 | return false; 14 | }); 15 | 16 | $('#pay-qrcode').click(function(){ 17 | var html=$(this).html(); 18 | parent.layer.open({ 19 | title: false, 20 | type: 1, 21 | closeBtn:false, 22 | shadeClose:true, 23 | area: ['600px', 'auto'], 24 | content: html 25 | }); 26 | }); 27 | 28 | function logs() { 29 | parent.layer.open({ 30 | title: '初见倾心,再见动情', 31 | type: 1, 32 | area: ['700px', 'auto'], 33 | content: html, 34 | btn: ['确定', '取消'] 35 | }); 36 | } 37 | 38 | console.log('欢迎使用H+,如果您在使用的过程中有碰到问题,可以参考开发文档,感谢您的支持。'); 39 | 40 | }); -------------------------------------------------------------------------------- /src/main/webapp/static/lib/css/normalize.css: -------------------------------------------------------------------------------- 1 | /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} -------------------------------------------------------------------------------- /src/main/webapp/static/lib/js/base64.min.js: -------------------------------------------------------------------------------- 1 | (function(global){"use strict";var _Base64=global.Base64;var version="2.1.7";var buffer;if(typeof module!=="undefined"&&module.exports){buffer=require("buffer").Buffer}var b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var b64tab=function(bin){var t={};for(var i=0,l=bin.length;i>>6)+fromCharCode(128|cc&63):fromCharCode(224|cc>>>12&15)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}else{var cc=65536+(c.charCodeAt(0)-55296)*1024+(c.charCodeAt(1)-56320);return fromCharCode(240|cc>>>18&7)+fromCharCode(128|cc>>>12&63)+fromCharCode(128|cc>>>6&63)+fromCharCode(128|cc&63)}};var re_utob=/[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;var utob=function(u){return u.replace(re_utob,cb_utob)};var cb_encode=function(ccc){var padlen=[0,2,1][ccc.length%3],ord=ccc.charCodeAt(0)<<16|(ccc.length>1?ccc.charCodeAt(1):0)<<8|(ccc.length>2?ccc.charCodeAt(2):0),chars=[b64chars.charAt(ord>>>18),b64chars.charAt(ord>>>12&63),padlen>=2?"=":b64chars.charAt(ord>>>6&63),padlen>=1?"=":b64chars.charAt(ord&63)];return chars.join("")};var btoa=global.btoa?function(b){return global.btoa(b)}:function(b){return b.replace(/[\s\S]{1,3}/g,cb_encode)};var _encode=buffer?function(u){return(u.constructor===buffer.constructor?u:new buffer(u)).toString("base64")}:function(u){return btoa(utob(u))};var encode=function(u,urisafe){return!urisafe?_encode(String(u)):_encode(String(u)).replace(/[+\/]/g,function(m0){return m0=="+"?"-":"_"}).replace(/=/g,"")};var encodeURI=function(u){return encode(u,true)};var re_btou=new RegExp(["[À-ß][€-¿]","[à-ï][€-¿]{2}","[ð-÷][€-¿]{3}"].join("|"),"g");var cb_btou=function(cccc){switch(cccc.length){case 4:var cp=(7&cccc.charCodeAt(0))<<18|(63&cccc.charCodeAt(1))<<12|(63&cccc.charCodeAt(2))<<6|63&cccc.charCodeAt(3),offset=cp-65536;return fromCharCode((offset>>>10)+55296)+fromCharCode((offset&1023)+56320);case 3:return fromCharCode((15&cccc.charCodeAt(0))<<12|(63&cccc.charCodeAt(1))<<6|63&cccc.charCodeAt(2));default:return fromCharCode((31&cccc.charCodeAt(0))<<6|63&cccc.charCodeAt(1))}};var btou=function(b){return b.replace(re_btou,cb_btou)};var cb_decode=function(cccc){var len=cccc.length,padlen=len%4,n=(len>0?b64tab[cccc.charAt(0)]<<18:0)|(len>1?b64tab[cccc.charAt(1)]<<12:0)|(len>2?b64tab[cccc.charAt(2)]<<6:0)|(len>3?b64tab[cccc.charAt(3)]:0),chars=[fromCharCode(n>>>16),fromCharCode(n>>>8&255),fromCharCode(n&255)];chars.length-=[0,0,2,1][padlen];return chars.join("")};var atob=global.atob?function(a){return global.atob(a)}:function(a){return a.replace(/[\s\S]{1,4}/g,cb_decode)};var _decode=buffer?function(a){return(a.constructor===buffer.constructor?a:new buffer(a,"base64")).toString()}:function(a){return btou(atob(a))};var decode=function(a){return _decode(String(a).replace(/[-_]/g,function(m0){return m0=="-"?"+":"/"}).replace(/[^A-Za-z0-9\+\/]/g,""))};var noConflict=function(){var Base64=global.Base64;global.Base64=_Base64;return Base64};global.Base64={VERSION:version,atob:atob,btoa:btoa,fromBase64:decode,toBase64:encode,utob:utob,encode:encode,encodeURI:encodeURI,btou:btou,decode:decode,noConflict:noConflict};if(typeof Object.defineProperty==="function"){var noEnum=function(v){return{value:v,enumerable:false,writable:true,configurable:true}};global.Base64.extendString=function(){Object.defineProperty(String.prototype,"fromBase64",noEnum(function(){return decode(this)}));Object.defineProperty(String.prototype,"toBase64",noEnum(function(urisafe){return encode(this,urisafe)}));Object.defineProperty(String.prototype,"toBase64URI",noEnum(function(){return encode(this,true)}))}}})(this);if(this["Meteor"]){Base64=global.Base64} -------------------------------------------------------------------------------- /src/main/webapp/static/lib/js/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.4.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2006, 2014 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | (function (factory) { 9 | if (typeof define === 'function' && define.amd) { 10 | // AMD (Register as an anonymous module) 11 | define(['jquery'], factory); 12 | } else if (typeof exports === 'object') { 13 | // Node/CommonJS 14 | module.exports = factory(require('jquery')); 15 | } else { 16 | // Browser globals 17 | factory(jQuery); 18 | } 19 | }(function ($) { 20 | 21 | var pluses = /\+/g; 22 | 23 | function encode(s) { 24 | return config.raw ? s : encodeURIComponent(s); 25 | } 26 | 27 | function decode(s) { 28 | return config.raw ? s : decodeURIComponent(s); 29 | } 30 | 31 | function stringifyCookieValue(value) { 32 | return encode(config.json ? JSON.stringify(value) : String(value)); 33 | } 34 | 35 | function parseCookieValue(s) { 36 | if (s.indexOf('"') === 0) { 37 | // This is a quoted cookie as according to RFC2068, unescape... 38 | s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); 39 | } 40 | 41 | try { 42 | // Replace server-side written pluses with spaces. 43 | // If we can't decode the cookie, ignore it, it's unusable. 44 | // If we can't parse the cookie, ignore it, it's unusable. 45 | s = decodeURIComponent(s.replace(pluses, ' ')); 46 | return config.json ? JSON.parse(s) : s; 47 | } catch(e) {} 48 | } 49 | 50 | function read(s, converter) { 51 | var value = config.raw ? s : parseCookieValue(s); 52 | return $.isFunction(converter) ? converter(value) : value; 53 | } 54 | 55 | var config = $.cookie = function (key, value, options) { 56 | 57 | // Write 58 | 59 | if (arguments.length > 1 && !$.isFunction(value)) { 60 | options = $.extend({}, config.defaults, options); 61 | 62 | if (typeof options.expires === 'number') { 63 | var days = options.expires, t = options.expires = new Date(); 64 | t.setMilliseconds(t.getMilliseconds() + days * 864e+5); 65 | } 66 | 67 | return (document.cookie = [ 68 | encode(key), '=', stringifyCookieValue(value), 69 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 70 | options.path ? '; path=' + options.path : '', 71 | options.domain ? '; domain=' + options.domain : '', 72 | options.secure ? '; secure' : '' 73 | ].join('')); 74 | } 75 | 76 | // Read 77 | 78 | var result = key ? undefined : {}, 79 | // To prevent the for loop in the first place assign an empty array 80 | // in case there are no cookies at all. Also prevents odd result when 81 | // calling $.cookie(). 82 | cookies = document.cookie ? document.cookie.split('; ') : [], 83 | i = 0, 84 | l = cookies.length; 85 | 86 | for (; i < l; i++) { 87 | var parts = cookies[i].split('='), 88 | name = decode(parts.shift()), 89 | cookie = parts.join('='); 90 | 91 | if (key === name) { 92 | // If second argument (value) is a function it's a converter... 93 | result = read(cookie, value); 94 | break; 95 | } 96 | 97 | // Prevent storing a cookie that we couldn't decode. 98 | if (!key && (cookie = read(cookie)) !== undefined) { 99 | result[name] = cookie; 100 | } 101 | } 102 | 103 | return result; 104 | }; 105 | 106 | config.defaults = {}; 107 | 108 | $.removeCookie = function (key, options) { 109 | // Must not alter options, thus extending a fresh object... 110 | $.cookie(key, '', $.extend({}, options, { expires: -1 })); 111 | return !$.cookie(key); 112 | }; 113 | 114 | })); -------------------------------------------------------------------------------- /src/main/webapp/static/src/css/compoent.css: -------------------------------------------------------------------------------- 1 | /*修复菜单图标宽度*/ 2 | .x-second-level-icon { 3 | width: 16px; 4 | } -------------------------------------------------------------------------------- /src/main/webapp/static/src/css/login.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/src/css/login.css -------------------------------------------------------------------------------- /src/main/webapp/static/src/img/avatar/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/src/img/avatar/avatar.png -------------------------------------------------------------------------------- /src/main/webapp/static/src/img/icon/i/icon-statistics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/src/img/icon/i/icon-statistics.png -------------------------------------------------------------------------------- /src/main/webapp/static/src/img/logo/iweb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiuxuanzhi/iweb-java/18e7f3e9e99f7d7b244627fc79b311f4a7b66851/src/main/webapp/static/src/img/logo/iweb.png -------------------------------------------------------------------------------- /src/main/webapp/static/src/js/componet.js: -------------------------------------------------------------------------------- 1 | window.SYS = { 2 | loadMenu: function(){ //动态加载菜单 3 | App.get(Route.sys.menu, null, function(result){ 4 | if(Const.SUCCESS == result.resultState){ 5 | var data = result.data; 6 | var $sideMenu = $('#side-menu'); 7 | var dataIndex = -1; 8 | if(data.length > 0){ 9 | for(var i = 0; i < data.length; i++){ 10 | var menu = data[i]; 11 | var menuHTML = '
  • '; 12 | 13 | menuHTML += '\ 14 | \ 15 | \ 16 | '+menu.name+''; 17 | var children = menu.children; 18 | if(children && children.length > 0){ 19 | menuHTML += ''; 20 | menuHTML += ''; 28 | } else { 29 | menuHTML += ''; 30 | } 31 | 32 | menuHTML += '
  • '; 33 | $sideMenu.append(menuHTML); 34 | } 35 | // 激活菜单行为 36 | $sideMenu.metisMenu(); 37 | // 动态加载一次以激活点击菜单后其内容被加载到contab中 38 | jQuery.getScript("/static/lib/bootstrap/js/contabs.min.js") 39 | .done(function() { 40 | 41 | }) 42 | .fail(function() { 43 | KitBox.alert(ErrMsg.failRenderMenu); 44 | }); 45 | } 46 | } else { 47 | KitBox.alert(ErrMsg.failMenu); 48 | } 49 | }) 50 | } 51 | 52 | }; -------------------------------------------------------------------------------- /src/main/webapp/static/src/js/main.js: -------------------------------------------------------------------------------- 1 | $(function($){ 2 | // 加载菜单 3 | SYS.loadMenu(); 4 | 5 | // tab栏退出 6 | $('.x-logout').on('click', function(){ 7 | layer.confirm('确定要退出?', {icon: 3, title:'提示'}, function(index){ 8 | window.location.href = 'logout'; 9 | layer.close(index); 10 | }); 11 | }); 12 | }); --------------------------------------------------------------------------------