├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── src ├── main │ ├── resources │ │ ├── application.properties │ │ ├── static │ │ │ ├── avatars │ │ │ │ ├── Thumbs.db │ │ │ │ ├── avatar.png │ │ │ │ ├── user.jpg │ │ │ │ ├── avatar1.png │ │ │ │ ├── avatar2.png │ │ │ │ ├── avatar3.png │ │ │ │ ├── avatar4.png │ │ │ │ ├── avatar5.png │ │ │ │ └── profile-pic.jpg │ │ │ ├── css │ │ │ │ ├── images │ │ │ │ │ ├── Thumbs.db │ │ │ │ │ └── loading.gif │ │ │ │ ├── jquery-ui-1.10.3.full.min.css │ │ │ │ ├── jquery.gritter.css │ │ │ │ ├── jquery-ui-1.10.3.custom.min.css │ │ │ │ ├── colorpicker.css │ │ │ │ └── bootstrap-timepicker.css │ │ │ ├── bjjoy │ │ │ │ ├── fonts │ │ │ │ │ ├── FontAwesome.otf │ │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ │ ├── fontawesome-webfont.woff2 │ │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ │ │ └── glyphicons-halflings-regular.woff2 │ │ │ │ ├── js │ │ │ │ │ └── zTree │ │ │ │ │ │ ├── ztree.3.5.26.zip │ │ │ │ │ │ ├── .gitattributes │ │ │ │ │ │ └── .gitignore │ │ │ │ └── css │ │ │ │ │ └── zTree │ │ │ │ │ ├── metroStyle │ │ │ │ │ └── img │ │ │ │ │ │ ├── metro.gif │ │ │ │ │ │ ├── metro.png │ │ │ │ │ │ ├── loading.gif │ │ │ │ │ │ └── line_conn.png │ │ │ │ │ ├── zTreeStyle │ │ │ │ │ └── img │ │ │ │ │ │ ├── diy │ │ │ │ │ │ ├── 2.png │ │ │ │ │ │ ├── 3.png │ │ │ │ │ │ ├── 4.png │ │ │ │ │ │ ├── 5.png │ │ │ │ │ │ ├── 6.png │ │ │ │ │ │ ├── 7.png │ │ │ │ │ │ ├── 8.png │ │ │ │ │ │ ├── 9.png │ │ │ │ │ │ ├── 1_open.png │ │ │ │ │ │ └── 1_close.png │ │ │ │ │ │ ├── loading.gif │ │ │ │ │ │ ├── line_conn.gif │ │ │ │ │ │ ├── zTreeStandard.gif │ │ │ │ │ │ └── zTreeStandard.png │ │ │ │ │ └── awesomeStyle │ │ │ │ │ └── img │ │ │ │ │ └── loading.gif │ │ │ ├── images │ │ │ │ └── gallery │ │ │ │ │ ├── image-1.jpg │ │ │ │ │ ├── image-2.jpg │ │ │ │ │ ├── image-3.jpg │ │ │ │ │ ├── image-4.jpg │ │ │ │ │ ├── image-5.jpg │ │ │ │ │ ├── image-6.jpg │ │ │ │ │ ├── thumb-1.jpg │ │ │ │ │ ├── thumb-2.jpg │ │ │ │ │ ├── thumb-3.jpg │ │ │ │ │ ├── thumb-4.jpg │ │ │ │ │ ├── thumb-5.jpg │ │ │ │ │ └── thumb-6.jpg │ │ │ ├── font │ │ │ │ └── fontawesome-webfont.woff │ │ │ ├── plugin │ │ │ │ └── layer │ │ │ │ │ ├── layim │ │ │ │ │ ├── loading.gif │ │ │ │ │ └── data │ │ │ │ │ │ ├── chatlog.json │ │ │ │ │ │ ├── groups.json │ │ │ │ │ │ ├── group.json │ │ │ │ │ │ └── friend.json │ │ │ │ │ ├── skin │ │ │ │ │ ├── default │ │ │ │ │ │ ├── icon.png │ │ │ │ │ │ ├── icon-ext.png │ │ │ │ │ │ ├── icon_ext.png │ │ │ │ │ │ ├── textbg.png │ │ │ │ │ │ ├── loading-0.gif │ │ │ │ │ │ ├── loading-1.gif │ │ │ │ │ │ ├── loading-2.gif │ │ │ │ │ │ ├── xubox_ico0.png │ │ │ │ │ │ ├── xubox_title0.png │ │ │ │ │ │ ├── xubox_loading0.gif │ │ │ │ │ │ ├── xubox_loading1.gif │ │ │ │ │ │ ├── xubox_loading2.gif │ │ │ │ │ │ └── xubox_loading3.gif │ │ │ │ │ ├── moon │ │ │ │ │ │ ├── default.png │ │ │ │ │ │ └── style.css │ │ │ │ │ └── layer.ext.css │ │ │ │ │ └── laydate │ │ │ │ │ └── skins │ │ │ │ │ └── default │ │ │ │ │ ├── icon.png │ │ │ │ │ └── laydate.css │ │ │ └── js │ │ │ │ ├── bootstrap-table │ │ │ │ ├── locale │ │ │ │ │ ├── bootstrap-table-zh-CN.min.js │ │ │ │ │ └── bootstrap-table-zh-CN.js │ │ │ │ └── bootstrap-table-mobile.min.js │ │ │ │ ├── jquery.ui.touch-punch.min.js │ │ │ │ ├── messages_zh.min.js │ │ │ │ ├── jquery.hotkeys.min.js │ │ │ │ ├── flot │ │ │ │ └── jquery.flot.resize.min.js │ │ │ │ ├── fuelux │ │ │ │ ├── fuelux.wizard.min.js │ │ │ │ ├── fuelux.spinner.min.js │ │ │ │ └── fuelux.tree.min.js │ │ │ │ ├── jquery.autosize.min.js │ │ │ │ ├── jquery.easy-pie-chart.min.js │ │ │ │ ├── bootstrap-tag.min.js │ │ │ │ ├── jquery.maskedinput.min.js │ │ │ │ ├── bootstrap-wysiwyg.min.js │ │ │ │ ├── respond.min.js │ │ │ │ ├── jquery.inputlimiter.1.3.1.min.js │ │ │ │ ├── jquery.gritter.min.js │ │ │ │ └── jquery.slimscroll.min.js │ │ ├── templates │ │ │ ├── common.ftl │ │ │ ├── head.ftl │ │ │ ├── role │ │ │ │ ├── add.ftl │ │ │ │ ├── edit.ftl │ │ │ │ └── grant.ftl │ │ │ └── user │ │ │ │ └── grant.ftl │ │ ├── log4j2.xml │ │ ├── mapper │ │ │ └── setting │ │ │ │ ├── RoleMenuMapper.xml │ │ │ │ └── UserRoleMapper.xml │ │ ├── application-dev.properties │ │ └── ehcache.xml │ └── java │ │ └── cn │ │ └── bjjoy │ │ └── bms │ │ ├── util │ │ ├── IdUtils.java │ │ └── DataUtils.java │ │ ├── shiro │ │ ├── freemarker │ │ │ ├── LacksPermissionTag.java │ │ │ ├── HasRoleTag.java │ │ │ ├── HasPermissionTag.java │ │ │ ├── LacksRoleTag.java │ │ │ ├── RoleTag.java │ │ │ ├── ShiroTags.java │ │ │ ├── NotAuthenticatedTag.java │ │ │ ├── PermissionTag.java │ │ │ ├── SecureTag.java │ │ │ ├── GuestTag.java │ │ │ ├── AuthenticatedTag.java │ │ │ ├── UserTag.java │ │ │ └── HasAnyRolesTag.java │ │ ├── ShiroManager.java │ │ ├── MyRealm.java │ │ └── ShiroConfig.java │ │ ├── setting │ │ ├── constants │ │ │ └── UserConstant.java │ │ ├── entity │ │ │ ├── UserRole.java │ │ │ ├── RoleMenu.java │ │ │ ├── User.java │ │ │ ├── Role.java │ │ │ └── Menu.java │ │ ├── dao │ │ │ ├── UserMapper.java │ │ │ ├── RoleMapper.java │ │ │ ├── RoleMenuMapper.java │ │ │ ├── UserRoleMapper.java │ │ │ └── MenuMapper.java │ │ ├── service │ │ │ ├── UserRoleService.java │ │ │ ├── UserService.java │ │ │ ├── MenuService.java │ │ │ ├── impl │ │ │ │ ├── UserRoleServiceImpl.java │ │ │ │ ├── MenuServiceImpl.java │ │ │ │ └── UserServiceImpl.java │ │ │ └── RoleService.java │ │ ├── dto │ │ │ ├── UserRoleDto.java │ │ │ ├── UserDto.java │ │ │ ├── MenuDto.java │ │ │ └── RoleDto.java │ │ ├── vo │ │ │ └── ZtreeView.java │ │ └── controller │ │ │ └── AdminController.java │ │ ├── BmsApplication.java │ │ ├── config │ │ ├── FreeMarkerConfig.java │ │ ├── CommonInterceptor.java │ │ └── WebMvcConfig.java │ │ ├── base │ │ ├── Codes.java │ │ └── ResponseResult.java │ │ └── exception │ │ ├── OperationException.java │ │ └── GlobalExceptionHandler.java └── test │ └── java │ └── cn │ └── bjjoy │ └── bms │ └── BmsApplicationTests.java ├── .gitignore ├── README.md └── pom.xml /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/application.properties -------------------------------------------------------------------------------- /src/main/resources/static/avatars/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/Thumbs.db -------------------------------------------------------------------------------- /src/main/resources/static/avatars/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/avatar.png -------------------------------------------------------------------------------- /src/main/resources/static/avatars/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/user.jpg -------------------------------------------------------------------------------- /src/main/resources/static/avatars/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/avatar1.png -------------------------------------------------------------------------------- /src/main/resources/static/avatars/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/avatar2.png -------------------------------------------------------------------------------- /src/main/resources/static/avatars/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/avatar3.png -------------------------------------------------------------------------------- /src/main/resources/static/avatars/avatar4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/avatar4.png -------------------------------------------------------------------------------- /src/main/resources/static/avatars/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/avatar5.png -------------------------------------------------------------------------------- /src/main/resources/static/css/images/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/css/images/Thumbs.db -------------------------------------------------------------------------------- /src/main/resources/static/avatars/profile-pic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/avatars/profile-pic.jpg -------------------------------------------------------------------------------- /src/main/resources/static/css/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/css/images/loading.gif -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip 2 | -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/image-1.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/image-2.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/image-3.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/image-4.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/image-5.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/image-6.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/thumb-1.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/thumb-2.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/thumb-3.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/thumb-4.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/thumb-5.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/images/gallery/thumb-6.jpg -------------------------------------------------------------------------------- /src/main/resources/static/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/layim/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/layim/loading.gif -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/js/zTree/ztree.3.5.26.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/js/zTree/ztree.3.5.26.zip -------------------------------------------------------------------------------- /src/main/resources/static/css/jquery-ui-1.10.3.full.min.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/css/jquery-ui-1.10.3.full.min.css -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/moon/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/moon/default.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/icon-ext.png -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/icon_ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/icon_ext.png -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/textbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/textbg.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/metroStyle/img/metro.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/metroStyle/img/metro.gif -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/metroStyle/img/metro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/metroStyle/img/metro.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/2.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/3.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/4.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/5.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/6.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/7.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/8.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/9.png -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/loading-0.gif -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/loading-1.gif -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/loading-2.gif -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/xubox_ico0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/xubox_ico0.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/metroStyle/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/metroStyle/img/loading.gif -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/loading.gif -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/laydate/skins/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/laydate/skins/default/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/xubox_title0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/xubox_title0.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/awesomeStyle/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/awesomeStyle/img/loading.gif -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/metroStyle/img/line_conn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/metroStyle/img/line_conn.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/1_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/1_open.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/line_conn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/line_conn.gif -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/xubox_loading0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/xubox_loading0.gif -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/xubox_loading1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/xubox_loading1.gif -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/xubox_loading2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/xubox_loading2.gif -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/skin/default/xubox_loading3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/plugin/layer/skin/default/xubox_loading3.gif -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/1_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/diy/1_close.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/zTreeStandard.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/zTreeStandard.gif -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/zTreeStandard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/css/zTree/zTreeStyle/img/zTreeStandard.png -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bjjoy/bms/HEAD/src/main/resources/static/bjjoy/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/util/IdUtils.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.util; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * 生成id, uuid 7 | */ 8 | public class IdUtils { 9 | 10 | public static String getUuid(){ 11 | return UUID.randomUUID().toString().replace("-",""); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/LacksPermissionTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | /** 4 | *

Equivalent to {@link org.apache.shiro.web.tags.LacksPermissionTag}

5 | */ 6 | public class LacksPermissionTag extends PermissionTag { 7 | protected boolean showTagBody(String p) { 8 | return !isPermitted(p); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/HasRoleTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | /** 4 | *

Equivalent to {@link org.apache.shiro.web.tags.HasRoleTag}

5 | */ 6 | public class HasRoleTag extends RoleTag { 7 | protected boolean showTagBody(String roleName) { 8 | return getSubject() != null && getSubject().hasRole(roleName); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/HasPermissionTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | /** 4 | *

Equivalent to {@link org.apache.shiro.web.tags.HasPermissionTag}

5 | * 6 | * @since 0.1 7 | */ 8 | public class HasPermissionTag extends PermissionTag { 9 | protected boolean showTagBody(String p) { 10 | return isPermitted(p); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bms 后台管理系统 2 | 后台管理系统权限控制,对user、role、menu(通常菜单和按钮)进行增删改查。 3 | springboot+shiro+freemarker+ace admin+mybatis+mysql+java1.8 4 | 5 | ace admin是前端框架(bootstrap,jquery) 6 | 7 | 使用说明 8 | 1. 执行bms_demo.sql,初始化本地数据库 9 | 2. 浏览器启动localhost:8010/admin/login 10 | 3. 用户名admin,密码123456。或到数据库自行查找用户 11 | 12 | 具体图文简介请到下面地址查看 13 | https://blog.csdn.net/bjjoy2009/article/details/80428486 14 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/constants/UserConstant.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.constants; 2 | 3 | /** 4 | * @author bjjoy 5 | * @date 2017/11/25 6 | **/ 7 | public interface UserConstant { 8 | 9 | int LOGIN_PARAM_LACK = 1001; 10 | 11 | String LOGIN_PARAM_LACK_MSG = "请输入用户名和密码"; 12 | 13 | int NO_USER = 1002; 14 | 15 | String NO_USER_MSG = "用户名或密码错误"; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/LacksRoleTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | /** 4 | *

Equivalent to {@link org.apache.shiro.web.tags.LacksRoleTag}

5 | */ 6 | public class LacksRoleTag extends RoleTag { 7 | protected boolean showTagBody(String roleName) { 8 | boolean hasRole = getSubject() != null && getSubject().hasRole(roleName); 9 | return !hasRole; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/test/java/cn/bjjoy/bms/BmsApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.boot.test.context.SpringBootTest; 6 | import org.springframework.test.context.junit4.SpringRunner; 7 | 8 | @RunWith(SpringRunner.class) 9 | @SpringBootTest 10 | public class BmsApplicationTests { 11 | 12 | @Test 13 | public void contextLoads() { 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/entity/UserRole.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | 6 | @Setter 7 | @Getter 8 | public class UserRole { 9 | 10 | private Integer userId; 11 | 12 | private Integer roleId; 13 | 14 | public UserRole(Integer userId, Integer roleId){ 15 | this.userId = userId; 16 | this.roleId = roleId; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/BmsApplication.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms; 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 BmsApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(BmsApplication.class, args); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/js/zTree/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | *.sln merge=union 7 | *.csproj merge=union 8 | *.vbproj merge=union 9 | *.fsproj merge=union 10 | *.dbproj merge=union 11 | 12 | # Standard to msysgit 13 | *.doc diff=astextplain 14 | *.DOC diff=astextplain 15 | *.docx diff=astextplain 16 | *.DOCX diff=astextplain 17 | *.dot diff=astextplain 18 | *.DOT diff=astextplain 19 | *.pdf diff=astextplain 20 | *.PDF diff=astextplain 21 | *.rtf diff=astextplain 22 | *.RTF diff=astextplain 23 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/entity/RoleMenu.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.entity; 2 | 3 | /** 4 | * Created by guoxiaoming on 2017/10/10. 5 | */ 6 | public class RoleMenu { 7 | 8 | private Integer roleId; 9 | 10 | private Integer menuId; 11 | 12 | public Integer getRoleId() { 13 | return roleId; 14 | } 15 | 16 | public void setRoleId(Integer roleId) { 17 | this.roleId = roleId; 18 | } 19 | 20 | public Integer getMenuId() { 21 | return menuId; 22 | } 23 | 24 | public void setMenuId(Integer menuId) { 25 | this.menuId = menuId; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dao/UserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dao; 2 | 3 | import cn.bjjoy.bms.setting.entity.User; 4 | import org.apache.ibatis.annotations.Mapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Mapper 11 | @Repository 12 | public interface UserMapper { 13 | int deleteByUuid(String uuid); 14 | 15 | int insertUser(User user); 16 | 17 | User getById(Integer id); 18 | 19 | int updateById(User user); 20 | 21 | List getList(Map param); 22 | 23 | Integer getCount(Map param); 24 | 25 | User findUserByName(String loginName); 26 | } -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/config/FreeMarkerConfig.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.config; 2 | 3 | import cn.bjjoy.bms.shiro.freemarker.ShiroTags; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import javax.annotation.PostConstruct; 8 | 9 | @Configuration 10 | public class FreeMarkerConfig { 11 | 12 | @Autowired 13 | private freemarker.template.Configuration configuration; 14 | 15 | @PostConstruct 16 | public void setSharedVariable() { 17 | try { 18 | configuration.setSharedVariable("shiro", new ShiroTags()); 19 | } catch (Exception e) { 20 | e.printStackTrace(); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dao/RoleMapper.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dao; 2 | 3 | import cn.bjjoy.bms.setting.entity.Role; 4 | import org.apache.ibatis.annotations.Mapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Mapper 11 | @Repository 12 | public interface RoleMapper { 13 | int deleteById(Integer id); 14 | 15 | int insertRole(Role record); 16 | 17 | Role getById(Integer id); 18 | 19 | int updateById(Role record); 20 | 21 | List getList(); 22 | 23 | /** 24 | * 根据用户id获取角色列表 25 | */ 26 | List getListByUserId(Integer userId); 27 | 28 | int getCount(Map param); 29 | } -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/base/Codes.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.base; 2 | 3 | public enum Codes { 4 | OK(200, "成功"), 5 | SYSTEM_ERROR(600, "系统错误"), 6 | PARAM_ERROR(601, "参数错误"), 7 | ROLE_IS_USED(602, "该角色仍被使用"), 8 | MENU_IS_USED(603, "该资源仍被使用"); 9 | 10 | private int code; 11 | private String msg; 12 | 13 | Codes(int code, String msg){ 14 | this.code = code; 15 | this.msg = msg; 16 | } 17 | 18 | public int getCode() { 19 | return code; 20 | } 21 | 22 | public void setCode(int code) { 23 | this.code = code; 24 | } 25 | 26 | public String getMsg() { 27 | return msg; 28 | } 29 | 30 | public void setMsg(String msg) { 31 | this.msg = msg; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/service/UserRoleService.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.service; 2 | 3 | import cn.bjjoy.bms.setting.dto.UserRoleDto; 4 | import cn.bjjoy.bms.setting.entity.UserRole; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * Created by guoxiaoming on 2017/9/22. 11 | */ 12 | public interface UserRoleService { 13 | 14 | /** 15 | * 新建用户角色关系 16 | */ 17 | int insert(UserRole userRole); 18 | 19 | /** 20 | * 更新用户角色关系 21 | */ 22 | int update(Map param); 23 | 24 | /** 25 | * 删除用户角色关系 26 | */ 27 | int delete(Integer userId); 28 | 29 | /** 30 | * 根据用户uuid获取user_role信息 31 | */ 32 | List getUserRoleList(List userIdList); 33 | } 34 | -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/layim/data/chatlog.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": 1, 3 | "msg": "ok", 4 | "data": [ 5 | { 6 | "id": "100001", 7 | "name": "Beaut-zihan", 8 | "time": "10:23", 9 | "face": "img/a1.jpg" 10 | }, 11 | { 12 | "id": "100002", 13 | "name": "慕容晓晓", 14 | "time": "昨天", 15 | "face": "img/a2.jpg" 16 | }, 17 | { 18 | "id": "1000033", 19 | "name": "乔峰", 20 | "time": "2014-4.22", 21 | "face": "img/a3.jpg" 22 | }, 23 | { 24 | "id": "10000333", 25 | "name": "高圆圆", 26 | "time": "2014-4.21", 27 | "face": "img/a4.jpg" 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /src/main/resources/static/js/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/java/cn/bjjoy/bms/shiro/freemarker/RoleTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | import freemarker.core.Environment; 4 | import freemarker.template.TemplateDirectiveBody; 5 | import freemarker.template.TemplateException; 6 | 7 | import java.io.IOException; 8 | import java.util.Map; 9 | 10 | /** 11 | *

Equivalent to {@link org.apache.shiro.web.tags.RoleTag}

12 | */ 13 | public abstract class RoleTag extends SecureTag { 14 | String getName(Map params) { 15 | return getParam(params, "name"); 16 | } 17 | 18 | @Override 19 | public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { 20 | boolean show = showTagBody(getName(params)); 21 | if (show) { 22 | renderBody(env, body); 23 | } 24 | } 25 | 26 | protected abstract boolean showTagBody(String roleName); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/ShiroTags.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | import freemarker.template.SimpleHash; 4 | 5 | /** 6 | * Shortcut for injecting the tags into Freemarker 7 | * 8 | *

Usage: cfg.setSharedVeriable("shiro", new ShiroTags());

9 | */ 10 | public class ShiroTags extends SimpleHash { 11 | public ShiroTags() { 12 | put("authenticated", new AuthenticatedTag()); 13 | put("guest", new GuestTag()); 14 | put("hasAnyRoles", new HasAnyRolesTag()); 15 | put("hasPermission", new HasPermissionTag()); 16 | put("hasRole", new HasRoleTag()); 17 | put("lacksPermission", new LacksPermissionTag()); 18 | put("lacksRole", new LacksRoleTag()); 19 | put("notAuthenticated", new NotAuthenticatedTag()); 20 | put("principal", new PrincipalTag()); 21 | put("user", new UserTag()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dto/UserRoleDto.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dto; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import lombok.ToString; 6 | 7 | /** 8 | * 9 | * @author bjjoy 10 | * @date 2017/11/02 11 | */ 12 | @Setter 13 | @Getter 14 | @ToString 15 | public class UserRoleDto { 16 | 17 | /** 18 | * Role表角色id 19 | */ 20 | private Integer id; 21 | 22 | /** 23 | * UserRole表角色id 24 | */ 25 | private Integer roleId; 26 | 27 | /** 28 | * UserRole表用户id 29 | */ 30 | private Integer userId; 31 | 32 | /** 33 | * 角色名称 34 | */ 35 | private String name; 36 | 37 | /** 38 | * 英文名称 39 | */ 40 | private String enname; 41 | 42 | /** 43 | * 对应用户是否选中该角色(0否,1是) 44 | */ 45 | private Integer isSelect = 0; 46 | 47 | private String permission; 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dao/RoleMenuMapper.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dao; 2 | 3 | import cn.bjjoy.bms.setting.entity.RoleMenu; 4 | import org.apache.ibatis.annotations.Mapper; 5 | import org.apache.ibatis.annotations.Param; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | * Created by eric on 2017/10/30. 13 | */ 14 | @Repository 15 | @Mapper 16 | public interface RoleMenuMapper { 17 | 18 | /** 19 | * 批量插入角色菜单关系 20 | * @param roleMenuList 21 | * @return 22 | */ 23 | int insertBatch(@Param("roleMenuList") List roleMenuList); 24 | 25 | /** 26 | * 根据roleId删除角色菜单关系 27 | */ 28 | int deleteByRoleId(@Param("roleId") Integer roleId); 29 | 30 | /** 31 | * 获取角色菜单列表 32 | */ 33 | List getList(Map param); 34 | 35 | int getRoleMenuCountByMenuId(Integer menuId); 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dao/UserRoleMapper.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dao; 2 | 3 | import cn.bjjoy.bms.setting.dto.UserRoleDto; 4 | import cn.bjjoy.bms.setting.entity.UserRole; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.springframework.stereotype.Repository; 8 | 9 | import java.util.List; 10 | import java.util.Map; 11 | 12 | /** 13 | * Created by bjjoy on 2017/9/22. 14 | */ 15 | @Mapper 16 | @Repository 17 | public interface UserRoleMapper { 18 | 19 | int insert(UserRole userRole); 20 | 21 | int update(Map param); 22 | 23 | int deleteByUserId(Integer userId); 24 | 25 | /** 26 | * 根据用户id获取user_role信息 27 | */ 28 | List getUserRoleList(@Param("userIdList") List userIdList); 29 | 30 | /** 31 | * 获取可用用户对应角色数量 32 | */ 33 | int getUserRoleCountByRoleId(@Param("roleId") Integer roleId); 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/resources/templates/common.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/service/UserService.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.service; 2 | 3 | import cn.bjjoy.bms.setting.dto.UserDto; 4 | import cn.bjjoy.bms.setting.entity.User; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * Created by bjjoy on 2017/11/02. 11 | */ 12 | public interface UserService { 13 | 14 | /** 15 | * 创建用户 16 | */ 17 | int insert(UserDto userDto); 18 | 19 | /** 20 | * 更新用户 21 | */ 22 | int update(User user); 23 | 24 | /** 25 | * 获取用户列表 26 | */ 27 | List getList(Map param); 28 | 29 | /** 30 | * 获取用户数量 31 | */ 32 | Integer getCount(Map param); 33 | 34 | /** 35 | * 获取用户详情 36 | */ 37 | User getUserDetail(Integer id); 38 | 39 | /** 40 | * 更新用户相关信息 41 | */ 42 | int updateUser(UserDto userDto); 43 | 44 | /** 45 | * 删除用户相关信息(del_flag更新为1) 46 | */ 47 | void deleteUser(User user); 48 | 49 | /** 50 | * 根据用户名查找用户 51 | */ 52 | User findUserByName(String loginName); 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/util/DataUtils.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.util; 2 | 3 | import com.alibaba.fastjson.JSONObject; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * Created by bjjoy on 2017/11/02. 11 | */ 12 | public class DataUtils { 13 | private static final Logger logger = LoggerFactory.getLogger(DataUtils.class); 14 | 15 | /** 16 | * 转化为List 17 | * @param data 18 | * @param clazz 19 | * @param 20 | * @return 21 | */ 22 | public static List getDataArray(Object data, Class clazz) { 23 | String jsonString = JSONObject.toJSONString(data); 24 | return JSONObject.parseArray(jsonString, clazz); 25 | } 26 | 27 | /** 28 | * 转化为T 29 | * @param data 30 | * @param clazz 31 | * @param 32 | * @return 33 | */ 34 | public static T getData(Object data, Class clazz) { 35 | String jsonString = JSONObject.toJSONString(data); 36 | return JSONObject.parseObject(jsonString, clazz); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/config/CommonInterceptor.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.config; 2 | 3 | import org.springframework.stereotype.Component; 4 | import org.springframework.web.servlet.HandlerInterceptor; 5 | import org.springframework.web.servlet.ModelAndView; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | 10 | /** 11 | * Json 统一返回消息类 12 | * @author bjjoy 13 | */ 14 | @Component 15 | public class CommonInterceptor implements HandlerInterceptor { 16 | 17 | @Override 18 | public boolean preHandle(HttpServletRequest request, 19 | HttpServletResponse response, Object handler) throws Exception { 20 | return true; 21 | } 22 | 23 | @Override 24 | public void postHandle(HttpServletRequest request, 25 | HttpServletResponse response, Object handler, 26 | ModelAndView modelAndView) throws Exception { 27 | request.setAttribute("ctx", request.getContextPath()); 28 | } 29 | 30 | @Override 31 | public void afterCompletion(HttpServletRequest request, 32 | HttpServletResponse response, Object handler, Exception ex) 33 | throws Exception { 34 | 35 | } 36 | 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/resources/static/js/jquery.ui.touch-punch.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI Touch Punch 0.2.2 3 | * 4 | * Copyright 2011, Dave Furfero 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * 7 | * Depends: 8 | * jquery.ui.widget.js 9 | * jquery.ui.mouse.js 10 | */ 11 | (function(b){b.support.touch="ontouchend" in document;if(!b.support.touch){return;}var c=b.ui.mouse.prototype,e=c._mouseInit,a;function d(g,h){if(g.originalEvent.touches.length>1){return;}g.preventDefault();var i=g.originalEvent.changedTouches[0],f=document.createEvent("MouseEvents");f.initMouseEvent(h,true,true,window,1,i.screenX,i.screenY,i.clientX,i.clientY,false,false,false,false,0,null);g.target.dispatchEvent(f);}c._touchStart=function(g){var f=this;if(a||!f._mouseCapture(g.originalEvent.changedTouches[0])){return;}a=true;f._touchMoved=false;d(g,"mouseover");d(g,"mousemove");d(g,"mousedown");};c._touchMove=function(f){if(!a){return;}this._touchMoved=true;d(f,"mousemove");};c._touchEnd=function(f){if(!a){return;}d(f,"mouseup");d(f,"mouseout");if(!this._touchMoved){d(f,"click");}a=false;};c._mouseInit=function(){var f=this;f.element.bind("touchstart",b.proxy(f,"_touchStart")).bind("touchmove",b.proxy(f,"_touchMove")).bind("touchend",b.proxy(f,"_touchEnd"));e.call(f);};})(jQuery); -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/service/MenuService.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.service; 2 | 3 | import cn.bjjoy.bms.setting.entity.Menu; 4 | import com.github.pagehelper.PageInfo; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * Created by bjjoy on 2017/11/02. 11 | */ 12 | public interface MenuService { 13 | 14 | // List queryMenuByUser(String userUuid); 15 | 16 | /** 17 | * 新建菜单 18 | * @param menu 19 | */ 20 | int insert(Menu menu); 21 | 22 | PageInfo getPage(Menu menu, Integer pageNumber, Integer pageSize); 23 | 24 | List getList(Menu menu); 25 | 26 | /** 27 | * 获取目录和菜单(type=0,1) 28 | */ 29 | List getMenuList(); 30 | 31 | /** 32 | * 菜单详情 33 | * @param id 34 | */ 35 | Menu getMenu(Integer id); 36 | 37 | /** 38 | * 菜单更新 39 | */ 40 | int update(Menu menu); 41 | 42 | /** 43 | * 菜单删除 44 | */ 45 | int delete(Menu menu); 46 | 47 | /** 48 | * 根据角id获取menu 49 | * @param roleId 50 | */ 51 | List getListByRoleId(Integer roleId); 52 | 53 | /** 54 | * 根据menuId获取role_menu数量 55 | */ 56 | int getRoleMenuCountByMenuId(Integer menuId); 57 | } -------------------------------------------------------------------------------- /src/main/resources/static/js/messages_zh.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery Validation Plugin - v1.13.1 - 10/14/2014 2 | * http://jqueryvalidation.org/ 3 | * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */ 4 | ! function (a) { 5 | "function" == typeof define && define.amd ? define(["jquery", "jquery.validate.min"], a) : a(jQuery) 6 | }(function (a) { 7 | var icon = " "; 8 | a.extend(a.validator.messages, { 9 | required: icon + "必填", 10 | remote: icon + "请修正此栏位", 11 | email: icon + "请输入有效的电子邮件", 12 | url: icon + "请输入有效的网址", 13 | date: icon + "请输入有效的日期", 14 | dateISO: icon + "请输入有效的日期 (YYYY-MM-DD)", 15 | number: icon + "请输入正确的数字", 16 | digits: icon + "只能输入数字", 17 | creditcard: icon + "请输入有效的信用卡号码", 18 | equalTo: icon + "你的输入不相同", 19 | extension: icon + "请输入有效的后缀", 20 | maxlength: a.validator.format(icon + "最多 {0} 个字"), 21 | minlength: a.validator.format(icon + "最少 {0} 个字"), 22 | rangelength: a.validator.format(icon + "请输入长度为 {0} 至 {1} 之间的字串"), 23 | range: a.validator.format(icon + "请输入 {0} 至 {1} 之间的数值"), 24 | max: a.validator.format(icon + "请输入不大于 {0} 的数值"), 25 | min: a.validator.format(icon + "请输入不小于 {0} 的数值") 26 | }) 27 | }); 28 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/exception/OperationException.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.exception; 2 | 3 | /** 4 | * @author bjjoy 5 | * @date 2017/11/15 6 | **/ 7 | public class OperationException extends Exception { 8 | 9 | private int code; 10 | 11 | private String msg; 12 | 13 | /** 14 | * 传入数据,保留现场 15 | */ 16 | private Object data; 17 | 18 | public OperationException(int code, String msg){ 19 | super(msg); 20 | this.code = code; 21 | this.msg = msg; 22 | this.data = null; 23 | } 24 | 25 | public OperationException(int code, String msg, Object data){ 26 | super(msg); 27 | this.code = code; 28 | this.msg = msg; 29 | this.data = data; 30 | } 31 | 32 | public int getCode() { 33 | return code; 34 | } 35 | 36 | public void setCode(int code) { 37 | this.code = code; 38 | } 39 | 40 | public String getMsg() { 41 | return msg; 42 | } 43 | 44 | public void setMsg(String msg) { 45 | this.msg = msg; 46 | } 47 | 48 | public Object getData() { 49 | return data; 50 | } 51 | 52 | public void setData(Object data) { 53 | this.data = data; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dao/MenuMapper.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dao; 2 | 3 | import cn.bjjoy.bms.setting.entity.Menu; 4 | import org.apache.ibatis.annotations.Mapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | @Mapper 11 | @Repository 12 | public interface MenuMapper { 13 | 14 | int deleteById(Integer id); 15 | 16 | int insertMenu(Menu record); 17 | 18 | Menu getById(Integer id); 19 | 20 | int updateById(Menu record); 21 | 22 | /** 23 | * 更新父菜单下所有子菜单信息 24 | * @param parentMenu 25 | * @return 26 | */ 27 | int updateByParentId(Menu parentMenu); 28 | 29 | /** 30 | * 查询用户可见的菜单项 31 | * 32 | * @param userUuid 用户ID 33 | * @return 34 | */ 35 | // List queryMenuByUser(@Param("userUuid") String userUuid); 36 | 37 | /** 38 | * 获取菜单列表 39 | * @param menu 40 | * @return 41 | */ 42 | List getList(Menu menu); 43 | 44 | /** 45 | * 获取目录和菜单(type=0,1) 46 | */ 47 | List getMenuList(); 48 | 49 | /** 50 | * 根据角id获取menu 51 | * @param roleId 52 | */ 53 | List getListByRoleId(Integer roleId); 54 | 55 | } -------------------------------------------------------------------------------- /src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | /logger/ 5 | 6 | 7 | 8 | 9 | utf-8 10 | %d %p %C{1.} [%t] %X %m%n 11 | 12 | 13 | 14 | 15 | utf-8 16 | %d %p %C{1.} [%t] %X %m%n 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/service/impl/UserRoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.service.impl; 2 | 3 | import cn.bjjoy.bms.setting.dto.UserRoleDto; 4 | import cn.bjjoy.bms.setting.dao.UserRoleMapper; 5 | import cn.bjjoy.bms.setting.entity.UserRole; 6 | import cn.bjjoy.bms.setting.service.UserRoleService; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | /** 14 | * Created by bjjoy on 2017/11/02. 15 | */ 16 | @Service 17 | public class UserRoleServiceImpl implements UserRoleService { 18 | 19 | @Autowired 20 | private UserRoleMapper userRoleMapper; 21 | 22 | @Override 23 | public int insert(UserRole userRole){ 24 | return userRoleMapper.insert(userRole); 25 | } 26 | 27 | @Override 28 | public int update(Map param){ 29 | return userRoleMapper.update(param); 30 | } 31 | 32 | @Override 33 | public int delete(Integer userId){ 34 | return userRoleMapper.deleteByUserId(userId); 35 | } 36 | 37 | @Override 38 | public List getUserRoleList(List userIdList){ 39 | return userRoleMapper.getUserRoleList(userIdList); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/vo/ZtreeView.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.vo; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * ztree树 7 | */ 8 | public class ZtreeView implements Serializable{ 9 | 10 | private Integer id; 11 | 12 | private Integer pId; 13 | 14 | private String name; 15 | 16 | private boolean open; 17 | 18 | private boolean checked = false; 19 | 20 | public ZtreeView() { 21 | } 22 | 23 | public ZtreeView(Integer id, Integer pId, String name, boolean open) { 24 | super(); 25 | this.id = id; 26 | this.pId = pId; 27 | this.name = name; 28 | this.open = open; 29 | } 30 | 31 | public Integer getId() { 32 | return id; 33 | } 34 | 35 | public void setId(Integer id) { 36 | this.id = id; 37 | } 38 | 39 | public Integer getpId() { 40 | return pId; 41 | } 42 | 43 | public void setpId(Integer pId) { 44 | this.pId = pId; 45 | } 46 | 47 | public String getName() { 48 | return name; 49 | } 50 | 51 | public void setName(String name) { 52 | this.name = name; 53 | } 54 | 55 | public boolean isOpen() { 56 | return open; 57 | } 58 | 59 | public void setOpen(boolean open) { 60 | this.open = open; 61 | } 62 | 63 | public boolean isChecked() { 64 | return checked; 65 | } 66 | 67 | public void setChecked(boolean checked) { 68 | this.checked = checked; 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /src/main/resources/static/js/bootstrap-table/locale/bootstrap-table-zh-CN.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bootstrap Table Chinese translation 3 | * Author: Zhixin Wen 4 | */ 5 | (function ($) { 6 | 'use strict'; 7 | 8 | $.fn.bootstrapTable.locales['zh-CN'] = { 9 | formatLoadingMessage: function () { 10 | return '正在努力地加载数据中,请稍候……'; 11 | }, 12 | formatRecordsPerPage: function (pageNumber) { 13 | return '每页显示 ' + pageNumber + ' 条记录'; 14 | }, 15 | formatShowingRows: function (pageFrom, pageTo, totalRows) { 16 | return '显示第 ' + pageFrom + ' 到第 ' + pageTo + ' 条记录,总共 ' + totalRows + ' 条记录'; 17 | }, 18 | formatSearch: function () { 19 | return '搜索'; 20 | }, 21 | formatNoMatches: function () { 22 | return '没有找到匹配的记录'; 23 | }, 24 | formatPaginationSwitch: function () { 25 | return '隐藏/显示分页'; 26 | }, 27 | formatRefresh: function () { 28 | return '刷新'; 29 | }, 30 | formatToggle: function () { 31 | return '切换'; 32 | }, 33 | formatColumns: function () { 34 | return '列'; 35 | } 36 | }; 37 | 38 | $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN']); 39 | 40 | })(jQuery); 41 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/NotAuthenticatedTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | import freemarker.core.Environment; 4 | import freemarker.log.Logger; 5 | import freemarker.template.TemplateDirectiveBody; 6 | import freemarker.template.TemplateException; 7 | 8 | import java.io.IOException; 9 | import java.util.Map; 10 | 11 | 12 | /** 13 | * Freemarker tag that renders the tag body only if the current user has not executed a successful authentication 14 | * attempt during their current session. 15 | * 16 | *

The logically opposite tag of this one is the {@link org.apache.shiro.web.tags.AuthenticatedTag}. 17 | * 18 | *

Equivalent to {@link org.apache.shiro.web.tags.NotAuthenticatedTag}

19 | */ 20 | public class NotAuthenticatedTag extends SecureTag { 21 | static final Logger log = Logger.getLogger("NotAuthenticatedTag"); 22 | 23 | @Override 24 | public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { 25 | if (getSubject() == null || !getSubject().isAuthenticated()) { 26 | log.debug("Subject does not exist or is not authenticated. Tag body will be evaluated."); 27 | renderBody(env, body); 28 | } else { 29 | log.debug("Subject exists and is authenticated. Tag body will not be evaluated."); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/layim/data/groups.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": 1, 3 | "msg": "ok", 4 | "data": [ 5 | { 6 | "id": "100001", 7 | "name": "無言的蒁説", 8 | "face": "img/a1.jpg" 9 | }, 10 | { 11 | "id": "100002", 12 | "name": "婷宝奢侈品", 13 | "face": "img/a2.jpg" 14 | }, 15 | { 16 | "id": "100003", 17 | "name": "忆恨思爱", 18 | "face": "img/a3.jpg" 19 | }, 20 | { 21 | "id": "100004", 22 | "name": "天涯奥拓慢", 23 | "face": "img/a4.jpg" 24 | }, 25 | { 26 | "id": "100005", 27 | "name": "雨落无声的天空", 28 | "face": "img/a5.jpg" 29 | }, 30 | { 31 | "id": "100006", 32 | "name": "李越LycorisRadiate", 33 | "face": "img/a6.jpg" 34 | }, 35 | { 36 | "id": "100007", 37 | "name": "冯胖妞张直丑", 38 | "face": "img/a7.jpg" 39 | }, 40 | { 41 | "id": "100008", 42 | "name": "陈龙hmmm", 43 | "face": "img/a8.jpg" 44 | }, 45 | { 46 | "id": "100009", 47 | "name": "别闹哥胆儿小", 48 | "face": "img/a9.jpg" 49 | }, 50 | { 51 | "id": "100010", 52 | "name": "锅锅锅锅萌哒哒 ", 53 | "face": "img/a10.jpg" 54 | } 55 | ] 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/PermissionTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | import freemarker.core.Environment; 4 | import freemarker.template.TemplateDirectiveBody; 5 | import freemarker.template.TemplateException; 6 | import freemarker.template.TemplateModelException; 7 | 8 | import java.io.IOException; 9 | import java.util.Map; 10 | 11 | /** 12 | *

Equivalent to {@link org.apache.shiro.web.tags.PermissionTag}

13 | */ 14 | public abstract class PermissionTag extends SecureTag { 15 | String getName(Map params) { 16 | return getParam(params, "name"); 17 | } 18 | 19 | @Override 20 | protected void verifyParameters(Map params) throws TemplateModelException { 21 | String permission = getName(params); 22 | 23 | if (permission == null || permission.length() == 0) { 24 | throw new TemplateModelException("The 'name' tag attribute must be set."); 25 | } 26 | } 27 | 28 | @Override 29 | public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { 30 | String p = getName(params); 31 | 32 | boolean show = showTagBody(p); 33 | if (show) { 34 | renderBody(env, body); 35 | } 36 | } 37 | 38 | protected boolean isPermitted(String p) { 39 | return getSubject() != null && getSubject().isPermitted(p); 40 | } 41 | 42 | protected abstract boolean showTagBody(String p); 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/SecureTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | import freemarker.core.Environment; 4 | import freemarker.template.*; 5 | import org.apache.shiro.SecurityUtils; 6 | import org.apache.shiro.subject.Subject; 7 | 8 | import java.io.IOException; 9 | import java.util.Map; 10 | 11 | /** 12 | *

Equivalent to {@link org.apache.shiro.web.tags.SecureTag}

13 | */ 14 | public abstract class SecureTag implements TemplateDirectiveModel { 15 | public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { 16 | verifyParameters(params); 17 | render(env, params, body); 18 | } 19 | 20 | public abstract void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException; 21 | 22 | protected String getParam(Map params, String name) { 23 | Object value = params.get(name); 24 | 25 | if (value instanceof SimpleScalar) { 26 | return ((SimpleScalar)value).getAsString(); 27 | } 28 | 29 | return null; 30 | } 31 | 32 | protected Subject getSubject() { 33 | return SecurityUtils.getSubject(); 34 | } 35 | 36 | protected void verifyParameters(Map params) throws TemplateModelException { 37 | } 38 | 39 | protected void renderBody(Environment env, TemplateDirectiveBody body) throws IOException, TemplateException { 40 | if (body != null) { 41 | body.render(env.getOut()); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/exception/GlobalExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.exception; 2 | 3 | import cn.bjjoy.bms.base.Codes; 4 | import cn.bjjoy.bms.base.ResponseResult; 5 | import org.apache.logging.log4j.LogManager; 6 | import org.apache.logging.log4j.Logger; 7 | import org.springframework.web.bind.annotation.ControllerAdvice; 8 | import org.springframework.web.bind.annotation.ExceptionHandler; 9 | import org.springframework.web.bind.annotation.ResponseBody; 10 | import org.springframework.web.servlet.NoHandlerFoundException; 11 | 12 | /** 13 | * @author bjjoy 14 | * @date 2017/11/15 15 | **/ 16 | @ControllerAdvice 17 | public class GlobalExceptionHandler { 18 | 19 | private static final Logger LOGGER = LogManager.getLogger(GlobalExceptionHandler.class); 20 | 21 | @ResponseBody 22 | @ExceptionHandler(value = OperationException.class) 23 | public ResponseResult operationExceptionHandler(OperationException oe){ 24 | LOGGER.error(oe.getData()); 25 | LOGGER.error(oe.getMessage(), oe); 26 | return new ResponseResult(oe.getCode(), oe.getMsg()); 27 | } 28 | 29 | @ResponseBody 30 | @ExceptionHandler(value = NoHandlerFoundException.class) 31 | public ResponseResult noHandlerFoundException(NoHandlerFoundException e){ 32 | LOGGER.error(e.getMessage(), e); 33 | return ResponseResult.error(Codes.SYSTEM_ERROR); 34 | } 35 | 36 | @ResponseBody 37 | @ExceptionHandler(value = Exception.class) 38 | public ResponseResult defaultExceptionHandler(Exception e){ 39 | LOGGER.error(e.getMessage(),e); 40 | return ResponseResult.error(Codes.SYSTEM_ERROR); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/resources/static/js/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/java/cn/bjjoy/bms/setting/service/RoleService.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.service; 2 | 3 | import cn.bjjoy.bms.setting.dto.RoleDto; 4 | import cn.bjjoy.bms.setting.entity.Role; 5 | import com.github.pagehelper.PageInfo; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | * Created by bjjoy on 2017/11/02. 12 | */ 13 | public interface RoleService { 14 | 15 | /** 16 | * 查询用户所拥有的菜单和按钮权限 17 | * @param userUuid 用户ID 18 | * @param permission 权限前缀 19 | */ 20 | // List queryRoleByUser(String userUuid, String permission); 21 | 22 | /** 23 | * 获取角色列表分页 24 | */ 25 | PageInfo getPage(Integer pageNum, Integer pageSize); 26 | 27 | /** 28 | * 获取角色列表 29 | */ 30 | List getList(Map param); 31 | 32 | /** 33 | * 获取角色列表 34 | */ 35 | List getListByUserId(Integer userId); 36 | 37 | /** 38 | * 获取角色列表数量 39 | */ 40 | int getCount(Map param); 41 | 42 | /** 43 | * 角色创建 44 | */ 45 | int create(RoleDto roleDto); 46 | 47 | /** 48 | * 根据id获取角色详情 49 | * @param id 50 | * @return 51 | */ 52 | Map getRole(Integer id); 53 | 54 | Role getRoleById(Integer id); 55 | 56 | /** 57 | * 更新角色信息 58 | */ 59 | int update(RoleDto roleDto); 60 | 61 | /** 62 | * 角色添加资源 63 | */ 64 | int addRoleMenu(RoleDto roleDto); 65 | 66 | /** 67 | * 删除角色信息(更新del_flag) 68 | */ 69 | int delete(Role role); 70 | 71 | /** 72 | * 根据角色id获取可用用户的数量 73 | */ 74 | int getUserRoleCountByRoleId(Integer roleId); 75 | 76 | } 77 | -------------------------------------------------------------------------------- /src/main/resources/mapper/setting/RoleMenuMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | role_id, menu_id 12 | 13 | 14 | 15 | 16 | insert into role_menu (role_id, menu_id) values 17 | 18 | (#{roleMenu.roleId},#{roleMenu.menuId}) 19 | 20 | 21 | 22 | 23 | delete from role_menu where role_id=#{roleId} 24 | 25 | 26 | 40 | 41 | 46 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/GuestTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | import freemarker.core.Environment; 4 | import freemarker.log.Logger; 5 | import freemarker.template.TemplateDirectiveBody; 6 | import freemarker.template.TemplateException; 7 | 8 | import java.io.IOException; 9 | import java.util.Map; 10 | 11 | 12 | /** 13 | * JSP tag that renders the tag body if the current user is not known to the system, either because they 14 | * haven't logged in yet, or because they have no 'RememberMe' identity. 15 | * 16 | *

The logically opposite tag of this one is the {@link UserTag}. Please read that class's JavaDoc as it explains 17 | * more about the differences between Authenticated/Unauthenticated and User/Guest semantic differences. 18 | * 19 | *

Equivalent to {@link org.apache.shiro.web.tags.GuestTag}

20 | * 21 | * @since 0.9 22 | */ 23 | public class GuestTag extends SecureTag { 24 | private static final Logger log = Logger.getLogger("AuthenticatedTag"); 25 | 26 | @Override 27 | public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { 28 | if (getSubject() == null || getSubject().getPrincipal() == null) { 29 | if (log.isDebugEnabled()) { 30 | log.debug("Subject does not exist or does not have a known identity (aka 'principal'). " + 31 | "Tag body will be evaluated."); 32 | } 33 | 34 | renderBody(env, body); 35 | } else { 36 | if (log.isDebugEnabled()) { 37 | log.debug("Subject exists or has a known identity (aka 'principal'). " + 38 | "Tag body will not be evaluated."); 39 | } 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/AuthenticatedTag.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro.freemarker; 2 | 3 | import freemarker.core.Environment; 4 | import freemarker.log.Logger; 5 | import freemarker.template.TemplateDirectiveBody; 6 | import freemarker.template.TemplateException; 7 | 8 | import java.io.IOException; 9 | import java.util.Map; 10 | 11 | 12 | /** 13 | * JSP tag that renders the tag body only if the current user has executed a successful authentication attempt 14 | * during their current session. 15 | * 16 | *

This is more restrictive than the {@link UserTag}, which only 17 | * ensures the current user is known to the system, either via a current login or from Remember Me services, 18 | * which only makes the assumption that the current user is who they say they are, and does not guarantee it like 19 | * this tag does. 20 | * 21 | *

The logically opposite tag of this one is the {@link NotAuthenticatedTag} 22 | * 23 | *

Equivalent to {@link org.apache.shiro.web.tags.AuthenticatedTag}

24 | * 25 | * @since 0.2 26 | */ 27 | public class AuthenticatedTag extends SecureTag { 28 | private static final Logger log = Logger.getLogger("AuthenticatedTag"); 29 | 30 | @Override 31 | public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { 32 | if (getSubject() != null && getSubject().isAuthenticated()) { 33 | if (log.isDebugEnabled()) { 34 | log.debug("Subject exists and is authenticated. Tag body will be evaluated."); 35 | } 36 | 37 | renderBody(env, body); 38 | } else { 39 | if (log.isDebugEnabled()) { 40 | log.debug("Subject does not exist or is not authenticated. Tag body will not be evaluated."); 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/controller/AdminController.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.controller; 2 | 3 | import org.apache.shiro.SecurityUtils; 4 | import org.apache.shiro.authc.AuthenticationException; 5 | import org.apache.shiro.authc.UsernamePasswordToken; 6 | import org.apache.shiro.subject.Subject; 7 | import org.springframework.stereotype.Controller; 8 | import org.springframework.ui.ModelMap; 9 | import org.springframework.web.bind.annotation.*; 10 | 11 | @Controller 12 | @RequestMapping("/admin") 13 | public class AdminController { 14 | 15 | @RequestMapping(value = "/login" , method = RequestMethod.GET) 16 | public String login() { 17 | return "admin/login"; 18 | } 19 | 20 | /** 21 | * 用户登录验证 22 | */ 23 | @RequestMapping(value = "/login", method = RequestMethod.POST) 24 | public String login(@RequestParam("username") String username, 25 | @RequestParam("password") String password, ModelMap model) { 26 | try { 27 | Subject subject = SecurityUtils.getSubject(); 28 | UsernamePasswordToken token = new UsernamePasswordToken(username, password); 29 | subject.login(token); 30 | return redirect("/admin/index"); 31 | } catch (AuthenticationException e) { 32 | model.put("message", e.getMessage()); 33 | } 34 | return "admin/login"; 35 | } 36 | 37 | @RequestMapping(value = "/logout" , method = RequestMethod.GET) 38 | public String logout() { 39 | Subject subject = SecurityUtils.getSubject(); 40 | subject.logout(); 41 | return redirect("admin/login"); 42 | } 43 | 44 | @RequestMapping(value ={"","/index"}, method = RequestMethod.GET) 45 | public String index(){ 46 | return "admin/index"; 47 | } 48 | 49 | /** 50 | * 带参重定向 51 | * 52 | * @param path 53 | * @return 54 | */ 55 | private String redirect(String path) { 56 | return "redirect:" + path; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/resources/static/js/jquery.hotkeys.min.js: -------------------------------------------------------------------------------- 1 | (function(b){b.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",10:"return",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",186:";",191:"/",220:"\\",222:"'",224:"meta"},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"}};function a(d){if(typeof d.data=="undefined"){return}if(typeof d.data==="string"){d.data={keys:d.data}}if(!d.data||!d.data.keys||typeof d.data.keys!=="string"){return}var c=d.handler,e=d.data.keys.toLowerCase().split(" "),f=["text","password","number","email","url","range","date","month","week","time","datetime","datetime-local","search","color","tel"];d.handler=function(k){if(this!==k.target&&(/textarea|select/i.test(k.target.nodeName)||b.inArray(k.target.type,f)>-1)){return}var h=b.hotkeys.specialKeys[k.keyCode],m=(k.type==="keydown"||k.type==="keypress")&&String.fromCharCode(k.which).toLowerCase();modif="",possible={};if(k.altKey&&h!=="alt"){modif+="alt+"}if(k.ctrlKey&&h!=="ctrl"){modif+="ctrl+"}if(k.metaKey&&!k.ctrlKey&&h!=="meta"){modif+="meta+"}if(k.shiftKey&&h!=="shift"){modif+="shift+"}if(h){possible[modif+h]=true}if(m){possible[modif+m]=true;possible[modif+b.hotkeys.shiftNums[m]]=true;if(modif==="shift+"){possible[b.hotkeys.shiftNums[m]]=true}}for(var j=0,g=e.length;jNote: This is less restrictive than the AuthenticatedTag since it only assumes 16 | * the user is who they say they are, either via a current session login or via Remember Me services, which 17 | * makes no guarantee the user is who they say they are. The AuthenticatedTag however 18 | * guarantees that the current user has logged in during their current session, proving they really are 19 | * who they say they are. 20 | * 21 | *

The logically opposite tag of this one is the {@link org.apache.shiro.web.tags.GuestTag}. 22 | * 23 | *

Equivalent to {@link org.apache.shiro.web.tags.UserTag}

24 | */ 25 | public class UserTag extends SecureTag { 26 | static final Logger log = Logger.getLogger("UserTag"); 27 | 28 | @Override 29 | public void render(Environment env, Map params, TemplateDirectiveBody body) throws IOException, TemplateException { 30 | if (getSubject() != null && getSubject().getPrincipal() != null) { 31 | log.debug("Subject has known identity (aka 'principal'). Tag body will be evaluated."); 32 | renderBody(env, body); 33 | } else { 34 | log.debug("Subject does not exist or have a known identity (aka 'principal'). Tag body will not be evaluated."); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/ShiroManager.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro; 2 | 3 | import org.apache.shiro.mgt.DefaultSecurityManager; 4 | import org.apache.shiro.spring.LifecycleBeanPostProcessor; 5 | import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; 6 | import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; 7 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 8 | import org.springframework.context.annotation.Bean; 9 | import org.springframework.context.annotation.DependsOn; 10 | 11 | /** 12 | * Shiro Config Manager. 13 | * 14 | * @author bjjoy 15 | */ 16 | public class ShiroManager { 17 | 18 | /** 19 | * 保证实现了Shiro内部lifecycle函数的bean执行 20 | */ 21 | @Bean(name = "lifecycleBeanPostProcessor") 22 | @ConditionalOnMissingBean 23 | public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { 24 | return new LifecycleBeanPostProcessor(); 25 | } 26 | 27 | @Bean(name = "defaultAdvisorAutoProxyCreator") 28 | @ConditionalOnMissingBean 29 | @DependsOn("lifecycleBeanPostProcessor") 30 | public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { 31 | DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); 32 | defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); 33 | return defaultAdvisorAutoProxyCreator; 34 | 35 | } 36 | 37 | @Bean 38 | @ConditionalOnMissingBean 39 | public AuthorizationAttributeSourceAdvisor getAuthorizationAttributeSourceAdvisor(DefaultSecurityManager securityManager) { 40 | AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); 41 | authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); 42 | return new AuthorizationAttributeSourceAdvisor(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/resources/application-dev.properties: -------------------------------------------------------------------------------- 1 | 2 | spring.datasource.type=com.alibaba.druid.pool.DruidDataSource 3 | spring.datasource.url = jdbc:mysql://127.0.0.1:3306/bms_demo?useUnicode=true&characterEncoding=utf-8 4 | spring.datasource.username = root 5 | spring.datasource.password = root 6 | spring.datasource.driverClassName = com.mysql.jdbc.Driver 7 | 8 | spring.datasource.initialSize=5 9 | spring.datasource.minIdle=5 10 | spring.datasource.maxActive=20 11 | spring.datasource.maxWait=60000 12 | spring.datasource.timeBetweenEvictionRunsMillis=60000 13 | spring.datasource.minEvictableIdleTimeMillis=300000 14 | spring.datasource.validationQuery=SELECT 1 FROM DUAL 15 | spring.datasource.testWhileIdle=true 16 | spring.datasource.testOnBorrow=false 17 | spring.datasource.testOnReturn=false 18 | 19 | # freemarker config 20 | spring.freemarker.allow-request-override=false 21 | spring.freemarker.allow-session-override=false 22 | spring.freemarker.cache=false 23 | spring.freemarker.charset=UTF-8 24 | spring.freemarker.check-template-location=true 25 | spring.freemarker.content-type=text/html 26 | spring.freemarker.enabled=true 27 | spring.freemarker.expose-request-attributes=false 28 | spring.freemarker.expose-session-attributes=false 29 | spring.freemarker.expose-spring-macro-helpers=true 30 | spring.freemarker.prefer-file-system-access=true 31 | spring.freemarker.suffix=.ftl 32 | spring.freemarker.template-loader-path=classpath:/templates/ 33 | spring.freemarker.settings.template_update_delay=0 34 | spring.freemarker.settings.default_encoding=UTF-8 35 | spring.freemarker.settings.classic_compatible=true 36 | spring.freemarker.settings.date_format=yyyy-MM-dd 37 | spring.freemarker.settings.time_format=HH:mm:ss 38 | spring.freemarker.settings.datetime_format=yyyy-MM-dd HH:mm:ss 39 | spring.freemarker.order=1 40 | 41 | # cache 42 | spring.cache.type=EHCACHE 43 | spring.cache.ehcache.config=classpath:ehcache.xml -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/base/ResponseResult.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.base; 2 | 3 | /** 4 | * @author bjjoy 5 | * @date 2018/01/26 6 | */ 7 | public class ResponseResult { 8 | 9 | private Integer code; 10 | 11 | private String msg; 12 | 13 | private Object data; 14 | 15 | public ResponseResult(){ 16 | 17 | } 18 | 19 | public ResponseResult(Integer code, String msg){ 20 | this.code = code; 21 | this.msg = msg; 22 | this.data = ""; 23 | } 24 | 25 | public ResponseResult(Integer code, String msg, Object data){ 26 | this.code = code; 27 | this.msg = msg; 28 | this.data = data; 29 | } 30 | 31 | public ResponseResult(Codes codes, Object data){ 32 | this.code = codes.getCode(); 33 | this.msg = codes.getMsg(); 34 | this.data = data; 35 | } 36 | 37 | public ResponseResult(Codes codes){ 38 | this.code = codes.getCode(); 39 | this.msg = codes.getMsg(); 40 | this.data = ""; 41 | } 42 | 43 | public static ResponseResult ok(Object data){ 44 | return new ResponseResult(Codes.OK, data); 45 | } 46 | 47 | public static ResponseResult error(Codes codes){ 48 | return new ResponseResult(codes); 49 | } 50 | 51 | public static ResponseResult error(){ 52 | return new ResponseResult(Codes.SYSTEM_ERROR); 53 | } 54 | 55 | public Integer getCode() { 56 | return code; 57 | } 58 | 59 | public void setCode(Integer code) { 60 | this.code = code; 61 | } 62 | 63 | public String getMsg() { 64 | return msg; 65 | } 66 | 67 | public void setMsg(String msg) { 68 | this.msg = msg; 69 | } 70 | 71 | public Object getData() { 72 | return data; 73 | } 74 | 75 | public void setData(Object data) { 76 | this.data = data; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/resources/static/js/flot/jquery.flot.resize.min.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 | *//* Inline dependency: 13 | * jQuery resize event - v1.1 - 3/14/2010 14 | * http//benalman.com/projects/jquery-resize-plugin/ 15 | * 16 | * Copyright (c) 2010 "Cowboy" Ben Alman 17 | * Dual licensed under the MIT and GPL licenses. 18 | * http//benalman.com/about/license/ 19 | */(function(e,t,n){function c(){s=t[o](function(){r.each(function(){var t=e(this),n=t.width(),r=t.height(),i=e.data(this,a);(n!==i.w||r!==i.h)&&t.trigger(u,[i.w=n,i.h=r])}),c()},i[f])}var r=e([]),i=e.resize=e.extend(e.resize,{}),s,o="setTimeout",u="resize",a=u+"-special-event",f="delay",l="throttleWindow";i[f]=250,i[l]=!0,e.event.special[u]={setup:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.add(t),e.data(this,a,{w:t.width(),h:t.height()}),r.length===1&&c()},teardown:function(){if(!i[l]&&this[o])return!1;var t=e(this);r=r.not(t),t.removeData(a),r.length||clearTimeout(s)},add:function(t){function s(t,i,s){var o=e(this),u=e.data(this,a);u.w=i!==n?i:o.width(),u.h=s!==n?s:o.height(),r.apply(this,arguments)}if(!i[l]&&this[o])return!1;var r;if(e.isFunction(t))return r=t,s;r=t.handler,t.handler=s}}})(jQuery,this),function(e){function n(e){function t(){var t=e.getPlaceholder();if(t.width()==0||t.height()==0)return;e.resize(),e.setupGrid(),e.draw()}function n(e,n){e.getPlaceholder().resize(t)}function r(e,n){e.getPlaceholder().unbind("resize",t)}e.hooks.bindEvents.push(n),e.hooks.shutdown.push(r)}var t={};e.plot.plugins.push({init:n,options:t,name:"resize",version:"1.0"})}(jQuery); -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/entity/User.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.entity; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import lombok.ToString; 6 | 7 | import java.io.Serializable; 8 | import java.util.Date; 9 | 10 | /** 11 | * @author bjjoy 12 | */ 13 | @Setter 14 | @Getter 15 | @ToString 16 | public class User implements Serializable { 17 | /** 18 | * 编号 19 | */ 20 | private Integer id; 21 | 22 | /** 23 | * 登录名 24 | */ 25 | private String loginName; 26 | 27 | /** 28 | * 密码 29 | */ 30 | private String password; 31 | 32 | /** 33 | * 用户状态 34 | */ 35 | private Integer state; 36 | 37 | /** 38 | * 工号 39 | */ 40 | private String no; 41 | 42 | /** 43 | * 姓名 44 | */ 45 | private String name; 46 | 47 | /** 48 | * 邮箱 49 | */ 50 | private String email; 51 | 52 | /** 53 | * 电话 54 | */ 55 | private String phone; 56 | 57 | /** 58 | * 手机 59 | */ 60 | private String mobile; 61 | 62 | /** 63 | * 用户头像 64 | */ 65 | private String photo; 66 | 67 | /** 68 | * 最后登陆IP 69 | */ 70 | private String loginIp; 71 | 72 | /** 73 | * 最后登陆时间 74 | */ 75 | private Date loginDate; 76 | 77 | /** 78 | * 创建者 79 | */ 80 | private String createBy; 81 | 82 | /** 83 | * 创建时间 84 | */ 85 | private Date createDate; 86 | 87 | /** 88 | * 更新者 89 | */ 90 | private String updateBy; 91 | 92 | /** 93 | * 更新时间 94 | */ 95 | private Date updateDate; 96 | 97 | /** 98 | * 备注信息 99 | */ 100 | private String remarks; 101 | 102 | /** 103 | * 删除标记 104 | */ 105 | private Integer delFlag; 106 | 107 | } -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/freemarker/HasAnyRolesTag.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | package cn.bjjoy.bms.shiro.freemarker; 20 | 21 | import org.apache.shiro.subject.Subject; 22 | 23 | 24 | /** 25 | * Displays body content if the current user has any of the roles specified. 26 | * 27 | *

Equivalent to {@link org.apache.shiro.web.tags.HasAnyRolesTag}

28 | * 29 | * @since 0.2 30 | */ 31 | public class HasAnyRolesTag extends RoleTag { 32 | // Delimeter that separates role names in tag attribute 33 | private static final String ROLE_NAMES_DELIMETER = ","; 34 | 35 | protected boolean showTagBody(String roleNames) { 36 | boolean hasAnyRole = false; 37 | Subject subject = getSubject(); 38 | 39 | if (subject != null) { 40 | // Iterate through roles and check to see if the user has one of the roles 41 | for (String role : roleNames.split(ROLE_NAMES_DELIMETER)) { 42 | if (subject.hasRole(role.trim())) { 43 | hasAnyRole = true; 44 | break; 45 | } 46 | } 47 | } 48 | 49 | return hasAnyRole; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/resources/ehcache.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 11 | 25 | 26 | 37 | 48 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dto/UserDto.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dto; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import lombok.ToString; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | /** 11 | * 12 | * @author bjjoy 13 | * @date 2017/11/01 14 | */ 15 | @Setter 16 | @Getter 17 | @ToString 18 | public class UserDto { 19 | 20 | /** 21 | * 用户id 22 | */ 23 | private Integer id; 24 | 25 | /** 26 | * 登录名 27 | */ 28 | private String loginName; 29 | 30 | /** 31 | * 密码 32 | */ 33 | private String password; 34 | 35 | /** 36 | * 用户状态 37 | */ 38 | private Integer state; 39 | 40 | /** 41 | * 工号 42 | */ 43 | private String no; 44 | 45 | /** 46 | * 姓名 47 | */ 48 | private String name; 49 | 50 | /** 51 | * 邮箱 52 | */ 53 | private String email; 54 | 55 | /** 56 | * 电话 57 | */ 58 | private String phone; 59 | 60 | /** 61 | * 手机 62 | */ 63 | private String mobile; 64 | 65 | /** 66 | * 用户头像 67 | */ 68 | private String photo; 69 | 70 | /** 71 | * 最后登陆IP 72 | */ 73 | private String loginIp; 74 | 75 | /** 76 | * 最后登陆时间 77 | */ 78 | private Date loginDate; 79 | 80 | /** 81 | * 创建者 82 | */ 83 | private String createBy; 84 | 85 | /** 86 | * 创建时间 87 | */ 88 | private String createDate; 89 | 90 | /** 91 | * 更新者 92 | */ 93 | private String updateBy; 94 | 95 | /** 96 | * 更新时间 97 | */ 98 | private String updateDate; 99 | 100 | /** 101 | * 备注信息 102 | */ 103 | private String remarks; 104 | 105 | /** 106 | * 删除标记 107 | */ 108 | private String delFlag; 109 | 110 | /** 111 | * 角色id列表 112 | */ 113 | private List roleIdList; 114 | 115 | /** 116 | * 用户对应的角色列表 117 | */ 118 | private List roleList; 119 | 120 | } 121 | -------------------------------------------------------------------------------- /src/main/resources/templates/head.ftl: -------------------------------------------------------------------------------- 1 | 54 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/service/impl/MenuServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.service.impl; 2 | 3 | import cn.bjjoy.bms.setting.dao.MenuMapper; 4 | import cn.bjjoy.bms.setting.dao.RoleMenuMapper; 5 | import cn.bjjoy.bms.setting.service.MenuService; 6 | import cn.bjjoy.bms.setting.entity.Menu; 7 | import com.github.pagehelper.PageHelper; 8 | import com.github.pagehelper.PageInfo; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Service; 11 | 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | /** 16 | * Created by bjjoy on 2017/11/02. 17 | */ 18 | @Service 19 | public class MenuServiceImpl implements MenuService { 20 | 21 | @Autowired 22 | private MenuMapper menuMapper; 23 | 24 | @Autowired 25 | private RoleMenuMapper roleMenuMapper; 26 | 27 | // @Override 28 | // public List queryMenuByUser(String userUuid){ 29 | // return menuMapper.queryMenuByUser(userUuid); 30 | // } 31 | 32 | @Override 33 | public int insert(Menu menu){ 34 | return menuMapper.insertMenu(menu); 35 | } 36 | 37 | @Override 38 | public PageInfo getPage(Menu menu, Integer pageNumber, Integer pageSize){ 39 | PageHelper.startPage(pageNumber,pageSize); 40 | List menuList= menuMapper.getList(menu); 41 | return new PageInfo<>(menuList); 42 | } 43 | 44 | @Override 45 | public List getList(Menu menu){ 46 | return menuMapper.getList(menu); 47 | } 48 | 49 | @Override 50 | public List getMenuList(){ 51 | return menuMapper.getMenuList(); 52 | } 53 | 54 | @Override 55 | public Menu getMenu(Integer id){ 56 | return menuMapper.getById(id); 57 | } 58 | 59 | @Override 60 | public int update(Menu menu){ 61 | return menuMapper.updateById(menu); 62 | } 63 | 64 | @Override 65 | public int delete(Menu menu){ 66 | //更新del_flag=1 67 | int count = menuMapper.updateById(menu); 68 | 69 | //更新子菜单del_flag=1 70 | count += menuMapper.updateByParentId(menu); 71 | 72 | return count; 73 | } 74 | 75 | public List getListByRoleId(Integer roleId){ 76 | return this.menuMapper.getListByRoleId(roleId); 77 | } 78 | 79 | @Override 80 | public int getRoleMenuCountByMenuId(Integer menuId){ 81 | return roleMenuMapper.getRoleMenuCountByMenuId(menuId); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/resources/static/css/jquery.gritter.css: -------------------------------------------------------------------------------- 1 | /* the norm */ 2 | #gritter-notice-wrapper { 3 | position:fixed; 4 | top:20px; 5 | right:20px; 6 | width:301px; 7 | z-index:9999; 8 | } 9 | #gritter-notice-wrapper.top-left { 10 | left: 20px; 11 | right: auto; 12 | } 13 | #gritter-notice-wrapper.bottom-right { 14 | top: auto; 15 | left: auto; 16 | bottom: 20px; 17 | right: 20px; 18 | } 19 | #gritter-notice-wrapper.bottom-left { 20 | top: auto; 21 | right: auto; 22 | bottom: 20px; 23 | left: 20px; 24 | } 25 | .gritter-item-wrapper { 26 | position:relative; 27 | margin:0 0 10px 0; 28 | background:url('../images/ie-spacer.gif'); /* ie7/8 fix */ 29 | } 30 | .gritter-top { 31 | background:url(../images/gritter.png) no-repeat left -30px; 32 | height:10px; 33 | } 34 | .hover .gritter-top { 35 | background-position:right -30px; 36 | } 37 | .gritter-bottom { 38 | background:url(../images/gritter.png) no-repeat left bottom; 39 | height:8px; 40 | margin:0; 41 | } 42 | .hover .gritter-bottom { 43 | background-position: bottom right; 44 | } 45 | .gritter-item { 46 | display:block; 47 | background:url(../images/gritter.png) no-repeat left -40px; 48 | color:#eee; 49 | padding:2px 11px 8px 11px; 50 | font-size: 11px; 51 | font-family:verdana; 52 | } 53 | .hover .gritter-item { 54 | background-position:right -40px; 55 | } 56 | .gritter-item p { 57 | padding:0; 58 | margin:0; 59 | word-wrap:break-word; 60 | } 61 | .gritter-close { 62 | display:none; 63 | position:absolute; 64 | top:5px; 65 | left:3px; 66 | background:url(../images/gritter.png) no-repeat left top; 67 | cursor:pointer; 68 | width:30px; 69 | height:30px; 70 | } 71 | .gritter-title { 72 | font-size:14px; 73 | font-weight:bold; 74 | padding:0 0 7px 0; 75 | display:block; 76 | text-shadow:1px 1px 0 #000; /* Not supported by IE :( */ 77 | } 78 | .gritter-image { 79 | width:48px; 80 | height:48px; 81 | float:left; 82 | } 83 | .gritter-with-image, 84 | .gritter-without-image { 85 | padding:0; 86 | } 87 | .gritter-with-image { 88 | width:220px; 89 | float:right; 90 | } 91 | /* for the light (white) version of the gritter notice */ 92 | .gritter-light .gritter-item, 93 | .gritter-light .gritter-bottom, 94 | .gritter-light .gritter-top, 95 | .gritter-light .gritter-close { 96 | background-image: url(../images/gritter-light.png); 97 | color: #222; 98 | } 99 | .gritter-light .gritter-title { 100 | text-shadow: none; 101 | } 102 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dto/MenuDto.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dto; 2 | 3 | /** 4 | * @author bjjoy 5 | * @date 2017/11/02. 6 | */ 7 | public class MenuDto { 8 | 9 | private Integer id; 10 | 11 | /** 12 | * 父级ID 13 | */ 14 | private Integer parentId; 15 | 16 | /** 17 | * 名称 18 | */ 19 | private String name; 20 | 21 | /** 22 | * 排序 23 | */ 24 | private Integer sort; 25 | 26 | /** 27 | * 编码 28 | */ 29 | private String code; 30 | 31 | /** 32 | * 图标 33 | */ 34 | private String icon; 35 | 36 | /** 37 | * 类型:0-菜单 1-子菜单 2-按钮 38 | */ 39 | private Integer type; 40 | 41 | /** 42 | * 权限 43 | */ 44 | private String permission; 45 | 46 | /** 47 | * 菜单是否与角色关联 48 | */ 49 | private Integer isSelect=0; 50 | 51 | public Integer getId() { 52 | return id; 53 | } 54 | 55 | public void setId(Integer id) { 56 | this.id = id; 57 | } 58 | 59 | public Integer getParentId() { 60 | return parentId; 61 | } 62 | 63 | public void setParentId(Integer parentId) { 64 | this.parentId = parentId; 65 | } 66 | 67 | public String getName() { 68 | return name; 69 | } 70 | 71 | public void setName(String name) { 72 | this.name = name; 73 | } 74 | 75 | public Integer getSort() { 76 | return sort; 77 | } 78 | 79 | public void setSort(Integer sort) { 80 | this.sort = sort; 81 | } 82 | 83 | public String getCode() { 84 | return code; 85 | } 86 | 87 | public void setCode(String code) { 88 | this.code = code; 89 | } 90 | 91 | public String getPermission() { 92 | return permission; 93 | } 94 | 95 | public void setPermission(String permission) { 96 | this.permission = permission; 97 | } 98 | 99 | public String getIcon() { 100 | return icon; 101 | } 102 | 103 | public void setIcon(String icon) { 104 | this.icon = icon; 105 | } 106 | 107 | public Integer getType() { 108 | return type; 109 | } 110 | 111 | public void setType(Integer type) { 112 | this.type = type; 113 | } 114 | 115 | public Integer getIsSelect() { 116 | return isSelect; 117 | } 118 | 119 | public void setIsSelect(Integer isSelect) { 120 | this.isSelect = isSelect; 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/main/resources/static/css/jquery-ui-1.10.3.custom.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.10.3 - 2013-07-07 2 | * http//jqueryui.com 3 | * Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css 4 | * Copyright 2013 jQuery Foundation and other contributors Licensed MIT */ 5 | 6 | .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} -------------------------------------------------------------------------------- /src/main/resources/static/js/fuelux/fuelux.wizard.min.js: -------------------------------------------------------------------------------- 1 | (function(b,c){var a=function(f,e){var d;this.$element=b(f);this.options=b.extend({},b.fn.wizard.defaults,e);this.currentStep=1;this.numSteps=this.$element.find("li").length;this.$prevBtn=this.$element.find("button.btn-prev");this.$nextBtn=this.$element.find("button.btn-next");d=this.$nextBtn.children().detach();this.nextText=b.trim(this.$nextBtn.text());this.$nextBtn.append(d);this.$prevBtn.on("click",b.proxy(this.previous,this));this.$nextBtn.on("click",b.proxy(this.next,this));this.$element.on("click","li.complete",b.proxy(this.stepclicked,this));this.$stepContainer=this.$element.data("target")||"body";this.$stepContainer=b(this.$stepContainer)};a.prototype={constructor:a,setState:function(){var n=(this.currentStep>1);var o=(this.currentStep===1);var d=(this.currentStep===this.numSteps);this.$prevBtn.attr("disabled",(o===true||n===false));var h=this.$nextBtn.data();if(h&&h.last){this.lastText=h.last;if(typeof this.lastText!=="undefined"){var l=(d!==true)?this.nextText:this.lastText;var f=this.$nextBtn.children().detach();this.$nextBtn.text(l).append(f)}}var j=this.$element.find("li");j.removeClass("active").removeClass("complete");j.find("span.badge").removeClass("badge-info").removeClass("badge-success");var m="li:lt("+(this.currentStep-1)+")";var g=this.$element.find(m);g.addClass("complete");g.find("span.badge").addClass("badge-success");var e="li:eq("+(this.currentStep-1)+")";var k=this.$element.find(e);k.addClass("active");k.find("span.badge").addClass("badge-info");var i=k.data().target;this.$stepContainer.find(".step-pane").removeClass("active");b(i).addClass("active");this.$element.trigger("changed")},stepclicked:function(h){var d=b(h.currentTarget);var g=this.$element.find("li").index(d);var f=b.Event("stepclick");this.$element.trigger(f,{step:g+1});if(f.isDefaultPrevented()){return}this.currentStep=(g+1);this.setState()},previous:function(){var d=(this.currentStep>1);if(d){var f=b.Event("change");this.$element.trigger(f,{step:this.currentStep,direction:"previous"});if(f.isDefaultPrevented()){return}this.currentStep-=1;this.setState()}},next:function(){var g=(this.currentStep+1<=this.numSteps);var d=(this.currentStep===this.numSteps);if(g){var f=b.Event("change");this.$element.trigger(f,{step:this.currentStep,direction:"next"});if(f.isDefaultPrevented()){return}this.currentStep+=1;this.setState()}else{if(d){this.$element.trigger("finished")}}},selectedItem:function(d){return{step:this.currentStep}}};b.fn.wizard=function(e,g){var f;var d=this.each(function(){var j=b(this);var i=j.data("wizard");var h=typeof e==="object"&&e;if(!i){j.data("wizard",(i=new a(this,h)))}if(typeof e==="string"){f=i[e](g)}});return(f===c)?d:f};b.fn.wizard.defaults={};b.fn.wizard.Constructor=a;b(function(){b("body").on("mousedown.wizard.data-api",".wizard",function(){var d=b(this);if(d.data("wizard")){return}d.wizard(d.data())})})})(window.jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/bjjoy/js/zTree/.gitignore: -------------------------------------------------------------------------------- 1 | ################# 2 | ## Eclipse 3 | ################# 4 | 5 | *.pydevproject 6 | .project 7 | .metadata 8 | bin/ 9 | tmp/ 10 | *.tmp 11 | *.bak 12 | *.swp 13 | *~.nib 14 | local.properties 15 | .classpath 16 | .settings/ 17 | .loadpath 18 | 19 | # External tool builders 20 | .externalToolBuilders/ 21 | 22 | # Locally stored "Eclipse launch configurations" 23 | *.launch 24 | 25 | # CDT-specific 26 | .cproject 27 | 28 | # PDT-specific 29 | .buildpath 30 | 31 | 32 | ################# 33 | ## Visual Studio 34 | ################# 35 | 36 | ## Ignore Visual Studio temporary files, build results, and 37 | ## files generated by popular Visual Studio add-ons. 38 | 39 | # User-specific files 40 | *.suo 41 | *.user 42 | *.sln.docstates 43 | 44 | # Build results 45 | [Dd]ebug/ 46 | [Rr]elease/ 47 | *_i.c 48 | *_p.c 49 | *.ilk 50 | *.meta 51 | *.obj 52 | *.pch 53 | *.pdb 54 | *.pgc 55 | *.pgd 56 | *.rsp 57 | *.sbr 58 | *.tlb 59 | *.tli 60 | *.tlh 61 | *.tmp 62 | *.vspscc 63 | .builds 64 | *.dotCover 65 | 66 | ## TODO: If you have NuGet Package Restore enabled, uncomment this 67 | #packages/ 68 | 69 | # Visual C++ cache files 70 | ipch/ 71 | *.aps 72 | *.ncb 73 | *.opensdf 74 | *.sdf 75 | 76 | # Visual Studio profiler 77 | *.psess 78 | *.vsp 79 | 80 | # ReSharper is a .NET coding add-in 81 | _ReSharper* 82 | 83 | # Installshield output folder 84 | [Ee]xpress 85 | 86 | # DocProject is a documentation generator add-in 87 | DocProject/buildhelp/ 88 | DocProject/Help/*.HxT 89 | DocProject/Help/*.HxC 90 | DocProject/Help/*.hhc 91 | DocProject/Help/*.hhk 92 | DocProject/Help/*.hhp 93 | DocProject/Help/Html2 94 | DocProject/Help/html 95 | 96 | # Click-Once directory 97 | publish 98 | 99 | # Others 100 | [Bb]in 101 | [Oo]bj 102 | sql 103 | TestResults 104 | *.Cache 105 | ClientBin 106 | stylecop.* 107 | ~$* 108 | *.dbmdl 109 | Generated_Code #added for RIA/Silverlight projects 110 | 111 | # Backup & report files from converting an old project file to a newer 112 | # Visual Studio version. Backup files are not needed, because we have git ;-) 113 | _UpgradeReport_Files/ 114 | Backup*/ 115 | UpgradeLog*.XML 116 | 117 | 118 | 119 | ############ 120 | ## Windows 121 | ############ 122 | 123 | # Windows image file caches 124 | Thumbs.db 125 | 126 | # Folder config file 127 | Desktop.ini 128 | 129 | 130 | ############# 131 | ## Python 132 | ############# 133 | 134 | *.py[co] 135 | 136 | # Packages 137 | *.egg 138 | *.egg-info 139 | dist 140 | build 141 | eggs 142 | parts 143 | bin 144 | var 145 | sdist 146 | develop-eggs 147 | .installed.cfg 148 | 149 | # Installer logs 150 | pip-log.txt 151 | 152 | # Unit test / coverage reports 153 | .coverage 154 | .tox 155 | 156 | #Translations 157 | *.mo 158 | 159 | #Mr Developer 160 | .mr.developer.cfg 161 | 162 | # Mac crap 163 | .DS_Store 164 | -------------------------------------------------------------------------------- /src/main/resources/static/plugin/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/resources/mapper/setting/UserRoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | user_id, role_id 12 | 13 | 14 | 15 | 16 | insert into user_role 17 | 18 | 19 | user_id, 20 | 21 | 22 | role_id 23 | 24 | 25 | 26 | 27 | #{userId,jdbcType=INTEGER}, 28 | 29 | 30 | #{roleId,jdbcType=INTEGER} 31 | 32 | 33 | 34 | 35 | 36 | delete from user_role where user_id=#{userId} 37 | 38 | 39 | 40 | update user_role 41 | 42 | 43 | user_id = #{userId,jdbcType=INTEGER}, 44 | 45 | 46 | role_id = #{roleId,jdbcType=INTEGER} 47 | 48 | 49 | where user_id = #{userId,jdbcType=INTEGER} 50 | 51 | 52 | 53 | 54 | 55 | 56 | 69 | 70 | 82 | -------------------------------------------------------------------------------- /src/main/resources/static/js/fuelux/fuelux.spinner.min.js: -------------------------------------------------------------------------------- 1 | (function(b,c){var a=function(e,d){this.$element=b(e);this.options=b.extend({},b.fn.spinner.defaults,d);this.$input=this.$element.find(".spinner-input");this.$element.on("keyup",this.$input,b.proxy(this.change,this));if(this.options.hold){this.$element.on("mousedown",".spinner-up",b.proxy(function(){this.startSpin(true)},this));this.$element.on("mouseup",".spinner-up, .spinner-down",b.proxy(this.stopSpin,this));this.$element.on("mouseout",".spinner-up, .spinner-down",b.proxy(this.stopSpin,this));this.$element.on("mousedown",".spinner-down",b.proxy(function(){this.startSpin(false)},this))}else{this.$element.on("click",".spinner-up",b.proxy(function(){this.step(true)},this));this.$element.on("click",".spinner-down",b.proxy(function(){this.step(false)},this))}this.switches={count:1,enabled:true};if(this.options.speed==="medium"){this.switches.speed=300}else{if(this.options.speed==="fast"){this.switches.speed=100}else{this.switches.speed=500}}this.lastValue=null;this.render();if(this.options.disabled){this.disable()}};a.prototype={constructor:a,render:function(){this.$input.val(this.options.value);this.$input.attr("maxlength",(this.options.max+"").split("").length)},change:function(){var d=this.$input.val();if(d/1){this.options.value=d/1}else{d=d.replace(/[^0-9]/g,"");this.$input.val(d);this.options.value=d/1}this.triggerChangedEvent()},stopSpin:function(){clearTimeout(this.switches.timeout);this.switches.count=1;this.triggerChangedEvent()},triggerChangedEvent:function(){var d=this.value();if(d===this.lastValue){return}this.lastValue=d;this.$element.trigger("changed",d);this.$element.trigger("change")},startSpin:function(d){if(!this.options.disabled){var e=this.switches.count;if(e===1){this.step(d);e=1}else{if(e<3){e=1.5}else{if(e<8){e=2.5}else{e=4}}}this.switches.timeout=setTimeout(b.proxy(function(){this.iterator(d)},this),this.switches.speed/e);this.switches.count++}},iterator:function(d){this.step(d);this.startSpin(d)},step:function(e){var g=this.options.value;var f=e?this.options.max:this.options.min;if((e?gf)){var d=g+(e?1:-1)*this.options.step;if(e?d>f:d',n=["fontFamily","fontSize","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent"],s=e(i).data("autosize",!0)[0];s.style.lineHeight="99px","99px"===e(s).css("lineHeight")&&n.push("lineHeight"),s.style.lineHeight="",e.fn.autosize=function(i){return i=e.extend({},o,i||{}),s.parentNode!==document.body&&e(document.body).append(s),this.each(function(){function o(){var t,o;"getComputedStyle"in window?(t=window.getComputedStyle(h),o=h.getBoundingClientRect().width,e.each(["paddingLeft","paddingRight","borderLeftWidth","borderRightWidth"],function(e,i){o-=parseInt(t[i],10)}),s.style.width=o+"px"):s.style.width=Math.max(p.width(),0)+"px"}function a(){var a={};if(t=h,s.className=i.className,d=parseInt(p.css("maxHeight"),10),e.each(n,function(e,t){a[t]=p.css(t)}),e(s).css(a),o(),window.chrome){var r=h.style.width;h.style.width="0px",h.offsetWidth,h.style.width=r}}function r(){var e,n;t!==h?a():o(),s.value=h.value+i.append,s.style.overflowY=h.style.overflowY,n=parseInt(h.style.height,10),s.scrollTop=0,s.scrollTop=9e4,e=s.scrollTop,d&&e>d?(h.style.overflowY="scroll",e=d):(h.style.overflowY="hidden",c>e&&(e=c)),e+=f,n!==e&&(h.style.height=e+"px",w&&i.callback.call(h,h))}function l(){clearTimeout(u),u=setTimeout(function(){var e=p.width();e!==y&&(y=e,r())},parseInt(i.resizeDelay,10))}var d,c,u,h=this,p=e(h),f=0,w=e.isFunction(i.callback),z={height:h.style.height,overflow:h.style.overflow,overflowY:h.style.overflowY,wordWrap:h.style.wordWrap,resize:h.style.resize},y=p.width();p.data("autosize")||(p.data("autosize",!0),("border-box"===p.css("box-sizing")||"border-box"===p.css("-moz-box-sizing")||"border-box"===p.css("-webkit-box-sizing"))&&(f=p.outerHeight()-p.height()),c=Math.max(parseInt(p.css("minHeight"),10)-f||0,p.height()),p.css({overflow:"hidden",overflowY:"hidden",wordWrap:"break-word",resize:"none"===p.css("resize")||"vertical"===p.css("resize")?"none":"horizontal"}),"onpropertychange"in h?"oninput"in h?p.on("input.autosize keyup.autosize",r):p.on("propertychange.autosize",function(){"value"===event.propertyName&&r()}):p.on("input.autosize",r),i.resizeDelay!==!1&&e(window).on("resize.autosize",l),p.on("autosize.resize",r),p.on("autosize.resizeIncludeStyle",function(){t=null,r()}),p.on("autosize.destroy",function(){t=null,clearTimeout(u),e(window).off("resize",l),p.off("autosize").off(".autosize").css(z).removeData("autosize")}),r())})}}); -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/MyRealm.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro; 2 | 3 | import cn.bjjoy.bms.setting.entity.Menu; 4 | import cn.bjjoy.bms.setting.entity.Role; 5 | import cn.bjjoy.bms.setting.entity.User; 6 | import cn.bjjoy.bms.setting.service.MenuService; 7 | import cn.bjjoy.bms.setting.service.RoleService; 8 | import cn.bjjoy.bms.setting.service.UserService; 9 | import cn.bjjoy.bms.util.EncryptUtils; 10 | import org.apache.shiro.authc.*; 11 | import org.apache.shiro.authc.credential.AllowAllCredentialsMatcher; 12 | import org.apache.shiro.authz.AuthorizationInfo; 13 | import org.apache.shiro.authz.SimpleAuthorizationInfo; 14 | import org.apache.shiro.realm.AuthorizingRealm; 15 | import org.apache.shiro.subject.PrincipalCollection; 16 | import org.springframework.beans.factory.annotation.Autowired; 17 | import org.springframework.stereotype.Component; 18 | 19 | import java.util.HashSet; 20 | import java.util.List; 21 | import java.util.Set; 22 | 23 | /** 24 | * @author bjjoy 25 | */ 26 | @Component 27 | public class MyRealm extends AuthorizingRealm { 28 | 29 | public MyRealm(){ 30 | super(new AllowAllCredentialsMatcher()); 31 | setAuthenticationTokenClass(UsernamePasswordToken.class); 32 | 33 | //FIXME: 暂时禁用Cache 34 | setCachingEnabled(false); 35 | } 36 | 37 | @Autowired 38 | private UserService userService; 39 | 40 | @Autowired 41 | private RoleService roleService; 42 | 43 | @Autowired 44 | private MenuService menuService; 45 | 46 | @Override 47 | protected AuthorizationInfo doGetAuthorizationInfo( 48 | PrincipalCollection principals) { 49 | User user = (User) principals.getPrimaryPrincipal(); 50 | SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); 51 | User dbUser = userService.findUserByName(user.getLoginName()); 52 | List roleList = roleService.getListByUserId(user.getId()); 53 | Set shiroPermissions = new HashSet<>(); 54 | Set roleSet = new HashSet(); 55 | for (Role role : roleList) { 56 | List menus = menuService.getListByRoleId(role.getId()); 57 | for (Menu menu : menus) { 58 | shiroPermissions.add(menu.getPermission()); 59 | 60 | } 61 | roleSet.add(role.getEnname()); 62 | } 63 | authorizationInfo.setRoles(roleSet); 64 | authorizationInfo.setStringPermissions(shiroPermissions); 65 | return authorizationInfo; 66 | } 67 | 68 | @Override 69 | protected AuthenticationInfo doGetAuthenticationInfo( 70 | AuthenticationToken token) throws AuthenticationException { 71 | String loginName = (String) token.getPrincipal(); 72 | 73 | User user = userService.findUserByName(loginName); 74 | 75 | String password = new String((char[]) token.getCredentials()); 76 | 77 | // 账号不存在 78 | if (user == null) { 79 | throw new UnknownAccountException("账号或密码不正确"); 80 | } 81 | // 密码错误 82 | if (!EncryptUtils.encryptMD5(password).equals(user.getPassword())) { 83 | throw new IncorrectCredentialsException("账号或密码不正确"); 84 | } 85 | // 账号锁定 86 | if (user.getState() == 0) { 87 | throw new LockedAccountException("账号已被锁定,请联系管理员"); 88 | } 89 | 90 | SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName()); 91 | 92 | return info; 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /src/main/resources/static/js/fuelux/fuelux.tree.min.js: -------------------------------------------------------------------------------- 1 | (function(a,c){var b=function(e,d){this.$element=a(e);this.options=a.extend({},a.fn.tree.defaults,d);this.$element.on("click",".tree-item",a.proxy(function(f){this.selectItem(f.currentTarget)},this));this.$element.on("click",".tree-folder-header",a.proxy(function(f){this.selectFolder(f.currentTarget)},this));this.render()};b.prototype={constructor:b,render:function(){this.populate(this.$element)},populate:function(f){var e=this;var d=f.parent().find(".tree-loader:eq(0)");d.show();this.options.dataSource.data(f.data(),function(g){d.hide();a.each(g.data,function(h,j){var i;if(j.type==="folder"){i=e.$element.find(".tree-folder:eq(0)").clone().show();i.find(".tree-folder-name").html(j.name);i.find(".tree-loader").html(e.options.loadingHTML);var k=i.find(".tree-folder-header");k.data(j);if("icon-class" in j){k.find('[class*="icon-"]').addClass(j["icon-class"])}}else{if(j.type==="item"){i=e.$element.find(".tree-item:eq(0)").clone().show();i.find(".tree-item-name").html(j.name);i.data(j);if("additionalParameters" in j&&"item-selected" in j.additionalParameters&&j.additionalParameters["item-selected"]==true){i.addClass("tree-selected");i.find("i").removeClass(e.options["unselected-icon"]).addClass(e.options["selected-icon"])}}}if(f.hasClass("tree-folder-header")){f.parent().find(".tree-folder-content:eq(0)").append(i)}else{f.append(i)}});e.$element.trigger("loaded")})},selectItem:function(e){if(this.options.selectable==false){return}var d=a(e);var g=this.$element.find(".tree-selected");var f=[];if(this.options.multiSelect){a.each(g,function(i,j){var h=a(j);if(h[0]!==d[0]){f.push(a(j).data())}})}else{if(g[0]!==d[0]){g.removeClass("tree-selected").find("i").removeClass(this.options["selected-icon"]).addClass(this.options["unselected-icon"]);f.push(d.data())}}if(d.hasClass("tree-selected")){d.removeClass("tree-selected");d.find("i").removeClass(this.options["selected-icon"]).addClass(this.options["unselected-icon"])}else{d.addClass("tree-selected");d.find("i").removeClass(this.options["unselected-icon"]).addClass(this.options["selected-icon"]);if(this.options.multiSelect){f.push(d.data())}}if(f.length){this.$element.trigger("selected",{info:f})}},selectFolder:function(e){var d=a(e);var f=d.parent();if(d.find("."+this.options["close-icon"]).length){if(f.find(".tree-folder-content").children().length){f.find(".tree-folder-content:eq(0)").show()}else{this.populate(d)}f.find("."+this.options["close-icon"]+":eq(0)").removeClass(this.options["close-icon"]).addClass(this.options["open-icon"]);this.$element.trigger("opened",d.data())}else{if(this.options.cacheItems){f.find(".tree-folder-content:eq(0)").hide()}else{f.find(".tree-folder-content:eq(0)").empty()}f.find("."+this.options["open-icon"]+":eq(0)").removeClass(this.options["open-icon"]).addClass(this.options["close-icon"]);this.$element.trigger("closed",d.data())}},selectedItems:function(){var e=this.$element.find(".tree-selected");var d=[];a.each(e,function(f,g){d.push(a(g).data())});return d}};a.fn.tree=function(e,g){var f;var d=this.each(function(){var j=a(this);var i=j.data("tree");var h=typeof e==="object"&&e;if(!i){j.data("tree",(i=new b(this,h)))}if(typeof e==="string"){f=i[e](g)}});return(f===c)?d:f};a.fn.tree.defaults={multiSelect:false,loadingHTML:"
Loading...
",cacheItems:true};a.fn.tree.Constructor=b})(window.jQuery); -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/entity/Role.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.entity; 2 | 3 | import com.alibaba.fastjson.annotation.JSONField; 4 | 5 | import java.io.Serializable; 6 | import java.util.Date; 7 | 8 | /** 9 | * @author 10 | */ 11 | public class Role implements Serializable { 12 | private Integer id; 13 | 14 | /** 15 | * 角色名称 16 | */ 17 | private String name; 18 | 19 | /** 20 | * 英文名称 21 | */ 22 | private String enname; 23 | 24 | /** 25 | * 是否可用 26 | */ 27 | private Integer useable; 28 | 29 | /** 30 | * 创建者 31 | */ 32 | private String createBy; 33 | 34 | /** 35 | * 创建时间 36 | */ 37 | @JSONField(format = "yyyy-MM-dd HH:mm:ss") 38 | private Date createDate; 39 | 40 | /** 41 | * 更新者 42 | */ 43 | private String updateBy; 44 | 45 | /** 46 | * 更新时间 47 | */ 48 | @JSONField(format = "yyyy-MM-dd HH:mm:ss") 49 | private Date updateDate; 50 | 51 | /** 52 | * 备注信息 53 | */ 54 | private String remarks; 55 | 56 | /** 57 | * 删除标记 58 | */ 59 | private String delFlag; 60 | 61 | private static final long serialVersionUID = 1L; 62 | 63 | public Integer getId() { 64 | return id; 65 | } 66 | 67 | public void setId(Integer id) { 68 | this.id = id; 69 | } 70 | 71 | public String getName() { 72 | return name; 73 | } 74 | 75 | public void setName(String name) { 76 | this.name = name; 77 | } 78 | 79 | public String getEnname() { 80 | return enname; 81 | } 82 | 83 | public void setEnname(String enname) { 84 | this.enname = enname; 85 | } 86 | 87 | public Integer getUseable() { 88 | return useable; 89 | } 90 | 91 | public void setUseable(Integer useable) { 92 | this.useable = useable; 93 | } 94 | 95 | public String getCreateBy() { 96 | return createBy; 97 | } 98 | 99 | public void setCreateBy(String createBy) { 100 | this.createBy = createBy; 101 | } 102 | 103 | public Date getCreateDate() { 104 | return createDate; 105 | } 106 | 107 | public void setCreateDate(Date createDate) { 108 | this.createDate = createDate; 109 | } 110 | 111 | public String getUpdateBy() { 112 | return updateBy; 113 | } 114 | 115 | public void setUpdateBy(String updateBy) { 116 | this.updateBy = updateBy; 117 | } 118 | 119 | public Date getUpdateDate() { 120 | return updateDate; 121 | } 122 | 123 | public void setUpdateDate(Date updateDate) { 124 | this.updateDate = updateDate; 125 | } 126 | 127 | public String getRemarks() { 128 | return remarks; 129 | } 130 | 131 | public void setRemarks(String remarks) { 132 | this.remarks = remarks; 133 | } 134 | 135 | public String getDelFlag() { 136 | return delFlag; 137 | } 138 | 139 | public void setDelFlag(String delFlag) { 140 | this.delFlag = delFlag; 141 | } 142 | } -------------------------------------------------------------------------------- /src/main/resources/static/js/jquery.easy-pie-chart.min.js: -------------------------------------------------------------------------------- 1 | (function(a){a.easyPieChart=function(d,l){var f,g,i,j,c,k,e,b,h=this;this.el=d;this.$el=a(d);this.$el.data("easyPieChart",this);this.init=function(){var n,m;h.options=a.extend({},a.easyPieChart.defaultOptions,l);n=parseInt(h.$el.data("percent"),10);h.percentage=0;h.canvas=a("").get(0);h.$el.append(h.canvas);if(typeof G_vmlCanvasManager!=="undefined"&&G_vmlCanvasManager!==null){G_vmlCanvasManager.initElement(h.canvas)}h.ctx=h.canvas.getContext("2d");if(window.devicePixelRatio>1){m=window.devicePixelRatio;a(h.canvas).css({width:h.options.size,height:h.options.size});h.canvas.width*=m;h.canvas.height*=m;h.ctx.scale(m,m)}h.ctx.translate(h.options.size/2,h.options.size/2);h.ctx.rotate(h.options.rotate*Math.PI/180);h.$el.addClass("easyPieChart");h.$el.css({width:h.options.size,height:h.options.size,lineHeight:""+h.options.size+"px"});h.update(n);return h};this.update=function(m){m=parseFloat(m)||0;if(h.options.animate===false){i(m)}else{if(h.options.delay){g(h.percentage,0);setTimeout(function(){return g(h.percentage,m)},h.options.delay)}else{g(h.percentage,m)}}return h};e=function(){var n,o,m;h.ctx.fillStyle=h.options.scaleColor;h.ctx.lineWidth=1;m=[];for(n=o=0;o<=24;n=++o){m.push(f(n))}return m};f=function(m){var n;n=m%6===0?0:h.options.size*0.017;h.ctx.save();h.ctx.rotate(m*Math.PI/12);h.ctx.fillRect(h.options.size/2-n,0,-h.options.size*0.05+n,1);h.ctx.restore()};b=function(){var m;m=h.options.size/2-h.options.lineWidth/2;if(h.options.scaleColor!==false){m-=h.options.size*0.08}h.ctx.beginPath();h.ctx.arc(0,0,m,0,Math.PI*2,true);h.ctx.closePath();h.ctx.strokeStyle=h.options.trackColor;h.ctx.lineWidth=h.options.lineWidth;h.ctx.stroke()};k=function(){if(h.options.scaleColor!==false){e()}if(h.options.trackColor!==false){b()}};i=function(m){var n;k();h.ctx.strokeStyle=a.isFunction(h.options.barColor)?h.options.barColor(m):h.options.barColor;h.ctx.lineCap=h.options.lineCap;h.ctx.lineWidth=h.options.lineWidth;n=h.options.size/2-h.options.lineWidth/2;if(h.options.scaleColor!==false){n-=h.options.size*0.08}h.ctx.save();h.ctx.rotate(-Math.PI/2);h.ctx.beginPath();h.ctx.arc(0,0,n,0,Math.PI*2*m/100,false);h.ctx.stroke();h.ctx.restore()};c=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(m){return window.setTimeout(m,1000/60)}})();g=function(p,o){var n,m;h.options.onStart.call(h);h.percentage=o;Date.now||(Date.now=function(){return +(new Date)});m=Date.now();n=function(){var q,r;r=Math.min(Date.now()-m,h.options.animate);h.ctx.clearRect(-h.options.size/2,-h.options.size/2,h.options.size,h.options.size);k.call(h);q=[j(r,p,o-p,h.options.animate)];h.options.onStep.call(h,q);i.call(h,q);if(r>=h.options.animate){return h.options.onStop.call(h,q,o)}else{return c(n)}};c(n)};j=function(o,n,r,p){var m,q;m=function(s){return Math.pow(s,2)};q=function(s){if(s<1){return m(s)}else{return 2-m((s/2)*-2+2)}};o/=p/2;return r/2*q(o)+n};return this.init()};a.easyPieChart.defaultOptions={barColor:"#ef1e25",trackColor:"#f2f2f2",scaleColor:"#dfe0e0",lineCap:"round",rotate:0,size:110,lineWidth:3,animate:false,delay:false,onStart:a.noop,onStop:a.noop,onStep:a.noop};a.fn.easyPieChart=function(b){return a.each(this,function(d,e){var c,f;c=a(e);if(!c.data("easyPieChart")){f=a.extend({},b,c.data());return c.data("easyPieChart",new a.easyPieChart(e,f))}})};return void 0})(jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/layim/data/friend.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": 1, 3 | "msg": "ok", 4 | "data": [ 5 | { 6 | "name": "销售部", 7 | "nums": 36, 8 | "id": 1, 9 | "item": [ 10 | { 11 | "id": "100001", 12 | "name": "郭敬明", 13 | "face": "img/a5.jpg" 14 | }, 15 | { 16 | "id": "100002", 17 | "name": "作家崔成浩", 18 | "face": "img/a6.jpg" 19 | }, 20 | { 21 | "id": "1000022", 22 | "name": "韩寒", 23 | "face": "img/a7.jpg" 24 | }, 25 | { 26 | "id": "10000222", 27 | "name": "范爷", 28 | "face": "img/a8.jpg" 29 | }, 30 | { 31 | "id": "100002222", 32 | "name": "小马哥", 33 | "face": "img/a9.jpg" 34 | } 35 | ] 36 | }, 37 | { 38 | "name": "大学同窗", 39 | "nums": 16, 40 | "id": 2, 41 | "item": [ 42 | { 43 | "id": "1000033", 44 | "name": "苏醒", 45 | "face": "img/a9.jpg" 46 | }, 47 | { 48 | "id": "10000333", 49 | "name": "马云", 50 | "face": "img/a8.jpg" 51 | }, 52 | { 53 | "id": "100003", 54 | "name": "鬼脚七", 55 | "face": "img/a7.jpg" 56 | }, 57 | { 58 | "id": "100004", 59 | "name": "谢楠", 60 | "face": "img/a6.jpg" 61 | }, 62 | { 63 | "id": "100005", 64 | "name": "徐峥", 65 | "face": "img/a5.jpg" 66 | } 67 | ] 68 | }, 69 | { 70 | "name": "H+后台主题", 71 | "nums": 38, 72 | "id": 3, 73 | "item": [ 74 | { 75 | "id": "100006", 76 | "name": "柏雪近在它香", 77 | "face": "img/a4.jpg" 78 | }, 79 | { 80 | "id": "100007", 81 | "name": "罗昌平", 82 | "face": "img/a3.jpg" 83 | }, 84 | { 85 | "id": "100008", 86 | "name": "Crystal影子", 87 | "face": "img/a2.jpg" 88 | }, 89 | { 90 | "id": "100009", 91 | "name": "艺小想", 92 | "face": "img/a1.jpg" 93 | }, 94 | { 95 | "id": "100010", 96 | "name": "天猫", 97 | "face": "img/a8.jpg" 98 | }, 99 | { 100 | "id": "100011", 101 | "name": "张泉灵", 102 | "face": "img/a7.jpg" 103 | } 104 | ] 105 | } 106 | ] 107 | } 108 | -------------------------------------------------------------------------------- /src/main/resources/static/js/bootstrap-tag.min.js: -------------------------------------------------------------------------------- 1 | !function(c){var b=function(e,d){this.element=c(e);this.options=c.extend(true,{},c.fn.tag.defaults,d);this.values=c.grep(c.map(this.element.val().split(","),c.trim),function(f){return f.length>0});this.show()};b.prototype={constructor:b,show:function(){var d=this;d.element.parent().prepend(d.element.detach().hide());d.element.wrap(c('
')).parent().on("click",function(){d.input.focus()});if(d.values.length){c.each(d.values,function(){d.createBadge(this)})}d.input=c('').attr("placeholder",d.options.placeholder).insertAfter(d.element).on("focus",function(){d.element.parent().addClass("tags-hover")}).on("blur",function(){if(!d.skip){d.process();d.element.parent().removeClass("tags-hover");d.element.siblings(".tag").removeClass("tag-important")}d.skip=false}).on("keydown",function(g){if(g.keyCode==188||g.keyCode==13||g.keyCode==9){if(c.trim(c(this).val())&&(!d.element.siblings(".typeahead").length||d.element.siblings(".typeahead").is(":hidden"))){if(g.keyCode!=9){g.preventDefault()}d.process()}else{if(g.keyCode==188){if(!d.element.siblings(".typeahead").length||d.element.siblings(".typeahead").is(":hidden")){g.preventDefault()}else{d.input.data("typeahead").select();g.stopPropagation();g.preventDefault()}}}}else{if(!c.trim(c(this).val())&&g.keyCode==8){var f=d.element.siblings(".tag").length;if(f){var e=d.element.siblings(".tag:eq("+(f-1)+")");if(e.hasClass("tag-important")){d.remove(f-1)}else{e.addClass("tag-important")}}}else{d.element.siblings(".tag").removeClass("tag-important")}}}).typeahead({source:d.options.source,matcher:function(e){return ~e.toLowerCase().indexOf(this.query.toLowerCase())&&(d.inValues(e)==-1||d.options.allowDuplicates)},updater:c.proxy(d.add,d)});c(d.input.data("typeahead").$menu).on("mousedown",function(){d.skip=true});this.element.trigger("shown")},inValues:function(e){if(this.options.caseInsensitive){var d=-1;c.each(this.values,function(f,g){if(g.toLowerCase()==e.toLowerCase()){d=f;return false}});return d}else{return c.inArray(e,this.values)}},createBadge:function(e){var d=this;c("",{"class":"tag"}).text(e).append(c('').on("click",function(){d.remove(d.element.siblings(".tag").index(c(this).closest(".tag")))})).insertBefore(d.element)},add:function(g){var f=this;if(!f.options.allowDuplicates){var e=f.inValues(g);if(e!=-1){var d=f.element.siblings(".tag:eq("+e+")");d.addClass("tag-warning");setTimeout(function(){c(d).removeClass("tag-warning")},500);return}}this.values.push(g);this.createBadge(g);this.element.val(this.values.join(", "));this.element.trigger("added",[g])},remove:function(d){if(d>=0){var e=this.values.splice(d,1);this.element.siblings(".tag:eq("+d+")").remove();this.element.val(this.values.join(", "));this.element.trigger("removed",[e])}},process:function(){var d=c.grep(c.map(this.input.val().split(","),c.trim),function(f){return f.length>0}),e=this;c.each(d,function(){e.add(this)});this.input.val("")},skip:false};var a=c.fn.tag;c.fn.tag=function(d){return this.each(function(){var f=c(this),g=f.data("tag"),e=typeof d=="object"&&d;if(!g){f.data("tag",(g=new b(this,e)))}if(typeof d=="string"){g[d]()}})};c.fn.tag.defaults={allowDuplicates:false,caseInsensitive:true,placeholder:"",source:[]};c.fn.tag.Constructor=b;c.fn.tag.noConflict=function(){c.fn.tag=a;return this};c(window).on("load",function(){c('[data-provide="tag"]').each(function(){var d=c(this);if(d.data("tag")){return}d.tag(d.data())})})}(window.jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/css/bootstrap-timepicker.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Timepicker Component for Twitter Bootstrap 3 | * 4 | * Copyright 2013 Joris de Wit 5 | * 6 | * Contributors https//github.com/jdewit/bootstrap-timepicker/graphs/contributors 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | .bootstrap-timepicker { 12 | position: relative; 13 | } 14 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu { 15 | left: auto; 16 | right: 0; 17 | } 18 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before { 19 | left: auto; 20 | right: 12px; 21 | } 22 | .bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after { 23 | left: auto; 24 | right: 13px; 25 | } 26 | .bootstrap-timepicker .add-on { 27 | cursor: pointer; 28 | } 29 | .bootstrap-timepicker .add-on i { 30 | display: inline-block; 31 | width: 16px; 32 | height: 16px; 33 | } 34 | .bootstrap-timepicker-widget.dropdown-menu { 35 | padding: 2px 3px 2px 2px; 36 | } 37 | .bootstrap-timepicker-widget.dropdown-menu.open { 38 | display: inline-block; 39 | } 40 | .bootstrap-timepicker-widget.dropdown-menu:before { 41 | border-bottom: 7px solid rgba(0, 0, 0, 0.2); 42 | border-left: 7px solid transparent; 43 | border-right: 7px solid transparent; 44 | content: ""; 45 | display: inline-block; 46 | left: 9px; 47 | position: absolute; 48 | top: -7px; 49 | } 50 | .bootstrap-timepicker-widget.dropdown-menu:after { 51 | border-bottom: 6px solid #FFFFFF; 52 | border-left: 6px solid transparent; 53 | border-right: 6px solid transparent; 54 | content: ""; 55 | display: inline-block; 56 | left: 10px; 57 | position: absolute; 58 | top: -6px; 59 | } 60 | .bootstrap-timepicker-widget a.btn, 61 | .bootstrap-timepicker-widget input { 62 | border-radius: 4px; 63 | } 64 | .bootstrap-timepicker-widget table { 65 | width: 100%; 66 | margin: 0; 67 | } 68 | .bootstrap-timepicker-widget table td { 69 | text-align: center; 70 | height: 30px; 71 | margin: 0; 72 | padding: 2px; 73 | } 74 | .bootstrap-timepicker-widget table td:not(.separator) { 75 | min-width: 30px; 76 | } 77 | .bootstrap-timepicker-widget table td span { 78 | width: 100%; 79 | } 80 | .bootstrap-timepicker-widget table td a { 81 | border: 1px transparent solid; 82 | width: 100%; 83 | display: inline-block; 84 | margin: 0; 85 | padding: 8px 0; 86 | outline: 0; 87 | color: #333; 88 | } 89 | .bootstrap-timepicker-widget table td a:hover { 90 | text-decoration: none; 91 | background-color: #eee; 92 | -webkit-border-radius: 4px; 93 | -moz-border-radius: 4px; 94 | border-radius: 4px; 95 | border-color: #ddd; 96 | } 97 | .bootstrap-timepicker-widget table td a i { 98 | margin-top: 2px; 99 | } 100 | .bootstrap-timepicker-widget table td input { 101 | width: 25px; 102 | margin: 0; 103 | text-align: center; 104 | } 105 | .bootstrap-timepicker-widget .modal-content { 106 | padding: 4px; 107 | } 108 | @media (min-width: 767px) { 109 | .bootstrap-timepicker-widget.modal { 110 | width: 200px; 111 | margin-left: -100px; 112 | } 113 | } 114 | @media (max-width: 767px) { 115 | .bootstrap-timepicker { 116 | width: 100%; 117 | } 118 | .bootstrap-timepicker .dropdown-menu { 119 | width: 100%; 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/config/WebMvcConfig.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.config; 2 | 3 | import com.alibaba.fastjson.serializer.SerializerFeature; 4 | import com.alibaba.fastjson.support.config.FastJsonConfig; 5 | import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4; 6 | import org.springframework.beans.factory.annotation.Autowired; 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.http.MediaType; 11 | import org.springframework.http.converter.HttpMessageConverter; 12 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 13 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | @Configuration 19 | public class WebMvcConfig extends WebMvcConfigurerAdapter { 20 | @Autowired 21 | private CommonInterceptor commonInterceptor; 22 | 23 | /** 24 | * fastJson相关设置 25 | */ 26 | private FastJsonConfig getFastJsonConfig() { 27 | 28 | FastJsonConfig fastJsonConfig = new FastJsonConfig(); 29 | // 在serializerFeatureList中添加转换规则 30 | List serializerFeatureList = new ArrayList(); 31 | serializerFeatureList.add(SerializerFeature.PrettyFormat); 32 | serializerFeatureList.add(SerializerFeature.WriteMapNullValue); 33 | serializerFeatureList.add(SerializerFeature.WriteNullStringAsEmpty); 34 | serializerFeatureList.add(SerializerFeature.WriteNullListAsEmpty); 35 | serializerFeatureList.add(SerializerFeature.DisableCircularReferenceDetect); 36 | SerializerFeature[] serializerFeatures = serializerFeatureList.toArray(new SerializerFeature[serializerFeatureList.size()]); 37 | fastJsonConfig.setSerializerFeatures(serializerFeatures); 38 | 39 | return fastJsonConfig; 40 | } 41 | 42 | /** 43 | * fastJson相关设置 44 | */ 45 | private FastJsonHttpMessageConverter4 fastJsonHttpMessageConverter() { 46 | 47 | FastJsonHttpMessageConverter4 fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter4(); 48 | 49 | List supportedMediaTypes = new ArrayList(); 50 | supportedMediaTypes.add(MediaType.parseMediaType("text/html;charset=UTF-8")); 51 | supportedMediaTypes.add(MediaType.parseMediaType("application/json")); 52 | 53 | fastJsonHttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes); 54 | fastJsonHttpMessageConverter.setFastJsonConfig(getFastJsonConfig()); 55 | 56 | return fastJsonHttpMessageConverter; 57 | } 58 | 59 | /** 60 | * 添加fastJsonHttpMessageConverter到converters 61 | */ 62 | @Override 63 | public void configureMessageConverters(List> converters) { 64 | converters.add(fastJsonHttpMessageConverter()); 65 | } 66 | 67 | /** 68 | * 添加拦截器 69 | */ 70 | @Override 71 | public void addInterceptors(InterceptorRegistry registry) { 72 | registry.addInterceptor(commonInterceptor).addPathPatterns("/**"); 73 | super.addInterceptors(registry); 74 | } 75 | 76 | // @Bean 77 | // public FilterRegistrationBean registFilter() { 78 | // FilterRegistrationBean registration = new FilterRegistrationBean(); 79 | // registration.setFilter(new OpenEntityManagerInViewFilter()); 80 | // registration.addUrlPatterns("/*"); 81 | // registration.setOrder(1); 82 | // return registration; 83 | // } 84 | 85 | 86 | } 87 | -------------------------------------------------------------------------------- /src/main/resources/templates/role/add.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 添加角色 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 |
28 |
29 |
30 | 31 |
32 | 33 |
34 | 35 |
36 |
37 |
38 | 39 |
40 | 41 |
42 |
43 |
44 |
45 | 46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | 54 |
55 | 56 | <#include "${ctx}/common.ftl"> 57 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /src/main/resources/static/js/jquery.maskedinput.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | Masked Input plugin for jQuery 3 | Copyright (c) 2007-2013 Josh Bush (digitalbush.com) 4 | Licensed under the MIT license (http//digitalbush.com/projects/masked-input-plugin/#license) 5 | Version: 1.3.1 6 | */ 7 | (function(e){function t(){var e=document.createElement("input"),t="onpaste";return e.setAttribute(t,""),"function"==typeof e[t]?"paste":"input"}var n,a=t()+".mask",r=navigator.userAgent,i=/iphone/i.test(r),o=/android/i.test(r);e.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},dataName:"rawMaskFn",placeholder:"_"},e.fn.extend({caret:function(e,t){var n;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof e?(t="number"==typeof t?t:e,this.each(function(){this.setSelectionRange?this.setSelectionRange(e,t):this.createTextRange&&(n=this.createTextRange(),n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",e),n.select())})):(this[0].setSelectionRange?(e=this[0].selectionStart,t=this[0].selectionEnd):document.selection&&document.selection.createRange&&(n=document.selection.createRange(),e=0-n.duplicate().moveStart("character",-1e5),t=e+n.text.length),{begin:e,end:t})},unmask:function(){return this.trigger("unmask")},mask:function(t,r){var c,l,s,u,f,h;return!t&&this.length>0?(c=e(this[0]),c.data(e.mask.dataName)()):(r=e.extend({placeholder:e.mask.placeholder,completed:null},r),l=e.mask.definitions,s=[],u=h=t.length,f=null,e.each(t.split(""),function(e,t){"?"==t?(h--,u=e):l[t]?(s.push(RegExp(l[t])),null===f&&(f=s.length-1)):s.push(null)}),this.trigger("unmask").each(function(){function c(e){for(;h>++e&&!s[e];);return e}function d(e){for(;--e>=0&&!s[e];);return e}function m(e,t){var n,a;if(!(0>e)){for(n=e,a=c(t);h>n;n++)if(s[n]){if(!(h>a&&s[n].test(R[a])))break;R[n]=R[a],R[a]=r.placeholder,a=c(a)}b(),x.caret(Math.max(f,e))}}function p(e){var t,n,a,i;for(t=e,n=r.placeholder;h>t;t++)if(s[t]){if(a=c(t),i=R[t],R[t]=n,!(h>a&&s[a].test(i)))break;n=i}}function g(e){var t,n,a,r=e.which;8===r||46===r||i&&127===r?(t=x.caret(),n=t.begin,a=t.end,0===a-n&&(n=46!==r?d(n):a=c(n-1),a=46===r?c(a):a),k(n,a),m(n,a-1),e.preventDefault()):27==r&&(x.val(S),x.caret(0,y()),e.preventDefault())}function v(t){var n,a,i,l=t.which,u=x.caret();t.ctrlKey||t.altKey||t.metaKey||32>l||l&&(0!==u.end-u.begin&&(k(u.begin,u.end),m(u.begin,u.end-1)),n=c(u.begin-1),h>n&&(a=String.fromCharCode(l),s[n].test(a)&&(p(n),R[n]=a,b(),i=c(n),o?setTimeout(e.proxy(e.fn.caret,x,i),0):x.caret(i),r.completed&&i>=h&&r.completed.call(x))),t.preventDefault())}function k(e,t){var n;for(n=e;t>n&&h>n;n++)s[n]&&(R[n]=r.placeholder)}function b(){x.val(R.join(""))}function y(e){var t,n,a=x.val(),i=-1;for(t=0,pos=0;h>t;t++)if(s[t]){for(R[t]=r.placeholder;pos++a.length)break}else R[t]===a.charAt(pos)&&t!==u&&(pos++,i=t);return e?b():u>i+1?(x.val(""),k(0,h)):(b(),x.val(x.val().substring(0,i+1))),u?t:f}var x=e(this),R=e.map(t.split(""),function(e){return"?"!=e?l[e]?r.placeholder:e:void 0}),S=x.val();x.data(e.mask.dataName,function(){return e.map(R,function(e,t){return s[t]&&e!=r.placeholder?e:null}).join("")}),x.attr("readonly")||x.one("unmask",function(){x.unbind(".mask").removeData(e.mask.dataName)}).bind("focus.mask",function(){clearTimeout(n);var e;S=x.val(),e=y(),n=setTimeout(function(){b(),e==t.length?x.caret(0,e):x.caret(e)},10)}).bind("blur.mask",function(){y(),x.val()!=S&&x.change()}).bind("keydown.mask",g).bind("keypress.mask",v).bind(a,function(){setTimeout(function(){var e=y(!0);x.caret(e),r.completed&&e==x.val().length&&r.completed.call(x)},0)}),y()}))}})})(jQuery); -------------------------------------------------------------------------------- /src/main/resources/templates/role/edit.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 编辑角色 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 |
28 |
29 |
30 | 31 |
32 | 33 |
34 | 35 |
36 |
37 |
38 | 39 |
40 | 41 |
42 |
43 |
44 |
45 | 46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | 54 |
55 | 56 | <#include "${ctx}/common.ftl"> 57 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /src/main/resources/static/js/bootstrap-wysiwyg.min.js: -------------------------------------------------------------------------------- 1 | (function(b){var a=function(e){var c=b.Deferred(),d=new FileReader();d.onload=function(f){c.resolve(f.target.result)};d.onerror=c.reject;d.onprogress=c.notify;d.readAsDataURL(e);return c.promise()};b.fn.cleanHtml=function(){var c=b(this).html();return c&&c.replace(/(
|\s|

<\/div>| )*$/,"")};b.fn.wysiwyg=function(k){var l=this,h,q,d,p=function(){if(q.activeToolbarClass){b(q.toolbarSelector).find(d).each(function(){try{var s=b(this).data(q.commandRole);if(document.queryCommandState(s)){b(this).addClass(q.activeToolbarClass)}else{b(this).removeClass(q.activeToolbarClass)}}catch(r){}})}},o=function(r,s){var u=r.split(" "),v=u.shift(),t=u.join(" ")+(s||"");document.execCommand(v,0,t);p()},f=function(r){b.each(r,function(s,t){l.keydown(s,function(u){if(l.attr("contenteditable")&&l.is(":visible")){u.preventDefault();u.stopPropagation();o(t)}}).keyup(s,function(u){if(l.attr("contenteditable")&&l.is(":visible")){u.preventDefault();u.stopPropagation()}})})},g=function(){try{var r=window.getSelection();if(r.getRangeAt&&r.rangeCount){return r.getRangeAt(0)}}catch(s){}},i=function(){h=g()},e=function(){try{var s=window.getSelection();if(h){try{s.removeAllRanges()}catch(r){document.body.createTextRange().select();document.selection.empty()}s.addRange(h)}}catch(t){}},j=function(r){l.focus();b.each(r,function(s,t){if(/^image\//.test(t.type)){b.when(a(t)).done(function(u){o("insertimage",u)}).fail(function(u){q.fileUploadError("file-reader",u)})}else{q.fileUploadError("unsupported-file-type",t.type)}})},c=function(s,r){e();if(document.queryCommandSupported("hiliteColor")){document.execCommand("hiliteColor",0,r||"transparent")}i();s.data(q.selectionMarker,r)},m=function(s,r){s.find(d).click(function(){e();l.focus();o(b(this).data(r.commandRole));i()});s.find("[data-toggle=dropdown]").click(e);s.find("input[type=text][data-"+r.commandRole+"]").on("webkitspeechchange change",function(){var t=this.value;this.value="";e();if(t){l.focus();o(b(this).data(r.commandRole),t)}i()}).on("focus",function(){var t=b(this);if(!t.data(r.selectionMarker)){c(t,r.selectionColor);t.focus()}}).on("blur",function(){var t=b(this);if(t.data(r.selectionMarker)){c(t,false)}});s.find("input[type=file][data-"+r.commandRole+"]").change(function(){e();if(this.type==="file"&&this.files&&this.files.length>0){j(this.files)}i();this.value=""})},n=function(){l.on("dragenter dragover",false).on("drop",function(s){var r=s.originalEvent.dataTransfer;s.stopPropagation();s.preventDefault();if(r&&r.files&&r.files.length>0){j(r.files)}})};q=b.extend({},b.fn.wysiwyg.defaults,k);d="a[data-"+q.commandRole+"],button[data-"+q.commandRole+"],input[type=button][data-"+q.commandRole+"]";f(q.hotKeys);if(q.dragAndDropImages){n()}m(b(q.toolbarSelector),q);l.attr("contenteditable",true).on("mouseup keyup mouseout",function(){i();p()});b(window).bind("touchend",function(u){var t=(l.is(u.target)||l.has(u.target).length>0),s=g(),r=s&&(s.startContainer===s.endContainer&&s.startOffset===s.endOffset);if(!r||t){i();p()}});return this};b.fn.wysiwyg.defaults={hotKeys:{"ctrl+b meta+b":"bold","ctrl+i meta+i":"italic","ctrl+u meta+u":"underline","ctrl+z meta+z":"undo","ctrl+y meta+y meta+shift+z":"redo","ctrl+l meta+l":"justifyleft","ctrl+r meta+r":"justifyright","ctrl+e meta+e":"justifycenter","ctrl+j meta+j":"justifyfull","shift+tab":"outdent",tab:"indent"},toolbarSelector:"[data-role=editor-toolbar]",commandRole:"edit",activeToolbarClass:"btn-info",selectionMarker:"edit-focus-marker",selectionColor:"darkgrey",dragAndDropImages:true,fileUploadError:function(d,c){console.log("File upload error",d,c)}}}(window.jQuery)); -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/dto/RoleDto.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.dto; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * 7 | * @author bjjoy 8 | * @date 2017/11/02 9 | */ 10 | public class RoleDto { 11 | 12 | private Integer id; 13 | 14 | /** 15 | * 角色名称 16 | */ 17 | private String name; 18 | 19 | /** 20 | * 英文名称 21 | */ 22 | private String enname; 23 | 24 | /** 25 | * 是否系统管理员 26 | */ 27 | private Integer isSys; 28 | 29 | /** 30 | * 是否可用 31 | */ 32 | private Integer useable; 33 | 34 | /** 35 | * 创建者 36 | */ 37 | private String createBy; 38 | 39 | /** 40 | * 创建时间 41 | */ 42 | private Date createDate; 43 | 44 | /** 45 | * 更新者 46 | */ 47 | private String updateBy; 48 | 49 | /** 50 | * 更新时间 51 | */ 52 | private Date updateDate; 53 | 54 | /** 55 | * 备注信息 56 | */ 57 | private String remarks; 58 | 59 | /** 60 | * 删除标记 61 | */ 62 | private String delFlag; 63 | 64 | /** 65 | * 对应菜单ids(1$$2$$3) 66 | */ 67 | private String menuIds; 68 | 69 | public Integer getId() { 70 | return id; 71 | } 72 | 73 | public void setId(Integer id) { 74 | this.id = id; 75 | } 76 | 77 | public String getName() { 78 | return name; 79 | } 80 | 81 | public void setName(String name) { 82 | this.name = name; 83 | } 84 | 85 | public String getEnname() { 86 | return enname; 87 | } 88 | 89 | public void setEnname(String enname) { 90 | this.enname = enname; 91 | } 92 | 93 | public Integer getIsSys() { 94 | return isSys; 95 | } 96 | 97 | public void setIsSys(Integer isSys) { 98 | this.isSys = isSys; 99 | } 100 | 101 | public Integer getUseable() { 102 | return useable; 103 | } 104 | 105 | public void setUseable(Integer useable) { 106 | this.useable = useable; 107 | } 108 | 109 | public String getCreateBy() { 110 | return createBy; 111 | } 112 | 113 | public void setCreateBy(String createBy) { 114 | this.createBy = createBy; 115 | } 116 | 117 | public Date getCreateDate() { 118 | return createDate; 119 | } 120 | 121 | public void setCreateDate(Date createDate) { 122 | this.createDate = createDate; 123 | } 124 | 125 | public String getUpdateBy() { 126 | return updateBy; 127 | } 128 | 129 | public void setUpdateBy(String updateBy) { 130 | this.updateBy = updateBy; 131 | } 132 | 133 | public Date getUpdateDate() { 134 | return updateDate; 135 | } 136 | 137 | public void setUpdateDate(Date updateDate) { 138 | this.updateDate = updateDate; 139 | } 140 | 141 | public String getRemarks() { 142 | return remarks; 143 | } 144 | 145 | public void setRemarks(String remarks) { 146 | this.remarks = remarks; 147 | } 148 | 149 | public String getDelFlag() { 150 | return delFlag; 151 | } 152 | 153 | public void setDelFlag(String delFlag) { 154 | this.delFlag = delFlag; 155 | } 156 | 157 | public String getMenuIds() { 158 | return menuIds; 159 | } 160 | 161 | public void setMenuIds(String menuIds) { 162 | this.menuIds = menuIds; 163 | } 164 | } 165 | -------------------------------------------------------------------------------- /src/main/resources/static/plugin/layer/laydate/skins/default/laydate.css: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name: laydate皮肤:墨绿 4 | @Author:贤心 5 | @Site:http://sentsin.com/layui/laydate 6 | 7 | **/ 8 | 9 | .laydate-icon{border:1px solid #ccc; background-image:url(icon.png)} 10 | 11 | .laydate_body .laydate_bottom #laydate_hms, 12 | .laydate_body .laydate_time{border:1px solid #ccc;} 13 | 14 | .laydate_body .laydate_box, 15 | .laydate_body .laydate_ym .laydate_yms, 16 | .laydate_body .laydate_time{box-shadow: 2px 2px 5px rgba(0,0,0,.1);} 17 | 18 | .laydate_body .laydate_box{border-top:none; border-bottom:none; background-color:#fff; color:#00625A;} 19 | .laydate_body .laydate_box input{background:none!important; color:#fff;} 20 | .laydate_body .laydate_box .laydate_void{color:#00E8D7!important;} 21 | .laydate_body .laydate_box a, .laydate_body .laydate_box a:hover{color:#00625A;} 22 | .laydate_body .laydate_box a:hover{color:#666;} 23 | .laydate_body .laydate_click{background-color:#009F95!important; color:#fff!important;} 24 | .laydate_body .laydate_top{border-top:1px solid #009F95; background-color:#009F95} 25 | .laydate_body .laydate_ym{border:1px solid #009F95; background-color:#009F95;} 26 | .laydate_body .laydate_ym .laydate_yms{border:1px solid #009F95; background-color:#009F95; color:#fff;} 27 | .laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #009F95;} 28 | .laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #009F95; border-bottom:none;} 29 | .laydate_body .laydate_choose{border-left:1px solid #009F95;} 30 | .laydate_body .laydate_chprev{border-left:none; border-right:1px solid #009F95;} 31 | .laydate_body .laydate_choose:hover, 32 | .laydate_body .laydate_y .laydate_yms a:hover{background-color:#00C1B3;} 33 | .laydate_body .laydate_chtop cite{border-bottom-color:#fff;} 34 | .laydate_body .laydate_chdown cite, .laydate_body .laydate_ym label{border-top-color:#fff;} 35 | .laydate_body .laydate_chprev cite{border-right-style:solid; border-right-color:#fff;} 36 | .laydate_body .laydate_chnext cite{border-left-style:solid; border-left-color:#fff;} 37 | .laydate_body .laydate_table{width: 240px!important; margin: 0!important; border:1px solid #ccc; border-top:none; border-bottom:none;} 38 | .laydate_body .laydate_table td{border:none; height:21px!important; line-height:21px!important; background-color:#fff; color:#00625A;} 39 | .laydate_body .laydate_table .laydate_nothis{color:#999;} 40 | .laydate_body .laydate_table thead{border-bottom:1px solid #ccc; height:21px!important; line-height:21px!important;} 41 | .laydate_body .laydate_table thead th{} 42 | .laydate_body .laydate_bottom{border:1px solid #ccc; border-top:none;} 43 | .laydate_body .laydate_bottom #laydate_hms{background-color:#fff;} 44 | .laydate_body .laydate_time{background-color:#fff;} 45 | .laydate_body .laydate_time1{width: 226px!important; height: 152px!important;} 46 | .laydate_body .laydate_bottom .laydate_sj{width:31px!important; border-right:1px solid #ccc; background-color:#fff;} 47 | .laydate_body .laydate_bottom input{background-color:#fff; color:#00625A;} 48 | .laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #ccc;} 49 | .laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #ccc;} 50 | .laydate_body .laydate_bottom .laydate_v{color:#999} 51 | .laydate_body .laydate_bottom .laydate_btn a{border: 1px solid #ccc; border-right:none; background-color:#fff;} 52 | .laydate_body .laydate_bottom .laydate_btn a:hover{background-color:#F6F6F6; color:#00625A;} 53 | 54 | .laydate_body .laydate_m .laydate_yms span:hover, 55 | .laydate_body .laydate_time .laydate_hmsno span:hover, 56 | .laydate_body .laydate_y .laydate_yms ul li:hover, 57 | .laydate_body .laydate_table td:hover{background-color:#00C1B3; color:#fff;} 58 | 59 | 60 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/shiro/ShiroConfig.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.shiro; 2 | 3 | import org.apache.shiro.cache.CacheManager; 4 | import org.apache.shiro.cache.MemoryConstrainedCacheManager; 5 | import org.apache.shiro.mgt.DefaultSecurityManager; 6 | import org.apache.shiro.realm.Realm; 7 | import org.apache.shiro.spring.web.ShiroFilterFactoryBean; 8 | import org.apache.shiro.web.mgt.DefaultWebSecurityManager; 9 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 10 | import org.springframework.context.annotation.Bean; 11 | import org.springframework.context.annotation.Configuration; 12 | import org.springframework.context.annotation.DependsOn; 13 | import org.springframework.context.annotation.Import; 14 | 15 | import java.util.HashMap; 16 | import java.util.Map; 17 | 18 | @Configuration 19 | @Import(ShiroManager.class) 20 | public class ShiroConfig { 21 | 22 | @Bean(name = "realm") 23 | @DependsOn("lifecycleBeanPostProcessor") 24 | @ConditionalOnMissingBean 25 | public Realm realm() { 26 | return new MyRealm(); 27 | } 28 | 29 | /** 30 | * 用户授权信息Cache 31 | */ 32 | @Bean(name = "shiroCacheManager") 33 | @ConditionalOnMissingBean 34 | public CacheManager cacheManager() { 35 | return new MemoryConstrainedCacheManager(); 36 | } 37 | 38 | @Bean(name = "securityManager") 39 | @ConditionalOnMissingBean 40 | public DefaultSecurityManager securityManager() { 41 | DefaultSecurityManager sm = new DefaultWebSecurityManager(); 42 | sm.setCacheManager(cacheManager()); 43 | return sm; 44 | } 45 | 46 | @Bean(name = "shiroFilter") 47 | @DependsOn("securityManager") 48 | @ConditionalOnMissingBean 49 | public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultSecurityManager securityManager, Realm realm) { 50 | securityManager.setRealm(realm); 51 | 52 | ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); 53 | shiroFilter.setSecurityManager(securityManager); 54 | shiroFilter.setLoginUrl("/admin/login"); 55 | shiroFilter.setSuccessUrl("/admin/index"); 56 | shiroFilter.setUnauthorizedUrl("/previlige/no"); 57 | Map filterChainDefinitionMap = new HashMap(); 58 | 59 | filterChainDefinitionMap.put("/admin/login", "anon"); 60 | 61 | filterChainDefinitionMap.put("/user/index", "perms[system:user:index]"); 62 | filterChainDefinitionMap.put("/user/add", "perms[system:user:add]"); 63 | filterChainDefinitionMap.put("/user/edit", "perms[system:user:edit]"); 64 | filterChainDefinitionMap.put("/user/delete", "perms[system:user:delete]"); 65 | filterChainDefinitionMap.put("/user/grant/**", "perms[system:user:grant]"); 66 | 67 | filterChainDefinitionMap.put("/role/index", "perms[system:role:index]"); 68 | filterChainDefinitionMap.put("/role/add", "perms[system:role:add]"); 69 | filterChainDefinitionMap.put("/role/edit*", "perms[system:role:edit]"); 70 | filterChainDefinitionMap.put("/role/delete", "perms[system:role:deleteBatch]"); 71 | filterChainDefinitionMap.put("/role/grant/**", "perms[system:role:grant]"); 72 | 73 | filterChainDefinitionMap.put("/menu/index", "perms[system:menu:index]"); 74 | filterChainDefinitionMap.put("/menu/add", "perms[system:menu:add]"); 75 | filterChainDefinitionMap.put("/menu/edit*", "perms[system:menu:edit]"); 76 | filterChainDefinitionMap.put("/menu/delete", "perms[system:menu:delete]"); 77 | 78 | filterChainDefinitionMap.put("/admin/**", "authc"); 79 | filterChainDefinitionMap.put("/user/**", "authc"); 80 | filterChainDefinitionMap.put("/role/**", "authc"); 81 | filterChainDefinitionMap.put("/menu/**", "authc"); 82 | shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap); 83 | return shiroFilter; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/cn/bjjoy/bms/setting/service/impl/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.bjjoy.bms.setting.service.impl; 2 | 3 | import cn.bjjoy.bms.setting.dao.UserMapper; 4 | import cn.bjjoy.bms.setting.dao.UserRoleMapper; 5 | import cn.bjjoy.bms.setting.dto.UserDto; 6 | import cn.bjjoy.bms.setting.entity.User; 7 | import cn.bjjoy.bms.setting.entity.UserRole; 8 | import cn.bjjoy.bms.setting.service.UserService; 9 | import cn.bjjoy.bms.util.DataUtils; 10 | import org.apache.commons.lang3.StringUtils; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Service; 13 | 14 | import java.util.ArrayList; 15 | import java.util.Arrays; 16 | import java.util.List; 17 | import java.util.Map; 18 | 19 | /** 20 | * Created by bjjoy on 2017/11/02. 21 | */ 22 | @Service 23 | public class UserServiceImpl implements UserService { 24 | 25 | @Autowired 26 | private UserMapper userMapper; 27 | 28 | @Autowired 29 | private UserRoleMapper userRoleMapper; 30 | 31 | @Override 32 | public int insert(UserDto userDto){ 33 | 34 | //新建用户 35 | User user = DataUtils.getData(userDto, User.class); 36 | userMapper.insertUser(user); 37 | if(userDto.getRoleIdList() != null && userDto.getRoleIdList().size() > 0) { 38 | 39 | //添加用户角色关系 40 | for(Integer roleId : userDto.getRoleIdList()){ 41 | UserRole userRole = new UserRole(userDto.getId(), roleId); 42 | userRoleMapper.insert(userRole); 43 | } 44 | } 45 | return user.getId(); 46 | } 47 | 48 | @Override 49 | public int update(User user){ 50 | return userMapper.updateById(user); 51 | } 52 | 53 | @Override 54 | public List getList(Map param){ 55 | return DataUtils.getDataArray(userMapper.getList(param), Map.class); 56 | } 57 | 58 | @Override 59 | public Integer getCount(Map param){ 60 | return userMapper.getCount(param); 61 | } 62 | 63 | @Override 64 | public User getUserDetail(Integer id){ 65 | return userMapper.getById(id); 66 | } 67 | 68 | @Override 69 | public int updateUser(UserDto userDto){ 70 | 71 | //1.更新用户 72 | User user = DataUtils.getData(userDto, User.class); 73 | int count = userMapper.updateById(user); 74 | if(userDto.getRoleIdList() != null && userDto.getRoleIdList().size() > 0) { 75 | 76 | //2.删除用户角色关系 77 | count += userRoleMapper.deleteByUserId(user.getId()); 78 | 79 | //3.添加用户角色关系 80 | for(Integer roleId : userDto.getRoleIdList()){ 81 | UserRole userRole = new UserRole(userDto.getId(), roleId); 82 | count += userRoleMapper.insert(userRole); 83 | } 84 | } 85 | return count; 86 | } 87 | 88 | @Override 89 | public void deleteUser(User user){ 90 | 91 | //更新del_flag = 1 92 | userMapper.updateById(user); 93 | //删除用户角色关系 94 | userRoleMapper.deleteByUserId(user.getId()); 95 | } 96 | 97 | /** 98 | * 初始化角色id 99 | * @param param 100 | */ 101 | private List getRoleIdList(Map param){ 102 | if(null == param.get("roleIds") || StringUtils.isBlank(param.get("roleIds").toString())) { 103 | return new ArrayList<>(); 104 | } 105 | String roleIds = param.get("roleIds").toString(); 106 | return Arrays.asList(roleIds.split("\\$\\$")); 107 | } 108 | 109 | @Override 110 | public User findUserByName(String loginName){ 111 | return this.userMapper.findUserByName(loginName); 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /src/main/resources/templates/user/grant.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 添加角色 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 |
25 |
26 |
27 |
28 |

为【${user.loginName}】分配角色

29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
选择角色
38 |
39 |
40 |
41 | 42 |
43 | <#list roles as role> 44 |
45 |
46 | 53 |
54 |
55 | 56 |
57 |
58 |
59 | 60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | 68 |
69 | 70 | <#include "${ctx}/common.ftl"> 71 | 93 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /src/main/resources/static/js/respond.min.js: -------------------------------------------------------------------------------- 1 | /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */ 2 | /*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */ 3 | window.matchMedia=window.matchMedia||function(a){"use strict";var c,d=a.documentElement,e=d.firstElementChild||d.firstChild,f=a.createElement("body"),g=a.createElement("div");return g.id="mq-test-1",g.style.cssText="position:absolute;top:-100em",f.style.background="none",f.appendChild(g),function(a){return g.innerHTML='­',d.insertBefore(f,e),c=42===g.offsetWidth,d.removeChild(f),{matches:c,media:a}}}(document); 4 | 5 | /*! Respond.js v1.3.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs */ 6 | (function(a){"use strict";function x(){u(!0)}var b={};if(a.respond=b,b.update=function(){},b.mediaQueriesSupported=a.matchMedia&&a.matchMedia("only all").matches,!b.mediaQueriesSupported){var q,r,t,c=a.document,d=c.documentElement,e=[],f=[],g=[],h={},i=30,j=c.getElementsByTagName("head")[0]||d,k=c.getElementsByTagName("base")[0],l=j.getElementsByTagName("link"),m=[],n=function(){for(var b=0;l.length>b;b++){var c=l[b],d=c.href,e=c.media,f=c.rel&&"stylesheet"===c.rel.toLowerCase();d&&f&&!h[d]&&(c.styleSheet&&c.styleSheet.rawCssText?(p(c.styleSheet.rawCssText,d,e),h[d]=!0):(!/^([a-zA-Z:]*\/\/)/.test(d)&&!k||d.replace(RegExp.$1,"").split("/")[0]===a.location.host)&&m.push({href:d,media:e}))}o()},o=function(){if(m.length){var b=m.shift();v(b.href,function(c){p(c,b.href,b.media),h[b.href]=!0,a.setTimeout(function(){o()},0)})}},p=function(a,b,c){var d=a.match(/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi),g=d&&d.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,"$1"+b+"$2$3")},i=!g&&c;b.length&&(b+="/"),i&&(g=1);for(var j=0;g>j;j++){var k,l,m,n;i?(k=c,f.push(h(a))):(k=d[j].match(/@media *([^\{]+)\{([\S\s]+?)$/)&&RegExp.$1,f.push(RegExp.$2&&h(RegExp.$2))),m=k.split(","),n=m.length;for(var o=0;n>o;o++)l=m[o],e.push({media:l.split("(")[0].match(/(only\s+)?([a-zA-Z]+)\s?/)&&RegExp.$2||"all",rules:f.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},s=function(){var a,b=c.createElement("div"),e=c.body,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",e||(e=f=c.createElement("body"),e.style.background="none"),e.appendChild(b),d.insertBefore(e,d.firstChild),a=b.offsetWidth,f?d.removeChild(e):e.removeChild(b),a=t=parseFloat(a)},u=function(b){var h="clientWidth",k=d[h],m="CSS1Compat"===c.compatMode&&k||c.body[h]||k,n={},o=l[l.length-1],p=(new Date).getTime();if(b&&q&&i>p-q)return a.clearTimeout(r),r=a.setTimeout(u,i),void 0;q=p;for(var v in e)if(e.hasOwnProperty(v)){var w=e[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?t||s():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?t||s():1)),w.hasquery&&(z&&A||!(z||m>=x)||!(A||y>=m))||(n[w.media]||(n[w.media]=[]),n[w.media].push(f[w.rules]))}for(var C in g)g.hasOwnProperty(C)&&g[C]&&g[C].parentNode===j&&j.removeChild(g[C]);for(var D in n)if(n.hasOwnProperty(D)){var E=c.createElement("style"),F=n[D].join("\n");E.type="text/css",E.media=D,j.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(c.createTextNode(F)),g.push(E)}},v=function(a,b){var c=w();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},w=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}();n(),b.update=n,a.addEventListener?a.addEventListener("resize",x,!1):a.attachEvent&&a.attachEvent("onresize",x)}})(this); 7 | -------------------------------------------------------------------------------- /src/main/resources/static/js/jquery.inputlimiter.1.3.1.min.js: -------------------------------------------------------------------------------- 1 | (function($){$.fn.inputlimiter=function(options){var opts=$.extend({},$.fn.inputlimiter.defaults,options),$elements=$(this);if(opts.boxAttach&&!$('#'+opts.boxId).length){$('
').appendTo("body").attr({id:opts.boxId,'class':opts.boxClass}).css({'position':'absolute'}).hide();if($.fn.bgiframe){$('#'+opts.boxId).bgiframe();}} 2 | var inputlimiterKeyup=function(e){var $this=$(this),count=counter($this.val());if(!opts.allowExceed&&count>opts.limit){$this.val(truncater($this.val()));} 3 | if(opts.boxAttach){$('#'+opts.boxId).css({'width':$this.outerWidth()-($('#'+opts.boxId).outerWidth()-$('#'+opts.boxId).width())+'px','left':$this.offset().left+'px','top':($this.offset().top+$this.outerHeight())-1+'px','z-index':2000});} 4 | var charsRemaining=(opts.limit-count>0?opts.limit-count:0),remText=opts.remTextFilter(opts,charsRemaining),limitText=opts.limitTextFilter(opts);if(opts.limitTextShow){$('#'+opts.boxId).html(remText+' '+limitText);var textWidth=$("").appendTo("body").attr({id:'19cc9195583bfae1fad88e19d443be7a','class':opts.boxClass}).html(remText+' '+limitText).innerWidth();$("#19cc9195583bfae1fad88e19d443be7a").remove();if(textWidth>$('#'+opts.boxId).innerWidth()){$('#'+opts.boxId).html(remText+'
'+limitText);} 5 | $('#'+opts.boxId).show();}else{$('#'+opts.boxId).html(remText).show();}},inputlimiterKeypress=function(e){var count=counter($(this).val());if(!opts.allowExceed&&count>opts.limit){var modifierKeyPressed=e.ctrlKey||e.altKey||e.metaKey;if(!modifierKeyPressed&&(e.which>=32&&e.which<=122)&&this.selectionStart===this.selectionEnd){return false;}}},inputlimiterBlur=function(){var $this=$(this);count=counter($this.val());if(!opts.allowExceed&&count>opts.limit){$this.val(truncater($this.val()));} 6 | if(opts.boxAttach){$('#'+opts.boxId).fadeOut('fast');}else if(opts.remTextHideOnBlur){var limitText=opts.limitText;limitText=limitText.replace(/\%n/g,opts.limit);limitText=limitText.replace(/\%s/g,(opts.limit===1?'':'s'));$('#'+opts.boxId).html(limitText);}},counter=function(value){if(opts.limitBy.toLowerCase()==="words"){return(value.length>0?$.trim(value).replace(/\ +(?= )/g,'').split(' ').length:0);} 7 | var count=value.length,newlines=value.match(/\n/g);if(newlines&&opts.lineReturnCount>1){count+=newlines.length*(opts.lineReturnCount-1);} 8 | return count;},truncater=function(value){if(opts.limitBy.toLowerCase()==="words"){return $.trim(value).replace(/\ +(?= )/g,'').split(' ').splice(0,opts.limit).join(' ')+' ';} 9 | return value.substring(0,opts.limit);};$(this).each(function(i){var $this=$(this);if((!options||!options.limit)&&opts.useMaxlength&&parseInt($this.attr('maxlength'))>0&&parseInt($this.attr('maxlength'))!=opts.limit){$this.inputlimiter($.extend({},opts,{limit:parseInt($this.attr('maxlength'))}));}else{if(!opts.allowExceed&&opts.useMaxlength&&opts.limitBy.toLowerCase()==="characters"){$this.attr('maxlength',opts.limit);} 10 | $this.unbind('.inputlimiter');$this.bind('keyup.inputlimiter',inputlimiterKeyup);$this.bind('keypress.inputlimiter',inputlimiterKeypress);$this.bind('blur.inputlimiter',inputlimiterBlur);}});};$.fn.inputlimiter.remtextfilter=function(opts,charsRemaining){var remText=opts.remText;if(charsRemaining===0&&opts.remFullText!==null){remText=opts.remFullText;} 11 | remText=remText.replace(/\%n/g,charsRemaining);remText=remText.replace(/\%s/g,(opts.zeroPlural?(charsRemaining===1?'':'s'):(charsRemaining<=1?'':'s')));return remText;};$.fn.inputlimiter.limittextfilter=function(opts){var limitText=opts.limitText;limitText=limitText.replace(/\%n/g,opts.limit);limitText=limitText.replace(/\%s/g,(opts.limit<=1?'':'s'));return limitText;};$.fn.inputlimiter.defaults={limit:255,boxAttach:true,boxId:'limiterBox',boxClass:'limiterBox',remText:'%n character%s remaining.',remTextFilter:$.fn.inputlimiter.remtextfilter,remTextHideOnBlur:true,remFullText:null,limitTextShow:true,limitText:'Field limited to %n character%s.',limitTextFilter:$.fn.inputlimiter.limittextfilter,zeroPlural:true,allowExceed:false,useMaxlength:true,limitBy:'characters',lineReturnCount:1};})(jQuery); -------------------------------------------------------------------------------- /src/main/resources/templates/role/grant.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 分配资源 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 |
26 |
27 |
28 |
29 |

为【${role.name}】分配资源

30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
选择资源
39 |
40 |
41 |
    42 |
    43 |
    44 |
    45 | 46 |
    47 |
    48 |
    49 | 50 |
    51 | 52 | <#include "${ctx}/common.ftl"> 53 | 54 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /src/main/resources/static/js/jquery.gritter.min.js: -------------------------------------------------------------------------------- 1 | (function(b){b.gritter={};b.gritter.options={position:"",class_name:"",fade_in_speed:"medium",fade_out_speed:1000,time:6000};b.gritter.add=function(f){try{return a.add(f||{})}catch(d){var c="Gritter Error: "+d;(typeof(console)!="undefined"&&console.error)?console.error(c,f):alert(c)}};b.gritter.remove=function(d,c){a.removeSpecific(d,c||{})};b.gritter.removeAll=function(c){a.stop(c||{})};var a={position:"",fade_in_speed:"",fade_out_speed:"",time:"",_custom_timer:0,_item_count:0,_is_setup:0,_tpl_close:'
    ',_tpl_title:'[[title]]',_tpl_item:'',_tpl_wrap:'
    ',add:function(g){if(typeof(g)=="string"){g={text:g}}if(g.text===null){throw'You must supply "text" parameter.'}if(!this._is_setup){this._runSetup()}var k=g.title,n=g.text,e=g.image||"",l=g.sticky||false,m=g.class_name||b.gritter.options.class_name,j=b.gritter.options.position,d=g.time||"";this._verifyWrapper();this._item_count++;var f=this._item_count,i=this._tpl_item;b(["before_open","after_open","before_close","after_close"]).each(function(p,q){a["_"+q+"_"+f]=(b.isFunction(g[q]))?g[q]:function(){}});this._custom_timer=0;if(d){this._custom_timer=d}var c=(e!="")?'':"",h=(e!="")?"gritter-with-image":"gritter-without-image";if(k){k=this._str_replace("[[title]]",k,this._tpl_title)}else{k=""}i=this._str_replace(["[[title]]","[[text]]","[[close]]","[[image]]","[[number]]","[[class_name]]","[[item_class]]"],[k,n,this._tpl_close,c,this._item_count,h,m],i);if(this["_before_open_"+f]()===false){return false}b("#gritter-notice-wrapper").addClass(j).append(i);var o=b("#gritter-item-"+this._item_count);o.fadeIn(this.fade_in_speed,function(){a["_after_open_"+f](b(this))});if(!l){this._setFadeTimer(o,f)}b(o).bind("mouseenter mouseleave",function(p){if(p.type=="mouseenter"){if(!l){a._restoreItemIfFading(b(this),f)}}else{if(!l){a._setFadeTimer(b(this),f)}}a._hoverState(b(this),p.type)});b(o).find(".gritter-close").click(function(){a.removeSpecific(f,{},null,true)});return f},_countRemoveWrapper:function(c,d,f){d.remove();this["_after_close_"+c](d,f);if(b(".gritter-item-wrapper").length==0){b("#gritter-notice-wrapper").remove()}},_fade:function(g,d,j,f){var j=j||{},i=(typeof(j.fade)!="undefined")?j.fade:true,c=j.speed||this.fade_out_speed,h=f;this["_before_close_"+d](g,h);if(f){g.unbind("mouseenter mouseleave")}if(i){g.animate({opacity:0},c,function(){g.animate({height:0},300,function(){a._countRemoveWrapper(d,g,h)})})}else{this._countRemoveWrapper(d,g)}},_hoverState:function(d,c){if(c=="mouseenter"){d.addClass("hover");d.find(".gritter-close").show()}else{d.removeClass("hover");d.find(".gritter-close").hide()}},removeSpecific:function(c,g,f,d){if(!f){var f=b("#gritter-item-"+c)}this._fade(f,c,g||{},d)},_restoreItemIfFading:function(d,c){clearTimeout(this["_int_id_"+c]);d.stop().css({opacity:"",height:""})},_runSetup:function(){for(opt in b.gritter.options){this[opt]=b.gritter.options[opt]}this._is_setup=1},_setFadeTimer:function(f,d){var c=(this._custom_timer)?this._custom_timer:this.time;this["_int_id_"+d]=setTimeout(function(){a._fade(f,d)},c)},stop:function(e){var c=(b.isFunction(e.before_close))?e.before_close:function(){};var f=(b.isFunction(e.after_close))?e.after_close:function(){};var d=b("#gritter-notice-wrapper");c(d);d.fadeOut(function(){b(this).remove();f()})},_str_replace:function(v,e,o,n){var k=0,h=0,t="",m="",g=0,q=0,l=[].concat(v),c=[].concat(e),u=o,d=c instanceof Array,p=u instanceof Array;u=[].concat(u);if(n){this.window[n]=0}for(k=0,g=u.length;k 2 | 4 | 4.0.0 5 | 6 | cn.bjjoy.service 7 | bms 8 | 0.0.1-SNAPSHOT 9 | jar 10 | 11 | bms_demo 12 | auth management service 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.5.8.RELEASE 18 | 19 | 20 | 21 | UTF-8 22 | UTF-8 23 | 1.8 24 | 1.2.4 25 | 26 | 27 | 28 | 29 | org.mybatis.spring.boot 30 | mybatis-spring-boot-starter 31 | 1.3.1 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-web 36 | 37 | 38 | org.springframework.boot 39 | spring-boot-starter-logging 40 | 41 | 42 | 43 | 44 | org.springframework.boot 45 | spring-boot-starter 46 | 47 | 48 | org.springframework.boot 49 | spring-boot-starter-logging 50 | 51 | 52 | 53 | 54 | org.springframework.boot 55 | spring-boot-starter-log4j2 56 | 57 | 58 | 59 | org.springframework.boot 60 | spring-boot-starter-freemarker 61 | 62 | 63 | mysql 64 | mysql-connector-java 65 | runtime 66 | 67 | 68 | org.springframework.boot 69 | spring-boot-starter-test 70 | test 71 | 72 | 73 | com.alibaba 74 | fastjson 75 | 1.2.16 76 | 77 | 78 | com.alibaba 79 | druid 80 | 1.0.0 81 | 82 | 83 | org.apache.commons 84 | commons-lang3 85 | 3.1 86 | 87 | 88 | org.projectlombok 89 | lombok 90 | 1.16.18 91 | 92 | 93 | com.github.pagehelper 94 | pagehelper-spring-boot-starter 95 | 1.2.5 96 | 97 | 98 | 99 | org.springframework.boot 100 | spring-boot-starter-cache 101 | 102 | 103 | net.sf.ehcache 104 | ehcache 105 | 106 | 107 | 108 | org.apache.shiro 109 | shiro-core 110 | ${shiro.version} 111 | 112 | 113 | org.apache.shiro 114 | shiro-spring 115 | ${shiro.version} 116 | 117 | 118 | org.apache.shiro 119 | shiro-web 120 | ${shiro.version} 121 | 122 | 123 | 124 | 125 | 126 | 127 | org.springframework.boot 128 | spring-boot-maven-plugin 129 | 130 | 131 | 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /src/main/resources/static/js/jquery.slimscroll.min.js: -------------------------------------------------------------------------------- 1 | /*! Copyright (c) 2011 Piotr Rochala (http//rocha.la) 2 | * Dual licensed under the MIT (http//www.opensource.org/licenses/mit-license.php) 3 | * and GPL (http//www.opensource.org/licenses/gpl-license.php) licenses. 4 | * 5 | * Version: 1.2.0 6 | * 7 | */ 8 | (function(a){jQuery.fn.extend({slimScroll:function(b){var c={width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:false,disableFadeOut:false,railVisible:false,railColor:"#333",railOpacity:0.2,railDraggable:true,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:false,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"};var d=a.extend(c,b);this.each(function(){var w,r,k,p,z,s,o,j,l="
    ",t=30,q=false;var A=a(this);if(A.parent().hasClass(d.wrapperClass)){var h=A.scrollTop();u=A.parent().find("."+d.barClass);e=A.parent().find("."+d.railClass);B();if(a.isPlainObject(b)){if("height" in b&&b.height=="auto"){A.parent().css("height","auto");A.css("height","auto");var n=A.parent().parent().height();A.parent().css("height",n);A.css("height",n)}if("scrollTo" in b){h=parseInt(d.scrollTo)}else{if("scrollBy" in b){h+=parseInt(d.scrollBy)}else{if("destroy" in b){u.remove();e.remove();A.unwrap();return}}}v(h,false,true)}return}d.height=(d.height=="auto")?A.parent().height():d.height;var i=a(l).addClass(d.wrapperClass).css({position:"relative",overflow:"hidden",width:d.width,height:d.height});A.css({overflow:"hidden",width:d.width,height:d.height});var e=a(l).addClass(d.railClass).css({width:d.size,height:"100%",position:"absolute",top:0,display:(d.alwaysVisible&&d.railVisible)?"block":"none","border-radius":d.railBorderRadius,background:d.railColor,opacity:d.railOpacity,zIndex:90});var u=a(l).addClass(d.barClass).css({background:d.color,width:d.size,position:"absolute",top:0,opacity:d.opacity,display:d.alwaysVisible?"block":"none","border-radius":d.borderRadius,BorderRadius:d.borderRadius,MozBorderRadius:d.borderRadius,WebkitBorderRadius:d.borderRadius,zIndex:99});var f=(d.position=="right")?{right:d.distance}:{left:d.distance};e.css(f);u.css(f);A.wrap(i);A.parent().append(u);A.parent().append(e);if(d.railDraggable&&a.ui&&typeof(a.ui.draggable)=="function"){u.draggable({axis:"y",containment:"parent",start:function(){k=true},stop:function(){k=false;m()},drag:function(C){v(0,a(this).position().top,false)}})}e.hover(function(){g()},function(){m()});u.hover(function(){r=true},function(){r=false});A.hover(function(){w=true;g();m()},function(){w=false;m()});A.bind("touchstart",function(D,C){if(D.originalEvent.touches.length){z=D.originalEvent.touches[0].pageY}});A.bind("touchmove",function(D){D.originalEvent.preventDefault();if(D.originalEvent.touches.length){var C=(z-D.originalEvent.touches[0].pageY)/d.touchScrollStep;v(C,true)}});if(d.start==="bottom"){u.css({top:A.outerHeight()-u.outerHeight()});v(0,true)}else{if(d.start!=="top"){v(a(d.start).position().top,null,true);if(!d.alwaysVisible){u.hide()}}}x();B();function y(D){if(!w){return}var D=D||window.event;var E=0;if(D.wheelDelta){E=-D.wheelDelta/120}if(D.detail){E=D.detail/3}var C=D.target||D.srcTarget||D.srcElement;if(a(C).closest("."+d.wrapperClass).is(A.parent())){v(E,true)}if(D.preventDefault&&!q){D.preventDefault()}if(!q){D.returnValue=false}}function v(H,E,C){var G=H;var F=A.outerHeight()-u.outerHeight();if(E){G=parseInt(u.css("top"))+H*parseInt(d.wheelStep)/100*u.outerHeight();G=Math.min(Math.max(G,0),F);G=(H>0)?Math.ceil(G):Math.floor(G);u.css({top:G+"px"})}o=parseInt(u.css("top"))/(A.outerHeight()-u.outerHeight());G=o*(A[0].scrollHeight-A.outerHeight());if(C){G=H;var D=G/A[0].scrollHeight*A.outerHeight();D=Math.min(Math.max(D,0),F);u.css({top:D+"px"})}A.scrollTop(G);A.trigger("slimscrolling",~~G);g();m()}function x(){if(window.addEventListener){this.addEventListener("DOMMouseScroll",y,false);this.addEventListener("mousewheel",y,false)}else{document.attachEvent("onmousewheel",y)}}function B(){s=Math.max((A.outerHeight()/A[0].scrollHeight)*A.outerHeight(),t);u.css({height:s+"px"});var C=s==A.outerHeight()?"none":"block";u.css({display:C})}function g(){B();clearTimeout(p);if(o==~~o){q=d.allowPageScroll;if(j!=o){var C=(~~o==0)?"top":"bottom";A.trigger("slimscroll",C)}}else{q=false}j=o;if(s>=A.outerHeight()){q=true;return}u.stop(true,true).fadeIn("fast");if(d.railVisible){e.stop(true,true).fadeIn("fast")}}function m(){if(!d.alwaysVisible){p=setTimeout(function(){if(!(d.disableFadeOut&&w)&&!r&&!k){u.fadeOut("slow");e.fadeOut("slow")}},1000)}}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery); --------------------------------------------------------------------------------