Pu Zhibing
2025-02-19 8f45afced0c6a4085560c62dbd58e6ef0f4cecf4
提交基础版本
147 文件已重命名
20个文件已删除
22个文件已添加
42个文件已修改
13790 ■■■■ 已修改文件
bin/clean.bat 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/package.bat 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/run.bat 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/若依环境使用手册.docx 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/aspectj/PermissionsAspect.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/DruidConfig.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/FilterConfig.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/I18nConfig.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/ShiroConfig.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/manager/AsyncManager.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/rememberMe/CustomCookieRememberMeManager.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/service/SysPasswordService.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/service/SysRegisterService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/service/SysShiroService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/session/OnlineSession.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionDAO.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionFactory.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/util/AuthorizationUtils.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/CustomShiroFilterFactoryBean.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/LogoutFilter.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/captcha/CaptchaValidateFilter.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/kickout/KickoutSessionFilter.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/online/OnlineSessionFilter.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/sync/SyncOnlineSessionFilter.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/session/OnlineWebSessionManager.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/session/SpringSessionValidationScheduler.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/Server.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/service/CacheService.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/service/ConfigService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/service/DictService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/framework/web/service/PermissionService.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/controller/SystemUserController.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/controller/TestController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/domain/SystemUser.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/domain/Test.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/mapper/SystemUserMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/mapper/TestMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/service/ISystemUserService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/service/ITestService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/service/impl/SystemUserServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/service/impl/TestServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/util/JwtUtils.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/util/SecurityConstants.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/util/ServletUtils.java 335 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/util/TokenConstants.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/util/TokenService.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/warpper/LoginVo.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/sange/warpper/TokenVo.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/RedisConfig.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysLogininfor.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysNotice.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysOperLog.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysPost.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysRoleDept.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysRoleMenu.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysUserOnline.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysUserPost.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysUserRole.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysConfigMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysDeptMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysDictDataMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysDictTypeMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysLogininforMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysMenuMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysNoticeMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysOperLogMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysPostMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysRoleDeptMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysRoleMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysRoleMenuMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysUserMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysUserOnlineMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysUserPostMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysUserRoleMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysConfigServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysDeptServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysDictDataServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysDictTypeServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysLogininforServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysMenuServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysNoticeServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysOperLogServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysPostServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysRoleServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysUserOnlineServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysUserServiceImpl.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysConfigService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysDeptService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysDictDataService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysDictTypeService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysLogininforService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysMenuService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysNoticeService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysOperLogService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysPostService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysRoleService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysUserOnlineService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysUserService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/CommonController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysCaptchaController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysConfigController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysDeptController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysDictDataController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysDictTypeController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysIndexController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysLoginController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysMenuController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysNoticeController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysPostController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysProfileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysRegisterController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysRoleController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysUserController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoDialogController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoFormController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoIconController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoOperateController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoReportController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoTableController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/domain/CustomerModel.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/domain/GoodsModel.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/domain/UserOperateModel.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/CacheController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/DruidController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/ServerController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/SysLogininforController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/SysOperlogController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/SysUserOnlineController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/BuildController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/CacheUtil.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/IDModel.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/IDUtil.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/R.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/RedisLock.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/Result.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/StringUtils.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/SwaggerController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/TestController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/tool/UUIDUtil.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/sange/TestMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysConfigMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysDeptMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysDictDataMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysDictTypeMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysLogininforMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysMenuMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysNoticeMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysOperLogMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysPostMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysRoleDeptMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysRoleMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysRoleMenuMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysUserMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysUserOnlineMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysUserPostMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/mapper/system/SysUserRoleMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/static/ajax/libs/validate/jquery.validate.min.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/static/css/style.css 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/static/css/style.min.css 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/static/img/qr_code.png 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/static/ruoyi/css/ry-ui.css 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/static/ruoyi/index.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/static/ruoyi/js/common.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/demo/form/datetime.html 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/demo/form/summernote.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/demo/table/asynTree.html 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/demo/table/resizable.html 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/include.html 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/index-topnav.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/index.html 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/lock.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/login.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/main.html 1755 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/register.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/templates/skin.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/enums/DesensitizedType.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/pom.xml 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/generator.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/controller.java.vm 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/domain.java.vm 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/resources/templates/monitor/job/cron.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/pom.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ry.bat 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ry.sh 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/quartz.sql 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ruoyi.html 2890 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ruoyi.pdm 4851 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ry_20240601.sql 722 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
bin/clean.bat
File was deleted
bin/package.bat
File was deleted
bin/run.bat
File was deleted
doc/若依环境使用手册.docx
Binary files differ
pom.xml
@@ -5,20 +5,20 @@
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi</artifactId>
    <version>4.8.0</version>
    <version>4.7.9</version>
    <name>ruoyi</name>
    <url>http://www.ruoyi.vip</url>
    <description>若依管理系统</description>
    
    <properties>
        <ruoyi.version>4.8.0</ruoyi.version>
        <ruoyi.version>4.7.9</ruoyi.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <spring-boot.version>2.5.15</spring-boot.version>
        <shiro.version>1.13.0</shiro.version>
        <spring-framework.version>5.3.33</spring-framework.version>
        <thymeleaf.extras.shiro.version>2.1.0</thymeleaf.extras.shiro.version>
        <druid.version>1.2.23</druid.version>
        <bitwalker.version>1.21</bitwalker.version>
@@ -26,21 +26,17 @@
        <swagger.version>3.0.0</swagger.version>
        <pagehelper.boot.version>1.4.7</pagehelper.boot.version>
        <fastjson.version>1.2.83</fastjson.version>
        <oshi.version>6.6.5</oshi.version>
        <oshi.version>6.6.3</oshi.version>
        <commons.io.version>2.16.1</commons.io.version>
        <poi.version>4.1.2</poi.version>
        <velocity.version>2.3</velocity.version>
        <!-- override dependency version -->
        <tomcat.version>9.0.96</tomcat.version>
        <logback.version>1.2.13</logback.version>
        <spring-framework.version>5.3.39</spring-framework.version>
    </properties>
    <!-- 依赖声明 -->
    <dependencyManagement>
        <dependencies>
            <!-- 覆盖SpringFramework的依赖配置-->
            <!-- SpringFramework的依赖配置-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
@@ -53,41 +49,9 @@
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <version>2.5.15</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 覆盖logback的依赖配置-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>${logback.version}</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>${logback.version}</version>
            </dependency>
            <!-- 覆盖tomcat的依赖配置-->
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-core</artifactId>
                <version>${tomcat.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-el</artifactId>
                <version>${tomcat.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-websocket</artifactId>
                <version>${tomcat.version}</version>
            </dependency>
            <!-- 阿里数据库连接池 -->
@@ -208,20 +172,6 @@
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 核心模块-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-framework</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 系统模块-->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-system</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 通用工具-->
            <dependency>
                <groupId>com.ruoyi</groupId>
@@ -234,8 +184,6 @@
    <modules>
        <module>ruoyi-admin</module>
        <module>ruoyi-framework</module>
        <module>ruoyi-system</module>
        <module>ruoyi-quartz</module>
        <module>ruoyi-generator</module>
        <module>ruoyi-common</module>
ruoyi-admin/pom.xml
@@ -5,7 +5,7 @@
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>4.8.0</version>
        <version>4.7.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
@@ -16,6 +16,64 @@
    </description>
    <dependencies>
        <!-- SpringBoot Web容器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot 拦截器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!-- 阿里数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <!-- 验证码 -->
        <dependency>
            <groupId>pro.fessional</groupId>
            <artifactId>kaptcha</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>servlet-api</artifactId>
                    <groupId>javax.servlet</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- Shiro使用Spring框架 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
        </dependency>
        <!-- thymeleaf模板引擎和shiro框架的整合 -->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
        </dependency>
        <!-- 解析客户端操作系统、浏览器等 -->
        <dependency>
            <groupId>eu.bitwalker</groupId>
            <artifactId>UserAgentUtils</artifactId>
        </dependency>
        <!-- 获取系统信息 -->
        <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <!-- SpringBoot集成thymeleaf模板 -->
        <dependency>
@@ -49,12 +107,6 @@
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 核心模块-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-framework</artifactId>
        </dependency>
        <!-- 定时任务-->
        <dependency>
            <groupId>com.ruoyi</groupId>
@@ -66,10 +118,52 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-generator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.5.5</version>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>barcodes</artifactId>
            <version>8.0.4</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.13.1</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
    </dependencies>
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -1,5 +1,6 @@
package com.ruoyi;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@@ -9,12 +10,10 @@
 * 
 * @author ruoyi
 */
@MapperScan(basePackages = {"com.ruoyi.**.mapper"})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
    public static void main(String[] args)
    {
        // System.setProperty("spring.devtools.restart.enabled", "false");
public class RuoYiApplication {
    public static void main(String[] args) {
        SpringApplication.run(RuoYiApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  若依启动成功   ლ(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
@@ -8,11 +8,9 @@
 * 
 * @author ruoyi
 */
public class RuoYiServletInitializer extends SpringBootServletInitializer
{
public class RuoYiServletInitializer extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
    {
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(RuoYiApplication.class);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
ruoyi-admin/src/main/java/com/ruoyi/framework/aspectj/DataSourceAspect.java
ruoyi-admin/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
@@ -4,6 +4,8 @@
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.web.domain.system.SysOperLog;
import org.apache.commons.lang3.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
@@ -26,7 +28,6 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.domain.SysOperLog;
/**
 * 操作日志记录处理
ruoyi-admin/src/main/java/com/ruoyi/framework/aspectj/PermissionsAspect.java
ruoyi-admin/src/main/java/com/ruoyi/framework/config/ApplicationConfig.java
ruoyi-admin/src/main/java/com/ruoyi/framework/config/CaptchaConfig.java
ruoyi-admin/src/main/java/com/ruoyi/framework/config/DruidConfig.java
ruoyi-admin/src/main/java/com/ruoyi/framework/config/FilterConfig.java
ruoyi-admin/src/main/java/com/ruoyi/framework/config/I18nConfig.java
ruoyi-admin/src/main/java/com/ruoyi/framework/config/KaptchaTextCreator.java
ruoyi-admin/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java
@@ -55,4 +55,6 @@
    {
        registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
    }
}
ruoyi-admin/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/config/ShiroConfig.java
@@ -290,12 +290,14 @@
        filterChainDefinitionMap.put("/js/**", "anon");
        filterChainDefinitionMap.put("/ruoyi/**", "anon");
        filterChainDefinitionMap.put("/captcha/captchaImage**", "anon");
        filterChainDefinitionMap.put("/api/**", "anon");
        // 匿名访问不鉴权注解列表
        List<String> permitAllUrl = SpringUtils.getBean(PermitAllUrlProperties.class).getUrls();
        if (StringUtils.isNotEmpty(permitAllUrl))
        {
            permitAllUrl.forEach(url -> filterChainDefinitionMap.put(url, "anon"));
        }
        // 退出 logout地址,shiro去清除session
        filterChainDefinitionMap.put("/logout", "logout");
        // 不需要拦截的访问
ruoyi-admin/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java
ruoyi-admin/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java
New file
@@ -0,0 +1,122 @@
package com.ruoyi.framework.config.properties;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.springframework.aop.framework.Advised;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ruoyi.common.annotation.Anonymous;
/**
 * 设置Anonymous注解允许匿名访问的url
 *
 * @author ruoyi
 */
@Configuration
public class PermitAllUrlProperties implements InitializingBean, ApplicationContextAware
{
    private List<String> urls = new ArrayList<>();
    private ApplicationContext applicationContext;
    @Override
    public void afterPropertiesSet() throws Exception
    {
        Map<String, Object> controllers = applicationContext.getBeansWithAnnotation(Controller.class);
        for (Object bean : controllers.values())
        {
            if (!(bean instanceof Advised))
            {
                continue;
            }
            Class<?> beanClass = ((Advised) bean).getTargetSource().getTarget().getClass();
            RequestMapping base = beanClass.getAnnotation(RequestMapping.class);
            String[] baseUrl = {};
            if (Objects.nonNull(base))
            {
                baseUrl = base.value();
            }
            Method[] methods = beanClass.getDeclaredMethods();
            for (Method method : methods)
            {
                if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(RequestMapping.class))
                {
                    RequestMapping requestMapping = method.getAnnotation(RequestMapping.class);
                    String[] uri = requestMapping.value();
                    urls.addAll(rebuildUrl(baseUrl, uri));
                }
                else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(GetMapping.class))
                {
                    GetMapping requestMapping = method.getAnnotation(GetMapping.class);
                    String[] uri = requestMapping.value();
                    urls.addAll(rebuildUrl(baseUrl, uri));
                }
                else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(PostMapping.class))
                {
                    PostMapping requestMapping = method.getAnnotation(PostMapping.class);
                    String[] uri = requestMapping.value();
                    urls.addAll(rebuildUrl(baseUrl, uri));
                }
                else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(PutMapping.class))
                {
                    PutMapping requestMapping = method.getAnnotation(PutMapping.class);
                    String[] uri = requestMapping.value();
                    urls.addAll(rebuildUrl(baseUrl, uri));
                }
                else if (method.isAnnotationPresent(Anonymous.class) && method.isAnnotationPresent(DeleteMapping.class))
                {
                    DeleteMapping requestMapping = method.getAnnotation(DeleteMapping.class);
                    String[] uri = requestMapping.value();
                    urls.addAll(rebuildUrl(baseUrl, uri));
                }
            }
        }
    }
    private List<String> rebuildUrl(String[] bases, String[] uris)
    {
        List<String> urls = new ArrayList<>();
        for (String base : bases)
        {
            for (String uri : uris)
            {
                urls.add(prefix(base) + prefix(uri));
            }
        }
        return urls;
    }
    private String prefix(String seg)
    {
        return seg.startsWith("/") ? seg : "/" + seg;
    }
    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException
    {
        this.applicationContext = context;
    }
    public List<String> getUrls()
    {
        return urls;
    }
    public void setUrls(List<String> urls)
    {
        this.urls = urls;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/framework/datasource/DynamicDataSource.java
ruoyi-admin/src/main/java/com/ruoyi/framework/interceptor/RepeatSubmitInterceptor.java
ruoyi-admin/src/main/java/com/ruoyi/framework/interceptor/impl/SameUrlDataInterceptor.java
ruoyi-admin/src/main/java/com/ruoyi/framework/manager/AsyncManager.java
ruoyi-admin/src/main/java/com/ruoyi/framework/manager/ShutdownManager.java
ruoyi-admin/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java
@@ -1,6 +1,13 @@
package com.ruoyi.framework.manager.factory;
import java.util.TimerTask;
import com.ruoyi.web.domain.system.SysLogininfor;
import com.ruoyi.web.domain.system.SysOperLog;
import com.ruoyi.web.domain.system.SysUserOnline;
import com.ruoyi.web.server.impl.system.SysLogininforServiceImpl;
import com.ruoyi.web.server.system.ISysOperLogService;
import com.ruoyi.web.server.system.ISysUserOnlineService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ruoyi.common.constant.Constants;
@@ -11,12 +18,6 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.shiro.session.OnlineSession;
import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysOperLogService;
import com.ruoyi.system.service.ISysUserOnlineService;
import com.ruoyi.system.service.impl.SysLogininforServiceImpl;
import eu.bitwalker.useragentutils.UserAgent;
/**
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/realm/UserRealm.java
@@ -2,6 +2,9 @@
import java.util.HashSet;
import java.util.Set;
import com.ruoyi.web.server.system.ISysMenuService;
import com.ruoyi.web.server.system.ISysRoleService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
@@ -29,8 +32,6 @@
import com.ruoyi.common.exception.user.UserPasswordRetryLimitExceedException;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.framework.shiro.service.SysLoginService;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.system.service.ISysRoleService;
/**
 * 自定义Realm 处理登录 权限
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/rememberMe/CustomCookieRememberMeManager.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysLoginService.java
@@ -2,6 +2,10 @@
import java.util.List;
import java.util.Set;
import com.ruoyi.web.server.system.ISysConfigService;
import com.ruoyi.web.server.system.ISysMenuService;
import com.ruoyi.web.server.system.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.Constants;
@@ -24,9 +28,6 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.system.service.ISysUserService;
/**
 * 登录校验方法
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/service/SysPasswordService.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/service/SysRegisterService.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysRegisterService.java
@@ -1,5 +1,6 @@
package com.ruoyi.framework.shiro.service;
import com.ruoyi.web.server.system.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.constant.Constants;
@@ -13,7 +14,6 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.service.ISysUserService;
/**
 * 注册校验方法
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/service/SysShiroService.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/service/SysShiroService.java
@@ -1,13 +1,14 @@
package com.ruoyi.framework.shiro.service;
import java.io.Serializable;
import com.ruoyi.web.domain.system.SysUserOnline;
import com.ruoyi.web.server.system.ISysUserOnlineService;
import org.apache.shiro.session.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.session.OnlineSession;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService;
/**
 * 会话db操作处理
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/session/OnlineSession.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionDAO.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/session/OnlineSessionFactory.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/util/AuthorizationUtils.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/CustomShiroFilterFactoryBean.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/LogoutFilter.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/filter/LogoutFilter.java
@@ -2,6 +2,8 @@
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import com.ruoyi.web.server.system.ISysUserOnlineService;
import org.apache.shiro.session.SessionException;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
@@ -14,7 +16,6 @@
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.system.service.ISysUserOnlineService;
/**
 * 退出过滤器
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/captcha/CaptchaValidateFilter.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/kickout/KickoutSessionFilter.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/online/OnlineSessionFilter.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/filter/sync/SyncOnlineSessionFilter.java
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/session/OnlineWebSessionManager.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/shiro/web/session/OnlineWebSessionManager.java
@@ -4,6 +4,9 @@
import java.util.Collection;
import java.util.Date;
import java.util.List;
import com.ruoyi.web.domain.system.SysUserOnline;
import com.ruoyi.web.server.system.ISysUserOnlineService;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.shiro.session.ExpiredSessionException;
import org.apache.shiro.session.InvalidSessionException;
@@ -18,8 +21,6 @@
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.shiro.session.OnlineSession;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService;
/**
 * 主要是在此如果会话的属性修改了 就标识下其修改了 然后方便 OnlineSessionDao同步
ruoyi-admin/src/main/java/com/ruoyi/framework/shiro/web/session/SpringSessionValidationScheduler.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/Server.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/Cpu.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/Jvm.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/Mem.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/Sys.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/domain/server/SysFile.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/service/CacheService.java
ruoyi-admin/src/main/java/com/ruoyi/framework/web/service/ConfigService.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/ConfigService.java
@@ -1,8 +1,8 @@
package com.ruoyi.framework.web.service;
import com.ruoyi.web.server.system.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.service.ISysConfigService;
/**
 * RuoYi首创 html调用 thymeleaf 实现参数管理
ruoyi-admin/src/main/java/com/ruoyi/framework/web/service/DictService.java
File was renamed from ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/DictService.java
@@ -1,11 +1,12 @@
package com.ruoyi.framework.web.service;
import java.util.List;
import com.ruoyi.web.server.system.ISysDictDataService;
import com.ruoyi.web.server.system.ISysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.system.service.ISysDictTypeService;
/**
 * RuoYi首创 html调用 thymeleaf 实现字典读取
ruoyi-admin/src/main/java/com/ruoyi/framework/web/service/PermissionService.java
ruoyi-admin/src/main/java/com/ruoyi/sange/controller/SystemUserController.java
New file
@@ -0,0 +1,104 @@
package com.ruoyi.sange.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.sange.domain.SystemUser;
import com.ruoyi.sange.service.ISystemUserService;
import com.ruoyi.sange.util.JwtUtils;
import com.ruoyi.sange.util.SecurityConstants;
import com.ruoyi.sange.util.ServletUtils;
import com.ruoyi.sange.util.TokenService;
import com.ruoyi.sange.warpper.LoginVo;
import com.ruoyi.sange.warpper.TokenVo;
import com.ruoyi.web.tool.StringUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.SecurityUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
 * @author zhibing.pu
 * @Date 2025/2/18 22:30
 */
@Api
@RestController
@RequestMapping("/api/systemUser")
public class SystemUserController {
    @Resource
    private ISystemUserService systemUserService;
    @Resource
    private RedisTemplate redisTemplate;
    private final Integer max_err = 5;
    @Resource
    private TokenService tokenService;
    @PostMapping("/login")
    @ApiOperation(value = "登录", tags = {"管理后台-登录"})
    public R<TokenVo> login(@RequestBody LoginVo vo){
        String key = "login:" + vo.getPhone();
        Integer size = (Integer) redisTemplate.opsForValue().get(key);
        if(null != size && max_err.equals(size)){
            return R.fail("连续登录失败,请稍后重试。");
        }
        if(null == size){
            size = 0;
        }
        SystemUser systemUser = systemUserService.getOne(new LambdaQueryWrapper<SystemUser>()
                .eq(SystemUser::getPhone, vo.getPhone()).ne(SystemUser::getStatus, 3));
        if(null == systemUser){
            size++;
            redisTemplate.opsForValue().set(key, size, 5, TimeUnit.MINUTES);
            return R.fail("登录失败,手机号/密码错误。");
        }
        if(!vo.getPassword().equals(systemUser.getPassword())){
            size++;
            redisTemplate.opsForValue().set(key, size, 5, TimeUnit.MINUTES);
            return R.fail("登录失败,手机号/密码错误。");
        }
        if(2 == systemUser.getStatus()){
            return R.fail("当前账号已冻结。");
        }
        //创建token
        String userKey = UUID.randomUUID().toString();
        Map<String, Object> claims = new HashMap<>();
        claims.put(SecurityConstants.USER_KEY, userKey);
        String token = JwtUtils.createToken(claims);
        //token有效期2小时
        redisTemplate.opsForValue().set("token:" + userKey, token, SecurityConstants.expireTime, TimeUnit.MILLISECONDS);
        redisTemplate.delete(key);
        TokenVo tokenVo = new TokenVo();
        tokenVo.setToken(token);
        tokenVo.setExpireTime(SecurityConstants.expireTime);
        return R.ok(tokenVo);
    }
    @PostMapping("/logout")
    @ApiOperation(value = "退出登录", tags = {"管理后台-登录"})
    public R logout(){
        String token = tokenService.getToken(ServletUtils.getRequest());
        if(StringUtils.isEmpty(token)){
            return R.fail("请先登录");
        }
        String userKey = JwtUtils.getUserKey(token);
        redisTemplate.delete("token:" + userKey);
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/sange/controller/TestController.java
File was deleted
ruoyi-admin/src/main/java/com/ruoyi/sange/domain/SystemUser.java
New file
@@ -0,0 +1,119 @@
package com.ruoyi.sange.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * 系统用户
 * @author zhibing.pu
 * @Date 2025/2/18 22:18
 */
@Data
@TableName("t_system_user")
public class SystemUser {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 姓名
     */
    @TableField("name")
    private String name;
    /**
     * 手机号
     */
    @TableField("phone")
    private String phone;
    /**
     * 密码
     */
    @TableField("password")
    private String password;
    /**
     * 一级单位id
     */
    @TableField("one_department_id")
    private Integer oneDepartmentId;
    /**
     * 二级单位id
     */
    @TableField("two_department_id")
    private Integer twoDepartmentId;
    /**
     * 三级单位id
     */
    @TableField("three_department_id")
    private Integer threeDepartmentId;
    /**
     * 四级单位id
     */
    @TableField("four_department_id")
    private Integer fourDepartmentId;
    /**
     * 是否是管理员(0=否,1=是)
     */
    @TableField("is_admin")
    private Integer isAdmin;
    /**
     * 职位id
     */
    @TableField("system_post_id")
    private Integer systemPostId;
    /**
     * 角色id
     */
    @TableField("system_role_id")
    private Integer systemRoleId;
    /**
     * 账号层级(1=市级账号,2=区县账号,3=街道账号,4=社区账号)
     */
    @TableField("account_level")
    private Integer accountLevel;
    /**
     * 所属区县
     */
    @TableField("districts")
    private String districts;
    /**
     * 区县编号
     */
    @TableField("districts_code")
    private String districtsCode;
    /**
     * 街道
     */
    @TableField("street")
    private String street;
    /**
     * 街道编号
     */
    @TableField("street_code")
    private String streetCode;
    /**
     * 社区
     */
    @TableField("community")
    private String community;
    /**
     * 社区编号
     */
    @TableField("community_code")
    private String communityCode;
    /**
     * 状态(1=正常,2=冻结,3=删除)
     */
    @TableField("status")
    private Integer status;
    /**
     * 添加时间
     */
    @TableField("create_time")
    private LocalDateTime createTime;
}
ruoyi-admin/src/main/java/com/ruoyi/sange/domain/Test.java
File was deleted
ruoyi-admin/src/main/java/com/ruoyi/sange/mapper/SystemUserMapper.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.sange.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sange.domain.SystemUser;
import org.apache.ibatis.annotations.Mapper;
/**
 * @author zhibing.pu
 * @Date 2025/2/18 22:29
 */
@Mapper
public interface SystemUserMapper extends BaseMapper<SystemUser> {
}
ruoyi-admin/src/main/java/com/ruoyi/sange/mapper/TestMapper.java
File was deleted
ruoyi-admin/src/main/java/com/ruoyi/sange/service/ISystemUserService.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.sange.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.sange.domain.SystemUser;
/**
 * @author zhibing.pu
 * @Date 2025/2/18 22:30
 */
public interface ISystemUserService extends IService<SystemUser> {
}
ruoyi-admin/src/main/java/com/ruoyi/sange/service/ITestService.java
File was deleted
ruoyi-admin/src/main/java/com/ruoyi/sange/service/impl/SystemUserServiceImpl.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.sange.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.sange.domain.SystemUser;
import com.ruoyi.sange.mapper.SystemUserMapper;
import com.ruoyi.sange.service.ISystemUserService;
import org.springframework.stereotype.Service;
/**
 * @author zhibing.pu
 * @Date 2025/2/18 22:30
 */
@Service
public class SystemUserServiceImpl extends ServiceImpl<SystemUserMapper, SystemUser> implements ISystemUserService {
}
ruoyi-admin/src/main/java/com/ruoyi/sange/service/impl/TestServiceImpl.java
File was deleted
ruoyi-admin/src/main/java/com/ruoyi/sange/util/JwtUtils.java
New file
@@ -0,0 +1,74 @@
package com.ruoyi.sange.util;
import com.ruoyi.common.core.text.Convert;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Map;
/**
 * Jwt工具类
 *
 * @author ruoyi
 */
public class JwtUtils {
    public static String secret = TokenConstants.SECRET;
    /**
     * 从数据声明生成令牌
     *
     * @param claims 数据声明
     * @return 令牌
     */
    public static String createToken(Map<String, Object> claims) {
        String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
        return token;
    }
    /**
     * 从令牌中获取数据声明
     *
     * @param token 令牌
     * @return 数据声明
     */
    public static Claims parseToken(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }
    /**
     * 根据令牌获取用户标识
     *
     * @param token 令牌
     * @return 用户ID
     */
    public static String getUserKey(String token) {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.USER_KEY);
    }
    /**
     * 根据令牌获取用户标识
     *
     * @param claims 身份信息
     * @return 用户ID
     */
    public static String getUserKey(Claims claims) {
        return getValue(claims, SecurityConstants.USER_KEY);
    }
    /**
     * 根据身份信息获取键值
     *
     * @param claims 身份信息
     * @param key    键
     * @return 值
     */
    public static String getValue(Claims claims, String key) {
        return Convert.toStr(claims.get(key), "");
    }
}
ruoyi-admin/src/main/java/com/ruoyi/sange/util/SecurityConstants.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.sange.util;
/**
 * 权限相关通用常量
 *
 * @author ruoyi
 */
public class SecurityConstants
{
    /**
     * 授权信息字段
     */
    public static final String AUTHORIZATION_HEADER = "Authorization";
    /**
     * 用户标识
     */
    public static final String USER_KEY = "user_key";
    /**
     * token有效期
     */
    public static final Long expireTime = 7200000L;
}
ruoyi-admin/src/main/java/com/ruoyi/sange/util/ServletUtils.java
New file
@@ -0,0 +1,335 @@
package com.ruoyi.sange.util;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.util.LinkedCaseInsensitiveMap;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import reactor.core.publisher.Mono;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
 * 客户端工具类
 *
 * @author ruoyi
 */
public class ServletUtils
{
    /**
     * 获取String参数
     */
    public static String getParameter(String name)
    {
        return getRequest().getParameter(name);
    }
    /**
     * 获取String参数
     */
    public static String getParameter(String name, String defaultValue)
    {
        return Convert.toStr(getRequest().getParameter(name), defaultValue);
    }
    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name)
    {
        return Convert.toInt(getRequest().getParameter(name));
    }
    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name, Integer defaultValue)
    {
        return Convert.toInt(getRequest().getParameter(name), defaultValue);
    }
    /**
     * 获取Boolean参数
     */
    public static Boolean getParameterToBool(String name)
    {
        return Convert.toBool(getRequest().getParameter(name));
    }
    /**
     * 获取Boolean参数
     */
    public static Boolean getParameterToBool(String name, Boolean defaultValue)
    {
        return Convert.toBool(getRequest().getParameter(name), defaultValue);
    }
    /**
     * 获得所有请求参数
     *
     * @param request 请求对象{@link ServletRequest}
     * @return Map
     */
    public static Map<String, String[]> getParams(ServletRequest request)
    {
        final Map<String, String[]> map = request.getParameterMap();
        return Collections.unmodifiableMap(map);
    }
    /**
     * 获得所有请求参数
     *
     * @param request 请求对象{@link ServletRequest}
     * @return Map
     */
    public static Map<String, String> getParamMap(ServletRequest request)
    {
        Map<String, String> params = new HashMap<>();
        for (Map.Entry<String, String[]> entry : getParams(request).entrySet())
        {
            params.put(entry.getKey(), StringUtils.join(entry.getValue(), ","));
        }
        return params;
    }
    /**
     * 获取request
     */
    public static HttpServletRequest getRequest()
    {
        try
        {
            return getRequestAttributes().getRequest();
        }
        catch (Exception e)
        {
            return null;
        }
    }
    /**
     * 获取response
     */
    public static HttpServletResponse getResponse()
    {
        try
        {
            return getRequestAttributes().getResponse();
        }
        catch (Exception e)
        {
            return null;
        }
    }
    /**
     * 获取session
     */
    public static HttpSession getSession()
    {
        return getRequest().getSession();
    }
    public static ServletRequestAttributes getRequestAttributes()
    {
        try
        {
            RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
            return (ServletRequestAttributes) attributes;
        }
        catch (Exception e)
        {
            return null;
        }
    }
    public static String getHeader(HttpServletRequest request, String name)
    {
        String value = request.getHeader(name);
        if (StringUtils.isEmpty(value))
        {
            return StringUtils.EMPTY;
        }
        return urlDecode(value);
    }
    public static Map<String, String> getHeaders(HttpServletRequest request)
    {
        Map<String, String> map = new LinkedCaseInsensitiveMap<>();
        Enumeration<String> enumeration = request.getHeaderNames();
        if (enumeration != null)
        {
            while (enumeration.hasMoreElements())
            {
                String key = enumeration.nextElement();
                String value = request.getHeader(key);
                map.put(key, value);
            }
        }
        return map;
    }
    /**
     * 将字符串渲染到客户端
     *
     * @param response 渲染对象
     * @param string 待渲染的字符串
     */
    public static void renderString(HttpServletResponse response, String string)
    {
        try
        {
            response.setStatus(200);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    /**
     * 是否是Ajax异步请求
     *
     * @param request
     */
    public static boolean isAjaxRequest(HttpServletRequest request)
    {
        String accept = request.getHeader("accept");
        if (accept != null && accept.contains("application/json"))
        {
            return true;
        }
        String xRequestedWith = request.getHeader("X-Requested-With");
        if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest"))
        {
            return true;
        }
        String uri = request.getRequestURI();
        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
        {
            return true;
        }
        String ajax = request.getParameter("__ajax");
        return StringUtils.inStringIgnoreCase(ajax, "json", "xml");
    }
    /**
     * 内容编码
     *
     * @param str 内容
     * @return 编码后的内容
     */
    public static String urlEncode(String str)
    {
        try
        {
            return URLEncoder.encode(str, Constants.UTF8);
        }
        catch (UnsupportedEncodingException e)
        {
            return StringUtils.EMPTY;
        }
    }
    /**
     * 内容解码
     *
     * @param str 内容
     * @return 解码后的内容
     */
    public static String urlDecode(String str)
    {
        try
        {
            return URLDecoder.decode(str, Constants.UTF8);
        }
        catch (UnsupportedEncodingException e)
        {
            return StringUtils.EMPTY;
        }
    }
    /**
     * 设置webflux模型响应
     *
     * @param response ServerHttpResponse
     * @param value 响应内容
     * @return Mono<Void>
     */
    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value)
    {
        return webFluxResponseWriter(response, HttpStatus.OK, value, R.FAIL);
    }
    /**
     * 设置webflux模型响应
     *
     * @param response ServerHttpResponse
     * @param code 响应状态码
     * @param value 响应内容
     * @return Mono<Void>
     */
    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value, int code)
    {
        return webFluxResponseWriter(response, HttpStatus.OK, value, code);
    }
    /**
     * 设置webflux模型响应
     *
     * @param response ServerHttpResponse
     * @param status http状态码
     * @param code 响应状态码
     * @param value 响应内容
     * @return Mono<Void>
     */
    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value, int code)
    {
        return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code);
    }
    /**
     * 设置webflux模型响应
     *
     * @param response ServerHttpResponse
     * @param contentType content-type
     * @param status http状态码
     * @param code 响应状态码
     * @param value 响应内容
     * @return Mono<Void>
     */
    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code)
    {
        response.setStatusCode(status);
        response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType);
        R<?> result = R.fail(code, value.toString());
        DataBuffer dataBuffer = response.bufferFactory().wrap(JSON.toJSONString(result).getBytes());
        return response.writeWith(Mono.just(dataBuffer));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/sange/util/TokenConstants.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.sange.util;
/**
 * Token的Key常量
 *
 * @author ruoyi
 */
public class TokenConstants
{
    /**
     * 令牌自定义标识
     */
    public static final String AUTHENTICATION = "Authorization";
    /**
     * 令牌前缀
     */
    public static final String PREFIX = "Bearer ";
    /**
     * 令牌秘钥
     */
    public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
    /**
     * 参数签名
     */
    public static final String SIGN = "sign";
    /**
     * 参数随机字符串
     */
    public static final String NONCE_STR = "nonce_str";
}
ruoyi-admin/src/main/java/com/ruoyi/sange/util/TokenService.java
New file
@@ -0,0 +1,82 @@
package com.ruoyi.sange.util;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.sange.domain.SystemUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
 * token验证处理
 *
 * @author ruoyi
 */
@Component
public class TokenService {
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 获取用户身份信息
     *
     * @return 用户信息
     */
    public SystemUser getLoginUser() {
        SystemUser loginUser = getLoginUser(ServletUtils.getRequest());
        if (loginUser == null) {
            throw new RuntimeException("令牌已过期,请重新登录!");
        }
        return loginUser;
    }
    /**
     * 获取用户身份信息
     *
     * @return 用户信息
     */
    public SystemUser getLoginUser(HttpServletRequest request) {
        // 获取请求携带的令牌
        String token = getToken(request);
        return getLoginUser(token);
    }
    /**
     * 获取用户身份信息
     *
     * @return 用户信息
     */
    public SystemUser getLoginUser(String token) {
        SystemUser user = null;
        try {
            if (StringUtils.isNotEmpty(token)) {
                String userkey = JwtUtils.getUserKey(token);
                user = (SystemUser) redisTemplate.opsForValue().get(userkey);
                return user;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return user;
    }
    public String getToken(HttpServletRequest request) {
        // 从header获取token标识
        String token = request.getHeader(TokenConstants.AUTHENTICATION);
        return replaceTokenPrefix(token);
    }
    /**
     * 裁剪token前缀
     */
    public String replaceTokenPrefix(String token) {
        // 如果前端设置了令牌前缀,则裁剪掉前缀
        if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) {
            token = token.replaceFirst(TokenConstants.PREFIX, "");
        }
        return token;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/sange/warpper/LoginVo.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.sange.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2025/2/18 22:33
 */
@Data
@ApiModel
public class LoginVo {
    @ApiModelProperty(value = "登录账号", required = true)
    private String phone;
    @ApiModelProperty(value = "登录密码", required = true)
    private String password;
}
ruoyi-admin/src/main/java/com/ruoyi/sange/warpper/TokenVo.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.sange.warpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2025/2/18 23:32
 */
@ApiModel
@Data
public class TokenVo {
    @ApiModelProperty("token")
    private String token;
    @ApiModelProperty("有效期(毫秒)")
    private Long expireTime;
}
ruoyi-admin/src/main/java/com/ruoyi/web/core/config/RedisConfig.java
New file
@@ -0,0 +1,33 @@
package com.ruoyi.web.core.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
/**
 * redis序列化配置
 */
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        //1.创建
        RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        //json序列化工具
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        //设置key的序列化
        //StringRedisSerializer UTF_8 = new StringRedisSerializer(StandardCharsets.UTF_8);
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        //设置值的value
        redisTemplate.setValueSerializer(serializer);
        redisTemplate.setHashKeySerializer(serializer);
        return redisTemplate;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysConfig.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysLogininfor.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysNotice.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysOperLog.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysOperLog.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysPost.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import javax.validation.constraints.*;
import org.apache.commons.lang3.builder.ToStringBuilder;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysRoleDept.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysRoleMenu.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysUserOnline.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import java.util.Date;
import org.apache.commons.lang3.builder.ToStringBuilder;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysUserPost.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
ruoyi-admin/src/main/java/com/ruoyi/web/domain/system/SysUserRole.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.domain;
package com.ruoyi.web.domain.system;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysConfigMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.ruoyi.system.domain.SysConfig;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysConfig;
/**
 * 参数配置 数据层
 * 
 * @author ruoyi
 */
public interface SysConfigMapper
public interface SysConfigMapper extends BaseMapper<SysConfig>
{
    /**
     * 查询参数配置信息
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysDeptMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.common.core.domain.entity.SysDept;
@@ -9,7 +11,7 @@
 * 
 * @author ruoyi
 */
public interface SysDeptMapper
public interface SysDeptMapper extends BaseMapper<SysDept>
{
    /**
     * 查询下级部门数量
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysDictDataMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.common.core.domain.entity.SysDictData;
@@ -9,7 +11,7 @@
 * 
 * @author ruoyi
 */
public interface SysDictDataMapper
public interface SysDictDataMapper extends BaseMapper<SysDictData>
{
    /**
     * 根据条件分页查询字典数据
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysDictTypeMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.domain.entity.SysDictType;
/**
@@ -8,7 +10,7 @@
 * 
 * @author ruoyi
 */
public interface SysDictTypeMapper
public interface SysDictTypeMapper extends BaseMapper<SysDictType>
{
    /**
     * 根据条件分页查询字典类型
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysLogininforMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysLogininfor;
import java.util.List;
import com.ruoyi.system.domain.SysLogininfor;
/**
 * 系统访问日志情况信息 数据层
 * 
 * @author ruoyi
 */
public interface SysLogininforMapper
public interface SysLogininforMapper extends BaseMapper<SysLogininfor>
{
    /**
     * 新增系统登录日志
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysMenuMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.common.core.domain.entity.SysMenu;
@@ -9,7 +11,7 @@
 * 
 * @author ruoyi
 */
public interface SysMenuMapper
public interface SysMenuMapper extends BaseMapper<SysMenu>
{
    /**
     * 查询系统所有菜单(含按钮)
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysNoticeMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.ruoyi.system.domain.SysNotice;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysNotice;
/**
 * 公告 数据层
 * 
 * @author ruoyi
 */
public interface SysNoticeMapper
public interface SysNoticeMapper extends BaseMapper<SysNotice>
{
    /**
     * 查询公告信息
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysOperLogMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysOperLog;
import java.util.List;
import com.ruoyi.system.domain.SysOperLog;
/**
 * 操作日志 数据层
 * 
 * @author ruoyi
 */
public interface SysOperLogMapper
public interface SysOperLogMapper extends BaseMapper<SysOperLog>
{
    /**
     * 新增操作日志
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysPostMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysPost;
import java.util.List;
import com.ruoyi.system.domain.SysPost;
/**
 * 岗位信息 数据层
 * 
 * @author ruoyi
 */
public interface SysPostMapper
public interface SysPostMapper extends BaseMapper<SysPost>
{
    /**
     * 查询岗位数据集合
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysRoleDeptMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysRoleDept;
import java.util.List;
import com.ruoyi.system.domain.SysRoleDept;
/**
 * 角色与部门关联表 数据层
 * 
 * @author ruoyi
 */
public interface SysRoleDeptMapper
public interface SysRoleDeptMapper extends BaseMapper<SysRoleDept>
{
    /**
     * 通过角色ID删除角色和部门关联
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysRoleMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.domain.entity.SysRole;
/**
@@ -8,7 +10,7 @@
 * 
 * @author ruoyi
 */
public interface SysRoleMapper
public interface SysRoleMapper extends BaseMapper<SysRole>
{
    /**
     * 根据条件分页查询角色数据
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysRoleMenuMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysRoleMenu;
import java.util.List;
import com.ruoyi.system.domain.SysRoleMenu;
/**
 * 角色与菜单关联表 数据层
 * 
 * @author ruoyi
 */
public interface SysRoleMenuMapper
public interface SysRoleMenuMapper extends BaseMapper<SysRoleMenu>
{
    /**
     * 通过角色ID删除角色和菜单关联
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysUserMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.domain.entity.SysUser;
/**
@@ -8,7 +10,7 @@
 * 
 * @author ruoyi
 */
public interface SysUserMapper
public interface SysUserMapper extends BaseMapper<SysUser>
{
    /**
     * 根据条件分页查询用户列表
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysUserOnlineMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserOnlineMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysUserOnline;
import java.util.List;
import com.ruoyi.system.domain.SysUserOnline;
/**
 * 在线用户 数据层
 * 
 * @author ruoyi
 */
public interface SysUserOnlineMapper
public interface SysUserOnlineMapper extends BaseMapper<SysUserOnline>
{
    /**
     * 通过会话序号查询信息
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysUserPostMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysUserPost;
import java.util.List;
import com.ruoyi.system.domain.SysUserPost;
/**
 * 用户与岗位关联表 数据层
 * 
 * @author ruoyi
 */
public interface SysUserPostMapper
public interface SysUserPostMapper extends BaseMapper<SysUserPost>
{
    /**
     * 通过用户ID删除用户和岗位关联
ruoyi-admin/src/main/java/com/ruoyi/web/mapper/system/SysUserRoleMapper.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java
@@ -1,15 +1,17 @@
package com.ruoyi.system.mapper;
package com.ruoyi.web.mapper.system;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.web.domain.system.SysUserRole;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.system.domain.SysUserRole;
/**
 * 用户与角色关联表 数据层
 * 
 * @author ruoyi
 */
public interface SysUserRoleMapper
public interface SysUserRoleMapper extends BaseMapper<SysUserRole>
{
    /**
     * 通过用户ID查询用户和角色关联
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysConfigServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java
@@ -1,7 +1,12 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.List;
import javax.annotation.PostConstruct;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.domain.system.SysConfig;
import com.ruoyi.web.mapper.system.SysConfigMapper;
import com.ruoyi.web.server.system.ISysConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.Constants;
@@ -10,9 +15,6 @@
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.CacheUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.service.ISysConfigService;
/**
 * 参数配置 服务层实现
@@ -20,7 +22,7 @@
 * @author ruoyi
 */
@Service
public class SysConfigServiceImpl implements ISysConfigService
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService
{
    @Autowired
    private SysConfigMapper configMapper;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysDeptServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
@@ -1,7 +1,11 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.ArrayList;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.mapper.system.SysDeptMapper;
import com.ruoyi.web.server.system.ISysDeptService;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -17,8 +21,6 @@
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.mapper.SysDeptMapper;
import com.ruoyi.system.service.ISysDeptService;
/**
 * 部门管理 服务实现
@@ -26,7 +28,7 @@
 * @author ruoyi
 */
@Service
public class SysDeptServiceImpl implements ISysDeptService
public class SysDeptServiceImpl extends ServiceImpl< SysDeptMapper,  SysDept> implements ISysDeptService
{
    @Autowired
    private SysDeptMapper deptMapper;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysDictDataServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
@@ -1,13 +1,15 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.mapper.system.SysDictDataMapper;
import com.ruoyi.web.server.system.ISysDictDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.service.ISysDictDataService;
/**
 * 字典 业务层处理
@@ -15,7 +17,7 @@
 * @author ruoyi
 */
@Service
public class SysDictDataServiceImpl implements ISysDictDataService
public class SysDictDataServiceImpl extends ServiceImpl<SysDictDataMapper, SysDictData> implements ISysDictDataService
{
    @Autowired
    private SysDictDataMapper dictDataMapper;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysDictTypeServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.ArrayList;
import java.util.Comparator;
@@ -6,6 +6,11 @@
import java.util.Map;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.mapper.system.SysDictDataMapper;
import com.ruoyi.web.mapper.system.SysDictTypeMapper;
import com.ruoyi.web.server.system.ISysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -17,9 +22,6 @@
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.mapper.SysDictTypeMapper;
import com.ruoyi.system.service.ISysDictTypeService;
/**
 * 字典 业务层处理
@@ -27,7 +29,7 @@
 * @author ruoyi
 */
@Service
public class SysDictTypeServiceImpl implements ISysDictTypeService
public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements ISysDictTypeService
{
    @Autowired
    private SysDictTypeMapper dictTypeMapper;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysLogininforServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java
@@ -1,12 +1,14 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.domain.system.SysLogininfor;
import com.ruoyi.web.mapper.system.SysLogininforMapper;
import com.ruoyi.web.server.system.ISysLogininforService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.mapper.SysLogininforMapper;
import com.ruoyi.system.service.ISysLogininforService;
/**
 * 系统访问日志情况信息 服务层处理
@@ -14,7 +16,7 @@
 * @author ruoyi
 */
@Service
public class SysLogininforServiceImpl implements ISysLogininforService
public class SysLogininforServiceImpl extends ServiceImpl<SysLogininforMapper, SysLogininfor> implements ISysLogininforService
{
    @Autowired
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysMenuServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
@@ -1,4 +1,4 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.text.MessageFormat;
import java.util.ArrayList;
@@ -9,6 +9,11 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.mapper.system.SysMenuMapper;
import com.ruoyi.web.mapper.system.SysRoleMenuMapper;
import com.ruoyi.web.server.system.ISysMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.UserConstants;
@@ -17,9 +22,6 @@
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.mapper.SysMenuMapper;
import com.ruoyi.system.mapper.SysRoleMenuMapper;
import com.ruoyi.system.service.ISysMenuService;
/**
 * 菜单 业务层处理
@@ -27,7 +29,7 @@
 * @author ruoyi
 */
@Service
public class SysMenuServiceImpl implements ISysMenuService
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements ISysMenuService
{
    public static final String PREMISSION_STRING = "perms[\"{0}\"]";
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysNoticeServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java
@@ -1,12 +1,14 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.domain.system.SysNotice;
import com.ruoyi.web.mapper.system.SysNoticeMapper;
import com.ruoyi.web.server.system.ISysNoticeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.mapper.SysNoticeMapper;
import com.ruoyi.system.service.ISysNoticeService;
/**
 * 公告 服务层实现
@@ -15,7 +17,7 @@
 * @date 2018-06-25
 */
@Service
public class SysNoticeServiceImpl implements ISysNoticeService
public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice> implements ISysNoticeService
{
    @Autowired
    private SysNoticeMapper noticeMapper;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysOperLogServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java
@@ -1,12 +1,14 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.domain.system.SysOperLog;
import com.ruoyi.web.mapper.system.SysOperLogMapper;
import com.ruoyi.web.server.system.ISysOperLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.mapper.SysOperLogMapper;
import com.ruoyi.system.service.ISysOperLogService;
/**
 * 操作日志 服务层处理
@@ -14,7 +16,7 @@
 * @author ruoyi
 */
@Service
public class SysOperLogServiceImpl implements ISysOperLogService
public class SysOperLogServiceImpl extends ServiceImpl<SysOperLogMapper, SysOperLog> implements ISysOperLogService
{
    @Autowired
    private SysOperLogMapper operLogMapper;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysPostServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java
@@ -1,16 +1,18 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.domain.system.SysPost;
import com.ruoyi.web.mapper.system.SysPostMapper;
import com.ruoyi.web.mapper.system.SysUserPostMapper;
import com.ruoyi.web.server.system.ISysPostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.mapper.SysPostMapper;
import com.ruoyi.system.mapper.SysUserPostMapper;
import com.ruoyi.system.service.ISysPostService;
/**
 * 岗位信息 服务层处理
@@ -18,7 +20,7 @@
 * @author ruoyi
 */
@Service
public class SysPostServiceImpl implements ISysPostService
public class SysPostServiceImpl extends ServiceImpl<SysPostMapper, SysPost> implements ISysPostService
{
    @Autowired
    private SysPostMapper postMapper;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysRoleServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -1,10 +1,18 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.domain.system.SysPost;
import com.ruoyi.web.domain.system.SysRoleDept;
import com.ruoyi.web.domain.system.SysRoleMenu;
import com.ruoyi.web.domain.system.SysUserRole;
import com.ruoyi.web.mapper.system.*;
import com.ruoyi.web.server.system.ISysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -17,14 +25,6 @@
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.SysRoleDept;
import com.ruoyi.system.domain.SysRoleMenu;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.mapper.SysRoleDeptMapper;
import com.ruoyi.system.mapper.SysRoleMapper;
import com.ruoyi.system.mapper.SysRoleMenuMapper;
import com.ruoyi.system.mapper.SysUserRoleMapper;
import com.ruoyi.system.service.ISysRoleService;
/**
 * 角色 业务层处理
@@ -32,7 +32,7 @@
 * @author ruoyi
 */
@Service
public class SysRoleServiceImpl implements ISysRoleService
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements ISysRoleService
{
    @Autowired
    private SysRoleMapper roleMapper;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysUserOnlineServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java
@@ -1,10 +1,15 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.io.Serializable;
import java.util.Date;
import java.util.Deque;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.web.domain.system.SysUserOnline;
import com.ruoyi.web.mapper.system.SysUserOnlineMapper;
import com.ruoyi.web.server.system.ISysUserOnlineService;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.ehcache.EhCacheManager;
import org.springframework.beans.factory.annotation.Autowired;
@@ -12,9 +17,6 @@
import com.ruoyi.common.constant.ShiroConstants;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.mapper.SysUserOnlineMapper;
import com.ruoyi.system.service.ISysUserOnlineService;
/**
 * 在线用户 服务层处理
@@ -22,7 +24,7 @@
 * @author ruoyi
 */
@Service
public class SysUserOnlineServiceImpl implements ISysUserOnlineService
public class SysUserOnlineServiceImpl extends ServiceImpl<SysUserOnlineMapper, SysUserOnline> implements ISysUserOnlineService
{
    @Autowired
    private SysUserOnlineMapper userOnlineDao;
ruoyi-admin/src/main/java/com/ruoyi/web/server/impl/system/SysUserServiceImpl.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -1,10 +1,19 @@
package com.ruoyi.system.service.impl;
package com.ruoyi.web.server.impl.system;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.web.domain.system.SysPost;
import com.ruoyi.web.domain.system.SysUserPost;
import com.ruoyi.web.domain.system.SysUserRole;
import com.ruoyi.web.mapper.system.*;
import com.ruoyi.web.server.system.ISysConfigService;
import com.ruoyi.web.server.system.ISysDeptService;
import com.ruoyi.web.server.system.ISysUserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,17 +33,6 @@
import com.ruoyi.common.utils.html.EscapeUtil;
import com.ruoyi.common.utils.security.Md5Utils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.domain.SysUserPost;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.mapper.SysPostMapper;
import com.ruoyi.system.mapper.SysRoleMapper;
import com.ruoyi.system.mapper.SysUserMapper;
import com.ruoyi.system.mapper.SysUserPostMapper;
import com.ruoyi.system.mapper.SysUserRoleMapper;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysUserService;
/**
 * 用户 业务层处理
@@ -42,7 +40,7 @@
 * @author ruoyi
 */
@Service
public class SysUserServiceImpl implements ISysUserService
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService
{
    private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysConfigService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.ruoyi.system.domain.SysConfig;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.web.domain.system.SysConfig;
/**
 * 参数配置 服务层
 * 
 * @author ruoyi
 */
public interface ISysConfigService
public interface ISysConfigService extends IService<SysConfig>
{
    /**
     * 查询参数配置信息
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysDeptService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
@@ -10,7 +12,7 @@
 * 
 * @author ruoyi
 */
public interface ISysDeptService
public interface ISysDeptService extends IService<SysDept>
{
    /**
     * 查询部门管理数据
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysDictDataService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.entity.SysDictData;
/**
@@ -8,7 +10,7 @@
 * 
 * @author ruoyi
 */
public interface ISysDictDataService
public interface ISysDictDataService extends IService<SysDictData>
{
    /**
     * 根据条件分页查询字典数据
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysDictTypeService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java
@@ -1,6 +1,8 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.core.domain.entity.SysDictType;
@@ -10,7 +12,7 @@
 * 
 * @author ruoyi
 */
public interface ISysDictTypeService
public interface ISysDictTypeService extends IService<SysDictType>
{
    /**
     * 根据条件分页查询字典类型
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysLogininforService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLogininforService.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.ruoyi.system.domain.SysLogininfor;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.web.domain.system.SysLogininfor;
/**
 * 系统访问日志情况信息 服务层
 * 
 * @author ruoyi
 */
public interface ISysLogininforService
public interface ISysLogininforService extends IService<SysLogininfor>
{
    /**
     * 新增系统登录日志
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysMenuService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java
@@ -1,8 +1,10 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.Ztree;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.entity.SysRole;
@@ -13,7 +15,7 @@
 * 
 * @author ruoyi
 */
public interface ISysMenuService
public interface ISysMenuService extends IService<SysMenu>
{
    /**
     * 根据用户ID查询菜单
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysNoticeService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.ruoyi.system.domain.SysNotice;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.web.domain.system.SysNotice;
/**
 * 公告 服务层
 * 
 * @author ruoyi
 */
public interface ISysNoticeService
public interface ISysNoticeService extends IService<SysNotice>
{
    /**
     * 查询公告信息
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysOperLogService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.ruoyi.system.domain.SysOperLog;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.web.domain.system.SysOperLog;
/**
 * 操作日志 服务层
 * 
 * @author ruoyi
 */
public interface ISysOperLogService
public interface ISysOperLogService extends IService<SysOperLog>
{
    /**
     * 新增操作日志
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysPostService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java
@@ -1,14 +1,16 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.ruoyi.system.domain.SysPost;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.web.domain.system.SysPost;
/**
 * 岗位信息 服务层
 * 
 * @author ruoyi
 */
public interface ISysPostService
public interface ISysPostService extends IService<SysPost>
{
    /**
     * 查询岗位信息集合
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysRoleService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
@@ -1,16 +1,18 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import java.util.Set;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.web.domain.system.SysUserRole;
/**
 * 角色业务层
 * 
 * @author ruoyi
 */
public interface ISysRoleService
public interface ISysRoleService extends IService<SysRole>
{
    /**
     * 根据条件分页查询角色数据
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysUserOnlineService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java
@@ -1,15 +1,17 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.web.domain.system.SysUserOnline;
import java.util.Date;
import java.util.List;
import com.ruoyi.system.domain.SysUserOnline;
/**
 * 在线用户 服务层
 * 
 * @author ruoyi
 */
public interface ISysUserOnlineService
public interface ISysUserOnlineService extends IService<SysUserOnline>
{
    /**
     * 通过会话序号查询信息
ruoyi-admin/src/main/java/com/ruoyi/web/server/system/ISysUserService.java
File was renamed from ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -1,15 +1,17 @@
package com.ruoyi.system.service;
package com.ruoyi.web.server.system;
import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.web.domain.system.SysUserRole;
/**
 * 用户 业务层
 * 
 * @author ruoyi
 */
public interface ISysUserService
public interface ISysUserService extends IService<SysUser>
{
    /**
     * 根据条件分页查询用户列表
ruoyi-admin/src/main/java/com/ruoyi/web/system/CommonController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.common;
package com.ruoyi.web.system;
import java.util.ArrayList;
import java.util.List;
@@ -139,7 +139,8 @@
     * 本地资源通用下载
     */
    @GetMapping("/download/resource")
    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) throws Exception
    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
            throws Exception
    {
        try
        {
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysCaptchaController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysCaptchaController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.awt.image.BufferedImage;
import java.io.IOException;
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysConfigController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -17,8 +17,8 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.web.domain.system.SysConfig;
import com.ruoyi.web.server.system.ISysConfigService;
/**
 * 参数配置 信息操作处理
@@ -68,7 +68,6 @@
    /**
     * 新增参数配置
     */
    @RequiresPermissions("system:config:add")
    @GetMapping("/add")
    public String add()
    {
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysDeptController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -19,7 +19,7 @@
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.web.server.system.ISysDeptService;
/**
 * 部门信息
@@ -54,7 +54,6 @@
    /**
     * 新增部门
     */
    @RequiresPermissions("system:dept:add")
    @GetMapping("/add/{parentId}")
    public String add(@PathVariable("parentId") Long parentId, ModelMap mmap)
    {
@@ -164,9 +163,9 @@
     * @param deptId 部门ID
     * @param excludeId 排除ID
     */
    @RequiresPermissions("system:dept:list")
    @GetMapping(value = { "/selectDeptTree/{deptId}", "/selectDeptTree/{deptId}/{excludeId}" })
    public String selectDeptTree(@PathVariable("deptId") Long deptId, @PathVariable(value = "excludeId", required = false) Long excludeId, ModelMap mmap)
    public String selectDeptTree(@PathVariable("deptId") Long deptId,
            @PathVariable(value = "excludeId", required = false) Long excludeId, ModelMap mmap)
    {
        mmap.put("dept", deptService.selectDeptById(deptId));
        mmap.put("excludeId", excludeId);
@@ -176,7 +175,6 @@
    /**
     * 加载部门列表树(排除下级)
     */
    @RequiresPermissions("system:dept:list")
    @GetMapping("/treeData/{excludeId}")
    @ResponseBody
    public List<Ztree> treeDataExcludeChild(@PathVariable(value = "excludeId", required = false) Long excludeId)
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysDictDataController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -18,7 +18,7 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictDataService;
import com.ruoyi.web.server.system.ISysDictDataService;
/**
 * 数据字典信息
@@ -65,7 +65,6 @@
    /**
     * 新增字典类型
     */
    @RequiresPermissions("system:dict:add")
    @GetMapping("/add/{dictType}")
    public String add(@PathVariable("dictType") String dictType, ModelMap mmap)
    {
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysDictTypeController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -19,7 +19,7 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDictTypeService;
import com.ruoyi.web.server.system.ISysDictTypeService;
/**
 * 数据字典信息
@@ -67,7 +67,6 @@
    /**
     * 新增字典类型
     */
    @RequiresPermissions("system:dict:add")
    @GetMapping("/add")
    public String add()
    {
@@ -168,7 +167,8 @@
     * 选择字典树
     */
    @GetMapping("/selectDictTree/{columnId}/{dictType}")
    public String selectDeptTree(@PathVariable("columnId") Long columnId, @PathVariable("dictType") String dictType, ModelMap mmap)
    public String selectDeptTree(@PathVariable("columnId") Long columnId, @PathVariable("dictType") String dictType,
            ModelMap mmap)
    {
        mmap.put("columnId", columnId);
        mmap.put("dict", dictTypeService.selectDictTypeByType(dictType));
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysIndexController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.Date;
import java.util.List;
@@ -23,8 +23,8 @@
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.web.server.system.ISysConfigService;
import com.ruoyi.web.server.system.ISysMenuService;
/**
 * 首页 业务处理
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysLoginController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysMenuController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -20,7 +20,7 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.framework.shiro.util.AuthorizationUtils;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.web.server.system.ISysMenuService;
/**
 * 菜单信息
@@ -77,7 +77,6 @@
    /**
     * 新增
     */
    @RequiresPermissions("system:menu:add")
    @GetMapping("/add/{parentId}")
    public String add(@PathVariable("parentId") Long parentId, ModelMap mmap)
    {
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysNoticeController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -16,8 +16,8 @@
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.service.ISysNoticeService;
import com.ruoyi.web.domain.system.SysNotice;
import com.ruoyi.web.server.system.ISysNoticeService;
/**
 * 公告 信息操作处理
@@ -56,7 +56,6 @@
    /**
     * 新增公告
     */
    @RequiresPermissions("system:notice:add")
    @GetMapping("/add")
    public String add()
    {
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysPostController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -17,8 +17,8 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.web.domain.system.SysPost;
import com.ruoyi.web.server.system.ISysPostService;
/**
 * 岗位信息操作处理
@@ -68,13 +68,19 @@
    @ResponseBody
    public AjaxResult remove(String ids)
    {
        try
        {
        return toAjax(postService.deletePostByIds(ids));
        }
        catch (Exception e)
        {
            return error(e.getMessage());
        }
    }
    /**
     * 新增岗位
     */
    @RequiresPermissions("system:post:add")
    @GetMapping("/add")
    public String add()
    {
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysProfileController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -23,7 +23,7 @@
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.server.system.ISysUserService;
/**
 * 个人信息 业务处理
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysRegisterController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@@ -10,7 +10,7 @@
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.shiro.service.SysRegisterService;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.web.server.system.ISysConfigService;
/**
 * 注册验证
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysRoleController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -21,10 +21,10 @@
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.shiro.util.AuthorizationUtils;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.domain.system.SysUserRole;
import com.ruoyi.web.server.system.ISysDeptService;
import com.ruoyi.web.server.system.ISysRoleService;
import com.ruoyi.web.server.system.ISysUserService;
/**
 * 角色信息
@@ -77,7 +77,6 @@
    /**
     * 新增角色
     */
    @RequiresPermissions("system:role:add")
    @GetMapping("/add")
    public String add()
    {
@@ -276,7 +275,6 @@
    /**
     * 选择用户
     */
    @RequiresPermissions("system:role:list")
    @GetMapping("/authUser/selectUser/{roleId}")
    public String selectUser(@PathVariable("roleId") Long roleId, ModelMap mmap)
    {
ruoyi-admin/src/main/java/com/ruoyi/web/system/SysUserController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.system;
package com.ruoyi.web.system;
import java.util.List;
import java.util.stream.Collectors;
@@ -30,10 +30,10 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.shiro.service.SysPasswordService;
import com.ruoyi.framework.shiro.util.AuthorizationUtils;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.server.system.ISysDeptService;
import com.ruoyi.web.server.system.ISysPostService;
import com.ruoyi.web.server.system.ISysRoleService;
import com.ruoyi.web.server.system.ISysUserService;
/**
 * 用户信息
@@ -113,7 +113,6 @@
    /**
     * 新增用户
     */
    @RequiresPermissions("system:user:add")
    @GetMapping("/add")
    public String add(ModelMap mmap)
    {
@@ -243,7 +242,6 @@
    /**
     * 进入授权角色页
     */
    @RequiresPermissions("system:user:edit")
    @GetMapping("/authRole/{userId}")
    public String authRole(@PathVariable("userId") Long userId, ModelMap mmap)
    {
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoDialogController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoDialogController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.demo.controller;
package com.ruoyi.web.system.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoFormController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoFormController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.demo.controller;
package com.ruoyi.web.system.demo.controller;
import java.util.ArrayList;
import java.util.List;
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoIconController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoIconController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.demo.controller;
package com.ruoyi.web.system.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoOperateController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoOperateController.java
@@ -1,9 +1,12 @@
package com.ruoyi.web.controller.demo.controller;
package com.ruoyi.web.system.demo.controller;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.ruoyi.web.system.demo.domain.CustomerModel;
import com.ruoyi.web.system.demo.domain.UserOperateModel;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
@@ -21,8 +24,6 @@
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.web.controller.demo.domain.CustomerModel;
import com.ruoyi.web.controller.demo.domain.UserOperateModel;
/**
 * 操作控制
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoReportController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoReportController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.demo.controller;
package com.ruoyi.web.system.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/controller/DemoTableController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/controller/DemoTableController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.demo.controller;
package com.ruoyi.web.system.demo.controller;
import java.util.ArrayList;
import java.util.Arrays;
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/domain/CustomerModel.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/CustomerModel.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.demo.domain;
package com.ruoyi.web.system.demo.domain;
import java.util.List;
import org.apache.commons.lang3.builder.ToStringBuilder;
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/domain/GoodsModel.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/GoodsModel.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.demo.domain;
package com.ruoyi.web.system.demo.domain;
import java.util.Date;
import org.apache.commons.lang3.builder.ToStringBuilder;
ruoyi-admin/src/main/java/com/ruoyi/web/system/demo/domain/UserOperateModel.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/demo/domain/UserOperateModel.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.demo.domain;
package com.ruoyi.web.system.demo.domain;
import java.util.Date;
import com.ruoyi.common.annotation.Excel;
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/CacheController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.monitor;
package com.ruoyi.web.system.monitor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/DruidController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/DruidController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.monitor;
package com.ruoyi.web.system.monitor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/ServerController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.monitor;
package com.ruoyi.web.system.monitor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/SysLogininforController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.monitor;
package com.ruoyi.web.system.monitor;
import java.util.List;
import com.ruoyi.framework.shiro.service.SysPasswordService;
@@ -15,8 +15,8 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysLogininfor;
import com.ruoyi.system.service.ISysLogininforService;
import com.ruoyi.web.domain.system.SysLogininfor;
import com.ruoyi.web.server.system.ISysLogininforService;
/**
 * 系统访问记录
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/SysOperlogController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.monitor;
package com.ruoyi.web.system.monitor;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -16,8 +16,8 @@
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.SysOperLog;
import com.ruoyi.system.service.ISysOperLogService;
import com.ruoyi.web.domain.system.SysOperLog;
import com.ruoyi.web.server.system.ISysOperLogService;
/**
 * 操作日志记录
ruoyi-admin/src/main/java/com/ruoyi/web/system/monitor/SysUserOnlineController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.monitor;
package com.ruoyi.web.system.monitor;
import java.util.List;
import org.apache.shiro.authz.annotation.Logical;
@@ -19,8 +19,8 @@
import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.framework.shiro.session.OnlineSession;
import com.ruoyi.framework.shiro.session.OnlineSessionDAO;
import com.ruoyi.system.domain.SysUserOnline;
import com.ruoyi.system.service.ISysUserOnlineService;
import com.ruoyi.web.domain.system.SysUserOnline;
import com.ruoyi.web.server.system.ISysUserOnlineService;
/**
 * 在线用户监控
ruoyi-admin/src/main/java/com/ruoyi/web/tool/BuildController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/BuildController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.tool;
package com.ruoyi.web.tool;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
ruoyi-admin/src/main/java/com/ruoyi/web/tool/CacheUtil.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.web.tool;
import java.util.*;
/**
 * 缓存工具类
 */
public class CacheUtil {
    public static Map<String, String> markets = new HashMap<>();
    public static Set<Integer> securitiesIds = new HashSet<>();
    public static Map<String, Thread> threads = new HashMap<>();
    public static boolean tradingDay = false;
}
ruoyi-admin/src/main/java/com/ruoyi/web/tool/IDModel.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.web.tool;
import lombok.Data;
/**
 * 分布式id模型
 */
@Data
public class IDModel {
    /**
     * 时针回拨变量(全域值)
     */
    int hourHandVariable;
    /**
     * 最大时针回拨变量
     */
    int maxHourHandVariable;
    /**
     * 自增长变量
     */
    int selfGrowth;
    /**
     * 最大自增长变量
     */
    int maxSelfGrowth;
    /**
     * 返回的唯一id
     */
    long id;
    public IDModel() {
    }
    public IDModel(int hourHandVariable, int maxHourHandVariable, int selfGrowth, int maxSelfGrowth) {
        this.hourHandVariable = hourHandVariable;
        this.maxHourHandVariable = maxHourHandVariable;
        this.selfGrowth = selfGrowth;
        this.maxSelfGrowth = maxSelfGrowth;
    }
    public IDModel setIDModel(int hourHandVariable, int maxHourHandVariable, int selfGrowth, int maxSelfGrowth, long id){
        this.setHourHandVariable(hourHandVariable);
        this.setMaxHourHandVariable(maxHourHandVariable);
        this.setSelfGrowth(selfGrowth);
        this.setMaxSelfGrowth(maxSelfGrowth);
        this.setId(id);
        return this;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/tool/IDUtil.java
New file
@@ -0,0 +1,102 @@
package com.ruoyi.web.tool;
/**
 * id生成器
 */
public class IDUtil {
    /**
     * 存储时间戳
     */
    private static long timestamp = System.currentTimeMillis();
    /**
     * 自增长值
     */
    private static int self = 0;
    /**
     * 最大自增长值
     */
    private static int max_self = 9999;
    /**
     * 设备号
     */
    private static int device = 0;
    /**
     * 时针回拨增长值
     */
    private static int hour_hand_variable = 0;
    /**
     * 时针回拨最大增长值
     */
    private static int max_hour_hand_variable = 999;
    /**
     * 时间戳id
     * @return
     */
    public static long timestamp_id(){
        return timestamp;
    }
    /**
     * 生成唯一ID
     * @return
     */
    public static long sole_id(){
        return sole_id(null);
    }
    /**
     * 唯一ID生成
     * @param workId    工作ID
     * @return
     */
    public synchronized static long sole_id(Integer workId){
        if(null != workId){
            device = workId;
        }
        long timeMillis = System.currentTimeMillis();
        /**
         * 时间戳相同
         * 自增长值使用完后,休眠等待时间戳更新
         */
        if(timeMillis == timestamp && self > max_self){
            try {
                Thread.sleep(1);
                self = 0;
                return sole_id(workId);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        //处理时针回拨的情况
        if(timeMillis < timestamp) {
            if (hour_hand_variable >= max_hour_hand_variable) {
                hour_hand_variable = 0;
            } else {
                hour_hand_variable++;
            }
        }
        //处理
        if(timeMillis > timestamp){
            timestamp = timeMillis;
            self = 0;
        }
        return splice();
    }
    /**
     * 拼接最终的id
     * @return
     */
    private static long splice(){
        //格式化自增长数据格式,前位补0
        String format = String.format("%04d", self);
        Long id = Long.valueOf(timestamp + "" + hour_hand_variable + "" + device + format);
        self++;
        return id;
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/tool/R.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.web.tool;
/**
 * 返回结果枚举接口
 * @param <T>
 */
public interface R<T> {
    /**
     * 状态码
     */
    Integer code = 200;
    /**
     * 返回结果说明
     */
    String msg = "";
    /**
     * 返回状态码
     * @return
     */
    Integer getCode();
    /**
     * 返回结果说明
     * @return
     */
    String getMsg();
}
ruoyi-admin/src/main/java/com/ruoyi/web/tool/RedisLock.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.web.tool;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
 * @author zhibing.pu
 * @Date 2024/9/26 18:43
 */
public class RedisLock {
    private RedisTemplate redisTemplate;
    private String lockKey;
    private int expireTime; // 锁的超时时间
    private int timeout; // 获取锁的超时时间
    public RedisLock(RedisTemplate redisTemplate, String lockKey, int expireTime, int timeout) {
        this.redisTemplate = redisTemplate;
        this.lockKey = lockKey;
        this.expireTime = expireTime;
        this.timeout = timeout;
    }
    public boolean lock() {
        String identifier = UUID.randomUUID().toString();
        long end = System.currentTimeMillis() + timeout;
        while (System.currentTimeMillis() < end) {
            if (redisTemplate.opsForValue().setIfAbsent(lockKey, identifier, expireTime, TimeUnit.SECONDS)) {
                return true;
            }
            // 可以使用延时来减少CPU占用
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
        return false;
    }
    public void unlock() {
        redisTemplate.delete(lockKey);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/tool/Result.java
New file
@@ -0,0 +1,127 @@
package com.ruoyi.web.tool;
import cn.hutool.json.JSONObject;
/**
 * 统一返回结果类
 * @param <T>
 */
public class Result<T> {
    /**
     * 状态码
     */
    private Integer code;
    /**
     * 返回说明
     */
    private String msg;
    /**
     * 返回结果
     */
    private T data;
    public Result() {
    }
    public Result(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public Integer getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
    public T getData() {
        return data;
    }
    /**
     * 成功
     * @param t
     * @return
     * @param <T>
     */
    public static  <T> Result<T> success(T t){
        return new Result(200, "成功", t);
    }
    /**
     * 返回
     * @return
     */
    public static Result success(){
        return new Result(200, "成功", new JSONObject());
    }
    /**
     * 提示信息
     * @param r
     * @param t
     * @return
     * @param <T>
     */
    public static <T> Result<T> tip(R r, T t){
        return new Result(r.getCode(), r.getMsg(), t);
    }
    /**
     * 提示信息
     * @param r
     * @return
     * @param <T>
     */
    public static <T> Result<T> tip(R r){
        return new Result(r.getCode(), r.getMsg(), new JSONObject());
    }
    /**
     * 失败
     * @return
     * @param <T>
     */
    public static <T> Result<T> fail(){
        return new Result(500, "失败", new JSONObject());
    }
    /**
     * 失败
     * @param t
     * @return
     * @param <T>
     */
    public static <T> Result<T> fail(T t){
        return new Result(500, "失败", t);
    }
    /**
     * 失败
     * @param r
     * @param t
     * @return
     * @param <T>
     */
    public static <T> Result<T> fail(R r, T t){
        return new Result(500, r.getMsg(), t);
    }
    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/tool/StringUtils.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.web.tool;
/**
 * 字符串工具类
 */
public class StringUtils {
    /**
     * 空字符串
     * @param str
     * @return
     */
    public static boolean isEmpty(String str){
        return null == str || "".equals(str);
    }
    /**
     * 非空字符串
     * @param str
     * @return
     */
    public static boolean isNotEmpty(String str){
        return !isEmpty(str);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/tool/SwaggerController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/SwaggerController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.tool;
package com.ruoyi.web.tool;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
ruoyi-admin/src/main/java/com/ruoyi/web/tool/TestController.java
File was renamed from ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java
@@ -1,4 +1,4 @@
package com.ruoyi.web.controller.tool;
package com.ruoyi.web.tool;
import java.util.ArrayList;
import java.util.LinkedHashMap;
ruoyi-admin/src/main/java/com/ruoyi/web/tool/UUIDUtil.java
New file
@@ -0,0 +1,97 @@
package com.ruoyi.web.tool;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
/**
 * 定义生成随机码的工具类
 */
public class UUIDUtil {
    /**
     * 定义生成原生的UUID随机码
     * @return
     */
    public static String getNativeUUID(){
        return UUID.randomUUID().toString();
    }
    /**
     * 生成32位随机码
     * @return
     */
    public static String getRandomCode(){
        return UUIDUtil.getNativeUUID().replaceAll("-", "");
    }
    /**
     * 获取给定长度的随机码
     * @param num
     * @return
     * @throws Exception
     */
    public static String getRandomCode(Integer num) throws Exception {
        String str = null;
        if(0 < num){
            if(num % 32 > 0){
                Integer s = num / 32;
                Integer l = num % 32;
                StringBuffer sb = new StringBuffer();
                for(int i = 0; i < s; i++){
                    sb.append(UUIDUtil.getRandomCode());
                }
                sb.append(UUIDUtil.getRandomCode().substring(0, l));
                str = sb.toString();
            }else if(num % 32 == 0){
                Integer s = num / 32;
                StringBuffer sb = new StringBuffer();
                for(int i = 0; i < s; i++){
                    sb.append(UUIDUtil.getRandomCode());
                }
                str = sb.toString();
            }else{
                str = UUIDUtil.getRandomCode().substring(0, num);
            }
        }else{
            throw new Exception("参数只能大于0");
        }
        return str;
    }
    /**
     * 获取根据当前时间的字符串数据
     * @return
     */
    public synchronized static String getTimeStr(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        return simpleDateFormat.format(new Date());
    }
    /**
    * @Description: 获取数字随机码
    * @Author pzb
    * @Date 2021/8/11 16:52
    * @Param
    * @Return
    * @Exception
    */
    public static String getNumberRandom(Integer num){
        if(null == num){
            num = 32;
        }
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < num; i++){
            sb.append(Double.valueOf(Math.random() * 10).intValue());
        }
        return sb.toString();
    }
}
ruoyi-admin/src/main/resources/application-druid.yml
@@ -6,7 +6,7 @@
        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://192.168.110.80:3306/sangeshenbian?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                url: jdbc:mysql://127.0.0.1:3306/sangeshenbian?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                username: root
                password: 123456
            # 从库数据源
ruoyi-admin/src/main/resources/application.yml
@@ -3,9 +3,9 @@
  # 名称
  name: RuoYi
  # 版本
  version: 4.8.0
  version: 4.7.9
  # 版权年份
  copyrightYear: 2025
  copyrightYear: 2024
  # 实例演示开关
  demoEnabled: true
  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
@@ -16,7 +16,7 @@
# 开发环境配置
server:
  # 服务器的HTTP端口,默认为80
  port: 80
  port: 3000
  servlet:
    # 应用的访问路径
    context-path: /
@@ -45,6 +45,11 @@
# Spring配置
spring:
  application:
    name: ruoyi
  # 循环依赖
  main:
    allow-circular-references: true
  # 模板引擎
  thymeleaf:
    mode: HTML
@@ -73,14 +78,12 @@
      # 热部署开关
      enabled: true
# MyBatis
mybatis:
  # 搜索指定包别名
  typeAliasesPackage: com.ruoyi.**.domain
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # 加载全局的配置文件
  configLocation: classpath:mybatis/mybatis-config.xml
mybatis-plus:
  type-aliases-package: com.ruoyi.**.domain
  mapper-locations: classpath*:mapper/**/**.xml
# PageHelper分页插件
pagehelper:
@@ -127,6 +130,7 @@
    # 是否开启记住我
    enabled: true
# 防止XSS攻击
xss:
  # 过滤开关
@@ -140,3 +144,18 @@
swagger:
  # 是否开启swagger
  enabled: true
## redis
---
spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: 123456
    jedis:
      pool:
        max-active: 20
        max-idle: 20
        max-wait: 60s
        min-idle: 5
ruoyi-admin/src/main/resources/mapper/sange/TestMapper.xml
File was deleted
ruoyi-admin/src/main/resources/mapper/system/SysConfigMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysConfigMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysConfigMapper">
    
    <resultMap type="SysConfig" id="SysConfigResult">
        <id     property="configId"      column="config_id"      />
ruoyi-admin/src/main/resources/mapper/system/SysDeptMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysDeptMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysDeptMapper">
    <resultMap type="SysDept" id="SysDeptResult">
        <id     property="deptId"     column="dept_id"     />
ruoyi-admin/src/main/resources/mapper/system/SysDictDataMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysDictDataMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysDictDataMapper">
    
    <resultMap type="SysDictData" id="SysDictDataResult">
        <id     property="dictCode"   column="dict_code"   />
ruoyi-admin/src/main/resources/mapper/system/SysDictTypeMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysDictTypeMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysDictTypeMapper">
    <resultMap type="SysDictType" id="SysDictTypeResult">
        <id     property="dictId"     column="dict_id"     />
ruoyi-admin/src/main/resources/mapper/system/SysLogininforMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysLogininforMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysLogininforMapper">
    <resultMap type="SysLogininfor" id="SysLogininforResult">
        <id     property="infoId"        column="info_id"           />
ruoyi-admin/src/main/resources/mapper/system/SysMenuMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysMenuMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysMenuMapper">
    <resultMap type="SysMenu" id="SysMenuResult">
        <id     property="menuId"         column="menu_id"        />
ruoyi-admin/src/main/resources/mapper/system/SysNoticeMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysNoticeMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysNoticeMapper">
    
    <resultMap type="SysNotice" id="SysNoticeResult">
        <result property="noticeId"       column="notice_id"       />
ruoyi-admin/src/main/resources/mapper/system/SysOperLogMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysOperLogMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysOperLogMapper">
    <resultMap type="SysOperLog" id="SysOperLogResult">
        <id     property="operId"         column="oper_id"        />
ruoyi-admin/src/main/resources/mapper/system/SysPostMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysPostMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysPostMapper">
    <resultMap type="SysPost" id="SysPostResult">
        <id     property="postId"        column="post_id"       />
ruoyi-admin/src/main/resources/mapper/system/SysRoleDeptMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysRoleDeptMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysRoleDeptMapper">
    <resultMap type="SysRoleDept" id="SysRoleDeptResult">
        <result property="roleId"     column="role_id"      />
ruoyi-admin/src/main/resources/mapper/system/SysRoleMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysRoleMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysRoleMapper">
    <resultMap type="SysRole" id="SysRoleResult">
        <id     property="roleId"       column="role_id"        />
ruoyi-admin/src/main/resources/mapper/system/SysRoleMenuMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysRoleMenuMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysRoleMenuMapper">
    <resultMap type="SysRoleMenu" id="SysRoleMenuResult">
        <result property="roleId"     column="role_id"      />
ruoyi-admin/src/main/resources/mapper/system/SysUserMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysUserMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysUserMapper">
    <resultMap type="SysUser" id="SysUserResult">
        <id     property="userId"        column="user_id"         />
ruoyi-admin/src/main/resources/mapper/system/SysUserOnlineMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysUserOnlineMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysUserOnlineMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysUserOnlineMapper">
    <resultMap type="SysUserOnline" id="SysUserOnlineResult">
        <id     property="sessionId"         column="sessionId"         />
ruoyi-admin/src/main/resources/mapper/system/SysUserPostMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysUserPostMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysUserPostMapper">
    <resultMap type="SysUserPost" id="SysUserPostResult">
        <result property="userId"     column="user_id"      />
ruoyi-admin/src/main/resources/mapper/system/SysUserRoleMapper.xml
File was renamed from ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml
@@ -2,7 +2,7 @@
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.system.mapper.SysUserRoleMapper">
<mapper namespace="com.ruoyi.web.mapper.system.SysUserRoleMapper">
    <resultMap type="SysUserRole" id="SysUserRoleResult">
        <result property="userId"     column="user_id"      />
ruoyi-admin/src/main/resources/static/ajax/libs/validate/jquery.validate.min.js
@@ -1,4 +1,4 @@
/*! jQuery Validation Plugin - v1.21.0 - 7/17/2024
/*! jQuery Validation Plugin - v1.19.3 - 1/9/2021
 * https://jqueryvalidation.org/
 * Copyright (c) 2024 Jörn Zaefferer; Licensed MIT */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,customElements:[],onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)});var f=[":text","[type='password']","[type='file']","select","textarea","[type='number']","[type='search']","[type='tel']","[type='url']","[type='email']","[type='datetime']","[type='date']","[type='month']","[type='week']","[type='time']","[type='datetime-local']","[type='range']","[type='color']","[type='radio']","[type='checkbox']","[contenteditable]","[type='button']"],g=["select","option","[type='radio']","[type='checkbox']"];a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",f.concat(this.settings.customElements).join(", "),b).on("click.validate",g.concat(this.settings.customElements).join(", "),b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={},d=["input","select","textarea","[contenteditable]"];return a(this.currentForm).find(d.concat(this.settings.customElements).join(", ")).not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);this.abortRequest(b),"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=".  Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?h.text(c||""):h.html(c||"")):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass),this.settings&&this.settings.escapeHtml?h.text(c||""):h.html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return void 0===a?"":a.replace(/([\\!"#$%&'()*+,./:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},elementAjaxPort:function(a){return"validate"+a.name},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()&&0===this.pendingRequest?(a(this.currentForm).trigger("submit"),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},abortRequest:function(b){var c;this.pending[b.name]&&(c=this.elementAjaxPort(b),a.ajaxAbort(c),this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass))},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a["date"===b?"dateISO":c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})+(?::(?:[^\]\[?\/<~#`!@$^&*()+=}|:";',>{ ]|%[0-9A-Fa-f]{2})*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:-?\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),null!==i.valid&&i.old===h?i.valid:(i.old=h,i.valid=null,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:this.elementAjaxPort(c),dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(b,c,e){var f=b.port;"abort"===b.mode&&(a.ajaxAbort(f),d[f]=e)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(a.ajaxAbort(f),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a.ajaxAbort=function(a){d[a]&&(d[a].abort(),delete d[a])},a});
 * Copyright (c) 2021 Jörn Zaefferer; Licensed MIT */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}});var b=function(a){return a.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")};a.extend(a.expr.pseudos||a.expr[":"],{blank:function(c){return!b(""+a(c).val())},filled:function(c){var d=a(c).val();return null!==d&&!!b(""+d)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=".  Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){if(a!==undefined){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")}},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(a,d){b[a]="function"==typeof d&&"normalizer"!==a?d(c):d}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var a;b[this]&&(Array.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(a=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(a[0]),Number(a[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u00a1-\uffff][a-z0-9\u00a1-\uffff_-]{0,62})?[a-z0-9\u00a1-\uffff]\.)+(?:[a-z\u00a1-\uffff]{2,}\.?))(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c},maxlength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d<=c},rangelength:function(a,b,c){var d=Array.isArray(a)?a.length:this.getLength(a,b);return this.optional(b)||d>=c[0]&&d<=c[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var c,d={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,c){var e=a.port;"abort"===a.mode&&(d[e]&&d[e].abort(),d[e]=c)}):(c=a.ajax,a.ajax=function(b){var e=("mode"in b?b:a.ajaxSettings).mode,f=("port"in b?b:a.ajaxSettings).port;return"abort"===e?(d[f]&&d[f].abort(),d[f]=c.apply(this,arguments),d[f]):c.apply(this,arguments)}),a});
ruoyi-admin/src/main/resources/static/css/style.css
@@ -3036,6 +3036,11 @@
    display: block;
}
.clear {
    display: block;
    overflow: hidden;
}
a {
    cursor: pointer;
}
ruoyi-admin/src/main/resources/static/css/style.min.css
@@ -1 +1 @@
h1,h2,h3,h4,h5,h6{font-weight:100}h1{font-size:30px}h2{font-size:24px}h3{font-size:16px}h4{font-size:14px}h5{font-size:12px}h6{font-size:10px}h3,h4,h5{margin-top:5px;font-weight:600}a:focus{outline:0}.nav>li>a{color:#a7b1c2;font-weight:600;padding:14px 20px 14px 25px}.nav li>a{display:block}.nav.navbar-right>li>a,.nav.navbar-left>li>a{color:#fff;font-size:14px;height:50px;padding:15px 15px}.nav>li.active>a{color:#fff}.nav.navbar-right>li>a>.label,.nav.navbar-left>li>a>.label{position:absolute;top:9px;right:5px;text-align:center;font-size:9px;padding:2px 4px;line-height:.9}.nav.navbar-right>li>a:hover,.nav.navbar-left>li>a:hover{background-color:#367fa9;color:#fff}.navbar-default .nav>li>a:hover,.navbar-default .nav>li>a:focus{background-color:#293846;color:white}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background:#fff}.navbar{border:0}.navbar-default{background-color:transparent;border-color:#2f4050;position:relative}.nav.navbar-top-links li{display:inline-block}.navbar-top-links li:last-child{margin-right:16px}body.body-small .navbar-top-links li:last-child{margin-right:10px}.navbar-top-links li a{padding:20px 10px;min-height:50px}.dropdown-menu{border:medium none;display:none;float:left;font-size:12px;left:0;list-style:none outside none;padding:0;position:absolute;text-shadow:none;top:100%;z-index:1000;border-radius:0;box-shadow:0 0 3px rgba(86,96,117,0.3)}.dropdown-menu>li>a{border-radius:3px;color:inherit;line-height:25px;margin:4px;text-align:left;font-weight:normal}.dropdown-menu>li>a.font-bold{font-weight:600}.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{width:310px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.dropdown-messages,.dropdown-alerts{padding:10px 10px 10px 10px}.dropdown-messages li a,.dropdown-alerts li a{font-size:12px}.dropdown-messages li em,.dropdown-alerts li em{font-size:10px}.nav.navbar-top-links .dropdown-alerts a{font-size:12px}.nav>li.active{border-left:4px solid #19aa8d;background:#293846}.nav.nav-second-level>li.active{border:0}.nav.nav-second-level.collapse[style]{height:auto!important}.nav-header a{color:#dfe4ed}.nav-header .text-muted{color:#8095a8}.minimalize-styl-2{padding:4px 12px;margin:12px 5px 5px 15px;font-size:14px;float:left}.navbar-form-custom{float:left;height:50px;padding:0;width:200px;display:inline-table}.navbar-form-custom .form-group{margin-bottom:0}.nav.navbar-top-links a{font-size:14px}.navbar-form-custom .form-control{background:none repeat scroll 0 0 rgba(0,0,0,0);border:medium none;font-size:14px;height:60px;margin:0;z-index:2000}.count-info .label{line-height:12px;padding:1px 5px;position:absolute;right:6px;top:12px}.arrow{float:right;margin-top:2px}.fa.arrow:before{content:"\f104"}.active>a>.fa.arrow:before{content:"\f107"}.nav-second-level li,.nav-third-level li{border-bottom:none!important;padding-left:2px;padding-right:2px}.nav-second-level li a{padding:7px 15px 7px 10px;padding-left:52px}.nav-third-level li a{padding-left:70px}.nav-second-level li:last-child{margin-bottom:10px}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover>.nav-second-level,.mini-navbar .nav li:focus>.nav-second-level{display:block;border-radius:0 2px 2px 0;min-width:140px;height:auto}body.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:12px;border-radius:0 2px 2px 0}body.mini-navbar .navbar-default .nav>li>.nav-third-level li a{padding-left:31px}.fixed-nav .slimScrollDiv #side-menu{padding-bottom:60px;position:relative}.fixed-sidebar.mini-navbar .slimScrollDiv>*{overflow:visible!important}.fixed-sidebar .slimScrollDiv>*{overflow-y:hidden;overflow-x:visible}.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.canvas-menu.mini-navbar .nav-second-level{background:#293846}.mini-navbar li.active .nav-second-level{left:65px}.navbar-default .special_link a{background:#1ab394;color:white}.navbar-default .special_link a:hover{background:#17987e!important;color:white}.navbar-default .special_link a span.label{background:#fff;color:#1ab394}.navbar-default .landing_link a{background:#1cc09f;color:white}.navbar-default .landing_link a:hover{background:#1ab394!important;color:white}.navbar-default .landing_link a span.label{background:#fff;color:#1cc09f}.logo-element{text-align:center;font-size:18px;font-weight:600;color:white;display:none;padding:18px 0}.navbar-fixed-top{background:#fff;-webkit-transition-duration:.5s;transition-duration:.5s;z-index:2030}.fixed-nav #wrapper{padding-top:60px;box-sizing:border-box}.fixed-nav .minimalize-styl-2{margin:14px 5px 5px 15px}.body-small .navbar-fixed-top{margin-left:0}body.mini-navbar .navbar-static-side{width:70px}body.mini-navbar .profile-element,body.mini-navbar .nav-label,body.mini-navbar .navbar-default .nav li a span{display:none}body.canvas-menu .profile-element{display:block}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level{display:none}body.mini-navbar .navbar-default .nav>li>a{font-size:16px}body.mini-navbar .logo-element{display:block}body.canvas-menu .logo-element{display:none}body.mini-navbar .nav-header{padding:0;background-color:#1ab394}body.canvas-menu .nav-header{padding:33px 25px}body.mini-navbar #page-wrapper{margin:0 0 0 70px}body.canvas-menu.mini-navbar #page-wrapper,body.canvas-menu.mini-navbar .footer{margin:0}body.fixed-sidebar .navbar-static-side,body.canvas-menu .navbar-static-side{position:fixed;width:200px;z-index:2001;height:100%}body.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}body.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 70px}body.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 70px}body.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}.fixed-sidebar.mini-navbar .nav li>.nav-second-level{display:none}.fixed-sidebar.mini-navbar .nav li.active{border-left-width:0}.fixed-sidebar.mini-navbar .nav li:hover>a>span.nav-label{top:0;padding:10px 10px 10px 10px;text-align:center;background-color:#243747}.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level{top:40px;font-size:12px;background-color:#2f4050}.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level,.fixed-sidebar.mini-navbar .nav li:hover>a>span.nav-label{position:absolute;left:70px;display:block;min-width:140px;border-radius:2px}.fixed-sidebar.mini-navbar .nav li.active:hover>.nav-second-level,.fixed-sidebar.mini-navbar .nav li.active:hover>a>span.nav-label{left:67px}.fixed-sidebar.mini-navbar .nav .nav-second-level a>span,.fixed-sidebar.mini-navbar .nav .nav-third-level a>span{display:inline-block}body.fixed-sidebar.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:12px;border-radius:3px}body.canvas-menu.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:13px;border-radius:3px}.fixed-sidebar.mini-navbar .nav-second-level li a,.canvas-menu.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.fixed-sidebar.mini-navbar .nav-second-level,.canvas-menu.mini-navbar .nav-second-level{position:relative;padding:0;font-size:13px}.fixed-sidebar.mini-navbar li.active .nav-second-level,.canvas-menu.mini-navbar li.active .nav-second-level{left:0}body.canvas-menu nav.navbar-static-side{z-index:2001;background:#2f4050;height:100%;position:fixed;display:none}body.canvas-menu.mini-navbar nav.navbar-static-side{display:block;width:70px}.top-navigation #page-wrapper{margin-left:0}.top-navigation .navbar-nav .dropdown-menu>.active>a{background:white;color:#1ab394;font-weight:bold}.white-bg .navbar-fixed-top,.white-bg .navbar-static-top{background:#fff}.top-navigation .navbar{margin-bottom:0}.top-navigation .nav>li>a{padding:15px 20px;color:#676a6c}.top-navigation .nav>li a:hover,.top-navigation .nav>li a:focus{background:#fff;color:#1ab394}.top-navigation .nav>li.active{background:#fff;border:0}.top-navigation .nav>li.active>a{color:#1ab394}.top-navigation .navbar-right{padding-right:10px}.top-navigation .navbar-nav .dropdown-menu{box-shadow:none;border:1px solid #e7eaec}.top-navigation .dropdown-menu>li>a{margin:0;padding:7px 20px}.navbar .dropdown-menu{margin-top:0}.top-navigation .navbar-brand{background:#1ab394;color:#fff;padding:15px 25px}.top-navigation .navbar-top-links li:last-child{margin-right:0}.top-navigation.mini-navbar #page-wrapper,.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,.mini-navbar .top-navigation #page-wrapper,.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,.canvas-menu #page-wrapper{margin:0}.top-navigation.fixed-nav #wrapper,.fixed-nav #wrapper.top-navigation{margin-top:50px}.top-navigation .footer.fixed{margin-left:0!important}.top-navigation .wrapper.wrapper-content{padding:40px}.top-navigation.body-small .wrapper.wrapper-content,.body-small .top-navigation .wrapper.wrapper-content{padding:40px 0 40px 0}.navbar-toggle{background-color:#1ab394;color:#fff;padding:6px 12px;font-size:14px}.top-navigation .navbar-nav .open .dropdown-menu>li>a,.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header{padding:10px 15px 10px 20px}@media(max-width :768px){.top-navigation .navbar-header{display:block;float:none}}.menu-visible-lg,.menu-visible-md{display:none!important}@media(min-width :1200px){.menu-visible-lg{display:block!important}}@media(min-width :992px){.menu-visible-md{display:block!important}}@media(max-width :767px){.menu-visible-md{display:block!important}.menu-visible-lg{display:block!important}}.btn{border-radius:3px}.float-e-margins .btn{margin-bottom:5px}.btn-w-m{min-width:120px}.btn-primary.btn-outline{color:#1ab394}.btn-success.btn-outline{color:#1c84c6}.btn-info.btn-outline{color:#23c6c8}.btn-warning.btn-outline{color:#f8ac59}.btn-danger.btn-outline{color:#ed5565}.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-info.btn-outline:hover,.btn-warning.btn-outline:hover,.btn-danger.btn-outline:hover{color:#fff}.btn-primary{background-color:#1ab394;border-color:#1ab394;color:#fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-color:#18a689;border-color:#18a689;color:#fff}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary.active[disabled],fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#1dc5a3;border-color:#1dc5a3}.btn-success{background-color:#1c84c6;border-color:#1c84c6;color:#fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-color:#1a7bb9!important;border-color:#1a7bb9!important;color:#fff}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled]:active,.btn-success.active[disabled],fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:#1f90d8;border-color:#1f90d8}.btn-info{background-color:#23c6c8;border-color:#23c6c8;color:#fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-color:#21b9bb;border-color:#21b9bb;color:#fff}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info.active[disabled],fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#26d7d9;border-color:#26d7d9}.btn-default{background-color:#f4f4f4;border-color:#ddd;color:#444}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#e7e7e7;border-color:#e7e7e7;color:#444}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default.active[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:#ccc;border-color:#ccc}.btn-warning{background-color:#f8ac59;border-color:#f8ac59;color:#fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-color:#f7a54a;border-color:#f7a54a;color:#fff}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning.active[disabled],fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#f9b66d;border-color:#f9b66d}.btn-danger{background-color:#ed5565;border-color:#ed5565;color:#fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:#ec4758;border-color:#ec4758;color:#fff}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger.active[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#ef6776;border-color:#ef6776}.btn-link{color:inherit}.btn-link:hover,.btn-link:focus,.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{color:#1ab394;text-decoration:none}.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{background-image:none}.btn-link.disabled,.btn-link.disabled:hover,.btn-link.disabled:focus,.btn-link.disabled:active,.btn-link.disabled.active,.btn-link[disabled],.btn-link[disabled]:hover,.btn-link[disabled]:focus,.btn-link[disabled]:active,.btn-link.active[disabled],fieldset[disabled] .btn-link,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:active,fieldset[disabled] .btn-link.active{color:#cacaca}.btn-white{color:inherit;background:white;border:1px solid #e7eaec}.btn-white:hover,.btn-white:focus,.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{color:inherit;border:1px solid #d2d2d2}.btn-white:active,.btn-white.active{box-shadow:0 2px 5px rgba(0,0,0,0.15) inset}.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{background-image:none}.btn-white.disabled,.btn-white.disabled:hover,.btn-white.disabled:focus,.btn-white.disabled:active,.btn-white.disabled.active,.btn-white[disabled],.btn-white[disabled]:hover,.btn-white[disabled]:focus,.btn-white[disabled]:active,.btn-white.active[disabled],fieldset[disabled] .btn-white,fieldset[disabled] .btn-white:hover,fieldset[disabled] .btn-white:focus,fieldset[disabled] .btn-white:active,fieldset[disabled] .btn-white.active{color:#cacaca}.form-control,.has-error .form-control:focus,.has-success .form-control:focus,.has-warning .form-control:focus,.navbar-collapse,.navbar-form,.navbar-form-custom .form-control:focus,.navbar-form-custom .form-control:hover,.open .btn.dropdown-toggle,.panel,.popover,.progress,.progress-bar{box-shadow:none}.btn-outline{color:inherit;background-color:transparent;-webkit-transition:all .5s;transition:all .5s}.btn-rounded{border-radius:50px}.btn-large-dim{width:90px;height:90px;font-size:42px}button.dim{display:inline-block;color:#fff;text-decoration:none;text-transform:uppercase;text-align:center;padding-top:6px;margin-right:10px;position:relative;cursor:pointer;border-radius:5px;font-weight:600;margin-bottom:20px!important}button.dim:active{top:3px}button.btn-primary.dim{box-shadow:inset 0 0 0 #16987e,0px 5px 0 0 #16987e,0px 10px 5px #999}button.btn-primary.dim:active{box-shadow:inset 0 0 0 #16987e,0px 2px 0 0 #16987e,0px 5px 3px #999}button.btn-default.dim{box-shadow:inset 0 0 0 #b3b3b3,0px 5px 0 0 #b3b3b3,0px 10px 5px #999}button.btn-default.dim:active{box-shadow:inset 0 0 0 #b3b3b3,0px 2px 0 0 #b3b3b3,0px 5px 3px #999}button.btn-warning.dim{box-shadow:inset 0 0 0 #f79d3c,0px 5px 0 0 #f79d3c,0px 10px 5px #999}button.btn-warning.dim:active{box-shadow:inset 0 0 0 #f79d3c,0px 2px 0 0 #f79d3c,0px 5px 3px #999}button.btn-info.dim{box-shadow:inset 0 0 0 #1eacae,0px 5px 0 0 #1eacae,0px 10px 5px #999}button.btn-info.dim:active{box-shadow:inset 0 0 0 #1eacae,0px 2px 0 0 #1eacae,0px 5px 3px #999}button.btn-success.dim{box-shadow:inset 0 0 0 #1872ab,0px 5px 0 0 #1872ab,0px 10px 5px #999}button.btn-success.dim:active{box-shadow:inset 0 0 0 #1872ab,0px 2px 0 0 #1872ab,0px 5px 3px #999}button.btn-danger.dim{box-shadow:inset 0 0 0 #ea394c,0px 5px 0 0 #ea394c,0px 10px 5px #999}button.btn-danger.dim:active{box-shadow:inset 0 0 0 #ea394c,0px 2px 0 0 #ea394c,0px 5px 3px #999}button.dim:before{font-size:50px;line-height:1em;font-weight:normal;color:#fff;display:block;padding-top:10px}button.dim:active:before{top:7px;font-size:50px}.label{background-color:#d1dade;color:#5e5e5e;font-size:10px;font-weight:600;padding:3px 8px;text-shadow:none}.badge{background-color:#d1dade;color:#5e5e5e;font-size:11px;font-weight:600;padding-bottom:4px;padding-left:6px;padding-right:6px;text-shadow:none}.label-primary,.badge-primary{background-color:#1ab394;color:#fff}.label-success,.badge-success{background-color:#1c84c6;color:#fff}.label-warning,.badge-warning{background-color:#f8ac59;color:#fff}.label-warning-light,.badge-warning-light{background-color:#f8ac59;color:#fff}.label-danger,.badge-danger{background-color:#ed5565;color:#fff}.label-info,.badge-info{background-color:#23c6c8;color:#fff}.label-inverse,.badge-inverse{background-color:#262626;color:#fff}.label-white,.badge-white{background-color:#fff;color:#5e5e5e}.label-white,.badge-disable{background-color:#2a2e36;color:#8b91a0}.onoffswitch{position:relative;width:64px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:2px}.onoffswitch-inner{width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:20px;padding:0;line-height:20px;font-size:12px;color:white;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:"ON";padding-left:10px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:"OFF";padding-right:10px;background-color:#fff;color:#999;text-align:right}.onoffswitch-switch{width:20px;margin:0;background:#fff;border:2px solid #1ab394;border-radius:2px;position:absolute;top:0;bottom:0;right:44px;-webkit-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.chosen-container-single .chosen-single{background:#fff;box-shadow:none;-moz-box-sizing:border-box;background-color:#fff;border:1px solid #cbd5dd;border-radius:2px;cursor:text;height:auto!important;margin:0;min-height:30px;overflow:hidden;padding:4px 12px;position:relative;width:100%}.chosen-container-multi .chosen-choices li.search-choice{background:#f1f1f1;border:1px solid #ededed;border-radius:2px;box-shadow:none;color:#333;cursor:default;line-height:13px;margin:3px 0 3px 5px;padding:3px 20px 3px 5px;position:relative}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{background-color:#f4f4f4;border-color:#ddd;color:inherit;cursor:default;z-index:2}.pagination>li>a,.pagination>li>span{background-color:#fff;border:1px solid #ddd;color:inherit;float:left;line-height:1.42857;margin-left:-1px;padding:4px 10px;position:relative;text-decoration:none}.tooltip-inner{background-color:#2f4050;word-break:break-all;overflow-wrap:break-word}.tooltip.top .tooltip-arrow{border-top-color:#2f4050}.tooltip.right .tooltip-arrow{border-right-color:#2f4050}.tooltip.bottom .tooltip-arrow{border-bottom-color:#2f4050}.tooltip.left .tooltip-arrow{border-left-color:#2f4050}.easypiechart{position:relative;text-align:center}.easypiechart .h2{margin-left:10px;margin-top:10px;display:inline-block}.easypiechart canvas{top:0;left:0}.easypiechart .easypie-text{line-height:1;position:absolute;top:33px;width:100%;z-index:1}.easypiechart img{margin-top:-4px}.jqstooltip{box-sizing:content-box}.fc-state-default{background-color:#fff;background-image:none;background-repeat:repeat-x;box-shadow:none;color:#333;text-shadow:none}.fc-state-default{border:1px solid}.fc-button{color:inherit;border:1px solid #e7eaec;cursor:pointer;display:inline-block;height:1.9em;line-height:1.9em;overflow:hidden;padding:0 .6em;position:relative;white-space:nowrap}.fc-state-active{background-color:#1ab394;border-color:#1ab394;color:#fff}.fc-header-title h2{font-size:16px;font-weight:600;color:inherit}.fc-content .fc-widget-header,.fc-content .fc-widget-content{border-color:#e7eaec;font-weight:normal}.fc-border-separate tbody{background-color:#f8f8f8}.fc-state-highlight{background:none repeat scroll 0 0 #fcf8e3}.external-event{padding:5px 10px;border-radius:2px;cursor:pointer;margin-bottom:5px}.fc-ltr .fc-event-hori.fc-event-end,.fc-rtl .fc-event-hori.fc-event-start{border-radius:2px}.fc-event,.fc-agenda .fc-event-time,.fc-event a{padding:4px 6px;background-color:#1ab394;border-color:#1ab394}.fc-event-time,.fc-event-title{color:#717171;padding:0 1px}.ui-calendar .fc-event-time,.ui-calendar .fc-event-title{color:#fff}.chat-activity-list .chat-element{border-bottom:1px solid #e7eaec}.chat-element:first-child{margin-top:0}.chat-element{padding-bottom:15px}.chat-element,.chat-element .media{margin-top:15px}.chat-element,.media-body{overflow:hidden}.media-body{display:block;width:auto}.chat-element>.pull-left{margin-right:10px}.chat-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.chat-element .well{border:1px solid #e7eaec;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.chat-element .actions{margin-top:10px}.chat-element .photos{margin:10px 0}.right.chat-element>.pull-right{margin-left:10px}.chat-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.chat{margin:0;padding:0;list-style:none}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #b3a9a9}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0;color:#777}.panel .slidedown .glyphicon,.chat .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{background-color:#1ab394;border-color:#1ab394;color:#fff;z-index:2}.list-group-item-heading{margin-top:10px}.list-group-item-text{margin:0 0 10px;color:inherit;font-size:12px;line-height:inherit}.no-padding .list-group-item{border-left:none;border-right:0;border-bottom:0}.no-padding .list-group-item:first-child{border-left:none;border-right:0;border-bottom:0;border-top:0}.no-padding .list-group{margin-bottom:0}.list-group-item{background-color:inherit;border:1px solid #e7eaec;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.elements-list .list-group-item{border-left:none;border-right:0;padding:15px 25px}.elements-list .list-group-item:first-child{border-left:none;border-right:0;border-top:none!important}.elements-list .list-group{margin-bottom:0}.elements-list a{color:inherit}.elements-list .list-group-item.active,.elements-list .list-group-item:hover{background:#f3f3f4;color:inherit;border-color:#e7eaec;border-radius:0}.elements-list li.active{-webkit-transition:none;transition:none}.element-detail-box{padding:25px}.flot-chart{display:block;height:200px}.widget .flot-chart.dashboard-chart{display:block;height:120px;margin-top:40px}.flot-chart.dashboard-chart{display:block;height:180px;margin-top:40px}.flot-chart-content{width:100%;height:100%}.flot-chart-pie-content{width:200px;height:200px;margin:auto}.jqstooltip{position:absolute;display:block;left:0;top:0;visibility:hidden;background:#2b303a;background-color:rgba(43,48,58,0.8);color:white;text-align:left;white-space:nowrap;z-index:10000;padding:5px 5px 5px 5px;min-height:22px;border-radius:3px}.jqsfield{color:white;text-align:left}.h-200{min-height:200px}.legendLabel{padding-left:5px}.stat-list li:first-child{margin-top:0}.stat-list{list-style:none;padding:0;margin:0}.stat-percent{float:right}.stat-list li{margin-top:15px;position:relative}table.dataTable thead .sorting,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background:transparent}table.dataTable thead .sorting_asc:after{float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:"\f0dd";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:"\f0dc";float:right;font-family:fontawesome;color:rgba(50,50,50,0.5)}.dataTables_wrapper{padding-bottom:30px}.img-circle{border-radius:50%}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.428571429}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^="col-"]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee!important}.show-grid{margin:15px 0}.css-animation-box h1{font-size:44px}.animation-efect-links a{padding:4px 6px;font-size:12px}#animation_box{background-color:#f9f8f8;border-radius:16px;width:80%;margin:0 auto;padding-top:80px}.animation-text-box{position:absolute;margin-top:40px;left:50%;margin-left:-100px;width:200px}.animation-text-info{position:absolute;margin-top:-60px;left:50%;margin-left:-100px;width:200px;font-size:10px}.animation-text-box h2{font-size:54px;font-weight:600;margin-bottom:5px}.animation-text-box p{font-size:12px;text-transform:uppercase}.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#1ab394;position:fixed;z-index:2000;top:0;width:100%;height:2px}.pace-inactive{display:none}.widget{border-radius:5px;padding:15px 20px;margin-bottom:10px;margin-top:10px}.widget.style1 h2{font-size:30px}.widget h2,.widget h3{margin-top:5px;margin-bottom:0}.widget-text-box{padding:20px;border:1px solid #e7eaec;background:#fff}.widget-head-color-box{border-radius:5px 5px 0 0;margin-top:10px}.widget .flot-chart{height:100px}.vertical-align div{display:inline-block;vertical-align:middle}.vertical-align h2,.vertical-align h3{margin:0}.todo-list{list-style:none outside none;margin:0;padding:0;font-size:14px}.todo-list.small-list{font-size:12px}.todo-list.small-list>li{background:#f3f3f4;border-left:none;border-right:0;border-radius:4px;color:inherit;margin-bottom:2px;padding:6px 6px 6px 12px}.todo-list.small-list .btn-xs,.todo-list.small-list .btn-group-xs>.btn{border-radius:5px;font-size:10px;line-height:1.5;padding:1px 2px 1px 5px}.todo-list>li{background:#f3f3f4;border-left:6px solid #e7eaec;border-right:6px solid #e7eaec;border-radius:4px;color:inherit;margin-bottom:2px;padding:10px}.todo-list .handle{cursor:move;display:inline-block;font-size:16px;margin:0 5px}.todo-list>li .label{font-size:9px;margin-left:10px}.check-link{font-size:16px}.todo-completed{text-decoration:line-through}.geo-statistic h1{font-size:36px;margin-bottom:0}.glyphicon.fa{font-family:"FontAwesome"}.inline{display:inline-block!important}.input-s-sm{width:120px}.input-s{width:200px}.input-s-lg{width:250px}.i-checks{padding-left:0}.form-control,.single-line{background:#fff none;border:1px solid #e5e6e7;border-radius:4px;color:inherit;display:block;padding:3px 6px 4px;-webkit-transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;width:100%;height:31px;font-size:14px}.form-control.kv-fileinput-caption{height:34px!important}.form-control:focus,.single-line:focus{border-color:#3c8dbc!important}.has-success .form-control{border-color:#1ab394}.has-warning .form-control{border-color:#f8ac59}.has-error .form-control{border-color:#ed5565}.has-success .control-label{color:#1ab394}.has-warning .control-label{color:#f8ac59}.has-error .control-label{color:#ed5565}.input-group-addon{background-color:#fff;border:1px solid #e5e6e7;border-radius:4px;color:inherit;font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center}.spinner-buttons.input-group-btn .btn-xs{line-height:1.13}.spinner-buttons.input-group-btn{width:20%}.noUi-connect{background:none repeat scroll 0 0 #1ab394;box-shadow:none}.slider_red .noUi-connect{background:none repeat scroll 0 0 #ed5565;box-shadow:none}.ui-sortable .ibox-title{cursor:move}.ui-sortable-placeholder{border:1px dashed #cecece!important;visibility:visible!important;background:#e7eaec}.ibox.ui-sortable-placeholder{margin:0 0 23px!important}.tabs-container .panel-body{background:#fff;border:1px solid #e7eaec;border-radius:2px;padding:20px;position:relative}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #e7eaec;border-bottom-color:transparent;background-color:#fff}.tabs-container .nav-tabs>li{float:left;margin-bottom:-1px}.tabs-container .tab-pane .panel-body{border-top:0}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #e7eaec;border-bottom-color:transparent}.tabs-container .nav-tabs{border-bottom:1px solid #e7eaec}.tabs-container .tab-pane .panel-body{border-top:0}.tabs-container .tabs-left .tab-pane .panel-body,.tabs-container .tabs-right .tab-pane .panel-body{border-top:1px solid #e7eaec}.tabs-container .nav-tabs>li a:hover{background:transparent;border-color:transparent}.tabs-container .tabs-below>.nav-tabs,.tabs-container .tabs-right>.nav-tabs,.tabs-container .tabs-left>.nav-tabs{border-bottom:0}.tabs-container .tabs-left .panel-body{position:static}.tabs-container .tabs-left>.nav-tabs,.tabs-container .tabs-right>.nav-tabs{width:20%}.tabs-container .tabs-left .panel-body{width:80%;margin-left:20%}.tabs-container .tabs-right .panel-body{width:80%;margin-right:20%}.tabs-container .tab-content>.tab-pane,.tabs-container .pill-content>.pill-pane{display:none}.tabs-container .tab-content>.active,.tabs-container .pill-content>.active{display:block}.tabs-container .tabs-below>.nav-tabs{border-top:1px solid #e7eaec}.tabs-container .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-container .tabs-below>.nav-tabs>li>a{border-radius:0 0 4px 4px}.tabs-container .tabs-below>.nav-tabs>li>a:hover,.tabs-container .tabs-below>.nav-tabs>li>a:focus{border-top-color:#e7eaec;border-bottom-color:transparent}.tabs-container .tabs-left>.nav-tabs>li,.tabs-container .tabs-right>.nav-tabs>li{float:none}.tabs-container .tabs-left>.nav-tabs>li>a,.tabs-container .tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-container .tabs-left>.nav-tabs{float:left;margin-right:19px}.tabs-container .tabs-left>.nav-tabs>li>a{margin-right:-1px;border-radius:4px 0 0 4px}.tabs-container .tabs-left>.nav-tabs .active>a,.tabs-container .tabs-left>.nav-tabs .active>a:hover,.tabs-container .tabs-left>.nav-tabs .active>a:focus{border-color:#e7eaec transparent #e7eaec #e7eaec;border-right-color:#fff}.tabs-container .tabs-right>.nav-tabs{float:right;margin-left:19px}.tabs-container .tabs-right>.nav-tabs>li>a{margin-left:-1px;border-radius:0 4px 4px 0}.tabs-container .tabs-right>.nav-tabs .active>a,.tabs-container .tabs-right>.nav-tabs .active>a:hover,.tabs-container .tabs-right>.nav-tabs .active>a:focus{border-color:#e7eaec #e7eaec #e7eaec transparent;border-left-color:#fff;z-index:1}.onoffswitch{position:relative;width:54px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:3px}.onoffswitch-inner{display:block;width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;padding:0;font-size:10px;color:white;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:"ON";padding-left:7px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:"OFF";padding-right:7px;background-color:#fff;color:#919191;text-align:right}.onoffswitch-switch{display:block;width:18px;margin:0;background:#fff;border:2px solid #1ab394;border-radius:3px;position:absolute;top:0;bottom:0;right:36px;-webkit-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.dd{position:relative;display:block;margin:0;padding:0;list-style:none;font-size:13px;line-height:20px}.dd-list{display:block;position:relative;margin:0;padding:0;list-style:none}.dd-list .dd-list{padding-left:30px}.dd-collapsed .dd-list{display:none}.dd-item,.dd-empty,.dd-placeholder{display:block;position:relative;margin:0;padding:0;min-height:20px;font-size:13px;line-height:20px}.dd-handle{display:block;margin:5px 0;padding:5px 10px;color:#333;text-decoration:none;border:1px solid #e7eaec;background:#f5f5f5;border-radius:3px;box-sizing:border-box;-moz-box-sizing:border-box}.dd-handle span{font-weight:bold}.dd-handle:hover{background:#f0f0f0;cursor:pointer;font-weight:bold}.dd-item>button{display:block;position:relative;cursor:pointer;float:left;width:25px;height:20px;margin:5px 0;padding:0;text-indent:100%;white-space:nowrap;overflow:hidden;border:0;background:transparent;font-size:12px;line-height:1;text-align:center;font-weight:bold}.dd-item>button:before{content:'+';display:block;position:absolute;width:100%;text-align:center;text-indent:0}.dd-item>button[data-action="collapse"]:before{content:'-'}#nestable2 .dd-item>button{font-family:FontAwesome;height:34px;width:33px;color:#c1c1c1}#nestable2 .dd-item>button:before{content:"\f067"}#nestable2 .dd-item>button[data-action="collapse"]:before{content:"\f068"}.dd-placeholder,.dd-empty{margin:5px 0;padding:0;min-height:30px;background:#f2fbff;border:1px dashed #b6bcbf;box-sizing:border-box;-moz-box-sizing:border-box}.dd-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-size:60px 60px;background-position:0 0,30px 30px}.dd-dragel{position:absolute;z-index:9999;pointer-events:none}.dd-dragel>.dd-item .dd-handle{margin-top:0}.dd-dragel .dd-handle{box-shadow:2px 4px 6px 0 rgba(0,0,0,0.1)}.nestable-lists{display:block;clear:both;padding:30px 0;width:100%;border:0;border-top:2px solid #ddd;border-bottom:2px solid #ddd}#nestable-menu{padding:0;margin:10px 0 20px 0}#nestable-output,#nestable2-output{width:100%;font-size:.75em;line-height:1.333333em;font-family:lucida grande,lucida sans unicode,helvetica,arial,sans-serif;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box}#nestable2 .dd-handle{color:inherit;border:1px dashed #e7eaec;background:#f3f3f4;padding:10px}#nestable2 span.label{margin-right:10px}#nestable-output,#nestable2-output{font-size:12px;padding:25px;box-sizing:border-box;-moz-box-sizing:border-box}.CodeMirror{border:1px solid #eee;height:auto}.CodeMirror-scroll{overflow-y:hidden;overflow-x:auto}.google-map{height:300px}.gridStyle{border:1px solid #d4d4d4;width:100%;height:400px}.gridStyle2{border:1px solid #d4d4d4;width:500px;height:300px}.ngH eaderCell{border-right:0;border-bottom:1px solid #e7eaec}.ngCell{border-right:0}.ngTopPanel{background:#f5f5f6}.ngRow.even{background:#f9f9f9}.ngRow.selected{background:#ebf2f1}.ngRow{border-bottom:1px solid #e7eaec}.ngCell{background-color:transparent}.ngHeaderCell{border-right:0}#toast-container>.toast{background-image:none!important}#toast-container>.toast:before{position:fixed;font-family:FontAwesome;font-size:24px;line-height:24px;float:left;color:#FFF;padding-right:.5em;margin:auto .5em auto -1.5em}#toast-container>div{box-shadow:0 0 3px #999;opacity:.9;-ms-filter:alpha(opacity = 90);filter:alpha(opacity = 90)}#toast-container>:hover{box-shadow:0 0 4px #999;opacity:1;-ms-filter:alpha(opacity = 100);filter:alpha(opacity = 100);cursor:pointer}.toast{background-color:#1ab394}.toast-success{background-color:#1ab394}.toast-error{background-color:#ed5565}.toast-info{background-color:#23c6c8}.toast-warning{background-color:#f8ac59}.toast-top-full-width{margin-top:20px}.toast-bottom-full-width{margin-bottom:20px}.img-container,.img-preview{overflow:hidden;text-align:center;width:100%}.img-preview-sm{height:130px;width:200px}.forum-post-container .media{margin:10px 10px 10px 10px;padding:20px 10px 20px 10px;border-bottom:1px solid #f1f1f1}.forum-avatar{float:left;margin-right:20px;text-align:center;width:110px}.forum-avatar .img-circle{height:48px;width:48px}.author-info{color:#676a6c;font-size:11px;margin-top:5px;text-align:center}.forum-post-info{padding:9px 12px 6px 12px;background:#f9f9f9;border:1px solid #f1f1f1}.media-body>.media{background:#f9f9f9;border-radius:3px;border:1px solid #f1f1f1}.forum-post-container .media-body .photos{margin:10px 0}.forum-photo{max-width:140px;border-radius:3px}.media-body>.media .forum-avatar{width:70px;margin-right:10px}.media-body>.media .forum-avatar .img-circle{height:38px;width:38px}.mid-icon{font-size:66px}.forum-item{margin:10px 0;padding:10px 0 20px;border-bottom:1px solid #f1f1f1}.views-number{font-size:24px;line-height:18px;font-weight:400}.forum-container,.forum-post-container{padding:30px!important}.forum-item small{color:#999}.forum-item .forum-sub-title{color:#999;margin-left:50px}.forum-title{margin:15px 0 15px 0}.forum-info{text-align:center}.forum-desc{color:#999}.forum-icon{float:left;width:30px;margin-right:20px;text-align:center}a.forum-item-title{color:inherit;display:block;font-size:18px;font-weight:600}a.forum-item-title:hover{color:inherit}.forum-icon .fa{font-size:30px;margin-top:8px;color:#9b9b9b}.forum-item.active .fa{color:#1ab394}.forum-item.active a.forum-item-title{color:#1ab394}@media(max-width :992px){.forum-info{margin:15px 0 10px 0;display:none}.forum-desc{float:none!important}}.vertical-container{width:90%;max-width:1170px;margin:0 auto}.vertical-container::after{content:'';display:table;clear:both}#vertical-timeline{position:relative;padding:0;margin-top:2em;margin-bottom:2em}#vertical-timeline::before{content:'';position:absolute;top:0;left:18px;height:100%;width:4px;background:#f1f1f1}.vertical-timeline-content .btn{float:right}#vertical-timeline.light-timeline:before{background:#e7eaec}.dark-timeline .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}.dark-timeline.center-orientation .vertical-timeline-content:before{border-color:transparent transparent transparent #f5f5f5}.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}.dark-timeline .vertical-timeline-content,.dark-timeline.center-orientation .vertical-timeline-content{background:#f5f5f5}@media only screen and (min-width:1170px){#vertical-timeline.center-orientation{margin-top:3em;margin-bottom:3em}#vertical-timeline.center-orientation:before{left:50%;margin-left:-2px}}@media only screen and (max-width:1170px){.center-orientation.dark-timeline .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}}.vertical-timeline-block{position:relative;margin:2em 0}.vertical-timeline-block:after{content:"";display:table;clear:both}.vertical-timeline-block:first-child{margin-top:0}.vertical-timeline-block:last-child{margin-bottom:0}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-block{margin:4em 0}.center-orientation .vertical-timeline-block:first-child{margin-top:0}.center-orientation .vertical-timeline-block:last-child{margin-bottom:0}}.vertical-timeline-icon{position:absolute;top:0;left:0;width:40px;height:40px;border-radius:50%;font-size:16px;border:3px solid #f1f1f1;text-align:center}.vertical-timeline-icon i{display:block;width:24px;height:24px;position:relative;left:50%;top:50%;margin-left:-12px;margin-top:-9px}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-icon{width:50px;height:50px;left:50%;margin-left:-25px;-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;font-size:19px}.center-orientation .vertical-timeline-icon i{margin-left:-12px;margin-top:-10px}.center-orientation .cssanimations .vertical-timeline-icon.is-hidden{visibility:hidden}}.vertical-timeline-content{position:relative;margin-left:60px;background:white;border-radius:.25em;padding:1em}.vertical-timeline-content:after{content:"";display:table;clear:both}.vertical-timeline-content h2{font-weight:400;margin-top:4px}.vertical-timeline-content p{margin:1em 0;line-height:1.6}.vertical-timeline-content .vertical-date{float:left;font-weight:500}.vertical-date small{color:#1ab394;font-weight:400}.vertical-timeline-content::before{content:'';position:absolute;top:16px;right:100%;height:0;width:0;border:7px solid transparent;border-right:7px solid white}@media only screen and (min-width:768px){.vertical-timeline-content h2{font-size:18px}.vertical-timeline-content p{font-size:13px}}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-content{margin-left:0;padding:1.6em;width:45%}.center-orientation .vertical-timeline-content::before{top:24px;left:100%;border-color:transparent;border-left-color:white}.center-orientation .vertical-timeline-content .btn{float:left}.center-orientation .vertical-timeline-content .vertical-date{position:absolute;width:100%;left:122%;top:2px;font-size:14px}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before{top:24px;left:auto;right:100%;border-color:transparent;border-right-color:white}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date{left:auto;right:122%;text-align:right}.center-orientation .cssanimations .vertical-timeline-content.is-hidden{visibility:hidden}}.sidebard-panel{width:220px;background:#ebebed;padding:10px 20px;position:absolute;right:0}.sidebard-panel .feed-element img.img-circle{width:32px;height:32px}.sidebard-panel .feed-element,.media-body,.sidebard-panel p{font-size:12px}.sidebard-panel .feed-element{margin-top:20px;padding-bottom:0}.sidebard-panel .list-group{margin-bottom:10px}.sidebard-panel .list-group .list-group-item{padding:5px 0;font-size:12px;border:0}.sidebar-content .wrapper,.wrapper.sidebar-content{padding-right:240px!important}#right-sidebar{background-color:#fff;border-left:1px solid #e7eaec;border-top:1px solid #e7eaec;overflow:hidden;position:fixed;top:60px;width:260px!important;z-index:1009;bottom:0;right:-260px}#right-sidebar.sidebar-open{right:0}#right-sidebar.sidebar-open.sidebar-top{top:0;border-top:0}.sidebar-container ul.nav-tabs{border:0}.sidebar-container ul.nav-tabs.navs-4 li{width:25%}.sidebar-container ul.nav-tabs.navs-3 li{width:33.3333%}.sidebar-container ul.nav-tabs.navs-2 li{width:50%}.sidebar-container ul.nav-tabs li{border:0}.sidebar-container ul.nav-tabs li a{border:0;padding:12px 10px;margin:0;border-radius:0;background:#2f4050;color:#fff;text-align:center;border-right:1px solid #334556}.sidebar-container ul.nav-tabs li.active a{border:0;background:#f9f9f9;color:#676a6c;font-weight:bold}.sidebar-container .nav-tabs>li.active>a:hover,.sidebar-container .nav-tabs>li.active>a:focus{border:0}.sidebar-container ul.sidebar-list{margin:0;padding:0}.sidebar-container ul.sidebar-list li{border-bottom:1px solid #e7eaec;padding:15px 20px;list-style:none;font-size:12px}.sidebar-container .sidebar-message:nth-child(2n+2){background:#f9f9f9}.sidebar-container ul.sidebar-list li a{text-decoration:none;color:inherit}.sidebar-container .sidebar-content{padding:15px 20px;font-size:12px}.sidebar-container .sidebar-title{background:#f9f9f9;padding:20px;border-bottom:1px solid #e7eaec}.sidebar-container .sidebar-title h3{margin-bottom:3px;padding-left:2px}.sidebar-container .tab-content h4{margin-bottom:5px}.sidebar-container .sidebar-message>a>.pull-left{margin-right:10px}.sidebar-container .sidebar-message>a{text-decoration:none;color:inherit}.sidebar-container .sidebar-message{padding:15px 20px}.sidebar-container .sidebar-message .message-avatar{height:38px;width:38px;border-radius:50%}.sidebar-container .setings-item{padding:15px 20px;border-bottom:1px solid #e7eaec}body{font-family:"open sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;color:#676a6c;overflow-x:hidden}html,body{height:100%}body.full-height-layout #wrapper,body.full-height-layout #page-wrapper{height:100%}#page-wrapper{min-height:auto}body.boxed-layout #wrapper{background-color:#2f4050;max-width:1200px;margin:0 auto}.top-navigation.boxed-layout #wrapper,.boxed-layout #wrapper.top-navigation{max-width:1300px!important}.block{display:block}a{cursor:pointer}a:hover,a:focus{text-decoration:none}.border-bottom{border-bottom:1px solid #e7eaec!important}.font-bold{font-weight:600}.font-noraml{font-weight:400}.text-uppercase{text-transform:uppercase}.b-r{border-right:1px solid #e7eaec}.hr-line-dashed{border-top:1px dashed #e7eaec;color:#fff;background-color:#fff;height:1px;margin:20px 0}.hr-line-solid{border-bottom:1px solid #e7eaec;background-color:rgba(0,0,0,0);border-style:solid!important;margin-top:15px;margin-bottom:15px}video{width:100%!important;height:auto!important}.gallery>.row>div{margin-bottom:15px}.fancybox img{margin-bottom:5px;width:24%}.note-editor{height:auto!important;min-height:100px;border:solid 1px #e5e6e7}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,0);border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,0.3);outline:0 none}.modal-dialog{z-index:1200}.modal-body{padding:20px 30px 30px 30px}.inmodal .modal-body{background:#f8fafb}.inmodal .modal-header{padding:30px 15px;text-align:center}.animated.modal.fade .modal-dialog{-webkit-transform:none;-ms-transform:none;transform:none}.inmodal .modal-title{font-size:26px}.inmodal .modal-icon{font-size:84px;color:#e2e3e3}.modal-footer{margin-top:0}#wrapper{width:100%;overflow-x:hidden;background-color:#2f4050}.wrapper{padding:0 20px}.wrapper-content{padding:20px}#page-wrapper{padding:0 15px;position:inherit;margin:0 0 0 200px}.title-action{text-align:right;padding-top:30px}.ibox-content h1,.ibox-content h2,.ibox-content h3,.ibox-content h4,.ibox-content h5,.ibox-title h1,.ibox-title h2,.ibox-title h3,.ibox-title h4,.ibox-title h5{margin-top:5px}ul.unstyled,ol.unstyled{list-style:none outside none;margin-left:0}.big-icon{font-size:160px;color:#e5e6e7}.footer{background:none repeat scroll 0 0 white;border-top:1px solid #e7eaec;overflow:hidden;padding:10px 20px;margin:0 -15px;height:36px}.footer.fixed_full{position:fixed;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:white;border-top:1px solid #e7eaec}.footer.fixed{position:fixed;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:white;border-top:1px solid #e7eaec;margin-left:220px}body.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 0 0 70px}body.mini-navbar.canvas-menu .footer.fixed,body.canvas-menu .footer.fixed{margin:0!important}body.fixed-sidebar.body-small.mini-navbar .footer.fixed{margin:0 0 0 220px}body.body-small .footer.fixed{margin-left:0}.page-heading{border-top:0;padding:0 20px 20px}.panel-heading h1,.panel-heading h2{margin-bottom:5px}.content-tabs{position:relative;height:39px;background:#fafafa;line-height:39px}.content-tabs .roll-nav,.page-tabs-list{position:absolute;width:30px;height:38px;text-align:center;color:#999;z-index:2;top:0}.content-tabs .roll-left{left:0;border-right:solid 1px #eee}.content-tabs .roll-right{right:0;border-left:solid 1px #eee}.content-tabs button{background:#fff;border:0;height:40px;width:40px;outline:0}.content-tabs button:hover{background:#fafafa}nav.page-tabs{margin-left:30px;width:100000px;height:39px;overflow:hidden}nav.page-tabs .page-tabs-content{float:left}.page-tabs a{display:block;float:left;border-right:solid 1px #eee;padding:0 15px}.page-tabs a i:hover{color:#c00}.page-tabs a:hover,.content-tabs .roll-nav:hover{color:#777;background:#f2f2f2;cursor:pointer}.roll-right.tabRight{right:60px}.roll-right.btn-group{right:60px;width:80px;padding:0}.roll-right.btn-group button{width:80px}.roll-right.tabReload{background:#fff;height:38px;width:60px;outline:0}.dropdown-menu-right{left:auto}#content-main{height:calc(100% - 127px);overflow:hidden}.tagsview-hide#content-main{height:calc(100% - 88px);overflow:hidden}.footer-hide#content-main{height:calc(100% - 91px);overflow:hidden}.tagsview-footer-hide#content-main{height:calc(100% - 52px);overflow:hidden}.fixed-nav #content-main{height:calc(100% - 80px);overflow:hidden}.table-bordered{border:1px solid #ebebeb}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{background-color:#f5f5f6;border-bottom-width:1px}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #e7e7e7}.table>thead>tr>th{border-bottom:1px solid #ddd;vertical-align:bottom}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #e7eaec;line-height:1.42857;padding:8px;vertical-align:middle}.panel.blank-panel{background:0;margin:0}.blank-panel .panel-heading{padding-bottom:0}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background:0;border-color:#ddd #ddd rgba(0,0,0,0);border-bottom:#f3f3f4;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid;border-width:1px;color:#555;cursor:default}.nav.nav-tabs li{background:0;border:0}.nav-tabs>li>a{color:#a7b1c2;font-weight:600;padding:10px 20px 10px 25px}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{background-color:#e6e6e6;color:#676a6c}.ui-tab .tab-content{padding:20px 0}.no-padding{padding:0!important}.no-borders{border:none!important}.no-margins{margin:0!important}.no-top-border{border-top:0!important}.ibox-content.text-box{padding-bottom:0;padding-top:15px}.border-left-right{border-left:1px solid #e7eaec;border-right:1px solid #e7eaec;border-top:0;border-bottom:0}.border-left{border-left:1px solid #e7eaec;border-right:0;border-top:0;border-bottom:0}.border-right{border-left:none;border-right:1px solid #e7eaec;border-top:0;border-bottom:0}.full-width{width:100%!important}.link-block{font-size:12px;padding:10px}.nav.navbar-top-links .link-block a{font-size:12px}.link-block a{font-size:10px;color:inherit}body.mini-navbar .branding{display:none}img.circle-border{border:6px solid #fff;border-radius:50%}.branding{float:left;color:#fff;font-size:18px;font-weight:600;padding:17px 20px;text-align:center;background-color:#1ab394}.login-panel{margin-top:25%}.page-header{padding:20px 0 9px;margin:0 0 20px;border-bottom:1px solid #eee}.fontawesome-icon-list{margin-top:22px}.fontawesome-icon-list .fa-hover a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;color:#222;line-height:32px;height:32px;padding-left:10px;border-radius:4px}.fontawesome-icon-list .fa-hover a .fa{width:32px;font-size:14px;display:inline-block;text-align:right;margin-right:10px}.fontawesome-icon-list .fa-hover a:hover{background-color:#1d9d74;color:#fff;text-decoration:none}.fontawesome-icon-list .fa-hover a:hover .fa{font-size:30px;vertical-align:-6px}.fontawesome-icon-list .fa-hover a:hover .text-muted{color:#bbe2d5}.feature-list .col-md-4{margin-bottom:22px}.feature-list h4 .fa:before{vertical-align:-10%;font-size:28px;display:inline-block;width:1.07142857em;text-align:center;margin-right:5px}.ui-draggable .ibox-title{cursor:move}.breadcrumb{background-color:#fff;padding:0;margin-bottom:0}.breadcrumb>li a{color:inherit}.breadcrumb>.active{color:inherit}code{background-color:#f9f2f4;border-radius:4px;color:#ca4440;font-size:90%;padding:2px 4px;white-space:nowrap}.ibox{clear:both;margin-bottom:25px;margin-top:0;padding:0}.ibox.collapsed .ibox-content{display:none}.ibox.collapsed .fa.fa-chevron-up:before{content:"\f078"}.ibox.collapsed .fa.fa-chevron-down:before{content:"\f077"}.ibox:after,.ibox:before{display:table}.ibox-title{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background-color:#fff;border-color:#e7eaec;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid solid none;border-width:0;color:inherit;margin-bottom:0;padding:14px 15px 7px;min-height:40px}.ibox-content{background-color:#fff;color:inherit;padding:15px 20px 20px 20px;border-color:#e7eaec;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid solid none;border-width:1px 0}table.table-mail tr td{padding:12px}.table-mail .check-mail{padding-left:20px}.table-mail .mail-date{padding-right:20px}.star-mail,.check-mail{width:40px}.unread td a,.unread td{font-weight:600;color:inherit}.read td a,.read td{font-weight:normal;color:inherit}.unread td{background-color:#f9f8f8}.ibox-content{clear:both}.ibox-heading{background-color:#f3f6fb;border-bottom:0}.ibox-heading h3{font-weight:200;font-size:24px}.ibox-title h5{display:inline-block;font-size:14px;margin:0 0 7px;padding:0;text-overflow:ellipsis;float:left}.ibox-title .label{float:left;margin-left:4px}.ibox-tools{display:inline-block;float:right;margin-top:0;position:relative;padding:0}.ibox-tools a{cursor:pointer;margin-left:5px;color:#676a6c}.ibox-tools a.btn-primary{color:#fff}.ibox-tools .dropdown-menu>li>a{padding:4px 10px;font-size:12px}.ibox .open>.dropdown-menu{left:auto;right:0}.gray-bg{background-color:#f3f3f4}.white-bg{background-color:#fff}.navy-bg{background-color:#1ab394;color:#fff}.blue-bg{background-color:#1c84c6;color:#fff}.lazur-bg{background-color:#23c6c8;color:#fff}.yellow-bg{background-color:#f8ac59;color:#fff}.red-bg{background-color:#ed5565;color:#fff}.black-bg{background-color:#262626}.panel-primary{border-color:#1ab394}.panel-primary>.panel-heading{background-color:#1ab394;border-color:#1ab394}.panel-success{border-color:#1c84c6}.panel-success>.panel-heading{background-color:#1c84c6;border-color:#1c84c6;color:#fff}.panel-info{border-color:#23c6c8}.panel-info>.panel-heading{background-color:#23c6c8;border-color:#23c6c8;color:#fff}.panel-warning{border-color:#f8ac59}.panel-warning>.panel-heading{background-color:#f8ac59;border-color:#f8ac59;color:#fff}.panel-danger{border-color:#ed5565}.panel-danger>.panel-heading{background-color:#ed5565;border-color:#ed5565;color:#fff}.progress-bar{background-color:#1ab394}.progress-small,.progress-small .progress-bar{height:10px}.progress-small,.progress-mini{margin-top:5px}.progress-mini,.progress-mini .progress-bar{height:5px;margin-bottom:0}.progress-bar-navy-light{background-color:#3dc7ab}.progress-bar-success{background-color:#1c84c6}.progress-bar-info{background-color:#23c6c8}.progress-bar-warning{background-color:#f8ac59}.progress-bar-danger{background-color:#ed5565}.panel-title{font-size:inherit}.jumbotron{border-radius:6px;padding:40px}.jumbotron h1{margin-top:0}.text-navy{color:#1ab394}.text-primary{color:inherit}.text-success{color:#1c84c6}.text-info{color:#23c6c8}.text-warning{color:#f8ac59}.text-danger{color:#ed5565}.text-muted{color:#888}.simple_tag{background-color:#f3f3f4;border:1px solid #e7eaec;border-radius:2px;color:inherit;font-size:10px;margin-right:5px;margin-top:5px;padding:5px 12px;display:inline-block}.img-shadow{box-shadow:0 0 3px 0 #919191}.dashboards\.dashboard_2 nav.navbar,.dashboards\.dashboard_3 nav.navbar,.mailbox\.inbox nav.navbar,.mailbox\.email_view nav.navbar,.mailbox\.email_compose nav.navbar,.dashboards\.dashboard_4_1 nav.navbar{background:#fff}.Dashboard_2 .navbar.navbar-static-top,.Dashboard_3 .navbar.navbar-static-top,.Dashboard_4_1 .navbar.navbar-static-top,.ComposeEmail .navbar.navbar-static-top,.EmailView .navbar.navbar-static-top,.Inbox .navbar.navbar-static-top{background:#fff}a.close-canvas-menu{position:absolute;top:10px;right:15px;z-index:1011;color:#a7b1c2}a.close-canvas-menu:hover{color:#fff}.full-height{height:100%}.fh-breadcrumb{height:calc(100% - 196px);margin:0 -15px;position:relative}.fh-no-breadcrumb{height:calc(100% - 99px);margin:0 -15px;position:relative}.fh-column{background:#fff;height:100%;width:240px;float:left}.modal-backdrop{z-index:2040!important}.modal{z-index:2050!important}.spiner-example{height:200px;padding-top:70px}.p-xxs{padding:5px}.p-xs{padding:10px}.p-sm{padding:15px}.p-m{padding:20px}.p-md{padding:25px}.p-lg{padding:30px}.p-xl{padding:40px}.m-xxs{margin:2px 4px}.m-xs{margin:5px}.m-sm{margin:10px}.m{margin:15px}.m-md{margin:20px}.m-lg{margin:30px}.m-xl{margin:50px}.m-n{margin:0!important}.m-l-none{margin-left:0}.m-l-xs{margin-left:5px}.m-l-sm{margin-left:10px}.m-l{margin-left:15px}.m-l-md{margin-left:20px}.m-l-lg{margin-left:30px}.m-l-xl{margin-left:40px}.m-l-n-xxs{margin-left:-1px}.m-l-n-xs{margin-left:-5px}.m-l-n-sm{margin-left:-10px}.m-l-n{margin-left:-15px}.m-l-n-md{margin-left:-20px}.m-l-n-lg{margin-left:-30px}.m-l-n-xl{margin-left:-40px}.m-t-none{margin-top:0}.m-t-xxs{margin-top:1px}.m-t-xs{margin-top:5px}.m-t-sm{margin-top:10px}.m-t{margin-top:15px}.m-t-md{margin-top:20px}.m-t-lg{margin-top:30px}.m-t-xl{margin-top:40px}.m-t-n-xxs{margin-top:-1px}.m-t-n-xs{margin-top:-5px}.m-t-n-sm{margin-top:-10px}.m-t-n{margin-top:-15px}.m-t-n-md{margin-top:-20px}.m-t-n-lg{margin-top:-30px}.m-t-n-xl{margin-top:-40px}.m-r-none{margin-right:0}.m-r-xxs{margin-right:1px}.m-r-xs{margin-right:5px}.m-r-sm{margin-right:10px}.m-r{margin-right:15px}.m-r-md{margin-right:20px}.m-r-lg{margin-right:30px}.m-r-xl{margin-right:40px}.m-r-n-xxs{margin-right:-1px}.m-r-n-xs{margin-right:-5px}.m-r-n-sm{margin-right:-10px}.m-r-n{margin-right:-15px}.m-r-n-md{margin-right:-20px}.m-r-n-lg{margin-right:-30px}.m-r-n-xl{margin-right:-40px}.m-b-none{margin-bottom:0}.m-b-xxs{margin-bottom:1px}.m-b-xs{margin-bottom:5px}.m-b-sm{margin-bottom:10px}.m-b{margin-bottom:15px}.m-b-md{margin-bottom:20px}.m-b-lg{margin-bottom:30px}.m-b-xl{margin-bottom:40px}.m-b-n-xxs{margin-bottom:-1px}.m-b-n-xs{margin-bottom:-5px}.m-b-n-sm{margin-bottom:-10px}.m-b-n{margin-bottom:-15px}.m-b-n-md{margin-bottom:-20px}.m-b-n-lg{margin-bottom:-30px}.m-b-n-xl{margin-bottom:-40px}.space-15{margin:15px 0}.space-20{margin:20px 0}.space-25{margin:25px 0}.space-30{margin:30px 0}body.modal-open{padding-right:inherit!important}.search-form{margin-top:10px}.search-result h3{margin-bottom:0;color:#1e0fbe}.search-result .search-link{color:#006621}.search-result p{font-size:12px;margin-top:5px}.contact-box{background-color:#fff;border:1px solid #e7eaec;padding:20px;margin-bottom:20px}.contact-box a{color:inherit}.invoice-table tbody>tr>td:last-child,.invoice-table tbody>tr>td:nth-child(4),.invoice-table tbody>tr>td:nth-child(3),.invoice-table tbody>tr>td:nth-child(2){text-align:right}.invoice-table thead>tr>th:last-child,.invoice-table thead>tr>th:nth-child(4),.invoice-table thead>tr>th:nth-child(3),.invoice-table thead>tr>th:nth-child(2){text-align:right}.invoice-total>tbody>tr>td:first-child{text-align:right}.invoice-total>tbody>tr>td{border:0 none}.invoice-total>tbody>tr>td:last-child{border-bottom:1px solid #ddd;text-align:right;width:15%}.middle-box{max-width:400px;z-index:100;margin:0 auto;padding-top:40px}.lockscreen.middle-box{width:200px;padding-top:110px}.loginscreen.middle-box{width:300px}.loginColumns{max-width:800px;margin:0 auto;padding:100px 20px 20px 20px}.passwordBox{max-width:460px;margin:0 auto;padding:100px 20px 20px 20px}.logo-name{color:#e6e6e6;font-size:180px;font-weight:800;letter-spacing:-10px;margin-bottom:0}.middle-box h1{font-size:170px}.wrapper .middle-box{margin-top:140px}.lock-word{z-index:10;position:absolute;top:110px;left:50%;margin-left:-470px}.lock-word span{font-size:100px;font-weight:600;color:#e9e9e9;display:inline-block}.lock-word .first-word{margin-right:160px}.dashboard-header{border-top:0;padding:20px 20px 20px 20px}.dashboard-header h2{margin-top:10px;font-size:26px}.fist-item{border-top:none!important}.statistic-box{margin-top:40px}.dashboard-header .list-group-item span.label{margin-right:10px}.list-group.clear-list .list-group-item{border-top:1px solid #e7eaec;border-bottom:0;border-right:0;border-left:0;padding:10px 0}ul.clear-list:first-child{border-top:none!important}.timeline-item .date i{position:absolute;top:0;right:0;padding:5px;width:30px;text-align:center;border-top:1px solid #e7eaec;border-bottom:1px solid #e7eaec;border-left:1px solid #e7eaec;background:#f8f8f8}.timeline-item .date{text-align:right;width:110px;position:relative;padding-top:30px}.timeline-item .content{border-left:1px solid #e7eaec;border-top:1px solid #e7eaec;padding-top:10px;min-height:100px}.timeline-item .content:hover{background:#f6f6f6}ul.notes li,ul.tag-list li{list-style:none}ul.notes li h4{margin-top:20px;font-size:16px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;position:relative}ul.notes li div small{position:absolute;top:5px;right:5px;font-size:10px}ul.notes li div a{position:absolute;right:10px;bottom:10px;color:inherit}ul.notes li{margin:10px 40px 50px 0;float:left}ul.notes li div p{font-size:12px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;box-shadow:5px 5px 2px rgba(33,33,33,0.7)}ul.notes li div{-webkit-transform:rotate(-6deg);-o-transform:rotate(-6deg);-moz-transform:rotate(-6deg)}ul.notes li:nth-child(even) div{-o-transform:rotate(4deg);-webkit-transform:rotate(4deg);-moz-transform:rotate(4deg);position:relative;top:5px}ul.notes li:nth-child(3n) div{-o-transform:rotate(-3deg);-webkit-transform:rotate(-3deg);-moz-transform:rotate(-3deg);position:relative;top:-5px}ul.notes li:nth-child(5n) div{-o-transform:rotate(5deg);-webkit-transform:rotate(5deg);-moz-transform:rotate(5deg);position:relative;top:-10px}ul.notes li div:hover,ul.notes li div:focus{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);position:relative;z-index:5}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:210px;width:210px;padding:1em;box-shadow:5px 5px 7px rgba(33,33,33,0.7);-webkit-transition:-webkit-transform .15s linear}.file-box{float:left;width:220px}.file-manager h5{text-transform:uppercase}.file-manager{list-style:none outside none;margin:0;padding:0}.folder-list li a{color:#666;display:block;padding:5px 0}.folder-list li{border-bottom:1px solid #e7eaec;display:block}.folder-list li i{margin-right:8px;color:#3d4d5d}.category-list li a{color:#666;display:block;padding:5px 0}.category-list li{display:block}.category-list li i{margin-right:8px;color:#3d4d5d}.category-list li a .text-navy{color:#1ab394}.category-list li a .text-primary{color:#1c84c6}.category-list li a .text-info{color:#23c6c8}.category-list li a .text-danger{color:#ef5352}.category-list li a .text-warning{color:#f8ac59}.file-manager h5.tag-title{margin-top:20px}.tag-list li{float:left}.tag-list li a{font-size:10px;background-color:#f3f3f4;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #e7eaec;margin-right:5px;margin-top:5px;display:block}.file{border:1px solid #e7eaec;padding:0;background-color:#fff;position:relative;margin-bottom:20px;margin-right:20px}.file-manager .hr-line-dashed{margin:15px 0}.file .icon,.file .image{height:100px;overflow:hidden}.file .icon{padding:15px 10px;text-align:center}.file-control{color:inherit;font-size:14px;margin-right:10px}.file-control.active{text-decoration:underline}.file .icon i{font-size:70px;color:#dadada}.file .file-name{padding:10px;background-color:#f8f8f8;border-top:1px solid #e7eaec}.file-name small{color:#676a6c}.corner{position:absolute;display:inline-block;width:0;height:0;line-height:0;border:.6em solid transparent;border-right:.6em solid #f1f1f1;border-bottom:.6em solid #f1f1f1;right:0;bottom:0}a.compose-mail{padding:8px 10px}.mail-search{max-width:300px}.profile-content{border-top:none!important}.feed-activity-list .feed-element{border-bottom:1px solid #e7eaec}.feed-element:first-child{margin-top:0}.feed-element{padding-bottom:15px}.feed-element,.feed-element .media{margin-top:15px}.feed-element,.media-body{overflow:hidden}.feed-element>.pull-left{margin-right:10px}.feed-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.feed-element .well{border:1px solid #e7eaec;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.feed-element .actions{margin-top:10px}.feed-element .photos{margin:10px 0}.feed-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.mail-box{background-color:#fff;border:1px solid #e7eaec;border-top:0;padding:0;margin-bottom:20px}.mail-box-header{background-color:#fff;border:1px solid #e7eaec;border-bottom:0;padding:30px 20px 20px 20px}.mail-box-header h2{margin-top:0}.mailbox-content .tag-list li a{background:#fff}.mail-body{border-top:1px solid #e7eaec;padding:20px}.mail-text{border-top:1px solid #e7eaec}.mail-text .note-toolbar{padding:10px 15px}.mail-body .form-group{margin-bottom:5px}.mail-text .note-editor .note-toolbar{background-color:#f9f8f8}.mail-attachment{border-top:1px solid #e7eaec;padding:20px;font-size:12px}.mailbox-content{background:0;border:0;padding:10px}.mail-ontact{width:23%}.project-people,.project-actions{text-align:right;vertical-align:middle}dd.project-people{text-align:left;margin-top:5px}.project-people img{width:32px;height:32px}.project-title a{font-size:14px;color:#676a6c;font-weight:600}.project-list table tr td{border-top:0;border-bottom:1px solid #e7eaec;padding:15px 10px;vertical-align:middle}.project-manager .tag-list li a{font-size:10px;background-color:white;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #e7eaec;margin-right:5px;margin-top:5px;display:block}.project-files li a{font-size:11px;color:#676a6c;margin-left:10px;line-height:22px}.faq-item{padding:20px;margin-bottom:2px;background:#fff}.faq-question{font-size:18px;font-weight:600;color:#1ab394;display:block}.faq-question:hover{color:#179d82}.faq-answer{margin-top:10px;background:#f3f3f4;border:1px solid #e7eaec;border-radius:3px;padding:15px}.faq-item .tag-item{background:#f3f3f4;padding:2px 6px;font-size:10px;text-transform:uppercase}.message-input{height:90px!important}.chat-avatar{width:36px;height:36px;float:left;margin-right:10px}.chat-user-name{padding:10px}.chat-user{padding:8px 10px;border-bottom:1px solid #e7eaec}.chat-user a{color:inherit}.chat-view{z-index:20012}.chat-users,.chat-statistic{margin-left:-30px}@media(max-width:992px){.chat-users,.chat-statistic{margin-left:0}}.chat-view .ibox-content{padding:0}.chat-message{padding:10px 20px}.message-avatar{height:48px;width:48px;border:1px solid #e7eaec;border-radius:4px;margin-top:1px}.chat-discussion .chat-message.left .message-avatar{float:left;margin-right:10px}.chat-discussion .chat-message.right .message-avatar{float:right;margin-left:10px}.message{background-color:#fff;border:1px solid #e7eaec;text-align:left;display:block;padding:10px 20px;position:relative;border-radius:4px}.chat-discussion .chat-message.left .message-date{float:right}.chat-discussion .chat-message.right .message-date{float:left}.chat-discussion .chat-message.left .message{text-align:left;margin-left:55px}.chat-discussion .chat-message.right .message{text-align:right;margin-right:55px}.message-date{font-size:10px;color:#888}.message-content{display:block}.chat-discussion{background:#eee;padding:15px;height:400px;overflow-y:auto}.chat-users{overflow-y:auto;height:400px}.chat-message-form .form-group{margin-bottom:0}.jstree-open>.jstree-anchor>.fa-folder:before{content:"\f07c"}.jstree-default .jstree-icon.none{width:0}.clients-list{margin-top:20px}.clients-list .tab-pane{position:relative;height:600px}.client-detail{position:relative;height:620px}.clients-list table tr td{height:46px;vertical-align:middle;border:0}.client-link{font-weight:600;color:inherit}.client-link:hover{color:inherit}.client-avatar{width:42px}.client-avatar img{width:28px;height:28px;border-radius:50%}.contact-type{width:20px;color:#c1c3c4}.client-status{text-align:left}.client-detail .vertical-timeline-content p{margin:0}.client-detail .vertical-timeline-icon.gray-bg{color:#a7aaab}.clients-list .nav-tabs>li.active>a,.clients-list .nav-tabs>li.active>a:hover,.clients-list .nav-tabs>li.active>a:focus{border-bottom:1px solid #fff}.blog h2{font-weight:700}.blog h5{margin:0 0 5px 0}.blog .btn{margin:0 0 5px 0}.article h1{font-size:48px;font-weight:700;color:#2f4050}.article p{font-size:15px;line-height:26px}.article-title{text-align:center;margin:60px 0 40px 0}.article .ibox-content{padding:40px}.issue-tracker .btn-link{color:#1ab394}table.issue-tracker tbody tr td{vertical-align:middle;height:50px}.issue-info{width:50%}.issue-info a{font-weight:600;color:#676a6c}.issue-info small{display:block}.team-members{margin:10px 0}.team-members img.img-circle{width:42px;height:42px;margin-bottom:5px}.sortable-list{padding:10px 0}.agile-list{list-style:none;margin:0}.agile-list li{background:#fafafb;border:1px solid #e7eaec;margin:0 0 10px 0;padding:10px;border-radius:2px}.agile-list li:hover{cursor:pointer;background:#fff}.agile-list li.warning-element{border-left:3px solid #f8ac59}.agile-list li.danger-element{border-left:3px solid #ed5565}.agile-list li.info-element{border-left:3px solid #1c84c6}.agile-list li.success-element{border-left:3px solid #1ab394}.agile-detail{margin-top:5px;font-size:12px}ins{background-color:#c6ffc6;text-decoration:none}del{background-color:#ffc6c6}#small-chat{position:fixed;bottom:50px;right:26px;z-index:100}#small-chat .badge{position:absolute;top:-3px;right:-4px}.open-small-chat{height:38px;width:38px;display:block;background:#1ab394;padding:9px 8px;text-align:center;color:#fff;border-radius:50%}.open-small-chat:hover{color:white;background:#1ab394}.small-chat-box{display:none;position:fixed;bottom:50px;right:80px;background:#fff;border:1px solid #e7eaec;width:230px;height:320px;border-radius:4px}.small-chat-box.ng-small-chat{display:block}.body-small .small-chat-box{bottom:70px;right:20px}.small-chat-box.active{display:block}.small-chat-box .heading{background:#2f4050;padding:8px 15px;font-weight:bold;color:#fff}.small-chat-box .chat-date{opacity:.6;font-size:10px;font-weight:normal}.small-chat-box .content{padding:15px 15px}.small-chat-box .content .author-name{font-weight:bold;margin-bottom:3px;font-size:11px}.small-chat-box .content>div{padding-bottom:20px}.small-chat-box .content .chat-message{padding:5px 10px;border-radius:6px;font-size:11px;line-height:14px;max-width:80%;background:#f3f3f4;margin-bottom:10px}.small-chat-box .content .chat-message.active{background:#1ab394;color:#fff}.small-chat-box .content .left{text-align:left;clear:both}.small-chat-box .content .left .chat-message{float:left}.small-chat-box .content .right{text-align:right;clear:both}.small-chat-box .content .right .chat-message{float:right}.small-chat-box .form-chat{padding:10px 10px}.sk-spinner-rotating-plane.sk-spinner{width:30px;height:30px;background-color:#1ab394;margin:0 auto;-webkit-animation:sk-rotatePlane 1.2s infinite ease-in-out;animation:sk-rotatePlane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-180deg);transform:perspective(120px) rotateX(-180deg) rotateY(-180deg)}}@keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179 .9deg);transform:perspective(120px) rotateX(-180deg) rotateY(-179 .9deg)}}.sk-spinner-double-bounce.sk-spinner{width:40px;height:40px;position:relative;margin:0 auto}.sk-spinner-double-bounce .sk-double-bounce1,.sk-spinner-double-bounce .sk-double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#1ab394;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-doubleBounce 2s infinite ease-in-out;animation:sk-doubleBounce 2s infinite ease-in-out}.sk-spinner-double-bounce .sk-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-wave.sk-spinner{margin:0 auto;width:50px;height:30px;text-align:center;font-size:10px}.sk-spinner-wave div{background-color:#1ab394;height:100%;width:6px;display:inline-block;-webkit-animation:sk-waveStretchDelay 1.2s infinite ease-in-out;animation:sk-waveStretchDelay 1.2s infinite ease-in-out}.sk-spinner-wave .sk-rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-wave .sk-rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-wave .sk-rect4{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-wave .sk-rect5{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}@-webkit-keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}.sk-spinner-wandering-cubes.sk-spinner{margin:0 auto;width:32px;height:32px;position:relative}.sk-spinner-wandering-cubes .sk-cube1,.sk-spinner-wandering-cubes .sk-cube2{background-color:#1ab394;width:10px;height:10px;position:absolute;top:0;left:0;-webkit-animation:sk-wanderingCubeMove 1.8s infinite ease-in-out;animation:sk-wanderingCubeMove 1.8s infinite ease-in-out}.sk-spinner-wandering-cubes .sk-cube2{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}@-webkit-keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}.sk-spinner-pulse.sk-spinner{width:40px;height:40px;margin:0 auto;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-pulseScaleOut 1s infinite ease-in-out;animation:sk-pulseScaleOut 1s infinite ease-in-out}@-webkit-keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.sk-spinner-chasing-dots.sk-spinner{margin:0 auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-chasingDotsRotate 2s infinite linear;animation:sk-chasingDotsRotate 2s infinite linear}.sk-spinner-chasing-dots .sk-dot1,.sk-spinner-chasing-dots .sk-dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-chasingDotsBounce 2s infinite ease-in-out;animation:sk-chasingDotsBounce 2s infinite ease-in-out}.sk-spinner-chasing-dots .sk-dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-three-bounce.sk-spinner{margin:0 auto;width:70px;text-align:center}.sk-spinner-three-bounce div{width:18px;height:18px;background-color:#1ab394;border-radius:100%;display:inline-block;-webkit-animation:sk-threeBounceDelay 1.4s infinite ease-in-out;animation:sk-threeBounceDelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-three-bounce .sk-bounce1{-webkit-animation-delay:-0.32s;animation-delay:-0.32s}.sk-spinner-three-bounce .sk-bounce2{-webkit-animation-delay:-0.16s;animation-delay:-0.16s}@-webkit-keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-circle .sk-circle:before{content:'';display:block;margin:0 auto;width:20%;height:20%;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-circleBounceDelay 1.2s infinite ease-in-out;animation:sk-circleBounceDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-cube-grid.sk-spinner{width:30px;height:30px;margin:0 auto}.sk-spinner-cube-grid .sk-cube{width:33%;height:33%;background-color:#1ab394;float:left;-webkit-animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out;animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out}.sk-spinner-cube-grid .sk-cube:nth-child(1){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(2){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(3){-webkit-animation-delay:.4s;animation-delay:.4s}.sk-spinner-cube-grid .sk-cube:nth-child(4){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(5){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(6){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(7){-webkit-animation-delay:0s;animation-delay:0s}.sk-spinner-cube-grid .sk-cube:nth-child(8){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(9){-webkit-animation-delay:.2s;animation-delay:.2s}@-webkit-keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}@keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}.sk-spinner-wordpress.sk-spinner{background-color:#1ab394;width:30px;height:30px;border-radius:30px;position:relative;margin:0 auto;-webkit-animation:sk-innerCircle 1s linear infinite;animation:sk-innerCircle 1s linear infinite}.sk-spinner-wordpress .sk-inner-circle{display:block;background-color:#fff;width:8px;height:8px;position:absolute;border-radius:8px;top:5px;left:5px}@-webkit-keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.sk-spinner-fading-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-fading-circle .sk-circle:before{content:'';display:block;margin:0 auto;width:18%;height:18%;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out;animation:sk-circleFadeDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-fading-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-fading-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-fading-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-fading-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-fading-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-fading-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-fading-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-fading-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-fading-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}body.rtls #page-wrapper{margin:0 220px 0 0}body.rtls .nav-second-level li a{padding:7px 35px 7px 10px}body.rtls .ibox-title h5{float:right}body.rtls .pull-right{float:left!important}body.rtls .pull-left{float:right!important}body.rtls .ibox-tools{float:left}body.rtls .stat-percent{float:left}body.rtls .navbar-right{float:left!important}body.rtls .navbar-top-links li:last-child{margin-left:40px;margin-right:0}body.rtls .minimalize-styl-2{float:right;margin:14px 20px 5px 5px}body.rtls .feed-element>.pull-left{margin-left:10px;margin-right:0}body.rtls .timeline-item .date{text-align:left}body.rtls .timeline-item .date i{left:0;right:auto}body.rtls .timeline-item .content{border-right:1px solid #e7eaec;border-left:none}body.rtls .toast-close-button{float:left}body.rtls #toast-container>.toast:before{margin:auto -1.5em auto .5em}body.rtls #toast-container>div{padding:15px 50px 15px 15px}body.rtls .center-orientation .vertical-timeline-icon i{margin-left:0;margin-right:-12px}body.rtls .vertical-timeline-icon i{right:50%;left:auto;margin-left:auto;margin-right:-12px}body.rtls .file-box{float:right}body.rtls ul.notes li{float:right}body.rtls .chat-users,body.rtls .chat-statistic{margin-right:-30px;margin-left:auto}body.rtls .dropdown-menu>li>a{text-align:right}body.rtls .b-r{border-left:1px solid #e7eaec;border-right:0}body.rtls .dd-list .dd-list{padding-right:30px;padding-left:0}body.rtls .dd-item>button{float:right}body.rtls .skin-setttings{margin-right:40px;margin-left:0}body.rtls .skin-setttings{direction:ltr}body.rtls .footer.fixed{margin-right:220px;margin-left:0}@media(max-width :992px){body.rtls .chat-users,body.rtls .chat-statistic{margin-right:0}}body.rtls.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0}body.rtls.top-navigation .navbar-toggle{float:right;margin-left:15px;margin-right:15px}.body-small.rtls.top-navigation .navbar-header{float:none}body.rtls.top-navigation #page-wrapper{margin:0}body.rtls.mini-navbar #page-wrapper{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar #page-wrapper{margin:0}body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 220px 0 0}body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:220px}.body-small.rtls .navbar-fixed-top{margin-right:0}.body-small.rtls .navbar-header{float:right}body.rtls .navbar-top-links li:last-child{margin-left:20px}body.rtls .top-navigation #page-wrapper,body.rtls.mini-navbar .top-navigation #page-wrapper,body.rtls.mini-navbar.top-navigation #page-wrapper{margin:0}body.rtls .top-navigation .footer.fixed,body.rtls.top-navigation .footer.fixed{margin:0}@media(max-width :768px){body.rtls .navbar-top-links li:last-child{margin-left:20px}.body-small.rtls #page-wrapper{position:inherit;margin:0;min-height:1000px}.body-small.rtls .navbar-static-side{display:none;z-index:2001;position:absolute;width:70px}.body-small.rtls.mini-navbar .navbar-static-side{display:block}.rtls.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:2001;position:fixed;width:220px}.rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}}.rtls .ltr-support{direction:ltr}.page-tabs a{color:#999}.page-tabs a i{color:#ccc;margin-left:2px;font-size:13px}.page-tabs a.active{background:#eaedf1;color:#23508e}.page-tabs a.active:hover,.page-tabs a.active i:hover{background:#eaedf1;color:#23508e}@media(min-width :768px){.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{margin-left:auto}}@media(max-width :768px){body.fixed-sidebar .navbar-static-side{display:none}body.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}.lock-word{display:none}.navbar-form-custom{display:none}.navbar-header{display:inline;float:left}.sidebard-panel{z-index:2;position:relative;width:auto;min-height:100%!important}.sidebar-content .wrapper{padding-right:0;z-index:1}.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:2001;position:fixed;width:220px}.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}.ibox-tools{float:none;text-align:right;display:block}.content-tabs{display:none}#content-main{height:calc(100% - 100px)}.fixed-nav #content-main{height:calc(100% - 38px)}}.navbar-static-side{background:#2f4050}.nav-close{padding:10px;display:block;position:absolute;right:5px;top:5px;font-size:1.4em;cursor:pointer;z-index:10;display:none;color:rgba(255,255,255,.3)}@media(max-width :350px){body.fixed-sidebar.mini-navbar .navbar-static-side{width:0}.nav-close{display:block}#page-wrapper{margin-left:0!important}.timeline-item .date{text-align:left;width:110px;position:relative;padding-top:30px}.timeline-item .date i{position:absolute;top:0;left:15px;padding:5px;width:30px;text-align:center;border:1px solid #e7eaec;background:#f8f8f8}.timeline-item .content{border-left:none;border-top:1px solid #e7eaec;padding-top:10px;min-height:100px}.nav.navbar-top-links li.dropdown{display:none}.ibox-tools{float:none;text-align:left;display:inline-block}}.ui-jqgrid-titlebar{height:40px;line-height:24px;color:#676a6c;background-color:#f9f9f9;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.ui-jqgrid .ui-jqgrid-title{float:left;margin-left:5px;font-weight:700}.ui-jqgrid .ui-jqgrid-titlebar{position:relative;border-left:0 solid;border-right:0 solid;border-top:0 solid}.social-feed-separated .social-feed-box{margin-left:62px}.social-feed-separated .social-avatar{float:left;padding:0}.social-feed-separated .social-avatar img{width:52px;height:52px;border:1px solid #e7eaec}.social-feed-separated .social-feed-box .social-avatar{padding:15px 15px 0 15px;float:none}.social-feed-box{border:1px solid #e7eaec;background:#fff;margin-bottom:15px}.article .social-feed-box{margin-bottom:0;border-bottom:0}.article .social-feed-box:last-child{margin-bottom:0;border-bottom:1px solid #e7eaec}.article .social-feed-box p{font-size:13px;line-height:18px}.social-action{margin:15px}.social-avatar{padding:15px 15px 0 15px}.social-comment .social-comment{margin-left:45px}.social-avatar img{height:40px;width:40px;margin-right:10px}.social-avatar .media-body a{font-size:14px;display:block}.social-body{padding:15px}.social-body img{margin-bottom:10px}.social-footer{border-top:1px solid #e7eaec;padding:10px 15px;background:#f9f9f9}.social-footer .social-comment img{width:32px;margin-right:10px}.social-comment:first-child{margin-top:0}.social-comment{margin-top:15px}.social-comment textarea{font-size:12px}@media(max-width :1000px){.welcome-message{display:none}}.echarts{height:240px}.checkbox-inline,.radio-inline,.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin:0 15px 0 0;font-size:14px}.navbar-toggle{background-color:#fff}.menuTab{-webkit-transition:all .3s ease-out 0s;transition:all .3s ease-out 0s}@media only screen and (-webkit-min-device-pixel-ratio :2){#content-main{-webkit-overflow-scrolling:touch}}.navbar-header{height:50px}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{color:#fff;background-color:#1ab394}@media(min-width :768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.t-bar{padding-bottom:10px}.nopadding{padding:0}.note-editor .btn-default{color:#333!important;background-color:#fff!important;border-color:#ccc!important}.folder-list li.active a{color:#2791df;background:#f5f5f5}nav .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent;-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;height:50px;font-size:20px;line-height:50px;text-align:center;width:200px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.logo-mini{display:none}.logo-lg{display:block}.roleList{color:#d5d5d5;margin-right:10px;padding-top:10px;line-height:1;white-space:nowrap;overflow:hidden;width:110px}.sidebar-collapse .user-panel{white-space:nowrap;position:relative;width:100%;padding:15px;overflow:hidden}.sidebar-collapse .user-panel .image>img{width:100%;max-width:45px;height:auto}.sidebar-collapse .user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.sidebar-collapse .user-panel>.info a{color:#fff;font-size:12px}.sidebar-collapse .user-panel>.info>p{font-weight:600;margin-bottom:9px;color:#fff;font-size:12px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.nav>li:hover .dropdown-menu{display:block}#content-main.max{height:calc(100% - 110px);overflow:hidden;width:100%;height:100%;left:0;position:absolute;top:0;z-index:9998;margin:0}
h1,h2,h3,h4,h5,h6{font-weight:100}h1{font-size:30px}h2{font-size:24px}h3{font-size:16px}h4{font-size:14px}h5{font-size:12px}h6{font-size:10px}h3,h4,h5{margin-top:5px;font-weight:600}a:focus{outline:0}.nav>li>a{color:#a7b1c2;font-weight:600;padding:14px 20px 14px 25px}.nav li>a{display:block}.nav.navbar-right>li>a,.nav.navbar-left>li>a{color:#fff;font-size:14px;height:50px;padding:15px 15px}.nav>li.active>a{color:#fff}.nav.navbar-right>li>a>.label,.nav.navbar-left>li>a>.label{position:absolute;top:9px;right:5px;text-align:center;font-size:9px;padding:2px 4px;line-height:.9}.nav.navbar-right>li>a:hover,.nav.navbar-left>li>a:hover{background-color:#367fa9;color:#fff}.navbar-default .nav>li>a:hover,.navbar-default .nav>li>a:focus{background-color:#293846;color:white}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background:#fff}.navbar{border:0}.navbar-default{background-color:transparent;border-color:#2f4050;position:relative}.nav.navbar-top-links li{display:inline-block}.navbar-top-links li:last-child{margin-right:16px}body.body-small .navbar-top-links li:last-child{margin-right:10px}.navbar-top-links li a{padding:20px 10px;min-height:50px}.dropdown-menu{border:medium none;display:none;float:left;font-size:12px;left:0;list-style:none outside none;padding:0;position:absolute;text-shadow:none;top:100%;z-index:1000;border-radius:0;box-shadow:0 0 3px rgba(86,96,117,0.3)}.dropdown-menu>li>a{border-radius:3px;color:inherit;line-height:25px;margin:4px;text-align:left;font-weight:normal}.dropdown-menu>li>a.font-bold{font-weight:600}.navbar-top-links .dropdown-menu li{display:block}.navbar-top-links .dropdown-menu li:last-child{margin-right:0}.navbar-top-links .dropdown-menu li a{padding:3px 20px;min-height:0}.navbar-top-links .dropdown-menu li a div{white-space:normal}.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{width:310px;min-width:0}.navbar-top-links .dropdown-messages{margin-left:5px}.navbar-top-links .dropdown-tasks{margin-left:-59px}.navbar-top-links .dropdown-alerts{margin-left:-123px}.navbar-top-links .dropdown-user{right:0;left:auto}.dropdown-messages,.dropdown-alerts{padding:10px 10px 10px 10px}.dropdown-messages li a,.dropdown-alerts li a{font-size:12px}.dropdown-messages li em,.dropdown-alerts li em{font-size:10px}.nav.navbar-top-links .dropdown-alerts a{font-size:12px}.nav>li.active{border-left:4px solid #19aa8d;background:#293846}.nav.nav-second-level>li.active{border:0}.nav.nav-second-level.collapse[style]{height:auto!important}.nav-header a{color:#dfe4ed}.nav-header .text-muted{color:#8095a8}.minimalize-styl-2{padding:4px 12px;margin:12px 5px 5px 15px;font-size:14px;float:left}.navbar-form-custom{float:left;height:50px;padding:0;width:200px;display:inline-table}.navbar-form-custom .form-group{margin-bottom:0}.nav.navbar-top-links a{font-size:14px}.navbar-form-custom .form-control{background:none repeat scroll 0 0 rgba(0,0,0,0);border:medium none;font-size:14px;height:60px;margin:0;z-index:2000}.count-info .label{line-height:12px;padding:1px 5px;position:absolute;right:6px;top:12px}.arrow{float:right;margin-top:2px}.fa.arrow:before{content:"\f104"}.active>a>.fa.arrow:before{content:"\f107"}.nav-second-level li,.nav-third-level li{border-bottom:none!important;padding-left:2px;padding-right:2px}.nav-second-level li a{padding:7px 15px 7px 10px;padding-left:52px}.nav-third-level li a{padding-left:70px}.nav-second-level li:last-child{margin-bottom:10px}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover>.nav-second-level,.mini-navbar .nav li:focus>.nav-second-level{display:block;border-radius:0 2px 2px 0;min-width:140px;height:auto}body.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:12px;border-radius:0 2px 2px 0}body.mini-navbar .navbar-default .nav>li>.nav-third-level li a{padding-left:31px}.fixed-nav .slimScrollDiv #side-menu{padding-bottom:60px;position:relative}.fixed-sidebar.mini-navbar .slimScrollDiv>*{overflow:visible!important}.fixed-sidebar .slimScrollDiv>*{overflow-y:hidden;overflow-x:visible}.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.canvas-menu.mini-navbar .nav-second-level{background:#293846}.mini-navbar li.active .nav-second-level{left:65px}.navbar-default .special_link a{background:#1ab394;color:white}.navbar-default .special_link a:hover{background:#17987e!important;color:white}.navbar-default .special_link a span.label{background:#fff;color:#1ab394}.navbar-default .landing_link a{background:#1cc09f;color:white}.navbar-default .landing_link a:hover{background:#1ab394!important;color:white}.navbar-default .landing_link a span.label{background:#fff;color:#1cc09f}.logo-element{text-align:center;font-size:18px;font-weight:600;color:white;display:none;padding:18px 0}.navbar-fixed-top{background:#fff;-webkit-transition-duration:.5s;transition-duration:.5s;z-index:2030}.fixed-nav #wrapper{padding-top:60px;box-sizing:border-box}.fixed-nav .minimalize-styl-2{margin:14px 5px 5px 15px}.body-small .navbar-fixed-top{margin-left:0}body.mini-navbar .navbar-static-side{width:70px}body.mini-navbar .profile-element,body.mini-navbar .nav-label,body.mini-navbar .navbar-default .nav li a span{display:none}body.canvas-menu .profile-element{display:block}body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level{display:none}body.mini-navbar .navbar-default .nav>li>a{font-size:16px}body.mini-navbar .logo-element{display:block}body.canvas-menu .logo-element{display:none}body.mini-navbar .nav-header{padding:0;background-color:#1ab394}body.canvas-menu .nav-header{padding:33px 25px}body.mini-navbar #page-wrapper{margin:0 0 0 70px}body.canvas-menu.mini-navbar #page-wrapper,body.canvas-menu.mini-navbar .footer{margin:0}body.fixed-sidebar .navbar-static-side,body.canvas-menu .navbar-static-side{position:fixed;width:200px;z-index:2001;height:100%}body.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}body.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 70px}body.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 0 0 70px}body.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}.fixed-sidebar.mini-navbar .nav li>.nav-second-level{display:none}.fixed-sidebar.mini-navbar .nav li.active{border-left-width:0}.fixed-sidebar.mini-navbar .nav li:hover>a>span.nav-label{top:0;padding:10px 10px 10px 10px;text-align:center;background-color:#243747}.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level{top:40px;font-size:12px;background-color:#2f4050}.fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level,.fixed-sidebar.mini-navbar .nav li:hover>a>span.nav-label{position:absolute;left:70px;display:block;min-width:140px;border-radius:2px}.fixed-sidebar.mini-navbar .nav li.active:hover>.nav-second-level,.fixed-sidebar.mini-navbar .nav li.active:hover>a>span.nav-label{left:67px}.fixed-sidebar.mini-navbar .nav .nav-second-level a>span,.fixed-sidebar.mini-navbar .nav .nav-third-level a>span{display:inline-block}body.fixed-sidebar.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:12px;border-radius:3px}body.canvas-menu.mini-navbar .navbar-default .nav>li>.nav-second-level li a{font-size:13px;border-radius:3px}.fixed-sidebar.mini-navbar .nav-second-level li a,.canvas-menu.mini-navbar .nav-second-level li a{padding:10px 10px 10px 15px}.fixed-sidebar.mini-navbar .nav-second-level,.canvas-menu.mini-navbar .nav-second-level{position:relative;padding:0;font-size:13px}.fixed-sidebar.mini-navbar li.active .nav-second-level,.canvas-menu.mini-navbar li.active .nav-second-level{left:0}body.canvas-menu nav.navbar-static-side{z-index:2001;background:#2f4050;height:100%;position:fixed;display:none}body.canvas-menu.mini-navbar nav.navbar-static-side{display:block;width:70px}.top-navigation #page-wrapper{margin-left:0}.top-navigation .navbar-nav .dropdown-menu>.active>a{background:white;color:#1ab394;font-weight:bold}.white-bg .navbar-fixed-top,.white-bg .navbar-static-top{background:#fff}.top-navigation .navbar{margin-bottom:0}.top-navigation .nav>li>a{padding:15px 20px;color:#676a6c}.top-navigation .nav>li a:hover,.top-navigation .nav>li a:focus{background:#fff;color:#1ab394}.top-navigation .nav>li.active{background:#fff;border:0}.top-navigation .nav>li.active>a{color:#1ab394}.top-navigation .navbar-right{padding-right:10px}.top-navigation .navbar-nav .dropdown-menu{box-shadow:none;border:1px solid #e7eaec}.top-navigation .dropdown-menu>li>a{margin:0;padding:7px 20px}.navbar .dropdown-menu{margin-top:0}.top-navigation .navbar-brand{background:#1ab394;color:#fff;padding:15px 25px}.top-navigation .navbar-top-links li:last-child{margin-right:0}.top-navigation.mini-navbar #page-wrapper,.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper,.mini-navbar .top-navigation #page-wrapper,.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper,.canvas-menu #page-wrapper{margin:0}.top-navigation.fixed-nav #wrapper,.fixed-nav #wrapper.top-navigation{margin-top:50px}.top-navigation .footer.fixed{margin-left:0!important}.top-navigation .wrapper.wrapper-content{padding:40px}.top-navigation.body-small .wrapper.wrapper-content,.body-small .top-navigation .wrapper.wrapper-content{padding:40px 0 40px 0}.navbar-toggle{background-color:#1ab394;color:#fff;padding:6px 12px;font-size:14px}.top-navigation .navbar-nav .open .dropdown-menu>li>a,.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header{padding:10px 15px 10px 20px}@media(max-width :768px){.top-navigation .navbar-header{display:block;float:none}}.menu-visible-lg,.menu-visible-md{display:none!important}@media(min-width :1200px){.menu-visible-lg{display:block!important}}@media(min-width :992px){.menu-visible-md{display:block!important}}@media(max-width :767px){.menu-visible-md{display:block!important}.menu-visible-lg{display:block!important}}.btn{border-radius:3px}.float-e-margins .btn{margin-bottom:5px}.btn-w-m{min-width:120px}.btn-primary.btn-outline{color:#1ab394}.btn-success.btn-outline{color:#1c84c6}.btn-info.btn-outline{color:#23c6c8}.btn-warning.btn-outline{color:#f8ac59}.btn-danger.btn-outline{color:#ed5565}.btn-primary.btn-outline:hover,.btn-success.btn-outline:hover,.btn-info.btn-outline:hover,.btn-warning.btn-outline:hover,.btn-danger.btn-outline:hover{color:#fff}.btn-primary{background-color:#1ab394;border-color:#1ab394;color:#fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-color:#18a689;border-color:#18a689;color:#fff}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary.active[disabled],fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#1dc5a3;border-color:#1dc5a3}.btn-success{background-color:#1c84c6;border-color:#1c84c6;color:#fff}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-color:#1a7bb9;border-color:#1a7bb9;color:#fff}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled:hover,.btn-success.disabled:focus,.btn-success.disabled:active,.btn-success.disabled.active,.btn-success[disabled],.btn-success[disabled]:hover,.btn-success[disabled]:focus,.btn-success[disabled]:active,.btn-success.active[disabled],fieldset[disabled] .btn-success,fieldset[disabled] .btn-success:hover,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success.active{background-color:#1f90d8;border-color:#1f90d8}.btn-info{background-color:#23c6c8;border-color:#23c6c8;color:#fff}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-color:#21b9bb;border-color:#21b9bb;color:#fff}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info.active[disabled],fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#26d7d9;border-color:#26d7d9}.btn-default{background-color:#f4f4f4;border-color:#ddd;color:#444}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-color:#e7e7e7;border-color:#e7e7e7;color:#444}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default.active[disabled],fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:#ccc;border-color:#ccc}.btn-warning{background-color:#f8ac59;border-color:#f8ac59;color:#fff}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-color:#f7a54a;border-color:#f7a54a;color:#fff}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning.active[disabled],fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#f9b66d;border-color:#f9b66d}.btn-danger{background-color:#ed5565;border-color:#ed5565;color:#fff}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-color:#ec4758;border-color:#ec4758;color:#fff}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger.active[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#ef6776;border-color:#ef6776}.btn-link{color:inherit}.btn-link:hover,.btn-link:focus,.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{color:#1ab394;text-decoration:none}.btn-link:active,.btn-link.active,.open .dropdown-toggle.btn-link{background-image:none}.btn-link.disabled,.btn-link.disabled:hover,.btn-link.disabled:focus,.btn-link.disabled:active,.btn-link.disabled.active,.btn-link[disabled],.btn-link[disabled]:hover,.btn-link[disabled]:focus,.btn-link[disabled]:active,.btn-link.active[disabled],fieldset[disabled] .btn-link,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:active,fieldset[disabled] .btn-link.active{color:#cacaca}.btn-white{color:inherit;background:white;border:1px solid #e7eaec}.btn-white:hover,.btn-white:focus,.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{color:inherit;border:1px solid #d2d2d2}.btn-white:active,.btn-white.active{box-shadow:0 2px 5px rgba(0,0,0,0.15) inset}.btn-white:active,.btn-white.active,.open .dropdown-toggle.btn-white{background-image:none}.btn-white.disabled,.btn-white.disabled:hover,.btn-white.disabled:focus,.btn-white.disabled:active,.btn-white.disabled.active,.btn-white[disabled],.btn-white[disabled]:hover,.btn-white[disabled]:focus,.btn-white[disabled]:active,.btn-white.active[disabled],fieldset[disabled] .btn-white,fieldset[disabled] .btn-white:hover,fieldset[disabled] .btn-white:focus,fieldset[disabled] .btn-white:active,fieldset[disabled] .btn-white.active{color:#cacaca}.form-control,.has-error .form-control:focus,.has-success .form-control:focus,.has-warning .form-control:focus,.navbar-collapse,.navbar-form,.navbar-form-custom .form-control:focus,.navbar-form-custom .form-control:hover,.open .btn.dropdown-toggle,.panel,.popover,.progress,.progress-bar{box-shadow:none}.btn-outline{color:inherit;background-color:transparent;-webkit-transition:all .5s;transition:all .5s}.btn-rounded{border-radius:50px}.btn-large-dim{width:90px;height:90px;font-size:42px}button.dim{display:inline-block;color:#fff;text-decoration:none;text-transform:uppercase;text-align:center;padding-top:6px;margin-right:10px;position:relative;cursor:pointer;border-radius:5px;font-weight:600;margin-bottom:20px!important}button.dim:active{top:3px}button.btn-primary.dim{box-shadow:inset 0 0 0 #16987e,0px 5px 0 0 #16987e,0px 10px 5px #999}button.btn-primary.dim:active{box-shadow:inset 0 0 0 #16987e,0px 2px 0 0 #16987e,0px 5px 3px #999}button.btn-default.dim{box-shadow:inset 0 0 0 #b3b3b3,0px 5px 0 0 #b3b3b3,0px 10px 5px #999}button.btn-default.dim:active{box-shadow:inset 0 0 0 #b3b3b3,0px 2px 0 0 #b3b3b3,0px 5px 3px #999}button.btn-warning.dim{box-shadow:inset 0 0 0 #f79d3c,0px 5px 0 0 #f79d3c,0px 10px 5px #999}button.btn-warning.dim:active{box-shadow:inset 0 0 0 #f79d3c,0px 2px 0 0 #f79d3c,0px 5px 3px #999}button.btn-info.dim{box-shadow:inset 0 0 0 #1eacae,0px 5px 0 0 #1eacae,0px 10px 5px #999}button.btn-info.dim:active{box-shadow:inset 0 0 0 #1eacae,0px 2px 0 0 #1eacae,0px 5px 3px #999}button.btn-success.dim{box-shadow:inset 0 0 0 #1872ab,0px 5px 0 0 #1872ab,0px 10px 5px #999}button.btn-success.dim:active{box-shadow:inset 0 0 0 #1872ab,0px 2px 0 0 #1872ab,0px 5px 3px #999}button.btn-danger.dim{box-shadow:inset 0 0 0 #ea394c,0px 5px 0 0 #ea394c,0px 10px 5px #999}button.btn-danger.dim:active{box-shadow:inset 0 0 0 #ea394c,0px 2px 0 0 #ea394c,0px 5px 3px #999}button.dim:before{font-size:50px;line-height:1em;font-weight:normal;color:#fff;display:block;padding-top:10px}button.dim:active:before{top:7px;font-size:50px}.label{background-color:#d1dade;color:#5e5e5e;font-size:10px;font-weight:600;padding:3px 8px;text-shadow:none}.badge{background-color:#d1dade;color:#5e5e5e;font-size:11px;font-weight:600;padding-bottom:4px;padding-left:6px;padding-right:6px;text-shadow:none}.label-primary,.badge-primary{background-color:#1ab394;color:#fff}.label-success,.badge-success{background-color:#1c84c6;color:#fff}.label-warning,.badge-warning{background-color:#f8ac59;color:#fff}.label-warning-light,.badge-warning-light{background-color:#f8ac59;color:#fff}.label-danger,.badge-danger{background-color:#ed5565;color:#fff}.label-info,.badge-info{background-color:#23c6c8;color:#fff}.label-inverse,.badge-inverse{background-color:#262626;color:#fff}.label-white,.badge-white{background-color:#fff;color:#5e5e5e}.label-white,.badge-disable{background-color:#2a2e36;color:#8b91a0}.onoffswitch{position:relative;width:64px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:2px}.onoffswitch-inner{width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{float:left;width:50%;height:20px;padding:0;line-height:20px;font-size:12px;color:white;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:"ON";padding-left:10px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:"OFF";padding-right:10px;background-color:#fff;color:#999;text-align:right}.onoffswitch-switch{width:20px;margin:0;background:#fff;border:2px solid #1ab394;border-radius:2px;position:absolute;top:0;bottom:0;right:44px;-webkit-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.chosen-container-single .chosen-single{background:#fff;box-shadow:none;-moz-box-sizing:border-box;background-color:#fff;border:1px solid #cbd5dd;border-radius:2px;cursor:text;height:auto!important;margin:0;min-height:30px;overflow:hidden;padding:4px 12px;position:relative;width:100%}.chosen-container-multi .chosen-choices li.search-choice{background:#f1f1f1;border:1px solid #ededed;border-radius:2px;box-shadow:none;color:#333;cursor:default;line-height:13px;margin:3px 0 3px 5px;padding:3px 20px 3px 5px;position:relative}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{background-color:#f4f4f4;border-color:#ddd;color:inherit;cursor:default;z-index:2}.pagination>li>a,.pagination>li>span{background-color:#fff;border:1px solid #ddd;color:inherit;float:left;line-height:1.42857;margin-left:-1px;padding:4px 10px;position:relative;text-decoration:none}.tooltip-inner{background-color:#2f4050;word-break:break-all;overflow-wrap:break-word}.tooltip.top .tooltip-arrow{border-top-color:#2f4050}.tooltip.right .tooltip-arrow{border-right-color:#2f4050}.tooltip.bottom .tooltip-arrow{border-bottom-color:#2f4050}.tooltip.left .tooltip-arrow{border-left-color:#2f4050}.easypiechart{position:relative;text-align:center}.easypiechart .h2{margin-left:10px;margin-top:10px;display:inline-block}.easypiechart canvas{top:0;left:0}.easypiechart .easypie-text{line-height:1;position:absolute;top:33px;width:100%;z-index:1}.easypiechart img{margin-top:-4px}.jqstooltip{box-sizing:content-box}.fc-state-default{background-color:#fff;background-image:none;background-repeat:repeat-x;box-shadow:none;color:#333;text-shadow:none}.fc-state-default{border:1px solid}.fc-button{color:inherit;border:1px solid #e7eaec;cursor:pointer;display:inline-block;height:1.9em;line-height:1.9em;overflow:hidden;padding:0 .6em;position:relative;white-space:nowrap}.fc-state-active{background-color:#1ab394;border-color:#1ab394;color:#fff}.fc-header-title h2{font-size:16px;font-weight:600;color:inherit}.fc-content .fc-widget-header,.fc-content .fc-widget-content{border-color:#e7eaec;font-weight:normal}.fc-border-separate tbody{background-color:#f8f8f8}.fc-state-highlight{background:none repeat scroll 0 0 #fcf8e3}.external-event{padding:5px 10px;border-radius:2px;cursor:pointer;margin-bottom:5px}.fc-ltr .fc-event-hori.fc-event-end,.fc-rtl .fc-event-hori.fc-event-start{border-radius:2px}.fc-event,.fc-agenda .fc-event-time,.fc-event a{padding:4px 6px;background-color:#1ab394;border-color:#1ab394}.fc-event-time,.fc-event-title{color:#717171;padding:0 1px}.ui-calendar .fc-event-time,.ui-calendar .fc-event-title{color:#fff}.chat-activity-list .chat-element{border-bottom:1px solid #e7eaec}.chat-element:first-child{margin-top:0}.chat-element{padding-bottom:15px}.chat-element,.chat-element .media{margin-top:15px}.chat-element,.media-body{overflow:hidden}.media-body{display:block;width:auto}.chat-element>.pull-left{margin-right:10px}.chat-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.chat-element .well{border:1px solid #e7eaec;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.chat-element .actions{margin-top:10px}.chat-element .photos{margin:10px 0}.right.chat-element>.pull-right{margin-left:10px}.chat-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.chat{margin:0;padding:0;list-style:none}.chat li{margin-bottom:10px;padding-bottom:5px;border-bottom:1px dotted #b3a9a9}.chat li.left .chat-body{margin-left:60px}.chat li.right .chat-body{margin-right:60px}.chat li .chat-body p{margin:0;color:#777}.panel .slidedown .glyphicon,.chat .glyphicon{margin-right:5px}.chat-panel .panel-body{height:350px;overflow-y:scroll}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{background-color:#1ab394;border-color:#1ab394;color:#fff;z-index:2}.list-group-item-heading{margin-top:10px}.list-group-item-text{margin:0 0 10px;color:inherit;font-size:12px;line-height:inherit}.no-padding .list-group-item{border-left:none;border-right:0;border-bottom:0}.no-padding .list-group-item:first-child{border-left:none;border-right:0;border-bottom:0;border-top:0}.no-padding .list-group{margin-bottom:0}.list-group-item{background-color:inherit;border:1px solid #e7eaec;display:block;margin-bottom:-1px;padding:10px 15px;position:relative}.elements-list .list-group-item{border-left:none;border-right:0;padding:15px 25px}.elements-list .list-group-item:first-child{border-left:none;border-right:0;border-top:none!important}.elements-list .list-group{margin-bottom:0}.elements-list a{color:inherit}.elements-list .list-group-item.active,.elements-list .list-group-item:hover{background:#f3f3f4;color:inherit;border-color:#e7eaec;border-radius:0}.elements-list li.active{-webkit-transition:none;transition:none}.element-detail-box{padding:25px}.flot-chart{display:block;height:200px}.widget .flot-chart.dashboard-chart{display:block;height:120px;margin-top:40px}.flot-chart.dashboard-chart{display:block;height:180px;margin-top:40px}.flot-chart-content{width:100%;height:100%}.flot-chart-pie-content{width:200px;height:200px;margin:auto}.jqstooltip{position:absolute;display:block;left:0;top:0;visibility:hidden;background:#2b303a;background-color:rgba(43,48,58,0.8);color:white;text-align:left;white-space:nowrap;z-index:10000;padding:5px 5px 5px 5px;min-height:22px;border-radius:3px}.jqsfield{color:white;text-align:left}.h-200{min-height:200px}.legendLabel{padding-left:5px}.stat-list li:first-child{margin-top:0}.stat-list{list-style:none;padding:0;margin:0}.stat-percent{float:right}.stat-list li{margin-top:15px;position:relative}table.dataTable thead .sorting,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background:transparent}table.dataTable thead .sorting_asc:after{float:right;font-family:fontawesome}table.dataTable thead .sorting_desc:after{content:"\f0dd";float:right;font-family:fontawesome}table.dataTable thead .sorting:after{content:"\f0dc";float:right;font-family:fontawesome;color:rgba(50,50,50,0.5)}.dataTables_wrapper{padding-bottom:30px}.img-circle{border-radius:50%}.btn-circle{width:30px;height:30px;padding:6px 0;border-radius:15px;text-align:center;font-size:12px;line-height:1.428571429}.btn-circle.btn-lg{width:50px;height:50px;padding:10px 16px;border-radius:25px;font-size:18px;line-height:1.33}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 16px;border-radius:35px;font-size:24px;line-height:1.33}.show-grid [class^="col-"]{padding-top:10px;padding-bottom:10px;border:1px solid #ddd;background-color:#eee!important}.show-grid{margin:15px 0}.css-animation-box h1{font-size:44px}.animation-efect-links a{padding:4px 6px;font-size:12px}#animation_box{background-color:#f9f8f8;border-radius:16px;width:80%;margin:0 auto;padding-top:80px}.animation-text-box{position:absolute;margin-top:40px;left:50%;margin-left:-100px;width:200px}.animation-text-info{position:absolute;margin-top:-60px;left:50%;margin-left:-100px;width:200px;font-size:10px}.animation-text-box h2{font-size:54px;font-weight:600;margin-bottom:5px}.animation-text-box p{font-size:12px;text-transform:uppercase}.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#1ab394;position:fixed;z-index:2000;top:0;width:100%;height:2px}.pace-inactive{display:none}.widget{border-radius:5px;padding:15px 20px;margin-bottom:10px;margin-top:10px}.widget.style1 h2{font-size:30px}.widget h2,.widget h3{margin-top:5px;margin-bottom:0}.widget-text-box{padding:20px;border:1px solid #e7eaec;background:#fff}.widget-head-color-box{border-radius:5px 5px 0 0;margin-top:10px}.widget .flot-chart{height:100px}.vertical-align div{display:inline-block;vertical-align:middle}.vertical-align h2,.vertical-align h3{margin:0}.todo-list{list-style:none outside none;margin:0;padding:0;font-size:14px}.todo-list.small-list{font-size:12px}.todo-list.small-list>li{background:#f3f3f4;border-left:none;border-right:0;border-radius:4px;color:inherit;margin-bottom:2px;padding:6px 6px 6px 12px}.todo-list.small-list .btn-xs,.todo-list.small-list .btn-group-xs>.btn{border-radius:5px;font-size:10px;line-height:1.5;padding:1px 2px 1px 5px}.todo-list>li{background:#f3f3f4;border-left:6px solid #e7eaec;border-right:6px solid #e7eaec;border-radius:4px;color:inherit;margin-bottom:2px;padding:10px}.todo-list .handle{cursor:move;display:inline-block;font-size:16px;margin:0 5px}.todo-list>li .label{font-size:9px;margin-left:10px}.check-link{font-size:16px}.todo-completed{text-decoration:line-through}.geo-statistic h1{font-size:36px;margin-bottom:0}.glyphicon.fa{font-family:"FontAwesome"}.inline{display:inline-block!important}.input-s-sm{width:120px}.input-s{width:200px}.input-s-lg{width:250px}.i-checks{padding-left:0}.form-control,.single-line{background:#fff none;border:1px solid #e5e6e7;border-radius:4px;color:inherit;display:block;padding:3px 6px 4px;-webkit-transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;transition:border-color .15s ease-in-out 0s,box-shadow .15s ease-in-out 0s;width:100%;height:31px;font-size:14px}.form-control.kv-fileinput-caption{height:34px!important}.form-control:focus,.single-line:focus{border-color:#3c8dbc!important}.has-success .form-control{border-color:#1ab394}.has-warning .form-control{border-color:#f8ac59}.has-error .form-control{border-color:#ed5565}.has-success .control-label{color:#1ab394}.has-warning .control-label{color:#f8ac59}.has-error .control-label{color:#ed5565}.input-group-addon{background-color:#fff;border:1px solid #e5e6e7;border-radius:4px;color:inherit;font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center}.spinner-buttons.input-group-btn .btn-xs{line-height:1.13}.spinner-buttons.input-group-btn{width:20%}.noUi-connect{background:none repeat scroll 0 0 #1ab394;box-shadow:none}.slider_red .noUi-connect{background:none repeat scroll 0 0 #ed5565;box-shadow:none}.ui-sortable .ibox-title{cursor:move}.ui-sortable-placeholder{border:1px dashed #cecece!important;visibility:visible!important;background:#e7eaec}.ibox.ui-sortable-placeholder{margin:0 0 23px!important}.tabs-container .panel-body{background:#fff;border:1px solid #e7eaec;border-radius:2px;padding:20px;position:relative}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #e7eaec;border-bottom-color:transparent;background-color:#fff}.tabs-container .nav-tabs>li{float:left;margin-bottom:-1px}.tabs-container .tab-pane .panel-body{border-top:0}.tabs-container .nav-tabs>li.active>a,.tabs-container .nav-tabs>li.active>a:hover,.tabs-container .nav-tabs>li.active>a:focus{border:1px solid #e7eaec;border-bottom-color:transparent}.tabs-container .nav-tabs{border-bottom:1px solid #e7eaec}.tabs-container .tab-pane .panel-body{border-top:0}.tabs-container .tabs-left .tab-pane .panel-body,.tabs-container .tabs-right .tab-pane .panel-body{border-top:1px solid #e7eaec}.tabs-container .nav-tabs>li a:hover{background:transparent;border-color:transparent}.tabs-container .tabs-below>.nav-tabs,.tabs-container .tabs-right>.nav-tabs,.tabs-container .tabs-left>.nav-tabs{border-bottom:0}.tabs-container .tabs-left .panel-body{position:static}.tabs-container .tabs-left>.nav-tabs,.tabs-container .tabs-right>.nav-tabs{width:20%}.tabs-container .tabs-left .panel-body{width:80%;margin-left:20%}.tabs-container .tabs-right .panel-body{width:80%;margin-right:20%}.tabs-container .tab-content>.tab-pane,.tabs-container .pill-content>.pill-pane{display:none}.tabs-container .tab-content>.active,.tabs-container .pill-content>.active{display:block}.tabs-container .tabs-below>.nav-tabs{border-top:1px solid #e7eaec}.tabs-container .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-container .tabs-below>.nav-tabs>li>a{border-radius:0 0 4px 4px}.tabs-container .tabs-below>.nav-tabs>li>a:hover,.tabs-container .tabs-below>.nav-tabs>li>a:focus{border-top-color:#e7eaec;border-bottom-color:transparent}.tabs-container .tabs-left>.nav-tabs>li,.tabs-container .tabs-right>.nav-tabs>li{float:none}.tabs-container .tabs-left>.nav-tabs>li>a,.tabs-container .tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-container .tabs-left>.nav-tabs{float:left;margin-right:19px}.tabs-container .tabs-left>.nav-tabs>li>a{margin-right:-1px;border-radius:4px 0 0 4px}.tabs-container .tabs-left>.nav-tabs .active>a,.tabs-container .tabs-left>.nav-tabs .active>a:hover,.tabs-container .tabs-left>.nav-tabs .active>a:focus{border-color:#e7eaec transparent #e7eaec #e7eaec;border-right-color:#fff}.tabs-container .tabs-right>.nav-tabs{float:right;margin-left:19px}.tabs-container .tabs-right>.nav-tabs>li>a{margin-left:-1px;border-radius:0 4px 4px 0}.tabs-container .tabs-right>.nav-tabs .active>a,.tabs-container .tabs-right>.nav-tabs .active>a:hover,.tabs-container .tabs-right>.nav-tabs .active>a:focus{border-color:#e7eaec #e7eaec #e7eaec transparent;border-left-color:#fff;z-index:1}.onoffswitch{position:relative;width:54px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch-checkbox{display:none}.onoffswitch-label{display:block;overflow:hidden;cursor:pointer;border:2px solid #1ab394;border-radius:3px}.onoffswitch-inner{display:block;width:200%;margin-left:-100%;-webkit-transition:margin .3s ease-in 0s;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;padding:0;font-size:10px;color:white;font-family:Trebuchet,Arial,sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:"ON";padding-left:7px;background-color:#1ab394;color:#fff}.onoffswitch-inner:after{content:"OFF";padding-right:7px;background-color:#fff;color:#919191;text-align:right}.onoffswitch-switch{display:block;width:18px;margin:0;background:#fff;border:2px solid #1ab394;border-radius:3px;position:absolute;top:0;bottom:0;right:36px;-webkit-transition:all .3s ease-in 0s;transition:all .3s ease-in 0s}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}.dd{position:relative;display:block;margin:0;padding:0;list-style:none;font-size:13px;line-height:20px}.dd-list{display:block;position:relative;margin:0;padding:0;list-style:none}.dd-list .dd-list{padding-left:30px}.dd-collapsed .dd-list{display:none}.dd-item,.dd-empty,.dd-placeholder{display:block;position:relative;margin:0;padding:0;min-height:20px;font-size:13px;line-height:20px}.dd-handle{display:block;margin:5px 0;padding:5px 10px;color:#333;text-decoration:none;border:1px solid #e7eaec;background:#f5f5f5;border-radius:3px;box-sizing:border-box;-moz-box-sizing:border-box}.dd-handle span{font-weight:bold}.dd-handle:hover{background:#f0f0f0;cursor:pointer;font-weight:bold}.dd-item>button{display:block;position:relative;cursor:pointer;float:left;width:25px;height:20px;margin:5px 0;padding:0;text-indent:100%;white-space:nowrap;overflow:hidden;border:0;background:transparent;font-size:12px;line-height:1;text-align:center;font-weight:bold}.dd-item>button:before{content:'+';display:block;position:absolute;width:100%;text-align:center;text-indent:0}.dd-item>button[data-action="collapse"]:before{content:'-'}#nestable2 .dd-item>button{font-family:FontAwesome;height:34px;width:33px;color:#c1c1c1}#nestable2 .dd-item>button:before{content:"\f067"}#nestable2 .dd-item>button[data-action="collapse"]:before{content:"\f068"}.dd-placeholder,.dd-empty{margin:5px 0;padding:0;min-height:30px;background:#f2fbff;border:1px dashed #b6bcbf;box-sizing:border-box;-moz-box-sizing:border-box}.dd-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-size:60px 60px;background-position:0 0,30px 30px}.dd-dragel{position:absolute;z-index:9999;pointer-events:none}.dd-dragel>.dd-item .dd-handle{margin-top:0}.dd-dragel .dd-handle{box-shadow:2px 4px 6px 0 rgba(0,0,0,0.1)}.nestable-lists{display:block;clear:both;padding:30px 0;width:100%;border:0;border-top:2px solid #ddd;border-bottom:2px solid #ddd}#nestable-menu{padding:0;margin:10px 0 20px 0}#nestable-output,#nestable2-output{width:100%;font-size:.75em;line-height:1.333333em;font-family:lucida grande,lucida sans unicode,helvetica,arial,sans-serif;padding:5px;box-sizing:border-box;-moz-box-sizing:border-box}#nestable2 .dd-handle{color:inherit;border:1px dashed #e7eaec;background:#f3f3f4;padding:10px}#nestable2 span.label{margin-right:10px}#nestable-output,#nestable2-output{font-size:12px;padding:25px;box-sizing:border-box;-moz-box-sizing:border-box}.CodeMirror{border:1px solid #eee;height:auto}.CodeMirror-scroll{overflow-y:hidden;overflow-x:auto}.google-map{height:300px}.gridStyle{border:1px solid #d4d4d4;width:100%;height:400px}.gridStyle2{border:1px solid #d4d4d4;width:500px;height:300px}.ngH eaderCell{border-right:0;border-bottom:1px solid #e7eaec}.ngCell{border-right:0}.ngTopPanel{background:#f5f5f6}.ngRow.even{background:#f9f9f9}.ngRow.selected{background:#ebf2f1}.ngRow{border-bottom:1px solid #e7eaec}.ngCell{background-color:transparent}.ngHeaderCell{border-right:0}#toast-container>.toast{background-image:none!important}#toast-container>.toast:before{position:fixed;font-family:FontAwesome;font-size:24px;line-height:24px;float:left;color:#FFF;padding-right:.5em;margin:auto .5em auto -1.5em}#toast-container>div{box-shadow:0 0 3px #999;opacity:.9;-ms-filter:alpha(opacity = 90);filter:alpha(opacity = 90)}#toast-container>:hover{box-shadow:0 0 4px #999;opacity:1;-ms-filter:alpha(opacity = 100);filter:alpha(opacity = 100);cursor:pointer}.toast{background-color:#1ab394}.toast-success{background-color:#1ab394}.toast-error{background-color:#ed5565}.toast-info{background-color:#23c6c8}.toast-warning{background-color:#f8ac59}.toast-top-full-width{margin-top:20px}.toast-bottom-full-width{margin-bottom:20px}.img-container,.img-preview{overflow:hidden;text-align:center;width:100%}.img-preview-sm{height:130px;width:200px}.forum-post-container .media{margin:10px 10px 10px 10px;padding:20px 10px 20px 10px;border-bottom:1px solid #f1f1f1}.forum-avatar{float:left;margin-right:20px;text-align:center;width:110px}.forum-avatar .img-circle{height:48px;width:48px}.author-info{color:#676a6c;font-size:11px;margin-top:5px;text-align:center}.forum-post-info{padding:9px 12px 6px 12px;background:#f9f9f9;border:1px solid #f1f1f1}.media-body>.media{background:#f9f9f9;border-radius:3px;border:1px solid #f1f1f1}.forum-post-container .media-body .photos{margin:10px 0}.forum-photo{max-width:140px;border-radius:3px}.media-body>.media .forum-avatar{width:70px;margin-right:10px}.media-body>.media .forum-avatar .img-circle{height:38px;width:38px}.mid-icon{font-size:66px}.forum-item{margin:10px 0;padding:10px 0 20px;border-bottom:1px solid #f1f1f1}.views-number{font-size:24px;line-height:18px;font-weight:400}.forum-container,.forum-post-container{padding:30px!important}.forum-item small{color:#999}.forum-item .forum-sub-title{color:#999;margin-left:50px}.forum-title{margin:15px 0 15px 0}.forum-info{text-align:center}.forum-desc{color:#999}.forum-icon{float:left;width:30px;margin-right:20px;text-align:center}a.forum-item-title{color:inherit;display:block;font-size:18px;font-weight:600}a.forum-item-title:hover{color:inherit}.forum-icon .fa{font-size:30px;margin-top:8px;color:#9b9b9b}.forum-item.active .fa{color:#1ab394}.forum-item.active a.forum-item-title{color:#1ab394}@media(max-width :992px){.forum-info{margin:15px 0 10px 0;display:none}.forum-desc{float:none!important}}.vertical-container{width:90%;max-width:1170px;margin:0 auto}.vertical-container::after{content:'';display:table;clear:both}#vertical-timeline{position:relative;padding:0;margin-top:2em;margin-bottom:2em}#vertical-timeline::before{content:'';position:absolute;top:0;left:18px;height:100%;width:4px;background:#f1f1f1}.vertical-timeline-content .btn{float:right}#vertical-timeline.light-timeline:before{background:#e7eaec}.dark-timeline .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}.dark-timeline.center-orientation .vertical-timeline-content:before{border-color:transparent transparent transparent #f5f5f5}.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before,.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}.dark-timeline .vertical-timeline-content,.dark-timeline.center-orientation .vertical-timeline-content{background:#f5f5f5}@media only screen and (min-width:1170px){#vertical-timeline.center-orientation{margin-top:3em;margin-bottom:3em}#vertical-timeline.center-orientation:before{left:50%;margin-left:-2px}}@media only screen and (max-width:1170px){.center-orientation.dark-timeline .vertical-timeline-content:before{border-color:transparent #f5f5f5 transparent transparent}}.vertical-timeline-block{position:relative;margin:2em 0}.vertical-timeline-block:after{content:"";display:table;clear:both}.vertical-timeline-block:first-child{margin-top:0}.vertical-timeline-block:last-child{margin-bottom:0}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-block{margin:4em 0}.center-orientation .vertical-timeline-block:first-child{margin-top:0}.center-orientation .vertical-timeline-block:last-child{margin-bottom:0}}.vertical-timeline-icon{position:absolute;top:0;left:0;width:40px;height:40px;border-radius:50%;font-size:16px;border:3px solid #f1f1f1;text-align:center}.vertical-timeline-icon i{display:block;width:24px;height:24px;position:relative;left:50%;top:50%;margin-left:-12px;margin-top:-9px}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-icon{width:50px;height:50px;left:50%;margin-left:-25px;-webkit-transform:translateZ(0);-webkit-backface-visibility:hidden;font-size:19px}.center-orientation .vertical-timeline-icon i{margin-left:-12px;margin-top:-10px}.center-orientation .cssanimations .vertical-timeline-icon.is-hidden{visibility:hidden}}.vertical-timeline-content{position:relative;margin-left:60px;background:white;border-radius:.25em;padding:1em}.vertical-timeline-content:after{content:"";display:table;clear:both}.vertical-timeline-content h2{font-weight:400;margin-top:4px}.vertical-timeline-content p{margin:1em 0;line-height:1.6}.vertical-timeline-content .vertical-date{float:left;font-weight:500}.vertical-date small{color:#1ab394;font-weight:400}.vertical-timeline-content::before{content:'';position:absolute;top:16px;right:100%;height:0;width:0;border:7px solid transparent;border-right:7px solid white}@media only screen and (min-width:768px){.vertical-timeline-content h2{font-size:18px}.vertical-timeline-content p{font-size:13px}}@media only screen and (min-width:1170px){.center-orientation .vertical-timeline-content{margin-left:0;padding:1.6em;width:45%}.center-orientation .vertical-timeline-content::before{top:24px;left:100%;border-color:transparent;border-left-color:white}.center-orientation .vertical-timeline-content .btn{float:left}.center-orientation .vertical-timeline-content .vertical-date{position:absolute;width:100%;left:122%;top:2px;font-size:14px}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before{top:24px;left:auto;right:100%;border-color:transparent;border-right-color:white}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn{float:right}.center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date{left:auto;right:122%;text-align:right}.center-orientation .cssanimations .vertical-timeline-content.is-hidden{visibility:hidden}}.sidebard-panel{width:220px;background:#ebebed;padding:10px 20px;position:absolute;right:0}.sidebard-panel .feed-element img.img-circle{width:32px;height:32px}.sidebard-panel .feed-element,.media-body,.sidebard-panel p{font-size:12px}.sidebard-panel .feed-element{margin-top:20px;padding-bottom:0}.sidebard-panel .list-group{margin-bottom:10px}.sidebard-panel .list-group .list-group-item{padding:5px 0;font-size:12px;border:0}.sidebar-content .wrapper,.wrapper.sidebar-content{padding-right:240px!important}#right-sidebar{background-color:#fff;border-left:1px solid #e7eaec;border-top:1px solid #e7eaec;overflow:hidden;position:fixed;top:60px;width:260px!important;z-index:1009;bottom:0;right:-260px}#right-sidebar.sidebar-open{right:0}#right-sidebar.sidebar-open.sidebar-top{top:0;border-top:0}.sidebar-container ul.nav-tabs{border:0}.sidebar-container ul.nav-tabs.navs-4 li{width:25%}.sidebar-container ul.nav-tabs.navs-3 li{width:33.3333%}.sidebar-container ul.nav-tabs.navs-2 li{width:50%}.sidebar-container ul.nav-tabs li{border:0}.sidebar-container ul.nav-tabs li a{border:0;padding:12px 10px;margin:0;border-radius:0;background:#2f4050;color:#fff;text-align:center;border-right:1px solid #334556}.sidebar-container ul.nav-tabs li.active a{border:0;background:#f9f9f9;color:#676a6c;font-weight:bold}.sidebar-container .nav-tabs>li.active>a:hover,.sidebar-container .nav-tabs>li.active>a:focus{border:0}.sidebar-container ul.sidebar-list{margin:0;padding:0}.sidebar-container ul.sidebar-list li{border-bottom:1px solid #e7eaec;padding:15px 20px;list-style:none;font-size:12px}.sidebar-container .sidebar-message:nth-child(2n+2){background:#f9f9f9}.sidebar-container ul.sidebar-list li a{text-decoration:none;color:inherit}.sidebar-container .sidebar-content{padding:15px 20px;font-size:12px}.sidebar-container .sidebar-title{background:#f9f9f9;padding:20px;border-bottom:1px solid #e7eaec}.sidebar-container .sidebar-title h3{margin-bottom:3px;padding-left:2px}.sidebar-container .tab-content h4{margin-bottom:5px}.sidebar-container .sidebar-message>a>.pull-left{margin-right:10px}.sidebar-container .sidebar-message>a{text-decoration:none;color:inherit}.sidebar-container .sidebar-message{padding:15px 20px}.sidebar-container .sidebar-message .message-avatar{height:38px;width:38px;border-radius:50%}.sidebar-container .setings-item{padding:15px 20px;border-bottom:1px solid #e7eaec}body{font-family:"open sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;color:#676a6c;overflow-x:hidden}html,body{height:100%}body.full-height-layout #wrapper,body.full-height-layout #page-wrapper{height:100%}#page-wrapper{min-height:auto}body.boxed-layout #wrapper{background-color:#2f4050;max-width:1200px;margin:0 auto}.top-navigation.boxed-layout #wrapper,.boxed-layout #wrapper.top-navigation{max-width:1300px!important}.block{display:block}.clear{display:block;overflow:hidden}a{cursor:pointer}a:hover,a:focus{text-decoration:none}.border-bottom{border-bottom:1px solid #e7eaec!important}.font-bold{font-weight:600}.font-noraml{font-weight:400}.text-uppercase{text-transform:uppercase}.b-r{border-right:1px solid #e7eaec}.hr-line-dashed{border-top:1px dashed #e7eaec;color:#fff;background-color:#fff;height:1px;margin:20px 0}.hr-line-solid{border-bottom:1px solid #e7eaec;background-color:rgba(0,0,0,0);border-style:solid!important;margin-top:15px;margin-bottom:15px}video{width:100%!important;height:auto!important}.gallery>.row>div{margin-bottom:15px}.fancybox img{margin-bottom:5px;width:24%}.note-editor{height:auto!important;min-height:100px;border:solid 1px #e5e6e7}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,0);border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,0.3);outline:0 none}.modal-dialog{z-index:1200}.modal-body{padding:20px 30px 30px 30px}.inmodal .modal-body{background:#f8fafb}.inmodal .modal-header{padding:30px 15px;text-align:center}.animated.modal.fade .modal-dialog{-webkit-transform:none;-ms-transform:none;transform:none}.inmodal .modal-title{font-size:26px}.inmodal .modal-icon{font-size:84px;color:#e2e3e3}.modal-footer{margin-top:0}#wrapper{width:100%;overflow-x:hidden;background-color:#2f4050}.wrapper{padding:0 20px}.wrapper-content{padding:20px}#page-wrapper{padding:0 15px;position:inherit;margin:0 0 0 200px}.title-action{text-align:right;padding-top:30px}.ibox-content h1,.ibox-content h2,.ibox-content h3,.ibox-content h4,.ibox-content h5,.ibox-title h1,.ibox-title h2,.ibox-title h3,.ibox-title h4,.ibox-title h5{margin-top:5px}ul.unstyled,ol.unstyled{list-style:none outside none;margin-left:0}.big-icon{font-size:160px;color:#e5e6e7}.footer{background:none repeat scroll 0 0 white;border-top:1px solid #e7eaec;overflow:hidden;padding:10px 20px;margin:0 -15px;height:36px}.footer.fixed_full{position:fixed;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:white;border-top:1px solid #e7eaec}.footer.fixed{position:fixed;bottom:0;left:0;right:0;z-index:1000;padding:10px 20px;background:white;border-top:1px solid #e7eaec;margin-left:220px}body.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 0 0 70px}body.mini-navbar.canvas-menu .footer.fixed,body.canvas-menu .footer.fixed{margin:0!important}body.fixed-sidebar.body-small.mini-navbar .footer.fixed{margin:0 0 0 220px}body.body-small .footer.fixed{margin-left:0}.page-heading{border-top:0;padding:0 20px 20px}.panel-heading h1,.panel-heading h2{margin-bottom:5px}.content-tabs{position:relative;height:39px;background:#fafafa;line-height:39px}.content-tabs .roll-nav,.page-tabs-list{position:absolute;width:30px;height:38px;text-align:center;color:#999;z-index:2;top:0}.content-tabs .roll-left{left:0;border-right:solid 1px #eee}.content-tabs .roll-right{right:0;border-left:solid 1px #eee}.content-tabs button{background:#fff;border:0;height:40px;width:40px;outline:0}.content-tabs button:hover{background:#fafafa}nav.page-tabs{margin-left:30px;width:100000px;height:39px;overflow:hidden}nav.page-tabs .page-tabs-content{float:left}.page-tabs a{display:block;float:left;border-right:solid 1px #eee;padding:0 15px}.page-tabs a i:hover{color:#c00}.page-tabs a:hover,.content-tabs .roll-nav:hover{color:#777;background:#f2f2f2;cursor:pointer}.roll-right.tabRight{right:60px}.roll-right.btn-group{right:60px;width:80px;padding:0}.roll-right.btn-group button{width:80px}.roll-right.tabReload{background:#fff;height:38px;width:60px;outline:0}.dropdown-menu-right{left:auto}#content-main{height:calc(100% - 127px);overflow:hidden}.tagsview-hide#content-main{height:calc(100% - 88px);overflow:hidden}.footer-hide#content-main{height:calc(100% - 91px);overflow:hidden}.tagsview-footer-hide#content-main{height:calc(100% - 52px);overflow:hidden}.fixed-nav #content-main{height:calc(100% - 80px);overflow:hidden}.table-bordered{border:1px solid #ebebeb}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{background-color:#f5f5f6;border-bottom-width:1px}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #e7e7e7}.table>thead>tr>th{border-bottom:1px solid #ddd;vertical-align:bottom}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{border-top:1px solid #e7eaec;line-height:1.42857;padding:8px;vertical-align:middle}.panel.blank-panel{background:0;margin:0}.blank-panel .panel-heading{padding-bottom:0}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background:0;border-color:#ddd #ddd rgba(0,0,0,0);border-bottom:#f3f3f4;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid;border-width:1px;color:#555;cursor:default}.nav.nav-tabs li{background:0;border:0}.nav-tabs>li>a{color:#a7b1c2;font-weight:600;padding:10px 20px 10px 25px}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{background-color:#e6e6e6;color:#676a6c}.ui-tab .tab-content{padding:20px 0}.no-padding{padding:0!important}.no-borders{border:none!important}.no-margins{margin:0!important}.no-top-border{border-top:0!important}.ibox-content.text-box{padding-bottom:0;padding-top:15px}.border-left-right{border-left:1px solid #e7eaec;border-right:1px solid #e7eaec;border-top:0;border-bottom:0}.border-left{border-left:1px solid #e7eaec;border-right:0;border-top:0;border-bottom:0}.border-right{border-left:none;border-right:1px solid #e7eaec;border-top:0;border-bottom:0}.full-width{width:100%!important}.link-block{font-size:12px;padding:10px}.nav.navbar-top-links .link-block a{font-size:12px}.link-block a{font-size:10px;color:inherit}body.mini-navbar .branding{display:none}img.circle-border{border:6px solid #fff;border-radius:50%}.branding{float:left;color:#fff;font-size:18px;font-weight:600;padding:17px 20px;text-align:center;background-color:#1ab394}.login-panel{margin-top:25%}.page-header{padding:20px 0 9px;margin:0 0 20px;border-bottom:1px solid #eee}.fontawesome-icon-list{margin-top:22px}.fontawesome-icon-list .fa-hover a{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;color:#222;line-height:32px;height:32px;padding-left:10px;border-radius:4px}.fontawesome-icon-list .fa-hover a .fa{width:32px;font-size:14px;display:inline-block;text-align:right;margin-right:10px}.fontawesome-icon-list .fa-hover a:hover{background-color:#1d9d74;color:#fff;text-decoration:none}.fontawesome-icon-list .fa-hover a:hover .fa{font-size:30px;vertical-align:-6px}.fontawesome-icon-list .fa-hover a:hover .text-muted{color:#bbe2d5}.feature-list .col-md-4{margin-bottom:22px}.feature-list h4 .fa:before{vertical-align:-10%;font-size:28px;display:inline-block;width:1.07142857em;text-align:center;margin-right:5px}.ui-draggable .ibox-title{cursor:move}.breadcrumb{background-color:#fff;padding:0;margin-bottom:0}.breadcrumb>li a{color:inherit}.breadcrumb>.active{color:inherit}code{background-color:#f9f2f4;border-radius:4px;color:#ca4440;font-size:90%;padding:2px 4px;white-space:nowrap}.ibox{clear:both;margin-bottom:25px;margin-top:0;padding:0}.ibox.collapsed .ibox-content{display:none}.ibox.collapsed .fa.fa-chevron-up:before{content:"\f078"}.ibox.collapsed .fa.fa-chevron-down:before{content:"\f077"}.ibox:after,.ibox:before{display:table}.ibox-title{-moz-border-bottom-colors:none;-moz-border-left-colors:none;-moz-border-right-colors:none;-moz-border-top-colors:none;background-color:#fff;border-color:#e7eaec;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid solid none;border-width:0;color:inherit;margin-bottom:0;padding:14px 15px 7px;min-height:40px}.ibox-content{background-color:#fff;color:inherit;padding:15px 20px 20px 20px;border-color:#e7eaec;-webkit-border-image:none;-o-border-image:none;border-image:none;border-style:solid solid none;border-width:1px 0}table.table-mail tr td{padding:12px}.table-mail .check-mail{padding-left:20px}.table-mail .mail-date{padding-right:20px}.star-mail,.check-mail{width:40px}.unread td a,.unread td{font-weight:600;color:inherit}.read td a,.read td{font-weight:normal;color:inherit}.unread td{background-color:#f9f8f8}.ibox-content{clear:both}.ibox-heading{background-color:#f3f6fb;border-bottom:0}.ibox-heading h3{font-weight:200;font-size:24px}.ibox-title h5{display:inline-block;font-size:14px;margin:0 0 7px;padding:0;text-overflow:ellipsis;float:left}.ibox-title .label{float:left;margin-left:4px}.ibox-tools{display:inline-block;float:right;margin-top:0;position:relative;padding:0}.ibox-tools a{cursor:pointer;margin-left:5px;color:#676a6c}.ibox-tools a.btn-primary{color:#fff}.ibox-tools .dropdown-menu>li>a{padding:4px 10px;font-size:12px}.ibox .open>.dropdown-menu{left:auto;right:0}.gray-bg{background-color:#f3f3f4}.white-bg{background-color:#fff}.navy-bg{background-color:#1ab394;color:#fff}.blue-bg{background-color:#1c84c6;color:#fff}.lazur-bg{background-color:#23c6c8;color:#fff}.yellow-bg{background-color:#f8ac59;color:#fff}.red-bg{background-color:#ed5565;color:#fff}.black-bg{background-color:#262626}.panel-primary{border-color:#1ab394}.panel-primary>.panel-heading{background-color:#1ab394;border-color:#1ab394}.panel-success{border-color:#1c84c6}.panel-success>.panel-heading{background-color:#1c84c6;border-color:#1c84c6;color:#fff}.panel-info{border-color:#23c6c8}.panel-info>.panel-heading{background-color:#23c6c8;border-color:#23c6c8;color:#fff}.panel-warning{border-color:#f8ac59}.panel-warning>.panel-heading{background-color:#f8ac59;border-color:#f8ac59;color:#fff}.panel-danger{border-color:#ed5565}.panel-danger>.panel-heading{background-color:#ed5565;border-color:#ed5565;color:#fff}.progress-bar{background-color:#1ab394}.progress-small,.progress-small .progress-bar{height:10px}.progress-small,.progress-mini{margin-top:5px}.progress-mini,.progress-mini .progress-bar{height:5px;margin-bottom:0}.progress-bar-navy-light{background-color:#3dc7ab}.progress-bar-success{background-color:#1c84c6}.progress-bar-info{background-color:#23c6c8}.progress-bar-warning{background-color:#f8ac59}.progress-bar-danger{background-color:#ed5565}.panel-title{font-size:inherit}.jumbotron{border-radius:6px;padding:40px}.jumbotron h1{margin-top:0}.text-navy{color:#1ab394}.text-primary{color:inherit}.text-success{color:#1c84c6}.text-info{color:#23c6c8}.text-warning{color:#f8ac59}.text-danger{color:#ed5565}.text-muted{color:#888}.simple_tag{background-color:#f3f3f4;border:1px solid #e7eaec;border-radius:2px;color:inherit;font-size:10px;margin-right:5px;margin-top:5px;padding:5px 12px;display:inline-block}.img-shadow{box-shadow:0 0 3px 0 #919191}.dashboards\.dashboard_2 nav.navbar,.dashboards\.dashboard_3 nav.navbar,.mailbox\.inbox nav.navbar,.mailbox\.email_view nav.navbar,.mailbox\.email_compose nav.navbar,.dashboards\.dashboard_4_1 nav.navbar{background:#fff}.Dashboard_2 .navbar.navbar-static-top,.Dashboard_3 .navbar.navbar-static-top,.Dashboard_4_1 .navbar.navbar-static-top,.ComposeEmail .navbar.navbar-static-top,.EmailView .navbar.navbar-static-top,.Inbox .navbar.navbar-static-top{background:#fff}a.close-canvas-menu{position:absolute;top:10px;right:15px;z-index:1011;color:#a7b1c2}a.close-canvas-menu:hover{color:#fff}.full-height{height:100%}.fh-breadcrumb{height:calc(100% - 196px);margin:0 -15px;position:relative}.fh-no-breadcrumb{height:calc(100% - 99px);margin:0 -15px;position:relative}.fh-column{background:#fff;height:100%;width:240px;float:left}.modal-backdrop{z-index:2040!important}.modal{z-index:2050!important}.spiner-example{height:200px;padding-top:70px}.p-xxs{padding:5px}.p-xs{padding:10px}.p-sm{padding:15px}.p-m{padding:20px}.p-md{padding:25px}.p-lg{padding:30px}.p-xl{padding:40px}.m-xxs{margin:2px 4px}.m-xs{margin:5px}.m-sm{margin:10px}.m{margin:15px}.m-md{margin:20px}.m-lg{margin:30px}.m-xl{margin:50px}.m-n{margin:0!important}.m-l-none{margin-left:0}.m-l-xs{margin-left:5px}.m-l-sm{margin-left:10px}.m-l{margin-left:15px}.m-l-md{margin-left:20px}.m-l-lg{margin-left:30px}.m-l-xl{margin-left:40px}.m-l-n-xxs{margin-left:-1px}.m-l-n-xs{margin-left:-5px}.m-l-n-sm{margin-left:-10px}.m-l-n{margin-left:-15px}.m-l-n-md{margin-left:-20px}.m-l-n-lg{margin-left:-30px}.m-l-n-xl{margin-left:-40px}.m-t-none{margin-top:0}.m-t-xxs{margin-top:1px}.m-t-xs{margin-top:5px}.m-t-sm{margin-top:10px}.m-t{margin-top:15px}.m-t-md{margin-top:20px}.m-t-lg{margin-top:30px}.m-t-xl{margin-top:40px}.m-t-n-xxs{margin-top:-1px}.m-t-n-xs{margin-top:-5px}.m-t-n-sm{margin-top:-10px}.m-t-n{margin-top:-15px}.m-t-n-md{margin-top:-20px}.m-t-n-lg{margin-top:-30px}.m-t-n-xl{margin-top:-40px}.m-r-none{margin-right:0}.m-r-xxs{margin-right:1px}.m-r-xs{margin-right:5px}.m-r-sm{margin-right:10px}.m-r{margin-right:15px}.m-r-md{margin-right:20px}.m-r-lg{margin-right:30px}.m-r-xl{margin-right:40px}.m-r-n-xxs{margin-right:-1px}.m-r-n-xs{margin-right:-5px}.m-r-n-sm{margin-right:-10px}.m-r-n{margin-right:-15px}.m-r-n-md{margin-right:-20px}.m-r-n-lg{margin-right:-30px}.m-r-n-xl{margin-right:-40px}.m-b-none{margin-bottom:0}.m-b-xxs{margin-bottom:1px}.m-b-xs{margin-bottom:5px}.m-b-sm{margin-bottom:10px}.m-b{margin-bottom:15px}.m-b-md{margin-bottom:20px}.m-b-lg{margin-bottom:30px}.m-b-xl{margin-bottom:40px}.m-b-n-xxs{margin-bottom:-1px}.m-b-n-xs{margin-bottom:-5px}.m-b-n-sm{margin-bottom:-10px}.m-b-n{margin-bottom:-15px}.m-b-n-md{margin-bottom:-20px}.m-b-n-lg{margin-bottom:-30px}.m-b-n-xl{margin-bottom:-40px}.space-15{margin:15px 0}.space-20{margin:20px 0}.space-25{margin:25px 0}.space-30{margin:30px 0}body.modal-open{padding-right:inherit!important}.search-form{margin-top:10px}.search-result h3{margin-bottom:0;color:#1e0fbe}.search-result .search-link{color:#006621}.search-result p{font-size:12px;margin-top:5px}.contact-box{background-color:#fff;border:1px solid #e7eaec;padding:20px;margin-bottom:20px}.contact-box a{color:inherit}.invoice-table tbody>tr>td:last-child,.invoice-table tbody>tr>td:nth-child(4),.invoice-table tbody>tr>td:nth-child(3),.invoice-table tbody>tr>td:nth-child(2){text-align:right}.invoice-table thead>tr>th:last-child,.invoice-table thead>tr>th:nth-child(4),.invoice-table thead>tr>th:nth-child(3),.invoice-table thead>tr>th:nth-child(2){text-align:right}.invoice-total>tbody>tr>td:first-child{text-align:right}.invoice-total>tbody>tr>td{border:0 none}.invoice-total>tbody>tr>td:last-child{border-bottom:1px solid #ddd;text-align:right;width:15%}.middle-box{max-width:400px;z-index:100;margin:0 auto;padding-top:40px}.lockscreen.middle-box{width:200px;padding-top:110px}.loginscreen.middle-box{width:300px}.loginColumns{max-width:800px;margin:0 auto;padding:100px 20px 20px 20px}.passwordBox{max-width:460px;margin:0 auto;padding:100px 20px 20px 20px}.logo-name{color:#e6e6e6;font-size:180px;font-weight:800;letter-spacing:-10px;margin-bottom:0}.middle-box h1{font-size:170px}.wrapper .middle-box{margin-top:140px}.lock-word{z-index:10;position:absolute;top:110px;left:50%;margin-left:-470px}.lock-word span{font-size:100px;font-weight:600;color:#e9e9e9;display:inline-block}.lock-word .first-word{margin-right:160px}.dashboard-header{border-top:0;padding:20px 20px 20px 20px}.dashboard-header h2{margin-top:10px;font-size:26px}.fist-item{border-top:none!important}.statistic-box{margin-top:40px}.dashboard-header .list-group-item span.label{margin-right:10px}.list-group.clear-list .list-group-item{border-top:1px solid #e7eaec;border-bottom:0;border-right:0;border-left:0;padding:10px 0}ul.clear-list:first-child{border-top:none!important}.timeline-item .date i{position:absolute;top:0;right:0;padding:5px;width:30px;text-align:center;border-top:1px solid #e7eaec;border-bottom:1px solid #e7eaec;border-left:1px solid #e7eaec;background:#f8f8f8}.timeline-item .date{text-align:right;width:110px;position:relative;padding-top:30px}.timeline-item .content{border-left:1px solid #e7eaec;border-top:1px solid #e7eaec;padding-top:10px;min-height:100px}.timeline-item .content:hover{background:#f6f6f6}ul.notes li,ul.tag-list li{list-style:none}ul.notes li h4{margin-top:20px;font-size:16px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;position:relative}ul.notes li div small{position:absolute;top:5px;right:5px;font-size:10px}ul.notes li div a{position:absolute;right:10px;bottom:10px;color:inherit}ul.notes li{margin:10px 40px 50px 0;float:left}ul.notes li div p{font-size:12px}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:140px;width:140px;padding:1em;box-shadow:5px 5px 2px rgba(33,33,33,0.7)}ul.notes li div{-webkit-transform:rotate(-6deg);-o-transform:rotate(-6deg);-moz-transform:rotate(-6deg)}ul.notes li:nth-child(even) div{-o-transform:rotate(4deg);-webkit-transform:rotate(4deg);-moz-transform:rotate(4deg);position:relative;top:5px}ul.notes li:nth-child(3n) div{-o-transform:rotate(-3deg);-webkit-transform:rotate(-3deg);-moz-transform:rotate(-3deg);position:relative;top:-5px}ul.notes li:nth-child(5n) div{-o-transform:rotate(5deg);-webkit-transform:rotate(5deg);-moz-transform:rotate(5deg);position:relative;top:-10px}ul.notes li div:hover,ul.notes li div:focus{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);position:relative;z-index:5}ul.notes li div{text-decoration:none;color:#000;background:#ffc;display:block;height:210px;width:210px;padding:1em;box-shadow:5px 5px 7px rgba(33,33,33,0.7);-webkit-transition:-webkit-transform .15s linear}.file-box{float:left;width:220px}.file-manager h5{text-transform:uppercase}.file-manager{list-style:none outside none;margin:0;padding:0}.folder-list li a{color:#666;display:block;padding:5px 0}.folder-list li{border-bottom:1px solid #e7eaec;display:block}.folder-list li i{margin-right:8px;color:#3d4d5d}.category-list li a{color:#666;display:block;padding:5px 0}.category-list li{display:block}.category-list li i{margin-right:8px;color:#3d4d5d}.category-list li a .text-navy{color:#1ab394}.category-list li a .text-primary{color:#1c84c6}.category-list li a .text-info{color:#23c6c8}.category-list li a .text-danger{color:#ef5352}.category-list li a .text-warning{color:#f8ac59}.file-manager h5.tag-title{margin-top:20px}.tag-list li{float:left}.tag-list li a{font-size:10px;background-color:#f3f3f4;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #e7eaec;margin-right:5px;margin-top:5px;display:block}.file{border:1px solid #e7eaec;padding:0;background-color:#fff;position:relative;margin-bottom:20px;margin-right:20px}.file-manager .hr-line-dashed{margin:15px 0}.file .icon,.file .image{height:100px;overflow:hidden}.file .icon{padding:15px 10px;text-align:center}.file-control{color:inherit;font-size:14px;margin-right:10px}.file-control.active{text-decoration:underline}.file .icon i{font-size:70px;color:#dadada}.file .file-name{padding:10px;background-color:#f8f8f8;border-top:1px solid #e7eaec}.file-name small{color:#676a6c}.corner{position:absolute;display:inline-block;width:0;height:0;line-height:0;border:.6em solid transparent;border-right:.6em solid #f1f1f1;border-bottom:.6em solid #f1f1f1;right:0;bottom:0}a.compose-mail{padding:8px 10px}.mail-search{max-width:300px}.profile-content{border-top:none!important}.feed-activity-list .feed-element{border-bottom:1px solid #e7eaec}.feed-element:first-child{margin-top:0}.feed-element{padding-bottom:15px}.feed-element,.feed-element .media{margin-top:15px}.feed-element,.media-body{overflow:hidden}.feed-element>.pull-left{margin-right:10px}.feed-element img.img-circle,.dropdown-messages-box img.img-circle{width:38px;height:38px}.feed-element .well{border:1px solid #e7eaec;box-shadow:none;margin-top:10px;margin-bottom:5px;padding:10px 20px;font-size:11px;line-height:16px}.feed-element .actions{margin-top:10px}.feed-element .photos{margin:10px 0}.feed-photo{max-height:180px;border-radius:4px;overflow:hidden;margin-right:10px;margin-bottom:10px}.mail-box{background-color:#fff;border:1px solid #e7eaec;border-top:0;padding:0;margin-bottom:20px}.mail-box-header{background-color:#fff;border:1px solid #e7eaec;border-bottom:0;padding:30px 20px 20px 20px}.mail-box-header h2{margin-top:0}.mailbox-content .tag-list li a{background:#fff}.mail-body{border-top:1px solid #e7eaec;padding:20px}.mail-text{border-top:1px solid #e7eaec}.mail-text .note-toolbar{padding:10px 15px}.mail-body .form-group{margin-bottom:5px}.mail-text .note-editor .note-toolbar{background-color:#f9f8f8}.mail-attachment{border-top:1px solid #e7eaec;padding:20px;font-size:12px}.mailbox-content{background:0;border:0;padding:10px}.mail-ontact{width:23%}.project-people,.project-actions{text-align:right;vertical-align:middle}dd.project-people{text-align:left;margin-top:5px}.project-people img{width:32px;height:32px}.project-title a{font-size:14px;color:#676a6c;font-weight:600}.project-list table tr td{border-top:0;border-bottom:1px solid #e7eaec;padding:15px 10px;vertical-align:middle}.project-manager .tag-list li a{font-size:10px;background-color:white;padding:5px 12px;color:inherit;border-radius:2px;border:1px solid #e7eaec;margin-right:5px;margin-top:5px;display:block}.project-files li a{font-size:11px;color:#676a6c;margin-left:10px;line-height:22px}.faq-item{padding:20px;margin-bottom:2px;background:#fff}.faq-question{font-size:18px;font-weight:600;color:#1ab394;display:block}.faq-question:hover{color:#179d82}.faq-answer{margin-top:10px;background:#f3f3f4;border:1px solid #e7eaec;border-radius:3px;padding:15px}.faq-item .tag-item{background:#f3f3f4;padding:2px 6px;font-size:10px;text-transform:uppercase}.message-input{height:90px!important}.chat-avatar{width:36px;height:36px;float:left;margin-right:10px}.chat-user-name{padding:10px}.chat-user{padding:8px 10px;border-bottom:1px solid #e7eaec}.chat-user a{color:inherit}.chat-view{z-index:20012}.chat-users,.chat-statistic{margin-left:-30px}@media(max-width:992px){.chat-users,.chat-statistic{margin-left:0}}.chat-view .ibox-content{padding:0}.chat-message{padding:10px 20px}.message-avatar{height:48px;width:48px;border:1px solid #e7eaec;border-radius:4px;margin-top:1px}.chat-discussion .chat-message.left .message-avatar{float:left;margin-right:10px}.chat-discussion .chat-message.right .message-avatar{float:right;margin-left:10px}.message{background-color:#fff;border:1px solid #e7eaec;text-align:left;display:block;padding:10px 20px;position:relative;border-radius:4px}.chat-discussion .chat-message.left .message-date{float:right}.chat-discussion .chat-message.right .message-date{float:left}.chat-discussion .chat-message.left .message{text-align:left;margin-left:55px}.chat-discussion .chat-message.right .message{text-align:right;margin-right:55px}.message-date{font-size:10px;color:#888}.message-content{display:block}.chat-discussion{background:#eee;padding:15px;height:400px;overflow-y:auto}.chat-users{overflow-y:auto;height:400px}.chat-message-form .form-group{margin-bottom:0}.jstree-open>.jstree-anchor>.fa-folder:before{content:"\f07c"}.jstree-default .jstree-icon.none{width:0}.clients-list{margin-top:20px}.clients-list .tab-pane{position:relative;height:600px}.client-detail{position:relative;height:620px}.clients-list table tr td{height:46px;vertical-align:middle;border:0}.client-link{font-weight:600;color:inherit}.client-link:hover{color:inherit}.client-avatar{width:42px}.client-avatar img{width:28px;height:28px;border-radius:50%}.contact-type{width:20px;color:#c1c3c4}.client-status{text-align:left}.client-detail .vertical-timeline-content p{margin:0}.client-detail .vertical-timeline-icon.gray-bg{color:#a7aaab}.clients-list .nav-tabs>li.active>a,.clients-list .nav-tabs>li.active>a:hover,.clients-list .nav-tabs>li.active>a:focus{border-bottom:1px solid #fff}.blog h2{font-weight:700}.blog h5{margin:0 0 5px 0}.blog .btn{margin:0 0 5px 0}.article h1{font-size:48px;font-weight:700;color:#2f4050}.article p{font-size:15px;line-height:26px}.article-title{text-align:center;margin:60px 0 40px 0}.article .ibox-content{padding:40px}.issue-tracker .btn-link{color:#1ab394}table.issue-tracker tbody tr td{vertical-align:middle;height:50px}.issue-info{width:50%}.issue-info a{font-weight:600;color:#676a6c}.issue-info small{display:block}.team-members{margin:10px 0}.team-members img.img-circle{width:42px;height:42px;margin-bottom:5px}.sortable-list{padding:10px 0}.agile-list{list-style:none;margin:0}.agile-list li{background:#fafafb;border:1px solid #e7eaec;margin:0 0 10px 0;padding:10px;border-radius:2px}.agile-list li:hover{cursor:pointer;background:#fff}.agile-list li.warning-element{border-left:3px solid #f8ac59}.agile-list li.danger-element{border-left:3px solid #ed5565}.agile-list li.info-element{border-left:3px solid #1c84c6}.agile-list li.success-element{border-left:3px solid #1ab394}.agile-detail{margin-top:5px;font-size:12px}ins{background-color:#c6ffc6;text-decoration:none}del{background-color:#ffc6c6}#small-chat{position:fixed;bottom:50px;right:26px;z-index:100}#small-chat .badge{position:absolute;top:-3px;right:-4px}.open-small-chat{height:38px;width:38px;display:block;background:#1ab394;padding:9px 8px;text-align:center;color:#fff;border-radius:50%}.open-small-chat:hover{color:white;background:#1ab394}.small-chat-box{display:none;position:fixed;bottom:50px;right:80px;background:#fff;border:1px solid #e7eaec;width:230px;height:320px;border-radius:4px}.small-chat-box.ng-small-chat{display:block}.body-small .small-chat-box{bottom:70px;right:20px}.small-chat-box.active{display:block}.small-chat-box .heading{background:#2f4050;padding:8px 15px;font-weight:bold;color:#fff}.small-chat-box .chat-date{opacity:.6;font-size:10px;font-weight:normal}.small-chat-box .content{padding:15px 15px}.small-chat-box .content .author-name{font-weight:bold;margin-bottom:3px;font-size:11px}.small-chat-box .content>div{padding-bottom:20px}.small-chat-box .content .chat-message{padding:5px 10px;border-radius:6px;font-size:11px;line-height:14px;max-width:80%;background:#f3f3f4;margin-bottom:10px}.small-chat-box .content .chat-message.active{background:#1ab394;color:#fff}.small-chat-box .content .left{text-align:left;clear:both}.small-chat-box .content .left .chat-message{float:left}.small-chat-box .content .right{text-align:right;clear:both}.small-chat-box .content .right .chat-message{float:right}.small-chat-box .form-chat{padding:10px 10px}.sk-spinner-rotating-plane.sk-spinner{width:30px;height:30px;background-color:#1ab394;margin:0 auto;-webkit-animation:sk-rotatePlane 1.2s infinite ease-in-out;animation:sk-rotatePlane 1.2s infinite ease-in-out}@-webkit-keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-180deg);transform:perspective(120px) rotateX(-180deg) rotateY(-180deg)}}@keyframes sk-rotatePlane{0%{-webkit-transform:perspective(120px) rotateX(0deg) rotateY(0deg);transform:perspective(120px) rotateX(0deg) rotateY(0deg)}50%{-webkit-transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg);transform:perspective(120px) rotateX(-180 .1deg) rotateY(0deg)}100%{-webkit-transform:perspective(120px) rotateX(-180deg) rotateY(-179 .9deg);transform:perspective(120px) rotateX(-180deg) rotateY(-179 .9deg)}}.sk-spinner-double-bounce.sk-spinner{width:40px;height:40px;position:relative;margin:0 auto}.sk-spinner-double-bounce .sk-double-bounce1,.sk-spinner-double-bounce .sk-double-bounce2{width:100%;height:100%;border-radius:50%;background-color:#1ab394;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:sk-doubleBounce 2s infinite ease-in-out;animation:sk-doubleBounce 2s infinite ease-in-out}.sk-spinner-double-bounce .sk-double-bounce2{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-doubleBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-wave.sk-spinner{margin:0 auto;width:50px;height:30px;text-align:center;font-size:10px}.sk-spinner-wave div{background-color:#1ab394;height:100%;width:6px;display:inline-block;-webkit-animation:sk-waveStretchDelay 1.2s infinite ease-in-out;animation:sk-waveStretchDelay 1.2s infinite ease-in-out}.sk-spinner-wave .sk-rect2{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-wave .sk-rect3{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-wave .sk-rect4{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-wave .sk-rect5{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}@-webkit-keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes sk-waveStretchDelay{0%,40%,100%{-webkit-transform:scaleY(0.4);transform:scaleY(0.4)}20%{-webkit-transform:scaleY(1);transform:scaleY(1)}}.sk-spinner-wandering-cubes.sk-spinner{margin:0 auto;width:32px;height:32px;position:relative}.sk-spinner-wandering-cubes .sk-cube1,.sk-spinner-wandering-cubes .sk-cube2{background-color:#1ab394;width:10px;height:10px;position:absolute;top:0;left:0;-webkit-animation:sk-wanderingCubeMove 1.8s infinite ease-in-out;animation:sk-wanderingCubeMove 1.8s infinite ease-in-out}.sk-spinner-wandering-cubes .sk-cube2{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}@-webkit-keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes sk-wanderingCubeMove{25%{-webkit-transform:translateX(42px) rotate(-90deg) scale(0.5);transform:translateX(42px) rotate(-90deg) scale(0.5)}50%{-webkit-transform:translateX(42px) translateY(42px) rotate(-179deg);transform:translateX(42px) translateY(42px) rotate(-179deg)}50.1%{-webkit-transform:translateX(42px) translateY(42px) rotate(-180deg);transform:translateX(42px) translateY(42px) rotate(-180deg)}75%{-webkit-transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5);transform:translateX(0px) translateY(42px) rotate(-270deg) scale(0 .5)}100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}.sk-spinner-pulse.sk-spinner{width:40px;height:40px;margin:0 auto;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-pulseScaleOut 1s infinite ease-in-out;animation:sk-pulseScaleOut 1s infinite ease-in-out}@-webkit-keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes sk-pulseScaleOut{0%{-webkit-transform:scale(0);transform:scale(0)}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}.sk-spinner-chasing-dots.sk-spinner{margin:0 auto;width:40px;height:40px;position:relative;text-align:center;-webkit-animation:sk-chasingDotsRotate 2s infinite linear;animation:sk-chasingDotsRotate 2s infinite linear}.sk-spinner-chasing-dots .sk-dot1,.sk-spinner-chasing-dots .sk-dot2{width:60%;height:60%;display:inline-block;position:absolute;top:0;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-chasingDotsBounce 2s infinite ease-in-out;animation:sk-chasingDotsBounce 2s infinite ease-in-out}.sk-spinner-chasing-dots .sk-dot2{top:auto;bottom:0;-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-chasingDotsRotate{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-chasingDotsBounce{0%,100%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-three-bounce.sk-spinner{margin:0 auto;width:70px;text-align:center}.sk-spinner-three-bounce div{width:18px;height:18px;background-color:#1ab394;border-radius:100%;display:inline-block;-webkit-animation:sk-threeBounceDelay 1.4s infinite ease-in-out;animation:sk-threeBounceDelay 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-three-bounce .sk-bounce1{-webkit-animation-delay:-0.32s;animation-delay:-0.32s}.sk-spinner-three-bounce .sk-bounce2{-webkit-animation-delay:-0.16s;animation-delay:-0.16s}@-webkit-keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-threeBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-circle .sk-circle:before{content:'';display:block;margin:0 auto;width:20%;height:20%;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-circleBounceDelay 1.2s infinite ease-in-out;animation:sk-circleBounceDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes sk-circleBounceDelay{0%,80%,100%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}}.sk-spinner-cube-grid.sk-spinner{width:30px;height:30px;margin:0 auto}.sk-spinner-cube-grid .sk-cube{width:33%;height:33%;background-color:#1ab394;float:left;-webkit-animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out;animation:sk-cubeGridScaleDelay 1.3s infinite ease-in-out}.sk-spinner-cube-grid .sk-cube:nth-child(1){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(2){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(3){-webkit-animation-delay:.4s;animation-delay:.4s}.sk-spinner-cube-grid .sk-cube:nth-child(4){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(5){-webkit-animation-delay:.2s;animation-delay:.2s}.sk-spinner-cube-grid .sk-cube:nth-child(6){-webkit-animation-delay:.3s;animation-delay:.3s}.sk-spinner-cube-grid .sk-cube:nth-child(7){-webkit-animation-delay:0s;animation-delay:0s}.sk-spinner-cube-grid .sk-cube:nth-child(8){-webkit-animation-delay:.1s;animation-delay:.1s}.sk-spinner-cube-grid .sk-cube:nth-child(9){-webkit-animation-delay:.2s;animation-delay:.2s}@-webkit-keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}@keyframes sk-cubeGridScaleDelay{0%,70%,100%{-webkit-transform:scale3D(1,1,1);transform:scale3D(1,1,1)}35%{-webkit-transform:scale3D(0,0,1);transform:scale3D(0,0,1)}}.sk-spinner-wordpress.sk-spinner{background-color:#1ab394;width:30px;height:30px;border-radius:30px;position:relative;margin:0 auto;-webkit-animation:sk-innerCircle 1s linear infinite;animation:sk-innerCircle 1s linear infinite}.sk-spinner-wordpress .sk-inner-circle{display:block;background-color:#fff;width:8px;height:8px;position:absolute;border-radius:8px;top:5px;left:5px}@-webkit-keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes sk-innerCircle{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.sk-spinner-fading-circle.sk-spinner{margin:0 auto;width:22px;height:22px;position:relative}.sk-spinner-fading-circle .sk-circle{width:100%;height:100%;position:absolute;left:0;top:0}.sk-spinner-fading-circle .sk-circle:before{content:'';display:block;margin:0 auto;width:18%;height:18%;background-color:#1ab394;border-radius:100%;-webkit-animation:sk-circleFadeDelay 1.2s infinite ease-in-out;animation:sk-circleFadeDelay 1.2s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.sk-spinner-fading-circle .sk-circle2{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);transform:rotate(30deg)}.sk-spinner-fading-circle .sk-circle3{-webkit-transform:rotate(60deg);-ms-transform:rotate(60deg);transform:rotate(60deg)}.sk-spinner-fading-circle .sk-circle4{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.sk-spinner-fading-circle .sk-circle5{-webkit-transform:rotate(120deg);-ms-transform:rotate(120deg);transform:rotate(120deg)}.sk-spinner-fading-circle .sk-circle6{-webkit-transform:rotate(150deg);-ms-transform:rotate(150deg);transform:rotate(150deg)}.sk-spinner-fading-circle .sk-circle7{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.sk-spinner-fading-circle .sk-circle8{-webkit-transform:rotate(210deg);-ms-transform:rotate(210deg);transform:rotate(210deg)}.sk-spinner-fading-circle .sk-circle9{-webkit-transform:rotate(240deg);-ms-transform:rotate(240deg);transform:rotate(240deg)}.sk-spinner-fading-circle .sk-circle10{-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.sk-spinner-fading-circle .sk-circle11{-webkit-transform:rotate(300deg);-ms-transform:rotate(300deg);transform:rotate(300deg)}.sk-spinner-fading-circle .sk-circle12{-webkit-transform:rotate(330deg);-ms-transform:rotate(330deg);transform:rotate(330deg)}.sk-spinner-fading-circle .sk-circle2:before{-webkit-animation-delay:-1.1s;animation-delay:-1.1s}.sk-spinner-fading-circle .sk-circle3:before{-webkit-animation-delay:-1s;animation-delay:-1s}.sk-spinner-fading-circle .sk-circle4:before{-webkit-animation-delay:-0.9s;animation-delay:-0.9s}.sk-spinner-fading-circle .sk-circle5:before{-webkit-animation-delay:-0.8s;animation-delay:-0.8s}.sk-spinner-fading-circle .sk-circle6:before{-webkit-animation-delay:-0.7s;animation-delay:-0.7s}.sk-spinner-fading-circle .sk-circle7:before{-webkit-animation-delay:-0.6s;animation-delay:-0.6s}.sk-spinner-fading-circle .sk-circle8:before{-webkit-animation-delay:-0.5s;animation-delay:-0.5s}.sk-spinner-fading-circle .sk-circle9:before{-webkit-animation-delay:-0.4s;animation-delay:-0.4s}.sk-spinner-fading-circle .sk-circle10:before{-webkit-animation-delay:-0.3s;animation-delay:-0.3s}.sk-spinner-fading-circle .sk-circle11:before{-webkit-animation-delay:-0.2s;animation-delay:-0.2s}.sk-spinner-fading-circle .sk-circle12:before{-webkit-animation-delay:-0.1s;animation-delay:-0.1s}@-webkit-keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}@keyframes sk-circleFadeDelay{0%,39%,100%{opacity:0}40%{opacity:1}}body.rtls #page-wrapper{margin:0 220px 0 0}body.rtls .nav-second-level li a{padding:7px 35px 7px 10px}body.rtls .ibox-title h5{float:right}body.rtls .pull-right{float:left!important}body.rtls .pull-left{float:right!important}body.rtls .ibox-tools{float:left}body.rtls .stat-percent{float:left}body.rtls .navbar-right{float:left!important}body.rtls .navbar-top-links li:last-child{margin-left:40px;margin-right:0}body.rtls .minimalize-styl-2{float:right;margin:14px 20px 5px 5px}body.rtls .feed-element>.pull-left{margin-left:10px;margin-right:0}body.rtls .timeline-item .date{text-align:left}body.rtls .timeline-item .date i{left:0;right:auto}body.rtls .timeline-item .content{border-right:1px solid #e7eaec;border-left:none}body.rtls .toast-close-button{float:left}body.rtls #toast-container>.toast:before{margin:auto -1.5em auto .5em}body.rtls #toast-container>div{padding:15px 50px 15px 15px}body.rtls .center-orientation .vertical-timeline-icon i{margin-left:0;margin-right:-12px}body.rtls .vertical-timeline-icon i{right:50%;left:auto;margin-left:auto;margin-right:-12px}body.rtls .file-box{float:right}body.rtls ul.notes li{float:right}body.rtls .chat-users,body.rtls .chat-statistic{margin-right:-30px;margin-left:auto}body.rtls .dropdown-menu>li>a{text-align:right}body.rtls .b-r{border-left:1px solid #e7eaec;border-right:0}body.rtls .dd-list .dd-list{padding-right:30px;padding-left:0}body.rtls .dd-item>button{float:right}body.rtls .skin-setttings{margin-right:40px;margin-left:0}body.rtls .skin-setttings{direction:ltr}body.rtls .footer.fixed{margin-right:220px;margin-left:0}@media(max-width :992px){body.rtls .chat-users,body.rtls .chat-statistic{margin-right:0}}body.rtls.mini-navbar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar .footer.fixed,body.body-small.mini-navbar .footer.fixed{margin:0}body.rtls.top-navigation .navbar-toggle{float:right;margin-left:15px;margin-right:15px}.body-small.rtls.top-navigation .navbar-header{float:none}body.rtls.top-navigation #page-wrapper{margin:0}body.rtls.mini-navbar #page-wrapper{margin:0 70px 0 0}body.rtls.mini-navbar.fixed-sidebar #page-wrapper{margin:0}body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper{margin:0 220px 0 0}body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side{width:220px}.body-small.rtls .navbar-fixed-top{margin-right:0}.body-small.rtls .navbar-header{float:right}body.rtls .navbar-top-links li:last-child{margin-left:20px}body.rtls .top-navigation #page-wrapper,body.rtls.mini-navbar .top-navigation #page-wrapper,body.rtls.mini-navbar.top-navigation #page-wrapper{margin:0}body.rtls .top-navigation .footer.fixed,body.rtls.top-navigation .footer.fixed{margin:0}@media(max-width :768px){body.rtls .navbar-top-links li:last-child{margin-left:20px}.body-small.rtls #page-wrapper{position:inherit;margin:0;min-height:1000px}.body-small.rtls .navbar-static-side{display:none;z-index:2001;position:absolute;width:70px}.body-small.rtls.mini-navbar .navbar-static-side{display:block}.rtls.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:2001;position:fixed;width:220px}.rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}}.rtls .ltr-support{direction:ltr}.page-tabs a{color:#999}.page-tabs a i{color:#ccc;margin-left:2px;font-size:13px}.page-tabs a.active{background:#eaedf1;color:#23508e}.page-tabs a.active:hover,.page-tabs a.active i:hover{background:#eaedf1;color:#23508e}@media(min-width :768px){.navbar-top-links .dropdown-messages,.navbar-top-links .dropdown-tasks,.navbar-top-links .dropdown-alerts{margin-left:auto}}@media(max-width :768px){body.fixed-sidebar .navbar-static-side{display:none}body.fixed-sidebar.mini-navbar .navbar-static-side{width:70px}.lock-word{display:none}.navbar-form-custom{display:none}.navbar-header{display:inline;float:left}.sidebard-panel{z-index:2;position:relative;width:auto;min-height:100%!important}.sidebar-content .wrapper{padding-right:0;z-index:1}.fixed-sidebar.body-small .navbar-static-side{display:none;z-index:2001;position:fixed;width:220px}.fixed-sidebar.body-small.mini-navbar .navbar-static-side{display:block}.ibox-tools{float:none;text-align:right;display:block}.content-tabs{display:none}#content-main{height:calc(100% - 100px)}.fixed-nav #content-main{height:calc(100% - 38px)}}.navbar-static-side{background:#2f4050}.nav-close{padding:10px;display:block;position:absolute;right:5px;top:5px;font-size:1.4em;cursor:pointer;z-index:10;display:none;color:rgba(255,255,255,.3)}@media(max-width :350px){body.fixed-sidebar.mini-navbar .navbar-static-side{width:0}.nav-close{display:block}#page-wrapper{margin-left:0!important}.timeline-item .date{text-align:left;width:110px;position:relative;padding-top:30px}.timeline-item .date i{position:absolute;top:0;left:15px;padding:5px;width:30px;text-align:center;border:1px solid #e7eaec;background:#f8f8f8}.timeline-item .content{border-left:none;border-top:1px solid #e7eaec;padding-top:10px;min-height:100px}.nav.navbar-top-links li.dropdown{display:none}.ibox-tools{float:none;text-align:left;display:inline-block}}.ui-jqgrid-titlebar{height:40px;line-height:24px;color:#676a6c;background-color:#f9f9f9;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.ui-jqgrid .ui-jqgrid-title{float:left;margin-left:5px;font-weight:700}.ui-jqgrid .ui-jqgrid-titlebar{position:relative;border-left:0 solid;border-right:0 solid;border-top:0 solid}.social-feed-separated .social-feed-box{margin-left:62px}.social-feed-separated .social-avatar{float:left;padding:0}.social-feed-separated .social-avatar img{width:52px;height:52px;border:1px solid #e7eaec}.social-feed-separated .social-feed-box .social-avatar{padding:15px 15px 0 15px;float:none}.social-feed-box{border:1px solid #e7eaec;background:#fff;margin-bottom:15px}.article .social-feed-box{margin-bottom:0;border-bottom:0}.article .social-feed-box:last-child{margin-bottom:0;border-bottom:1px solid #e7eaec}.article .social-feed-box p{font-size:13px;line-height:18px}.social-action{margin:15px}.social-avatar{padding:15px 15px 0 15px}.social-comment .social-comment{margin-left:45px}.social-avatar img{height:40px;width:40px;margin-right:10px}.social-avatar .media-body a{font-size:14px;display:block}.social-body{padding:15px}.social-body img{margin-bottom:10px}.social-footer{border-top:1px solid #e7eaec;padding:10px 15px;background:#f9f9f9}.social-footer .social-comment img{width:32px;margin-right:10px}.social-comment:first-child{margin-top:0}.social-comment{margin-top:15px}.social-comment textarea{font-size:12px}@media(max-width :1000px){.welcome-message{display:none}}.echarts{height:240px}.checkbox-inline,.radio-inline,.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin:0 15px 0 0;font-size:14px}.navbar-toggle{background-color:#fff}.menuTab{-webkit-transition:all .3s ease-out 0s;transition:all .3s ease-out 0s}@media only screen and (-webkit-min-device-pixel-ratio :2){#content-main{-webkit-overflow-scrolling:touch}}.navbar-header{height:50px}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;font-size:10px;line-height:1.4;text-align:center;background-color:#f9f9f9;border:1px solid #fff}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{color:#fff;background-color:#1ab394}@media(min-width :768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.t-bar{padding-bottom:10px}.nopadding{padding:0}.note-editor .btn-default{color:#333!important;background-color:#fff!important;border-color:#ccc!important}.folder-list li.active a{color:#2791df;background:#f5f5f5}nav .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent;-webkit-transition:width .3s ease-in-out;-o-transition:width .3s ease-in-out;transition:width .3s ease-in-out;display:block;height:50px;font-size:20px;line-height:50px;text-align:center;width:200px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:0 15px;font-weight:300;overflow:hidden}.logo-mini{display:none}.logo-lg{display:block}.roleList{color:#d5d5d5;margin-right:10px;padding-top:10px;line-height:1;white-space:nowrap;overflow:hidden;width:110px}.sidebar-collapse .user-panel{white-space:nowrap;position:relative;width:100%;padding:15px;overflow:hidden}.sidebar-collapse .user-panel .image>img{width:100%;max-width:45px;height:auto}.sidebar-collapse .user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.sidebar-collapse .user-panel>.info a{color:#fff;font-size:12px}.sidebar-collapse .user-panel>.info>p{font-weight:600;margin-bottom:9px;color:#fff;font-size:12px}.user-panel>.info>a>.fa,.user-panel>.info>a>.ion,.user-panel>.info>a>.glyphicon{margin-right:3px}.nav>li:hover .dropdown-menu{display:block}#content-main.max{height:calc(100% - 110px);overflow:hidden;width:100%;height:100%;left:0;position:absolute;top:0;z-index:9998;margin:0}
ruoyi-admin/src/main/resources/static/img/qr_code.png

ruoyi-admin/src/main/resources/static/ruoyi/css/ry-ui.css
@@ -350,11 +350,11 @@
    right: 42px;
}
.select2-hidden-accessible + label.error, select.error + label.error {
.select2-hidden-accessible + label.error {
    right: 38px;
}
.Validform_error,input.error,textarea.error,select.error,select.error+label.error+.select2-container--bootstrap .select2-selection--single {
.Validform_error,input.error,textarea.error,select.error,label.error+.select2-container--bootstrap .select2-selection--single {
    background-color: #fbe2e2;
    border-color: #c66161;
    color: #c00
ruoyi-admin/src/main/resources/static/ruoyi/index.js
@@ -71,7 +71,7 @@
    if (isScrollToTop) {
        $(obj).show().siblings('.RuoYi_iframe').hide();
    } else {
        $(obj).css({"visibility": "visible", "position": "static"}).siblings('.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute", "left": "0", "top": "0"});
        $(obj).css({"visibility": "visible", "position": "static"}).siblings('.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute"});
    }
}
@@ -312,11 +312,10 @@
            // 添加选项卡对应的iframe
            var str1 = '<iframe class="RuoYi_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" data-refresh="' + isRefresh + '" seamless></iframe>';
            if (isScrollToTop) {
                $('.mainContent').find('iframe.RuoYi_iframe').hide();
                $('.mainContent').find('iframe.RuoYi_iframe').hide().parents('.mainContent').append(str1);
            } else {
                $('.mainContent').find('iframe.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute", "left": "0", "top": "0"});
                $('.mainContent').find('iframe.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute"}).parents('.mainContent').append(str1);
            }
            $('.mainContent').append(str1);
            
            $.modal.loading("数据加载中,请稍候...");
ruoyi-admin/src/main/resources/static/ruoyi/js/common.js
@@ -283,11 +283,10 @@
        // 添加选项卡对应的iframe
        var str1 = '<iframe class="RuoYi_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" data-panel="' + panelUrl + '" seamless></iframe>';
        if (isScrollToTop) {
            $('.mainContent', topWindow).find('iframe.RuoYi_iframe').hide();
            $('.mainContent', topWindow).find('iframe.RuoYi_iframe').hide().parents('.mainContent').append(str1);
        } else {
            $('.mainContent', topWindow).find('iframe.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute", "left": "0", "top": "0"});
            $('.mainContent', topWindow).find('iframe.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute"}).parents('.mainContent').append(str1);
        }
        $('.mainContent', topWindow).append(str1);
        
        window.parent.$.modal.loading("数据加载中,请稍候...");
        $('.mainContent iframe:visible', topWindow).on('load', function() {
@@ -361,7 +360,7 @@
    if (isScrollToTop) {
        $(obj).show().siblings('.RuoYi_iframe').hide();
    } else {
        $(obj).css({"visibility": "visible", "position": "static"}).siblings('.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute", "left": "0", "top": "0"});
        $(obj).css({"visibility": "visible", "position": "static"}).siblings('.RuoYi_iframe').css({"visibility": "hidden", "position": "absolute"});
    }
}
ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js
@@ -46,13 +46,13 @@
                    sortOrder: "asc",
                    pagination: true,
                    paginationLoop: false,
                    pageSize: 10,
                    pageSize: 20,
                    pageNumber: 1,
                    pageList: [10, 25, 50, 100],
                    pageList: [20, 40, 60, 100],
                    toolbar: "toolbar",
                    loadingFontSize: 13,
                    striped: false,
                    escape: true,
                    escape: false,
                    firstLoad: true,
                    showFooter: false,
                    search: false,
@@ -260,6 +260,7 @@
                            type: 1,
                            closeBtn: true,
                            shadeClose: true,
                            area: ['auto', 'auto'],
                            content: "<img src='" + src + "' height='" + height + "' width='" + width + "'/>"
                        });
                    } else if ($.common.equals("blank", target)) {
@@ -919,7 +920,6 @@
                    fix: false,
                    area: [_width + 'px', _height + 'px'],
                    content: _url,
                    closeBtn: $.common.isEmpty(options.closeBtn) ? 1 : options.closeBtn,
                    shadeClose: $.common.isEmpty(options.shadeClose) ? true : options.shadeClose,
                    skin: options.skin,
                    // options.btn设置为0表示不显示按钮
@@ -1221,6 +1221,12 @@
                var url = table.options.viewUrl.replace("{id}", id);
                $.modal.popupRight(table.options.modalName + "信息详情", url);
            },
            // 查看信息,以tab页展现
            viewTab: function(id) {
                table.set();
                var url = table.options.viewUrl.replace("{id}", id);
                $.modal.openTab(table.options.modalName + "详情", url);
            },
            // 保存信息 刷新表格
            save: function(url, data, callback) {
                var config = {
ruoyi-admin/src/main/resources/templates/demo/form/datetime.html
@@ -128,8 +128,7 @@
            $("#datetimepicker-demo-2").datetimepicker({
                   format: "yyyy-mm-dd",
                   minView: "month",
                   autoclose: true,
                   clearBtn:true
                   autoclose: true
               });
            
            $("#datetimepicker-demo-3").datetimepicker({
ruoyi-admin/src/main/resources/templates/demo/form/summernote.html
@@ -17,7 +17,7 @@
                            <h2>若依后台管理系统</h2>
                            <p>ruoyi是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p>
                            <p>
                                <b>当前版本:</b>v4.8.0
                                <b>当前版本:</b>v4.7.9
                            </p>
                            <p>
                                <span class="label label-warning">免费开源</span>
@@ -56,7 +56,7 @@
                            <h3>你好,若依 </h3>
                            <p>H+是一个完全响应式,基于Bootstrap3.3.7最新版本开发的扁平化主题,她采用了主流的左右两栏式布局,使用了Html5+CSS3等现代技术,她提供了诸多的强大的可以重新组合的UI组件,并集成了最新的jQuery版本(v2.1.1),当然,也集成了很多功能强大,用途广泛的就jQuery插件,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。</p>
                            <p>
                                <b>当前版本:</b>v4.8.0
                                <b>当前版本:</b>v4.7.9
                            </p>
                            <p>
                                <span class="label label-warning">开源免费</span>
ruoyi-admin/src/main/resources/templates/demo/table/asynTree.html
@@ -62,16 +62,6 @@
                    field: 'areaCode',
                    title: '区域代码',
                    align: 'left'
                },
                {
                    field: 'simplePy',
                    title: '首字母简拼',
                    align: 'left'
                },
                {
                    field: 'pinYin',
                    title: '名称全拼',
                    align: 'left'
                }]
            };
            $.treeTable.init(options);
ruoyi-admin/src/main/resources/templates/demo/table/resizable.html
@@ -38,16 +38,7 @@
                },
                {
                    field : 'userName', 
                    title : '用户姓名',
                    cellStyle: function (value, row, index) {
                        return { css: { "min-width": "100px", "white-space": "nowrap", "text-overflow": "ellipsis", "overflow": "hidden", "max-width": "200px" } }
                    },
                    formatter: function(value, row, index) {
                        if (index == 0) {
                            value = value + ",测试用户姓名,这是一条长文本,可以通过拖拽自适应内容显示。。。。";
                        }
                        return $.table.tooltip(value, 30, "open");
                    }
                    title : '用户姓名'
                },
                {
                    field : 'userPhone', 
ruoyi-admin/src/main/resources/templates/include.html
@@ -12,7 +12,7 @@
    <link th:href="@{/ajax/libs/bootstrap-table/bootstrap-table.min.css?v=1.22.6}" rel="stylesheet"/>
    <link th:href="@{/css/animate.min.css?v=20210831}" rel="stylesheet"/>
    <link th:href="@{/css/style.min.css?v=20210831}" rel="stylesheet"/>
    <link th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/>
    <link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/>
</head>
<!-- 通用JS -->
@@ -26,9 +26,9 @@
    <script th:src="@{/ajax/libs/bootstrap-table/locale/bootstrap-table-zh-CN.min.js?v=1.22.6}"></script>
    <script th:src="@{/ajax/libs/bootstrap-table/extensions/mobile/bootstrap-table-mobile.js?v=1.22.6}"></script>
    <!-- jquery-validate 表单验证插件 -->
    <script th:src="@{/ajax/libs/validate/jquery.validate.min.js?v=1.21.0}"></script>
    <script th:src="@{/ajax/libs/validate/jquery.validate.extend.js?v=1.21.0}"></script>
    <script th:src="@{/ajax/libs/validate/messages_zh.js?v=1.21.0}"></script>
    <script th:src="@{/ajax/libs/validate/jquery.validate.min.js?v=1.19.3}"></script>
    <script th:src="@{/ajax/libs/validate/jquery.validate.extend.js?v=1.19.3}"></script>
    <script th:src="@{/ajax/libs/validate/messages_zh.js?v=1.19.3}"></script>
    <!-- bootstrap-table 表格树插件 -->
    <script th:src="@{/ajax/libs/bootstrap-table/extensions/tree/bootstrap-table-tree.min.js?v=1.22.6}"></script>
    <!-- 遮罩层 -->
@@ -36,8 +36,8 @@
    <script th:src="@{/ajax/libs/iCheck/icheck.min.js?v=1.0.3}"></script>
    <script th:src="@{/ajax/libs/layer/layer.min.js?v=3.7.0}"></script>
    <script th:src="@{/ajax/libs/layui/layui.min.js?v=2.8.18}"></script>
    <script th:src="@{/ruoyi/js/common.js?v=4.8.0}"></script>
    <script th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script>
    <script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script>
    <script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script>
</div>
<!-- ztree树插件 -->
ruoyi-admin/src/main/resources/templates/index-topnav.html
@@ -14,7 +14,7 @@
    <link th:href="@{/css/animate.min.css}" rel="stylesheet"/>
    <link th:href="@{/css/style.min.css}" rel="stylesheet"/>
    <link th:href="@{/css/skins.css?v=20200902}" rel="stylesheet"/>
    <link th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/>
    <link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/>
    <style type="text/css">.fixed-sidebar .nav:not(.navbar-toolbar)>li.active{border-left:0px!important;}</style>
</head>
<body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
@@ -321,8 +321,8 @@
<script th:src="@{/js/jquery.contextMenu.min.js}"></script>
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.8.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script>
<script th:src="@{/ruoyi/index.js?v=20201208}"></script>
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
<script th:src="@{/js/resize-tabs.js}"></script>
ruoyi-admin/src/main/resources/templates/index.html
@@ -4,7 +4,7 @@
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="renderer" content="webkit">
    <title>若依系统首页</title>
    <title>系统首页</title>
    <!-- 避免IE使用兼容模式 -->
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <link th:href="@{favicon.ico}" rel="shortcut icon"/>
@@ -14,7 +14,7 @@
    <link th:href="@{/css/animate.min.css}" rel="stylesheet"/>
    <link th:href="@{/css/style.min.css}" rel="stylesheet"/>
    <link th:href="@{/css/skins.css}" rel="stylesheet"/>
    <link th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/>
    <link th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/>
</head>
<body class="fixed-sidebar full-height-layout gray-bg" th:classappend="${isMobile} ? 'canvas-menu'" style="overflow: hidden">
<div id="wrapper">
@@ -267,8 +267,8 @@
<script th:src="@{/js/jquery.contextMenu.min.js}"></script>
<script th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.8.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script>
<script th:src="@{/ruoyi/index.js?v=20201208}"></script>
<script th:src="@{/ajax/libs/fullscreen/jquery.fullscreen.js}"></script>
<script th:inline="javascript">
ruoyi-admin/src/main/resources/templates/lock.html
@@ -38,7 +38,7 @@
<script src="../static/js/bootstrap.min.js" th:src="@{/js/bootstrap.min.js}"></script>
<script src="../static/js/three.min.js" th:src="@{/js/three.min.js}"></script>
<script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script>
</body>
<script th:inline="javascript">
    var ctx = [[@{/}]];
ruoyi-admin/src/main/resources/templates/login.html
@@ -9,7 +9,7 @@
    <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
    <link href="../static/css/style.min.css" th:href="@{/css/style.min.css}" rel="stylesheet"/>
    <link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/>
    <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/>
    <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/>
    <!-- 360浏览器急速模式 -->
    <meta name="renderer" content="webkit">
    <!-- 避免IE使用兼容模式 -->
@@ -65,7 +65,7 @@
        </div>
        <div class="signup-footer">
            <div class="pull-left">
                Copyright © 2018-2025 ruoyi.vip All Rights Reserved. <br>
                Copyright © 2018-2024 ruoyi.vip All Rights Reserved. <br>
            </div>
        </div>
    </div>
@@ -76,7 +76,7 @@
<script src="../static/ajax/libs/validate/jquery.validate.min.js" th:src="@{/ajax/libs/validate/jquery.validate.min.js}"></script>
<script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script>
<script src="../static/ruoyi/login.js" th:src="@{/ruoyi/login.js}"></script>
</body>
</html>
ruoyi-admin/src/main/resources/templates/main.html
@@ -13,1764 +13,9 @@
<body class="gray-bg">
    <div class="row border-bottom white-bg dashboard-header">
        <div class="col-sm-12">
            <blockquote class="text-warning" style="font-size:14px">
                                           阿里云服务器折扣区 <a target="_blank" href="http://aly.ruoyi.vip">☛☛点我进入☚☚</a> &nbsp;&nbsp;&nbsp; 腾讯云服务器秒杀区 <a target="_blank" href="http://txy.ruoyi.vip">☛☛点我进入☚☚</a><br>
            </blockquote>
            <hr>
        </div>
        <div class="col-sm-3">
            <h2>Hello,Guest</h2>
            <small>移动设备访问请扫描以下二维码:</small>
            <br>
            <br>
            <img th:src="@{/img/qr_code.png}" width="100%" style="max-width:264px;">
            <br>
        </div>
        <div class="col-sm-5">
            <h2>若依后台管理框架</h2>
            <p>一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。,她可以用于所有的Web应用程序,如<b>网站管理后台</b>,<b>网站会员中心</b>,<b>CMS</b>,<b>CRM</b>,<b>OA</b>等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。</p>
            <p>
                <b>当前版本:</b><span>v[[${version}]]</span>
            </p>
            <p>
                <span class="label label-warning">&yen;免费开源</span>
            </p>
            <br>
            <p>
                <a class="btn btn-success btn-outline" href="https://gitee.com/y_project/RuoYi" target="_blank">
                    <i class="fa fa-cloud"> </i> 访问码云
                </a>
                <a class="btn btn-white btn-bitbucket" href="http://ruoyi.vip" target="_blank">
                    <i class="fa fa-home"></i> 访问主页
                </a>
            </p>
        </div>
        <div class="col-sm-4">
            <h4>技术选型:</h4>
            <ol>
                <li>核心框架:Spring Boot。</li>
                <li>安全框架:Apache Shiro。</li>
                <li>模板引擎:Thymeleaf。</li>
                <li>持久层框架:MyBatis。</li>
                <li>定时任务:Quartz。</li>
                <li>数据库连接池:Druid。</li>
                <li>工具类:Fastjson。</li>
                <li>更多……</li>
            </ol>
        </div>
    </div>
    <div class="wrapper wrapper-content">
        <div class="row">
            <div class="col-sm-4">
                <div class="ibox float-e-margins">
                    <div class="ibox-title">
                        <h5>联系信息</h5>
                    </div>
                    <div class="ibox-content">
                        <p><i class="fa fa-send-o"></i> 官网:<a href="http://www.ruoyi.vip" target="_blank">http://www.ruoyi.vip</a>
                        </p>
                        <p><i class="fa fa-qq"></i> QQ群:<s>满1389287</s> <s>满1679294</s> <s>满1529866</s> <s>满1772718</s> <s>满1366522</s> <s>满1382251</s> <s>满1145125</s> <s>满86752435</s> <s>满134072510</s> <s>满210336300</s> <s>满339522636</s> <s>满130035985</s> <s>满143151071</s> <s>满158781320</s> <s>满201531282</s> <s>满101526938</s> <s>满264355400</s> <s>满298522656</s> <s>满139845794</s>  <s>满185760789</s> <s>满175104288</s> <s>满174942938</s> <s>满287843737</s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=KTVAIhggR3rR3uZWK9A8kR4yYNREQ4jo&authKey=An4DUV9e7uK8I8VgBbp949z0ypQoDrOoqvVg%2FWOr2vuNNDMZUAMPvqHor6TFMIgz&noverify=0&group_code=232896766" target="_blank">232896766</a>
                        </p>
                        <p><i class="fa fa-weixin"></i> 微信:<a href="javascript:;">/ *若依</a>
                        </p>
                        <p><i class="fa fa-credit-card"></i> 支付宝:<a href="javascript:;" class="支付宝信息">/ *若依</a>
                        </p>
                    </div>
                </div>
            </div>
            <div class="col-sm-4">
                <div class="ibox float-e-margins">
                    <div class="ibox-title">
                        <h5>更新日志</h5>
                    </div>
                    <div class="ibox-content no-padding">
                        <div class="panel-body">
                            <div class="panel-group" id="version">
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v480">v4.8.0</a><code class="pull-right">2024.12.26</code>
                                   </h5>
                                </div>
                                <div id="v480" class="panel-collapse collapse in">
                                    <div class="panel-body">
                                       <ol>
                                            <li>支持自定义显示Excel属性列</li>
                                            <li>表格默认转义HTML字符串</li>
                                            <li>新增列宽拖动长内容自适应显示示例</li>
                                            <li>Excel注解支持wrapText是否允许内容换行</li>
                                            <li>代码生成新增配置是否允许文件覆盖到本地</li>
                                            <li>升级oshi到最新版本6.6.5</li>
                                            <li>升级tomcat到最新版本9.0.96</li>
                                            <li>升级logback到最新版本1.2.13</li>
                                            <li>升级commons.io到最新版本2.16.1</li>
                                            <li>升级spring-framework到最新版本5.3.39</li>
                                            <li>升级jquery.validate到最新版本v1.21.0</li>
                                            <li>优化导入带标题文件关闭清理</li>
                                            <li>代码生成创建表屏蔽违规的字符</li>
                                            <li>修复主子表数据显示问题</li>
                                            <li>修复记住我请求头过大的问题</li>
                                            <li>修复角色禁用权限不失效问题</li>
                                            <li>修复类匿名注解访问失效问题</li>
                                            <li>修复导出子列表对象只能在最后的问题</li>
                                            <li>修复多选下拉框open导致页签空白问题</li>
                                            <li>优化身份证脱敏正则</li>
                                            <li>优化查询时间范围日期格式</li>
                                            <li>优化异步树表格折叠同步子状态</li>
                                            <li>优化时间控件清除按钮样式问题</li>
                                            <li>优化表格图片预览动态路径显示问题</li>
                                            <li>优化select2下拉框必填背景色无法清空问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v479">v4.7.9</a><code class="pull-right">2024.06.06</code>
                                   </h5>
                                </div>
                                <div id="v479" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>通知公告新增详细显示</li>
                                            <li>新增数据脱敏过滤注解</li>
                                            <li>新增表格示例(虚拟滚动)</li>
                                            <li>新增表格示例(全文检索)</li>
                                            <li>新增表格示例(保存状态)</li>
                                            <li>代码生成支持表单布局选项</li>
                                            <li>限制用户操作数据权限范围</li>
                                            <li>用户密码新增非法字符验证</li>
                                            <li>默认加载layer扩展皮肤</li>
                                            <li>未修改初始密码弹框提醒</li>
                                            <li>定时任务白名单配置范围缩小</li>
                                            <li>操作日志列表重置回第一页</li>
                                            <li>定时任务日志默认按时间排序</li>
                                            <li>Excel注解ColumnType类型新增文本</li>
                                            <li>Excel注解新增属性comboReadDict</li>
                                            <li>新增Anonymous匿名访问不鉴权注解</li>
                                            <li>升级oshi到最新版本6.6.1</li>
                                            <li>升级druid到最新版本1.2.23</li>
                                            <li>升级commons.io到最新版本2.13.0</li>
                                            <li>升级spring-framework到安全版本</li>
                                            <li>升级bootstrap-table到最新版本1.22.6</li>
                                            <li>修复重置日期时出现的异常问题</li>
                                            <li>修复页签关闭后存在的跳转问题</li>
                                            <li>修复tooltip单击复制文本不生效的问题</li>
                                            <li>更新缓存管理键名排序方式</li>
                                            <li>更新HttpUtils中的User-Agent</li>
                                            <li>优化自定义XSS注解匹配方式</li>
                                            <li>优化登录注册页面验证码验证</li>
                                            <li>优化数据权限自定义匹配方式</li>
                                            <li>优化高频率定时任务不执行问题</li>
                                            <li>优化树表格align属性在标题生效</li>
                                            <li>优化代码生成主子表关联查询方式</li>
                                            <li>优化导入Excel时设置dictType属性重复查缓存问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v478">v4.7.8</a><code class="pull-right">2023.11.23</code>
                                   </h5>
                                </div>
                                <div id="v478" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>用户列表新增抽屉效果详细信息</li>
                                            <li>操作日志列表新增IP地址查询</li>
                                            <li>定时任务新增页去除状态选项</li>
                                            <li>系统管理角色列表显示数据权限</li>
                                            <li>通用排序属性orderBy参数限制长度</li>
                                            <li>新增isScrollToTop页签切换滚动到顶部</li>
                                            <li>Excel自定义数据处理器增加单元格/工作簿对象</li>
                                            <li>新增表格参数(数据值为空时显示的内容undefinedText)</li>
                                            <li>升级oshi到最新版本6.4.7</li>
                                            <li>升级shiro到最新版本1.13.0</li>
                                            <li>升级druid到最新版本1.2.20</li>
                                            <li>升级pagehelper到最新版1.4.7</li>
                                            <li>升级spring-boot到最新版本2.5.15</li>
                                            <li>升级jquery到最新版v3.7.1</li>
                                            <li>升级layer到最新版本v3.7.0</li>
                                            <li>升级layui到最新版本v2.8.18</li>
                                            <li>升级x-editable到最新版本1.5.3</li>
                                            <li>修复自定义字典样式不生效的问题</li>
                                            <li>修复弹窗按钮启用禁用方法无效问题</li>
                                            <li>修复横向菜单关闭最后一个页签状态问题</li>
                                            <li>修复Excel导入数据临时文件无法删除问题</li>
                                            <li>修复表格行内编辑启用翻页记住选择无效问题</li>
                                            <li>修复Excels导入时无法获取到dictType字典值问题</li>
                                            <li>优化重置密码鼠标按下显示密码</li>
                                            <li>优化参数键值文本框改为文本域</li>
                                            <li>优化表格重置默认返回到第一页</li>
                                            <li>优化菜单管理类型为按钮状态可选</li>
                                            <li>优化数字金额大写转换精度丢失问题</li>
                                            <li>优化树表查询无数据时清除分页信息</li>
                                            <li>优化通用detail详细信息弹窗不显示按钮</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v477">v4.7.7</a><code class="pull-right">2023.04.14</code>
                                   </h5>
                                </div>
                                <div id="v477" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>操作日志新增消耗时间属性</li>
                                            <li>日志管理使用索引提升查询性能</li>
                                            <li>日志注解支持排除指定的请求参数</li>
                                            <li>新增监控页面图标显示</li>
                                            <li>新增支持登录IP黑名单限制</li>
                                            <li>更新fontawesome图标示例</li>
                                            <li>屏蔽定时任务bean违规的字符</li>
                                            <li>支持自定义隐藏属性列过滤子对象</li>
                                            <li>连接池Druid支持新的配置connectTimeout和socketTimeout</li>
                                            <li>升级jquery到最新版v3.6.3</li>
                                            <li>升级layui到最新版本2.7.6</li>
                                            <li>升级jasny-bootstrap到最新版4.0.0</li>
                                            <li>升级oshi到最新版本6.4.1</li>
                                            <li>升级druid到最新版本1.2.16</li>
                                            <li>修复异步表格树子项排序问题</li>
                                            <li>修复冻结列不支持IE浏览器的问题</li>
                                            <li>修复主子表使用suggest插件无法新增问题</li>
                                            <li>修复菜单栏快速点击导致展开折叠样式问题</li>
                                            <li>修复用户多角色数据权限可能出现权限抬升的情况</li>
                                            <li>修复异步加载表格树重置列表父节点展开异常问题</li>
                                            <li>修复页签属性refresh为undefined时页面被刷新问题</li>
                                            <li>移除apache/commons-fileupload依赖</li>
                                            <li>优化前端属性提醒说明</li>
                                            <li>优化用户导入更新时需获取用户编号问题</li>
                                            <li>优化主子表根据序号删除方法加入表格ID参数</li>
                                            <li>优化导出Excel时设置dictType属性重复查缓存问题</li>
                                            <li>优化在线用户服务缓存改为从Bean容器获取不使用自动装配</li>
                                            <li>优化表格示例行拖拽后列表底部总记录条数变成了undefined问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v476">v4.7.6</a><code class="pull-right">2022.12.16</code>
                                   </h5>
                                </div>
                                <div id="v476" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>定时任务违规的字符</li>
                                            <li>忽略不必要的属性数据返回</li>
                                            <li>导入更新用户数据前校验数据权限</li>
                                            <li>修改参数键名时移除前缓存配置</li>
                                            <li>修改用户登录账号进行重复验证</li>
                                            <li>兼容Excel下拉框内容过多无法显示</li>
                                            <li>升级oshi到最新版本6.4.0</li>
                                            <li>升级kaptcha到最新版2.3.3</li>
                                            <li>升级druid到最新版本1.2.15</li>
                                            <li>升级shiro到最新版本1.10.1</li>
                                            <li>升级pagehelper到最新版1.4.6</li>
                                            <li>升级bootstrap-fileinput到最新版本5.5.2</li>
                                            <li>修复sheet超出最大行数异常问题</li>
                                            <li>修复关闭父页签后提交无法跳转的问题</li>
                                            <li>修复操作日志类型多选导出不生效问题</li>
                                            <li>修复导出包含空子列表数据异常的问题</li>
                                            <li>优化树形表格层级显示</li>
                                            <li>优化SQL关键字检查防止注入</li>
                                            <li>优化用户管理重置时取消部门选择</li>
                                            <li>优化代码生成同步后字典值NULL问题</li>
                                            <li>优化导出对象的子列表为空会出现[]问题</li>
                                            <li>优化select2搜索下拉后校验必填样式问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v475">v4.7.5</a><code class="pull-right">2022.09.05</code>
                                   </h5>
                                </div>
                                <div id="v475" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>Excel支持导出对象的子列表方法</li>
                                            <li>数据逻辑删除不进行唯一验证</li>
                                            <li>优化多角色数据权限匹配规则</li>
                                            <li>新增主子表提交校验示例</li>
                                            <li>支持自定义隐藏Excel属性列</li>
                                            <li>Excel注解支持backgroundColor属性设置背景颜色</li>
                                            <li>菜单配置刷新时Tab页签切换时刷新</li>
                                            <li>增加对AjaxResult消息结果类型的判断</li>
                                            <li>新增示例(进度条)</li>
                                            <li>新增内容编码/解码方便插件集成使用</li>
                                            <li>升级jquery到最新版3.6.1</li>
                                            <li>升级layui到最新版本2.7.5</li>
                                            <li>升级shiro到最新版本1.9.1</li>
                                            <li>升级druid到最新版本1.2.11</li>
                                            <li>升级pagehelper到最新版1.4.3</li>
                                            <li>升级oshi到最新版本6.2.2</li>
                                            <li>修复树表onLoadSuccess不生效的问题</li>
                                            <li>修复用户分配角色大于默认页数丢失问题</li>
                                            <li>定时任务支持执行父类方法</li>
                                            <li>自动设置切换多个树表格实例配置</li>
                                            <li>页签创建标题优先data-title属性</li>
                                            <li>优化任务过期不执行调度</li>
                                            <li>优化横向菜单下激活菜单样式</li>
                                            <li>优化按钮打开窗口后按回车反复弹出</li>
                                            <li>优化excel/scale属性导出单元格数值类型</li>
                                            <li>优化druid开启wall过滤器出现的异常问题</li>
                                            <li>优化多个相同角色数据导致权限SQL重复问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v474">v4.7.4</a><code class="pull-right">2022.06.01</code>
                                   </h5>
                                </div>
                                <div id="v474" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>用户头像上传图片格式限制</li>
                                            <li>Excel注解支持color属性设置字体颜色</li>
                                            <li>设置分页参数默认值</li>
                                            <li>主子表操作列新增单个删除</li>
                                            <li>定时任务检查Bean包名是否为白名单配置</li>
                                            <li>升级spring-boot到最新版本2.5.14</li>
                                            <li>升级shiro到最新版本1.9.0</li>
                                            <li>升级oshi到最新版本6.1.6</li>
                                            <li>升级fastjson到最新版1.2.83 安全修复版本</li>
                                            <li>文件上传兼容Weblogic环境</li>
                                            <li>新增清理分页的线程变量方法</li>
                                            <li>新增获取不带后缀文件名称方法</li>
                                            <li>用户缓存信息添加部门ancestors祖级列表</li>
                                            <li>自定义ShiroFilterFactoryBean防止中文请求被拦截</li>
                                            <li>字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)</li>
                                            <li>优化IP地址获取到多个的问题</li>
                                            <li>优化表格冻结列阴影效果显示</li>
                                            <li>优化菜单侧边栏滚动条尺寸及颜色</li>
                                            <li>优化显示顺序orderNum类型为整型</li>
                                            <li>优化接口使用泛型使其看到响应属性字段</li>
                                            <li>优化导出数据LocalDateTime类型无数据问题</li>
                                            <li>修复导入Excel时字典字段类型为Long转义为空问题</li>
                                            <li>优化导出excel单元格验证,包含变更为开头.防止正常内容被替换</li>
                                            <li>修复URL类型回退键被禁止问题</li>
                                            <li>修复表格客户端分页序号显示错误问题</li>
                                            <li>修复代码生成拖拽多次出现的排序不正确问题</li>
                                            <li>修复表格打印组件不识别多层对象属性值问题</li>
                                            <li>修复操作日志查询类型条件为0时会查到所有数据</li>
                                            <li>修复Excel注解prompt/combo同时使用不生效问题</li>
                                            <li>修复初始化多表格处理回调函数时获取的表格配置不一致问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v473">v4.7.3</a><code class="pull-right">2022.03.01</code>
                                   </h5>
                                </div>
                                <div id="v473" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>表格树支持分页/异步加载</li>
                                            <li>代码生成预览支持复制内容</li>
                                            <li>定时任务默认保存到内存中执行</li>
                                            <li>代码生成同步保留必填/类型选项</li>
                                            <li>页面若未匹配到字典标签则返回原字典值</li>
                                            <li>用户访问控制时校验数据权限,防止越权</li>
                                            <li>导出Excel时屏蔽公式,防止CSV注入风险</li>
                                            <li>升级spring-boot到最新版本2.5.10</li>
                                            <li>升级spring-boot-mybatis到最新版2.2.2</li>
                                            <li>升级pagehelper到最新版1.4.1</li>
                                            <li>升级oshi到最新版本6.1.2</li>
                                            <li>升级bootstrap-table到最新版本1.19.1</li>
                                            <li>服务监控新增运行参数信息显示</li>
                                            <li>定时任务目标字符串验证包名白名单</li>
                                            <li>文件上传接口新增原/新文件名返回参数</li>
                                            <li>定时任务屏蔽违规的字符</li>
                                            <li>分页数据新增分页参数合理化参数</li>
                                            <li>表格父子视图添加点击事件打开示例</li>
                                            <li>优化上传文件名称命名规则</li>
                                            <li>优化加载字典缓存数据</li>
                                            <li>优化任务队列满时任务拒绝策略</li>
                                            <li>优化IE11上传预览不显示的问题</li>
                                            <li>优化Excel格式化不同类型的日期对象</li>
                                            <li>优化国际化配置多余的zh请求问题</li>
                                            <li>优化新版Chrome浏览器回退出现的遮罩层</li>
                                            <li>修复EMAIL类型回退键被禁止问题</li>
                                            <li>修复Xss注解字段值为空时的异常问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v472">v4.7.2</a><code class="pull-right">2021.12.23</code>
                                   </h5>
                                </div>
                                <div id="v472" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>自定义xss校验注解实现</li>
                                            <li>进入修改页面方法添加权限标识</li>
                                            <li>代码生成创建按钮添加超级管理员权限</li>
                                            <li>代码生成创建表检查关键字,防止注入风险</li>
                                            <li>修复定时任务多参数逗号分隔的问题</li>
                                            <li>修复表格插件一起使用出现的声明报错问题</li>
                                            <li>修复代码生成主子表模板删除方法缺少事务</li>
                                            <li>升级oshi到最新版本v5.8.6</li>
                                            <li>升级velocity到最新版本2.3</li>
                                            <li>升级fastjson到最新版1.2.79</li>
                                            <li>升级log4j2到最新版2.17.0 防止漏洞风险</li>
                                            <li>升级thymeleaf到最新版3.0.14 阻止远程代码执行漏洞</li>
                                            <li>优化修改/授权角色实时生效</li>
                                            <li>修整tomcat配置参数已过期问题</li>
                                            <li>前端添加单独的二代身份证校验</li>
                                            <li>优化新增部门时验证用户所属部门</li>
                                            <li>优化查询用户的角色组&岗位组代码</li>
                                            <li>请求分页方法设置成通用方便灵活调用</li>
                                            <li>优化日期类型错误提示与图标重叠问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v471">v4.7.1</a><code class="pull-right">2021.11.10</code>
                                   </h5>
                                </div>
                                <div id="v471" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>新增是否开启页签功能</li>
                                            <li>代码生成的模块增加创建表功能</li>
                                            <li>Excel导入支持@Excels注解</li>
                                            <li>Excel注解支持导入导出标题信息</li>
                                            <li>Excel注解支持自定义数据处理器</li>
                                            <li>日志注解新增是否保存响应参数</li>
                                            <li>防重提交注解支持配置间隔时间/提示消息</li>
                                            <li>网页部分操作禁止使用后退键(Backspace)</li>
                                            <li>实例演示中增加多层窗口获取值</li>
                                            <li>弹出层openOptions增加动画属性</li>
                                            <li>升级spring-boot到最新版本2.5.6</li>
                                            <li>升级spring-boot-mybatis到最新版2.2.0</li>
                                            <li>升级pagehelper到最新版1.4.0</li>
                                            <li>升级oshi到最新版本v5.8.2</li>
                                            <li>升级druid到最新版1.2.8</li>
                                            <li>升级fastjson到最新版1.2.78</li>
                                            <li>升级thymeleaf-extras-shiro到最新版本v2.1.0</li>
                                            <li>升级bootstrap-fileinput到最新版本v5.2.4</li>
                                            <li>修改阿里云maven仓库地址为新版地址</li>
                                            <li>定时任务屏蔽违规字符</li>
                                            <li>增加sendGet无参请求方法</li>
                                            <li>代码生成去掉多余的排序字段</li>
                                            <li>优化启动脚本参数优化</li>
                                            <li>优化页签关闭右侧清除iframe元素</li>
                                            <li>优化多表格切换表单查询参数</li>
                                            <li>优化表格实例切换event不能为空</li>
                                            <li>优化mybatis全局默认的执行器</li>
                                            <li>优化导入Excel数据关闭时清理file</li>
                                            <li>优化Excel导入图片可能出现的异常</li>
                                            <li>优化记录登录信息,防止不必要的修改</li>
                                            <li>优化aop语法,使用spring自动注入注解</li>
                                            <li>修复无法被反转义问题</li>
                                            <li>修复拖拽行数据错位问题</li>
                                            <li>修复新窗口打开页面关闭弹窗报错</li>
                                            <li>修复富文本回退键被禁止&控制台报错问题</li>
                                            <li>修复自定义弹出层全屏参数无效问题</li>
                                            <li>修复树表代码生成短字段无法识别问题</li>
                                            <li>修复apple/webkit浏览器时间无法格式化</li>
                                            <li>修复后端主子表代码模板方法名生成错误问题</li>
                                            <li>修复swagger没有指定dataTypeClass导致启动出现warn日志</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v470">v4.7.0</a><code class="pull-right">2021.09.01</code>
                                   </h5>
                                </div>
                                <div id="v470" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>优化弹出层显示在顶层窗口</li>
                                            <li>定时任务支持在线生成cron表达式</li>
                                            <li>Excel注解支持Image图片导入</li>
                                            <li>支持配置是否开启记住我功能</li>
                                            <li>修改时检查用户数据权限范围</li>
                                            <li>表单重置开始/结束时间控件</li>
                                            <li>新增多图上传示例</li>
                                            <li>启用父部门状态排除顶级节点</li>
                                            <li>富文本默认dialogsInBody属性</li>
                                            <li>去除默认分页合理化参数</li>
                                            <li>顶部菜单跳转添加绝对路径</li>
                                            <li>升级oshi到最新版本v5.8.0</li>
                                            <li>升级shiro到最新版本v1.8.0</li>
                                            <li>升级commons.io到最新版本v2.11.0</li>
                                            <li>升级jquery到最新版v3.6.0</li>
                                            <li>升级icheck到最新版v1.0.3</li>
                                            <li>升级layer到最新版本v3.5.1</li>
                                            <li>升级layui到最新版本v2.6.8</li>
                                            <li>升级laydate到最新版本v5.3.1</li>
                                            <li>升级select2到最新版v4.0.13</li>
                                            <li>升级cropper到最新版本v1.5.12</li>
                                            <li>升级summernote到最新版本v0.8.18</li>
                                            <li>升级duallistbox到最新版本v3.0.9</li>
                                            <li>升级jquery.validate到最新版本v1.19.3</li>
                                            <li>升级bootstrap-suggest到最新版本v0.1.29</li>
                                            <li>升级bootstrap-select到最新版本v1.13.18</li>
                                            <li>升级bootstrap-fileinput到最新版本v5.2.3</li>
                                            <li>查询表格指定列值增加是否去重属性</li>
                                            <li>删除sourceMappingURL源映射</li>
                                            <li>去除多余的favicon.ico引入</li>
                                            <li>优化代码生成模板</li>
                                            <li>优化XSS跨站脚本过滤</li>
                                            <li>补充定时任务表字段注释</li>
                                            <li>定时任务屏蔽ldap远程调用</li>
                                            <li>定时任务屏蔽http(s)远程调用</li>
                                            <li>定时任务对检查异常进行事务回滚</li>
                                            <li>调度日志详细页添加关闭按钮</li>
                                            <li>优化异常打印输出信息</li>
                                            <li>优化移动端进入首页样式</li>
                                            <li>优化用户操作不能删除自己</li>
                                            <li>默认开始/结束时间绑定控件选择类型</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v462">v4.6.2</a><code class="pull-right">2021.07.01</code>
                                   </h5>
                                </div>
                                <div id="v462" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>优化参数&字典缓存操作</li>
                                            <li>新增表格参数(导出方式&导出文件类型)</li>
                                            <li>新增表格示例(自定义视图分页)</li>
                                            <li>新增示例(表格列拖拽)</li>
                                            <li>集成yuicompressor实现(CSS/JS压缩)</li>
                                            <li>新增表格参数(是否支持打印页面showPrint)</li>
                                            <li>支持bat脚本执行应用</li>
                                            <li>修复存在的SQL注入漏洞问题</li>
                                            <li>定时任务屏蔽rmi远程调用</li>
                                            <li>导出Excel文件支持数据流下载方式</li>
                                            <li>实例演示弹层组件增加相册层示例</li>
                                            <li>删除操作日志记录信息</li>
                                            <li>增加表格重置分页的参数</li>
                                            <li>限制超级管理员不允许操作</li>
                                            <li>树级结构更新子节点使用replaceFirst</li>
                                            <li>支持动态生成密匙,防止默认密钥泄露</li>
                                            <li>升级pagehelper到最新版1.3.1</li>
                                            <li>升级oshi到最新版本v5.7.4</li>
                                            <li>升级swagger到最新版本v3.0.0</li>
                                            <li>升级commons.io到最新版本v2.10.0</li>
                                            <li>升级commons.fileupload到最新版本v1.4</li>
                                            <li>升级bootstrap-table到最新版本v1.18.3</li>
                                            <li>升级druid到最新版本v1.2.6</li>
                                            <li>升级fastjson到最新版1.2.76</li>
                                            <li>升级layui到最新版本v2.6.6</li>
                                            <li>升级layer到最新版本v3.5.0</li>
                                            <li>升级laydate到最新版本v5.3.0</li>
                                            <li>优化表格树移动端&边框显示</li>
                                            <li>新增表格刷新options配置方法</li>
                                            <li>优化图片工具类读取文件,防止异常</li>
                                            <li>修复表格图片预览移动端宽高无效问题</li>
                                            <li>主子表通用操作封装处理增加文本域类型</li>
                                            <li>日志注解兼容获取json类型的参数</li>
                                            <li>修复表单向导插件有滚动条时底部工具栏无法固定问题</li>
                                            <li>修复导出角色数据范围翻译缺少仅本人</li>
                                            <li>修正Velocity模板初始字符集</li>
                                            <li>升级mybatis到最新版3.5.6 阻止远程代码执行漏洞</li>
                                            <li>优化代码生成导出模板名称</li>
                                            <li>修改个人中心密码长度提醒</li>
                                            <li>实例演示中弹出表格增加以回调形式回显到父窗体</li>
                                            <li>修复登录页面弹窗文字不显示的问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v461">v4.6.1</a><code class="pull-right">2021.04.12</code>
                                   </h5>
                                </div>
                                <div id="v461" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>新增IE浏览器版本过低提示页面</li>
                                            <li>新增详细信息tab页签方式</li>
                                            <li>新增解锁屏幕打开上次页签</li>
                                            <li>数据监控默认账户密码防止越权访问</li>
                                            <li>新增表格示例(导出选择列)</li>
                                            <li>个人信息添加手机&邮箱重复验证</li>
                                            <li>个人中心刷新后样式问题</li>
                                            <li>操作日志返回参数添加非空验证</li>
                                            <li>velocity剔除commons-collections版本,防止3.2.1版本的反序列化漏洞</li>
                                            <li>子表模板默认日期格式化</li>
                                            <li>代码生成预览语言根据后缀名高亮显示</li>
                                            <li>代码生成主子表相同字段导致数据问题</li>
                                            <li>升级SpringBoot到最新版本2.2.13</li>
                                            <li>升级shiro到最新版1.7.1 阻止身份认证绕过漏洞</li>
                                            <li>升级bootstrapTable到最新版本v1.18.2</li>
                                            <li>升级bootstrapTable相关组件到最新版本v1.18.2</li>
                                            <li>升级fastjson到最新版1.2.75</li>
                                            <li>升级druid到最新版本v1.2.4</li>
                                            <li>升级oshi到最新版本v5.6.0</li>
                                            <li>修改ip字段长度防止ipv6地址长度不够</li>
                                            <li>搜索建议示例选择后隐藏列表</li>
                                            <li>主子表示例增加初始化数据</li>
                                            <li>优化Excel导入增加空行判断</li>
                                            <li>修复横向菜单无法打开页签问题</li>
                                            <li>修复导入数据为负浮点数时,导入结果会丢失精度问题</li>
                                            <li>优化更多操作按钮左侧移入内容闪现消失情况</li>
                                            <li>修复主子表提交中列隐藏后出现列偏移问题</li>
                                            <li>单据打印网页时通过hidden-print隐藏元素</li>
                                            <li>表格销毁清除记住选择数据</li>
                                            <li>增加表格动态列示例</li>
                                            <li>代码生成选择主子表关联元素必填</li>
                                            <li>tree根据Id和Name选中指定节点增加空判断</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v46">v4.6.0</a><code class="pull-right">2021.01.01</code>
                                   </h5>
                                </div>
                                <div id="v46" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>新增缓存监控管理</li>
                                            <li>新增锁定屏幕功能</li>
                                            <li>菜单新增是否刷新页面</li>
                                            <li>删除用户和角色解绑关联</li>
                                            <li>新增密码强度字符范围提示</li>
                                            <li>防止匿名访问进行过滤</li>
                                            <li>升级SpringBoot到最新版本2.2.12</li>
                                            <li>升级poi到最新版本4.1.2</li>
                                            <li>升级bitwalker到最新版本1.21</li>
                                            <li>升级bootstrap-fileinput到最新版本5.1.3</li>
                                            <li>升级bootstrapTable到最新版本v1.18.0</li>
                                            <li>升级bootstrapTable相关组件到最新版本v1.18.0</li>
                                            <li>升级oshi到最新版本v5.3.6</li>
                                            <li>新增示例(标签 & 提示)</li>
                                            <li>添加单据打印示例</li>
                                            <li>修改表格初始参数sortName默认值为undefined</li>
                                            <li>新增表格参数(自定义打印页面模板printPageBuilder)</li>
                                            <li>新增表格参数(是否显示行间隔色striped)</li>
                                            <li>新增表格参数(渲染完成后执行的事件onPostBody)</li>
                                            <li>Excel注解支持Image图片导出</li>
                                            <li>Excel支持注解align对齐方式</li>
                                            <li>Excel支持导入Boolean型数据</li>
                                            <li>主子表操作添加通用addColumn方法</li>
                                            <li>代码生成日期控件区分范围</li>
                                            <li>代码生成数据库文本类型生成表单文本域</li>
                                            <li>修复生成主子表外键名错误</li>
                                            <li>选项卡新增是否刷新属性</li>
                                            <li>修复树表格表头跟表格宽度不同步的问题</li>
                                            <li>表格树加载完成触发tooltip方法</li>
                                            <li>使用widthUnit定义树表格选项单位</li>
                                            <li>修复主子表editColumn序列问题</li>
                                            <li>修复添加全屏在无参数时没有替换url参数问题</li>
                                            <li>弹出层openOptions移动端自适应</li>
                                            <li>防止错误页返回主页出现嵌套问题</li>
                                            <li>设置回显数据字典验证防止空值</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v451">v4.5.1</a><code class="pull-right">2020.11.18</code>
                                   </h5>
                                </div>
                                <div id="v451" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>阻止任意文件下载漏洞</li>
                                            <li>升级shiro到最新版1.7.0 阻止权限绕过漏洞</li>
                                            <li>升级druid到最新版本v1.2.2</li>
                                            <li>新增表格行触发事件(onCheck、onUncheck、onCheckAll、onUncheckAll)</li>
                                            <li>修复多页签关闭非当前选项出现空白问题</li>
                                            <li>代码生成预览支持高亮显示</li>
                                            <li>mapperLocations配置支持分隔符</li>
                                            <li>权限信息调整</li>
                                            <li>个人中心头像和上传头像增加默认图片</li>
                                            <li>全局配置类保持和其他应用命名相同</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v45">v4.5.0</a><code class="pull-right">2020.10.20</code>
                                   </h5>
                                </div>
                                <div id="v45" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>新增菜单导航显示风格(default为左侧导航菜单,topnav为顶部导航菜单)</li>
                                            <li>菜单&数据权限新增(展开/折叠 全选/全不选 父子联动)</li>
                                            <li>账号密码支持自定义更新周期</li>
                                            <li>初始密码支持自定义修改策略</li>
                                            <li>新增校验用户修改新密码不能与旧密码相同</li>
                                            <li>添加检查密码范围支持的特殊字符包括:~!@#$%^&*()-=_+</li>
                                            <li>注册账号设置默认用户名称及密码最后更新时间</li>
                                            <li>去除用户手机邮箱部门必填验证</li>
                                            <li>新增日期格式化方法</li>
                                            <li>代码生成添加bit类型</li>
                                            <li>树结构加载添加callBack回调方法</li>
                                            <li>修复用户管理页面滚动返回顶部条失效</li>
                                            <li>修复代码生成模板文件上传组件缺少ctx的问题</li>
                                            <li>限制系统内置参数不允许删除</li>
                                            <li>新增表格列宽拖动插件</li>
                                            <li>新增Ajax局部刷新demo</li>
                                            <li>新增是否开启页脚功能</li>
                                            <li>新增表格参数(通过自定义函数设置标题样式headerStyle)</li>
                                            <li>新增表格参数(通过自定义函数设置页脚样式footerStyle)</li>
                                            <li>修复窗体大小改变后浮动提示框失效问题</li>
                                            <li>生成代码补充必填样式</li>
                                            <li>生成页面时不忽略remark属性</li>
                                            <li>字典数据列表页添加关闭按钮</li>
                                            <li>Excel注解支持自动统计数据总和</li>
                                            <li>升级springboot到2.1.17 提升安全性</li>
                                            <li>升级pagehelper到最新版1.3.0</li>
                                            <li>升级druid到最新版本v1.2.1</li>
                                            <li>升级fastjson到最新版1.2.74</li>
                                            <li>升级bootstrap-fileinput到最新版本5.1.2</li>
                                            <li>升级oshi到最新版本v5.2.5</li>
                                            <li>表单向导插件更换为jquery-smartwizard</li>
                                            <li>修改主子表提交示例代码防止渲染失效</li>
                                            <li>添加导入数据弹出窗体自定义宽高</li>
                                            <li>用户信息参数返回忽略掉密码字段</li>
                                            <li>优化关闭窗体添加index参数</li>
                                            <li>回显数据字典(字符串数组)增加空值判断</li>
                                            <li>修改前端密码长度校验和错误提示不符问题</li>
                                            <li>AjaxResult重写put方法,以方便链式调用</li>
                                            <li>增强验证码校验的语义,更易懂</li>
                                            <li>导入excel整形值校验优化</li>
                                            <li>Excel导出类型NUMERIC支持精度浮点类型</li>
                                            <li>导出Excel调整targetAttr获取值方法,防止get方法不规范</li>
                                            <li>输入框组验证错误后置图标提示颜色</li>
                                            <li>上传媒体类型添加视频格式</li>
                                            <li>数据权限判断参数类型</li>
                                            <li>修正数据库字符串类型nvarchar</li>
                                            <li>优化递归子节点</li>
                                            <li>修复多表格搜索formId无效</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v44">v4.4.0</a><code class="pull-right">2020.08.24</code>
                                   </h5>
                                </div>
                                <div id="v44" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>升级bootstrapTable到最新版本1.17.1</li>
                                            <li>升级shiro到最新版1.6.0 阻止权限绕过漏洞</li>
                                            <li>升级fastjson到最新版1.2.73</li>
                                            <li>代码生成支持同步数据库</li>
                                            <li>代码生成支持富文本控件</li>
                                            <li>用户密码支持自定义配置规则</li>
                                            <li>新增表格自动刷新插件</li>
                                            <li>新增表格打印配置插件</li>
                                            <li>更换图片裁剪工具为cropper</li>
                                            <li>Excel支持sort导出排序</li>
                                            <li>代码生成支持自定义路径</li>
                                            <li>代码生成支持选择上级菜单</li>
                                            <li>代码生成支持上传控件</li>
                                            <li>新增表格参数(自定义加载文本的字体大小loadingFontSize)</li>
                                            <li>Excel注解支持设置BigDecimal精度&舍入规则</li>
                                            <li>操作日志记录排除敏感属性字段</li>
                                            <li>修复不同浏览器附件下载中文名乱码的问题</li>
                                            <li>用户分配角色不允许选择超级管理员角色</li>
                                            <li>更换表格冻结列插件</li>
                                            <li>添加右侧冻结列示例</li>
                                            <li>升级表格行编辑&移动端适应插件</li>
                                            <li>修复更新表格插件后无法设置实例配置问题</li>
                                            <li>修复更新表格插件后导致的主子表错误</li>
                                            <li>修复页面存在多表格,回调函数res数据不正确问题</li>
                                            <li>强退&过期清理登录帐号缓存会话</li>
                                            <li>表格树标题内容支持html语义化标签</li>
                                            <li>修复配置应用的访问路径首页页签重复问题</li>
                                            <li>优化openTab打开时滚动到当前页签</li>
                                            <li>表格请求方式method支持自定义配置</li>
                                            <li>菜单页签联动优化</li>
                                            <li>用户邮箱长度限制修改为50</li>
                                            <li>主子表示例添加日期格式案例</li>
                                            <li>修改表格行内编辑示例旧值参数</li>
                                            <li>操作日志查询方式调整</li>
                                            <li>唯一限制条件只返回单条数据</li>
                                            <li>修改Excel设置STRING单元格类型</li>
                                            <li>添加获取当前的环境配置方法</li>
                                            <li>截取返回参数长度,防止超出异常</li>
                                            <li>定时任务cron表达式验证</li>
                                            <li>拆分表格插件,按需引入</li>
                                            <li>多行文本框补齐必填错误提示背景</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v431">v4.3.1</a><code class="pull-right">2020.07.05</code>
                                   </h5>
                                </div>
                                <div id="v431" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>国家信息安全漏洞(请务必保持cipherKey密钥唯一性)</li>
                                            <li>升级shiro到最新版1.5.3 阻止权限绕过漏洞</li>
                                            <li>修改验证码在使用后清除,防止多次使用</li>
                                            <li>检查字符支持小数点&降级改成异常提醒</li>
                                            <li>openOptions函数中加入自定义maxmin属性</li>
                                            <li>支持openOptions方法最大化</li>
                                            <li>支持openOptions方法多个按钮回调</li>
                                            <li>新增isLinkage支持页签与菜单联动</li>
                                            <li>修改代码生成导入表结构出现异常页面不提醒问题</li>
                                            <li>优化用户头像发生错误,则显示一个默认头像</li>
                                            <li>Excel导出支持字典类型</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v43">v4.3.0</a><code class="pull-right">2020.06.22</code>
                                   </h5>
                                </div>
                                <div id="v43" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>代码生成模板支持主子表</li>
                                            <li>代码生成显示类型支持复选框</li>
                                            <li>前端表单样式修改成圆角</li>
                                            <li>新增回显数据字典(字符串数组)</li>
                                            <li>修复浏览器手动缩放比例后菜单无法自适应问题</li>
                                            <li>限制用户不允许选择系统管理员角色</li>
                                            <li>用户信息添加输入框组图标&鼠标按下显示密码</li>
                                            <li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li>
                                            <li>升级Bootstrap版本到v3.3.7</li>
                                            <li>修复selectColumns方法获取子对象数据无效问题</li>
                                            <li>修改数据源类型优先级,先根据方法,再根据类</li>
                                            <li>修改上级部门(选择项排除本身和下级)</li>
                                            <li>首页菜单显示调整</li>
                                            <li>添加是否开启swagger配置</li>
                                            <li>新增示例(主子表提交)</li>
                                            <li>新增示例(多级联动下拉示例)</li>
                                            <li>新增示例(表格属性data数据加载)</li>
                                            <li>新增表格列参数(是否列选项可见ignore)</li>
                                            <li>新增表格参数(是否启用显示卡片视图cardView)</li>
                                            <li>新增表格参数(是否显示全屏按钮showFullscreen)</li>
                                            <li>新增表格参数(是否启用分页条无限循环的功能paginationLoop)</li>
                                            <li>新增表格参数(是否显示表头showHeader)</li>
                                            <li>表格添加显示/隐藏所有列方法 showAllColumns/hideAllColumns</li>
                                            <li>修复部分情况节点不展开问题</li>
                                            <li>修复关闭标签页后刷新还是上次地址问题</li>
                                            <li>修复选择菜单后刷新页面,菜单箭头显示不对问题</li>
                                            <li>修复jquery表单序列化时复选框未选中不会序列化到对象中问题</li>
                                            <li>Excel支持readConverterExp读取字符串组内容</li>
                                            <li>更换IP地址查询接口</li>
                                            <li>默认关闭获取ip地址</li>
                                            <li>操作处理ajaxSuccess判断修正</li>
                                            <li>HttpUtils.sendPost()方法,参数无需拼接参数到url</li>
                                            <li>通用http发送方法增加参数 contentType 编码类型</li>
                                            <li>HTML过滤器不替换&实体</li>
                                            <li>代码生成浮点型改用BigDecimal</li>
                                            <li>修复表单构建单选和多选框渲染问题</li>
                                            <li>代码生成模板调整,字段为String并且必填则加空串条件</li>
                                            <li>字典数据查询列表根据dictSort升序排序</li>
                                            <li>修复树表对imageView和tooltip方法无效问题</li>
                                            <li>修复Long类型比较相等问题调整</li>
                                            <li>示例demo页面清除html链接,防止点击后跳转出现404</li>
                                            <li>在线用户强退方法合并</li>
                                            <li>添加校验部门包含未停用的子部门</li>
                                            <li>取消回车自动提交表单</li>
                                            <li>'A','I','BUTTON' 标签忽略clickToSelect事件,防止点击操作按钮时选中</li>
                                            <li>邮箱显示截取部分字符串,防止低分辨率错位</li>
                                            <li>代码生成列属性根据sort排序</li>
                                            <li>修复更多操作部分浏览器不兼容情况</li>
                                            <li>图片预览事件属性修正</li>
                                            <li>修复冻结列排序样式无效问题</li>
                                            <li>修复context-path的情况下个人中心刷新导致样式问题</li>
                                            <li>全屏editFull打开适配表树</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v42">v4.2.0</a><code class="pull-right">2020.03.23</code>
                                   </h5>
                                </div>
                                <div id="v42" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>用户管理添加分配角色页面</li>
                                            <li>定时任务添加调度日志按钮</li>
                                            <li>新增是否开启用户注册功能</li>
                                            <li>新增页面滚动显示返回顶部按钮</li>
                                            <li>用户&角色&任务添加更多操作按钮</li>
                                            <li>iframe框架页会话过期弹出超时提示</li>
                                            <li>移动端登录不显示左侧菜单</li>
                                            <li>侧边栏添加一套深蓝色主题</li>
                                            <li>首页logo固定,不随菜单滚动</li>
                                            <li>支持mode配置history(表示去掉地址栏的#)</li>
                                            <li>任务分组字典翻译(调度日志详细)</li>
                                            <li>字典管理添加缓存读取</li>
                                            <li>字典数据列表标签显示样式</li>
                                            <li>参数管理支持缓存操作</li>
                                            <li>日期控件清空结束时间设置开始默认值为2099-12-31</li>
                                            <li>表格树添加获取数据后响应回调处理</li>
                                            <li>批量替换表前缀调整</li>
                                            <li>支持表格导入模板的弹窗表单加入其它输入控件</li>
                                            <li>表单重置刷新表格树</li>
                                            <li>新增支持导出数据字段排序</li>
                                            <li>新增表格参数(是否单选checkbox)</li>
                                            <li>druid未授权不允许访问</li>
                                            <li>表格树父节点兼容0,'0','',null</li>
                                            <li>表单必填的项添加星号</li>
                                            <li>修复select2不显示校验错误信息</li>
                                            <li>添加自定义HTML过滤器</li>
                                            <li>修复多数据源下开关关闭出现异常问题</li>
                                            <li>修复翻页记住选择项数据问题</li>
                                            <li>用户邮箱长度限制20</li>
                                            <li>修改错误页面返回主页出现嵌套问题</li>
                                            <li>表格浮动提示单双引号转义</li>
                                            <li>支持配置四级菜单</li>
                                            <li>升级shiro到最新版1.4.2 阻止rememberMe漏洞攻击</li>
                                            <li>升级summernote到最新版本v0.8.12</li>
                                            <li>导入Excel根据dateFormat属性格式处理</li>
                                            <li>修复War部署无法正常shutdown,ehcache内存泄漏</li>
                                            <li>修复代码生成短字段无法识别问题</li>
                                            <li>修复serviceImpl模版,修改方法判断日期错误</li>
                                            <li>代码生成模板增加导出功能日志记录</li>
                                            <li>代码生成唯一编号调整为tableId</li>
                                            <li>代码生成查询时忽略大小写</li>
                                            <li>代码生成支持翻页记住选中</li>
                                            <li>代码生成表注释未填写也允许导入</li>
                                            <li>Global全局配置类修改为注解,防止多环境配置下读取问题</li>
                                            <li>修复多表格情况下,firstLoad只对第一个表格生效</li>
                                            <li>处理Maven打包出现警告问题</li>
                                            <li>默认主题样式,防止网速慢情况下出现空白</li>
                                            <li>修复文件上传多级目录识别问题</li>
                                            <li>锚链接解码url,防止中文导致页面不能加载问题</li>
                                            <li>修复右键Tab页刷新事件重复请求问题</li>
                                            <li>角色禁用&菜单隐藏不查询权限</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v41">v4.1.0</a><code class="pull-right">2019.10.22</code>
                                   </h5>
                                </div>
                                <div id="v41" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>支持多表格实例操作</li>
                                            <li>浮动提示方法tooltip支持弹窗</li>
                                            <li>代码生成&字典数据支持模糊条件查询</li>
                                            <li>增加页签全屏方法</li>
                                            <li>增加清除表单验证错误信息方法</li>
                                            <li>支持iframe局部刷新页面</li>
                                            <li>支持在线切换主题</li>
                                            <li>修改图片预览设置的高宽参数颠倒问题</li>
                                            <li>操作日志新增解锁账户功能</li>
                                            <li>管理员用户&角色不允许操作</li>
                                            <li>去掉jsoup包调用自定义转义工具</li>
                                            <li>添加时间轴示例</li>
                                            <li>修复翻页记住选择时获取指定列值的问题</li>
                                            <li>代码生成sql脚本添加导出按钮</li>
                                            <li>添加表格父子视图示例</li>
                                            <li>添加表格行内编辑示例</li>
                                            <li>升级fastjson到最新版1.2.60 阻止漏洞攻击</li>
                                            <li>升级echarts到最新版4.2.1</li>
                                            <li>操作日志新增返回参数</li>
                                            <li>支持mybatis通配符扫描任意多个包</li>
                                            <li>权限验证多种情况处理</li>
                                            <li>修复树形类型的代码生成的部分必要属性无法显示</li>
                                            <li>修复非表格插件情况下重置出现异常</li>
                                            <li>修复富文本编辑器有序列表冲突</li>
                                            <li>代码生成表前缀配置支持多个</li>
                                            <li>修复自动去除表前缀配置无效问题</li>
                                            <li>菜单列表按钮数据可见不显示(权限标识控制)</li>
                                            <li>修复设置会话超时时间无效问题</li>
                                            <li>新增本地资源通用下载方法</li>
                                            <li>操作日志记录新增请求方式</li>
                                            <li>代码生成单选按钮属性重名修复</li>
                                            <li>优化select2下拉框宽度不会随浏览器改变</li>
                                            <li>修复代码生成树表异常</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v40">v4.0.0</a><code class="pull-right">2019.08.08</code>
                                   </h5>
                                </div>
                                <div id="v40" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>代码生成支持预览、编辑,保存方案</li>
                                            <li>新增防止表单重复提交注解</li>
                                            <li>新增后端校验(和前端保持一致)</li>
                                            <li>新增同一个用户最大会话数控制</li>
                                            <li>Excel导出子对象支持多个字段</li>
                                            <li>定时任务支持静态调用和多参数</li>
                                            <li>定时任务增加分组条件查询</li>
                                            <li>字典类型增加任务分组数据</li>
                                            <li>新增表格是否首次加载数据</li>
                                            <li>新增parentTab选项卡可在同一页签打开</li>
                                            <li>多数据源支持类注解(允许继承父类的注解)</li>
                                            <li>部门及以下数据权限(调整为以下及所有子节点)</li>
                                            <li>新增角色数据权限配(仅本人数据权限)</li>
                                            <li>修改菜单权限显示问题</li>
                                            <li>上传文件修改路径及返回名称</li>
                                            <li>添加报表插件及示例</li>
                                            <li>添加首页统计模板</li>
                                            <li>添加表格拖拽示例</li>
                                            <li>添加卡片列表示例</li>
                                            <li>添加富文本编辑器示例</li>
                                            <li>添加表格动态增删改查示例</li>
                                            <li>添加用户页面岗位选择框提示</li>
                                            <li>点击菜单操作添加背景高亮显示</li>
                                            <li>表格树新增showSearch是否显示检索信息</li>
                                            <li>解决表格列设置sortName无效问题</li>
                                            <li>表格图片预览支持自定义设置宽高</li>
                                            <li>添加表格列浮动提示(单击文本复制)</li>
                                            <li>PC端收起菜单后支持浮动显示</li>
                                            <li>详细操作样式调整</li>
                                            <li>修改用户更新描述空串不更新问题</li>
                                            <li>导入修改为模板渲染</li>
                                            <li>修改菜单及部门排序规则</li>
                                            <li>角色导出数据范围表达式翻译</li>
                                            <li>添加summernote富文本字体大小</li>
                                            <li>优化表格底部下边框防重叠&汇总像素问题</li>
                                            <li>树表格支持属性多层级访问</li>
                                            <li>修复IE浏览器用户管理界面右侧留白问题</li>
                                            <li>重置按钮刷新表格</li>
                                            <li>重置密码更新用户缓存</li>
                                            <li>优化验证码属性参数</li>
                                            <li>支持数据监控配置用户名和密码</li>
                                            <li>文件上传修改按钮背景及加载动画</li>
                                            <li>支持配置一级菜单href跳转</li>
                                            <li>侧边栏添加一套浅色主题</li>
                                            <li>树表格添加回调函数(校验异常状态)</li>
                                            <li>用户个人中心适配手机端显示</li>
                                            <li>Excel支持设置导出类型&更换样式</li>
                                            <li>检查属性改变修改为克隆方式(防止热部署强转异常)</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v34">v3.4.0</a><code class="pull-right">2019.06.03</code>
                                   </h5>
                                </div>
                                <div id="v34" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>新增实例演示菜单及demo</li>
                                            <li>新增页签右键操作</li>
                                            <li>菜单管理新增打开方式</li>
                                            <li>新增点击某行触发的事件</li>
                                            <li>新增双击某行触发的事件</li>
                                            <li>新增单击某格触发的事件</li>
                                            <li>新增双击某格触发的事件</li>
                                            <li>新增是否启用显示细节视图</li>
                                            <li>支持上传任意格式文件</li>
                                            <li>修复角色权限注解失效问题</li>
                                            <li>左侧的菜单栏宽度调整</li>
                                            <li>新增响应完成后自定义回调函数</li>
                                            <li>支持前端及其他模块直接获取用户信息</li>
                                            <li>升级swagger到最新版2.9.2</li>
                                            <li>升级jquery.slimscroll到最新版1.3.8</li>
                                            <li>升级select2到最新版4.0.7</li>
                                            <li>新增角色配置本部门数据权限</li>
                                            <li>新增角色配置本部门及以下数据权限</li>
                                            <li>优化底部操作防止跳到页面顶端</li>
                                            <li>修改冻结列选框无效及样式问题</li>
                                            <li>修复部门四层级修改祖级无效问题</li>
                                            <li>更换开关切换按钮样式</li>
                                            <li>新增select2-bootstrap美化下拉框</li>
                                            <li>添加表格内图片预览方法</li>
                                            <li>修复权限校验失败跳转页面路径错误</li>
                                            <li>国际化资源文件调整</li>
                                            <li>通知公告布局调整</li>
                                            <li>删除页签操作功能</li>
                                            <li>表格树新增查询指定列值</li>
                                            <li>更改系统接口扫描方式及完善测试案例</li>
                                            <li>表格列浮动提示及字典回显默认去背景</li>
                                            <li>修复启用翻页记住前面的选择check没选中问题</li>
                                            <li>去除监控页面底部的广告</li>
                                            <li>日期控件功问题修复及data功能增强</li>
                                            <li>新增角色权限可见性(前端直接调用)</li>
                                            <li>新增获取当前登录用户方法(前端及子模块调用)</li>
                                            <li>修复热部署重启导致菜单丢失问题</li>
                                            <li>优化业务校验失败普通请求跳转页面</li>
                                            <li>操作日志新增状态条件查询</li>
                                            <li>操作类型支持多选条件查询</li>
                                            <li>通知公告防止滚动触底回弹优化</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                             </div>
                             <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v33">v3.3.0</a><code class="pull-right">2019.04.01</code>
                                   </h5>
                                </div>
                                <div id="v33" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>新增线程池统一管理</li>
                                            <li>新增支持左右冻结列</li>
                                            <li>新增表格字符超长浮动提示</li>
                                            <li>升级datepicker拓展并汉化</li>
                                            <li>升级druid到最新版本v1.1.14</li>
                                            <li>修复个人头像为图片服务器跨域问题</li>
                                            <li>修改上传文件按日期存储</li>
                                            <li>新增表格客户端分页选项</li>
                                            <li>新增表格的高度参数</li>
                                            <li>新增表格销毁方法</li>
                                            <li>新增表格下拉按钮切换方法</li>
                                            <li>新增表格分页跳转到指定页码</li>
                                            <li>新增表格启用点击选中行参数</li>
                                            <li>修复表格数据重新加载未触发部分按钮禁用</li>
                                            <li>使用jsonview展示操作日志参数</li>
                                            <li>新增方法(addTab、editTab)</li>
                                            <li>修改用户管理界面为Tab打开方式</li>
                                            <li>表单验证代码优化</li>
                                            <li>修复@Excel注解 prompt 属性使用报错</li>
                                            <li>修复combo属性Excel兼容性问题</li>
                                            <li>新增@Excel导入导出支持父类字段</li>
                                            <li>修复关闭最后选项卡无法激活滚动问题</li>
                                            <li>增加日期控件显示类型及回显格式扩展选项</li>
                                            <li>修复定时任务执行失败后入库状态为成功状态</li>
                                            <li>支持定时任务并发开关控制</li>
                                            <li>优化权限校验失败普通请求跳转页面</li>
                                            <li>捕获线程池执行任务抛出的异常</li>
                                            <li>修复IE浏览器导出功能报错</li>
                                            <li>新增角色管理分配用户功能</li>
                                            <li>新增表格翻页记住前面的选择</li>
                                            <li>调整用户个人中心页面</li>
                                            <li>修复界面存在的一些安全问题</li>
                                            <li>其他细节优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v32">v3.2.0</a><code class="pull-right">2019.01.18</code>
                                   </h5>
                                </div>
                                <div id="v32" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>部门修改时不允许选择最后节点</li>
                                            <li>修复部门菜单排序字段无效</li>
                                            <li>修复光驱磁盘导致服务监控异常</li>
                                            <li>登录界面去除check插件</li>
                                            <li>验证码文本字符间距修正</li>
                                            <li>升级SpringBoot到最新版本2.1.1</li>
                                            <li>升级MYSQL驱动</li>
                                            <li>修正登录必填项位置偏移</li>
                                            <li>Session会话检查优化</li>
                                            <li>Excel注解支持多级获取</li>
                                            <li>新增序列号生成方法</li>
                                            <li>修复WAR部署tomcat退出线程异常</li>
                                            <li>全屏操作增加默认确认/关闭</li>
                                            <li>修复个人信息可能导致漏洞</li>
                                            <li>字典数据根据下拉选择新增类型</li>
                                            <li>升级Summernote到最新版本v0.8.11</li>
                                            <li>新增用户数据导入</li>
                                            <li>首页主题样式更换</li>
                                            <li>layer扩展主题更换</li>
                                            <li>用户管理移动端默认隐藏左侧布局</li>
                                            <li>详细信息弹出层显示在顶层</li>
                                            <li>表格支持切换状态(用户/角色/定时任务)</li>
                                            <li>Druid数据源支持配置继承</li>
                                            <li>修正部分iPhone手机端表格适配问题</li>
                                            <li>新增防止重复提交表单方法</li>
                                            <li>新增表格数据统计汇总方法</li>
                                            <li>支持富文本上传图片文件</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v31">v3.1.0</a><code class="pull-right">2018.12.03</code>
                                   </h5>
                                </div>
                                <div id="v31" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>新增内网不获取IP地址</li>
                                            <li>新增cron表达式有效校验</li>
                                            <li>定时任务新增详细信息</li>
                                            <li>定时任务默认策略修改(不触发立即执行)</li>
                                            <li>定时任务显示下一个执行周期</li>
                                            <li>支持前端任意日期格式处理</li>
                                            <li>上传头像删除多余提交按钮</li>
                                            <li>表格增加行间隔色配置项</li>
                                            <li>表格增加转义HTML字符串配置项</li>
                                            <li>表格增加显示/隐藏指定列</li>
                                            <li>代码生成优化</li>
                                            <li>操作日志参数格式化显示</li>
                                            <li>页签新增新增全屏显示</li>
                                            <li>新增一键打包部署</li>
                                            <li>Excel注解新增多个参数</li>
                                            <li>新增提交静默更新表格方法</li>
                                            <li>新增服务监控菜单</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v30">v3.0.0</a><code class="pull-right">2018.10.08</code>
                                   </h5>
                                </div>
                                <div id="v30" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>升级poi到最新版3.17</li>
                                            <li>导出修改临时目录绝对路径</li>
                                            <li>升级laydate到最新版5.0.9</li>
                                            <li>升级SpringBoot到最新版本2.0.5</li>
                                            <li>优化开始/结束时间校验限制</li>
                                            <li>重置密码参数表中获取默认值</li>
                                            <li>修复头像修改显示问题</li>
                                            <li>新增数据权限过滤注解</li>
                                            <li>新增表格检索折叠按钮</li>
                                            <li>新增清空(登录、操作、调度)日志</li>
                                            <li>固定按钮位置(提交/关闭)</li>
                                            <li>部门/菜单支持(展开/折叠)</li>
                                            <li>部分细节调整优化</li>
                                            <li>项目采用分模块</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                <div class="panel-heading">
                                   <h5 class="panel-title">
                                       <a data-toggle="collapse" data-parent="#version" href="#v24">v2.4.0</a><code class="pull-right">2018.09.03</code>
                                   </h5>
                                </div>
                                <div id="v24" class="panel-collapse collapse">
                                    <div class="panel-body">
                                       <ol>
                                            <li>支持部门多级查询</li>
                                            <li>修复菜单状态查询无效</li>
                                            <li>支持IP地址开关</li>
                                            <li>支持XSS开关</li>
                                            <li>记录日志异步处理</li>
                                            <li>字典回显样式更改为下拉框</li>
                                            <li>菜单类型必填校验</li>
                                            <li>修复在线用户排序报错</li>
                                            <li>增加重置按钮</li>
                                            <li>支持注解导入数据</li>
                                            <li>支持弹层外区域关闭</li>
                                            <li>备注更换为文本区域</li>
                                            <li>新增角色逻辑删除</li>
                                            <li>新增部门逻辑删除</li>
                                            <li>支持部门数据权限</li>
                                            <li>管理员默认拥有所有授权</li>
                                            <li>字典数据采用分页</li>
                                            <li>部分细节调整优化</li>
                                        </ol>
                                    </div>
                                </div>
                            </div>
                            <div class="panel panel-default">
                                    <div class="panel-heading">
                                       <h5 class="panel-title">
                                           <a data-toggle="collapse" data-parent="#version" href="#v23">v2.3.0</a><code class="pull-right">2018.08.06</code>
                                       </h5>
                                    </div>
                                    <div id="v23" class="panel-collapse collapse">
                                        <div class="panel-body">
                                           <ol>
                                                <li>支持表格不分页开关控制</li>
                                                <li>修改字典类型同步修改字典数据</li>
                                                <li>代码生成新增修改后缀处理</li>
                                                <li>代码生成新增实体toString</li>
                                                <li>代码生成非字符串去除!=''</li>
                                                <li>导出数据前加载遮罩层</li>
                                                <li>部门删除校验条件修改</li>
                                                <li>搜索查询下载优化</li>
                                                <li>手机打开弹出层自适应</li>
                                                <li>角色岗位禁用显示置灰</li>
                                                <li>角色禁用不显示菜单</li>
                                                <li>新增导出权限</li>
                                                <li>角色权限唯一校验</li>
                                                <li>岗位名称编码唯一校验</li>
                                                <li>TreeTable优化</li>
                                                <li>支持多数据源</li>
                                                <li>其他细节优化</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                       <h5 class="panel-title">
                                           <a data-toggle="collapse" data-parent="#version" href="#v22">v2.2.0</a><code class="pull-right">2018.07.23</code>
                                       </h5>
                                    </div>
                                    <div id="v22" class="panel-collapse collapse">
                                        <div class="panel-body">
                                           <ol>
                                                <li>修复批量生成代码异常问题</li>
                                                <li>修复定时器保存失败问题</li>
                                                <li>修复热部署转换问题</li>
                                                <li>支持查询菜单管理,部门管理</li>
                                                <li>大多数功能支持时间查询</li>
                                                <li>自定义导出注解自动匹配column</li>
                                                <li>新增任务执行策略</li>
                                                <li>操作详细动态显示类型</li>
                                                <li>支持动态回显字典数据</li>
                                                <li>后台代码优化调整</li>
                                                <li>其他细节优化</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                       <h5 class="panel-title">
                                           <a data-toggle="collapse" data-parent="#version" href="#v21">v2.1.0</a><code class="pull-right">2018.07.10</code>
                                       </h5>
                                    </div>
                                    <div id="v21" class="panel-collapse collapse">
                                        <div class="panel-body">
                                           <ol>
                                                <li>新增登录超时提醒</li>
                                                <li>修复定时器热部署转换问题</li>
                                                <li>修复登录验证码校验无效问题</li>
                                                <li>定时任务新增立即执行一次</li>
                                                <li>存在字典数据不允许删除字典</li>
                                                <li>字典数据支持按名称查询</li>
                                                <li>代码生成增加日志注解&表格优化</li>
                                                <li>修复用户逻辑删除后能登录问题</li>
                                                <li>表格支持多字段动态排序</li>
                                                <li>支持三级菜单显示</li>
                                                <li>新增ry.sh启动程序脚本</li>
                                                <li>其他细节优化</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                       <h5 class="panel-title">
                                           <a data-toggle="collapse" data-parent="#version" href="#v20">v2.0.0</a><code class="pull-right">2018.07.02</code>
                                       </h5>
                                    </div>
                                    <div id="v20" class="panel-collapse collapse">
                                        <div class="panel-body">
                                           <ol>
                                                <li>升级SpringBoot到最新版本2.0.3</li>
                                                <li>新增公告管理</li>
                                                <li>表单校验示提体验优化</li>
                                                <li>前端通用方法封装调整</li>
                                                <li>前端去除js文件,合并到html</li>
                                                <li>操作加载遮罩层</li>
                                                <li>支持全屏模式操作</li>
                                                <li>支持注解导出数据</li>
                                                <li>系统支持多查询&下载</li>
                                                <li>系统样式调整</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                       <h5 class="panel-title">
                                           <a data-toggle="collapse" data-parent="#version" href="#v16">v1.1.6</a><code class="pull-right">2018.06.04</code>
                                       </h5>
                                    </div>
                                    <div id="v16" class="panel-collapse collapse">
                                        <div class="panel-body">
                                           <ol>
                                                <li>新增用户列表部门列</li>
                                                <li>新增登录地点</li>
                                                <li>新增swagger</li>
                                                <li>修复排序数字校验</li>
                                                <li>优化头像上传文件类型限定为图片</li>
                                                <li>新增XSS过滤</li>
                                                <li>新增热部署提高开发效率</li>
                                                <li>修复treegrid居中无效</li>
                                                <li>角色多条件查询</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                       <h5 class="panel-title">
                                           <a data-toggle="collapse" data-parent="#version" href="#v15">v1.1.5</a><code class="pull-right">2018.05.28</code>
                                       </h5>
                                    </div>
                                    <div id="v15" class="panel-collapse collapse">
                                        <div class="panel-body">
                                           <ol>
                                                <li>优化登录失败刷新验证码</li>
                                                <li>新增用户登录地址时间</li>
                                                <li>修复ajax超时退出问题</li>
                                                <li>新增html调用数据字典(若依首创)</li>
                                                <li>调整系统部分样式</li>
                                                <li>新增用户逻辑删除</li>
                                                <li>新增管理员不允许删除修改</li>
                                                <li>升级bootstrapTable到最新版本1.12.1</li>
                                                <li>升级layer到最新版本3.1.1</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                       <h5 class="panel-title">
                                           <a data-toggle="collapse" data-parent="#version" href="#v14">v1.1.4</a><code class="pull-right">2018.05.20</code>
                                       </h5>
                                    </div>
                                    <div id="v14" class="panel-collapse collapse">
                                        <div class="panel-body">
                                           <ol>
                                                <li>新增参数管理</li>
                                                <li>修复头像上传bug</li>
                                                <li>手机邮箱唯一校验</li>
                                                <li>支持手机邮箱登录</li>
                                                <li>代码生成优化</li>
                                                <li>支持模糊查询</li>
                                                <li>支持切换主题皮肤</li>
                                                <li>修改权限即时生效</li>
                                                <li>修复页签Tab关闭问题</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                       <h5 class="panel-title">
                                           <a data-toggle="collapse" data-parent="#version" href="#v13">v1.1.3</a><code class="pull-right">2018.05.14</code>
                                       </h5>
                                    </div>
                                    <div id="v13" class="panel-collapse collapse">
                                        <div class="panel-body">
                                           <ol>
                                                <li>新增验证码(数组计算、字符验证)</li>
                                                <li>新增cookie记住我</li>
                                                <li>新增头像上传</li>
                                                <li>用户名密码长度限制</li>
                                                <li>通用字段提取</li>
                                                <li>支持自定义条件查询</li>
                                                <li>部门名称必填、时间格式调整</li>
                                                <li>其他细节优化</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v12">v1.1.2</a><code class="pull-right">2018.05.07</code>
                                        </h5>
                                    </div>
                                    <div id="v12" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增个人信息修改</li>
                                                <li>菜单存在子菜单不允许删除</li>
                                                <li>菜单分配角色不允许删除</li>
                                                <li>角色分配人员不允许删除</li>
                                                <li>岗位使用后不允许删除</li>
                                                <li>保证用户的数据完整性加入事物</li>
                                                <li>新增环境使用手册、数据建模</li>
                                                <li>Thymeleaf升级到3.0</li>
                                                <li>支持非ROOT部署</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v11">v1.1.1</a><code class="pull-right">2018.04.23</code>
                                        </h5>
                                    </div>
                                    <div id="v11" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增表单构建器</li>
                                                <li>代码生成优化</li>
                                                <li>支持新增主部门</li>
                                                <li>支持选择上级部门、上级菜单</li>
                                                <li>新增字典管理单条删除</li>
                                                <li>优化一些其他细节</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v10">v1.1.0</a><code class="pull-right">2018.04.20</code>
                                        </h5>
                                    </div>
                                    <div id="v10" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>支持密码盐</li>
                                                <li>支持新增主目录</li>
                                                <li>支持批量生成代码</li>
                                                <li>支持表格导出(csv、txt、doc、excel)</li>
                                                <li>自动适应宽高模式窗体</li>
                                                <li>重复校验(角色名、菜单名、部门名)</li>
                                                <li>优化一些其他细节</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v09">v1.0.9</a><code class="pull-right">2018.04.14</code>
                                        </h5>
                                    </div>
                                    <div id="v09" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增代码生成(生成包括 java、html、js、xml、sql)</li>
                                                <li>新增按钮权限控制隐藏(若依首创)</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v08">v1.0.8</a><code class="pull-right">2018.04.08</code>
                                        </h5>
                                    </div>
                                    <div id="v08" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增定时任务(新增、修改、删除、查询、启动/暂停)</li>
                                                <li>新增调度日志(查询、删除)</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v07">v1.0.7</a><code class="pull-right">2018.04.04</code>
                                        </h5>
                                    </div>
                                    <div id="v07" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增岗位管理(新增、修改、删除、查询)</li>
                                                <li>优化用户管理,菜单管理部分细节</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v06">v1.0.6</a><code class="pull-right">2018.03.15</code>
                                        </h5>
                                    </div>
                                    <div id="v06" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增字典管理(新增、删除、修改、查询、数据选择)</li>
                                                <li>新增用户密码重置</li>
                                                <li>优化一些其他细节</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v05">v1.0.5</a><code class="pull-right">2018.03.12</code>
                                        </h5>
                                    </div>
                                    <div id="v05" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增菜单管理(新增、删除、修改、查询、图标选择)</li>
                                                <li>部门管理优化(添加责任人、联系电话、邮箱、修改者)</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v04">v1.0.4</a><code class="pull-right">2018.03.11</code>
                                        </h5>
                                    </div>
                                    <div id="v04" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增角色管理(新增、删除、修改、查询、菜单选择)</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v03">v1.0.3</a><code class="pull-right">2018.03.08</code>
                                        </h5>
                                    </div>
                                    <div id="v03" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增用户管理(新增、删除、修改、查询、部门选择)</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v02">v1.0.2</a><code class="pull-right">2018.03.04</code>
                                        </h5>
                                    </div>
                                    <div id="v02" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增部门管理 (新增、删除、修改、查询)</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h5 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v01">v1.0.1</a><code class="pull-right">2018.03.03</code>
                                        </h5>
                                    </div>
                                    <div id="v01" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>新增在线用户 (批量强退、单条强退、查询)</li>
                                                <li>新增登录日志 (批量删除、查询)</li>
                                                <li>新增操作日志 (批量删除、查询、详细)</li>
                                                <li>新增数据监控 (监控DB池连接和SQL的执行)</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                                <div class="panel panel-default">
                                    <div class="panel-heading">
                                        <h4 class="panel-title">
                                            <a data-toggle="collapse" data-parent="#version" href="#v00">v1.0.0</a><code class="pull-right">2018.03.01</code>
                                        </h4>
                                    </div>
                                    <div id="v00" class="panel-collapse collapse">
                                        <div class="panel-body">
                                            <ol>
                                                <li>若依管理系统正式发布。</li>
                                            </ol>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-sm-4">
                <div class="ibox float-e-margins">
                    <div class="ibox-title">
                        <h5>捐赠</h5>
                    </div>
                    <div class="ibox-content">
                        <div class="alert alert-warning">
                                请作者喝杯咖啡(点击图片放大)
                        </div>
                        <p id="pay-qrcode">
                            <a href="javascript:;"><img th:src="@{/img/pay.png}" width="100%" alt="请使用手机支付宝或者微信扫码支付">
                            </a>
                        </p>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script th:src="@{/js/jquery.min.js}"></script>
ruoyi-admin/src/main/resources/templates/register.html
@@ -9,7 +9,7 @@
    <link href="../static/css/font-awesome.min.css" th:href="@{/css/font-awesome.min.css}" rel="stylesheet"/>
    <link href="../static/css/style.min.css" th:href="@{/css/style.min.css}" rel="stylesheet"/>
    <link href="../static/css/login.min.css" th:href="@{/css/login.min.css}" rel="stylesheet"/>
    <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.8.0}" rel="stylesheet"/>
    <link href="../static/ruoyi/css/ry-ui.css" th:href="@{/ruoyi/css/ry-ui.css?v=4.7.9}" rel="stylesheet"/>
    <!-- 360浏览器急速模式 -->
    <meta name="renderer" content="webkit">
    <!-- 避免IE使用兼容模式 -->
@@ -64,7 +64,7 @@
        </div>
        <div class="signup-footer">
            <div class="pull-left">
                &copy; 2018-2025 All Rights Reserved. RuoYi <br>
                &copy; 2018-2024 All Rights Reserved. RuoYi <br>
            </div>
        </div>
    </div>
@@ -75,7 +75,7 @@
<script src="../static/ajax/libs/validate/jquery.validate.extend.js" th:src="@{/ajax/libs/validate/jquery.validate.extend.js}"></script>
<script src="../static/ajax/libs/layer/layer.min.js" th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script src="../static/ajax/libs/blockUI/jquery.blockUI.js" th:src="@{/ajax/libs/blockUI/jquery.blockUI.js}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script>
<script src="../static/ruoyi/js/ry-ui.js" th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script>
<script src="../static/ruoyi/register.js" th:src="@{/ruoyi/register.js}"></script>
</body>
</html>
ruoyi-admin/src/main/resources/templates/skin.html
@@ -140,7 +140,7 @@
</ul>
</body>
<script th:src="@{/js/jquery.min.js}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.8.0}"></script>
<script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script>
<script type="text/javascript">
//皮肤样式列表
var skins = ["skin-blue", "skin-green", "skin-purple", "skin-red", "skin-yellow"];
ruoyi-common/pom.xml
@@ -5,7 +5,7 @@
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>4.8.0</version>
        <version>4.7.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java
@@ -84,11 +84,6 @@
    public String prompt() default "";
    /**
     * 是否允许内容换行
     */
    public boolean wrapText() default false;
    /**
     * 设置只能选择不能输入的列内容.
     */
    public String[] combo() default {};
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
@@ -25,14 +25,14 @@
    private String createBy;
    /** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /** 更新者 */
    private String updateBy;
    /** 更新时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /** 备注 */
ruoyi-common/src/main/java/com/ruoyi/common/enums/DesensitizedType.java
@@ -23,7 +23,7 @@
    /**
     * 身份证,中间10位星号替换
     */
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{3}[Xx]|\\d{4})", "$1** **** ****$2")),
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\d{4})", "$1** **** ****$2")),
    /**
     * 手机号,中间4位星号替换
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
@@ -195,11 +195,6 @@
    public Class<T> clazz;
    /**
     * 需要显示列属性
     */
    public String[] includeFields;
    /**
     * 需要排除列属性
     */
    public String[] excludeFields;
@@ -210,19 +205,10 @@
    }
    /**
     * 仅在Excel中显示列属性
     *
     * @param fields 列属性名 示例[单个"name"/多个"id","name"]
     */
    public void showColumn(String... fields)
    {
        this.includeFields = fields;
    }
    /**
     * 隐藏Excel中列属性
     *
     * @param fields 列属性名 示例[单个"name"/多个"id","name"]
     * @throws Exception
     */
    public void hideColumn(String... fields)
    {
@@ -252,6 +238,8 @@
    {
        if (StringUtils.isNotEmpty(title))
        {
            subMergedFirstRowNum++;
            subMergedLastRowNum++;
            int titleLastCol = this.fields.size() - 1;
            if (isSubList())
            {
@@ -262,7 +250,7 @@
            Cell titleCell = titleRow.createCell(0);
            titleCell.setCellStyle(styles.get("title"));
            titleCell.setCellValue(title);
            sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), 0, titleLastCol));
            sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol));
        }
    }
@@ -273,31 +261,23 @@
    {
        if (isSubList())
        {
            subMergedFirstRowNum++;
            subMergedLastRowNum++;
            Row subRow = sheet.createRow(rownum);
            int column = 0;
            int subFieldSize = subFields != null ? subFields.size() : 0;
            int excelNum = 0;
            for (Object[] objects : fields)
            {
                Field field = (Field) objects[0];
                Excel attr = (Excel) objects[1];
                if (Collection.class.isAssignableFrom(field.getType()))
                {
                    Cell cell = subRow.createCell(column);
                    cell.setCellValue(attr.name());
                    cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor())));
                    if (subFieldSize > 1)
                    {
                        CellRangeAddress cellAddress = new CellRangeAddress(rownum, rownum, column, column + subFieldSize - 1);
                        sheet.addMergedRegion(cellAddress);
                Cell headCell1 = subRow.createCell(excelNum);
                headCell1.setCellValue(attr.name());
                headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor())));
                excelNum++;
                    }
                    column += subFieldSize;
                }
                else
            int headFirstRow = excelNum - 1;
            int headLastRow = headFirstRow + subFields.size() - 1;
            if (headLastRow > headFirstRow)
                {
                    Cell cell = subRow.createCell(column++);
                    cell.setCellValue(attr.name());
                    cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor())));
                }
                sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow));
            }
            rownum++;
        }
@@ -311,22 +291,10 @@
     */
    public List<T> importExcel(InputStream is)
    {
        return importExcel(is, 0);
    }
    /**
     * 对excel表单默认第一个索引名转换成list
     *
     * @param is 输入流
     * @param titleNum 标题占用行数
     * @return 转换后集合
     */
    public List<T> importExcel(InputStream is, int titleNum)
    {
        List<T> list = null;
        try
        {
            list = importExcel(StringUtils.EMPTY, is, titleNum);
            list = importExcel(is, 0);
        }
        catch (Exception e)
        {
@@ -338,6 +306,18 @@
            IOUtils.closeQuietly(is);
        }
        return list;
    }
    /**
     * 对excel表单默认第一个索引名转换成list
     *
     * @param is 输入流
     * @param titleNum 标题占用行数
     * @return 转换后集合
     */
    public List<T> importExcel(InputStream is, int titleNum) throws Exception
    {
        return importExcel(StringUtils.EMPTY, is, titleNum);
    }
    /**
@@ -731,91 +711,64 @@
    {
        int startNo = index * sheetSize;
        int endNo = Math.min(startNo + sheetSize, list.size());
        int currentRowNum = rownum + 1; // 从标题行后开始
        int rowNo = (1 + rownum) - startNo;
        for (int i = startNo; i < endNo; i++)
        {
            row = sheet.createRow(currentRowNum);
            rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo;
            row = sheet.createRow(rowNo);
            // 得到导出对象.
            T vo = (T) list.get(i);
            Collection<?> subList = null;
            if (isSubList())
            {
                if (isSubListValue(vo))
                {
                    subList = getListCellValue(vo);
                    subMergedLastRowNum = subMergedLastRowNum + subList.size();
                }
                else
                {
                    subMergedFirstRowNum++;
                    subMergedLastRowNum++;
                }
            }
            int column = 0;
            int maxSubListSize = getCurrentMaxSubListSize(vo);
            for (Object[] os : fields)
            {
                Field field = (Field) os[0];
                Excel excel = (Excel) os[1];
                if (Collection.class.isAssignableFrom(field.getType()))
                if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList))
                {
                    try
                    boolean subFirst = false;
                    for (Object obj : subList)
                    {
                        Collection<?> subList = (Collection<?>) getTargetValue(vo, field, excel);
                        if (subList != null && !subList.isEmpty())
                        if (subFirst)
                        {
                            int subIndex = 0;
                            for (Object subVo : subList)
                            {
                                Row subRow = sheet.getRow(currentRowNum + subIndex);
                                if (subRow == null)
                                {
                                    subRow = sheet.createRow(currentRowNum + subIndex);
                            rowNo++;
                            row = sheet.createRow(rowNo);
                                }
                                int subColumn = column;
                        List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class);
                        int subIndex = 0;
                                for (Field subField : subFields)
                                {
                                    Excel subExcel = subField.getAnnotation(Excel.class);
                                    addCell(subExcel, subRow, (T) subVo, subField, subColumn++);
                            if (subField.isAnnotationPresent(Excel.class))
                            {
                                subField.setAccessible(true);
                                Excel attr = subField.getAnnotation(Excel.class);
                                this.addCell(attr, row, (T) obj, subField, column + subIndex);
                                }
                                subIndex++;
                            }
                            column += subFields.size();
                        subFirst = true;
                        }
                    }
                    catch (Exception e)
                    {
                        log.error("填充集合数据失败", e);
                    }
                    this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size();
                }
                else
                {
                    // 创建单元格并设置值
                    addCell(excel, row, vo, field, column);
                    if (maxSubListSize > 1 && excel.needMerge())
                    {
                        sheet.addMergedRegion(new CellRangeAddress(currentRowNum, currentRowNum + maxSubListSize - 1, column, column));
                    }
                    column++;
                }
            }
            currentRowNum += maxSubListSize;
        }
    }
    /**
     * 获取子列表最大数
     */
    private int getCurrentMaxSubListSize(T vo)
    {
        int maxSubListSize = 1;
        for (Object[] os : fields)
        {
            Field field = (Field) os[0];
            if (Collection.class.isAssignableFrom(field.getType()))
            {
                try
                {
                    Collection<?> subList = (Collection<?>) getTargetValue(vo, field, (Excel) os[1]);
                    if (subList != null && !subList.isEmpty())
                    {
                        maxSubListSize = Math.max(maxSubListSize, subList.size());
                    }
                }
                catch (Exception e)
                {
                    log.error("获取集合大小失败", e);
                    this.addCell(excel, row, vo, field, column++);
                }
            }
        }
        return maxSubListSize;
    }
    /**
@@ -950,7 +903,7 @@
     */
    public void annotationDataStyles(Map<String, CellStyle> styles, Field field, Excel excel)
    {
        String key = StringUtils.format("data_{}_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType(), excel.wrapText());
        String key = StringUtils.format("data_{}_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor(), excel.cellType());
        if (!styles.containsKey(key))
        {
            CellStyle style = wb.createCellStyle();
@@ -966,7 +919,6 @@
            style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            style.setFillForegroundColor(excel.backgroundColor().getIndex());
            style.setWrapText(excel.wrapText());
            Font dataFont = wb.createFont();
            dataFont.setFontName("Arial");
            dataFont.setFontHeightInPoints((short) 10);
@@ -995,7 +947,7 @@
        if (isSubList())
        {
            // 填充默认样式,防止合并单元格样式失效
            sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText())));
            sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType())));
            if (attr.needMerge())
            {
                sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column));
@@ -1133,12 +1085,10 @@
                cell = row.createCell(column);
                if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge())
                {
                    if (subMergedLastRowNum >= subMergedFirstRowNum)
                    {
                        sheet.addMergedRegion(new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column));
                    CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column);
                    sheet.addMergedRegion(cellAddress);
                    }
                }
                cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText())));
                cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType())));
                // 用于读取对象中的属性
                Object value = getTargetValue(vo, field, attr);
@@ -1479,7 +1429,6 @@
     */
    private Object getTargetValue(T vo, Field field, Excel excel) throws Exception
    {
        field.setAccessible(true);
        Object o = field.get(vo);
        if (StringUtils.isNotEmpty(excel.targetAttr()))
        {
@@ -1539,40 +1488,9 @@
        List<Field> tempFields = new ArrayList<>();
        tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
        tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
        if (StringUtils.isNotEmpty(includeFields))
        {
            for (Field field : tempFields)
            {
                if (ArrayUtils.contains(this.includeFields, field.getName()) || field.isAnnotationPresent(Excels.class))
                {
                    addField(fields, field);
                }
            }
        }
        else if (StringUtils.isNotEmpty(excludeFields))
        {
            for (Field field : tempFields)
            {
                if (!ArrayUtils.contains(this.excludeFields, field.getName()))
                {
                    addField(fields, field);
                }
            }
        }
        else
        {
            for (Field field : tempFields)
            {
                addField(fields, field);
            }
        }
        return fields;
    }
    /**
     * 添加字段信息
     */
    public void addField(List<Object[]> fields, Field field)
    {
        // 单注解
        if (field.isAnnotationPresent(Excel.class))
@@ -1580,6 +1498,7 @@
            Excel attr = field.getAnnotation(Excel.class);
            if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
            {
                        field.setAccessible(true);
                fields.add(new Object[] { field, attr });
            }
            if (Collection.class.isAssignableFrom(field.getType()))
@@ -1598,25 +1517,18 @@
            Excel[] excels = attrs.value();
            for (Excel attr : excels)
            {
                if (StringUtils.isNotEmpty(includeFields))
                {
                    if (ArrayUtils.contains(this.includeFields, field.getName() + "." + attr.targetAttr())
                            && (attr != null && (attr.type() == Type.ALL || attr.type() == type)))
                    {
                        fields.add(new Object[] { field, attr });
                    }
                }
                else
                {
                    if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr())
                            && (attr != null && (attr.type() == Type.ALL || attr.type() == type)))
                    {
                            field.setAccessible(true);
                        fields.add(new Object[] { field, attr });
                    }
                }
            }
        }
    }
        return fields;
    }
    /**
     * 根据注解获取最大行高
ruoyi-common/src/main/java/com/ruoyi/common/utils/sql/SqlUtil.java
@@ -13,7 +13,7 @@
    /**
     * 定义常用的 sql关键字
     */
    public static String SQL_REGEX = "\u000B|and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
    public static String SQL_REGEX = "and |extractvalue|updatexml|sleep|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |union |like |+|/*|user()";
    /**
     * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
ruoyi-framework/pom.xml
File was deleted
ruoyi-framework/src/main/java/com/ruoyi/framework/config/MyBatisConfig.java
File was deleted
ruoyi-framework/src/main/java/com/ruoyi/framework/config/properties/PermitAllUrlProperties.java
File was deleted
ruoyi-generator/pom.xml
@@ -5,7 +5,7 @@
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>4.8.0</version>
        <version>4.7.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
ruoyi-generator/src/main/java/com/ruoyi/generator/config/GenConfig.java
@@ -21,14 +21,11 @@
    /** 生成包路径 */
    public static String packageName;
    /** 自动去除表前缀 */
    /** 自动去除表前缀,默认是false */
    public static boolean autoRemovePre;
    /** 表前缀 */
    /** 表前缀(类名不会包含表前缀) */
    public static String tablePrefix;
    /** 是否允许生成文件覆盖到本地(自定义路径) */
    public static boolean allowOverwrite;
    public static String getAuthor()
    {
@@ -72,16 +69,5 @@
    public void setTablePrefix(String tablePrefix)
    {
        GenConfig.tablePrefix = tablePrefix;
    }
    public static boolean isAllowOverwrite()
    {
        return allowOverwrite;
    }
    @Value("${allowOverwrite}")
    public void setAllowOverwrite(boolean allowOverwrite)
    {
        GenConfig.allowOverwrite = allowOverwrite;
    }
}
ruoyi-generator/src/main/java/com/ruoyi/generator/controller/GenController.java
@@ -32,7 +32,6 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.security.PermissionUtils;
import com.ruoyi.common.utils.sql.SqlUtil;
import com.ruoyi.generator.config.GenConfig;
import com.ruoyi.generator.domain.GenTable;
import com.ruoyi.generator.domain.GenTableColumn;
import com.ruoyi.generator.service.IGenTableColumnService;
@@ -260,10 +259,6 @@
    @ResponseBody
    public AjaxResult genCode(@PathVariable("tableName") String tableName)
    {
        if (!GenConfig.isAllowOverwrite())
        {
            return AjaxResult.error("【系统预设】不允许生成文件覆盖到本地");
        }
        genTableService.generatorCode(tableName);
        return AjaxResult.success();
    }
ruoyi-generator/src/main/resources/generator.yml
@@ -9,5 +9,3 @@
  autoRemovePre: false
  # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # 是否允许生成文件覆盖到本地(自定义路径),默认不允许
  allowOverwrite: false
ruoyi-generator/src/main/resources/vm/java/controller.java.vm
@@ -91,7 +91,6 @@
    /**
     * 新增${functionName}
     */
    @RequiresPermissions("${permissionPrefix}:add")
    @GetMapping("/add")
    public String add()
    {
ruoyi-generator/src/main/resources/vm/java/domain.java.vm
@@ -40,7 +40,7 @@
#if($parentheseIndex != -1)
    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
#elseif($column.javaType == 'Date')
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
#else
    @Excel(name = "${comment}")
ruoyi-generator/src/main/resources/vm/java/sub-domain.java.vm
@@ -31,7 +31,7 @@
#if($parentheseIndex != -1)
    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
#elseif($column.javaType == 'Date')
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
#else
    @Excel(name = "${comment}")
ruoyi-quartz/pom.xml
@@ -5,7 +5,7 @@
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>4.8.0</version>
        <version>4.7.9</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java
@@ -118,7 +118,6 @@
    /**
     * 新增调度
     */
    @RequiresPermissions("monitor:job:add")
    @GetMapping("/add")
    public String add()
    {
ruoyi-quartz/src/main/resources/templates/monitor/job/cron.html
@@ -1131,7 +1131,7 @@
<script th:src="@{/js/jquery.min.js}"></script>
<script th:src="@{/js/bootstrap.min.js}"></script>
<script th:src="@{/ajax/libs/layer/layer.min.js}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.8.0}"></script>
<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script>
<script th:src="@{/js/cron.js}"></script>
<script th:inline="javascript">
var prefix = [[@{/}]] + "monitor/job";
ruoyi-system/pom.xml
File was deleted
ry.bat
File was deleted
ry.sh
File was deleted
sql/quartz.sql
File was deleted
sql/ruoyi.html
File was deleted
sql/ruoyi.pdm
File was deleted
sql/ry_20240601.sql
File was deleted