├── .gitattributes ├── .gitignore ├── .mvn └── wrapper │ ├── MavenWrapperDownloader.java │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── README.md ├── manager_system.sql ├── pom.xml ├── src ├── main │ ├── java │ │ └── com │ │ │ └── zero │ │ │ └── system │ │ │ ├── ManagerSystemApplication.java │ │ │ ├── config │ │ │ ├── DynamicallyUrlAccessDecisionManager.java │ │ │ ├── DynamicallyUrlInterceptor.java │ │ │ ├── ErrorPageConfig.java │ │ │ ├── MvcConfig.java │ │ │ ├── MyFilterSecurityMetadataSource.java │ │ │ ├── MyRBACConfig.java │ │ │ ├── ReloadSecuritySource.java │ │ │ └── WebSecurityConfig.java │ │ │ ├── controller │ │ │ ├── AdminController.java │ │ │ ├── DispatherController.java │ │ │ ├── ErrorController.java │ │ │ ├── LogController.java │ │ │ ├── ManagerController.java │ │ │ ├── PermissionController.java │ │ │ └── RoleController.java │ │ │ ├── entity │ │ │ ├── Admin.java │ │ │ ├── Icon.java │ │ │ ├── Log.java │ │ │ ├── Role.java │ │ │ └── TreeMenu.java │ │ │ ├── handler │ │ │ ├── LoginFailureHandler.java │ │ │ └── LoginSuccessHandler.java │ │ │ ├── interceptor │ │ │ ├── LogInterceptor.java │ │ │ └── LoginInterceptor.java │ │ │ ├── mapper │ │ │ ├── AdminMapper.java │ │ │ ├── IconMapper.java │ │ │ ├── LogMapper.java │ │ │ ├── RoleMapper.java │ │ │ └── TreeMenuMapper.java │ │ │ ├── service │ │ │ ├── AdminService.java │ │ │ ├── IconService.java │ │ │ ├── Impl │ │ │ │ ├── AdminServiceImpl.java │ │ │ │ ├── IconServiceImpl.java │ │ │ │ ├── LogServiceImpl.java │ │ │ │ ├── RoleServiceImpl.java │ │ │ │ └── TreeMenuServiceImpl.java │ │ │ ├── LogService.java │ │ │ ├── RoleService.java │ │ │ └── TreeMenuService.java │ │ │ └── util │ │ │ ├── AjaxResult.java │ │ │ ├── Const.java │ │ │ ├── Data.java │ │ │ ├── DateUtil.java │ │ │ └── PageBean.java │ └── resources │ │ ├── application.yml │ │ ├── mapper │ │ ├── AdminMapper.xml │ │ ├── IconMapper.xml │ │ ├── LogMapper.xml │ │ ├── RoleMapper.xml │ │ └── TreeMenuMapper.xml │ │ ├── static │ │ ├── font-awesome-4.7.0 │ │ │ ├── css │ │ │ │ ├── font-awesome.css │ │ │ │ └── font-awesome.min.css │ │ │ ├── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ ├── less │ │ │ │ ├── animated.less │ │ │ │ ├── bordered-pulled.less │ │ │ │ ├── core.less │ │ │ │ ├── fixed-width.less │ │ │ │ ├── font-awesome.less │ │ │ │ ├── icons.less │ │ │ │ ├── larger.less │ │ │ │ ├── list.less │ │ │ │ ├── mixins.less │ │ │ │ ├── path.less │ │ │ │ ├── rotated-flipped.less │ │ │ │ ├── screen-reader.less │ │ │ │ ├── stacked.less │ │ │ │ └── variables.less │ │ │ └── scss │ │ │ │ ├── _animated.scss │ │ │ │ ├── _bordered-pulled.scss │ │ │ │ ├── _core.scss │ │ │ │ ├── _fixed-width.scss │ │ │ │ ├── _icons.scss │ │ │ │ ├── _larger.scss │ │ │ │ ├── _list.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _path.scss │ │ │ │ ├── _rotated-flipped.scss │ │ │ │ ├── _screen-reader.scss │ │ │ │ ├── _stacked.scss │ │ │ │ ├── _variables.scss │ │ │ │ └── font-awesome.scss │ │ ├── layuiadmin │ │ │ ├── config.js │ │ │ ├── extend │ │ │ │ └── treetable │ │ │ │ │ ├── treetable.css │ │ │ │ │ └── treetable.js │ │ │ ├── layui │ │ │ │ ├── css │ │ │ │ │ ├── layui.css │ │ │ │ │ ├── layui.mobile.css │ │ │ │ │ └── modules │ │ │ │ │ │ ├── code.css │ │ │ │ │ │ ├── laydate │ │ │ │ │ │ └── default │ │ │ │ │ │ │ ├── font.css │ │ │ │ │ │ │ └── laydate.css │ │ │ │ │ │ ├── layer │ │ │ │ │ │ └── default │ │ │ │ │ │ │ ├── icon-ext.png │ │ │ │ │ │ │ ├── icon.png │ │ │ │ │ │ │ ├── layer.css │ │ │ │ │ │ │ ├── loading-0.gif │ │ │ │ │ │ │ ├── loading-1.gif │ │ │ │ │ │ │ └── loading-2.gif │ │ │ │ │ │ └── layim │ │ │ │ │ │ ├── html │ │ │ │ │ │ ├── chatlog.html │ │ │ │ │ │ ├── find.html │ │ │ │ │ │ ├── getmsg.json │ │ │ │ │ │ └── msgbox.html │ │ │ │ │ │ ├── layim.css │ │ │ │ │ │ ├── mobile │ │ │ │ │ │ └── layim.css │ │ │ │ │ │ ├── skin │ │ │ │ │ │ ├── 1.jpg │ │ │ │ │ │ ├── 2.jpg │ │ │ │ │ │ ├── 3.jpg │ │ │ │ │ │ ├── 4.jpg │ │ │ │ │ │ ├── 5.jpg │ │ │ │ │ │ └── logo.jpg │ │ │ │ │ │ └── voice │ │ │ │ │ │ └── default.mp3 │ │ │ │ ├── font │ │ │ │ │ ├── iconfont.eot │ │ │ │ │ ├── iconfont.svg │ │ │ │ │ ├── iconfont.ttf │ │ │ │ │ └── iconfont.woff │ │ │ │ ├── images │ │ │ │ │ └── face │ │ │ │ │ │ ├── 0.gif │ │ │ │ │ │ ├── 1.gif │ │ │ │ │ │ ├── 10.gif │ │ │ │ │ │ ├── 11.gif │ │ │ │ │ │ ├── 12.gif │ │ │ │ │ │ ├── 13.gif │ │ │ │ │ │ ├── 14.gif │ │ │ │ │ │ ├── 15.gif │ │ │ │ │ │ ├── 16.gif │ │ │ │ │ │ ├── 17.gif │ │ │ │ │ │ ├── 18.gif │ │ │ │ │ │ ├── 19.gif │ │ │ │ │ │ ├── 2.gif │ │ │ │ │ │ ├── 20.gif │ │ │ │ │ │ ├── 21.gif │ │ │ │ │ │ ├── 22.gif │ │ │ │ │ │ ├── 23.gif │ │ │ │ │ │ ├── 24.gif │ │ │ │ │ │ ├── 25.gif │ │ │ │ │ │ ├── 26.gif │ │ │ │ │ │ ├── 27.gif │ │ │ │ │ │ ├── 28.gif │ │ │ │ │ │ ├── 29.gif │ │ │ │ │ │ ├── 3.gif │ │ │ │ │ │ ├── 30.gif │ │ │ │ │ │ ├── 31.gif │ │ │ │ │ │ ├── 32.gif │ │ │ │ │ │ ├── 33.gif │ │ │ │ │ │ ├── 34.gif │ │ │ │ │ │ ├── 35.gif │ │ │ │ │ │ ├── 36.gif │ │ │ │ │ │ ├── 37.gif │ │ │ │ │ │ ├── 38.gif │ │ │ │ │ │ ├── 39.gif │ │ │ │ │ │ ├── 4.gif │ │ │ │ │ │ ├── 40.gif │ │ │ │ │ │ ├── 41.gif │ │ │ │ │ │ ├── 42.gif │ │ │ │ │ │ ├── 43.gif │ │ │ │ │ │ ├── 44.gif │ │ │ │ │ │ ├── 45.gif │ │ │ │ │ │ ├── 46.gif │ │ │ │ │ │ ├── 47.gif │ │ │ │ │ │ ├── 48.gif │ │ │ │ │ │ ├── 49.gif │ │ │ │ │ │ ├── 5.gif │ │ │ │ │ │ ├── 50.gif │ │ │ │ │ │ ├── 51.gif │ │ │ │ │ │ ├── 52.gif │ │ │ │ │ │ ├── 53.gif │ │ │ │ │ │ ├── 54.gif │ │ │ │ │ │ ├── 55.gif │ │ │ │ │ │ ├── 56.gif │ │ │ │ │ │ ├── 57.gif │ │ │ │ │ │ ├── 58.gif │ │ │ │ │ │ ├── 59.gif │ │ │ │ │ │ ├── 6.gif │ │ │ │ │ │ ├── 60.gif │ │ │ │ │ │ ├── 61.gif │ │ │ │ │ │ ├── 62.gif │ │ │ │ │ │ ├── 63.gif │ │ │ │ │ │ ├── 64.gif │ │ │ │ │ │ ├── 65.gif │ │ │ │ │ │ ├── 66.gif │ │ │ │ │ │ ├── 67.gif │ │ │ │ │ │ ├── 68.gif │ │ │ │ │ │ ├── 69.gif │ │ │ │ │ │ ├── 7.gif │ │ │ │ │ │ ├── 70.gif │ │ │ │ │ │ ├── 71.gif │ │ │ │ │ │ ├── 8.gif │ │ │ │ │ │ └── 9.gif │ │ │ │ ├── lay │ │ │ │ │ ├── all-mobile.js │ │ │ │ │ ├── all.js │ │ │ │ │ └── modules │ │ │ │ │ │ ├── carousel.js │ │ │ │ │ │ ├── code.js │ │ │ │ │ │ ├── element.js │ │ │ │ │ │ ├── flow.js │ │ │ │ │ │ ├── form.js │ │ │ │ │ │ ├── jquery.js │ │ │ │ │ │ ├── laydate.js │ │ │ │ │ │ ├── layedit.js │ │ │ │ │ │ ├── layer.js │ │ │ │ │ │ ├── layim.js │ │ │ │ │ │ ├── laypage.js │ │ │ │ │ │ ├── laytpl.js │ │ │ │ │ │ ├── mobile.js │ │ │ │ │ │ ├── mobile │ │ │ │ │ │ ├── layer-mobile.js │ │ │ │ │ │ ├── layim-mobile-open.js │ │ │ │ │ │ ├── layim-mobile.js │ │ │ │ │ │ ├── upload-mobile.js │ │ │ │ │ │ └── zepto.js │ │ │ │ │ │ ├── rate.js │ │ │ │ │ │ ├── table.js │ │ │ │ │ │ ├── tree.js │ │ │ │ │ │ ├── upload.js │ │ │ │ │ │ └── util.js │ │ │ │ ├── layui.all.js │ │ │ │ └── layui.js │ │ │ ├── lib │ │ │ │ ├── admin.js │ │ │ │ ├── extend │ │ │ │ │ ├── echarts.js │ │ │ │ │ └── echartsTheme.js │ │ │ │ ├── index.js │ │ │ │ └── view.js │ │ │ ├── modules │ │ │ │ ├── common.js │ │ │ │ ├── console.js │ │ │ │ ├── contlist.js │ │ │ │ ├── forum.js │ │ │ │ ├── im.js │ │ │ │ ├── message.js │ │ │ │ ├── sample.js │ │ │ │ ├── senior.js │ │ │ │ ├── set.js │ │ │ │ ├── user.js │ │ │ │ ├── useradmin.js │ │ │ │ └── workorder.js │ │ │ └── style │ │ │ │ ├── admin.css │ │ │ │ ├── login.css │ │ │ │ ├── res │ │ │ │ ├── bg-none.jpg │ │ │ │ ├── layui-logo.jpg │ │ │ │ ├── logo-black.png │ │ │ │ ├── logo.png │ │ │ │ └── template │ │ │ │ │ ├── character.jpg │ │ │ │ │ ├── huge.jpg │ │ │ │ │ └── portrait.png │ │ │ │ └── template.css │ │ └── mystatic │ │ │ ├── login │ │ │ └── css │ │ │ │ └── login.css │ │ │ └── particles │ │ │ ├── css │ │ │ └── style.css │ │ │ └── js │ │ │ ├── app.js │ │ │ └── particles.js │ │ └── templates │ │ └── manager │ │ ├── admin │ │ ├── addAdmin.html │ │ └── adminList.html │ │ ├── common │ │ ├── header.html │ │ ├── info.html │ │ ├── password.html │ │ └── sidebar.html │ │ ├── console.html │ │ ├── error │ │ └── error403.html │ │ ├── index.html │ │ ├── log │ │ └── logList.html │ │ ├── login.html │ │ ├── permission │ │ ├── addParentNode.html │ │ ├── addPermission.html │ │ └── permissionList.html │ │ └── role │ │ ├── addRole.html │ │ ├── allotPer.html │ │ └── roleList.html └── test │ └── java │ └── com │ └── zero │ └── system │ └── ManagerSystemApplicationTests.java └── 项目截图 ├── 1.png ├── 10.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png └── 9.png /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=java 2 | *.css linguist-language=java 3 | *.html linguist-language=java -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Java template 2 | *.class 3 | 4 | # Mobile Tools for Java (J2ME) 5 | .mtj.tmp/ 6 | 7 | # Package Files # 8 | *.jar 9 | *.war 10 | *.ear 11 | 12 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 13 | hs_err_pid* 14 | ### JetBrains template 15 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 16 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 17 | 18 | # User-specific stuff: 19 | .idea/workspace.xml 20 | .idea/tasks.xml 21 | .idea/dictionaries 22 | .idea/vcs.xml 23 | .idea/jsLibraryMappings.xml 24 | 25 | # Sensitive or high-churn files: 26 | .idea/dataSources.ids 27 | .idea/dataSources.xml 28 | .idea/dataSources.local.xml 29 | .idea/sqlDataSources.xml 30 | .idea/dynamic.xml 31 | .idea/uiDesigner.xml 32 | 33 | # Gradle: 34 | .idea/gradle.xml 35 | .idea/ 36 | 37 | # Mongo Explorer plugin: 38 | .idea/mongoSettings.xml 39 | 40 | ## File-based project format: 41 | *.iws 42 | 43 | ## Plugin-specific files: 44 | 45 | # IntelliJ 46 | /out/ 47 | 48 | # mpeltonen/sbt-idea plugin 49 | .idea_modules/ 50 | 51 | # JIRA plugin 52 | atlassian-ide-plugin.xml 53 | 54 | # Crashlytics plugin (for Android Studio and IntelliJ) 55 | com_crashlytics_export_strings.xml 56 | crashlytics.properties 57 | crashlytics-build.properties 58 | fabric.properties 59 | ### Windows template 60 | # Windows image file caches 61 | Thumbs.db 62 | ehthumbs.db 63 | 64 | # Folder config file 65 | Desktop.ini 66 | 67 | # Recycle Bin used on file shares 68 | $RECYCLE.BIN/ 69 | 70 | # Windows Installer files 71 | *.cab 72 | *.msi 73 | *.msm 74 | *.msp 75 | 76 | # Windows shortcuts 77 | *.lnk 78 | ### Maven template 79 | target/ 80 | pom.xml.tag 81 | pom.xml.releaseBackup 82 | pom.xml.versionsBackup 83 | pom.xml.next 84 | release.properties 85 | dependency-reduced-pom.xml 86 | buildNumber.properties 87 | .mvn/timing.properties 88 | # ignore eclipse files 89 | .project 90 | .classpath 91 | .settings 92 | .metadata 93 | 94 | .mvn -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 后台管理系统 2 | 3 | ## 感谢: 4 | 5 | **首先感谢各位对我项目的支持,由于我一般是将项目更新在GitHub上,因此在Gitee上项目可能不是最新的。并且Gitee我并不经常使用主要使用GitHub,如果大家有问题可以在GitHub上留言。因此有一些bug可能在Gitee上没有更改,再次向各位说声抱歉。目前这个项目其实早就完成,只是忘了更新Gitee上。最后再次谢谢大家的支持。** 6 | 7 | **最后关于一些问题回复:这个小项目是有两个分支的,一个是基于过滤器完成的权限校验,一个是基于spring security完成的校验。大家可以在tag上对应下载。默认是使用spring security这个分支。对于初学者我建议可以下载第一个分支。** 8 | 9 | GitGub地址:https://github.com/ZeroWdd 10 | 11 | ## 简介: 12 | 简单的后台开发模板框架,具备菜单管理,用户管理,角色管理,权限管理,日志管理这5个功能。 13 | 14 | 运用layui后台管理模板,界面简介大方且美观。 15 | 16 | 采用mvc架构,使代码易于管理和修改,合理的注解,使代码通俗易懂,具有较强的阅读性。 17 | 18 | ## 编译环境: 19 | 20 | > jdk 1.8 21 | > 22 | > mysql 5.7 23 | > 24 | > tomcat 7 25 | 26 | ## 框架: 27 | 28 | > springboot2.0 29 | > 30 | > mybatis 31 | > 32 | > spring security 33 | 34 | ## jar包管理工具: 35 | 36 | > Maven 37 | 38 | ## 编译器: 39 | 40 | > IDEA 41 | 42 | ## 完成进度: 43 | 44 | > manager_system_1.0.0版本完成 从tag中 V1.0.0可获取完整版本 45 | > 46 | > manager_system_2.0.0版本打算结合spring security完成 从tag中 V2.0.0可获取完整版本 47 | 48 | ## 系统功能: 49 | 50 | > 控制面板 51 | > 52 | > 用户管理: 53 | > 54 | > > 用户管理 55 | > > 56 | > > 角色管理 57 | > > 58 | > > 权限管理 59 | > 60 | > 系统日志: 61 | > 62 | > > 日志管理 63 | 64 | ## 启动设置: 65 | * 修改application.yml中的数据链接 66 | 67 | * 执行`mysql -uroot -p 数据库 < manager_system.sql`导入数据库脚本。 68 | * 运行`ManagerSystemApplication`,启动后访问: 69 | * 管理员: 70 | * 账号:`superadmin` 71 | * 密码: `123` 72 | 73 | 74 | ## 数据表关系: 75 | 76 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/10.png) 77 | 78 | ## 项目截图: 79 | 80 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/1.png) 81 | 82 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/2.png) 83 | 84 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/3.png) 85 | 86 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/4.png) 87 | 88 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/5.png) 89 | 90 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/6.png) 91 | 92 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/7.png) 93 | 94 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/8.png) 95 | 96 | ![](https://gitee.com/ZeroWdd/manager-system/raw/master/%E9%A1%B9%E7%9B%AE%E6%88%AA%E5%9B%BE/9.png) 97 | 98 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.1.6.RELEASE 9 | 10 | 11 | com.zero.system 12 | manager-system 13 | 0.0.1-SNAPSHOT 14 | manager-system 15 | Demo project for Spring Boot 16 | 17 | 18 | 1.8 19 | 20 | 21 | 22 | 23 | org.springframework.boot 24 | spring-boot-starter 25 | 26 | 27 | 28 | org.springframework.boot 29 | spring-boot-starter-test 30 | test 31 | 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-web 36 | 37 | 38 | org.springframework.boot 39 | spring-boot-starter-thymeleaf 40 | 41 | 42 | org.springframework.session 43 | spring-session-core 44 | 45 | 46 | org.springframework.boot 47 | spring-boot-starter-aop 48 | 49 | 50 | org.mybatis.spring.boot 51 | mybatis-spring-boot-starter 52 | 1.3.2 53 | 54 | 55 | mysql 56 | mysql-connector-java 57 | runtime 58 | 59 | 60 | org.springframework.boot 61 | spring-boot-starter-security 62 | 63 | 64 | com.alibaba 65 | fastjson 66 | 1.2.41 67 | 68 | 69 | org.projectlombok 70 | lombok 71 | 72 | 73 | 74 | 75 | 76 | 77 | org.springframework.boot 78 | spring-boot-maven-plugin 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/ManagerSystemApplication.java: -------------------------------------------------------------------------------- 1 | package com.zero.system; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @MapperScan("com.zero.system.mapper") 8 | @SpringBootApplication 9 | public class ManagerSystemApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(ManagerSystemApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/config/DynamicallyUrlAccessDecisionManager.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.config; 2 | 3 | import org.springframework.security.access.AccessDecisionVoter; 4 | import org.springframework.security.access.AccessDeniedException; 5 | import org.springframework.security.access.ConfigAttribute; 6 | import org.springframework.security.access.vote.AbstractAccessDecisionManager; 7 | import org.springframework.security.authentication.InsufficientAuthenticationException; 8 | import org.springframework.security.core.Authentication; 9 | 10 | import java.util.Collection; 11 | import java.util.List; 12 | 13 | public class DynamicallyUrlAccessDecisionManager extends AbstractAccessDecisionManager { 14 | 15 | public DynamicallyUrlAccessDecisionManager(List> decisionVoters) { 16 | super(decisionVoters); 17 | } 18 | 19 | @Override 20 | public void decide(Authentication authentication, Object object, Collection configAttributes) 21 | throws AccessDeniedException, InsufficientAuthenticationException { 22 | int deny = 0; 23 | 24 | for (AccessDecisionVoter voter : getDecisionVoters()) { 25 | int result = voter.vote(authentication, object, configAttributes); 26 | 27 | if (logger.isDebugEnabled()) { 28 | logger.debug("Voter: " + voter + ", returned: " + result); 29 | } 30 | 31 | switch (result) { 32 | case AccessDecisionVoter.ACCESS_GRANTED: 33 | return; 34 | 35 | case AccessDecisionVoter.ACCESS_DENIED: 36 | deny++; 37 | 38 | break; 39 | 40 | default: 41 | break; 42 | } 43 | } 44 | 45 | if (deny > 0) { 46 | throw new AccessDeniedException(messages.getMessage( 47 | "AbstractAccessDecisionManager.accessDenied", "Access is denied")); 48 | } 49 | 50 | // To get this far, every AccessDecisionVoter abstained 51 | checkAllowIfAllAbstainDecisions(); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/config/DynamicallyUrlInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.config; 2 | 3 | import org.springframework.security.access.AccessDecisionManager; 4 | import org.springframework.security.access.SecurityMetadataSource; 5 | import org.springframework.security.access.intercept.AbstractSecurityInterceptor; 6 | import org.springframework.security.access.intercept.InterceptorStatusToken; 7 | import org.springframework.security.web.FilterInvocation; 8 | import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource; 9 | 10 | import javax.servlet.*; 11 | import java.io.IOException; 12 | 13 | public class DynamicallyUrlInterceptor extends AbstractSecurityInterceptor implements Filter { 14 | 15 | //标记自定义的url拦截器已经加载 16 | private static final String FILTER_APPLIED = "__spring_security_filterSecurityInterceptor_filterApplied_dynamically"; 17 | 18 | private FilterInvocationSecurityMetadataSource securityMetadataSource; 19 | private boolean observeOncePerRequest = true; 20 | 21 | 22 | @Override 23 | public Class getSecureObjectClass() { 24 | return FilterInvocation.class; 25 | } 26 | 27 | @Override 28 | public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 29 | FilterInvocation fi = new FilterInvocation(request, response, chain); 30 | invoke(fi); 31 | } 32 | 33 | @Override 34 | public void init(FilterConfig filterConfig) throws ServletException { 35 | } 36 | 37 | @Override 38 | public void destroy() { 39 | } 40 | 41 | public FilterInvocationSecurityMetadataSource getSecurityMetadataSource() { 42 | return this.securityMetadataSource; 43 | } 44 | 45 | public SecurityMetadataSource obtainSecurityMetadataSource() { 46 | return this.securityMetadataSource; 47 | } 48 | 49 | public void setSecurityMetadataSource(FilterInvocationSecurityMetadataSource newSource) { 50 | this.securityMetadataSource = newSource; 51 | } 52 | 53 | @Override 54 | public void setAccessDecisionManager(AccessDecisionManager accessDecisionManager) { 55 | super.setAccessDecisionManager(accessDecisionManager); 56 | } 57 | 58 | public void invoke(FilterInvocation fi) throws IOException, ServletException { 59 | 60 | if ((fi.getRequest() != null) 61 | && (fi.getRequest().getAttribute(FILTER_APPLIED) != null) 62 | && observeOncePerRequest) { 63 | // filter already applied to this request and user wants us to observe 64 | // once-per-request handling, so don't re-do security checking 65 | fi.getChain().doFilter(fi.getRequest(), fi.getResponse()); 66 | } 67 | else { 68 | // first time this request being called, so perform security checking 69 | if (fi.getRequest() != null) { 70 | fi.getRequest().setAttribute(FILTER_APPLIED, Boolean.TRUE); 71 | } 72 | 73 | InterceptorStatusToken token = super.beforeInvocation(fi); 74 | 75 | try { 76 | fi.getChain().doFilter(fi.getRequest(), fi.getResponse()); 77 | } 78 | finally { 79 | super.finallyInvocation(token); 80 | } 81 | 82 | super.afterInvocation(token, null); 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/config/ErrorPageConfig.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.config; 2 | 3 | import org.springframework.boot.web.server.ErrorPage; 4 | import org.springframework.boot.web.server.ErrorPageRegistrar; 5 | import org.springframework.boot.web.server.ErrorPageRegistry; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * @Auther: wdd 11 | * @Date: 2019/12/29 14:49 12 | * @Description: 13 | */ 14 | @Component 15 | public class ErrorPageConfig implements ErrorPageRegistrar { 16 | 17 | @Override 18 | public void registerErrorPages(ErrorPageRegistry registry) { 19 | ErrorPage error400Page = new ErrorPage(HttpStatus.BAD_REQUEST,"/manager/error/error400" ); 20 | ErrorPage error401Page = new ErrorPage(HttpStatus.UNAUTHORIZED,"/manager/error/error401"); 21 | ErrorPage error403Page = new ErrorPage(HttpStatus.FORBIDDEN,"/manager/error/error403"); 22 | ErrorPage error500Page = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/manager/error/error500"); 23 | registry.addErrorPages(error400Page,error401Page,error403Page,error500Page); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/config/MvcConfig.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.config; 2 | 3 | import com.zero.system.interceptor.LogInterceptor; 4 | import com.zero.system.interceptor.LoginInterceptor; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 8 | import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 9 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 10 | 11 | /** 12 | * @Classname MvcConfig 13 | * @Description None 14 | * @Date 2019/7/16 10:08 15 | * @Created by WDD 16 | */ 17 | @Configuration 18 | public class MvcConfig implements WebMvcConfigurer { 19 | 20 | @Bean 21 | public LogInterceptor setBean(){ 22 | return new LogInterceptor(); // 注入spring 23 | } 24 | 25 | @Override 26 | public void addResourceHandlers(ResourceHandlerRegistry registry) { 27 | //registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); 28 | } 29 | 30 | @Override 31 | public void addInterceptors(InterceptorRegistry registry) { 32 | // registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/manager/**") 33 | // .excludePathPatterns("/static/**","/","/manager/login"); 34 | registry.addInterceptor(setBean()).addPathPatterns("/manager/**") 35 | .excludePathPatterns("/static/**","/","/manager/login"); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/config/MyRBACConfig.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.config; 2 | 3 | import com.zero.system.entity.Admin; 4 | import com.zero.system.entity.TreeMenu; 5 | import com.zero.system.mapper.TreeMenuMapper; 6 | import org.springframework.security.core.Authentication; 7 | import org.springframework.stereotype.Component; 8 | import org.springframework.util.AntPathMatcher; 9 | 10 | import javax.annotation.Resource; 11 | import javax.servlet.http.HttpServletRequest; 12 | import java.util.List; 13 | 14 | /** 15 | * @Auther: wdd 16 | * @Date: 2020/1/8 15:00 17 | * @Description: 18 | */ 19 | @Component("rbacConfig") 20 | public class MyRBACConfig { 21 | 22 | @Resource 23 | private TreeMenuMapper treeMenuMapper; 24 | 25 | private AntPathMatcher antPathMatcher = new AntPathMatcher(); 26 | 27 | /** 28 | * 判断某用户是否有request的权限 29 | * @param request 30 | * @param authentication 31 | * @return 32 | */ 33 | public boolean hasPermission(HttpServletRequest request, Authentication authentication){ 34 | Object principal = authentication.getPrincipal(); 35 | if(principal instanceof Admin){ 36 | String username = ((Admin) principal).getUsername(); 37 | List list = treeMenuMapper.selectByUserName(username); 38 | List listUrl = treeMenuMapper.selectURLAll(); 39 | boolean b = listUrl.stream().anyMatch( // 若该请求不存在所有权限中,则可能是静态资源,放行 40 | url -> antPathMatcher.match(url, request.getRequestURI()) 41 | ); 42 | if(!b){ 43 | return true; 44 | }else{ 45 | // 存在所有权限中,再进行管理员所拥有的权限比较 46 | return list.stream().anyMatch( 47 | url -> antPathMatcher.match(url, request.getRequestURI()) 48 | ); 49 | } 50 | } 51 | 52 | return false; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/config/ReloadSecuritySource.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.config; 2 | 3 | import com.zero.system.entity.Role; 4 | import com.zero.system.entity.TreeMenu; 5 | import com.zero.system.mapper.RoleMapper; 6 | import com.zero.system.mapper.TreeMenuMapper; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.security.access.ConfigAttribute; 10 | import org.springframework.security.access.SecurityConfig; 11 | import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 12 | import org.springframework.security.web.util.matcher.RequestMatcher; 13 | import org.springframework.stereotype.Component; 14 | import org.springframework.util.StringUtils; 15 | 16 | import java.util.ArrayList; 17 | import java.util.Collection; 18 | import java.util.HashMap; 19 | import java.util.Map; 20 | 21 | /** 22 | * @Auther: wdd 23 | * @Date: 2020/1/1 14:10 24 | * @Description: 25 | */ 26 | @Component 27 | public class ReloadSecuritySource { 28 | 29 | @Autowired 30 | private RoleMapper roleMapper; 31 | @Autowired 32 | private TreeMenuMapper treeMenuMapper; 33 | 34 | public void getReloadSecuritySource(){ 35 | Map> map = new HashMap<>(); 36 | for(TreeMenu m : treeMenuMapper.selectAll()){ 37 | if(!StringUtils.isEmpty(m.getUrl())){ 38 | AntPathRequestMatcher matcher = new AntPathRequestMatcher(m.getUrl()); 39 | ArrayList configs = new ArrayList<>(); 40 | for(Role r : roleMapper.findByTreeMenuId(m.getId())){ 41 | org.springframework.security.access.SecurityConfig config = new SecurityConfig(r.getName()); 42 | configs.add(config); 43 | } 44 | map.put(matcher,configs); 45 | } 46 | } 47 | new MyFilterSecurityMetadataSource(map); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/config/WebSecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.config; 2 | 3 | import com.zero.system.handler.LoginFailureHandler; 4 | import com.zero.system.handler.LoginSuccessHandler; 5 | import com.zero.system.service.AdminService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.security.access.AccessDecisionVoter; 10 | import org.springframework.security.access.vote.RoleVoter; 11 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 12 | import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 13 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 14 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 15 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 16 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 17 | import org.springframework.security.web.access.intercept.FilterSecurityInterceptor; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | /** 23 | * @Auther: wdd 24 | * @Date: 2019/12/29 14:12 25 | * @Description: 26 | */ 27 | @Configuration 28 | @EnableWebSecurity 29 | //@EnableGlobalMethodSecurity(securedEnabled = true) 30 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 31 | 32 | @Autowired 33 | private AdminService adminService; 34 | 35 | @Autowired 36 | private LoginSuccessHandler loginSuccessHandler; 37 | @Autowired 38 | private LoginFailureHandler loginFailureHandler; 39 | 40 | @Bean 41 | public BCryptPasswordEncoder passwordEncoder(){ 42 | return new BCryptPasswordEncoder(); 43 | } 44 | 45 | @Override 46 | protected void configure(HttpSecurity http) throws Exception { 47 | http//.addFilterAfter(dynamicallyUrlInterceptor(), FilterSecurityInterceptor.class) 48 | .authorizeRequests() 49 | .antMatchers("/manager/login").permitAll() 50 | .antMatchers("/mystatic/**","/layuiadmin/**","/font-awesome-4.7.0/**").permitAll() 51 | //.antMatchers("/**") 52 | //.fullyAuthenticated() 53 | .anyRequest().access("@rbacConfig.hasPermission(request,authentication)") 54 | .and() 55 | .formLogin().loginPage("/manager/login").successHandler(loginSuccessHandler).failureHandler(loginFailureHandler) 56 | .and() 57 | .headers().frameOptions().disable() // 防止报Refused to display in a frame because it set 'X-Frame-Options' to 'DENY'错误 58 | .and() 59 | .csrf().disable(); 60 | } 61 | 62 | @Override 63 | protected void configure(AuthenticationManagerBuilder auth) throws Exception { 64 | auth.userDetailsService(adminService) 65 | .passwordEncoder(passwordEncoder()); 66 | } 67 | 68 | // @Bean 69 | // public DynamicallyUrlInterceptor dynamicallyUrlInterceptor(){ 70 | // DynamicallyUrlInterceptor interceptor = new DynamicallyUrlInterceptor(); 71 | // interceptor.setSecurityMetadataSource(new MyFilterSecurityMetadataSource()); 72 | // 73 | // //配置RoleVoter决策 74 | // List> decisionVoters = new ArrayList>(); 75 | // decisionVoters.add(new RoleVoter()); 76 | // //设置认证决策管理器 77 | // interceptor.setAccessDecisionManager(new DynamicallyUrlAccessDecisionManager(decisionVoters)); 78 | // return interceptor; 79 | // } 80 | } 81 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/controller/ErrorController.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.controller; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | /** 7 | * @Auther: wdd 8 | * @Date: 2019/12/29 15:02 9 | * @Description: 10 | */ 11 | @Controller 12 | @RequestMapping("/manager/error") 13 | public class ErrorController { 14 | @RequestMapping("/error403") 15 | public String error403(){ 16 | return "/manager/error/error403"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/controller/LogController.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.controller; 2 | 3 | import com.zero.system.entity.Log; 4 | import com.zero.system.service.LogService; 5 | import com.zero.system.util.AjaxResult; 6 | import com.zero.system.util.Data; 7 | import com.zero.system.util.PageBean; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Controller; 10 | import org.springframework.util.StringUtils; 11 | import org.springframework.web.bind.annotation.*; 12 | 13 | import java.util.HashMap; 14 | import java.util.Map; 15 | 16 | /** 17 | * @Classname LogController 18 | * @Description None 19 | * @Date 2019/7/24 15:37 20 | * @Created by WDD 21 | */ 22 | @Controller 23 | @RequestMapping("/manager") 24 | public class LogController { 25 | 26 | @Autowired 27 | private AjaxResult ajaxResult; 28 | @Autowired 29 | private LogService logService; 30 | 31 | /** 32 | * 日志页面 33 | * @return 34 | */ 35 | @GetMapping("/log") 36 | public String log(){ 37 | return "manager/log/logList"; 38 | } 39 | 40 | 41 | /** 42 | * 异步加载日志列表 43 | * @param pageno 44 | * @param pagesize 45 | * @param username 46 | * @param logTime 47 | * @return 48 | */ 49 | @RequestMapping("/logList") 50 | @ResponseBody 51 | public Object adminList(@RequestParam(value = "page", defaultValue = "1") Integer pageno, 52 | @RequestParam(value = "limit", defaultValue = "20") Integer pagesize, 53 | String username,String logTime){ 54 | Map paramMap = new HashMap(); 55 | paramMap.put("pageno",pageno); 56 | paramMap.put("pagesize",pagesize); 57 | 58 | //判断是否为空 59 | if(!StringUtils.isEmpty(username)) paramMap.put("username",username); 60 | if(!StringUtils.isEmpty(logTime)){ 61 | String[] split = logTime.split(" - "); 62 | paramMap.put("stime",split[0]); 63 | paramMap.put("ftime",split[1]); 64 | } 65 | 66 | PageBean pageBean = logService.queryPage(paramMap); 67 | 68 | Map rest = new HashMap(); 69 | rest.put("code", 0); 70 | rest.put("msg", ""); 71 | rest.put("count",pageBean.getTotalsize()); 72 | rest.put("data", pageBean.getDatas()); 73 | return rest; 74 | } 75 | 76 | 77 | @PostMapping("/delLog") 78 | @ResponseBody 79 | public AjaxResult delLog(Data data){ 80 | int count = logService.delByLogIds(data.getIds()); 81 | if(count >= data.getIds().size()){ 82 | ajaxResult.ajaxTrue("删除成功"); 83 | }else{ 84 | ajaxResult.ajaxFalse("删除失败"); 85 | } 86 | return ajaxResult; 87 | } 88 | 89 | 90 | } 91 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/controller/ManagerController.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.controller; 2 | 3 | import com.zero.system.entity.Admin; 4 | import com.zero.system.entity.TreeMenu; 5 | import com.zero.system.service.TreeMenuService; 6 | import com.zero.system.util.AjaxResult; 7 | import com.zero.system.util.Const; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Controller; 10 | import org.springframework.util.StringUtils; 11 | import org.springframework.web.bind.annotation.GetMapping; 12 | import org.springframework.web.bind.annotation.PostMapping; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.ResponseBody; 15 | 16 | import javax.servlet.http.HttpSession; 17 | import java.util.List; 18 | 19 | /** 20 | * @Classname ManagerController 21 | * @Description 后台控制器 22 | * @Date 2019/7/16 14:43 23 | * @Created by WDD 24 | */ 25 | @Controller 26 | @RequestMapping("/manager") 27 | public class ManagerController { 28 | 29 | @Autowired 30 | private AjaxResult ajaxResult; 31 | @Autowired 32 | private TreeMenuService treeMenuService; 33 | 34 | /** 35 | * 跳转后台页面 36 | * @return 37 | */ 38 | @GetMapping("/index") 39 | public String index(){ 40 | return "manager/index"; 41 | } 42 | 43 | /** 44 | * 异步加载权限树 45 | * @param session 46 | * @return 47 | */ 48 | @PostMapping("/treeMenu") 49 | @ResponseBody 50 | public Object treeMenu(HttpSession session){ 51 | if(!StringUtils.isEmpty(session.getAttribute(Const.TREEMENU))){ 52 | return session.getAttribute(Const.TREEMENU); 53 | } 54 | Admin admin = (Admin) session.getAttribute(Const.ADMIN); 55 | List treeMenuList = treeMenuService.selectByAdminId(admin.getId()); 56 | session.setAttribute(Const.TREEMENU,treeMenuList); 57 | return treeMenuList; 58 | } 59 | 60 | /** 61 | * 异步加载后台主页 62 | * @return 63 | */ 64 | @GetMapping("/console") 65 | public String console(){ 66 | return "manager/console"; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/entity/Admin.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.entity; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnore; 4 | import lombok.Data; 5 | import org.springframework.security.core.GrantedAuthority; 6 | import org.springframework.security.core.userdetails.UserDetails; 7 | 8 | import java.util.Collection; 9 | import java.util.List; 10 | 11 | /** 12 | * @Classname Admin 13 | * @Description None 14 | * @Date 2019/7/16 12:03 15 | * @Created by WDD 16 | */ 17 | @Data 18 | public class Admin implements UserDetails { 19 | private Integer id; 20 | private String username; 21 | private String password; 22 | private String phone; 23 | private String email; 24 | private Integer rid; 25 | private Integer status; // 0为待审核,1为通过 26 | private String createtime; 27 | 28 | //添加元素 29 | private String roleName; 30 | private List roles; 31 | 32 | 33 | @JsonIgnore 34 | @Override 35 | public Collection getAuthorities() { 36 | return roles; 37 | } 38 | 39 | @JsonIgnore 40 | @Override 41 | public boolean isAccountNonExpired() { 42 | return true; 43 | } 44 | 45 | @JsonIgnore 46 | @Override 47 | public boolean isAccountNonLocked() { 48 | return true; 49 | } 50 | 51 | @JsonIgnore 52 | @Override 53 | public boolean isCredentialsNonExpired() { 54 | return true; 55 | } 56 | 57 | @JsonIgnore 58 | @Override 59 | public boolean isEnabled() { 60 | return true; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/entity/Icon.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.entity; 2 | 3 | /** 4 | * @Classname Icon 5 | * @Description None 6 | * @Date 2019/7/22 11:16 7 | * @Created by WDD 8 | */ 9 | public class Icon { 10 | private Integer id; 11 | private String url; 12 | 13 | public Integer getId() { 14 | return id; 15 | } 16 | 17 | public void setId(Integer id) { 18 | this.id = id; 19 | } 20 | 21 | public String getUrl() { 22 | return url; 23 | } 24 | 25 | public void setUrl(String url) { 26 | this.url = url; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/entity/Log.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.entity; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | /** 6 | * @Classname Log 7 | * @Description None 8 | * @Date 2019/7/24 9:51 9 | * @Created by WDD 10 | */ 11 | @Component 12 | public class Log { 13 | private Integer id; 14 | private String logTime; 15 | private String username; 16 | private String uri; 17 | 18 | public Integer getId() { 19 | return id; 20 | } 21 | 22 | public void setId(Integer id) { 23 | this.id = id; 24 | } 25 | 26 | public String getLogTime() { 27 | return logTime; 28 | } 29 | 30 | public void setLogTime(String logTime) { 31 | this.logTime = logTime; 32 | } 33 | 34 | public String getUsername() { 35 | return username; 36 | } 37 | 38 | public void setUsername(String username) { 39 | this.username = username; 40 | } 41 | 42 | public String getUri() { 43 | return uri; 44 | } 45 | 46 | public void setUri(String uri) { 47 | this.uri = uri; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/entity/Role.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.entity; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnore; 4 | import lombok.Data; 5 | import org.springframework.security.core.GrantedAuthority; 6 | 7 | /** 8 | * @Classname Role 9 | * @Description 角色实体类 10 | * @Date 2019/7/18 8:34 11 | * @Created by WDD 12 | */ 13 | @Data 14 | public class Role implements GrantedAuthority { 15 | private Integer id; 16 | private String name; 17 | 18 | @JsonIgnore 19 | @Override 20 | public String getAuthority() { 21 | return name; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/entity/TreeMenu.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.entity; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * @Classname TreeMenu 8 | * @Description 菜单树 9 | * @Date 2019/7/16 23:09 10 | * @Created by WDD 11 | */ 12 | public class TreeMenu { 13 | private Integer id; 14 | 15 | private Integer pid; 16 | 17 | private String name; 18 | 19 | private String icon; 20 | 21 | private String url; 22 | 23 | private Boolean checked = false; 24 | 25 | //添加元素 26 | private List children = new ArrayList<>(); 27 | 28 | public Integer getId() { 29 | return id; 30 | } 31 | 32 | public void setId(Integer id) { 33 | this.id = id; 34 | } 35 | 36 | public Integer getPid() { 37 | return pid; 38 | } 39 | 40 | public void setPid(Integer pid) { 41 | this.pid = pid; 42 | } 43 | 44 | public String getName() { 45 | return name; 46 | } 47 | 48 | public void setName(String name) { 49 | this.name = name; 50 | } 51 | 52 | public String getIcon() { 53 | return icon; 54 | } 55 | 56 | public void setIcon(String icon) { 57 | this.icon = icon; 58 | } 59 | 60 | public String getUrl() { 61 | return url; 62 | } 63 | 64 | public void setUrl(String url) { 65 | this.url = url; 66 | } 67 | 68 | public List getChildren() { 69 | return children; 70 | } 71 | 72 | public void setChildren(List children) { 73 | this.children = children; 74 | } 75 | 76 | public Boolean getChecked() { 77 | return checked; 78 | } 79 | 80 | public void setChecked(Boolean checked) { 81 | this.checked = checked; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/handler/LoginFailureHandler.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.handler; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import com.zero.system.util.AjaxResult; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.security.core.AuthenticationException; 7 | import org.springframework.security.web.authentication.AuthenticationFailureHandler; 8 | import org.springframework.stereotype.Component; 9 | 10 | import javax.servlet.ServletException; 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | import java.io.IOException; 14 | 15 | /** 16 | * @Auther: wdd 17 | * @Date: 2019/12/30 15:46 18 | * @Description: 19 | */ 20 | @Component 21 | public class LoginFailureHandler implements AuthenticationFailureHandler { 22 | @Autowired 23 | private AjaxResult ajaxResult; 24 | 25 | @Override 26 | public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException, ServletException { 27 | ajaxResult.ajaxFalse("登录失败"); 28 | String json = JSON.toJSONString(ajaxResult); 29 | response.setContentType("text/json;charset=utf-8"); 30 | response.getWriter().write(json); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/handler/LoginSuccessHandler.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.handler; 2 | 3 | import com.alibaba.fastjson.JSON; 4 | import com.zero.system.config.MyFilterSecurityMetadataSource; 5 | import com.zero.system.config.ReloadSecuritySource; 6 | import com.zero.system.entity.Admin; 7 | import com.zero.system.entity.Role; 8 | import com.zero.system.entity.TreeMenu; 9 | import com.zero.system.mapper.RoleMapper; 10 | import com.zero.system.mapper.TreeMenuMapper; 11 | import com.zero.system.service.RoleService; 12 | import com.zero.system.util.AjaxResult; 13 | import com.zero.system.util.Const; 14 | import org.springframework.beans.factory.annotation.Autowired; 15 | import org.springframework.security.access.ConfigAttribute; 16 | import org.springframework.security.access.SecurityConfig; 17 | import org.springframework.security.core.Authentication; 18 | import org.springframework.security.core.context.SecurityContextHolder; 19 | import org.springframework.security.web.authentication.AuthenticationSuccessHandler; 20 | import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 21 | import org.springframework.security.web.util.matcher.RequestMatcher; 22 | import org.springframework.stereotype.Component; 23 | import org.springframework.util.StringUtils; 24 | 25 | import javax.servlet.ServletException; 26 | import javax.servlet.http.HttpServletRequest; 27 | import javax.servlet.http.HttpServletResponse; 28 | import javax.servlet.http.HttpSession; 29 | import java.io.IOException; 30 | import java.util.*; 31 | 32 | /** 33 | * @Auther: wdd 34 | * @Date: 2019/12/30 15:04 35 | * @Description: 36 | */ 37 | @Component 38 | public class LoginSuccessHandler implements AuthenticationSuccessHandler { 39 | 40 | @Autowired 41 | private AjaxResult ajaxResult; 42 | 43 | @Autowired 44 | private RoleService roleService; 45 | 46 | @Autowired 47 | private ReloadSecuritySource reloadSecuritySource; 48 | 49 | @Override 50 | public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { 51 | HttpSession session = request.getSession(); 52 | Admin ad = (Admin) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 53 | session.setAttribute(Const.ADMIN,ad); 54 | //获取角色列表,存入session 55 | if(session.getAttribute(Const.ROLE) == null){ 56 | List roleList = roleService.selectAll(); 57 | session.setAttribute(Const.ROLE,roleList); 58 | } 59 | 60 | // 装载权限 61 | //reloadSecuritySource.getReloadSecuritySource(); 62 | ajaxResult.ajaxTrue("登录成功"); 63 | String json = JSON.toJSONString(ajaxResult); 64 | response.setContentType("text/json;charset=utf-8"); 65 | response.getWriter().write(json); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/interceptor/LogInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.interceptor; 2 | 3 | import com.zero.system.entity.Admin; 4 | import com.zero.system.entity.Log; 5 | import com.zero.system.service.LogService; 6 | import com.zero.system.util.Const; 7 | import com.zero.system.util.DateUtil; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.web.servlet.HandlerInterceptor; 10 | 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletResponse; 13 | import javax.servlet.http.HttpSession; 14 | 15 | /** 16 | * @Classname LogInterceptor 17 | * @Description None 18 | * @Date 2019/7/24 10:39 19 | * @Created by WDD 20 | */ 21 | public class LogInterceptor implements HandlerInterceptor{ 22 | 23 | @Autowired 24 | private Log log; 25 | @Autowired 26 | private LogService logService; 27 | 28 | @Override 29 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 30 | return true; 31 | } 32 | 33 | @Override 34 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 35 | String stringDate = DateUtil.getStringDate("yyyy-MM-dd HH:mm:ss"); 36 | String username = null; 37 | HttpSession session=request.getSession(false); 38 | if(session==null){ 39 | return; 40 | } 41 | if(request.getSession().getAttribute(Const.ADMIN) != null){ 42 | Admin admin = (Admin)request.getSession().getAttribute(Const.ADMIN); 43 | username = admin.getUsername(); 44 | } 45 | String uri = request.getRequestURI(); 46 | if(uri.equals("/manager/logList")){ 47 | return; 48 | } 49 | 50 | log.setLogTime(stringDate); 51 | log.setUsername(username); 52 | log.setUri(uri); 53 | 54 | logService.insertByLog(log); 55 | } 56 | 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/interceptor/LoginInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.interceptor; 2 | 3 | import com.zero.system.util.Const; 4 | import org.springframework.util.StringUtils; 5 | import org.springframework.web.servlet.HandlerInterceptor; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | 10 | /** 11 | * @Classname LoginInterceptor 12 | * @Description 登录拦截器 13 | * @Date 2019/7/17 13:51 14 | * @Created by WDD 15 | */ 16 | public class LoginInterceptor implements HandlerInterceptor { 17 | @Override 18 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 19 | String contextPath = request.getRequestURI(); 20 | if(!StringUtils.isEmpty(request.getSession().getAttribute(Const.ADMIN))){ 21 | return true; 22 | } 23 | response.sendRedirect(request.getContextPath() + "/manager/login"); 24 | return false; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/mapper/AdminMapper.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.mapper; 2 | 3 | import com.zero.system.entity.Admin; 4 | import org.apache.ibatis.annotations.Many; 5 | import org.apache.ibatis.annotations.Result; 6 | import org.apache.ibatis.annotations.Results; 7 | import org.apache.ibatis.annotations.Select; 8 | import org.springframework.security.core.userdetails.UserDetails; 9 | 10 | import java.util.List; 11 | import java.util.Map; 12 | 13 | /** 14 | * @Classname AdminMapper 15 | * @Description None 16 | * @Date 2019/7/16 12:21 17 | * @Created by WDD 18 | */ 19 | public interface AdminMapper { 20 | 21 | Admin login(String username, String password); 22 | 23 | List queryList(Map paramMap); 24 | 25 | Integer queryCount(Map paramMap); 26 | 27 | int insertAdmin(Admin admin); 28 | 29 | Admin selectById(Integer id); 30 | 31 | int delByAdminIds(List ids); 32 | 33 | int editByAdmin(Admin admin); 34 | 35 | Admin selectByName(String username); 36 | 37 | Admin selectByEmail(String email); 38 | 39 | @Select("select * from admin where username = #{username}") 40 | @Results({ 41 | @Result(id = true, property = "id",column = "id"), 42 | @Result(property = "roles", column = "id", javaType = List.class, 43 | many = @Many(select = "com.zero.system.mapper.RoleMapper.findByAdminId")) 44 | }) 45 | Admin findByName(String username); 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/mapper/IconMapper.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.mapper; 2 | 3 | import com.zero.system.entity.Icon; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @Classname IconMapper 9 | * @Description None 10 | * @Date 2019/7/22 11:21 11 | * @Created by WDD 12 | */ 13 | public interface IconMapper { 14 | List selectAll(); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/mapper/LogMapper.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.mapper; 2 | 3 | import com.zero.system.entity.Log; 4 | 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | /** 9 | * @Classname LogMapper 10 | * @Description None 11 | * @Date 2019/7/24 12:23 12 | * @Created by WDD 13 | */ 14 | public interface LogMapper { 15 | void insertByLog(Log log); 16 | 17 | List queryList(Map paramMap); 18 | 19 | Integer queryCount(Map paramMap); 20 | 21 | int delByLogIds(List ids); 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/mapper/RoleMapper.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.mapper; 2 | 3 | import com.zero.system.entity.Role; 4 | import org.apache.ibatis.annotations.Select; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * @Classname RoleMapper 11 | * @Description None 12 | * @Date 2019/7/18 8:38 13 | * @Created by WDD 14 | */ 15 | public interface RoleMapper { 16 | List selectAll(); 17 | 18 | List queryList(Map paramMap); 19 | 20 | Integer queryCount(Map paramMap); 21 | 22 | int delByRoleIds(List ids); 23 | 24 | Role selectById(Integer id); 25 | 26 | Role selectByName(String name); 27 | 28 | int editByRole(Role role); 29 | 30 | int insertRole(Role role); 31 | 32 | @Select("select role.id,role.name from role,admin where admin.rid = role.id and admin.id = #{adminId}") 33 | List findByAdminId(Integer adminId); 34 | 35 | @Select("select role.id,role.name from role,role_treemenu,treemenu where role.id = role_treemenu.rid " + 36 | "and role_treemenu.tid = treemenu.id and treemenu.id = #{treeMenuId}") 37 | List findByTreeMenuId(Integer treeMenuId); 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/mapper/TreeMenuMapper.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.mapper; 2 | 3 | import com.zero.system.entity.TreeMenu; 4 | import org.apache.ibatis.annotations.Param; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @Classname TreeMenuMapper 10 | * @Description None 11 | * @Date 2019/7/17 9:00 12 | * @Created by WDD 13 | */ 14 | public interface TreeMenuMapper { 15 | List selectByAdminId(Integer id); 16 | 17 | List selectAll(); 18 | 19 | TreeMenu selectById(Integer id); 20 | 21 | TreeMenu selectByName(String name); 22 | 23 | TreeMenu selectByUrl(String url); 24 | 25 | int editByPermission(TreeMenu treeMenu); 26 | 27 | int insertPermission(TreeMenu treeMenu); 28 | 29 | int delByPermissionIds(List ids); 30 | 31 | void delRolePermission(List ids); 32 | 33 | List selectByPid(Integer id); 34 | 35 | List selectByRoleId(Integer id); 36 | 37 | int updateRolePermission(@Param("ids") List ids, @Param("id") Integer id); 38 | 39 | void delRolePermissionByRid(Integer id); 40 | 41 | List selectByUserName(String username); 42 | 43 | List selectURLAll(); 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/AdminService.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service; 2 | 3 | import com.zero.system.entity.Admin; 4 | import com.zero.system.util.PageBean; 5 | import org.springframework.security.core.userdetails.UserDetailsService; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | * @Classname AdminService 12 | * @Description None 13 | * @Date 2019/7/16 12:20 14 | * @Created by WDD 15 | */ 16 | public interface AdminService extends UserDetailsService { 17 | 18 | Admin login(String username, String password); 19 | 20 | PageBean queryPage(Map paramMap); 21 | 22 | int insertAdmin(Admin admin); 23 | 24 | Admin selectById(Integer id); 25 | 26 | int delByAdminIds(List ids); 27 | 28 | int editByAdmin(Admin admin); 29 | 30 | Admin selectByName(String username); 31 | 32 | Admin selectByEmail(String email); 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/IconService.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service; 2 | 3 | import com.zero.system.entity.Icon; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @Classname IconService 9 | * @Description None 10 | * @Date 2019/7/22 11:19 11 | * @Created by WDD 12 | */ 13 | public interface IconService { 14 | List selectAll(); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/Impl/AdminServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service.Impl; 2 | 3 | import com.zero.system.entity.Admin; 4 | import com.zero.system.mapper.AdminMapper; 5 | import com.zero.system.service.AdminService; 6 | import com.zero.system.util.PageBean; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.security.core.userdetails.UserDetails; 9 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 10 | import org.springframework.stereotype.Service; 11 | 12 | import java.util.List; 13 | import java.util.Map; 14 | 15 | /** 16 | * @Classname AdminServiceImpl 17 | * @Description None 18 | * @Date 2019/7/16 12:20 19 | * @Created by WDD 20 | */ 21 | @Service 22 | public class AdminServiceImpl implements AdminService { 23 | 24 | @Autowired 25 | private AdminMapper adminMapper; 26 | 27 | @Override 28 | public Admin login(String username, String password) { 29 | return adminMapper.login(username,password); 30 | } 31 | 32 | @Override 33 | public PageBean queryPage(Map paramMap) { 34 | PageBean pageBean = new PageBean<>((Integer) paramMap.get("pageno"),(Integer) paramMap.get("pagesize")); 35 | 36 | Integer startIndex = pageBean.getStartIndex(); 37 | paramMap.put("startIndex",startIndex); 38 | List datas = adminMapper.queryList(paramMap); 39 | pageBean.setDatas(datas); 40 | 41 | Integer totalsize = adminMapper.queryCount(paramMap); 42 | pageBean.setTotalsize(totalsize); 43 | return pageBean; 44 | } 45 | 46 | @Override 47 | public int insertAdmin(Admin admin) { 48 | return adminMapper.insertAdmin(admin); 49 | } 50 | 51 | @Override 52 | public Admin selectById(Integer id) { 53 | return adminMapper.selectById(id); 54 | } 55 | 56 | @Override 57 | public int delByAdminIds(List ids) { 58 | return adminMapper.delByAdminIds(ids); 59 | } 60 | 61 | @Override 62 | public int editByAdmin(Admin admin) { 63 | return adminMapper.editByAdmin(admin); 64 | } 65 | 66 | @Override 67 | public Admin selectByName(String username) { 68 | return adminMapper.selectByName(username); 69 | } 70 | 71 | @Override 72 | public Admin selectByEmail(String email) { 73 | return adminMapper.selectByEmail(email); 74 | } 75 | 76 | @Override 77 | public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { 78 | return adminMapper.findByName(s); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/Impl/IconServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service.Impl; 2 | 3 | import com.zero.system.entity.Icon; 4 | import com.zero.system.mapper.IconMapper; 5 | import com.zero.system.service.IconService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * @Classname IconServiceImpl 13 | * @Description None 14 | * @Date 2019/7/22 11:19 15 | * @Created by WDD 16 | */ 17 | @Service 18 | public class IconServiceImpl implements IconService { 19 | 20 | @Autowired 21 | private IconMapper iconMapper; 22 | 23 | @Override 24 | public List selectAll() { 25 | return iconMapper.selectAll(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/Impl/LogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service.Impl; 2 | 3 | import com.zero.system.entity.Log; 4 | import com.zero.system.mapper.LogMapper; 5 | import com.zero.system.service.LogService; 6 | import com.zero.system.util.PageBean; 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 | * @Classname LogServiceImpl 15 | * @Description None 16 | * @Date 2019/7/24 12:21 17 | * @Created by WDD 18 | */ 19 | @Service 20 | public class LogServiceImpl implements LogService { 21 | 22 | @Autowired 23 | private LogMapper logMapper; 24 | 25 | @Override 26 | public void insertByLog(Log log) { 27 | logMapper.insertByLog(log); 28 | } 29 | 30 | @Override 31 | public PageBean queryPage(Map paramMap) { 32 | PageBean pageBean = new PageBean<>((Integer) paramMap.get("pageno"),(Integer) paramMap.get("pagesize")); 33 | 34 | Integer startIndex = pageBean.getStartIndex(); 35 | paramMap.put("startIndex",startIndex); 36 | List datas = logMapper.queryList(paramMap); 37 | pageBean.setDatas(datas); 38 | 39 | Integer totalsize = logMapper.queryCount(paramMap); 40 | pageBean.setTotalsize(totalsize); 41 | return pageBean; 42 | } 43 | 44 | @Override 45 | public int delByLogIds(List ids) { 46 | return logMapper.delByLogIds(ids); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/Impl/RoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service.Impl; 2 | 3 | import com.zero.system.entity.Role; 4 | import com.zero.system.mapper.RoleMapper; 5 | import com.zero.system.service.RoleService; 6 | import com.zero.system.util.PageBean; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | import org.springframework.transaction.annotation.Transactional; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | /** 15 | * @Classname RoleServiceImpl 16 | * @Description None 17 | * @Date 2019/7/18 8:36 18 | * @Created by WDD 19 | */ 20 | @Service 21 | public class RoleServiceImpl implements RoleService { 22 | 23 | @Autowired 24 | private RoleMapper roleMapper; 25 | 26 | @Override 27 | public List selectAll() { 28 | return roleMapper.selectAll(); 29 | } 30 | 31 | @Override 32 | public PageBean queryPage(Map paramMap) { 33 | PageBean pageBean = new PageBean<>((Integer) paramMap.get("pageno"),(Integer) paramMap.get("pagesize")); 34 | 35 | Integer startIndex = pageBean.getStartIndex(); 36 | paramMap.put("startIndex",startIndex); 37 | List datas = roleMapper.queryList(paramMap); 38 | pageBean.setDatas(datas); 39 | 40 | Integer totalsize = roleMapper.queryCount(paramMap); 41 | pageBean.setTotalsize(totalsize); 42 | return pageBean; 43 | } 44 | 45 | @Override 46 | @Transactional 47 | public int delByRoleIds(List ids) { 48 | try { 49 | return roleMapper.delByRoleIds(ids); 50 | } catch (Exception e) { 51 | //存在管理员拥有此角色,无法删除 52 | return 0; 53 | } 54 | } 55 | 56 | @Override 57 | public Role selectById(Integer id) { 58 | return roleMapper.selectById(id); 59 | } 60 | 61 | @Override 62 | public Role selectByName(String name) { 63 | return roleMapper.selectByName(name); 64 | } 65 | 66 | @Override 67 | public int editByRole(Role role) { 68 | return roleMapper.editByRole(role); 69 | } 70 | 71 | @Override 72 | public int insertRole(Role role) { 73 | return roleMapper.insertRole(role); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/Impl/TreeMenuServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service.Impl; 2 | 3 | import com.zero.system.entity.TreeMenu; 4 | import com.zero.system.mapper.TreeMenuMapper; 5 | import com.zero.system.service.TreeMenuService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Service; 8 | import org.springframework.transaction.annotation.Transactional; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | /** 14 | * @Classname TreeMenuServiceImpl 15 | * @Description None 16 | * @Date 2019/7/16 23:08 17 | * @Created by WDD 18 | */ 19 | @Service 20 | public class TreeMenuServiceImpl implements TreeMenuService { 21 | 22 | @Autowired 23 | private TreeMenuMapper treeMenuMapper; 24 | 25 | @Override 26 | public List selectByAdminId(Integer id) { 27 | //获取用户所有的全部权限(父,子权限)菜单 28 | List treeMenuList = treeMenuMapper.selectByAdminId(id); 29 | //保存所有的父(主)菜单 30 | List root = new ArrayList<>(); 31 | //遍历所有菜单集合,如果是主菜单的话直接放入root集合 32 | for(TreeMenu treeMenu : treeMenuList){ 33 | //pid为0,则为父(主)菜单 34 | if(treeMenu.getPid() == -1){ 35 | root.add(treeMenu); 36 | } 37 | } 38 | //这个是遍历所有主菜单,分别获取所有主菜单的所有子菜单 39 | for(TreeMenu treeMenu : root){ 40 | //获取所有子菜单 递归 41 | List childrenList = getchildrenMeun(treeMenu.getId(),treeMenuList); 42 | //这个是实体类中的子菜单集合 43 | treeMenu.setChildren(childrenList); 44 | } 45 | return root; 46 | } 47 | 48 | @Override 49 | public List selectAll() { 50 | return treeMenuMapper.selectAll(); 51 | } 52 | 53 | @Override 54 | public TreeMenu selectById(Integer id) { 55 | return treeMenuMapper.selectById(id); 56 | } 57 | 58 | @Override 59 | public TreeMenu selectByName(String name) { 60 | return treeMenuMapper.selectByName(name); 61 | } 62 | 63 | @Override 64 | public TreeMenu selectByUrl(String url) { 65 | return treeMenuMapper.selectByUrl(url); 66 | } 67 | 68 | @Override 69 | public int editByPermission(TreeMenu treeMenu) { 70 | return treeMenuMapper.editByPermission(treeMenu); 71 | } 72 | 73 | @Override 74 | public int insertPermission(TreeMenu treeMenu) { 75 | return treeMenuMapper.insertPermission(treeMenu); 76 | } 77 | 78 | @Override 79 | @Transactional 80 | public int delByPermissionIds(List ids) { 81 | treeMenuMapper.delRolePermission(ids); 82 | return treeMenuMapper.delByPermissionIds(ids); 83 | } 84 | 85 | @Override 86 | public List selectByPid(Integer id) { 87 | return treeMenuMapper.selectByPid(id); 88 | } 89 | 90 | @Override 91 | public List selectByRoleId(Integer id) { 92 | return treeMenuMapper.selectByRoleId(id); 93 | } 94 | 95 | @Override 96 | @Transactional 97 | public int updateRolePermission(List ids, Integer id) { 98 | treeMenuMapper.delRolePermissionByRid(id); 99 | return treeMenuMapper.updateRolePermission(ids,id); 100 | } 101 | 102 | 103 | //递归获取子菜单 104 | public List getchildrenMeun(int id,List allMeun){ 105 | //用于保存子菜单 106 | List childrenList=new ArrayList<>(); 107 | for (TreeMenu info: allMeun){ 108 | //判断当前的菜单标识是否等于主菜单的id 109 | if(info.getPid()==id){ 110 | //如果是的话 就放入主菜单对象的子菜单集合 111 | childrenList.add(info); 112 | } 113 | } 114 | 115 | //这里就是递归了,遍历所有的子菜单 116 | for (TreeMenu info:childrenList){ 117 | info.setChildren(getchildrenMeun(info.getId(),allMeun)); 118 | } 119 | 120 | //如果子菜单为空的话,那就说明某菜单下没有子菜单了,直接返回空,子菜单为空的话就不会继续 121 | //迭代了 122 | if(childrenList!=null && childrenList.size()==0){ 123 | return null; 124 | } 125 | return childrenList; 126 | } 127 | 128 | } 129 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/LogService.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service; 2 | 3 | import com.zero.system.entity.Log; 4 | import com.zero.system.util.PageBean; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * @Classname LogService 11 | * @Description None 12 | * @Date 2019/7/24 12:21 13 | * @Created by WDD 14 | */ 15 | public interface LogService { 16 | void insertByLog(Log log); 17 | 18 | PageBean queryPage(Map paramMap); 19 | 20 | int delByLogIds(List ids); 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/RoleService.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service; 2 | 3 | import com.zero.system.entity.Role; 4 | import com.zero.system.util.PageBean; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * @Classname RoleService 11 | * @Description None 12 | * @Date 2019/7/18 8:35 13 | * @Created by WDD 14 | */ 15 | public interface RoleService { 16 | List selectAll(); 17 | 18 | PageBean queryPage(Map paramMap); 19 | 20 | int delByRoleIds(List ids); 21 | 22 | Role selectById(Integer id); 23 | 24 | Role selectByName(String name); 25 | 26 | int editByRole(Role role); 27 | 28 | int insertRole(Role role); 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/service/TreeMenuService.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.service; 2 | 3 | import com.zero.system.entity.TreeMenu; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @Classname TreeMenuService 9 | * @Description None 10 | * @Date 2019/7/16 23:08 11 | * @Created by WDD 12 | */ 13 | public interface TreeMenuService { 14 | 15 | List selectByAdminId(Integer id); 16 | 17 | 18 | List selectAll(); 19 | 20 | TreeMenu selectById(Integer id); 21 | 22 | TreeMenu selectByName(String name); 23 | 24 | TreeMenu selectByUrl(String url); 25 | 26 | int editByPermission(TreeMenu treeMenu); 27 | 28 | int insertPermission(TreeMenu treeMenu); 29 | 30 | int delByPermissionIds(List ids); 31 | 32 | List selectByPid(Integer id); 33 | 34 | List selectByRoleId(Integer id); 35 | 36 | int updateRolePermission(List ids, Integer id); 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/util/AjaxResult.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.util; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | @Component 6 | public class AjaxResult { 7 | private boolean success; 8 | private String message; 9 | 10 | public boolean isSuccess() { 11 | return success; 12 | } 13 | 14 | public void setSuccess(boolean success) { 15 | this.success = success; 16 | } 17 | 18 | public String getMessage() { 19 | return message; 20 | } 21 | 22 | public void setMessage(String message) { 23 | this.message = message; 24 | } 25 | 26 | public void ajaxFalse(String message){ 27 | this.message = message; 28 | this.success = false; 29 | } 30 | 31 | public void ajaxTrue(String message){ 32 | this.message = message; 33 | this.success = true; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/util/Const.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.util; 2 | 3 | /** 4 | * @Classname Const 5 | * @Description None 6 | * @Date 2019/7/16 23:02 7 | * @Created by WDD 8 | */ 9 | public class Const { 10 | public static final String ADMIN = "admin"; 11 | public static final String TREEMENU = "treeMenu"; 12 | public static final String ROLE = "role"; 13 | public static final String ICON = "icon"; 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/util/Data.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.util; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @Classname Data 7 | * @Description None 8 | * @Date 2019/7/18 18:25 9 | * @Created by WDD 10 | */ 11 | public class Data { 12 | private List ids ; 13 | 14 | public List getIds() { 15 | return ids; 16 | } 17 | 18 | public void setIds(List ids) { 19 | this.ids = ids; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/util/DateUtil.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.util; 2 | 3 | import java.text.ParseException; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Date; 6 | 7 | /** 8 | * @Classname DateUtil 9 | * @Description 日期转换器 10 | * @Date 2019/7/18 9:09 11 | * @Created by WDD 12 | */ 13 | public class DateUtil { 14 | /** 15 | * 日期装字符串 16 | * @return 17 | */ 18 | public static String getStringDate(String type){ 19 | Date date = new Date(); 20 | SimpleDateFormat simpleDateFormat = new SimpleDateFormat(type); 21 | String format = simpleDateFormat.format(date); 22 | return format; 23 | } 24 | 25 | public static Date getDate(String type) throws ParseException { 26 | Date date = new Date(); 27 | SimpleDateFormat dFormat = new SimpleDateFormat(type); //HH表示24小时制; 28 | String formatDate = dFormat.format(date); 29 | Date parse = dFormat.parse(formatDate); 30 | return parse; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/zero/system/util/PageBean.java: -------------------------------------------------------------------------------- 1 | package com.zero.system.util; 2 | 3 | import java.util.List; 4 | 5 | public class PageBean { 6 | private Integer pageno; //第几页 7 | private Integer pagesize; //每页条数 8 | private List datas; 9 | private Integer totalno; //总共几页 10 | private Integer totalsize; //总的条数 11 | 12 | public PageBean(Integer pageno, Integer pagesize) { 13 | if(pageno<=0){ 14 | this.pageno = 1; 15 | }else{ 16 | this.pageno = pageno; 17 | } 18 | if(pagesize<=0){ 19 | this.pagesize = 10; 20 | }else{ 21 | this.pagesize = pagesize; 22 | } 23 | this.pageno = pageno; 24 | this.pagesize = pagesize; 25 | } 26 | 27 | public Integer getPageno() { 28 | return pageno; 29 | } 30 | 31 | public void setPageno(Integer pageno) { 32 | this.pageno = pageno; 33 | } 34 | 35 | public Integer getPagesize() { 36 | return pagesize; 37 | } 38 | 39 | public void setPagesize(Integer pagesize) { 40 | this.pagesize = pagesize; 41 | } 42 | 43 | public List getDatas() { 44 | return datas; 45 | } 46 | 47 | public void setDatas(List datas) { 48 | this.datas = datas; 49 | } 50 | 51 | public Integer getTotalno() { 52 | return totalno; 53 | } 54 | 55 | public void setTotalno(Integer totalno) { 56 | this.totalno = totalno; 57 | } 58 | 59 | public Integer getTotalsize() { 60 | return totalsize; 61 | } 62 | 63 | public void setTotalsize(Integer totalsize) { 64 | this.totalno = (totalsize%pagesize==0)?(totalsize/pagesize):(totalsize/pagesize+1); 65 | this.totalsize = totalsize; 66 | } 67 | 68 | /** 69 | * 开始索引 70 | */ 71 | public Integer getStartIndex(){ 72 | return (this.pageno-1)*this.pagesize; 73 | } 74 | 75 | 76 | @Override 77 | public String toString() { 78 | return "PageBean{" + 79 | "pageno=" + pageno + 80 | ", pagesize=" + pagesize + 81 | ", datas=" + datas + 82 | ", totalno=" + totalno + 83 | ", totalsize=" + totalsize + 84 | '}'; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | thymeleaf: 3 | cache: false 4 | datasource: 5 | driver-class-name: com.mysql.cj.jdbc.Driver 6 | url: jdbc:mysql://127.0.0.1:3306/manager_system?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC 7 | username: root 8 | password: root 9 | 10 | mybatis: 11 | type-aliases-package: com.zero.system.entity 12 | mapper-locations: classpath:mapper/*.xml -------------------------------------------------------------------------------- /src/main/resources/mapper/AdminMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | id,username,password,phone,email,rid,status,createtime 19 | 20 | 21 | 27 | 28 | 42 | 43 | 53 | 54 | 55 | insert into admin(username,password,phone,email,rid,status,createtime) 56 | values (#{username},#{password},#{phone},#{email},#{rid},#{status},#{createtime}) 57 | 58 | 59 | 62 | 63 | 64 | delete from admin where id in 65 | 66 | #{id} 67 | 68 | 69 | 70 | 71 | update admin 72 | set username = #{username},email = #{email},phone = #{phone},rid = #{rid},status = #{status} 73 | ,password = #{password} 74 | where id = #{id} 75 | 76 | 77 | 80 | 81 | 84 | -------------------------------------------------------------------------------- /src/main/resources/mapper/IconMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | id,url 11 | 12 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /src/main/resources/mapper/LogMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | id,username,logTime,uri 12 | 13 | 14 | 15 | insert into log(username,logTime,uri) values (#{username},#{logTime},#{uri}) 16 | 17 | 18 | 19 | 30 | 31 | 38 | 39 | 40 | delete from log where id in 41 | 42 | #{id} 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/main/resources/mapper/RoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | id,name 10 | 11 | 12 | 15 | 16 | 26 | 27 | 33 | 34 | 35 | delete from role where id in 36 | 37 | #{id} 38 | 39 | 40 | 41 | 44 | 45 | 48 | 49 | 50 | insert into role(name) 51 | values (#{name}) 52 | 53 | 54 | 55 | update role 56 | set name = #{name} 57 | where id = #{id} 58 | 59 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/font-awesome-4.7.0/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome-4.7.0/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/config.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layuiAdmin iframe版全局配置 4 | @Author:贤心 5 | @Site:http://www.layui.com/admin/ 6 | @License:LPPL(layui付费产品协议) 7 | 8 | */ 9 | 10 | layui.define(['laytpl', 'layer', 'element', 'util'], function(exports){ 11 | exports('setter', { 12 | container: 'LAY_app' //容器ID 13 | ,base: layui.cache.base //记录静态资源所在路径 14 | ,views: layui.cache.base + 'tpl/' //动态模板所在目录 15 | ,entry: 'index' //默认视图文件名 16 | ,engine: '.html' //视图文件后缀名 17 | ,pageTabs: true //是否开启页面选项卡功能。iframe版推荐开启 18 | 19 | ,name: 'layuiAdmin' 20 | ,tableName: 'layuiAdmin' //本地存储表名 21 | ,MOD_NAME: 'admin' //模块事件名 22 | 23 | ,debug: true //是否开启调试模式。如开启,接口异常时会抛出异常 URL 等信息 24 | 25 | //自定义请求字段 26 | ,request: { 27 | tokenName: false //自动携带 token 的字段名(如:access_token)。可设置 false 不携带。 28 | } 29 | 30 | //自定义响应字段 31 | ,response: { 32 | statusName: 'code' //数据状态的字段名称 33 | ,statusCode: { 34 | ok: 0 //数据状态一切正常的状态码 35 | ,logout: 1001 //登录状态失效的状态码 36 | } 37 | ,msgName: 'msg' //状态信息的字段名称 38 | ,dataName: 'data' //数据详情的字段名称 39 | } 40 | 41 | //扩展的第三方模块 42 | ,extend: [ 43 | 'echarts', //echarts 核心包 44 | 'echartsTheme' //echarts 主题 45 | ] 46 | 47 | //主题配置 48 | ,theme: { 49 | //内置主题配色方案 50 | color: [{ 51 | main: '#20222A' //主题色 52 | ,selected: '#009688' //选中色 53 | ,alias: 'default' //默认别名 54 | },{ 55 | main: '#03152A' 56 | ,selected: '#3B91FF' 57 | ,alias: 'dark-blue' //藏蓝 58 | },{ 59 | main: '#2E241B' 60 | ,selected: '#A48566' 61 | ,alias: 'coffee' //咖啡 62 | },{ 63 | main: '#50314F' 64 | ,selected: '#7A4D7B' 65 | ,alias: 'purple-red' //紫红 66 | },{ 67 | main: '#344058' 68 | ,logo: '#1E9FFF' 69 | ,selected: '#1E9FFF' 70 | ,alias: 'ocean' //海洋 71 | },{ 72 | main: '#3A3D49' 73 | ,logo: '#2F9688' 74 | ,selected: '#5FB878' 75 | ,alias: 'green' //墨绿 76 | },{ 77 | main: '#20222A' 78 | ,logo: '#F78400' 79 | ,selected: '#F78400' 80 | ,alias: 'red' //橙色 81 | },{ 82 | main: '#28333E' 83 | ,logo: '#AA3130' 84 | ,selected: '#AA3130' 85 | ,alias: 'fashion-red' //时尚红 86 | },{ 87 | main: '#24262F' 88 | ,logo: '#3A3D49' 89 | ,selected: '#009688' 90 | ,alias: 'classic-black' //经典黑 91 | },{ 92 | logo: '#226A62' 93 | ,header: '#2F9688' 94 | ,alias: 'green-header' //墨绿头 95 | },{ 96 | main: '#344058' 97 | ,logo: '#0085E8' 98 | ,selected: '#1E9FFF' 99 | ,header: '#1E9FFF' 100 | ,alias: 'ocean-header' //海洋头 101 | },{ 102 | header: '#393D49' 103 | ,alias: 'classic-black-header' //经典黑头 104 | }] 105 | 106 | //初始的颜色索引,对应上面的配色方案数组索引 107 | //如果本地已经有主题色记录,则以本地记录为优先,除非请求本地数据(localStorage) 108 | ,initColorIndex: 0 109 | } 110 | }); 111 | }); 112 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/extend/treetable/treetable.css: -------------------------------------------------------------------------------- 1 | .treeTable-empty { 2 | width: 20px; 3 | display: inline-block; 4 | } 5 | 6 | .treeTable-icon { 7 | cursor: pointer; 8 | } 9 | 10 | .treeTable-icon .layui-icon-triangle-d:before { 11 | content: "\e623"; 12 | } 13 | 14 | .treeTable-icon.open .layui-icon-triangle-d:before { 15 | content: "\e625"; 16 | background-color: transparent; 17 | } 18 | 19 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/laydate/default/font.css: -------------------------------------------------------------------------------- 1 | /** 图标字体 **/ 2 | @font-face {font-family: 'laydate-icon'; 3 | src: url('./font/iconfont.eot'); 4 | src: url('./font/iconfont.eot#iefix') format('embedded-opentype'), 5 | url('./font/iconfont.svg#iconfont') format('svg'), 6 | url('./font/iconfont.woff') format('woff'), 7 | url('./font/iconfont.ttf') format('truetype'); 8 | } 9 | 10 | .laydate-icon{ 11 | font-family:"laydate-icon" !important; 12 | font-size: 16px; 13 | font-style: normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/html/chatlog.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 聊天记录 9 | 10 | 11 | 14 | 15 | 16 | 17 |
18 |
    19 |
    20 | 21 |
    22 | 23 | 24 | 33 | 34 | 38 | 39 | 40 | 41 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/html/find.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 发现 9 | 10 | 11 | 14 | 15 | 16 | 17 |
    18 |
    此为自定义的【查找】页面,因需求不一,所以官方暂不提供该模版结构与样式,实际使用时,可移至该文件到你的项目中,对页面自行把控。 19 |
    文件所在目录(相对于layui.js):/css/modules/layim/html/find.html
    20 |
    21 | 22 | 23 | 24 | 25 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/html/getmsg.json: -------------------------------------------------------------------------------- 1 | { 2 | "code": 0, 3 | "pages": 1, 4 | "data": [ 5 | { 6 | "id": 76, 7 | "content": "申请添加你为好友", 8 | "uid": 168, 9 | "from": 166488, 10 | "from_group": 0, 11 | "type": 1, 12 | "remark": "有问题要问", 13 | "href": null, 14 | "read": 1, 15 | "time": "刚刚", 16 | "user": { 17 | "id": 166488, 18 | "avatar": "http://q.qlogo.cn/qqapp/101235792/B704597964F9BD0DB648292D1B09F7E8/100", 19 | "username": "李彦宏", 20 | "sign": null 21 | } 22 | }, 23 | { 24 | "id": 75, 25 | "content": "申请添加你为好友", 26 | "uid": 168, 27 | "from": 347592, 28 | "from_group": 0, 29 | "type": 1, 30 | "remark": "你好啊!", 31 | "href": null, 32 | "read": 1, 33 | "time": "刚刚", 34 | "user": { 35 | "id": 347592, 36 | "avatar": "http://q.qlogo.cn/qqapp/101235792/B78751375E0531675B1272AD994BA875/100", 37 | "username": "麻花疼", 38 | "sign": null 39 | } 40 | }, 41 | { 42 | "id": 62, 43 | "content": "雷军 拒绝了你的好友申请", 44 | "uid": 168, 45 | "from": null, 46 | "from_group": null, 47 | "type": 1, 48 | "remark": null, 49 | "href": null, 50 | "read": 1, 51 | "time": "10天前", 52 | "user": { 53 | "id": null 54 | } 55 | }, 56 | { 57 | "id": 60, 58 | "content": "马小云 已经同意你的好友申请", 59 | "uid": 168, 60 | "from": null, 61 | "from_group": null, 62 | "type": 1, 63 | "remark": null, 64 | "href": null, 65 | "read": 1, 66 | "time": "10天前", 67 | "user": { 68 | "id": null 69 | } 70 | }, 71 | { 72 | "id": 61, 73 | "content": "贤心 已经同意你的好友申请", 74 | "uid": 168, 75 | "from": null, 76 | "from_group": null, 77 | "type": 1, 78 | "remark": null, 79 | "href": null, 80 | "read": 1, 81 | "time": "10天前", 82 | "user": { 83 | "id": null 84 | } 85 | } 86 | ] 87 | } -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/1.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/2.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/3.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/4.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/5.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layim/skin/logo.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/css/modules/layim/voice/default.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/css/modules/layim/voice/default.mp3 -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/font/iconfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/font/iconfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/0.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/1.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/10.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/11.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/12.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/13.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/14.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/15.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/16.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/17.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/18.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/19.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/2.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/20.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/21.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/22.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/23.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/24.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/25.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/26.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/27.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/28.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/29.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/3.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/30.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/31.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/32.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/33.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/34.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/35.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/36.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/37.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/38.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/39.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/4.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/40.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/41.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/42.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/43.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/44.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/45.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/46.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/47.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/48.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/49.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/5.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/50.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/51.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/52.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/53.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/54.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/55.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/56.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/57.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/58.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/59.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/6.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/60.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/61.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/62.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/63.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/64.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/65.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/66.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/67.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/68.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/69.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/7.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/70.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/71.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/8.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/layui/images/face/9.gif -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/all-mobile.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:用于打包移动完整版 4 | @Author:贤心 5 | @License:LGPL 6 | 7 | */ 8 | 9 | layui.define(function(exports){ 10 | exports('layui.mobile', layui.v); 11 | }); 12 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/all.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:用于打包PC完整版,即包含layui.js和所有模块的完整合并(该文件不会存在于构建后的目录) 4 | @Author:贤心 5 | @License:LGPL 6 | 7 | */ 8 | 9 | layui.define(function(exports){ 10 | var cache = layui.cache; 11 | layui.config({ 12 | dir: cache.dir.replace(/lay\/dest\/$/, '') 13 | }); 14 | exports('layui.all', layui.v); 15 | }); 16 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/modules/carousel.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
      ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
    "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a/g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
    1. '+o.replace(/[\r\t\n]+/g,"
    2. ")+"
    "),c.find(">.layui-code-h3")[0]||c.prepend('

    '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

    ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/modules/flow.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/modules/laypage.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
    ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
    "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/modules/laytpl.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/modules/mobile/layim-mobile-open.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layim mobile 开源包 4 | @Author:贤心 5 | @License:MIT 6 | 7 | */ 8 | 9 | layui.define(function(exports){ 10 | exports('layim-mobile', layui.v); 11 | }); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/modules/rate.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='
      ",u=1;u<=i.length;u++){var r='
    • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
    • ":n+=r}n+="
    "+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)}); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/modules/tree.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
      '),s=o(["
    • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
    • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
      '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/layui/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.3.0 MIT License By https://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,a,o="layui-fixbar",r="layui-fixbar-top",l=t(document),n=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
        ',e.bar1?'
      • '+c[0]+"
      • ":"",e.bar2?'
      • '+c[1]+"
      • ":"",'
      • '+c[2]+"
      • ","
      "].join("")),u=g.find("."+r),s=function(){var t=l.scrollTop();t>=e.showHeight?i||(u.show(),i=1):i&&(u.hide(),i=0)};t("."+o)[0]||("object"==typeof e.css&&g.css(e.css),n.append(g),s(),g.find("li").on("click",function(){var i=t(this),a=i.attr("lay-type");"top"===a&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,a)}),l.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){s()},100)}))},countdown:function(e,t,i){var a=this,o="function"==typeof t,r=new Date(e).getTime(),l=new Date(!t||o?(new Date).getTime():t).getTime(),n=r-l,c=[Math.floor(n/864e5),Math.floor(n/36e5)%24,Math.floor(n/6e4)%60,Math.floor(n/1e3)%60];o&&(i=t);var g=setTimeout(function(){a.countdown(e,l+1e3,i)},1e3);return i&&i(n>0?c:[0,0,0,0],t,g),n<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,a=[[],[]],o=(new Date).getTime()-new Date(e).getTime();return o>6912e5?(o=new Date(e),a[0][0]=i.digit(o.getFullYear(),4),a[0][1]=i.digit(o.getMonth()+1),a[0][2]=i.digit(o.getDate()),t||(a[1][0]=i.digit(o.getHours()),a[1][1]=i.digit(o.getMinutes()),a[1][2]=i.digit(o.getSeconds())),a[0].join("-")+" "+a[1].join(":")):o>=864e5?(o/1e3/60/60/24|0)+"天前":o>=36e5?(o/1e3/60/60|0)+"小时前":o>=12e4?(o/1e3/60|0)+"分钟前":o<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var a=e.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};e("util",i)}); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/lib/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layuiAdmin iframe版主入口 4 | @Author:贤心 5 | @Site:http://www.layui.com/admin/ 6 | @License:LPPL 7 | 8 | */ 9 | 10 | layui.extend({ 11 | setter: 'config' //配置模块 12 | ,admin: 'lib/admin' //核心模块 13 | ,view: 'lib/view' //视图渲染模块 14 | }).define(['setter', 'admin'], function(exports){ 15 | var setter = layui.setter 16 | ,element = layui.element 17 | ,admin = layui.admin 18 | ,tabsPage = admin.tabsPage 19 | ,view = layui.view 20 | 21 | //打开标签页 22 | ,openTabsPage = function(url, text){ 23 | //遍历页签选项卡 24 | var matchTo 25 | ,tabs = $('#LAY_app_tabsheader>li') 26 | ,path = url.replace(/(^http(s*):)|(\?[\s\S]*$)/g, ''); 27 | 28 | tabs.each(function(index){ 29 | var li = $(this) 30 | ,layid = li.attr('lay-id'); 31 | 32 | if(layid === url){ 33 | matchTo = true; 34 | tabsPage.index = index; 35 | } 36 | }); 37 | 38 | text = text || '新标签页'; 39 | 40 | if(setter.pageTabs){ 41 | //如果未在选项卡中匹配到,则追加选项卡 42 | if(!matchTo){ 43 | $(APP_BODY).append([ 44 | '
      ' 45 | ,'' 46 | ,'
      ' 47 | ].join('')); 48 | tabsPage.index = tabs.length; 49 | element.tabAdd(FILTER_TAB_TBAS, { 50 | title: ''+ text +'' 51 | ,id: url 52 | ,attr: path 53 | }); 54 | } 55 | } else { 56 | var iframe = admin.tabsBody(admin.tabsPage.index).find('.layadmin-iframe'); 57 | iframe[0].contentWindow.location.href = url; 58 | } 59 | 60 | //定位当前tabs 61 | element.tabChange(FILTER_TAB_TBAS, url); 62 | admin.tabsBodyChange(tabsPage.index, { 63 | url: url 64 | ,text: text 65 | }); 66 | } 67 | 68 | ,APP_BODY = '#LAY_app_body', FILTER_TAB_TBAS = 'layadmin-layout-tabs' 69 | ,$ = layui.$, $win = $(window); 70 | 71 | //初始 72 | if(admin.screen() < 2) admin.sideFlexible(); 73 | 74 | //将模块根路径设置为 controller 目录 75 | layui.config({ 76 | base: setter.base + 'modules/' 77 | }); 78 | 79 | //扩展 lib 目录下的其它模块 80 | layui.each(setter.extend, function(index, item){ 81 | var mods = {}; 82 | mods[item] = '{/}' + setter.base + 'lib/extend/' + item; 83 | layui.extend(mods); 84 | }); 85 | 86 | view().autoRender(); 87 | 88 | //加载公共模块 89 | layui.use('common'); 90 | 91 | //对外输出 92 | exports('index', { 93 | openTabsPage: openTabsPage 94 | }); 95 | }); 96 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/modules/common.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layuiAdmin 公共业务 4 | @Author:贤心 5 | @Site:http://www.layui.com/admin/ 6 | @License:LPPL 7 | 8 | */ 9 | 10 | layui.define(function(exports){ 11 | var $ = layui.$ 12 | ,layer = layui.layer 13 | ,laytpl = layui.laytpl 14 | ,setter = layui.setter 15 | ,view = layui.view 16 | ,admin = layui.admin 17 | 18 | //公共业务的逻辑处理可以写在此处,切换任何页面都会执行 19 | //…… 20 | 21 | 22 | 23 | //退出 24 | admin.events.logout = function(){ 25 | //执行退出接口 26 | admin.req({ 27 | url: layui.setter.base + 'json/user/logout.js' 28 | ,type: 'get' 29 | ,data: {} 30 | ,done: function(res){ //这里要说明一下:done 是只有 response 的 code 正常才会执行。而 succese 则是只要 http 为 200 就会执行 31 | 32 | //清空本地记录的 token,并跳转到登入页 33 | admin.exit(function(){ 34 | location.href = 'user/login.html'; 35 | }); 36 | } 37 | }); 38 | }; 39 | 40 | 41 | //对外暴露的接口 42 | exports('common', {}); 43 | }); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/modules/message.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layuiAdmin(iframe版) 消息中心 4 | @Author:贤心 5 | @Site:http://www.layui.com/admin/ 6 | @License:LPPL 7 | 8 | */ 9 | 10 | 11 | layui.define(['admin', 'table', 'util'], function(exports){ 12 | var $ = layui.$ 13 | ,admin = layui.admin 14 | ,table = layui.table 15 | ,element = layui.element; 16 | 17 | var DISABLED = 'layui-btn-disabled' 18 | 19 | //区分各选项卡中的表格 20 | ,tabs = { 21 | all: { 22 | text: '全部消息' 23 | ,id: 'LAY-app-message-all' 24 | } 25 | ,notice: { 26 | text: '通知' 27 | ,id: 'LAY-app-message-notice' 28 | } 29 | ,direct: { 30 | text: '私信' 31 | ,id: 'LAY-app-message-direct' 32 | } 33 | }; 34 | 35 | //标题内容模板 36 | var tplTitle = function(d){ 37 | return ''+ d.title; 38 | }; 39 | 40 | //全部消息 41 | table.render({ 42 | elem: '#LAY-app-message-all' 43 | ,url: layui.setter.base + 'json/message/all.js' //模拟接口 44 | ,page: true 45 | ,cols: [[ 46 | {type: 'checkbox', fixed: 'left'} 47 | ,{field: 'title', title: '标题内容', minWidth: 300, templet: tplTitle} 48 | ,{field: 'time', title: '时间', width: 170, templet: '
      {{ layui.util.timeAgo(d.time) }}
      '} 49 | ]] 50 | ,skin: 'line' 51 | }); 52 | 53 | //通知 54 | table.render({ 55 | elem: '#LAY-app-message-notice' 56 | ,url: layui.setter.base + 'json/message/notice.js' //模拟接口 57 | ,page: true 58 | ,cols: [[ 59 | {type: 'checkbox', fixed: 'left'} 60 | ,{field: 'title', title: '标题内容', minWidth: 300, templet: tplTitle} 61 | ,{field: 'time', title: '时间', width: 170, templet: '
      {{ layui.util.timeAgo(d.time) }}
      '} 62 | ]] 63 | ,skin: 'line' 64 | }); 65 | 66 | //私信 67 | table.render({ 68 | elem: '#LAY-app-message-direct' 69 | ,url: layui.setter.base + 'json/message/direct.js' //模拟接口 70 | ,page: true 71 | ,cols: [[ 72 | {type: 'checkbox', fixed: 'left'} 73 | ,{field: 'title', title: '标题内容', minWidth: 300, templet: tplTitle} 74 | ,{field: 'time', title: '时间', width: 170, templet: '
      {{ layui.util.timeAgo(d.time) }}
      '} 75 | ]] 76 | ,skin: 'line' 77 | }); 78 | 79 | 80 | //事件处理 81 | var events = { 82 | del: function(othis, type){ 83 | var thisTabs = tabs[type] 84 | ,checkStatus = table.checkStatus(thisTabs.id) 85 | ,data = checkStatus.data; //获得选中的数据 86 | if(data.length === 0) return layer.msg('未选中行'); 87 | 88 | layer.confirm('确定删除选中的数据吗?', function(){ 89 | /* 90 | admin.req('url', {}, function(){ //请求接口 91 | //do somethin 92 | }); 93 | */ 94 | //此处只是演示,实际应用需把下述代码放入上述Ajax回调中 95 | layer.msg('删除成功', { 96 | icon: 1 97 | }); 98 | table.reload(thisTabs.id); //刷新表格 99 | }); 100 | } 101 | ,ready: function(othis, type){ 102 | var thisTabs = tabs[type] 103 | ,checkStatus = table.checkStatus(thisTabs.id) 104 | ,data = checkStatus.data; //获得选中的数据 105 | if(data.length === 0) return layer.msg('未选中行'); 106 | 107 | //此处只是演示 108 | layer.msg('标记已读成功', { 109 | icon: 1 110 | }); 111 | table.reload(thisTabs.id); //刷新表格 112 | } 113 | ,readyAll: function(othis, type){ 114 | var thisTabs = tabs[type]; 115 | 116 | //do somethin 117 | 118 | layer.msg(thisTabs.text + ':全部已读', { 119 | icon: 1 120 | }); 121 | } 122 | }; 123 | 124 | $('.LAY-app-message-btns .layui-btn').on('click', function(){ 125 | var othis = $(this) 126 | ,thisEvent = othis.data('events') 127 | ,type = othis.data('type'); 128 | events[thisEvent] && events[thisEvent].call(this, othis, type); 129 | }); 130 | 131 | exports('message', {}); 132 | }); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/modules/set.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layuiAdmin(iframe版) 设置 4 | @Author:贤心 5 | @Site:http://www.layui.com/admin/ 6 | @License: LPPL 7 | 8 | */ 9 | 10 | layui.define(['form', 'upload'], function(exports){ 11 | var $ = layui.$ 12 | ,layer = layui.layer 13 | ,laytpl = layui.laytpl 14 | ,setter = layui.setter 15 | ,view = layui.view 16 | ,admin = layui.admin 17 | ,form = layui.form 18 | ,upload = layui.upload; 19 | 20 | var $body = $('body'); 21 | 22 | //自定义验证 23 | form.verify({ 24 | nickname: function(value, item){ //value:表单的值、item:表单的DOM对象 25 | if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){ 26 | return '用户名不能有特殊字符'; 27 | } 28 | if(/(^\_)|(\__)|(\_+$)/.test(value)){ 29 | return '用户名首尾不能出现下划线\'_\''; 30 | } 31 | if(/^\d+\d+\d$/.test(value)){ 32 | return '用户名不能全为数字'; 33 | } 34 | } 35 | 36 | //我们既支持上述函数式的方式,也支持下述数组的形式 37 | //数组的两个值分别代表:[正则匹配、匹配不符时的提示文字] 38 | ,pass: [ 39 | /^[\S]{6,12}$/ 40 | ,'密码必须6到12位,且不能出现空格' 41 | ] 42 | 43 | //确认密码 44 | ,repass: function(value){ 45 | if(value !== $('#LAY_password').val()){ 46 | return '两次密码输入不一致'; 47 | } 48 | } 49 | }); 50 | 51 | //网站设置 52 | form.on('submit(set_website)', function(obj){ 53 | layer.msg(JSON.stringify(obj.field)); 54 | 55 | //提交修改 56 | /* 57 | admin.req({ 58 | url: '' 59 | ,data: obj.field 60 | ,success: function(){ 61 | 62 | } 63 | }); 64 | */ 65 | return false; 66 | }); 67 | 68 | //邮件服务 69 | form.on('submit(set_system_email)', function(obj){ 70 | layer.msg(JSON.stringify(obj.field)); 71 | 72 | //提交修改 73 | /* 74 | admin.req({ 75 | url: '' 76 | ,data: obj.field 77 | ,success: function(){ 78 | 79 | } 80 | }); 81 | */ 82 | return false; 83 | }); 84 | 85 | 86 | //设置我的资料 87 | form.on('submit(setmyinfo)', function(obj){ 88 | layer.msg(JSON.stringify(obj.field)); 89 | 90 | //提交修改 91 | /* 92 | admin.req({ 93 | url: '' 94 | ,data: obj.field 95 | ,success: function(){ 96 | 97 | } 98 | }); 99 | */ 100 | return false; 101 | }); 102 | 103 | //上传头像 104 | var avatarSrc = $('#LAY_avatarSrc'); 105 | upload.render({ 106 | url: '/api/upload/' 107 | ,elem: '#LAY_avatarUpload' 108 | ,done: function(res){ 109 | if(res.status == 0){ 110 | avatarSrc.val(res.url); 111 | } else { 112 | layer.msg(res.msg, {icon: 5}); 113 | } 114 | } 115 | }); 116 | 117 | //查看头像 118 | admin.events.avartatPreview = function(othis){ 119 | var src = avatarSrc.val(); 120 | layer.photos({ 121 | photos: { 122 | "title": "查看头像" //相册标题 123 | ,"data": [{ 124 | "src": src //原图地址 125 | }] 126 | } 127 | ,shade: 0.01 128 | ,closeBtn: 1 129 | ,anim: 5 130 | }); 131 | }; 132 | 133 | 134 | //设置密码 135 | form.on('submit(setmypass)', function(obj){ 136 | layer.msg(JSON.stringify(obj.field)); 137 | 138 | //提交修改 139 | /* 140 | admin.req({ 141 | url: '' 142 | ,data: obj.field 143 | ,success: function(){ 144 | 145 | } 146 | }); 147 | */ 148 | return false; 149 | }); 150 | 151 | //对外暴露的接口 152 | exports('set', {}); 153 | }); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/modules/user.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layuiAdmin 用户登入和注册等 4 | @Author:贤心 5 | @Site:http://www.layui.com/admin/ 6 | @License: LPPL 7 | 8 | */ 9 | 10 | layui.define('form', function(exports){ 11 | var $ = layui.$ 12 | ,layer = layui.layer 13 | ,laytpl = layui.laytpl 14 | ,setter = layui.setter 15 | ,view = layui.view 16 | ,admin = layui.admin 17 | ,form = layui.form; 18 | 19 | var $body = $('body'); 20 | 21 | //自定义验证 22 | form.verify({ 23 | nickname: function(value, item){ //value:表单的值、item:表单的DOM对象 24 | if(!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)){ 25 | return '用户名不能有特殊字符'; 26 | } 27 | if(/(^\_)|(\__)|(\_+$)/.test(value)){ 28 | return '用户名首尾不能出现下划线\'_\''; 29 | } 30 | if(/^\d+\d+\d$/.test(value)){ 31 | return '用户名不能全为数字'; 32 | } 33 | } 34 | 35 | //我们既支持上述函数式的方式,也支持下述数组的形式 36 | //数组的两个值分别代表:[正则匹配、匹配不符时的提示文字] 37 | ,pass: [ 38 | /^[\S]{6,12}$/ 39 | ,'密码必须6到12位,且不能出现空格' 40 | ] 41 | }); 42 | 43 | 44 | //发送短信验证码 45 | admin.sendAuthCode({ 46 | elem: '#LAY-user-getsmscode' 47 | ,elemPhone: '#LAY-user-login-cellphone' 48 | ,elemVercode: '#LAY-user-login-vercode' 49 | ,ajax: { 50 | url: layui.setter.base + 'json/user/sms.js' //实际使用请改成服务端真实接口 51 | } 52 | }); 53 | 54 | 55 | 56 | 57 | //更换图形验证码 58 | $body.on('click', '#LAY-user-get-vercode', function(){ 59 | var othis = $(this); 60 | this.src = 'https://www.oschina.net/action/user/captcha?t='+ new Date().getTime() 61 | }); 62 | 63 | //对外暴露的接口 64 | exports('user', {}); 65 | }); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/modules/workorder.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layuiAdmin 工单系统 4 | @Author:star1029 5 | @Site:http://www.layui.com/admin/ 6 | @License:GPL-2 7 | 8 | */ 9 | 10 | 11 | layui.define(['table', 'form', 'element'], function(exports){ 12 | var $ = layui.$ 13 | ,table = layui.table 14 | ,form = layui.form 15 | ,element = layui.element; 16 | 17 | table.render({ 18 | elem: '#LAY-app-system-order' 19 | ,url: layui.setter.base + 'json/workorder/demo.js' //模拟接口 20 | ,cols: [[ 21 | {type: 'numbers', fixed: 'left'} 22 | ,{field: 'orderid', width: 100, title: '工单号', sort: true} 23 | ,{field: 'attr', width: 100, title: '业务性质'} 24 | ,{field: 'title', width: 100, title: '工单标题', width: 300} 25 | ,{field: 'progress', title: '进度', width: 200, align: 'center', templet: '#progressTpl'} 26 | ,{field: 'submit', width: 100, title: '提交者'} 27 | ,{field: 'accept', width: 100, title: '受理人员'} 28 | ,{field: 'state', title: '工单状态', templet: '#buttonTpl', minWidth: 80, align: 'center'} 29 | ,{title: '操作', align: 'center', fixed: 'right', toolbar: '#table-system-order'} 30 | ]] 31 | ,page: true 32 | ,limit: 10 33 | ,limits: [10, 15, 20, 25, 30] 34 | ,text: '对不起,加载出现异常!' 35 | ,done: function(){ 36 | element.render('progress') 37 | } 38 | }); 39 | 40 | //监听工具条 41 | table.on('tool(LAY-app-system-order)', function(obj){ 42 | var data = obj.data; 43 | if(obj.event === 'edit'){ 44 | var tr = $(obj.tr); 45 | layer.open({ 46 | type: 2 47 | ,title: '编辑工单' 48 | ,content: '../../../views/app/workorder/listform.html' 49 | ,area: ['450px', '450px'] 50 | ,btn: ['确定', '取消'] 51 | ,yes: function(index, layero){ 52 | var iframeWindow = window['layui-layer-iframe'+ index] 53 | ,submitID = 'LAY-app-workorder-submit' 54 | ,submit = layero.find('iframe').contents().find('#'+ submitID); 55 | 56 | //监听提交 57 | iframeWindow.layui.form.on('submit('+ submitID +')', function(data){ 58 | var field = data.field; //获取提交的字段 59 | 60 | //提交 Ajax 成功后,静态更新表格中的数据 61 | //$.ajax({}); 62 | table.reload('LAY-user-front-submit'); //数据刷新 63 | layer.close(index); //关闭弹层 64 | }); 65 | 66 | submit.trigger('click'); 67 | } 68 | ,success: function(layero, index){ 69 | 70 | } 71 | }); 72 | } 73 | }); 74 | 75 | exports('workorder', {}) 76 | }); -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/style/login.css: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | @Name:layuiAdmin 登入注册页 4 | @Author:贤心 5 | @Site:http://www.layui.com/admin/ 6 | @License:GPL-2 7 | 8 | */ 9 | 10 | html,body,#LAY_app{height:100%;} 11 | .layui-layout-body{overflow: auto;} 12 | 13 | #LAY-user-login, 14 | .layadmin-user-display-show{display: block !important;} 15 | .layadmin-user-login{position: relative; left: 0; top: 0; padding: 110px 0; min-height: 100%; box-sizing: border-box;} 16 | .layadmin-user-login-main{width: 375px; margin: 0 auto; box-sizing: border-box;} 17 | .layadmin-user-login-box{padding: 20px;} 18 | .layadmin-user-login-header{text-align: center;} 19 | .layadmin-user-login-header h2{margin-bottom: 10px; font-weight: 300; font-size: 30px; color: #000;} 20 | .layadmin-user-login-header p{font-weight: 300; color: #999;} 21 | 22 | .layadmin-user-login-body .layui-form-item{position: relative;} 23 | .layadmin-user-login-icon{position: absolute; left: 1px; top: 1px; width: 38px; line-height: 36px; text-align: center; color: #d2d2d2;} 24 | .layadmin-user-login-body .layui-form-item .layui-input{padding-left: 38px;} 25 | .layadmin-user-login-codeimg{max-height: 38px; width: 100%; cursor: pointer; box-sizing: border-box;} 26 | 27 | .layadmin-user-login-other{position: relative; font-size: 0; line-height: 38px; padding-top: 20px;} 28 | .layadmin-user-login-other>*{display: inline-block; vertical-align: middle; margin-right: 10px; font-size: 14px;} 29 | .layadmin-user-login-other .layui-icon{position: relative; top: 2px; font-size: 26px;} 30 | .layadmin-user-login-other a:hover{opacity: 0.8;} 31 | 32 | .layadmin-user-jump-change{float: right;} 33 | 34 | .layadmin-user-login-footer{position: absolute; left: 0; bottom: 0; width: 100%; line-height: 30px; padding: 20px; text-align: center; box-sizing: border-box; color: rgba(0,0,0,.5)} 35 | .layadmin-user-login-footer span{padding: 0 5px;} 36 | .layadmin-user-login-footer a{padding: 0 5px; color: rgba(0,0,0,.5);} 37 | .layadmin-user-login-footer a:hover{color: rgba(0,0,0,1);} 38 | 39 | /* 有背景图时 */ 40 | .layadmin-user-login-main[bgimg]{background-color: #fff; box-shadow: 0 0 5px rgba(0,0,0,0.05);} 41 | 42 | /* 主题背景 */ 43 | .ladmin-user-login-theme{position: fixed; bottom: 0; left: 0; width: 100%; text-align: center;} 44 | .ladmin-user-login-theme ul{display: inline-block; padding: 5px; background-color: #fff;} 45 | .ladmin-user-login-theme ul li{display: inline-block; vertical-align: top; width: 64px; height: 43px; cursor: pointer; transition: all .3s; -webkit-transition: all .3s; background-color: #f2f2f2;} 46 | .ladmin-user-login-theme ul li:hover{opacity: 0.9} 47 | 48 | @media screen and (max-width: 768px) { 49 | .layadmin-user-login{padding-top: 60px;} 50 | .layadmin-user-login-main{width: 300px;} 51 | .layadmin-user-login-box{padding: 10px;} 52 | } 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/style/res/bg-none.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/style/res/bg-none.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/style/res/layui-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/style/res/layui-logo.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/style/res/logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/style/res/logo-black.png -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/style/res/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/style/res/logo.png -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/style/res/template/character.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/style/res/template/character.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/style/res/template/huge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/style/res/template/huge.jpg -------------------------------------------------------------------------------- /src/main/resources/static/layuiadmin/style/res/template/portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/src/main/resources/static/layuiadmin/style/res/template/portrait.png -------------------------------------------------------------------------------- /src/main/resources/static/mystatic/login/css/login.css: -------------------------------------------------------------------------------- 1 | .box { 2 | width: 300px; 3 | padding: 40px; 4 | position: absolute; 5 | top: 50%; 6 | left: 50%; 7 | transform: translate(-50%, -50%); 8 | background: #191919; 9 | text-align: center; 10 | } 11 | .box h1 { 12 | color: white; 13 | text-transform: uppercase; 14 | font-weight: 500; 15 | } 16 | .box input[type='text'], 17 | .box input[type='password'] { 18 | border: 0; 19 | background: none; 20 | display: block; 21 | margin: 20px auto; 22 | text-align: center; 23 | border: 2px solid #3498db; 24 | padding: 14px 10px; 25 | width: 200px; 26 | outline: none; 27 | color: white; 28 | border-radius: 24px; 29 | transition: 0.25s; 30 | } 31 | .box input[type='text']:focus, 32 | .box input[type='password']:focus { 33 | width: 280px; 34 | border-color: #2ecc71; 35 | } 36 | .submit { 37 | border: 0; 38 | background: none; 39 | margin: 20px auto; 40 | margin-top: 0; 41 | display: inline-block; 42 | text-align: center; 43 | border: 2px solid #3498db; 44 | padding: 10px 40px; 45 | outline: none; 46 | color: white; 47 | border-radius: 24px; 48 | transition: 0.25s; 49 | cursor: pointer; 50 | text-decoration: none; 51 | font-size: 12px; 52 | } 53 | .submit:hover { 54 | background: #2ecc71; 55 | border-color: #2ecc71; 56 | } -------------------------------------------------------------------------------- /src/main/resources/static/mystatic/particles/css/style.css: -------------------------------------------------------------------------------- 1 | /* ============================================================================= 2 | HTML5 CSS Reset Minified - Eric Meyer 3 | ========================================================================== */ 4 | 5 | html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent} 6 | body{line-height:1} 7 | article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block} 8 | nav ul{list-style:none} 9 | blockquote,q{quotes:none} 10 | blockquote:before,blockquote:after,q:before,q:after{content:none} 11 | a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent;text-decoration:none} 12 | mark{background-color:#ff9;color:#000;font-style:italic;font-weight:bold} 13 | del{text-decoration:line-through} 14 | abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help} 15 | table{border-collapse:collapse;border-spacing:0} 16 | hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0} 17 | input,select{vertical-align:middle} 18 | li{list-style:none} 19 | 20 | 21 | /* ============================================================================= 22 | My CSS 23 | ========================================================================== */ 24 | 25 | /* ---- base ---- */ 26 | 27 | html,body{ 28 | width:100%; 29 | height:100%; 30 | background:#111; 31 | } 32 | 33 | html{ 34 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 35 | } 36 | 37 | body{ 38 | font:normal 75% Arial, Helvetica, sans-serif; 39 | } 40 | 41 | canvas{ 42 | display:block; 43 | vertical-align:bottom; 44 | } 45 | 46 | 47 | /* ---- stats.js ---- */ 48 | 49 | .count-particles{ 50 | background: #000022; 51 | position: absolute; 52 | top: 48px; 53 | left: 0; 54 | width: 80px; 55 | color: #13E8E9; 56 | font-size: .8em; 57 | text-align: left; 58 | text-indent: 4px; 59 | line-height: 14px; 60 | padding-bottom: 2px; 61 | font-family: Helvetica, Arial, sans-serif; 62 | font-weight: bold; 63 | } 64 | 65 | .js-count-particles{ 66 | font-size: 1.1em; 67 | } 68 | 69 | #stats, 70 | .count-particles{ 71 | -webkit-user-select: none; 72 | margin-top: 5px; 73 | margin-left: 5px; 74 | } 75 | 76 | #stats{ 77 | border-radius: 3px 3px 0 0; 78 | overflow: hidden; 79 | } 80 | 81 | .count-particles{ 82 | border-radius: 0 0 3px 3px; 83 | } 84 | 85 | 86 | /* ---- particles.js container ---- */ 87 | 88 | #particles-js{ 89 | width: 100%; 90 | height: 100%; 91 | background-color: #002B5A; 92 | background-size: cover; 93 | background-position: 50% 50%; 94 | background-repeat: no-repeat; 95 | } 96 | -------------------------------------------------------------------------------- /src/main/resources/static/mystatic/particles/js/app.js: -------------------------------------------------------------------------------- 1 | /* ----------------------------------------------- 2 | /* How to use? : Check the GitHub README 3 | /* ----------------------------------------------- */ 4 | 5 | /* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */ 6 | /* 7 | particlesJS.load('particles-js', 'particles.json', function() { 8 | console.log('particles.js loaded - callback'); 9 | }); 10 | */ 11 | 12 | /* Otherwise just put the config content (json): */ 13 | 14 | particlesJS('particles-js', 15 | 16 | { 17 | "particles": { 18 | "number": { 19 | "value": 80, 20 | "density": { 21 | "enable": true, 22 | "value_area": 800 23 | } 24 | }, 25 | "color": { 26 | "value": "#ffffff" 27 | }, 28 | "shape": { 29 | "type": "circle", 30 | "stroke": { 31 | "width": 0, 32 | "color": "#000000" 33 | }, 34 | "polygon": { 35 | "nb_sides": 5 36 | }, 37 | "image": { 38 | "src": "img/github.svg", 39 | "width": 100, 40 | "height": 100 41 | } 42 | }, 43 | "opacity": { 44 | "value": 0.5, 45 | "random": false, 46 | "anim": { 47 | "enable": false, 48 | "speed": 1, 49 | "opacity_min": 0.1, 50 | "sync": false 51 | } 52 | }, 53 | "size": { 54 | "value": 5, 55 | "random": true, 56 | "anim": { 57 | "enable": false, 58 | "speed": 40, 59 | "size_min": 0.1, 60 | "sync": false 61 | } 62 | }, 63 | "line_linked": { 64 | "enable": true, 65 | "distance": 150, 66 | "color": "#ffffff", 67 | "opacity": 0.4, 68 | "width": 1 69 | }, 70 | "move": { 71 | "enable": true, 72 | "speed": 6, 73 | "direction": "none", 74 | "random": false, 75 | "straight": false, 76 | "out_mode": "out", 77 | "attract": { 78 | "enable": false, 79 | "rotateX": 600, 80 | "rotateY": 1200 81 | } 82 | } 83 | }, 84 | "interactivity": { 85 | "detect_on": "canvas", 86 | "events": { 87 | "onhover": { 88 | "enable": true, 89 | "mode": "repulse" 90 | }, 91 | "onclick": { 92 | "enable": true, 93 | "mode": "push" 94 | }, 95 | "resize": true 96 | }, 97 | "modes": { 98 | "grab": { 99 | "distance": 400, 100 | "line_linked": { 101 | "opacity": 1 102 | } 103 | }, 104 | "bubble": { 105 | "distance": 400, 106 | "size": 40, 107 | "duration": 2, 108 | "opacity": 8, 109 | "speed": 3 110 | }, 111 | "repulse": { 112 | "distance": 200 113 | }, 114 | "push": { 115 | "particles_nb": 4 116 | }, 117 | "remove": { 118 | "particles_nb": 2 119 | } 120 | } 121 | }, 122 | "retina_detect": true, 123 | "config_demo": { 124 | "hide_card": false, 125 | "background_color": "#b61924", 126 | "background_image": "", 127 | "background_position": "50% 50%", 128 | "background_repeat": "no-repeat", 129 | "background_size": "cover" 130 | } 131 | } 132 | 133 | ); -------------------------------------------------------------------------------- /src/main/resources/templates/manager/admin/addAdmin.html: -------------------------------------------------------------------------------- 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 | 36 |
      37 |
      38 |
      39 | 40 |
      41 | 42 |
      43 |
      44 |
      45 |
      46 | 47 | 48 |
      49 |
      50 |
      51 | 52 | 53 | 88 | 89 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/common/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
      6 | 21 | 49 |
      50 | 51 | 52 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/common/password.html: -------------------------------------------------------------------------------- 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 |
      6到16个字符
      30 |
      31 |
      32 | 33 |
      34 | 35 |
      36 |
      37 |
      38 |
      39 | 40 |
      41 |
      42 |
      43 |
      44 |
      45 |
      46 |
      47 |
      48 |
      49 | 50 | 51 | 52 | 78 | 79 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/common/sidebar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
      6 |
      7 | 10 | 11 |
        12 | 13 |
      14 |
      15 |
      16 | 17 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/console.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 主页 6 | 7 | 8 | 9 | 10 | 11 |
      12 |
      13 |

      欢迎使用后台理系统

      14 |

      开发人员:zero

      15 | 16 |
      17 |

      系统环境

      18 |

      系统环境:Windows

      19 |

      开发工具:IDEA

      20 |

      Java版本:JDK 1.8

      21 |

      服务器:tomcat 7.0

      22 |

      数据库:MySQL 5.7

      23 |

      系统采用技术: springboot + mybatis + maven

      24 |
      25 |
      26 | 27 | 28 | 31 | 32 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/error/error403.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 权限不足 6 | 7 | 8 | 9 | 10 | 11 |
      12 |

      权限不足

      13 |
      14 | 15 | 16 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 后台登录 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 20 | 21 |
      22 | 23 |
      24 |
      25 |

      Login

      26 | 27 | 28 | Login 29 |
      30 |
      31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 64 | 65 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/permission/addParentNode.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 添加权限 6 | 7 | 8 | 9 | 10 |
      11 | 12 |
      13 | 14 |
      15 | 16 |
      17 |
      18 |
      19 | 20 |
      21 | 25 |
      26 | 27 |
      28 | 29 |
      30 |
      31 | 32 | 33 |
      34 |
      35 |
      36 | 37 | 38 | 78 | 79 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/permission/addPermission.html: -------------------------------------------------------------------------------- 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 | 34 |
      35 | 36 |
      37 |
      38 |
      39 |
      40 | 41 | 42 |
      43 |
      44 |
      45 | 46 | 47 | 87 | 88 | -------------------------------------------------------------------------------- /src/main/resources/templates/manager/role/addRole.html: -------------------------------------------------------------------------------- 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 | 61 | 62 | -------------------------------------------------------------------------------- /src/test/java/com/zero/system/ManagerSystemApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.zero.system; 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 | import java.text.ParseException; 9 | import java.text.SimpleDateFormat; 10 | import java.util.Date; 11 | 12 | @RunWith(SpringRunner.class) 13 | @SpringBootTest 14 | public class ManagerSystemApplicationTests { 15 | 16 | @Test 17 | public void contextLoads() throws ParseException { 18 | Date date = new Date(); 19 | SimpleDateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd"); //HH表示24小时制; 20 | String formatDate = dFormat.format(date); 21 | Date parse = dFormat.parse(formatDate); 22 | System.out.println(parse); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /项目截图/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/1.png -------------------------------------------------------------------------------- /项目截图/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/10.png -------------------------------------------------------------------------------- /项目截图/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/2.png -------------------------------------------------------------------------------- /项目截图/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/3.png -------------------------------------------------------------------------------- /项目截图/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/4.png -------------------------------------------------------------------------------- /项目截图/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/5.png -------------------------------------------------------------------------------- /项目截图/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/6.png -------------------------------------------------------------------------------- /项目截图/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/7.png -------------------------------------------------------------------------------- /项目截图/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/8.png -------------------------------------------------------------------------------- /项目截图/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZeroWdd/manager-system/43b587280864478363f9caf7bb285766170d9ee6/项目截图/9.png --------------------------------------------------------------------------------