├── .gitignore ├── LICENSE ├── README.md ├── base.sql ├── pom.xml └── src └── main ├── java └── com │ └── wubaoguo │ └── springboot │ ├── Application.java │ ├── Swagger2.java │ ├── conf │ ├── DruidDataSourceConfig.java │ ├── FreeMarkerConfig.java │ ├── JwtConfig.java │ ├── RedisConfig.java │ ├── ShiroConfig.java │ └── WebConfig.java │ ├── constant │ ├── JwtConstants.java │ └── ShiroConstants.java │ ├── core │ ├── annotation │ │ └── Token.java │ ├── bean │ │ ├── AuthBean.java │ │ ├── CurrentRole.java │ │ └── CurrentUser.java │ ├── exception │ │ ├── BusinessException.java │ │ └── LoginSecurityException.java │ ├── filter │ │ ├── CORSFilter.java │ │ └── ThreadContentFilter.java │ ├── request │ │ ├── BaseState.java │ │ ├── StateMap.java │ │ └── ViewResult.java │ └── response │ │ └── Parameter.java │ ├── dao │ ├── SysAdminMapper.java │ └── jdbc │ │ ├── BaseCommond.java │ │ ├── Pager.java │ │ ├── SqlParameter.java │ │ ├── bean │ │ └── BaseBean.java │ │ └── dao │ │ ├── BaseDao.java │ │ ├── QuerySupport.java │ │ └── SpringContextHolder.java │ ├── entity │ ├── EntityGeneratorUtil.java │ ├── SysAdmin.java │ ├── SysAdminRole.java │ ├── SysConfig.java │ ├── SysDictionary.java │ ├── SysResources.java │ ├── SysRole.java │ └── SysRoleResources.java │ ├── filter │ ├── AjaxFormAuthenticationFilter.java │ ├── CORSFilter.java │ ├── PermissionFilter.java │ └── SubThreadContent.java │ ├── jwt │ ├── JwtAuthentication.java │ ├── JwtAuthorizingRealm.java │ ├── JwtSubject.java │ └── filter │ │ └── JwtAuthorizeFilter.java │ ├── manage │ ├── controller │ │ ├── ErrorPageController.java │ │ ├── ManageController.java │ │ ├── ResourceController.java │ │ ├── SysConfigController.java │ │ ├── SysDictionaryController.java │ │ └── commond │ │ │ ├── CondCacheCommond │ │ │ ├── CondCacheCommond.java │ │ │ └── QueryCommondSession.java │ │ │ └── ResourceCommond.java │ ├── domain │ │ └── SearchResults.java │ └── service │ │ ├── AuthenticationService.java │ │ ├── ManageService.java │ │ ├── ResourceService.java │ │ ├── SysConfigService.java │ │ └── SysDictionaryService.java │ ├── model │ └── SysAdmin.java │ ├── rest │ ├── controller │ │ ├── MyBatisTestController.java │ │ └── RedisTestController.java │ └── service │ │ ├── JwtAuthService.java │ │ ├── MyBatisTestService.java │ │ ├── RedisTestService.java │ │ └── impl │ │ └── JwtBaseAuthServiceImpl.java │ ├── shiro │ └── MyShiroRealm.java │ └── util │ ├── BeanUtil.java │ ├── DateUtil.java │ ├── JWTUtil.java │ ├── RedisUtil.java │ └── WebUtil.java ├── resources ├── application.properties ├── base_db.sql ├── generatorConfig.xml ├── logback-spring.xml ├── mapper │ └── SysAdminMapper.xml └── template │ └── bean.ftl └── webapp ├── WEB-INF ├── ftl │ └── manage │ │ ├── blackboard.html │ │ ├── common │ │ ├── _right.html │ │ ├── _tab.html │ │ └── _theme.html │ │ ├── dictionary │ │ ├── form.html │ │ ├── main.html │ │ └── table.html │ │ ├── home.html │ │ ├── lockscreen.html │ │ ├── login.html │ │ ├── menu.html │ │ ├── resource │ │ ├── adminform.html │ │ ├── adminmain.html │ │ ├── admintable.html │ │ ├── menuform.html │ │ ├── menumain.html │ │ ├── menutable.html │ │ ├── roleform.html │ │ ├── rolemain.html │ │ └── roletable.html │ │ ├── updatepwdMain.html │ │ └── util │ │ ├── dash.html │ │ ├── footable.html │ │ ├── historyForm.html │ │ ├── paged.html │ │ ├── search.html │ │ ├── searchType.html │ │ ├── searchType2.html │ │ └── sidebar.html └── web.xml └── static └── skin ├── css ├── animate.min.css ├── bootstrap.min.css ├── bootstrap.min14ed.css ├── demo │ └── webuploader-demo.min.css ├── font-awesome.min93e3.css ├── login.min.css ├── patterns │ ├── header-profile-skin-1.png │ ├── header-profile-skin-3.png │ ├── header-profile.png │ └── shattered.png ├── plugins │ ├── awesome-bootstrap-checkbox │ │ └── awesome-bootstrap-checkbox.css │ ├── blueimp │ │ ├── css │ │ │ └── blueimp-gallery.min.css │ │ └── img │ │ │ ├── error.png │ │ │ ├── error.svg │ │ │ ├── loading.gif │ │ │ ├── play-pause.png │ │ │ ├── play-pause.svg │ │ │ ├── video-play.png │ │ │ └── video-play.svg │ ├── bootstrap-table │ │ └── bootstrap-table.min.css │ ├── chosen │ │ ├── chosen-sprite.png │ │ ├── chosen-sprite@2x.png │ │ └── chosen.css │ ├── clockpicker │ │ └── clockpicker.css │ ├── codemirror │ │ ├── ambiance.css │ │ └── codemirror.css │ ├── colorpicker │ │ ├── css │ │ │ └── bootstrap-colorpicker.min.css │ │ └── img │ │ │ └── bootstrap-colorpicker │ │ │ ├── alpha-horizontal.png │ │ │ ├── alpha.png │ │ │ ├── hue-horizontal.png │ │ │ ├── hue.png │ │ │ └── saturation.png │ ├── cropper │ │ └── cropper.min.css │ ├── dataTables │ │ └── dataTables.bootstrap.css │ ├── datapicker │ │ └── datepicker3.css │ ├── dropzone │ │ ├── basic.css │ │ └── dropzone.css │ ├── footable │ │ ├── fonts │ │ │ ├── footable.eot │ │ │ ├── footable.svg │ │ │ ├── footable.ttf │ │ │ ├── footable.woff │ │ │ └── footabled41d.eot │ │ └── footable.core.css │ ├── fullcalendar │ │ ├── fullcalendar.css │ │ └── fullcalendar.print.css │ ├── iCheck │ │ ├── custom.css │ │ ├── green.png │ │ └── green@2x.png │ ├── images │ │ ├── sort_asc.png │ │ ├── sort_desc.png │ │ ├── sprite-skin-flat.png │ │ ├── spritemap.png │ │ └── spritemap@2x.png │ ├── ionRangeSlider │ │ ├── ion.rangeSlider.css │ │ └── ion.rangeSlider.skinFlat.css │ ├── jasny │ │ └── jasny-bootstrap.min.css │ ├── jqgrid │ │ └── ui.jqgridffe4.css │ ├── jsTree │ │ └── style.min.css │ ├── ladda │ │ ├── ladda-themeless.min.css │ │ └── ladda.min.css │ ├── markdown │ │ └── bootstrap-markdown.min.css │ ├── morris │ │ └── morris-0.4.3.min.css │ ├── nouslider │ │ └── jquery.nouislider.css │ ├── plyr │ │ ├── plyr.css │ │ └── sprite.svg │ ├── 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 │ ├── validate │ │ ├── formValidation.css │ │ └── formValidation.min.css │ ├── webuploader │ │ └── webuploader.css │ └── zTree_v3 │ │ ├── img │ │ ├── diy │ │ │ ├── 1_close.png │ │ │ ├── 1_open.png │ │ │ ├── 2.png │ │ │ ├── 3.png │ │ │ ├── 4.png │ │ │ ├── 5.png │ │ │ ├── 6.png │ │ │ ├── 7.png │ │ │ ├── 8.png │ │ │ └── 9.png │ │ ├── line_conn.gif │ │ ├── loading.gif │ │ ├── zTreeStandard.gif │ │ └── zTreeStandard.png │ │ └── zTreeStyle.css ├── style.min.css └── style.min862f.css ├── fonts ├── fontawesome-webfont93e3.eot ├── fontawesome-webfont93e3.svg ├── fontawesome-webfont93e3.ttf ├── fontawesome-webfont93e3.woff ├── fontawesome-webfont93e3.woff2 ├── fontawesome-webfontd41d.eot ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff ├── glyphicons-halflings-regular.woff2 └── glyphicons-halflings-regulard41d.eot ├── img ├── RegexBuddy 3.lnk ├── WinSCP.lnk ├── a1.jpg ├── a2.jpg ├── a3.jpg ├── a4.jpg ├── a5.jpg ├── a6.jpg ├── a7.jpg ├── a8.jpg ├── a9.jpg ├── bg.png ├── default-portrait.png ├── favicon.ico ├── iconfont-logo.png ├── icons.png ├── index.jpg ├── index_4.jpg ├── loading-upload.gif ├── locked.png ├── login-background.jpg ├── p1.jpg ├── p2.jpg ├── p3.jpg ├── p_big1.jpg ├── p_big2.jpg ├── p_big3.jpg ├── pay.png ├── profile.jpg ├── profile_big.jpg ├── profile_small.jpg ├── progress.png ├── qr_code.png ├── success.png ├── user.png └── wenku_logo.png └── js ├── bootstrap.min.js ├── contabs.min.js ├── content.min.js ├── demo ├── bootstrap-table-demo.min.js ├── echarts-demo.min.js ├── flot-demo.min.js ├── form-advanced-demo.min.js ├── form-validate-demo.min.js ├── layer-demo.min.js ├── morris-demo.min.js ├── peity-demo.min.js ├── rickshaw-demo.min.js ├── sparkline-demo.min.js ├── treeview-demo.min.js └── webuploader-demo.min.js ├── hplus.min.js ├── jquery-ui-1.10.4.min.js ├── jquery-ui.custom.min.js ├── jquery.min.js ├── page.js ├── plugins ├── beautifyhtml │ └── beautifyhtml.js ├── blueimp │ └── jquery.blueimp-gallery.min.js ├── bootstrap-table │ ├── bootstrap-table-mobile.min.js │ ├── bootstrap-table.min.js │ └── locale │ │ └── bootstrap-table-zh-CN.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 │ ├── blank.gif │ ├── fancybox_loading.gif │ ├── fancybox_loading@2x.gif │ ├── fancybox_overlay.png │ ├── fancybox_sprite.png │ ├── fancybox_sprite@2x.png │ ├── 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 │ ├── images │ │ ├── gritter-light.png │ │ ├── gritter.png │ │ └── ie-spacer.gif │ ├── jquery.gritter.css │ └── jquery.gritter.min.js ├── iCheck │ └── icheck.min.js ├── ionRangeSlider │ └── ion.rangeSlider.min.js ├── jasny │ └── jasny-bootstrap.min.js ├── jeditable │ └── jquery.jeditable.js ├── jqgrid │ ├── i18n │ │ └── grid.locale-cnffe4.js │ └── jquery.jqGrid.minffe4.js ├── 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 ├── ladda │ ├── ladda.jquery.min.js │ ├── ladda.min.js │ └── spin.min.js ├── layer │ ├── extend │ │ └── layer.ext.js │ ├── laydate-v1.1.zip │ ├── laydate-v1.1 │ │ ├── demo.html │ │ ├── layDate官网.url │ │ ├── laydate │ │ │ ├── laydate.js │ │ │ ├── need │ │ │ │ └── laydate.css │ │ │ └── skins │ │ │ │ ├── dahong │ │ │ │ ├── icon.png │ │ │ │ └── laydate.css │ │ │ │ ├── default │ │ │ │ ├── icon.png │ │ │ │ └── laydate.css │ │ │ │ └── molv │ │ │ │ ├── icon.png │ │ │ │ └── laydate.css │ │ └── 更新日志.txt │ ├── laydate │ │ ├── laydate.js │ │ ├── need │ │ │ └── laydate.css │ │ └── skins │ │ │ ├── dahong │ │ │ ├── icon.png │ │ │ └── laydate.css │ │ │ ├── default │ │ │ ├── icon.png │ │ │ └── laydate.css │ │ │ └── molv │ │ │ ├── icon.png │ │ │ └── laydate.css │ ├── layer.min.js │ ├── layim │ │ ├── layim.css │ │ ├── layim.js │ │ └── loading.gif │ └── skin │ │ ├── layer.css │ │ ├── layer.ext.css │ │ └── moon │ │ └── 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 ├── plyr │ └── plyr.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 │ ├── formValidation.js │ ├── formValidation.min.js │ ├── framework │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── foundation.js │ │ ├── foundation.min.js │ │ ├── pure.js │ │ ├── pure.min.js │ │ ├── semantic.js │ │ ├── semantic.min.js │ │ ├── uikit.js │ │ └── uikit.min.js │ ├── jquery.validate.min.js │ └── language │ │ ├── ar_MA.js │ │ ├── be_FR.js │ │ ├── be_NL.js │ │ ├── bg_BG.js │ │ ├── ca_ES.js │ │ ├── cs_CZ.js │ │ ├── da_DK.js │ │ ├── de_DE.js │ │ ├── en_US.js │ │ ├── es_CL.js │ │ ├── es_ES.js │ │ ├── eu_ES.js │ │ ├── fa_IR.js │ │ ├── fi_FI.js │ │ ├── fr_FR.js │ │ ├── gr_EL.js │ │ ├── he_IL.js │ │ ├── hi_IN.js │ │ ├── hu_HU.js │ │ ├── id_ID.js │ │ ├── it_IT.js │ │ ├── ja_JP.js │ │ ├── nl_NL.js │ │ ├── no_NO.js │ │ ├── pl_PL.js │ │ ├── pt_BR.js │ │ ├── pt_PT.js │ │ ├── ro_RO.js │ │ ├── ru_RU.js │ │ ├── sk_SK.js │ │ ├── sq_AL.js │ │ ├── sr_RS.js │ │ ├── sv_SE.js │ │ ├── th_TH.js │ │ ├── tr_TR.js │ │ ├── ua_UA.js │ │ ├── vi_VN.js │ │ ├── zh_CN.js │ │ └── zh_TW.js ├── webuploader │ ├── index.html │ └── webuploader.min.js └── zTree_v3 │ └── jquery.ztree.all-3.5.min.js ├── util.js └── welcome.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | .settings/ 2 | *.iml 3 | /target/ 4 | .project 5 | .classpath 6 | .idea/ 7 | rebel.xml 8 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jsboot-admin java Spring Boot 项目脚手架 2 | 3 | ## 介绍 4 | 5 | jsboot-admin一个更简洁、更灵活的Spring Boot项目脚手架,致力于帮助开发者快速的搭建项目,让大家更专注于业务实现而非框架问题。 6 | 7 | ## 注意事项 8 | 9 | 1. 项目中使用的一个基础类库[base-classlib](https://github.com/wustrive2008/base-classlib) 10 | 2. 项目中使用到Lombok,请先安装对应ide插件 11 | 12 | ## 特点 13 | 14 | 集成框架(特色功能): 15 | - 基于最新的Spring Boot 2 16 | - mysql 17 | - druid 数据库连接池 18 | - 附带基础数据结构sql 19 | - swagger2 api文档 20 | - redis 21 | - aop实现redis分布式锁 22 | - freemarker 23 | - shiro + redis 24 | - jwt 25 | - mybatis/jdbcTemplate可选 26 | - 定时任务 27 | - 内置用户-角色-权限控制 28 | - 多角色免重登切换 29 | - 模块标签页切换免刷新 30 | - AOP实现多数据源动态切换(分支:multi-datasource) 31 | 32 | ## 运行截图 33 | 34 | ![登录页面](https://wubaoguo.oss-cn-qingdao.aliyuncs.com/github/0.png) 35 | ![主页](https://wubaoguo.oss-cn-qingdao.aliyuncs.com/github/1.png) 36 | ![列表](https://wubaoguo.oss-cn-qingdao.aliyuncs.com/github/2.png) 37 | ![添加](https://wubaoguo.oss-cn-qingdao.aliyuncs.com/github/3.png) 38 | 39 | ## 说明 40 | 41 | 如有任何问题欢迎在issues中讨论 42 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/Application.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cache.annotation.EnableCaching; 6 | 7 | @SpringBootApplication 8 | @EnableCaching 9 | public class Application { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(Application.class, args); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/Swagger2.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | import springfox.documentation.builders.ApiInfoBuilder; 7 | import springfox.documentation.builders.PathSelectors; 8 | import springfox.documentation.builders.RequestHandlerSelectors; 9 | import springfox.documentation.service.ApiInfo; 10 | import springfox.documentation.service.Contact; 11 | import springfox.documentation.spi.DocumentationType; 12 | import springfox.documentation.spring.web.plugins.Docket; 13 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 14 | 15 | /** 16 | * 17 | * Description: 接口文档 18 | * 19 | * @author: wubaoguo 20 | * @email: wustrive2008@gmail.com 21 | * @date: 2018/7/23 10:52 22 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 23 | */ 24 | @Configuration 25 | @EnableSwagger2 26 | public class Swagger2 { 27 | 28 | @Bean 29 | public Docket createRestApi() { 30 | return new Docket(DocumentationType.SWAGGER_2) 31 | .apiInfo(apiInfo()) 32 | .select() 33 | .apis(RequestHandlerSelectors.basePackage("com.wubaoguo.springboot.rest.controller")) 34 | .paths(PathSelectors.any()) 35 | .build(); 36 | } 37 | 38 | private ApiInfo apiInfo() { 39 | return new ApiInfoBuilder() 40 | .title("jsboot-admin构建RESTful APIs") 41 | .description("详细内容关注:https://github.com/wustrive2008") 42 | .termsOfServiceUrl("https://github.com/wustrive2008") 43 | .contact(new Contact("wubaoguo","https://github.com/wustrive2008/jsboot-admin","wustrive_2008@126.com")) 44 | .version("1.0") 45 | .build(); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/conf/DruidDataSourceConfig.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.conf; 2 | 3 | import com.alibaba.druid.pool.DruidDataSource; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | import javax.sql.DataSource; 9 | 10 | 11 | /** 12 | * Description: druid连接池配置 13 | * 14 | * @author: wubaoguo 15 | * @email: wustrive2008@gmail.com 16 | * @date: 2018/7/18 21:04 17 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 18 | */ 19 | @Configuration 20 | public class DruidDataSourceConfig { 21 | 22 | @Bean 23 | @ConfigurationProperties(prefix = "spring.datasource") 24 | public DataSource druid() { 25 | return new DruidDataSource(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/conf/FreeMarkerConfig.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.conf; 2 | 3 | import freemarker.ext.beans.BeansWrapper; 4 | import freemarker.template.DefaultObjectWrapperBuilder; 5 | import freemarker.template.TemplateException; 6 | import freemarker.template.TemplateHashModel; 7 | import freemarker.template.Version; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.context.annotation.Configuration; 10 | 11 | import javax.annotation.PostConstruct; 12 | import java.io.IOException; 13 | 14 | /** 15 | * @ClassName: FreeMarkerConfig 16 | * @Description: freemarker配置 17 | * @author wustrive 18 | * @date 2017年3月9日 下午9:19:06 19 | * 20 | */ 21 | @Configuration 22 | public class FreeMarkerConfig { 23 | @Autowired 24 | protected freemarker.template.Configuration configuration; 25 | 26 | //ftl渲染视图 27 | @Autowired 28 | protected org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver resolver; 29 | 30 | //jsp渲染视图 31 | //@Autowired 32 | //protected org.springframework.web.servlet.view.InternalResourceViewResolver springResolver; 33 | 34 | public static Version version = new Version("2.3.21"); //FreeMarker版本号 35 | 36 | 37 | @PostConstruct 38 | public void setSharedVariable() throws TemplateException, IOException { 39 | configuration = getConfiguration(); 40 | configuration.setDateFormat("yyyy/MM/dd"); 41 | configuration.setDateTimeFormat("yyyy-MM-dd HH:mm:ss"); 42 | 43 | BeansWrapper wrapper = new DefaultObjectWrapperBuilder(version).build(); 44 | TemplateHashModel staticModels = wrapper.getStaticModels(); 45 | configuration.setSharedVariable("StringUtil",staticModels.get("org.apache.commons.lang.StringUtils")); 46 | configuration.setSharedVariable("DateUtil",staticModels.get("com.wubaoguo.springboot.util.DateUtil")); 47 | configuration.setSharedVariable("ConvertUtil",staticModels.get("cn.hutool.core.convert.Convert")); 48 | 49 | configuration.setSharedVariable("Constants",staticModels.get("com.wubaoguo.springboot.constant.ShiroConstants")); 50 | 51 | configuration.setSetting("template_update_delay", "1"); 52 | configuration.setSetting("default_encoding", "UTF-8"); 53 | 54 | //解析jsp文件 55 | /* 56 | springResolver.setPrefix("/WEB-INF/view/"); 57 | springResolver.setSuffix(".jsp"); 58 | springResolver.setOrder(1); 59 | */ 60 | 61 | //解析后缀为html的 62 | resolver.setSuffix(".html"); 63 | resolver.setCache(false); 64 | resolver.setRequestContextAttribute("request"); 65 | resolver.setOrder(0); 66 | } 67 | 68 | public freemarker.template.Configuration getConfiguration(){ 69 | //禁止本地化寻找 70 | configuration.setLocalizedLookup(false); 71 | configuration.setDefaultEncoding("utf-8"); 72 | configuration.setClassicCompatible(true); 73 | //使用[#]替代<#ftl> 74 | configuration.setTagSyntax(freemarker.template.Configuration.SQUARE_BRACKET_TAG_SYNTAX); 75 | 76 | return configuration; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/conf/JwtConfig.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.conf; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.springframework.boot.web.servlet.FilterRegistrationBean; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | 10 | import com.wubaoguo.springboot.jwt.filter.JwtAuthorizeFilter; 11 | 12 | /** 13 | * Description: jwt配置 14 | * 15 | * @author: wubaoguo 16 | * @email: wustrive2008@gmail.com 17 | * @date: 2018/7/23 11:09 18 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 19 | */ 20 | @Configuration 21 | public class JwtConfig { 22 | 23 | /** 24 | * rest 登录URI 25 | */ 26 | public static final String LOGIN_URL = "/rest/login"; 27 | 28 | /** 29 | * rest 可不登录URI 30 | */ 31 | public static final String[] OPEN_URL = new String[]{"/rest/open"}; 32 | 33 | @Bean 34 | public FilterRegistrationBean basicFilterRegistrationBean() { 35 | FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 36 | JwtAuthorizeFilter filter = new JwtAuthorizeFilter(); 37 | registrationBean.setFilter(filter); 38 | 39 | List urlPatterns = new ArrayList<>(); 40 | urlPatterns.add("/rest/*"); 41 | 42 | registrationBean.setUrlPatterns(urlPatterns); 43 | return registrationBean; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/conf/WebConfig.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.conf; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.wubaoguo.springboot.filter.CORSFilter; 7 | import org.springframework.boot.web.servlet.FilterRegistrationBean; 8 | import org.springframework.context.annotation.Bean; 9 | import org.springframework.context.annotation.Configuration; 10 | import org.springframework.core.Ordered; 11 | import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 12 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 13 | 14 | import com.wubaoguo.springboot.filter.SubThreadContent; 15 | 16 | /** 17 | * Description: 过滤器配置 18 | * 19 | * @author: wubaoguo 20 | * @email: wustrive2008@gmail.com 21 | * @date: 2018/7/23 11:10 22 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 23 | */ 24 | @Configuration 25 | public class WebConfig implements WebMvcConfigurer { 26 | 27 | @Bean 28 | public FilterRegistrationBean getDemoFilter() { 29 | SubThreadContent threadContent = new SubThreadContent(); 30 | FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 31 | registrationBean.setFilter(threadContent); 32 | List urlPatterns = new ArrayList(); 33 | urlPatterns.add("/*");//拦截路径,可以添加多个 34 | registrationBean.setUrlPatterns(urlPatterns); 35 | registrationBean.setOrder(1); 36 | return registrationBean; 37 | } 38 | 39 | /** 40 | * 前端跨域处理过滤器 41 | * 42 | * @return 43 | */ 44 | @Bean 45 | public FilterRegistrationBean getCorsRegistration() { 46 | FilterRegistrationBean registration = new FilterRegistrationBean(); 47 | registration.setFilter(new CORSFilter()); 48 | registration.addUrlPatterns("/*"); 49 | registration.setOrder(2); 50 | return registration; 51 | } 52 | 53 | /** 54 | * 默认首页 55 | * 56 | * @param registry 57 | */ 58 | @Override 59 | public void addViewControllers(ViewControllerRegistry registry) { 60 | registry.addViewController("/").setViewName("forward:/manage/login.html"); 61 | registry.setOrder(Ordered.HIGHEST_PRECEDENCE); 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/constant/JwtConstants.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.constant; 2 | 3 | /** 4 | * Description: JWT相关常量 5 | * 6 | * @author: wubaoguo 7 | * @email: wustrive2008@gmail.com 8 | * @date: 2018/7/23 11:10 9 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 10 | */ 11 | public class JwtConstants { 12 | public static final String THREAD_CURRENT_USER = "currentUser"; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/constant/ShiroConstants.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.constant; 2 | 3 | 4 | import com.wubaoguo.springboot.core.bean.CurrentRole; 5 | import com.wubaoguo.springboot.core.bean.CurrentUser; 6 | import org.apache.shiro.SecurityUtils; 7 | import org.apache.shiro.session.Session; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * Description: shiro相关常量 13 | * 14 | * @author: wubaoguo 15 | * @email: wustrive2008@gmail.com 16 | * @date: 2018/7/23 11:11 17 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 18 | */ 19 | public class ShiroConstants { 20 | 21 | public static final String SESSION_CURRENT_RESOURCE = "current_esource"; 22 | 23 | public static final Integer IS_ACTIVITY_YES = 1; // 正常 24 | 25 | public static final Integer IS_ACTIVITY_NO = 2; // 作废 删除 26 | 27 | public static final String SESSION_CURRENT_USER = "currentUser"; 28 | 29 | public static final String SESSION_CURRENT_ROLES = "currentRoles"; 30 | 31 | public static final String SESSION_CURRENT_ROLE = "current_role"; 32 | 33 | public static final String THREAD_CURRENT_USER = "currentUser"; 34 | 35 | public static final String SESSION_TOKEN = "token"; 36 | 37 | public static final String SESSION_SYS_CONFIG = "sys_config"; 38 | 39 | public static final String SHIRO_UNAUTH_URL = "/manage/login"; 40 | 41 | public static Long currentTimeSecond() { 42 | return System.currentTimeMillis() / 1000; 43 | } 44 | 45 | public static CurrentUser getCurrentUser() { 46 | return (CurrentUser)SecurityUtils.getSubject().getSession().getAttribute(ShiroConstants.SESSION_CURRENT_USER); 47 | } 48 | 49 | @SuppressWarnings("unchecked") 50 | public static List getCurrentRoles() { 51 | return (List)SecurityUtils.getSubject().getSession().getAttribute(ShiroConstants.SESSION_CURRENT_ROLES); 52 | } 53 | 54 | public static Session getSession() { 55 | return SecurityUtils.getSubject().getSession(); 56 | } 57 | 58 | public static String getCurrentRoleCode() { 59 | return (String)getSession().getAttribute(SESSION_CURRENT_ROLE); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/annotation/Token.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 10 | * Description: 11 | * 12 | * @author: wubaoguo 13 | * @email: wustrive2008@gmail.com 14 | * @date: 2018/5/18 10:49 15 | */ 16 | @Target(ElementType.METHOD) 17 | @Retention(RetentionPolicy.RUNTIME) 18 | public @interface Token { 19 | 20 | boolean save() default false; 21 | 22 | boolean remove() default false; 23 | } -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/bean/AuthBean.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 7 | * @Description: 基础认证bean 8 | * @author wubaoguo 9 | * @mail: wustrive2008@gmail.com 10 | * @date: 2017年3月14日 下午2:10:41 11 | * @version: v0.0.1 12 | */ 13 | public class AuthBean implements Serializable{ 14 | 15 | private static final long serialVersionUID = 1L; 16 | private String userId; //用户Id 17 | private String username; //用户名称 18 | private String password; //用户密码 19 | private Boolean isAuth; //是否已认证 20 | 21 | public String getUserId() { 22 | return userId; 23 | } 24 | 25 | public void setUserId(String userId) { 26 | this.userId = userId; 27 | } 28 | 29 | public String getUsername() { 30 | return username; 31 | } 32 | 33 | public void setUsername(String username) { 34 | this.username = username; 35 | } 36 | 37 | public String getPassword() { 38 | return password; 39 | } 40 | 41 | public void setPassword(String password) { 42 | this.password = password; 43 | } 44 | 45 | public Boolean getIsAuth() { 46 | return isAuth; 47 | } 48 | 49 | public void setIsAuth(Boolean isAuth) { 50 | this.isAuth = isAuth; 51 | } 52 | 53 | public T copy(T bean) { 54 | bean.setUsername(getUsername()); 55 | bean.setPassword(getPassword()); 56 | bean.setUserId(getUserId()); 57 | bean.setIsAuth(getIsAuth()); 58 | return bean; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/bean/CurrentRole.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 7 | * @Description: 当前角色 8 | * @author wubaoguo 9 | * @mail: wustrive2008@gmail.com 10 | * @date: 2017年3月27日 下午7:06:04 11 | * @version: v0.0.1 12 | */ 13 | public class CurrentRole implements Serializable{ 14 | private static final long serialVersionUID = -8436272707319248710L; 15 | 16 | private String name; 17 | private String code; 18 | 19 | public String getName() { 20 | return name; 21 | } 22 | 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | 27 | public String getCode() { 28 | return code; 29 | } 30 | 31 | public void setCode(String code) { 32 | this.code = code; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/bean/CurrentUser.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.bean; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * 7 | * @Description: 当前用户 8 | * @author wubaoguo 9 | * @mail: wustrive2008@gmail.com 10 | * @date: 2017年3月27日 下午7:05:57 11 | * @version: v0.0.1 12 | */ 13 | public class CurrentUser extends AuthBean implements Serializable{ 14 | private static final long serialVersionUID = -7919201192414048616L; 15 | 16 | private String id; 17 | private String name; 18 | private String phoneNumber; 19 | private String account; 20 | private Integer adminType; 21 | 22 | public String getId() { 23 | return id; 24 | } 25 | public void setId(String id) { 26 | this.id = id; 27 | } 28 | public String getName() { 29 | return name; 30 | } 31 | public void setName(String name) { 32 | this.name = name; 33 | } 34 | public String getPhoneNumber() { 35 | return phoneNumber; 36 | } 37 | public void setPhoneNumber(String phoneNumber) { 38 | this.phoneNumber = phoneNumber; 39 | } 40 | public String getAccount() { 41 | return account; 42 | } 43 | public void setAccount(String account) { 44 | this.account = account; 45 | } 46 | public Integer getAdminType() { 47 | return adminType; 48 | } 49 | public void setAdminType(Integer adminType) { 50 | this.adminType = adminType; 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/exception/BusinessException.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.exception; 2 | 3 | 4 | import com.wubaoguo.springboot.core.request.StateMap; 5 | 6 | public class BusinessException extends Exception{ 7 | private static final long serialVersionUID = -6825665437797680288L; 8 | 9 | protected int state; 10 | 11 | public BusinessException() { 12 | super(); 13 | this.state = StateMap.S_SERVER_EXCEPTION; 14 | } 15 | 16 | public BusinessException(String message) { 17 | super(message); 18 | this.state = StateMap.S_SERVER_EXCEPTION; 19 | } 20 | 21 | public BusinessException(int state, String message) { 22 | super(message); 23 | this.state = state; 24 | } 25 | 26 | /** 27 | * Getter method for property state. 28 | * 29 | * @return property value of state 30 | */ 31 | public int getState() { 32 | return state; 33 | } 34 | 35 | /** 36 | * @see Throwable#fillInStackTrace() 37 | */ 38 | @Override 39 | public Throwable fillInStackTrace() { 40 | return this; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/exception/LoginSecurityException.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.exception; 2 | 3 | 4 | import com.wubaoguo.springboot.core.request.StateMap; 5 | 6 | public class LoginSecurityException extends BusinessException{ 7 | private static final long serialVersionUID = -8108811801123138587L; 8 | 9 | public LoginSecurityException() { 10 | super(); 11 | this.state = StateMap.S_AUTH_ERROR; 12 | } 13 | 14 | public LoginSecurityException(String message) { 15 | super(message); 16 | this.state = StateMap.S_AUTH_ERROR; 17 | } 18 | 19 | public LoginSecurityException(int state, String message) { 20 | super(state, message); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/filter/CORSFilter.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.filter; 2 | 3 | import javax.servlet.*; 4 | import javax.servlet.http.HttpServletResponse; 5 | import java.io.IOException; 6 | 7 | /** 8 | * @Description: 解决前端分离 ajax请求跨域问题 9 | * @author wubaoguo 10 | * @mail: wustrive2008@gmail.com 11 | * @date: 2017年4月18日 下午9:03:03 12 | * @version: v0.0.1 13 | */ 14 | public class CORSFilter implements Filter { 15 | 16 | @Override 17 | public void init(FilterConfig filterConfig) throws ServletException { 18 | 19 | } 20 | 21 | @Override 22 | public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 23 | throws IOException, ServletException { 24 | HttpServletResponse response = (HttpServletResponse) res; 25 | response.setHeader("Access-Control-Allow-Origin", "*"); 26 | response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 27 | response.setHeader("Access-Control-Max-Age", "3600"); 28 | response.addHeader("Access-Control-Allow-Headers", "accessToken, deviceId, authType, Origin, X-Requested-With, Content-Type, Accept"); 29 | chain.doFilter(req, res); 30 | 31 | } 32 | 33 | @Override 34 | public void destroy() { 35 | 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/request/BaseState.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.request; 2 | 3 | 4 | public class BaseState extends StateMap { 5 | 6 | private boolean success = true; // 成功标识 7 | 8 | private int state; 9 | 10 | private String message; 11 | 12 | public BaseState(boolean success, int state, String message) { 13 | super(); 14 | this.success = success; 15 | this.state = state; 16 | this.message = message; 17 | } 18 | 19 | public BaseState(int state, String message) { 20 | this(false, state, message); 21 | } 22 | 23 | public BaseState(int state) { 24 | this(false, state, get(state)); 25 | } 26 | 27 | public BaseState() { 28 | this.state = S_SUCCESS; 29 | this.message = "操作成功"; 30 | } 31 | /** 32 | * @return the success 33 | */ 34 | public boolean isSuccess() { 35 | return success; 36 | } 37 | 38 | /** 39 | * @param success the success to set 40 | */ 41 | public void setSuccess(boolean success) { 42 | this.success = success; 43 | } 44 | 45 | /** 46 | * @return the state 47 | */ 48 | public int getState() { 49 | return state; 50 | } 51 | 52 | /** 53 | * @param state the state to set 54 | */ 55 | public void setState(int state) { 56 | this.state = state; 57 | } 58 | 59 | /** 60 | * @return the message 61 | */ 62 | public String getMessage() { 63 | return message; 64 | } 65 | 66 | /** 67 | * @param message the message to set 68 | */ 69 | public void setMessage(String message) { 70 | this.message = message; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/core/request/StateMap.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.core.request; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * @Description: HTTP API 错误码定义 8 | * @author wubaoguo 9 | * @mail: wustrive2008@gmail.com 10 | * @date: 2017年3月14日 上午10:13:02 11 | * @version: v0.0.1 12 | */ 13 | public class StateMap { 14 | 15 | private static final Map map; 16 | 17 | /** 调用处理成功 **/ 18 | 19 | // 成功返回标识 20 | public static final int S_SUCCESS = 1; 21 | 22 | 23 | /** 客户端输入错误 **/ 24 | 25 | //参数为空 26 | public static final int S_CLIENT_PARAM_NULL = 10001; 27 | 28 | //参数错误 29 | public static final int S_CLIENT_PARAM_ERROR = 10002; 30 | 31 | //操作警告 32 | public static final int S_CLIENT_WARNING = 10003; 33 | 34 | /** 客户端权限错误 **/ 35 | 36 | //登录认证失败 37 | public static final int S_AUTH_ERROR = 20001; 38 | 39 | //重复登录 40 | public static final int S_AUTH_REPET_LOGIN = 20002; 41 | 42 | //Token过期 43 | public static final int S_AUTH_TIMEOUT = 20003; 44 | 45 | 46 | /** 服务器输出错误 **/ 47 | 48 | //服务端异常 49 | public static final int S_SERVER_EXCEPTION = 30001; 50 | 51 | //请求过快,稍后重试 52 | public static final int S_SERVER_CONCURRENT = 30002; 53 | 54 | 55 | static { 56 | map = new HashMap() { 57 | private static final long serialVersionUID = 2465184251826686088L; 58 | { 59 | put(S_SUCCESS, "操作成功"); 60 | put(S_CLIENT_PARAM_NULL, "参数不能为空"); 61 | put(S_CLIENT_PARAM_ERROR, "参数错误"); 62 | put(S_AUTH_ERROR, "登录失败,请确认账号密码后重试"); 63 | put(S_AUTH_REPET_LOGIN, "重复登录"); 64 | put(S_AUTH_TIMEOUT, "授权过期,请重新登录"); 65 | put(S_SERVER_EXCEPTION, "服务端异常,稍后重试或联系管理员"); 66 | put(S_SERVER_CONCURRENT, "操作过快,稍后重试"); 67 | }}; 68 | } 69 | 70 | public static String get(Integer key) { 71 | return map.get(key); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/dao/SysAdminMapper.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.dao; 2 | 3 | import com.wubaoguo.springboot.model.SysAdmin; 4 | import org.apache.ibatis.annotations.Mapper; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | /** 8 | * Description: mybaits之Mapper-xml方式示例 9 | * 10 | * @author: wubaoguo 11 | * @email: wustrive2008@gmail.com 12 | * @date: 2018/7/23 15:41 13 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 14 | */ 15 | @Mapper 16 | public interface SysAdminMapper { 17 | int deleteByPrimaryKey(String id); 18 | 19 | int insert(SysAdmin record); 20 | 21 | int insertSelective(SysAdmin record); 22 | 23 | SysAdmin selectByPrimaryKey(@Param("id") String id); 24 | 25 | int updateByPrimaryKeySelective(SysAdmin record); 26 | 27 | int updateByPrimaryKey(SysAdmin record); 28 | 29 | } -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/dao/jdbc/Pager.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.dao.jdbc; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Pager implements Serializable{ 6 | 7 | private static final long serialVersionUID = 1L; 8 | 9 | public static final Integer MAX_PAGE_SIZE = 500;// 每页最大记录数限制 10 | 11 | private Integer pageNumber = 1;// 当前页码 12 | private Integer pageSize = 15;// 每页记录数 13 | private Integer totalCount = 0;// 总记录数 14 | private Integer pageCount = 0;// 总页数 15 | 16 | public Pager() { 17 | }; 18 | 19 | public Pager(Integer pageSize, Integer totalCount, Integer pageCount) { 20 | super(); 21 | this.pageSize = pageSize; 22 | this.totalCount = totalCount; 23 | this.pageCount = pageCount; 24 | } 25 | 26 | public Integer getPageNumber() { 27 | return pageNumber; 28 | } 29 | 30 | public void setPageNumber(Integer pageNumber) { 31 | if (pageNumber < 1) { 32 | pageNumber = 1; 33 | } 34 | this.pageNumber = pageNumber; 35 | } 36 | 37 | public Integer getPageSize() { 38 | return pageSize; 39 | } 40 | 41 | public void setPageSize(Integer pageSize) { 42 | if (pageSize < 1) { 43 | pageSize = 1; 44 | } else if (pageSize > MAX_PAGE_SIZE) { 45 | pageSize = MAX_PAGE_SIZE; 46 | } 47 | this.pageSize = pageSize; 48 | } 49 | 50 | public Integer getTotalCount() { 51 | return totalCount; 52 | } 53 | 54 | public void setTotalCount(Integer totalCount) { 55 | this.totalCount = totalCount; 56 | } 57 | 58 | public Integer getPageCount() { 59 | pageCount = totalCount / pageSize; 60 | if (totalCount % pageSize > 0) { 61 | pageCount++; 62 | } 63 | return pageCount; 64 | } 65 | 66 | public void setPageCount(Integer pageCount) { 67 | this.pageCount = pageCount; 68 | } 69 | 70 | /** 71 | * @return the pageStart 72 | */ 73 | public Integer getPageStart() { 74 | if(pageSize > 0) { 75 | return (pageNumber - 1) * pageSize; 76 | } 77 | return -1; 78 | } 79 | 80 | } 81 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/dao/jdbc/SqlParameter.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.dao.jdbc; 2 | 3 | import java.util.Collection; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | import java.util.Set; 7 | 8 | @SuppressWarnings("all") 9 | public class SqlParameter implements Map { 10 | 11 | private Map source; 12 | 13 | 14 | public SqlParameter(){ 15 | this.source = new HashMap(); 16 | } 17 | 18 | public SqlParameter(Object key,Object value){ 19 | this.source = new HashMap(); 20 | this.source.put(key, value); 21 | } 22 | 23 | public Map getSource() { 24 | return source; 25 | } 26 | 27 | public SqlParameter setSource(Map source) { 28 | this.source = source; 29 | return this; 30 | } 31 | 32 | public void clear() { 33 | this.source.clear(); 34 | } 35 | 36 | public boolean containsKey(Object key) { 37 | return this.source.containsKey(key); 38 | } 39 | 40 | public boolean containsValue(Object value) { 41 | return this.source.containsValue(value); 42 | } 43 | 44 | public Set entrySet() { 45 | return this.source.entrySet(); 46 | } 47 | 48 | public Object get(Object key) { 49 | return this.source.get(key); 50 | } 51 | 52 | 53 | public boolean isEmpty() { 54 | return this.source.isEmpty(); 55 | } 56 | 57 | public Set keySet() { 58 | return this.source.keySet(); 59 | } 60 | 61 | public SqlParameter addValue(Object key, Object value) { 62 | this.source.put(key, value); 63 | return this; 64 | } 65 | 66 | public void putAll(Map m) { 67 | this.source.putAll(m); 68 | } 69 | 70 | public SqlParameter remove(Object key) { 71 | this.source.remove(key); 72 | return this; 73 | } 74 | 75 | public int size() { 76 | return this.source.size(); 77 | } 78 | 79 | public Collection values() { 80 | return this.source.values(); 81 | } 82 | 83 | public SqlParameter put(Object key, Object value) { 84 | this.source.put(key, value); 85 | return this; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/dao/jdbc/bean/BaseBean.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.dao.jdbc.bean; 2 | 3 | import com.wubaoguo.springboot.dao.jdbc.dao.BaseDao; 4 | import com.wubaoguo.springboot.dao.jdbc.dao.SpringContextHolder; 5 | import org.springframework.jdbc.core.RowMapper; 6 | 7 | import java.io.Serializable; 8 | import java.util.Map; 9 | 10 | public interface BaseBean extends Serializable{ 11 | 12 | public BaseDao dao = SpringContextHolder.getBean(BaseDao.class); 13 | 14 | public String getId(); 15 | 16 | public T setId(String id); 17 | 18 | public String getTableName(); 19 | 20 | public String getUpdateSql(); 21 | 22 | public String getInsertSql(); 23 | 24 | 25 | public T insert(); 26 | 27 | public T update(); 28 | 29 | public T queryForBean(); 30 | 31 | public Map getBeanValues(); 32 | 33 | 34 | public T getInstanceById(); 35 | 36 | /** 37 | * 通过ID获取该条信息的Map 38 | * @return 39 | */ 40 | public Map getBeanMapById(); 41 | 42 | 43 | public void deleteById(); 44 | 45 | public T insertOrUpdate(); 46 | 47 | public BaseBean newInstance(); 48 | 49 | public String getParameter(); 50 | 51 | @SuppressWarnings("rawtypes") 52 | public abstract RowMapper newMapper(); 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/dao/jdbc/dao/QuerySupport.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.dao.jdbc.dao; 2 | 3 | import com.wubaoguo.springboot.dao.jdbc.BaseCommond; 4 | import com.wubaoguo.springboot.dao.jdbc.bean.BaseBean; 5 | import org.apache.commons.lang3.StringUtils; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.HashMap; 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | @Component 14 | public class QuerySupport { 15 | 16 | @Autowired 17 | private BaseDao baseDao; 18 | 19 | public List> find(String sql, Map parames, BaseCommond commond) { 20 | String querySql = sql; 21 | if(StringUtils.isNotEmpty(commond.getOrderBy())){ 22 | querySql += " order by " +commond.getOrderBy()+" "; 23 | } 24 | if(commond.isPager()){ 25 | String sqlCount = "select count(*) from ("+ sql +" ) as count_info "; 26 | commond.setTotalCount(baseDao.queryForInteger(sqlCount,parames)); 27 | querySql += " limit "+commond.getLimitStart()+","+commond.getLimitEnd(); 28 | } 29 | return baseDao.queryForListMap(querySql, parames); 30 | } 31 | 32 | public List find(String sql, BaseBean bean, BaseCommond commond) throws Exception { 33 | String querySql = sql; 34 | 35 | if(StringUtils.isNotEmpty(commond.getOrderBy())){ 36 | querySql += " order by " +commond.getOrderBy()+" "; 37 | } 38 | 39 | if(commond.isPager()){ 40 | String sqlCount = "select count(*) from ("+ sql +" ) as count_info "; 41 | commond.setTotalCount(baseDao.queryForInteger(sqlCount,bean.getBeanValues())); 42 | querySql += " limit "+commond.getLimitStart()+","+commond.getLimitEnd(); 43 | } 44 | return baseDao.queryForList(querySql,bean); 45 | } 46 | 47 | public List find(BaseBean bean, BaseCommond commond) throws Exception { 48 | String sql = "select * from "+bean.getTableName(); 49 | if(StringUtils.isNotEmpty(bean.getParameter())){ 50 | sql += " where " + bean.getParameter(); 51 | } 52 | return find(sql, bean, commond); 53 | 54 | } 55 | 56 | public void setBaseDao(BaseDao baseDao) { 57 | this.baseDao = baseDao; 58 | } 59 | 60 | public Map parames() { 61 | return new HashMap(); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/dao/jdbc/dao/SpringContextHolder.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.dao.jdbc.dao; 2 | 3 | import cn.hutool.log.Log; 4 | import cn.hutool.log.LogFactory; 5 | import org.springframework.beans.factory.DisposableBean; 6 | import org.springframework.context.ApplicationContext; 7 | import org.springframework.context.ApplicationContextAware; 8 | import org.springframework.stereotype.Component; 9 | 10 | @Component 11 | public class SpringContextHolder implements ApplicationContextAware, DisposableBean { 12 | 13 | private static ApplicationContext applicationContext = null; 14 | 15 | protected static final Log log = LogFactory.get(SpringContextHolder.class); 16 | 17 | /** 18 | * 取得存储在静态变量中的ApplicationContext. 19 | */ 20 | public static ApplicationContext getApplicationContext() { 21 | return applicationContext; 22 | } 23 | 24 | /** 25 | * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. 26 | */ 27 | @SuppressWarnings("unchecked") 28 | public static T getBean(String name) { 29 | return (T) applicationContext.getBean(name); 30 | } 31 | 32 | /** 33 | * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. 34 | */ 35 | public static T getBean(Class requiredType) { 36 | return applicationContext.getBean(requiredType); 37 | } 38 | 39 | /** 40 | * 清除SpringContextHolder中的ApplicationContext为Null. 41 | */ 42 | public static void clearHolder() { 43 | log.debug("清除SpringContextHolder中的ApplicationContext:" 44 | + applicationContext); 45 | applicationContext = null; 46 | } 47 | 48 | /** 49 | * 实现ApplicationContextAware接口, 注入Context到静态变量中. 50 | */ 51 | @Override 52 | public void setApplicationContext(ApplicationContext applicationContext) { 53 | 54 | if (SpringContextHolder.applicationContext != null) { 55 | log.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext); 56 | } 57 | 58 | SpringContextHolder.applicationContext = applicationContext; // NOSONAR 59 | } 60 | 61 | /** 62 | * 实现DisposableBean接口, 在Context关闭时清理静态变量. 63 | */ 64 | public void destroy() throws Exception { 65 | SpringContextHolder.clearHolder(); 66 | } 67 | 68 | } -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/filter/AjaxFormAuthenticationFilter.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.filter; 2 | 3 | 4 | import com.wubaoguo.springboot.constant.ShiroConstants; 5 | import com.wubaoguo.springboot.core.request.StateMap; 6 | import com.wubaoguo.springboot.core.request.ViewResult; 7 | import com.wubaoguo.springboot.util.WebUtil; 8 | import org.apache.shiro.SecurityUtils; 9 | import org.apache.shiro.subject.Subject; 10 | import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; 11 | import org.apache.shiro.web.util.WebUtils; 12 | import org.springframework.util.StringUtils; 13 | 14 | import javax.servlet.ServletRequest; 15 | import javax.servlet.ServletResponse; 16 | import javax.servlet.http.HttpServletRequest; 17 | import javax.servlet.http.HttpServletResponse; 18 | 19 | /** 20 | * Description: 管理后台表单提交请求拦截 21 | * 22 | * @author: wubaoguo 23 | * @email: wustrive2008@gmail.com 24 | * @date: 2018/7/23 11:11 25 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 26 | */ 27 | public class AjaxFormAuthenticationFilter extends FormAuthenticationFilter { 28 | 29 | @Override 30 | protected boolean onAccessDenied(ServletRequest request, ServletResponse response) 31 | throws Exception { 32 | HttpServletRequest httpRequest = (HttpServletRequest) request; 33 | HttpServletResponse httpResponse = (HttpServletResponse) response; 34 | 35 | Subject subject = getSubject(request, response); 36 | if (subject.getPrincipal() == null) { 37 | if (WebUtil.isAjaxRequest(httpRequest)) { 38 | WebUtil.write( 39 | ViewResult.newInstance() 40 | .state(StateMap.S_AUTH_TIMEOUT, "您尚未登录或登录时间过长,请重新登录!").json(), 41 | httpResponse); 42 | } else { 43 | return super.onAccessDenied(httpRequest, httpResponse); 44 | } 45 | } else { 46 | if (WebUtil.isAjaxRequest(httpRequest)) { 47 | WebUtil.write( 48 | ViewResult.newInstance().state(StateMap.S_AUTH_ERROR, "您没有足够的权限执行该操作!") 49 | .json(), httpResponse); 50 | } else { 51 | String unauthorizedUrl = ShiroConstants.SHIRO_UNAUTH_URL; 52 | if (StringUtils.hasText(unauthorizedUrl)) { 53 | WebUtils.issueRedirect(request, response, unauthorizedUrl); 54 | } else { 55 | WebUtils.toHttp(response).sendError(StateMap.S_AUTH_ERROR); 56 | } 57 | } 58 | } 59 | return false; 60 | } 61 | 62 | @Override 63 | public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) 64 | throws Exception { 65 | if (SecurityUtils.getSubject().isAuthenticated()) { 66 | WebUtils.redirectToSavedRequest(request, response, getSuccessUrl()); 67 | return true;// 已经登录过 68 | } 69 | return super.onPreHandle(request, response, mappedValue); 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/filter/CORSFilter.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.filter; 2 | 3 | import javax.servlet.*; 4 | import javax.servlet.http.HttpServletResponse; 5 | import java.io.IOException; 6 | 7 | /** 8 | * @Description: 解决前端分离 ajax请求跨域问题 9 | * @author wubaoguo 10 | * @mail: wustrive2008@gmail.com 11 | * @date: 2017年4月18日 下午9:03:03 12 | * @version: v0.0.1 13 | */ 14 | public class CORSFilter implements Filter { 15 | 16 | @Override 17 | public void init(FilterConfig filterConfig) throws ServletException { 18 | 19 | } 20 | 21 | @Override 22 | public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 23 | throws IOException, ServletException { 24 | HttpServletResponse response = (HttpServletResponse) res; 25 | response.setHeader("Access-Control-Allow-Origin", "*"); 26 | response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); 27 | response.setHeader("Access-Control-Max-Age", "3600"); 28 | response.addHeader("Access-Control-Allow-Headers", "accessToken, deviceId, authType, Origin, X-Requested-With, Content-Type, Accept"); 29 | chain.doFilter(req, res); 30 | 31 | } 32 | 33 | @Override 34 | public void destroy() { 35 | 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/filter/PermissionFilter.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.filter; 2 | 3 | import com.wubaoguo.springboot.constant.ShiroConstants; 4 | import com.wubaoguo.springboot.manage.service.ManageService; 5 | import org.apache.commons.lang.StringUtils; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | 8 | import javax.servlet.*; 9 | import javax.servlet.http.HttpServletRequest; 10 | import java.io.IOException; 11 | import java.io.PrintWriter; 12 | 13 | /** 14 | * Description:页面访问权限控制 15 | * 16 | * @author: wubaoguo 17 | * @email: wustrive2008@gmail.com 18 | * @date: 2017/9/6 16:07 19 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 20 | */ 21 | public class PermissionFilter implements Filter { 22 | 23 | private String redirectUrl = ""; 24 | 25 | @Autowired 26 | private ManageService manageService; 27 | 28 | @Override 29 | public void init(FilterConfig filterConfig) throws ServletException { 30 | 31 | } 32 | 33 | @Override 34 | public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 35 | HttpServletRequest httpRequest = (HttpServletRequest) request; 36 | //获取请求url 37 | String uri = httpRequest.getRequestURI(); 38 | if (isStaticFile(uri)) { 39 | chain.doFilter(request, response); 40 | return; 41 | } 42 | String roleCode = ShiroConstants.getCurrentRoleCode(); 43 | if (uri.lastIndexOf("home.html") > 0 || (uri.lastIndexOf("main.html") < 0 && uri.lastIndexOf("table") < 0) || manageService.hasPermission(roleCode, uri)) { 44 | chain.doFilter(request, response); 45 | } else { 46 | String loginoutUrl = ((HttpServletRequest) request).getContextPath() + this.redirectUrl; 47 | System.out.println(uri); 48 | PrintWriter out = response.getWriter(); 49 | out.println(""); 50 | out.println(""); 53 | out.println(""); 54 | } 55 | } 56 | 57 | /** 58 | * 判断是否为静态文件 59 | * 60 | * @param uri 61 | * @return 62 | */ 63 | private boolean isStaticFile(String uri) { 64 | String suffix = StringUtils.substringAfterLast(uri, ".").toLowerCase(); 65 | return SubThreadContent.ignoreSuffix.contains(suffix); 66 | } 67 | 68 | @Override 69 | public void destroy() { 70 | 71 | } 72 | 73 | public void setRedirectUrl(String redirectUrl) { 74 | this.redirectUrl = redirectUrl; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/filter/SubThreadContent.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.filter; 2 | 3 | 4 | import com.google.common.collect.ImmutableSet; 5 | import com.wubaoguo.springboot.core.filter.ThreadContentFilter; 6 | import org.apache.commons.lang.StringUtils; 7 | 8 | import javax.servlet.FilterChain; 9 | import javax.servlet.ServletException; 10 | import javax.servlet.ServletRequest; 11 | import javax.servlet.ServletResponse; 12 | import javax.servlet.http.HttpServletRequest; 13 | import javax.servlet.http.HttpServletResponse; 14 | import java.io.IOException; 15 | 16 | /** 17 | * Description: ThreadLocal 解决线程变量副本问题 18 | * 19 | * @author: wubaoguo 20 | * @email: wustrive2008@gmail.com 21 | * @date: 2018/7/23 11:12 22 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 23 | */ 24 | public class SubThreadContent extends ThreadContentFilter { 25 | 26 | /** 27 | * 静态文件后缀名 28 | */ 29 | public static ImmutableSet ignoreSuffix = new ImmutableSet.Builder().add("jpg", "jpeg", "ico", "txt", "doc", "ppt", "xls", "pdf", "gif", "png", 30 | "bmp", "css", "js", "swf", "flv", "mp3", "htc", "woff", "woff2", "ttf").build(); 31 | 32 | @Override 33 | public void doFilter(ServletRequest request, ServletResponse response, 34 | FilterChain filterChain) throws IOException, ServletException { 35 | if (isStaticFile(request)) { 36 | filterChain.doFilter(request, response); 37 | } else { 38 | SubThreadContent.setThreadObject(new ThreadObject((HttpServletRequest) request, (HttpServletResponse) response)); 39 | filterChain.doFilter(request, response); 40 | SubThreadContent.setThreadObject(null); 41 | } 42 | } 43 | 44 | /** 45 | * 判断请求的是否是静态文件 46 | * 47 | * @param request 48 | * @return 49 | */ 50 | private boolean isStaticFile(ServletRequest request) { 51 | if (request instanceof HttpServletRequest) { 52 | String uri = ((HttpServletRequest) request).getRequestURI(); 53 | String suffix = StringUtils.substringAfterLast(uri, ".").toLowerCase(); 54 | return ignoreSuffix.contains(suffix); 55 | } 56 | // request 无法解析时 暂时定为静态文件处理 57 | return true; 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/jwt/JwtAuthentication.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.jwt; 2 | 3 | 4 | import com.nimbusds.jose.JWSObject; 5 | import com.wubaoguo.springboot.core.bean.AuthBean; 6 | import com.wubaoguo.springboot.util.JWTUtil; 7 | 8 | /** 9 | * 10 | * Description: jwt 授权信息 11 | * 12 | * @author: wubaoguo 13 | * @email: wustrive2008@gmail.com 14 | * @date: 2018/7/21 9:01 15 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 16 | */ 17 | public class JwtAuthentication extends AuthBean { 18 | 19 | private String deviceId; //设备id 20 | 21 | private String authType; //认证类型 22 | 23 | private String accessToken; //jwt授权token 24 | 25 | 26 | public JwtAuthentication() {} 27 | 28 | public JwtAuthentication(JWSObject jwsObject) { 29 | //this.userId = null != JWTUtil.getValue(jwsObject, "userId") ? JWTUtil.getValue(jwsObject, "userId").toString() : null; 30 | this.deviceId = null != JWTUtil.getValue(jwsObject, "deviceId") ? JWTUtil.getValue(jwsObject, "deviceId").toString() : null; 31 | this.authType = null != JWTUtil.getValue(jwsObject, "authType") ? JWTUtil.getValue(jwsObject, "authType").toString() : null; 32 | } 33 | 34 | 35 | public String getAccessToken() { 36 | return accessToken; 37 | } 38 | 39 | public void setAccessToken(String accessToken) { 40 | this.accessToken = accessToken; 41 | } 42 | 43 | public String getDeviceId() { 44 | return deviceId; 45 | } 46 | 47 | public void setDeviceId(String deviceId) { 48 | this.deviceId = deviceId; 49 | } 50 | 51 | public String getAuthType() { 52 | return authType; 53 | } 54 | 55 | public void setAuthType(String authType) { 56 | this.authType = authType; 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/jwt/JwtSubject.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.jwt; 2 | 3 | import com.nimbusds.jose.JWSObject; 4 | import com.wubaoguo.springboot.constant.JwtConstants; 5 | import com.wubaoguo.springboot.core.filter.ThreadContentFilter; 6 | import org.apache.commons.lang3.StringUtils; 7 | 8 | /** 9 | * Description: jwt对象 10 | * 11 | * @author: wubaoguo 12 | * @email: wustrive2008@gmail.com 13 | * @date: 2018/7/23 11:15 14 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 15 | */ 16 | public class JwtSubject { 17 | 18 | private JWSObject jwsObject; 19 | 20 | public JwtSubject() {} 21 | 22 | 23 | public JwtSubject(JWSObject jwsObject) { 24 | this.jwsObject = jwsObject; 25 | } 26 | 27 | /** 28 | * @return the jwsObject 29 | */ 30 | public JWSObject getJwsObject() { 31 | return jwsObject; 32 | } 33 | 34 | /** 35 | * @param jwsObject the jwsObject to set 36 | */ 37 | public void setJwsObject(JWSObject jwsObject) { 38 | this.jwsObject = jwsObject; 39 | } 40 | 41 | public static JwtAuthentication getJwtUser() { 42 | return ThreadContentFilter.getData(JwtConstants.THREAD_CURRENT_USER); 43 | } 44 | 45 | public static boolean isLogin() { 46 | // 直接进行非空验证.后期做修改 47 | JwtAuthentication jwtUser = getJwtUser(); 48 | if(jwtUser != null && StringUtils.isNotBlank(jwtUser.getUserId())) { 49 | return true; 50 | } 51 | return false; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/manage/controller/ErrorPageController.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.manage.controller; 2 | 3 | import org.springframework.boot.web.servlet.error.ErrorController; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | 7 | import javax.servlet.http.HttpServletResponse; 8 | 9 | /** 10 | * 错误页面 11 | * @Description: TODO 12 | * @author wubaoguo 13 | * @mail: wustrive2008@gmail.com 14 | * @date: 2017年3月17日 上午9:59:55 15 | * @version: v0.0.1 16 | */ 17 | @Controller 18 | public class ErrorPageController implements ErrorController { 19 | private static final String ERROR_PATH = "/error"; 20 | 21 | @RequestMapping(value = ERROR_PATH) 22 | public String err404(HttpServletResponse response) { 23 | switch(response.getStatus()){ 24 | case 404: 25 | return "/common/error/404"; 26 | case 403: 27 | return "/common/error/403"; 28 | default: 29 | return "/common/error/500"; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/manage/controller/SysConfigController.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.manage.controller; 2 | 3 | import com.wubaoguo.springboot.core.request.ViewResult; 4 | import com.wubaoguo.springboot.manage.service.SysConfigService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Controller; 7 | import org.springframework.web.bind.annotation.RequestMapping; 8 | import org.springframework.web.bind.annotation.RequestMethod; 9 | import org.springframework.web.bind.annotation.ResponseBody; 10 | 11 | @Controller 12 | @RequestMapping("/manage/sysconfig") 13 | public class SysConfigController { 14 | 15 | @Autowired 16 | SysConfigService sysConfigService; 17 | 18 | @ResponseBody 19 | @RequestMapping(method=RequestMethod.POST) 20 | public String currentConfig(String item_key, String value) { 21 | boolean flag = sysConfigService.save(item_key, value); 22 | if(flag) { 23 | // 更新 session 范围数据 24 | sysConfigService.initSysConfigToSession(null); 25 | } 26 | return ViewResult.newInstance().success().json(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/manage/controller/SysDictionaryController.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.manage.controller; 2 | 3 | 4 | import com.wubaoguo.springboot.core.request.ViewResult; 5 | import com.wubaoguo.springboot.entity.SysDictionary; 6 | import com.wubaoguo.springboot.manage.controller.commond.CondCacheCommond.CondCacheCommond; 7 | import com.wubaoguo.springboot.manage.controller.commond.CondCacheCommond.QueryCommondSession; 8 | import com.wubaoguo.springboot.manage.service.SysDictionaryService; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Controller; 11 | import org.springframework.ui.Model; 12 | import org.springframework.ui.ModelMap; 13 | import org.springframework.web.bind.annotation.*; 14 | 15 | @Controller 16 | @RequestMapping("/manage/sysdictionary") 17 | public class SysDictionaryController { 18 | 19 | @Autowired 20 | private SysDictionaryService sysDictionaryService; 21 | 22 | @ModelAttribute 23 | public void populateModel(CondCacheCommond commond, Model model) { 24 | commond = QueryCommondSession.validateCommond(this.getClass().getName(), commond); 25 | model.addAttribute("commond", commond); 26 | QueryCommondSession.putQueryCommond(this.getClass().getName(), commond); 27 | } 28 | 29 | @RequestMapping(value = "/{id}", method = RequestMethod.GET) 30 | public String form(@PathVariable("id") String id, ModelMap map) { 31 | SysDictionary sysDictionary = new SysDictionary(); 32 | if (!"none".equals(id)) { 33 | sysDictionary = sysDictionary.setId(id).queryForBean(); 34 | } 35 | map.addAttribute("entity", sysDictionary); 36 | return "/manage/dictionary/form"; 37 | } 38 | 39 | @RequestMapping(value = "/main", method = RequestMethod.GET) 40 | public String main(ModelMap map) { 41 | return "/manage/dictionary/main"; 42 | } 43 | 44 | 45 | @RequestMapping(value = "/table", method = RequestMethod.GET) 46 | public String findSysDictionary(CondCacheCommond commond, ModelMap map) { 47 | commond = QueryCommondSession.validateCommond(this.getClass().getName(), commond); 48 | map.put("entitys", sysDictionaryService.findSysDictionaryByComond(commond)); 49 | QueryCommondSession.putQueryCommond(this.getClass().getName(), commond); 50 | return "/manage/dictionary/table"; 51 | } 52 | 53 | 54 | @ResponseBody 55 | @RequestMapping(method = RequestMethod.POST) 56 | public String save(SysDictionary sysDictionary) { 57 | return ViewResult.newInstance().state(sysDictionaryService.saveSysDictionary(sysDictionary)).json(); 58 | } 59 | 60 | @ResponseBody 61 | @RequestMapping(value = "/inline", method = RequestMethod.POST) 62 | public String update(String id, String column, String value) { 63 | return sysDictionaryService.updateSysDictionary(id, column, value); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/manage/controller/commond/CondCacheCommond/CondCacheCommond.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.manage.controller.commond.CondCacheCommond; 2 | 3 | import com.wubaoguo.springboot.dao.jdbc.BaseCommond; 4 | import lombok.Data; 5 | 6 | /** 7 | * Description: 缓存条件对象 用户缓存查询条件 8 | * 9 | * @author: wubaoguo 10 | * @email: wustrive2008@gmail.com 11 | * @date: 2018/7/23 11:15 12 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 13 | */ 14 | @Data 15 | public class CondCacheCommond extends BaseCommond { 16 | private static final long serialVersionUID = 1L; 17 | 18 | private Integer newQuery; 19 | 20 | public boolean isNull() { 21 | return false; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/manage/controller/commond/CondCacheCommond/QueryCommondSession.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.manage.controller.commond.CondCacheCommond; 2 | 3 | import org.apache.shiro.SecurityUtils; 4 | import org.apache.shiro.session.Session; 5 | 6 | /** 7 | * 后台管理模块查询条件缓存 8 | * Description: 9 | * @author: wubaoguo 10 | * @email: wustrive2008@gmail.com 11 | * @date: 2017/8/10 9:47 12 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 13 | */ 14 | public class QueryCommondSession { 15 | 16 | private static CondCacheCommond getQueryCommond(String key) { 17 | return (CondCacheCommond) getSession().getAttribute(key); 18 | } 19 | 20 | public static void putQueryCommond(String key,CondCacheCommond commond){ 21 | getSession().setAttribute(key,commond); 22 | } 23 | 24 | public static Session getSession() { 25 | return SecurityUtils.getSubject().getSession(); 26 | } 27 | 28 | 29 | /** 30 | * 验证是否使用缓存的查询条件,满足以下条件使用缓存条件 31 | * 1. 不是点击查询按钮 32 | * 2. 新的查询条件为空 33 | * 3. 第一页数据 34 | * @param key 35 | * @param commond 36 | * @return 37 | */ 38 | public static CondCacheCommond validateCommond(String key,CondCacheCommond commond){ 39 | if(null == commond.getNewQuery() && commond.isNull() && commond.getPageNumber() < 2){ 40 | CondCacheCommond cacheCommond = QueryCommondSession.getQueryCommond(key); 41 | if(null != cacheCommond){ 42 | commond = cacheCommond; 43 | } 44 | } 45 | return commond; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/manage/controller/commond/ResourceCommond.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.manage.controller.commond; 2 | 3 | 4 | import com.wubaoguo.springboot.manage.controller.commond.CondCacheCommond.CondCacheCommond; 5 | import lombok.Data; 6 | 7 | /** 8 | * Description: 系统用户-角色-权限 管理模块查询条件 9 | * 10 | * @author: wubaoguo 11 | * @email: wustrive2008@gmail.com 12 | * @date: 2018/7/20 11:23 13 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 14 | */ 15 | @Data 16 | public class ResourceCommond extends CondCacheCommond { 17 | 18 | //菜单 19 | 20 | private String menuName; //菜单名称 21 | 22 | private String parentMenu; //父级菜单id 23 | 24 | //管理员 25 | 26 | private String roleCode; //角色代码 27 | 28 | private String name; //用户姓名 29 | 30 | private String phone; //用户手机号 31 | 32 | private String state; //账号状态 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/manage/domain/SearchResults.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.manage.domain; 2 | 3 | /** 4 | * 5 | * Description: 6 | * 7 | * @author: wubaoguo 8 | * @email: wustrive2008@gmail.com 9 | * @date: 2018/7/21 9:06 10 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 11 | */ 12 | public class SearchResults { 13 | 14 | /** 15 | * 标题 16 | */ 17 | private String title; 18 | 19 | /** 20 | * 连接 21 | */ 22 | private String link; 23 | 24 | /** 25 | * 描述文字 26 | */ 27 | private String details; 28 | 29 | 30 | public SearchResults() {} 31 | 32 | 33 | public SearchResults(String title, String link, String details) { 34 | super(); 35 | this.title = title; 36 | this.link = link; 37 | this.details = details; 38 | } 39 | 40 | public String getTitle() { 41 | return title; 42 | } 43 | 44 | public void setTitle(String title) { 45 | this.title = title; 46 | } 47 | 48 | public String getLink() { 49 | return link; 50 | } 51 | 52 | public void setLink(String link) { 53 | this.link = link; 54 | } 55 | 56 | public String getDetails() { 57 | return details; 58 | } 59 | 60 | public void setDetails(String details) { 61 | this.details = details; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/manage/service/SysConfigService.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.manage.service; 2 | 3 | import cn.hutool.core.convert.Convert; 4 | import com.wubaoguo.springboot.constant.ShiroConstants; 5 | import com.wubaoguo.springboot.dao.jdbc.dao.BaseDao; 6 | import com.wubaoguo.springboot.entity.SysConfig; 7 | import jodd.util.StringUtil; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.HashMap; 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | @Service 16 | public class SysConfigService { 17 | 18 | @Autowired 19 | BaseDao baseDao; 20 | 21 | public List> findSysConfig(String admin_id) { 22 | Map param = new HashMap(); 23 | param.put("admin_id", admin_id); 24 | return baseDao.queryForListMap("select * from sys_config where sys_damin_id=:admin_id", param); 25 | } 26 | 27 | /** 28 | * 读取指定 管理员用户配置项 ,暂不添加缓存处理 29 | * 30 | * @param admin_id 31 | * @return 32 | */ 33 | public Map findSysConfigToMap(String admin_id) { 34 | Map rMap = null; 35 | List> rList = findSysConfig(admin_id); 36 | if (rList != null && rList.size() > 0) { 37 | rMap = new HashMap<>(rList.size()); 38 | for (Map map : rList) { 39 | rMap.put(Convert.toStr(map.get("item_key")), map.get("item_value")); 40 | } 41 | } 42 | return rMap; 43 | } 44 | 45 | public void initSysConfigToSession(String userId) { 46 | Map rMap = findSysConfigToMap(StringUtil.isBlank(userId) ? 47 | ShiroConstants.getCurrentUser().getId() : userId); 48 | ShiroConstants.getSession().setAttribute(ShiroConstants.SESSION_SYS_CONFIG, rMap); 49 | } 50 | 51 | public boolean save(String item_key, String value) { 52 | String admin_id = ShiroConstants.getCurrentUser().getUserId(); 53 | SysConfig sysConfig = new SysConfig(); 54 | sysConfig.setSys_damin_id(admin_id); 55 | SysConfig dbSysConfig = sysConfig.setItem_key(item_key).queryForBean(); 56 | if (dbSysConfig != null && StringUtil.isNotBlank(dbSysConfig.getId())) { 57 | dbSysConfig.setItem_value(value); 58 | dbSysConfig.update(); 59 | } else { 60 | sysConfig.setItem_value(value); 61 | sysConfig.insert(); 62 | } 63 | return true; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/model/SysAdmin.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.model; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * Description: mubatis实体示例 7 | * 8 | * @author: wubaoguo 9 | * @email: wustrive2008@gmail.com 10 | * @date: 2018/7/23 15:41 11 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 12 | */ 13 | @Data 14 | public class SysAdmin { 15 | private String id; 16 | 17 | private String name; 18 | 19 | private String phoneNumber; 20 | 21 | private String account; 22 | 23 | private Integer onlineState; 24 | 25 | private String nickName; 26 | 27 | private String password; 28 | 29 | private String departId; 30 | 31 | private Integer isActivity; 32 | 33 | private Long addTime; 34 | 35 | } -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/rest/controller/MyBatisTestController.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.rest.controller; 2 | 3 | import com.google.common.collect.ImmutableMap; 4 | import com.wubaoguo.springboot.core.request.ViewResult; 5 | import com.wubaoguo.springboot.dao.SysAdminMapper; 6 | import com.wubaoguo.springboot.entity.SysAdmin; 7 | import com.wubaoguo.springboot.rest.service.MyBatisTestService; 8 | import io.swagger.annotations.ApiOperation; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.web.bind.annotation.PathVariable; 11 | import org.springframework.web.bind.annotation.RequestMapping; 12 | import org.springframework.web.bind.annotation.RequestMethod; 13 | import org.springframework.web.bind.annotation.RestController; 14 | 15 | /** 16 | * Description:mybatis示例 17 | * 18 | * @author: wubaoguo 19 | * @email: wustrive2008@gmail.com 20 | * @date: 2018/7/23 11:52 21 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 22 | */ 23 | @RestController 24 | @RequestMapping("/mybatis") 25 | public class MyBatisTestController { 26 | 27 | @Autowired 28 | MyBatisTestService myBatisTestService; 29 | 30 | @Autowired 31 | SysAdminMapper sysAdminMapper; 32 | 33 | @ApiOperation(value = "mybatis简单操作示例-根据id获取用户信息", notes = "mybatis简单操作示例-根据id获取用户信息") 34 | @RequestMapping(value = {"getUserById/{id}"}, method = RequestMethod.GET) 35 | public String getUserById(@PathVariable String id) { 36 | SysAdmin admin = myBatisTestService.getUserById(id); 37 | return ViewResult.newInstance().setData(admin.getBeanValues()).json(); 38 | } 39 | 40 | @ApiOperation(value = "mybatis复杂操作示例-根据id获取用户角色名称", notes = "mybatis复杂操作示例-根据id获取用户角色名称") 41 | @RequestMapping(value = {"getRoleNameById/{id}"}, method = RequestMethod.GET) 42 | public String getRoleNameById(@PathVariable String id) { 43 | String roleName = myBatisTestService.getRoleNameById(id); 44 | return ViewResult.newInstance().setData(ImmutableMap.of("roleName", roleName)).json(); 45 | } 46 | 47 | @ApiOperation(value = "mybatis-Mapper示例-根据id查询实体", notes = "mybatis-Mapper示例-根据id查询实体") 48 | @RequestMapping(value = {"selectByPrimaryKey/{id}"}, method = RequestMethod.GET) 49 | public String selectByPrimaryKey(@PathVariable String id) { 50 | com.wubaoguo.springboot.model.SysAdmin admin = sysAdminMapper.selectByPrimaryKey(id); 51 | return ViewResult.newInstance().setData(ImmutableMap.of("name", admin.getName())).json(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/rest/controller/RedisTestController.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.rest.controller; 2 | 3 | import com.wubaoguo.springboot.core.request.ViewResult; 4 | import com.wubaoguo.springboot.rest.service.RedisTestService; 5 | import io.swagger.annotations.ApiOperation; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.cache.annotation.CacheConfig; 8 | import org.springframework.data.redis.core.StringRedisTemplate; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RequestMethod; 12 | import org.springframework.web.bind.annotation.RestController; 13 | 14 | import javax.annotation.Resource; 15 | 16 | @CacheConfig(cacheNames = "user") 17 | @RestController 18 | @RequestMapping("/open/redis") 19 | public class RedisTestController { 20 | 21 | @Resource 22 | private StringRedisTemplate stringRedisTemplate; 23 | 24 | @Autowired 25 | RedisTestService redisTestService; 26 | 27 | 28 | @ApiOperation(value = "数据存储到redis-内置redis", notes = "将数据存储到redis") 29 | @RequestMapping(value = {"add/{key}:{value}"}, method = RequestMethod.GET) 30 | public String add(@PathVariable String key, @PathVariable String value) { 31 | stringRedisTemplate.opsForValue().set(key, value); 32 | return "Success"; 33 | } 34 | 35 | @ApiOperation(value = "redis数据库缓存", notes = "缓存数据") 36 | @RequestMapping(value = {"getUser/{id}"}, method = RequestMethod.GET) 37 | public String cacheSql(@PathVariable String id) { 38 | return ViewResult.newInstance().setData(redisTestService.getUser(id).getBeanValues()).json(); 39 | } 40 | 41 | @RequestMapping(value = {"getUsers"}, method = RequestMethod.GET) 42 | public String cacheSql() { 43 | return redisTestService.getUsers(); 44 | } 45 | 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/rest/service/JwtAuthService.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.rest.service; 2 | 3 | import com.wubaoguo.springboot.jwt.JwtAuthentication; 4 | 5 | public interface JwtAuthService { 6 | 7 | JwtAuthentication login(JwtAuthentication auth); 8 | 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/rest/service/MyBatisTestService.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.rest.service; 2 | 3 | import com.wubaoguo.springboot.entity.SysAdmin; 4 | import org.apache.ibatis.annotations.Mapper; 5 | import org.apache.ibatis.annotations.Param; 6 | import org.apache.ibatis.annotations.Select; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * Description:mybatis示例-注解 11 | * 12 | * @author: wubaoguo 13 | * @email: wustrive2008@gmail.com 14 | * @date: 2018/7/23 11:52 15 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 16 | */ 17 | @Mapper 18 | @Component 19 | public interface MyBatisTestService { 20 | 21 | @Select("SELECT * FROM sys_admin WHERE id = #{id}") 22 | SysAdmin getUserById(@Param("id") String id); 23 | 24 | @Select("SELECT c.name FROM sys_admin a,sys_admin_role b,sys_role c where a.id =b.admin_id and b.code = c.code and a.id = #{id}") 25 | String getRoleNameById(String id); 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/rest/service/RedisTestService.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.rest.service; 2 | 3 | import com.wubaoguo.springboot.core.request.ViewResult; 4 | import com.wubaoguo.springboot.dao.jdbc.dao.BaseDao; 5 | import com.wubaoguo.springboot.entity.SysAdmin; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.autoconfigure.klock.annotation.Klock; 8 | import org.springframework.cache.annotation.Cacheable; 9 | import org.springframework.data.redis.core.RedisTemplate; 10 | import org.springframework.data.redis.core.StringRedisTemplate; 11 | import org.springframework.stereotype.Service; 12 | 13 | import java.util.List; 14 | import java.util.Map; 15 | 16 | /** 17 | * Description: 18 | * 19 | * @author: wubaoguo 20 | * @email: wustrive2008@gmail.com 21 | * @date: 2018/7/19 9:40 22 | * @Copyright: 2017-2018 dgztc Inc. All rights reserved. 23 | */ 24 | @Service 25 | public class RedisTestService { 26 | @Autowired 27 | StringRedisTemplate stringRedisTemplate; 28 | 29 | @Autowired 30 | RedisTemplate redisTemplate; 31 | 32 | @Autowired 33 | BaseDao baseDao; 34 | 35 | 36 | @Klock 37 | @Cacheable(cacheNames = {"userList3"}, keyGenerator = "wiselyKeyGenerator") 38 | public String getUsers() { 39 | String sql = "select * from sys_admin"; 40 | System.out.println("查询数据库"); 41 | List> list = baseDao.queryForListMap(sql, null); 42 | return ViewResult.newInstance().setRows(list).json(); 43 | } 44 | 45 | /** 46 | * @param id 47 | * @return 48 | */ 49 | @Cacheable("sysadmin") 50 | public SysAdmin getUser(String id) { 51 | System.out.println("查询数据库"); 52 | return new SysAdmin(id).queryForBean(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/rest/service/impl/JwtBaseAuthServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.rest.service.impl; 2 | 3 | import org.springframework.stereotype.Service; 4 | 5 | import com.wubaoguo.springboot.rest.service.JwtAuthService; 6 | import com.wubaoguo.springboot.jwt.JwtAuthentication; 7 | 8 | @Service 9 | public class JwtBaseAuthServiceImpl implements JwtAuthService{ 10 | 11 | @Override 12 | public JwtAuthentication login(JwtAuthentication auth) { 13 | return null; 14 | } 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/wubaoguo/springboot/util/BeanUtil.java: -------------------------------------------------------------------------------- 1 | package com.wubaoguo.springboot.util; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | import org.springframework.beans.BeanUtils; 7 | import org.springframework.beans.BeanWrapper; 8 | import org.springframework.beans.BeanWrapperImpl; 9 | 10 | public class BeanUtil { 11 | 12 | public static String[] getNullPropertyNames (Object source) { 13 | final BeanWrapper src = new BeanWrapperImpl(source); 14 | java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); 15 | 16 | Set emptyNames = new HashSet(); 17 | for(java.beans.PropertyDescriptor pd : pds) { 18 | Object srcValue = src.getPropertyValue(pd.getName()); 19 | if (srcValue == null) emptyNames.add(pd.getName()); 20 | } 21 | String[] result = new String[emptyNames.size()]; 22 | return emptyNames.toArray(result); 23 | } 24 | 25 | public static void copyPropertiesIgnoreNull(Object src, Object target){ 26 | BeanUtils.copyProperties(src, target, getNullPropertyNames(src)); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=8020 2 | spring.profiles.active=dev 3 | 4 | ##数据库配置 5 | spring.datasource.url=jdbc:mysql://192.168.11.8:3306/jsboot 6 | spring.datasource.username=root 7 | spring.datasource.password=Ewm123456% 8 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 9 | 10 | #druid_config 11 | spring.datasource.max-active=20 12 | spring.datasource.initial-size=1 13 | spring.datasource.min-idle=3 14 | spring.datasource.max-wait=60000 15 | spring.datasource.time-between-eviction-runs-millis=60000 16 | spring.datasource.min-evictable-idle-time-millis=300000 17 | spring.datasource.test-while-idle=true 18 | spring.datasource.test-on-borrow=false 19 | spring.datasource.test-on-return=false 20 | spring.datasource.poolPreparedStatements=true 21 | 22 | # mybatis_config 23 | mybatis.mapper-locations=classpath*:/mapper/**Mapper.xml 24 | mybatis.typeAliasesPackage=com.wubaoguo.springboot.model 25 | 26 | ##jpa配置 27 | spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop 28 | spring.jpa.properties.hibernate.show_sql=true 29 | 30 | ##日志多彩输出 31 | spring.output.ansi.enabled=DETECT 32 | 33 | # REDIS (RedisProperties) 34 | # Redis数据库索引(默认为0) 35 | spring.redis.database=4 36 | # Redis服务器地址 37 | spring.redis.host=192.168.11.8 38 | # Redis服务器连接端口 39 | spring.redis.port=6379 40 | # Redis服务器连接密码(默认为空) 41 | spring.redis.password=123456 42 | # 连接超时时间(毫秒) 43 | spring.redis.timeout=5000 44 | # 最大活跃连接数,负数为不限制 45 | spring.redis.lettuce.pool.max-active=500 46 | # 等待可用连接的最大时间,负数为不限制 47 | spring.redis.lettuce.pool.max-wait=-1ms 48 | # 最大空闲连接数 49 | spring.redis.lettuce.pool.max-idle=100 50 | # 最小空闲连接数 51 | spring.redis.lettuce.pool.min-idle=20 52 | 53 | ## mail 54 | spring.mail.host=smtp.126.com 55 | spring.mail.username=18695850831@126.com 56 | spring.mail.password=XXXXXXXXXXX 57 | spring.mail.properties.mail.smtp.auth=true 58 | spring.mail.properties.mail.smtp.starttls.enable=true 59 | spring.mail.properties.mail.smtp.starttls.required=true 60 | 61 | 62 | ###freemarker 63 | spring.freemarker.template-loader-path=/WEB-INF/ftl 64 | spring.freemarker.cache=false 65 | spring.freemarker.charset=UTF-8 66 | spring.freemarker.check-template-location=true 67 | spring.freemarker.content-type=text/html 68 | spring.freemarker.expose-request-attributes=true 69 | spring.freemarker.expose-session-attributes=true 70 | spring.freemarker.request-context-attribute=request 71 | 72 | #匹配url后缀 73 | spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER 74 | spring.mvc.pathmatch.use-suffix-pattern=true 75 | 76 | 77 | #jwt秘钥 78 | jwt.secret=d4d07ded4d084c8ca9e7eff124fa73b9 79 | jwt.exp=100 -------------------------------------------------------------------------------- /src/main/resources/generatorConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 21 | 22 | 24 | 25 | 26 | 27 | 28 | 29 | 31 | 32 | 33 | 34 | 35 | 37 | 38 | 39 | 40 | 43 | 44 | 45 | 46 | 47 | 51 | 52 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/blackboard.html: -------------------------------------------------------------------------------- 1 | [#import "/manage/util/dash.html" as h/] 2 | [@h.head/] 3 | [@h.maincss /] 4 | 14 | 15 | 16 |
17 |
18 |

jsboot-admin

19 | 一个更简洁、更灵活的Spring Boot项目脚手架,致力于帮助开发者快速的搭建项目,让大家更专注于业务实现而非框架问题
20 | 项目地址:https://github.com/wustrive2008/jsboot-admin.git 21 |
22 | 23 |
24 | [@h.mainjs /] 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/common/_tab.html: -------------------------------------------------------------------------------- 1 | 54 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/common/_theme.html: -------------------------------------------------------------------------------- 1 | 85 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/dictionary/main.html: -------------------------------------------------------------------------------- 1 | [#import "/manage/util/dash.html" as h/] 2 | [@h.head/] 3 | [@h.maincss /] 4 | [@h.fooTableCss /] 5 | 6 | 7 |
8 |
9 |
10 |
11 |
12 | [@h.breadcrumb navigation='{"title":"数据词典", "active":true}' title="数据词典" /] 13 |
14 | 15 | 16 | 17 |
18 |
19 |
20 | 21 | 添加 22 |
23 |
24 |
25 |
26 |
27 |
28 | [@h.mainjs /] 29 | [@h.fooTableScript /] 30 | [@h.icheckScript /] 31 | [@h.modalBoxTemplate id='modal-form' templateUri="/manage/dictionary/form.html" /] 32 | [@h.formValidationScript /] 33 | [@h.pageScript /] 34 | [@h.ladda /] 35 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/dictionary/table.html: -------------------------------------------------------------------------------- 1 | [#import "/manage/util/footable.html" as t/] 2 |
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | [#list entitys as entity] 15 | 16 | 17 | 18 | 19 | 20 | 27 | 28 | [/#list] 29 | 30 | [@t.paged commond=commond ibox_content_id="div_table_container"/] 31 | 32 |
标题编码描述简介归属资源字典内容
${entity.title}${entity.tag_code}${entity.description}${entity.res_code} 21 |
22 | 23 | 保存 25 |
26 |
33 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | jsboot - 主页 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | [#include "/manage/common/_tab.html" /] 20 | 21 | 22 | 23 | [#include "/manage/common/_right.html" /] 24 | 25 | 26 | 27 | [#include "/manage/common/_theme.html" /] 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/lockscreen.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | jsboot-admin - 锁屏 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |

jsboot-admin

17 |

进入锁屏,主要的应用程序被关闭,你需要输入你的登录密码进行解锁。

18 |
19 |
20 | 21 | 22 |
23 | 24 |
25 |
26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 登录 11 | 12 | 13 | 14 |
15 |
16 |
17 |

JSB

18 |
19 |
20 |
21 | 22 | 23 |
24 |
25 | 26 |
27 | 28 | 29 | Forgot password? 30 | 31 |

32 | 33 | [#switch shiroLoginFailure] 34 | [#case 'org.apache.shiro.authc.IncorrectCredentialsException'] 35 | 密码错误 36 | [#break] 37 | [#case 'org.apache.shiro.authc.UnknownAccountException'] 38 | 帐号不存在 39 | [#break] 40 | [#case 'org.apache.shiro.authc.ConcurrentAccessException'] 41 | 当前登录账号角色已被禁用 42 | [#break] 43 | [#case 'org.apache.shiro.authc.DisabledAccountException'] 44 | 当前登录账号已被禁用 45 | [#break] 46 | [/#switch] 47 | 48 |

49 |
50 |

51 | © 2018 jsboot-admin 52 |

53 |
54 |
55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/menu.html: -------------------------------------------------------------------------------- 1 | 43 | 44 | 56 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/resource/admintable.html: -------------------------------------------------------------------------------- 1 | [#import "/manage/util/footable.html" as t/] 2 | [#macro activity data={}] 3 | [#if data.is_activity == 1 || data.is_activity] 4 | 5 | [#else] 6 | 7 | [/#if] 8 | [/#macro] 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | [#list datas as data] 21 | 22 | 23 | 24 | 25 | 26 | 30 | 31 | [/#list] 32 | 33 | [@t.paged commond=commond ibox_content_id="div_table_container"/] 34 |
名称帐号手机号角色操作
${data.name}[@activity data=data/]${data.account}[@activity data=data/]${data.phone_number}[@activity data=data/][#list data.roles as role]${role.name +'/'}[/#list] 27 | 28 | 29 |
35 | 41 | 77 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/resource/menumain.html: -------------------------------------------------------------------------------- 1 | [#import "/manage/util/dash.html" as h/] 2 | [@h.head/] 3 | [@h.maincss /] 4 | [@h.fooTableCss /] 5 | [@h.body /] 6 |
7 |
8 |
9 |
10 |
11 | [@h.breadcrumb navigation='{"title":"菜单", "active":true}' title="菜单" /] 12 |
13 | 14 | 15 | 16 |
17 |
18 |
19 | 20 |
21 |
22 |
23 |
24 |
25 |
26 | [@h.mainjs /] 27 | [@h.fooTableScript /] 28 | [@h.icheckScript /] 29 | [@h.modalBox id='modal-menumain-form' /] 30 | [@h.formValidationScript /] 31 | [@h.pageScript /] 32 | [@h.ladda /] 33 | 40 | 41 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/resource/rolemain.html: -------------------------------------------------------------------------------- 1 | [#import "/manage/util/dash.html" as h/] 2 | [@h.head/] 3 | [@h.maincss /] 4 | [@h.fooTableCss /] 5 | [@h.body /] 6 |
7 |
8 |
9 |
10 |
11 | [@h.breadcrumb navigation='{"title":"角色管理", "active":true}' title="角色管理" /] 12 |
13 | 14 | 15 | 16 |
17 |
18 |
19 | 20 | 添加 22 |
23 |
24 |
25 |
26 |
27 |
28 | [@h.mainjs /] 29 | [@h.fooTableScript /] 30 | [@h.icheckScript /] 31 | [@h.modalBox id='modal-rolemain-form' /] 32 | [@h.formValidationScript /] 33 | [@h.pageScript /] 34 | [@h.ztree /] 35 | [@h.sweetalert /] 36 | 43 | 44 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/resource/roletable.html: -------------------------------------------------------------------------------- 1 | [#macro activity data={}] 2 | [#if data.is_activity == 1 || data.is_activity] 3 | 4 | [#else] 5 | 6 | [/#if] 7 | [/#macro] 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | [#list datas as data] 19 | 20 | 21 | 22 | 23 | 24 | 25 | [/#list] 26 | 27 | 28 | 29 | 30 |
角色名称角色编码排序操作
${data.name}[@activity data=data/]${data.code}[@activity data=data/]
31 | 56 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/util/footable.html: -------------------------------------------------------------------------------- 1 | [#macro sort commond={} selector=""] 2 | data-sort-selector=${selector} 3 | [#if commond.orderBy?index_of(selector) != -1] 4 | data-sort-initial=${(commond.orderByClause == 'ASC')?string('true', 'descending')} 5 | [/#if] 6 | [/#macro] 7 | [#macro searchType commond={} ibox_content_id=""] 8 | 17 | [#include "/manage/util/searchType2.html" /] 18 | [/#macro] 19 | [#macro paged commond={} ibox_content_id=""] 20 | 21 | 22 | 23 |
    24 |
    25 | 31 | 每页显示  ${commond.pageSize}  条  共 ${commond.totalCount} 条记录  [#if commond.pageCount == 0]0[#else]${commond.pageNumber!1}[/#if]/${commond.pageCount!1} 页 32 |
    33 | 34 | 35 | 36 | 41 | [/#macro] -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/util/historyForm.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/ftl/manage/util/paged.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
      5 |
      6 | 12 | 总页数${commond.totalCount} 13 |
      14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | base-framework 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/login.min.css: -------------------------------------------------------------------------------- 1 | html{height:100%}body.signin{height:auto;background:url(../img/login-background.jpg) no-repeat center fixed;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover;color:rgba(255,255,255,.95)}.signinpanel{width:750px;margin:10% auto 0}.signinpanel .logopanel{float:none;width:auto;padding:0;background:0 0}.signinpanel .signin-info ul{list-style:none;padding:0;margin:20px 0}.signinpanel .form-control{display:block;margin-top:15px}.signinpanel .uname{background:#fff url(../img/user.png) no-repeat 95% center;color:#333}.signinpanel .pword{background:#fff url(../img/locked.png) no-repeat 95% center;color:#333}.signinpanel .btn{margin-top:15px}.signinpanel form{background:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.3);-moz-box-shadow:0 3px 0 rgba(12,12,12,.03);-webkit-box-shadow:0 3px 0 rgba(12,12,12,.03);box-shadow:0 3px 0 rgba(12,12,12,.03);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:30px}.signup-footer{border-top:solid 1px rgba(255,255,255,.3);margin:20px 0;padding-top:15px}@media screen and (max-width:768px){.signinpanel,.signuppanel{margin:0 auto;width:420px!important;padding:20px}.signinpanel form{margin-top:20px}.signup-footer,.signuppanel .form-control{margin-bottom:10px}.signup-footer .pull-left,.signup-footer .pull-right{float:none!important;text-align:center}.signinpanel .signin-info ul{display:none}}@media screen and (max-width:320px){.signinpanel,.signuppanel{margin:0 20px;width:auto}} 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/patterns/header-profile-skin-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/patterns/header-profile-skin-1.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/patterns/header-profile-skin-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/patterns/header-profile-skin-3.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/patterns/header-profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/patterns/header-profile.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/patterns/shattered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/patterns/shattered.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/blueimp/img/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/blueimp/img/error.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/blueimp/img/error.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/blueimp/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/blueimp/img/loading.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/blueimp/img/play-pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/blueimp/img/play-pause.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/blueimp/img/play-pause.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/blueimp/img/video-play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/blueimp/img/video-play.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/blueimp/img/video-play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/chosen/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/chosen/chosen-sprite.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/chosen/chosen-sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/chosen/chosen-sprite@2x.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/alpha-horizontal.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/alpha.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/hue-horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/hue-horizontal.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/hue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/hue.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/saturation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/colorpicker/img/bootstrap-colorpicker/saturation.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/footable/fonts/footable.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/footable/fonts/footable.eot -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/footable/fonts/footable.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/footable/fonts/footable.ttf -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/footable/fonts/footable.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/footable/fonts/footable.woff -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/footable/fonts/footabled41d.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/footable/fonts/footabled41d.eot -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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/skin/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%402x.png); 56 | -webkit-background-size: 240px 24px; 57 | background-size: 240px 24px; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/iCheck/green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/iCheck/green.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/iCheck/green@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/iCheck/green@2x.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/images/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/images/sort_asc.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/images/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/images/sort_desc.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/images/sprite-skin-flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/images/sprite-skin-flat.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/images/spritemap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/images/spritemap.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/images/spritemap@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/images/spritemap@2x.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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 | } 90 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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%} 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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;} 3 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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 | } 33 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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/skin/css/plugins/validate/formValidation.min.css: -------------------------------------------------------------------------------- 1 | .fv-has-feedback{position:relative}.fv-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.fv-help-block{display:block}.fv-form-bootstrap .help-block{margin-bottom:0}.fv-form-bootstrap .tooltip-inner{text-align:left}.fv-form-bootstrap .fv-icon-no-label{top:0}.fv-form-bootstrap .fv-bootstrap-icon-input-group{z-index:100}.form-inline.fv-form-bootstrap .form-group{vertical-align:top}.fv-form-foundation .fv-control-feedback{top:21px;right:15px;width:37px;height:37px;line-height:37px}.fv-form-foundation .collapse .fv-control-feedback{top:0;right:0}.fv-form-foundation .fv-icon-no-label,.fv-form-horizontal.fv-form-foundation .fv-control-feedback{top:0}.fv-form-foundation .error .fv-control-feedback{color:#f04124}.error.fv-has-tooltip select,.error.fv-has-tooltip textarea,.fv-form-foundation .error.fv-has-tooltip input{margin-bottom:1rem}.fv-form-pure .fv-control-feedback{top:22px;width:36px;height:36px;line-height:36px}.pure-form-stacked.fv-form-pure .fv-control-feedback{top:4px}.pure-form-aligned .pure-control-group .fv-help-block{margin-top:5px;margin-left:180px}.fv-form-pure .fv-icon-no-label,.pure-form-aligned.fv-form-pure .fv-control-feedback{top:0}.fv-form-pure .fv-has-error .fv-control-feedback,.fv-form-pure .fv-has-error .fv-help-block,.fv-form-pure .fv-has-error label{color:#CA3C3C}.fv-form-semantic .fv-control-feedback.icon{right:7px}.fv-form-semantic .error .icon{color:#d95c5c}.fv-form-horizontal.fv-form-semantic .row{padding-bottom:0}.fv-form-uikit .fv-control-feedback{top:25px;width:30px;height:30px;line-height:30px}.fv-form-uikit .uk-text-danger{display:block}.uk-form-horizontal.fv-form-uikit .fv-control-feedback{top:0}.fv-form-uikit .fv-has-error .fv-control-feedback,.fv-form-uikit .fv-has-error .uk-form-label,.fv-form-uikit .fv-has-error label{color:#D85030}.fv-form-uikit .fv-icon-no-label{top:0} -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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/skin/css/plugins/zTree_v3/img/diy/1_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/1_close.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/1_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/1_open.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/2.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/3.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/4.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/5.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/6.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/7.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/8.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/diy/9.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/line_conn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/line_conn.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/loading.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/zTreeStandard.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/zTreeStandard.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/css/plugins/zTree_v3/img/zTreeStandard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/css/plugins/zTree_v3/img/zTreeStandard.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/fontawesome-webfont93e3.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/fontawesome-webfont93e3.eot -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/fontawesome-webfont93e3.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/fontawesome-webfont93e3.ttf -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/fontawesome-webfont93e3.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/fontawesome-webfont93e3.woff -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/fontawesome-webfont93e3.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/fontawesome-webfont93e3.woff2 -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/fontawesome-webfontd41d.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/fontawesome-webfontd41d.eot -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/webapp/static/skin/fonts/glyphicons-halflings-regulard41d.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/fonts/glyphicons-halflings-regulard41d.eot -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/RegexBuddy 3.lnk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/RegexBuddy 3.lnk -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/WinSCP.lnk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/WinSCP.lnk -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a1.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a2.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a3.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a4.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a5.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a6.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a7.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a8.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/a9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/a9.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/bg.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/default-portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/default-portrait.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/favicon.ico -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/iconfont-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/iconfont-logo.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/icons.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/index.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/index.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/index_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/index_4.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/loading-upload.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/loading-upload.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/locked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/locked.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/login-background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/login-background.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/p1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/p1.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/p2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/p2.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/p3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/p3.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/p_big1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/p_big1.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/p_big2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/p_big2.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/p_big3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/p_big3.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/pay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/pay.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/profile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/profile.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/profile_big.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/profile_big.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/profile_small.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/profile_small.jpg -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/progress.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/qr_code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/qr_code.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/success.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/user.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/img/wenku_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/img/wenku_logo.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/content.min.js: -------------------------------------------------------------------------------- 1 | { 2 | function $childNode(o) { 3 | return window.frames[o] 4 | } 5 | 6 | function animationHover(o, e) { 7 | o = $(o), o.hover(function () { 8 | o.addClass("animated " + e) 9 | }, function () { 10 | window.setTimeout(function () { 11 | o.removeClass("animated " + e) 12 | }, 2e3) 13 | }) 14 | } 15 | 16 | function WinMove() { 17 | var o = "[class*=col]", e = ".ibox-title", i = "[class*=col]"; 18 | $(o).sortable({ 19 | handle: e, 20 | connectWith: i, 21 | tolerance: "pointer", 22 | forcePlaceholderSize: !0, 23 | opacity: .8 24 | }).disableSelection() 25 | } 26 | 27 | var $parentNode = window.parent.document; 28 | if ($(".tooltip-demo").tooltip({ 29 | selector: "[data-toggle=tooltip]", 30 | container: "body" 31 | }), $(".modal").appendTo("body"), $("[data-toggle=popover]").popover(), $(".collapse-link").click(function () { 32 | var o = $(this).closest("div.ibox"), e = $(this).find("i"), i = o.find("div.ibox-content"); 33 | i.slideToggle(200), e.toggleClass("fa-chevron-up").toggleClass("fa-chevron-down"), o.toggleClass("").toggleClass("border-bottom"), setTimeout(function () { 34 | o.resize(), o.find("[id^=map-]").resize() 35 | }, 50) 36 | }), $(".close-link").click(function () { 37 | var o = $(this).closest("div.ibox"); 38 | o.remove() 39 | }), top == this) { 40 | /* var gohome = '
      '; 41 | $("body").append(gohome)*/ 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/demo/bootstrap-table-demo.min.js: -------------------------------------------------------------------------------- 1 | function cellStyle(e,t,o){var n=["active","success","info","warning","danger"];return o%2===0&&o/2t?1:t>e?-1:0}function nameFormatter(e){return e+' '}function starsFormatter(e){return' '+e}function queryParams(){return{type:"owner",sort:"updated",direction:"desc",per_page:100,page:1}}function buildTable(e,t,o){var n,l,s,a=[],c=[];for(n=0;t>n;n++)a.push({field:"字段"+n,title:"单元"+n});for(n=0;o>n;n++){for(s={},l=0;t>l;l++)s["字段"+l]="Row-"+n+"-"+l;c.push(s)}e.bootstrapTable("destroy").bootstrapTable({columns:a,data:c,iconSize:"outline",icons:{columns:"glyphicon-list"}})}!function(e,t,o){"use strict";!function(){var e=[{Tid:"1",First:"奔波儿灞",sex:"男",Score:"50"},{Tid:"2",First:"灞波儿奔",sex:"男",Score:"94"},{Tid:"3",First:"作家崔成浩",sex:"男",Score:"80"},{Tid:"4",First:"韩寒",sex:"男",Score:"67"},{Tid:"5",First:"郭敬明",sex:"男",Score:"100"},{Tid:"6",First:"马云",sex:"男",Score:"77"},{Tid:"7",First:"范爷",sex:"女",Score:"87"}];o("#exampleTableFromData").bootstrapTable({data:e,height:"250"})}(),function(){o("#exampleTableColumns").bootstrapTable({url:"js/demo/bootstrap_table_test.json",height:"400",iconSize:"outline",showColumns:!0,icons:{refresh:"glyphicon-repeat",toggle:"glyphicon-list-alt",columns:"glyphicon-list"}})}(),buildTable(o("#exampleTableLargeColumns"),50,50),function(){o("#exampleTableToolbar").bootstrapTable({url:"js/demo/bootstrap_table_test2.json",search:!0,showRefresh:!0,showToggle:!0,showColumns:!0,toolbar:"#exampleToolbar",iconSize:"outline",icons:{refresh:"glyphicon-repeat",toggle:"glyphicon-list-alt",columns:"glyphicon-list"}})}(),function(){o("#exampleTableEvents").bootstrapTable({url:"js/demo/bootstrap_table_test.json",search:!0,pagination:!0,showRefresh:!0,showToggle:!0,showColumns:!0,iconSize:"outline",toolbar:"#exampleTableEventsToolbar",icons:{refresh:"glyphicon-repeat",toggle:"glyphicon-list-alt",columns:"glyphicon-list"}});var e=o("#examplebtTableEventsResult");o("#exampleTableEvents").on("all.bs.table",function(e,t,o){console.log("Event:",t,", data:",o)}).on("click-row.bs.table",function(){e.text("Event: click-row.bs.table")}).on("dbl-click-row.bs.table",function(){e.text("Event: dbl-click-row.bs.table")}).on("sort.bs.table",function(){e.text("Event: sort.bs.table")}).on("check.bs.table",function(){e.text("Event: check.bs.table")}).on("uncheck.bs.table",function(){e.text("Event: uncheck.bs.table")}).on("check-all.bs.table",function(){e.text("Event: check-all.bs.table")}).on("uncheck-all.bs.table",function(){e.text("Event: uncheck-all.bs.table")}).on("load-success.bs.table",function(){e.text("Event: load-success.bs.table")}).on("load-error.bs.table",function(){e.text("Event: load-error.bs.table")}).on("column-switch.bs.table",function(){e.text("Event: column-switch.bs.table")}).on("page-change.bs.table",function(){e.text("Event: page-change.bs.table")}).on("search.bs.table",function(){e.text("Event: search.bs.table")})}()}(document,window,jQuery); 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/demo/form-validate-demo.min.js: -------------------------------------------------------------------------------- 1 | $.validator.setDefaults({highlight:function(e){$(e).closest(".form-group").removeClass("has-success").addClass("has-error")},success:function(e){e.closest(".form-group").removeClass("has-error").addClass("has-success")},errorElement:"span",errorPlacement:function(e,r){e.appendTo(r.is(":radio")||r.is(":checkbox")?r.parent().parent().parent():r.parent())},errorClass:"help-block m-b-none",validClass:"help-block m-b-none"}),$().ready(function(){$("#commentForm").validate();var e=" ";$("#signupForm").validate({rules:{firstname:"required",lastname:"required",username:{required:!0,minlength:2},password:{required:!0,minlength:5},confirm_password:{required:!0,minlength:5,equalTo:"#password"},email:{required:!0,email:!0},topic:{required:"#newsletter:checked",minlength:2},agree:"required"},messages:{firstname:e+"请输入你的姓",lastname:e+"请输入您的名字",username:{required:e+"请输入您的用户名",minlength:e+"用户名必须两个字符以上"},password:{required:e+"请输入您的密码",minlength:e+"密码必须5个字符以上"},confirm_password:{required:e+"请再次输入密码",minlength:e+"密码必须5个字符以上",equalTo:e+"两次输入的密码不一致"},email:e+"请输入您的E-mail",agree:{required:e+"必须同意协议后才能注册",element:"#agree-error"}}}),$("#username").focus(function(){var e=$("#firstname").val(),r=$("#lastname").val();e&&r&&!this.value&&(this.value=e+"."+r)})}); 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/demo/layer-demo.min.js: -------------------------------------------------------------------------------- 1 | !function(){var e={htdy:$("html, body")};e.demo1=$("#demo1"),$("#chutiyan>a").on("click",function(){var t=$(this),a=t.index(),r=e.demo1.children("p").eq(a),n=r.position().top;switch(e.demo1.animate({scrollTop:e.demo1.scrollTop()+n},0),a){case 0:var o=-1;!function s(){var e=parent.layer.alert("点击确认更换图标",{icon:o,shadeClose:!0,title:-1===o?"初体验":"icon:"+o},s);8===++o&&layer.close(e)}();break;case 1:var o=0;!function p(){parent.layer.alert("点击确认更换图标",{icon:o,shadeClose:!0,skin:"layer-ext-moon",shift:5,title:-1===o?"第三方扩展皮肤":"icon:"+o},p);9===++o&&parent.layer.confirm("怎么样,是否很喜欢该皮肤,去下载?",{skin:"layer-ext-moon"},function(e,t){t.find(".layui-layer-btn0").attr({href:"http://layer.layui.com/skin.html",target:"_blank"}),parent.layer.close(e)})}();break;case 6:parent.layer.open({type:1,area:["420px","240px"],skin:"layui-layer-rim",content:'
      即直接给content传入html字符
      当内容宽高超过定义宽高,会自动出现滚动条。










      很高兴在下面遇见你
      '});break;case 7:parent.layer.open({type:1,skin:"layui-layer-demo",closeBtn:!1,area:"350px",shift:2,shadeClose:!0,content:'
      即传入skin:"样式名",然后你就可以为所欲为了。
      你怎么样给她整容都行


      我是华丽的酱油==。
      '});break;case 8:layer.tips("Hi,我是tips",this);break;case 11:var i=parent.layer.load(0,{shade:!1});setTimeout(function(){parent.layer.close(i)},5e3);break;case 12:var l=parent.layer.load(1,{shade:[.1,"#fff"]});setTimeout(function(){parent.layer.close(l)},3e3);break;case 13:layer.tips("我是另外一个tips,只不过我长得跟之前那位稍有些不一样。",this,{tips:[1,"#3595CC"],time:4e3});break;case 14:parent.layer.prompt({title:"输入任何口令,并确认",formType:1},function(e){parent.layer.prompt({title:"随便写点啥,并确认",formType:2},function(t){parent.layer.msg("演示完毕!您的口令:"+e+"
      您最后写下了:"+t)})});break;case 15:parent.layer.tab({area:["600px","300px"],tab:[{title:"无题",content:'
      欢迎体验layer.tab
      此时此刻不禁让人吟诗一首:
      一入前端深似海
      从此妹纸是浮云
      以下省略七个字
      。。。。。。。
      ——贤心
      '},{title:"TAB2",content:'
      TAB2该说些啥
      '},{title:"TAB3",content:'
      有一种坚持叫:layer
      '}]});break;case 16:e.photoJSON?layer.photos({photos:e.photoJSON}):$.getJSON("js/demo/photos.json?v=",function(t){e.photoJSON=t,layer.photos({photos:t})});break;default:new Function(r.text())()}})}(); 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/demo/morris-demo.min.js: -------------------------------------------------------------------------------- 1 | $(function(){Morris.Line({element:"morris-one-line-chart",data:[{year:"2008",value:5},{year:"2009",value:10},{year:"2010",value:8},{year:"2011",value:22},{year:"2012",value:8},{year:"2014",value:10},{year:"2015",value:5}],xkey:"year",ykeys:["value"],resize:!0,lineWidth:4,labels:["Value"],lineColors:["#1ab394"],pointSize:5}),Morris.Area({element:"morris-area-chart",data:[{period:"2010 Q1",iphone:2666,ipad:null,itouch:2647},{period:"2010 Q2",iphone:2778,ipad:2294,itouch:2441},{period:"2010 Q3",iphone:4912,ipad:1969,itouch:2501},{period:"2010 Q4",iphone:3767,ipad:3597,itouch:5689},{period:"2011 Q1",iphone:6810,ipad:1914,itouch:2293},{period:"2011 Q2",iphone:5670,ipad:4293,itouch:1881},{period:"2011 Q3",iphone:4820,ipad:3795,itouch:1588},{period:"2011 Q4",iphone:15073,ipad:5967,itouch:5175},{period:"2012 Q1",iphone:10687,ipad:4460,itouch:2028},{period:"2012 Q2",iphone:8432,ipad:5713,itouch:1791}],xkey:"period",ykeys:["iphone","ipad","itouch"],labels:["iPhone","iPad","iPod Touch"],pointSize:2,hideHover:"auto",resize:!0,lineColors:["#87d6c6","#54cdb4","#1ab394"],lineWidth:2,pointSize:1}),Morris.Donut({element:"morris-donut-chart",data:[{label:"A系列",value:12},{label:"B系列",value:30},{label:"C系列",value:20}],resize:!0,colors:["#87d6c6","#54cdb4","#1ab394"]}),Morris.Bar({element:"morris-bar-chart",data:[{y:"2006",a:60,b:50},{y:"2007",a:75,b:65},{y:"2008",a:50,b:40},{y:"2009",a:75,b:65},{y:"2010",a:50,b:40},{y:"2011",a:75,b:65},{y:"2012",a:100,b:90}],xkey:"y",ykeys:["a","b"],labels:["A系列","B系列"],hideHover:"auto",resize:!0,barColors:["#1ab394","#cacaca"]}),Morris.Line({element:"morris-line-chart",data:[{y:"2006",a:100,b:90},{y:"2007",a:75,b:65},{y:"2008",a:50,b:40},{y:"2009",a:75,b:65},{y:"2010",a:50,b:40},{y:"2011",a:75,b:65},{y:"2012",a:100,b:90}],xkey:"y",ykeys:["a","b"],labels:["A系列","B系列"],hideHover:"auto",resize:!0,lineColors:["#54cdb4","#1ab394"]})}); 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/demo/peity-demo.min.js: -------------------------------------------------------------------------------- 1 | $(function(){$("span.pie").peity("pie",{fill:["#1ab394","#d7d7d7","#ffffff"]}),$(".line").peity("line",{fill:"#1ab394",stroke:"#169c81"}),$(".bar").peity("bar",{fill:["#1ab394","#d7d7d7"]}),$(".bar_dashboard").peity("bar",{fill:["#1ab394","#d7d7d7"],width:100});var i=$(".updating-chart").peity("line",{fill:"#1ab394",stroke:"#169c81",width:64});setInterval(function(){var t=Math.round(10*Math.random()),a=i.text().split(",");a.shift(),a.push(t),i.text(a.join(",")).change()},1e3)}); 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/demo/rickshaw-demo.min.js: -------------------------------------------------------------------------------- 1 | $(function(){var e=new Rickshaw.Graph({element:document.querySelector("#chart"),series:[{color:"#1ab394",data:[{x:0,y:40},{x:1,y:49},{x:2,y:38},{x:3,y:30},{x:4,y:32}]}]});e.render();var r=new Rickshaw.Graph({element:document.querySelector("#rickshaw_multi"),renderer:"area",stroke:!0,series:[{data:[{x:0,y:40},{x:1,y:49},{x:2,y:38},{x:3,y:20},{x:4,y:16}],color:"#1ab394",stroke:"#17997f"},{data:[{x:0,y:22},{x:1,y:25},{x:2,y:38},{x:3,y:44},{x:4,y:46}],color:"#eeeeee",stroke:"#d7d7d7"}]});r.renderer.unstack=!0,r.render();var a=new Rickshaw.Graph({element:document.querySelector("#rickshaw_line"),renderer:"line",series:[{data:[{x:0,y:40},{x:1,y:49},{x:2,y:38},{x:3,y:30},{x:4,y:32}],color:"#1ab394"}]});a.render();var y=new Rickshaw.Graph({element:document.querySelector("#rickshaw_multi_line"),renderer:"line",series:[{data:[{x:0,y:40},{x:1,y:49},{x:2,y:38},{x:3,y:30},{x:4,y:32}],color:"#1ab394"},{data:[{x:0,y:20},{x:1,y:24},{x:2,y:19},{x:3,y:15},{x:4,y:16}],color:"#d7d7d7"}]});y.render();var x=new Rickshaw.Graph({element:document.querySelector("#rickshaw_bars"),renderer:"bar",series:[{data:[{x:0,y:40},{x:1,y:49},{x:2,y:38},{x:3,y:30},{x:4,y:32}],color:"#1ab394"}]});x.render();var t=new Rickshaw.Graph({element:document.querySelector("#rickshaw_bars_stacked"),renderer:"bar",series:[{data:[{x:0,y:40},{x:1,y:49},{x:2,y:38},{x:3,y:30},{x:4,y:32}],color:"#1ab394"},{data:[{x:0,y:20},{x:1,y:24},{x:2,y:19},{x:3,y:15},{x:4,y:16}],color:"#d7d7d7"}]});t.render();var c=new Rickshaw.Graph({element:document.querySelector("#rickshaw_scatterplot"),renderer:"scatterplot",stroke:!0,padding:{top:.05,left:.05,right:.05},series:[{data:[{x:0,y:15},{x:1,y:18},{x:2,y:10},{x:3,y:12},{x:4,y:15},{x:5,y:24},{x:6,y:28},{x:7,y:31},{x:8,y:22},{x:9,y:18},{x:10,y:16}],color:"#1ab394"}]});c.render()}); 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/demo/sparkline-demo.min.js: -------------------------------------------------------------------------------- 1 | $(function(){$("#sparkline1").sparkline([34,43,43,35,44,32,44,52,25],{type:"line",lineColor:"#17997f",fillColor:"#1ab394"}),$("#sparkline2").sparkline([5,6,7,2,0,-4,-2,4],{type:"bar",barColor:"#1ab394",negBarColor:"#c6c6c6"}),$("#sparkline3").sparkline([1,1,2],{type:"pie",sliceColors:["#1ab394","#b3b3b3","#e4f0fb"]}),$("#sparkline4").sparkline([34,43,43,35,44,32,15,22,46,33,86,54,73,53,12,53,23,65,23,63,53,42,34,56,76,15,54,23,44],{type:"line",lineColor:"#17997f",fillColor:"#ffffff"}),$("#sparkline5").sparkline([1,1,0,1,-1,-1,1,-1,0,0,1,1],{type:"tristate",posBarColor:"#1ab394",negBarColor:"#bfbfbf"}),$("#sparkline6").sparkline([4,6,7,7,4,3,2,1,4,4,5,6,3,4,5,8,7,6,9,3,2,4,1,5,6,4,3,7],{type:"discrete",lineColor:"#1ab394"}),$("#sparkline7").sparkline([52,12,44],{type:"pie",height:"150px",sliceColors:["#1ab394","#b3b3b3","#e4f0fb"]}),$("#sparkline8").sparkline([5,6,7,2,0,4,2,4,5,7,2,4,12,14,4,2,14,12,7],{type:"bar",barWidth:8,height:"150px",barColor:"#1ab394",negBarColor:"#c6c6c6"}),$("#sparkline9").sparkline([34,43,43,35,44,32,15,22,46,33,86,54,73,53,12,53,23,65,23,63,53,42,34,56,76,15,54,23,44],{type:"line",lineWidth:1,height:"150px",lineColor:"#17997f",fillColor:"#ffffff"})}); 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/demo/treeview-demo.min.js: -------------------------------------------------------------------------------- 1 | $(function(){var e=[{text:"父节点 1",href:"#parent1",tags:["4"],nodes:[{text:"子节点 1",href:"#child1",tags:["2"],nodes:[{text:"孙子节点 1",href:"#grandchild1",tags:["0"]},{text:"孙子节点 2",href:"#grandchild2",tags:["0"]}]},{text:"子节点 2",href:"#child2",tags:["0"]}]},{text:"父节点 2",href:"#parent2",tags:["0"]},{text:"父节点 3",href:"#parent3",tags:["0"]},{text:"父节点 4",href:"#parent4",tags:["0"]},{text:"父节点 5",href:"#parent5",tags:["0"]}],o=[{text:"父节点 1",tags:["2"],nodes:[{text:"子节点 1",tags:["3"],nodes:[{text:"孙子节点 1",tags:["6"]},{text:"孙子节点 2",tags:["3"]}]},{text:"子节点 2",tags:["3"]}]},{text:"父节点 2",tags:["7"]},{text:"父节点 3",icon:"glyphicon glyphicon-earphone",href:"#demo",tags:["11"]},{text:"父节点 4",icon:"glyphicon glyphicon-cloud-download",href:"/demo.html",tags:["19"],selected:!0},{text:"父节点 5",icon:"glyphicon glyphicon-certificate",color:"pink",backColor:"red",href:"http://www.tesco.com",tags:["available","0"]}],t='[{"text": "父节点 1","nodes": [{"text": "子节点 1","nodes": [{"text": "孙子节点 1"},{"text": "孙子节点 2"}]},{"text": "子节点 2"}]},{"text": "父节点 2"},{"text": "父节点 3"},{"text": "父节点 4"},{"text": "父节点 5"}]';$("#treeview1").treeview({data:e}),$("#treeview2").treeview({levels:1,data:e}),$("#treeview3").treeview({levels:99,data:e}),$("#treeview4").treeview({color:"#428bca",data:e}),$("#treeview5").treeview({color:"#428bca",expandIcon:"glyphicon glyphicon-chevron-right",collapseIcon:"glyphicon glyphicon-chevron-down",nodeIcon:"glyphicon glyphicon-bookmark",data:e}),$("#treeview6").treeview({color:"#428bca",expandIcon:"glyphicon glyphicon-stop",collapseIcon:"glyphicon glyphicon-unchecked",nodeIcon:"glyphicon glyphicon-user",showTags:!0,data:e}),$("#treeview7").treeview({color:"#428bca",showBorder:!1,data:e}),$("#treeview8").treeview({expandIcon:"glyphicon glyphicon-stop",collapseIcon:"glyphicon glyphicon-unchecked",nodeIcon:"glyphicon glyphicon-user",color:"yellow",backColor:"purple",onhoverColor:"orange",borderColor:"red",showBorder:!1,showTags:!0,highlightSelected:!0,selectedColor:"yellow",selectedBackColor:"darkorange",data:e}),$("#treeview9").treeview({expandIcon:"glyphicon glyphicon-stop",collapseIcon:"glyphicon glyphicon-unchecked",nodeIcon:"glyphicon glyphicon-user",color:"yellow",backColor:"purple",onhoverColor:"orange",borderColor:"red",showBorder:!1,showTags:!0,highlightSelected:!0,selectedColor:"yellow",selectedBackColor:"darkorange",data:o}),$("#treeview10").treeview({color:"#428bca",enableLinks:!0,data:e}),$("#treeview11").treeview({color:"#428bca",data:e,onNodeSelected:function(e,o){$("#event_output").prepend("

      您单击了 "+o.text+"

      ")}}),$("#treeview12").treeview({data:t})}); 2 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/bootstrap-table/bootstrap-table-mobile.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * bootstrap-table - v1.9.0 - 2015-09-30 3 | * https://github.com/wenzhixin/bootstrap-table 4 | * Copyright (c) 2015 zhixin wen 5 | * Licensed MIT License 6 | */ 7 | !function(a){"use strict";var b=function(b,c){b.options.columnsHidden.length>0&&a.each(b.columns,function(d,e){-1!==b.options.columnsHidden.indexOf(e.field)&&e.visible!==c&&b.toggleColumn(a.fn.bootstrapTable.utils.getFieldIndex(b.columns,e.field),c,!0)})},c=function(a){(a.options.height||a.options.showFooter)&&setTimeout(a.resetView,1)},d=function(a,b,d){a.options.minHeight?b<=a.options.minWidth&&d<=a.options.minHeight?e(a):b>a.options.minWidth&&d>a.options.minHeight&&f(a):b<=a.options.minWidth?e(a):b>a.options.minWidth&&f(a),c(a)},e=function(a){g(a,!1),b(a,!1)},f=function(a){g(a,!0),b(a,!0)},g=function(a,b){a.options.cardView=b,a.toggleView()},h=function(a,b){var c;return function(){var d=this,e=arguments,f=function(){c=null,a.apply(d,e)};clearTimeout(c),c=setTimeout(f,b)}};a.extend(a.fn.bootstrapTable.defaults,{mobileResponsive:!1,minWidth:562,minHeight:void 0,heightThreshold:100,checkOnInit:!0,columnsHidden:[]});var i=a.fn.bootstrapTable.Constructor,j=i.prototype.init;i.prototype.init=function(){if(j.apply(this,Array.prototype.slice.apply(arguments)),this.options.mobileResponsive&&this.options.minWidth){var b=this,c={width:a(window).width(),height:a(window).height()};if(a(window).on("resize orientationchange",h(function(){var e=a(this).height(),f=a(this).width();(Math.abs(c.height-e)>b.options.heightThreshold||c.width!=f)&&(d(b,f,e),c={width:f,height:e})},200)),this.options.checkOnInit){var e=a(window).height(),f=a(window).width();d(this,f,e),c={width:f,height:e}}}}}(jQuery); 8 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * bootstrap-table - v1.9.0 - 2015-09-30 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); 8 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/fancybox/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/fancybox/blank.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/fancybox/fancybox_loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/fancybox/fancybox_loading.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/fancybox/fancybox_loading@2x.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/fancybox/fancybox_loading@2x.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/fancybox/fancybox_overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/fancybox/fancybox_overlay.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/fancybox/fancybox_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/fancybox/fancybox_sprite.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/fancybox/fancybox_sprite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/fancybox/fancybox_sprite@2x.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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); 61 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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/skin/js/plugins/gritter/images/gritter-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/gritter/images/gritter-light.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/gritter/images/gritter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/gritter/images/gritter.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/gritter/images/ie-spacer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/gritter/images/ie-spacer.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/ladda/ladda.jquery.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Ladda for jQuery 3 | * http://lab.hakim.se/ladda 4 | * MIT licensed 5 | * 6 | * Copyright (C) 2015 Hakim El Hattab, http://hakim.se 7 | */ 8 | !function(a,b){if(void 0===b)return console.error("jQuery required for Ladda.jQuery");var c=[];b=b.extend(b,{ladda:function(b){"stopAll"===b&&a.stopAll()}}),b.fn=b.extend(b.fn,{ladda:function(d){var e=c.slice.call(arguments,1);return"bind"===d?(e.unshift(b(this).selector),a.bind.apply(a,e)):b(this).each(function(){var c,f=b(this);void 0===d?f.data("ladda",a.create(this)):(c=f.data("ladda"),c[d].apply(c,e))}),this}})}(this.Ladda,this.jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1.zip -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/demo.html: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | layDate Demo 6 | 7 | 15 | 16 | 17 |
      18 | 演示一: 19 |
      20 |
      21 |
      22 |  @Name:laydate-v 日期控件说明
      23 |  @Author:贤心
      24 |  @Blog:http://sentsin.com
      25 |  @官网:http://sentsin.com/layui/laydate
      26 |  @开发版源码:http://sentsin.com/lily/lib/laydate/laydate.dev.js
      27 | 
      28 | 【注意事项】
      29 | 一、请千万勿移动laydate中的目录结构,它们具有完整的依赖体系。使用时,只需引入laydate/laydate.js即可。
      30 | 二、如果您的网站的js采用合并或模块加载,您需要打开laydate.js,修改path。
      31 | 三、laydate遵循LGPL开源协议,永不收费!
      32 | 四、版权最终解释权:贤心。
      33 | 
      34 | 演示二: 35 |
      36 |
      37 |

      现在,您已经看到了layDate的第一个版本了,路漫漫其修远兮,不管您的网站是否存有别的日期控件,但我相信总有一日您会对layDate情有独钟。

      38 | 使用文档 39 | 皮肤库 40 | 更新日志 41 | 有问必答 42 |
      43 | 44 | 55 | 56 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/layDate官网.url: -------------------------------------------------------------------------------- 1 | [{000214A0-0000-0000-C000-000000000046}] 2 | Prop3=19,2 3 | [InternetShortcut] 4 | URL=http://sentsin.com/layui/laydate/ 5 | IDList= 6 | HotKey=0 7 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/laydate/skins/dahong/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/laydate/skins/dahong/icon.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/laydate/skins/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/laydate/skins/default/icon.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/laydate/skins/molv/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/laydate/skins/molv/icon.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/更新日志.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/laydate-v1.1/更新日志.txt -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate/skins/dahong/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/laydate/skins/dahong/icon.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate/skins/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/laydate/skins/default/icon.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/laydate/skins/molv/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/laydate/skins/molv/icon.png -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/layim/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wustrive2008/jsboot-admin/af4f2fcef1bd546b3be84bef28906496fb7c8e4f/src/main/webapp/static/skin/js/plugins/layer/layim/loading.gif -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/layer/skin/layer.ext.css: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | @Name: layer拓展样式 4 | @Date: 2012.12.13 5 | @Author: 贤心 6 | @blog: sentsin.com 7 | 8 | */.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span{text-overflow:ellipsis;white-space:nowrap}.layui-layer-iconext{background:url(default/icon-ext.png) no-repeat}html #layui_layer_skinlayerextcss{display:none;position:absolute;width:1989px}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:1s;animation-duration:1s;background:url(default/xubox_loading1.gif) center center no-repeat #000}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal} 9 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/markdown/bootstrap-markdown.zh.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Chinese translation for bootstrap-markdown 3 | * benhaile 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/skin/js/plugins/metisMenu/jquery.metisMenu.js: -------------------------------------------------------------------------------- 1 | /* 2 | * metismenu - v2.0.2 3 | * A jQuery menu plugin 4 | * https://github.com/onokumus/metisMenu 5 | * 6 | * Made by Osman Nuri Okumus 7 | * Under MIT License 8 | */ 9 | 10 | !function(a){"use strict";function b(){var a=document.createElement("mm"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}function c(b){return this.each(function(){var c=a(this),d=c.data("mm"),f=a.extend({},e.DEFAULTS,c.data(),"object"==typeof b&&b);d||c.data("mm",d=new e(this,f)),"string"==typeof b&&d[b]()})}a.fn.emulateTransitionEnd=function(b){var c=!1,e=this;a(this).one("mmTransitionEnd",function(){c=!0});var f=function(){c||a(e).trigger(d.end)};return setTimeout(f,b),this};var d=b();d&&(a.event.special.mmTransitionEnd={bindType:d.end,delegateType:d.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}});var e=function(b,c){this.$element=a(b),this.options=a.extend({},e.DEFAULTS,c),this.transitioning=null,this.init()};e.TRANSITION_DURATION=350,e.DEFAULTS={toggle:!0,doubleTapToGo:!1,activeClass:"active"},e.prototype.init=function(){var b=this,c=this.options.activeClass;this.$element.find("li."+c).has("ul").children("ul").addClass("collapse in"),this.$element.find("li").not("."+c).has("ul").children("ul").addClass("collapse"),this.options.doubleTapToGo&&this.$element.find("li."+c).has("ul").children("a").addClass("doubleTapToGo"),this.$element.find("li").has("ul").children("a").on("click.metisMenu",function(d){var e=a(this),f=e.parent("li"),g=f.children("ul");return d.preventDefault(),f.hasClass(c)?b.hide(g):b.show(g),b.options.doubleTapToGo&&b.doubleTapToGo(e)&&"#"!==e.attr("href")&&""!==e.attr("href")?(d.stopPropagation(),void(document.location=e.attr("href"))):void 0})},e.prototype.doubleTapToGo=function(a){var b=this.$element;return a.hasClass("doubleTapToGo")?(a.removeClass("doubleTapToGo"),!0):a.parent().children("ul").length?(b.find(".doubleTapToGo").removeClass("doubleTapToGo"),a.addClass("doubleTapToGo"),!1):void 0},e.prototype.show=function(b){var c=this.options.activeClass,f=a(b),g=f.parent("li");if(!this.transitioning&&!f.hasClass("in")){g.addClass(c),this.options.toggle&&this.hide(g.siblings().children("ul.in")),f.removeClass("collapse").addClass("collapsing").height(0),this.transitioning=1;var h=function(){f.removeClass("collapsing").addClass("collapse in").height(""),this.transitioning=0};return d?void f.one("mmTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(e.TRANSITION_DURATION).height(f[0].scrollHeight):h.call(this)}},e.prototype.hide=function(b){var c=this.options.activeClass,f=a(b);if(!this.transitioning&&f.hasClass("in")){f.parent("li").removeClass(c),f.height(f.height())[0].offsetHeight,f.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var g=function(){this.transitioning=0,f.removeClass("collapsing").addClass("collapse")};return d?void f.height(0).one("mmTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(e.TRANSITION_DURATION):g.call(this)}};var f=a.fn.metisMenu;a.fn.metisMenu=c,a.fn.metisMenu.Constructor=e,a.fn.metisMenu.noConflict=function(){return a.fn.metisMenu=f,this}}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/skin/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/skin/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/skin/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/skin/js/plugins/validate/framework/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FormValidation (http://formvalidation.io) 3 | * The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks 4 | * 5 | * @version v0.6.2-dev, built on 2015-03-13 8:15:46 AM 6 | * @author https://twitter.com/nghuuphuoc 7 | * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc 8 | * @license http://formvalidation.io/license/ 9 | */ 10 | !function(a){FormValidation.Framework.Bootstrap=function(b,c,d){c=a.extend(!0,{button:{selector:'[type="submit"]',disabled:"disabled"},err:{clazz:"help-block",parent:"^(.*)col-(xs|sm|md|lg)-(offset-){0,1}[0-9]+(.*)$"},icon:{valid:null,invalid:null,validating:null,feedback:"form-control-feedback"},row:{selector:".form-group",valid:"has-success",invalid:"has-error",feedback:"has-feedback"}},c),FormValidation.Base.apply(this,[b,c,d])},FormValidation.Framework.Bootstrap.prototype=a.extend({},FormValidation.Base.prototype,{_fixIcon:function(a,b){var c=this._namespace,d=a.attr("type"),e=a.attr("data-"+c+"-field"),f=this.options.fields[e].row||this.options.row.selector,g=a.closest(f);if("checkbox"===d||"radio"===d){var h=a.parent();h.hasClass(d)?b.insertAfter(h):h.parent().hasClass(d)&&b.insertAfter(h.parent())}0===g.find("label").length&&b.addClass("fv-icon-no-label"),0!==g.find(".input-group").length&&b.addClass("fv-bootstrap-icon-input-group").insertAfter(g.find(".input-group").eq(0))},_createTooltip:function(a,b,c){var d=this._namespace,e=a.data(d+".icon");if(e)switch(c){case"popover":e.css({cursor:"pointer","pointer-events":"auto"}).popover("destroy").popover({container:"body",content:b,html:!0,placement:"auto top",trigger:"hover click"});break;case"tooltip":default:e.css({cursor:"pointer","pointer-events":"auto"}).tooltip("destroy").tooltip({container:"body",html:!0,placement:"auto top",title:b})}},_destroyTooltip:function(a,b){var c=this._namespace,d=a.data(c+".icon");if(d)switch(b){case"popover":d.css({cursor:"","pointer-events":"none"}).popover("destroy");break;case"tooltip":default:d.css({cursor:"","pointer-events":"none"}).tooltip("destroy")}},_hideTooltip:function(a,b){var c=this._namespace,d=a.data(c+".icon");if(d)switch(b){case"popover":d.popover("hide");break;case"tooltip":default:d.tooltip("hide")}},_showTooltip:function(a,b){var c=this._namespace,d=a.data(c+".icon");if(d)switch(b){case"popover":d.popover("show");break;case"tooltip":default:d.tooltip("show")}}}),a.fn.bootstrapValidator=function(b){var c=arguments;return this.each(function(){var d=a(this),e=d.data("formValidation")||d.data("bootstrapValidator"),f="object"==typeof b&&b;e||(e=new FormValidation.Framework.Bootstrap(this,a.extend({},{events:{formInit:"init.form.bv",formError:"error.form.bv",formSuccess:"success.form.bv",fieldAdded:"added.field.bv",fieldRemoved:"removed.field.bv",fieldInit:"init.field.bv",fieldError:"error.field.bv",fieldSuccess:"success.field.bv",fieldStatus:"status.field.bv",localeChanged:"changed.locale.bv",validatorError:"error.validator.bv",validatorSuccess:"success.validator.bv"}},f),"bv"),d.addClass("fv-form-bootstrap").data("formValidation",e).data("bootstrapValidator",e)),"string"==typeof b&&e[b].apply(e,Array.prototype.slice.call(c,1))})},a.fn.bootstrapValidator.Constructor=FormValidation.Framework.Bootstrap}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/validate/framework/foundation.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FormValidation (http://formvalidation.io) 3 | * The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks 4 | * 5 | * @version v0.6.2-dev, built on 2015-03-13 8:15:46 AM 6 | * @author https://twitter.com/nghuuphuoc 7 | * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc 8 | * @license http://formvalidation.io/license/ 9 | */ 10 | !function(a){FormValidation.Framework.Foundation=function(b,c){c=a.extend(!0,{button:{selector:'[type="submit"]',disabled:"disabled"},err:{clazz:"error",parent:"^.*((small|medium|large)-[0-9]+)\\s.*(columns).*$"},icon:{valid:null,invalid:null,validating:null,feedback:"fv-control-feedback"},row:{selector:".row",valid:"fv-has-success",invalid:"error",feedback:"fv-has-feedback"}},c),FormValidation.Base.apply(this,[b,c])},FormValidation.Framework.Foundation.prototype=a.extend({},FormValidation.Base.prototype,{_fixIcon:function(a,b){var c=this._namespace,d=a.attr("type"),e=a.attr("data-"+c+"-field"),f=this.options.fields[e].row||this.options.row.selector,g=a.closest(f);if("checkbox"===d||"radio"===d){var h=b.next();h.is("label")&&b.insertAfter(h)}0===g.find("label").length&&b.addClass("fv-icon-no-label")},_createTooltip:function(a,b,c){var d=this,e=a.data("fv.icon");e&&(e.attr("title",b).css({cursor:"pointer"}).off("mouseenter.container.fv focusin.container.fv").on("mouseenter.container.fv",function(){d._showTooltip(a,c)}).off("mouseleave.container.fv focusout.container.fv").on("mouseleave.container.fv focusout.container.fv",function(){d._hideTooltip(a,c)}),Foundation.libs.tooltip.create(e),e.data("fv.foundation.tooltip",e))},_destroyTooltip:function(a){var b=a.data("fv.icon");if(b){b.css({cursor:""});var c=b.data("fv.foundation.tooltip");c&&(c.off(".fndtn.tooltip"),Foundation.libs.tooltip.hide(c),b.removeData("fv.foundation.tooltip"))}},_hideTooltip:function(a){var b=a.data("fv.icon");if(b){b.css({cursor:""});var c=b.data("fv.foundation.tooltip");c&&Foundation.libs.tooltip.hide(c)}},_showTooltip:function(a){var b=a.data("fv.icon");if(b){var c=b.data("fv.foundation.tooltip");c&&(b.css({cursor:"pointer"}),Foundation.libs.tooltip.show(c))}}})}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/validate/framework/pure.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FormValidation (http://formvalidation.io) 3 | * The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks 4 | * 5 | * @version v0.6.2-dev, built on 2015-03-13 8:15:45 AM 6 | * @author https://twitter.com/nghuuphuoc 7 | * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc 8 | * @license http://formvalidation.io/license/ 9 | */ 10 | /** 11 | * This class supports validating Pure framework (http://purecss.io/) 12 | */ 13 | (function($) { 14 | FormValidation.Framework.Pure = function(element, options) { 15 | options = $.extend(true, { 16 | button: { 17 | selector: '[type="submit"]', 18 | // The class of disabled button 19 | // http://purecss.io/buttons/#disabled-buttons 20 | disabled: 'pure-button-disabled' 21 | }, 22 | err: { 23 | clazz: 'fv-help-block', 24 | parent: '^.*pure-control-group.*$' 25 | }, 26 | // Pure doesn't support feedback icon 27 | icon: { 28 | valid: null, 29 | invalid: null, 30 | validating: null, 31 | feedback: 'fv-control-feedback' 32 | }, 33 | row: { 34 | // http://purecss.io/forms/#aligned-form 35 | selector: '.pure-control-group', 36 | valid: 'fv-has-success', 37 | invalid: 'fv-has-error', 38 | feedback: 'fv-has-feedback' 39 | } 40 | }, options); 41 | 42 | FormValidation.Base.apply(this, [element, options]); 43 | }; 44 | 45 | FormValidation.Framework.Pure.prototype = $.extend({}, FormValidation.Base.prototype, { 46 | /** 47 | * Specific framework might need to adjust the icon position 48 | * 49 | * @param {jQuery} $field The field element 50 | * @param {jQuery} $icon The icon element 51 | */ 52 | _fixIcon: function($field, $icon) { 53 | var ns = this._namespace, 54 | type = $field.attr('type'), 55 | field = $field.attr('data-' + ns + '-field'), 56 | row = this.options.fields[field].row || this.options.row.selector, 57 | $parent = $field.closest(row); 58 | 59 | if ($parent.find('label').length === 0) { 60 | $icon.addClass('fv-icon-no-label'); 61 | } 62 | } 63 | }); 64 | }(jQuery)); 65 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/validate/framework/pure.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FormValidation (http://formvalidation.io) 3 | * The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks 4 | * 5 | * @version v0.6.2-dev, built on 2015-03-13 8:15:46 AM 6 | * @author https://twitter.com/nghuuphuoc 7 | * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc 8 | * @license http://formvalidation.io/license/ 9 | */ 10 | !function(a){FormValidation.Framework.Pure=function(b,c){c=a.extend(!0,{button:{selector:'[type="submit"]',disabled:"pure-button-disabled"},err:{clazz:"fv-help-block",parent:"^.*pure-control-group.*$"},icon:{valid:null,invalid:null,validating:null,feedback:"fv-control-feedback"},row:{selector:".pure-control-group",valid:"fv-has-success",invalid:"fv-has-error",feedback:"fv-has-feedback"}},c),FormValidation.Base.apply(this,[b,c])},FormValidation.Framework.Pure.prototype=a.extend({},FormValidation.Base.prototype,{_fixIcon:function(a,b){var c=this._namespace,d=(a.attr("type"),a.attr("data-"+c+"-field")),e=this.options.fields[d].row||this.options.row.selector,f=a.closest(e);0===f.find("label").length&&b.addClass("fv-icon-no-label")}})}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/validate/framework/semantic.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FormValidation (http://formvalidation.io) 3 | * The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks 4 | * 5 | * @version v0.6.2-dev, built on 2015-03-13 8:15:46 AM 6 | * @author https://twitter.com/nghuuphuoc 7 | * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc 8 | * @license http://formvalidation.io/license/ 9 | */ 10 | !function(a){FormValidation.Framework.Semantic=function(b,c){c=a.extend(!0,{button:{selector:'[type="submit"]',disabled:"disabled"},control:{valid:"",invalid:""},err:{clazz:"ui red pointing label transition",parent:"^.*(field|column).*$"},icon:{valid:null,invalid:null,validating:null,feedback:"fv-control-feedback"},row:{selector:".field",valid:"fv-has-success",invalid:"error",feedback:"fv-has-feedback"}},c),FormValidation.Base.apply(this,[b,c])},FormValidation.Framework.Semantic.prototype=a.extend({},FormValidation.Base.prototype,{_fixIcon:function(a,b){var c=a.attr("type");if("checkbox"===c||"radio"===c){var d=a.parent();d.hasClass(c)&&b.insertAfter(d)}},_createTooltip:function(a,b,c){var d=a.data("fv.icon");if(d)switch(d.popup("exists")&&d.popup("remove popup").popup("destroy"),c){case"popover":d.css({cursor:"pointer"}).popup({content:b,position:"top center"});break;case"tooltip":default:d.css({cursor:"pointer"}).popup({content:b,position:"top center",variation:"inverted"})}},_destroyTooltip:function(a){var b=a.data("fv.icon");b&&b.popup("exists")&&b.css({cursor:""}).popup("remove popup").popup("destroy")},_hideTooltip:function(a){var b=a.data("fv.icon");b&&b.popup("hide")},_showTooltip:function(a){var b=a.data("fv.icon");b&&b.popup("show")}})}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/validate/framework/uikit.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FormValidation (http://formvalidation.io) 3 | * The best jQuery plugin to validate form fields. Support Bootstrap, Foundation, Pure, SemanticUI, UIKit and custom frameworks 4 | * 5 | * @version v0.6.2-dev, built on 2015-03-13 8:15:46 AM 6 | * @author https://twitter.com/nghuuphuoc 7 | * @copyright (c) 2013 - 2015 Nguyen Huu Phuoc 8 | * @license http://formvalidation.io/license/ 9 | */ 10 | !function(a){FormValidation.Framework.Uikit=function(b,c){c=a.extend(!0,{button:{selector:'[type="submit"]',disabled:"disabled"},control:{valid:"uk-form-success",invalid:"uk-form-danger"},err:{clazz:"uk-text-danger",parent:"^.*(uk-form-controls|uk-width-[\\d+]-[\\d+]).*$"},icon:{valid:null,invalid:null,validating:null,feedback:"fv-control-feedback"},row:{selector:".uk-form-row",valid:"fv-has-success",invalid:"fv-has-error",feedback:"fv-has-feedback"}},c),FormValidation.Base.apply(this,[b,c])},FormValidation.Framework.Uikit.prototype=a.extend({},FormValidation.Base.prototype,{_fixIcon:function(a,b){var c=this._namespace,d=a.attr("type"),e=a.attr("data-"+c+"-field"),f=this.options.fields[e].row||this.options.row.selector,g=a.closest(f);if("checkbox"===d||"radio"===d){var h=a.parent();h.is("label")&&b.insertAfter(h)}0===g.find("label").length&&b.addClass("fv-icon-no-label")},_createTooltip:function(b,c){var d=b.data("fv.icon");d&&(d.data("tooltip")&&(d.data("tooltip").off(),d.removeData("tooltip")),d.attr("title",c).css({cursor:"pointer"}),new a.UIkit.tooltip(d))},_destroyTooltip:function(a){var b=a.data("fv.icon");if(b){var c=b.data("tooltip");c&&(c.hide(),c.off(),b.off("focus mouseenter").removeData("tooltip")),b.css({cursor:""})}},_hideTooltip:function(a){var b=a.data("fv.icon");if(b){var c=b.data("tooltip");c&&c.hide(),b.css({cursor:""})}},_showTooltip:function(a){var b=a.data("fv.icon");if(b){b.css({cursor:"pointer"});var c=b.data("tooltip");c&&c.show()}}})}(jQuery); -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/plugins/webuploader/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 403 Forbidden 4 | 5 |

      Forbidden

      6 |

      You don't have permission to access /theme/hplus/js/plugins/webuploader/ 7 | on this server.

      8 |
      9 |
      Apache Server at www.zi-han.net Port 80
      10 | 11 | -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/util.js: -------------------------------------------------------------------------------- 1 | function fixMath(m, n, op) { 2 | if(typeof(m) == "undefined"){ 3 | return 0; 4 | } 5 | var a = (m+""); 6 | var b = (n+""); 7 | var x = 1; 8 | var y = 1; 9 | var c = 1; 10 | if(a.indexOf(".")>0) { 11 | x = Math.pow(10, a.length - a.indexOf(".") - 1); 12 | } 13 | if(b.indexOf(".")>0) { 14 | y = Math.pow(10, b.length - b.indexOf(".") - 1); 15 | } 16 | switch(op) 17 | { 18 | case '+': 19 | case '-': 20 | c = Math.max(x,y); 21 | m = Math.round(m*c); 22 | n = Math.round(n*c); 23 | break; 24 | case '*': 25 | c = x*y 26 | m = Math.round(m*x); 27 | n = Math.round(n*y); 28 | break; 29 | case '/': 30 | c = Math.max(x,y); 31 | m = Math.round(m*c); 32 | n = Math.round(n*c); 33 | c = 1; 34 | break; 35 | } 36 | return eval("("+m+op+n+")/"+c); 37 | } -------------------------------------------------------------------------------- /src/main/webapp/static/skin/js/welcome.min.js: -------------------------------------------------------------------------------- 1 | layer.config({extend:["extend/layer.ext.js","skin/moon/style.css"],skin:"layer-ext-moon"}),layer.ready(function(){function e(){parent.layer.open({title:"初见倾心,再见动情",type:1,area:["700px","auto"],content:t,btn:["确定","取消"]})}var t=$("#welcome-template").html();$("a.viewlog").click(function(){return e(),!1}),$("#pay-qrcode").click(function(){var e=$(this).html();parent.layer.open({title:!1,type:1,closeBtn:!1,shadeClose:!0,area:["600px","auto"],content:e})}),console.log("欢迎使用H+,如果您在使用的过程中有碰到问题,可以参考开发文档,感谢您的支持。")}); 2 | --------------------------------------------------------------------------------