Repository: JamesZBL/db-hospital-drug Branch: develop Commit: 16244ff3b4e5 Files: 997 Total size: 13.3 MB Directory structure: gitextract_ki7r0_41/ ├── .gitattributes ├── .gitignore ├── Dockerfile ├── README.md ├── pom.xml ├── rest-test/ │ ├── test_supplier_list.xml │ └── test_supplier_save.xml ├── sql/ │ └── hospital-drug.sql └── src/ ├── main/ │ ├── java/ │ │ └── me/ │ │ └── zbl/ │ │ ├── HospitalApplication.java │ │ ├── activity/ │ │ │ ├── config/ │ │ │ │ ├── ActivitiConfig.java │ │ │ │ └── ActivitiConstant.java │ │ │ ├── controller/ │ │ │ │ ├── ModelController.java │ │ │ │ ├── ProcessController.java │ │ │ │ ├── SalaryController.java │ │ │ │ └── TaskController.java │ │ │ ├── dao/ │ │ │ │ └── SalaryDao.java │ │ │ ├── domain/ │ │ │ │ ├── ActivitiDO.java │ │ │ │ ├── SalaryDO.java │ │ │ │ ├── TaskDO.java │ │ │ │ └── Variable.java │ │ │ ├── service/ │ │ │ │ ├── ActTaskService.java │ │ │ │ ├── ProcessService.java │ │ │ │ ├── SalaryService.java │ │ │ │ └── impl/ │ │ │ │ ├── ActTaskServiceImpl.java │ │ │ │ ├── ProcessServiceImpl.java │ │ │ │ └── SalaryServiceImpl.java │ │ │ ├── utils/ │ │ │ │ └── ActivitiUtils.java │ │ │ └── vo/ │ │ │ ├── DeploymentResponse.java │ │ │ ├── ProcessVO.java │ │ │ └── TaskVO.java │ │ ├── app/ │ │ │ ├── controller/ │ │ │ │ ├── ConsumerController.java │ │ │ │ ├── DrugController.java │ │ │ │ ├── DrugInController.java │ │ │ │ ├── DrugOutController.java │ │ │ │ ├── SaleController.java │ │ │ │ └── SupplierController.java │ │ │ ├── dao/ │ │ │ │ ├── ConsumerMapper.java │ │ │ │ ├── DrugMapper.java │ │ │ │ ├── ExpireMapper.java │ │ │ │ ├── InventoryMapper.java │ │ │ │ └── SupplierMapper.java │ │ │ ├── domain/ │ │ │ │ ├── BackFormDO.java │ │ │ │ ├── Consumer.java │ │ │ │ ├── Drug.java │ │ │ │ ├── DrugDO.java │ │ │ │ ├── DrugInDO.java │ │ │ │ ├── DrugInFormDO.java │ │ │ │ ├── DrugOutDO.java │ │ │ │ ├── DrugOutFormDO.java │ │ │ │ ├── Expire.java │ │ │ │ ├── Inventory.java │ │ │ │ ├── SaleDO.java │ │ │ │ ├── StaSaleDO.java │ │ │ │ └── Supplier.java │ │ │ ├── service/ │ │ │ │ ├── ConsumerService.java │ │ │ │ ├── DrugInService.java │ │ │ │ ├── DrugOutService.java │ │ │ │ ├── DrugService.java │ │ │ │ ├── ExpireNotifyService.java │ │ │ │ ├── SupplierService.java │ │ │ │ └── impl/ │ │ │ │ ├── ConsumerServiceImpl.java │ │ │ │ ├── DrugInServiceImpl.java │ │ │ │ ├── DrugOutServiceImpl.java │ │ │ │ ├── DrugServiceImpl.java │ │ │ │ ├── ExpireNotifyServiceImpl.java │ │ │ │ └── SupplierServiceImpl.java │ │ │ └── task/ │ │ │ └── InventoryCheckTask.java │ │ ├── blog/ │ │ │ ├── controller/ │ │ │ │ ├── BlogController.java │ │ │ │ └── ContentController.java │ │ │ ├── dao/ │ │ │ │ └── ContentDao.java │ │ │ ├── domain/ │ │ │ │ └── ContentDO.java │ │ │ └── service/ │ │ │ ├── ContentService.java │ │ │ └── impl/ │ │ │ └── ContentServiceImpl.java │ │ ├── common/ │ │ │ ├── annotation/ │ │ │ │ └── Log.java │ │ │ ├── aspect/ │ │ │ │ ├── LogAspect.java │ │ │ │ └── WebLogAspect.java │ │ │ ├── config/ │ │ │ │ ├── ApplicationContextRegister.java │ │ │ │ ├── Constant.java │ │ │ │ ├── DateConverConfig.java │ │ │ │ ├── DruidDBConfig.java │ │ │ │ ├── HospitalConfig.java │ │ │ │ ├── QuartzConfigration.java │ │ │ │ ├── SchedulerConf.java │ │ │ │ ├── SpringAsyncConfig.java │ │ │ │ └── WebConfigurer.java │ │ │ ├── controller/ │ │ │ │ ├── BaseController.java │ │ │ │ ├── DictController.java │ │ │ │ ├── FileController.java │ │ │ │ ├── GeneratorController.java │ │ │ │ ├── JobController.java │ │ │ │ └── LogController.java │ │ │ ├── dao/ │ │ │ │ ├── DictDao.java │ │ │ │ ├── FileDao.java │ │ │ │ ├── GeneratorMapper.java │ │ │ │ ├── LogDao.java │ │ │ │ └── TaskDao.java │ │ │ ├── domain/ │ │ │ │ ├── ColumnDO.java │ │ │ │ ├── DictDO.java │ │ │ │ ├── FileDO.java │ │ │ │ ├── LogDO.java │ │ │ │ ├── PageDO.java │ │ │ │ ├── ScheduleJob.java │ │ │ │ ├── TableDO.java │ │ │ │ ├── TaskDO.java │ │ │ │ └── Tree.java │ │ │ ├── exception/ │ │ │ │ ├── BDException.java │ │ │ │ ├── BDExceptionHandler.java │ │ │ │ └── MainsiteErrorController.java │ │ │ ├── listenner/ │ │ │ │ └── ScheduleJobInitListener.java │ │ │ ├── quartz/ │ │ │ │ ├── factory/ │ │ │ │ │ └── JobFactory.java │ │ │ │ └── utils/ │ │ │ │ └── QuartzManager.java │ │ │ ├── redis/ │ │ │ │ └── shiro/ │ │ │ │ ├── RedisCache.java │ │ │ │ ├── RedisCacheManager.java │ │ │ │ ├── RedisManager.java │ │ │ │ ├── RedisSessionDAO.java │ │ │ │ └── SerializeUtils.java │ │ │ ├── service/ │ │ │ │ ├── DictService.java │ │ │ │ ├── FileService.java │ │ │ │ ├── GeneratorService.java │ │ │ │ ├── JobService.java │ │ │ │ ├── LogService.java │ │ │ │ └── impl/ │ │ │ │ ├── DictServiceImpl.java │ │ │ │ ├── FileServiceImpl.java │ │ │ │ ├── GeneratorServiceImpl.java │ │ │ │ ├── JobServiceImpl.java │ │ │ │ └── LogServiceImpl.java │ │ │ ├── task/ │ │ │ │ └── WelcomeJob.java │ │ │ └── utils/ │ │ │ ├── BDException.java │ │ │ ├── Base64Utils.java │ │ │ ├── BuildTree.java │ │ │ ├── DateUtils.java │ │ │ ├── ExceptionUtils.java │ │ │ ├── FileType.java │ │ │ ├── FileUtil.java │ │ │ ├── GenUtils.java │ │ │ ├── HttpContextUtils.java │ │ │ ├── HttpServletUtils.java │ │ │ ├── IPUtils.java │ │ │ ├── ImageUtils.java │ │ │ ├── JSONUtils.java │ │ │ ├── MD5Utils.java │ │ │ ├── PageWrapper.java │ │ │ ├── Query.java │ │ │ ├── R.java │ │ │ ├── ScheduleJobUtils.java │ │ │ ├── ShiroUtils.java │ │ │ ├── StringUtils.java │ │ │ ├── TimeUtils.java │ │ │ ├── UploadUtils.java │ │ │ └── xss/ │ │ │ └── JsoupUtil.java │ │ ├── oa/ │ │ │ ├── config/ │ │ │ │ └── WebSocketConfig.java │ │ │ ├── controller/ │ │ │ │ ├── NotifyController.java │ │ │ │ └── WebSocketController.java │ │ │ ├── dao/ │ │ │ │ ├── NotifyDao.java │ │ │ │ └── NotifyRecordDao.java │ │ │ ├── domain/ │ │ │ │ ├── Message.java │ │ │ │ ├── NotifyDO.java │ │ │ │ ├── NotifyDTO.java │ │ │ │ ├── NotifyRecordDO.java │ │ │ │ └── Response.java │ │ │ └── service/ │ │ │ ├── NotifyRecordService.java │ │ │ ├── NotifyService.java │ │ │ └── impl/ │ │ │ ├── NotifyRecordServiceImpl.java │ │ │ └── NotifyServiceImpl.java │ │ ├── system/ │ │ │ ├── config/ │ │ │ │ ├── BDSessionListener.java │ │ │ │ ├── ShiroConfig.java │ │ │ │ ├── Swagger2Config.java │ │ │ │ └── XssConfig.java │ │ │ ├── controller/ │ │ │ │ ├── DeptController.java │ │ │ │ ├── LoginController.java │ │ │ │ ├── MenuController.java │ │ │ │ ├── RoleController.java │ │ │ │ ├── SessionController.java │ │ │ │ └── UserController.java │ │ │ ├── dao/ │ │ │ │ ├── DeptDao.java │ │ │ │ ├── MenuDao.java │ │ │ │ ├── RoleDao.java │ │ │ │ ├── RoleMenuDao.java │ │ │ │ ├── UserDao.java │ │ │ │ └── UserRoleDao.java │ │ │ ├── domain/ │ │ │ │ ├── DeptDO.java │ │ │ │ ├── MenuDO.java │ │ │ │ ├── RoleDO.java │ │ │ │ ├── RoleMenuDO.java │ │ │ │ ├── UserDO.java │ │ │ │ ├── UserOnline.java │ │ │ │ ├── UserRoleDO.java │ │ │ │ └── UserToken.java │ │ │ ├── filter/ │ │ │ │ ├── XssFilter.java │ │ │ │ └── XssHttpServletRequestWrapper.java │ │ │ ├── service/ │ │ │ │ ├── DeptService.java │ │ │ │ ├── MenuService.java │ │ │ │ ├── RoleService.java │ │ │ │ ├── SessionService.java │ │ │ │ ├── UserService.java │ │ │ │ └── impl/ │ │ │ │ ├── DeptServiceImpl.java │ │ │ │ ├── MenuServiceImpl.java │ │ │ │ ├── RoleServiceImpl.java │ │ │ │ ├── SessionServiceImpl.java │ │ │ │ └── UserServiceImpl.java │ │ │ ├── shiro/ │ │ │ │ └── UserRealm.java │ │ │ └── vo/ │ │ │ └── UserVO.java │ │ └── util/ │ │ └── PageUtil.java │ └── resources/ │ ├── application-dev.yml │ ├── application-pro.yml │ ├── application.yml │ ├── config/ │ │ ├── ehcache.xml │ │ └── quartz.properties │ ├── generatorConfig.xml │ ├── logback-spring.xml │ ├── mybatis/ │ │ ├── activiti/ │ │ │ └── SalaryMapper.xml │ │ ├── app/ │ │ │ ├── ConsumerMapper.xml │ │ │ ├── DrugMapper.xml │ │ │ ├── ExpireMapper.xml │ │ │ ├── InventoryMapper.xml │ │ │ └── SupplierMapper.xml │ │ ├── blog/ │ │ │ └── ContentMapper.xml │ │ ├── common/ │ │ │ ├── DictMapper.xml │ │ │ ├── FileMapper.xml │ │ │ ├── LogMapper.xml │ │ │ └── TaskMapper.xml │ │ ├── oa/ │ │ │ ├── NotifyMapper.xml │ │ │ └── NotifyRecordMapper.xml │ │ └── system/ │ │ ├── DeptMapper.xml │ │ ├── MenuMapper.xml │ │ ├── RoleMapper.xml │ │ ├── RoleMenuMapper.xml │ │ ├── UserMapper.xml │ │ └── UserRoleMapper.xml │ ├── public/ │ │ ├── FontIcoList.html │ │ ├── chart/ │ │ │ └── graph_echarts.html │ │ ├── diagram-viewer/ │ │ │ ├── index.html │ │ │ ├── js/ │ │ │ │ ├── ActivitiRest.js │ │ │ │ ├── ActivityImpl.js │ │ │ │ ├── Color.js │ │ │ │ ├── LineBreakMeasurer.js │ │ │ │ ├── Polyline.js │ │ │ │ ├── ProcessDiagramCanvas.js │ │ │ │ ├── ProcessDiagramGenerator.js │ │ │ │ ├── jquery/ │ │ │ │ │ ├── jquery.asyncqueue.js │ │ │ │ │ ├── jquery.js │ │ │ │ │ └── jquery.progressbar.js │ │ │ │ ├── jstools.js │ │ │ │ ├── raphael.2.1.1.js │ │ │ │ ├── raphael.js │ │ │ │ ├── raphael_uncompressed.js │ │ │ │ └── textlayout.js │ │ │ └── style.css │ │ └── modeler.html │ ├── static/ │ │ ├── css/ │ │ │ ├── animate.css │ │ │ ├── blog/ │ │ │ │ └── clean-blog.css │ │ │ ├── bootstrap-rtl.css │ │ │ ├── demo/ │ │ │ │ └── webuploader-demo.css │ │ │ ├── font-awesome.css │ │ │ ├── gg-bootdo.css │ │ │ ├── layui.css │ │ │ ├── layui.mobile.css │ │ │ ├── login.css │ │ │ ├── plugins/ │ │ │ │ ├── awesome-bootstrap-checkbox/ │ │ │ │ │ └── awesome-bootstrap-checkbox.css │ │ │ │ ├── blueimp/ │ │ │ │ │ └── css/ │ │ │ │ │ ├── blueimp-gallery-indicator.css │ │ │ │ │ ├── blueimp-gallery-video.css │ │ │ │ │ ├── blueimp-gallery.css │ │ │ │ │ └── demo.css │ │ │ │ ├── chosen/ │ │ │ │ │ └── chosen.css │ │ │ │ ├── clockpicker/ │ │ │ │ │ └── clockpicker.css │ │ │ │ ├── codemirror/ │ │ │ │ │ ├── ambiance.css │ │ │ │ │ └── codemirror.css │ │ │ │ ├── cropper/ │ │ │ │ │ └── cropper.css │ │ │ │ ├── dataTables/ │ │ │ │ │ └── dataTables.bootstrap.css │ │ │ │ ├── datapicker/ │ │ │ │ │ └── datepicker3.css │ │ │ │ ├── dropzone/ │ │ │ │ │ ├── basic.css │ │ │ │ │ └── dropzone.css │ │ │ │ ├── duallistbox/ │ │ │ │ │ └── bootstrap-duallistbox.css │ │ │ │ ├── footable/ │ │ │ │ │ └── footable.core.css │ │ │ │ ├── fullcalendar/ │ │ │ │ │ ├── fullcalendar.css │ │ │ │ │ └── fullcalendar.print.css │ │ │ │ ├── iCheck/ │ │ │ │ │ └── custom.css │ │ │ │ ├── ionRangeSlider/ │ │ │ │ │ ├── ion.rangeSlider.css │ │ │ │ │ └── ion.rangeSlider.skinFlat.css │ │ │ │ ├── jqTreeGrid/ │ │ │ │ │ └── jquery.treegrid.css │ │ │ │ ├── jqgrid/ │ │ │ │ │ └── ui.jqgrid.css │ │ │ │ ├── multiselect/ │ │ │ │ │ └── bootstrap-multiselect.css │ │ │ │ ├── nouslider/ │ │ │ │ │ └── jquery.nouislider.css │ │ │ │ ├── plyr/ │ │ │ │ │ └── plyr.css │ │ │ │ ├── simditor/ │ │ │ │ │ └── simditor.css │ │ │ │ ├── steps/ │ │ │ │ │ └── jquery.steps.css │ │ │ │ ├── summernote/ │ │ │ │ │ ├── summernote-0.8.8.css │ │ │ │ │ ├── summernote-bs3.css │ │ │ │ │ └── summernote.css │ │ │ │ ├── sweetalert/ │ │ │ │ │ └── sweetalert.css │ │ │ │ ├── switchery/ │ │ │ │ │ └── switchery.css │ │ │ │ ├── treeview/ │ │ │ │ │ └── bootstrap-treeview.css │ │ │ │ ├── webuploader/ │ │ │ │ │ └── webuploader.css │ │ │ │ └── zTree/ │ │ │ │ ├── awesome.css │ │ │ │ └── metroStyle/ │ │ │ │ └── metroStyle.css │ │ │ └── style.css │ │ ├── editor-app/ │ │ │ ├── app-cfg.js │ │ │ ├── app.js │ │ │ ├── configuration/ │ │ │ │ ├── properties/ │ │ │ │ │ ├── assignment-display-template.html │ │ │ │ │ ├── assignment-popup.html │ │ │ │ │ ├── assignment-write-template.html │ │ │ │ │ ├── boolean-property-template.html │ │ │ │ │ ├── condition-expression-display-template.html │ │ │ │ │ ├── condition-expression-popup.html │ │ │ │ │ ├── condition-expression-write-template.html │ │ │ │ │ ├── default-value-display-template.html │ │ │ │ │ ├── event-listeners-display-template.html │ │ │ │ │ ├── event-listeners-popup.html │ │ │ │ │ ├── event-listeners-write-template.html │ │ │ │ │ ├── execution-listeners-display-template.html │ │ │ │ │ ├── execution-listeners-popup.html │ │ │ │ │ ├── execution-listeners-write-template.html │ │ │ │ │ ├── feedback-popup.html │ │ │ │ │ ├── fields-display-template.html │ │ │ │ │ ├── fields-popup.html │ │ │ │ │ ├── fields-write-template.html │ │ │ │ │ ├── form-properties-display-template.html │ │ │ │ │ ├── form-properties-popup.html │ │ │ │ │ ├── form-properties-write-template.html │ │ │ │ │ ├── in-parameters-display-template.html │ │ │ │ │ ├── in-parameters-popup.html │ │ │ │ │ ├── in-parameters-write-template.html │ │ │ │ │ ├── message-definitions-display-template.html │ │ │ │ │ ├── message-definitions-popup.html │ │ │ │ │ ├── message-definitions-write-template.html │ │ │ │ │ ├── message-property-write-template.html │ │ │ │ │ ├── multiinstance-property-write-template.html │ │ │ │ │ ├── out-parameters-display-template.html │ │ │ │ │ ├── out-parameters-popup.html │ │ │ │ │ ├── out-parameters-write-template.html │ │ │ │ │ ├── sequenceflow-order-display-template.html │ │ │ │ │ ├── sequenceflow-order-popup.html │ │ │ │ │ ├── sequenceflow-order-write-template.html │ │ │ │ │ ├── signal-definitions-display-template.html │ │ │ │ │ ├── signal-definitions-popup.html │ │ │ │ │ ├── signal-definitions-write-template.html │ │ │ │ │ ├── signal-property-write-template.html │ │ │ │ │ ├── string-property-write-mode-template.html │ │ │ │ │ ├── subprocess-reference-display-template.html │ │ │ │ │ ├── subprocess-reference-popup.html │ │ │ │ │ ├── subprocess-reference-write-template.html │ │ │ │ │ ├── task-listeners-display-template.html │ │ │ │ │ ├── task-listeners-popup.html │ │ │ │ │ ├── task-listeners-write-template.html │ │ │ │ │ ├── text-popup.html │ │ │ │ │ └── text-property-write-template.html │ │ │ │ ├── properties-assignment-controller.js │ │ │ │ ├── properties-condition-expression-controller.js │ │ │ │ ├── properties-custom-controllers.js │ │ │ │ ├── properties-default-controllers.js │ │ │ │ ├── properties-event-listeners-controller.js │ │ │ │ ├── properties-execution-listeners-controller.js │ │ │ │ ├── properties-fields-controller.js │ │ │ │ ├── properties-form-properties-controller.js │ │ │ │ ├── properties-in-parameters-controller.js │ │ │ │ ├── properties-message-definitions-controller.js │ │ │ │ ├── properties-message-scope-controller.js │ │ │ │ ├── properties-multiinstance-controller.js │ │ │ │ ├── properties-out-parameters-controller.js │ │ │ │ ├── properties-sequenceflow-order-controller.js │ │ │ │ ├── properties-signal-definitions-controller.js │ │ │ │ ├── properties-signal-scope-controller.js │ │ │ │ ├── properties-task-listeners-controller.js │ │ │ │ ├── properties.js │ │ │ │ ├── toolbar-custom-actions.js │ │ │ │ ├── toolbar-default-actions.js │ │ │ │ ├── toolbar.js │ │ │ │ └── url-config.js │ │ │ ├── css/ │ │ │ │ ├── style-common.css │ │ │ │ ├── style-editor.css │ │ │ │ └── style.css │ │ │ ├── editor/ │ │ │ │ ├── css/ │ │ │ │ │ └── editor.css │ │ │ │ ├── i18n/ │ │ │ │ │ ├── translation_de.js │ │ │ │ │ ├── translation_en_us.js │ │ │ │ │ ├── translation_signavio_de.js │ │ │ │ │ └── translation_signavio_en_us.js │ │ │ │ ├── oryx.debug.js │ │ │ │ └── oryx.js │ │ │ ├── editor-config.js │ │ │ ├── editor-controller.js │ │ │ ├── editor-utils.js │ │ │ ├── editor.html │ │ │ ├── eventbus.js │ │ │ ├── header-controller.js │ │ │ ├── i18n/ │ │ │ │ └── en.json │ │ │ ├── libs/ │ │ │ │ ├── angular-dragdrop.min-1.0.3.js │ │ │ │ ├── angular-mocks_1.2.13/ │ │ │ │ │ └── angular-mocks.js │ │ │ │ ├── angular-resource_1.2.13/ │ │ │ │ │ └── angular-resource.js │ │ │ │ ├── angular-route_1.2.13/ │ │ │ │ │ └── angular-route.js │ │ │ │ ├── angular-sanitize_1.2.13/ │ │ │ │ │ └── angular-sanitize.js │ │ │ │ ├── angular-translate-loader-static-files/ │ │ │ │ │ ├── .bower.json │ │ │ │ │ └── angular-translate-loader-static-files.js │ │ │ │ ├── angular-translate-storage-cookie/ │ │ │ │ │ ├── .bower.json │ │ │ │ │ └── angular-translate-storage-cookie.js │ │ │ │ ├── angular-translate_2.4.2/ │ │ │ │ │ └── angular-translate.js │ │ │ │ ├── bootstrap-daterangepicker_1.3.7/ │ │ │ │ │ ├── daterangepicker-bs3.css │ │ │ │ │ └── daterangepicker.js │ │ │ │ ├── bootstrap_3.1.1/ │ │ │ │ │ ├── css/ │ │ │ │ │ │ ├── bootstrap-theme.css │ │ │ │ │ │ └── bootstrap.css │ │ │ │ │ └── js/ │ │ │ │ │ └── bootstrap.js │ │ │ │ ├── es5-shim-15.3.4.5/ │ │ │ │ │ ├── .bower.json │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── CHANGES │ │ │ │ │ ├── CONTRIBUTORS.md │ │ │ │ │ ├── LICENSE │ │ │ │ │ ├── README.md │ │ │ │ │ ├── es5-sham.js │ │ │ │ │ ├── es5-shim.js │ │ │ │ │ ├── package.json │ │ │ │ │ └── tests/ │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── h-kill.js │ │ │ │ │ │ ├── h-matchers.js │ │ │ │ │ │ └── h.js │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index.min.html │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── jasmine-html.js │ │ │ │ │ │ ├── jasmine.css │ │ │ │ │ │ ├── jasmine.js │ │ │ │ │ │ └── json2.js │ │ │ │ │ └── spec/ │ │ │ │ │ ├── s-array.js │ │ │ │ │ ├── s-date.js │ │ │ │ │ ├── s-function.js │ │ │ │ │ ├── s-number.js │ │ │ │ │ ├── s-object.js │ │ │ │ │ └── s-string.js │ │ │ │ ├── jquery.autogrow-textarea.js │ │ │ │ ├── jquery_1.11.0/ │ │ │ │ │ └── jquery.js │ │ │ │ ├── json3_3.2.6/ │ │ │ │ │ ├── LICENSE │ │ │ │ │ └── lib/ │ │ │ │ │ └── json3.js │ │ │ │ ├── ng-grid-2.0.7-min.js │ │ │ │ ├── path_parser.js │ │ │ │ ├── prototype-1.5.1.js │ │ │ │ └── ui-utils.min-0.0.4.js │ │ │ ├── partials/ │ │ │ │ ├── root-stencil-item-template.html │ │ │ │ └── stencil-item-template.html │ │ │ ├── plugins.xml │ │ │ ├── popups/ │ │ │ │ ├── icon-template.html │ │ │ │ ├── save-model.html │ │ │ │ ├── select-shape.html │ │ │ │ └── unsaved-changes.html │ │ │ ├── select-shape-controller.js │ │ │ ├── stencil-controller.js │ │ │ └── toolbar-controller.js │ │ ├── fonts/ │ │ │ └── FontAwesome.otf │ │ ├── img/ │ │ │ └── browser.psd │ │ └── js/ │ │ ├── ajax-util.js │ │ ├── app.js │ │ ├── appjs/ │ │ │ ├── act/ │ │ │ │ ├── SalaryAdjustment/ │ │ │ │ │ └── form.js │ │ │ │ ├── model/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ └── model.js │ │ │ │ ├── process/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ └── process.js │ │ │ │ ├── salary/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ └── salary.js │ │ │ │ └── task/ │ │ │ │ ├── gotoTask.js │ │ │ │ └── totoTask.js │ │ │ ├── app/ │ │ │ │ ├── consumer/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ └── index.js │ │ │ │ ├── drug/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ └── index.js │ │ │ │ ├── drugin/ │ │ │ │ │ ├── add.js │ │ │ │ │ └── drugin.js │ │ │ │ ├── drugout/ │ │ │ │ │ ├── drugout.js │ │ │ │ │ └── out.js │ │ │ │ ├── sale/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── back.js │ │ │ │ │ └── index.js │ │ │ │ ├── sale-detail/ │ │ │ │ │ └── index.js │ │ │ │ ├── statistics/ │ │ │ │ │ └── index.js │ │ │ │ └── supplier/ │ │ │ │ ├── add.js │ │ │ │ ├── edit.js │ │ │ │ └── index.js │ │ │ ├── blog/ │ │ │ │ ├── bComments/ │ │ │ │ │ ├── add.js │ │ │ │ │ └── bComments.js │ │ │ │ └── bContent/ │ │ │ │ ├── add.js │ │ │ │ ├── bContent.js │ │ │ │ └── edit.js │ │ │ ├── common/ │ │ │ │ ├── dict/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── dict.js │ │ │ │ │ └── edit.js │ │ │ │ ├── generator/ │ │ │ │ │ ├── edit.js │ │ │ │ │ └── list.js │ │ │ │ ├── job/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ └── job.js │ │ │ │ └── log/ │ │ │ │ └── log.js │ │ │ ├── oa/ │ │ │ │ ├── notify/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ ├── notify.js │ │ │ │ │ ├── read.js │ │ │ │ │ └── selfNotify.js │ │ │ │ └── webSocket/ │ │ │ │ └── jquery.js │ │ │ ├── sys/ │ │ │ │ ├── menu/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ └── menu.js │ │ │ │ ├── online/ │ │ │ │ │ └── online.js │ │ │ │ ├── role/ │ │ │ │ │ ├── add.js │ │ │ │ │ ├── edit.js │ │ │ │ │ └── role.js │ │ │ │ └── user/ │ │ │ │ ├── add.js │ │ │ │ ├── edit.js │ │ │ │ ├── gg-bootdo.js │ │ │ │ ├── personal.js │ │ │ │ └── user.js │ │ │ └── system/ │ │ │ └── sysDept/ │ │ │ ├── add.js │ │ │ ├── edit.js │ │ │ └── sysDept.js │ │ ├── contabs.js │ │ ├── content.js │ │ ├── demo/ │ │ │ ├── bootstrap-table-demo.js │ │ │ ├── bootstrap_table_test.json │ │ │ ├── bootstrap_table_test2.json │ │ │ ├── echarts-demo.js │ │ │ ├── flot-demo.js │ │ │ ├── form-advanced-demo.js │ │ │ ├── form-validate-demo.js │ │ │ ├── layer-demo.js │ │ │ ├── morris-demo.js │ │ │ ├── peity-demo.js │ │ │ ├── photos.json │ │ │ ├── rickshaw-demo.js │ │ │ ├── sparkline-demo.js │ │ │ ├── table_base.json │ │ │ ├── treeview-demo.js │ │ │ └── webuploader-demo.js │ │ ├── lay/ │ │ │ ├── all-mobile.js │ │ │ ├── all.js │ │ │ └── modules/ │ │ │ ├── carousel.js │ │ │ ├── code.js │ │ │ ├── element.js │ │ │ ├── flow.js │ │ │ ├── form.js │ │ │ ├── jquery.js │ │ │ ├── laydate.js │ │ │ ├── layedit.js │ │ │ ├── layer.js │ │ │ ├── laypage.js │ │ │ ├── laytpl.js │ │ │ ├── mobile/ │ │ │ │ ├── layer-mobile.js │ │ │ │ ├── layim-mobile-open.js │ │ │ │ ├── upload-mobile.js │ │ │ │ └── zepto.js │ │ │ ├── mobile.js │ │ │ ├── table.js │ │ │ ├── tree.js │ │ │ ├── upload.js │ │ │ └── util.js │ │ ├── layui.js │ │ ├── plugins/ │ │ │ ├── beautifyhtml/ │ │ │ │ └── beautifyhtml.js │ │ │ ├── bootstrap-table/ │ │ │ │ └── locale/ │ │ │ │ └── bootstrap-table-zh-CN.js │ │ │ ├── chosen/ │ │ │ │ └── chosen.jquery.js │ │ │ ├── clockpicker/ │ │ │ │ └── clockpicker.js │ │ │ ├── codemirror/ │ │ │ │ ├── codemirror.js │ │ │ │ └── mode/ │ │ │ │ ├── apl/ │ │ │ │ │ ├── apl.js │ │ │ │ │ └── index.html │ │ │ │ ├── asterisk/ │ │ │ │ │ ├── asterisk.js │ │ │ │ │ └── index.html │ │ │ │ ├── clike/ │ │ │ │ │ ├── clike.js │ │ │ │ │ ├── index.html │ │ │ │ │ └── scala.html │ │ │ │ ├── clojure/ │ │ │ │ │ ├── clojure.js │ │ │ │ │ └── index.html │ │ │ │ ├── cobol/ │ │ │ │ │ ├── cobol.js │ │ │ │ │ └── index.html │ │ │ │ ├── coffeescript/ │ │ │ │ │ ├── coffeescript.js │ │ │ │ │ └── index.html │ │ │ │ ├── commonlisp/ │ │ │ │ │ ├── commonlisp.js │ │ │ │ │ └── index.html │ │ │ │ ├── css/ │ │ │ │ │ ├── css.js │ │ │ │ │ ├── index.html │ │ │ │ │ ├── less.html │ │ │ │ │ ├── less_test.js │ │ │ │ │ ├── scss.html │ │ │ │ │ ├── scss_test.js │ │ │ │ │ └── test.js │ │ │ │ ├── cypher/ │ │ │ │ │ ├── cypher.js │ │ │ │ │ └── index.html │ │ │ │ ├── d/ │ │ │ │ │ ├── d.js │ │ │ │ │ └── index.html │ │ │ │ ├── dart/ │ │ │ │ │ ├── dart.js │ │ │ │ │ └── index.html │ │ │ │ ├── diff/ │ │ │ │ │ ├── diff.js │ │ │ │ │ └── index.html │ │ │ │ ├── django/ │ │ │ │ │ ├── django.js │ │ │ │ │ └── index.html │ │ │ │ ├── dockerfile/ │ │ │ │ │ ├── dockerfile.js │ │ │ │ │ └── index.html │ │ │ │ ├── dtd/ │ │ │ │ │ ├── dtd.js │ │ │ │ │ └── index.html │ │ │ │ ├── dylan/ │ │ │ │ │ ├── dylan.js │ │ │ │ │ └── index.html │ │ │ │ ├── ebnf/ │ │ │ │ │ ├── ebnf.js │ │ │ │ │ └── index.html │ │ │ │ ├── ecl/ │ │ │ │ │ ├── ecl.js │ │ │ │ │ └── index.html │ │ │ │ ├── eiffel/ │ │ │ │ │ ├── eiffel.js │ │ │ │ │ └── index.html │ │ │ │ ├── erlang/ │ │ │ │ │ ├── erlang.js │ │ │ │ │ └── index.html │ │ │ │ ├── fortran/ │ │ │ │ │ ├── fortran.js │ │ │ │ │ └── index.html │ │ │ │ ├── gas/ │ │ │ │ │ ├── gas.js │ │ │ │ │ └── index.html │ │ │ │ ├── gfm/ │ │ │ │ │ ├── gfm.js │ │ │ │ │ ├── index.html │ │ │ │ │ └── test.js │ │ │ │ ├── gherkin/ │ │ │ │ │ ├── gherkin.js │ │ │ │ │ └── index.html │ │ │ │ ├── go/ │ │ │ │ │ ├── go.js │ │ │ │ │ └── index.html │ │ │ │ ├── groovy/ │ │ │ │ │ ├── groovy.js │ │ │ │ │ └── index.html │ │ │ │ ├── haml/ │ │ │ │ │ ├── haml.js │ │ │ │ │ ├── index.html │ │ │ │ │ └── test.js │ │ │ │ ├── haskell/ │ │ │ │ │ ├── haskell.js │ │ │ │ │ └── index.html │ │ │ │ ├── haxe/ │ │ │ │ │ ├── haxe.js │ │ │ │ │ └── index.html │ │ │ │ ├── htmlembedded/ │ │ │ │ │ ├── htmlembedded.js │ │ │ │ │ └── index.html │ │ │ │ ├── htmlmixed/ │ │ │ │ │ ├── htmlmixed.js │ │ │ │ │ └── index.html │ │ │ │ ├── http/ │ │ │ │ │ ├── http.js │ │ │ │ │ └── index.html │ │ │ │ ├── idl/ │ │ │ │ │ ├── idl.js │ │ │ │ │ └── index.html │ │ │ │ ├── index.html │ │ │ │ ├── jade/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── jade.js │ │ │ │ ├── javascript/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── javascript.js │ │ │ │ │ ├── json-ld.html │ │ │ │ │ ├── test.js │ │ │ │ │ └── typescript.html │ │ │ │ ├── jinja2/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── jinja2.js │ │ │ │ ├── julia/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── julia.js │ │ │ │ ├── kotlin/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── kotlin.js │ │ │ │ ├── livescript/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── livescript.js │ │ │ │ ├── lua/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── lua.js │ │ │ │ ├── markdown/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── markdown.js │ │ │ │ │ └── test.js │ │ │ │ ├── meta.js │ │ │ │ ├── mirc/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── mirc.js │ │ │ │ ├── mllike/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── mllike.js │ │ │ │ ├── modelica/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── modelica.js │ │ │ │ ├── nginx/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── nginx.js │ │ │ │ ├── ntriples/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── ntriples.js │ │ │ │ ├── octave/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── octave.js │ │ │ │ ├── pascal/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── pascal.js │ │ │ │ ├── pegjs/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── pegjs.js │ │ │ │ ├── perl/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── perl.js │ │ │ │ ├── php/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── php.js │ │ │ │ │ └── test.js │ │ │ │ ├── pig/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── pig.js │ │ │ │ ├── properties/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── properties.js │ │ │ │ ├── puppet/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── puppet.js │ │ │ │ ├── python/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── python.js │ │ │ │ ├── q/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── q.js │ │ │ │ ├── r/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── r.js │ │ │ │ ├── rpm/ │ │ │ │ │ ├── changes/ │ │ │ │ │ │ └── index.html │ │ │ │ │ ├── index.html │ │ │ │ │ └── rpm.js │ │ │ │ ├── rst/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── rst.js │ │ │ │ ├── ruby/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── ruby.js │ │ │ │ │ └── test.js │ │ │ │ ├── rust/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── rust.js │ │ │ │ ├── sass/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── sass.js │ │ │ │ ├── scheme/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── scheme.js │ │ │ │ ├── shell/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── shell.js │ │ │ │ │ └── test.js │ │ │ │ ├── sieve/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── sieve.js │ │ │ │ ├── slim/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── slim.js │ │ │ │ │ └── test.js │ │ │ │ ├── smalltalk/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── smalltalk.js │ │ │ │ ├── smarty/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── smarty.js │ │ │ │ ├── smartymixed/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── smartymixed.js │ │ │ │ ├── solr/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── solr.js │ │ │ │ ├── soy/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── soy.js │ │ │ │ ├── sparql/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── sparql.js │ │ │ │ ├── spreadsheet/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── spreadsheet.js │ │ │ │ ├── sql/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── sql.js │ │ │ │ ├── stex/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── stex.js │ │ │ │ │ └── test.js │ │ │ │ ├── tcl/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── tcl.js │ │ │ │ ├── textile/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── test.js │ │ │ │ │ └── textile.js │ │ │ │ ├── tiddlywiki/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── tiddlywiki.css │ │ │ │ │ └── tiddlywiki.js │ │ │ │ ├── tiki/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── tiki.css │ │ │ │ │ └── tiki.js │ │ │ │ ├── toml/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── toml.js │ │ │ │ ├── tornado/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── tornado.js │ │ │ │ ├── turtle/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── turtle.js │ │ │ │ ├── vb/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── vb.js │ │ │ │ ├── vbscript/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── vbscript.js │ │ │ │ ├── velocity/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── velocity.js │ │ │ │ ├── verilog/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── test.js │ │ │ │ │ └── verilog.js │ │ │ │ ├── xml/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── test.js │ │ │ │ │ └── xml.js │ │ │ │ ├── xquery/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── test.js │ │ │ │ │ └── xquery.js │ │ │ │ ├── yaml/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── yaml.js │ │ │ │ └── z80/ │ │ │ │ ├── index.html │ │ │ │ └── z80.js │ │ │ ├── dataTables/ │ │ │ │ ├── dataTables.bootstrap.js │ │ │ │ └── jquery.dataTables.js │ │ │ ├── datapicker/ │ │ │ │ └── bootstrap-datepicker.js │ │ │ ├── diff_match_patch/ │ │ │ │ └── diff_match_patch.js │ │ │ ├── distpicker/ │ │ │ │ └── distpicker.js │ │ │ ├── dropzone/ │ │ │ │ └── dropzone.js │ │ │ ├── duallistbox/ │ │ │ │ └── jquery.bootstrap-duallistbox.js │ │ │ ├── easypiechart/ │ │ │ │ └── jquery.easypiechart.js │ │ │ ├── echarts/ │ │ │ │ └── echarts-all.js │ │ │ ├── fancybox/ │ │ │ │ ├── jquery.fancybox.css │ │ │ │ └── jquery.fancybox.js │ │ │ ├── flot/ │ │ │ │ ├── curvedLines.js │ │ │ │ ├── jquery.flot.js │ │ │ │ ├── jquery.flot.pie.js │ │ │ │ ├── jquery.flot.resize.js │ │ │ │ ├── jquery.flot.spline.js │ │ │ │ └── jquery.flot.symbol.js │ │ │ ├── gritter/ │ │ │ │ └── jquery.gritter.css │ │ │ ├── jeditable/ │ │ │ │ └── jquery.jeditable.js │ │ │ ├── jqTreeGrid/ │ │ │ │ ├── jquery.treegrid.bootstrap3.js │ │ │ │ ├── jquery.treegrid.css │ │ │ │ ├── jquery.treegrid.extension.js │ │ │ │ ├── jquery.treegrid.js │ │ │ │ └── tree.table.js │ │ │ ├── jqgrid/ │ │ │ │ └── i18n/ │ │ │ │ └── grid.locale-cn.js │ │ │ ├── jsKnob/ │ │ │ │ └── jquery.knob.js │ │ │ ├── jsTree/ │ │ │ │ └── jstree.js │ │ │ ├── jvectormap/ │ │ │ │ └── jquery-jvectormap-world-mill-en.js │ │ │ ├── laydate/ │ │ │ │ ├── laydate.js │ │ │ │ └── theme/ │ │ │ │ └── default/ │ │ │ │ └── laydate.css │ │ │ ├── layer/ │ │ │ │ ├── extend/ │ │ │ │ │ └── layer.ext.js │ │ │ │ ├── laydate/ │ │ │ │ │ ├── laydate.js │ │ │ │ │ ├── need/ │ │ │ │ │ │ └── laydate.css │ │ │ │ │ └── skins/ │ │ │ │ │ └── default/ │ │ │ │ │ └── laydate.css │ │ │ │ ├── layer.js │ │ │ │ ├── layim/ │ │ │ │ │ ├── data/ │ │ │ │ │ │ ├── chatlog.json │ │ │ │ │ │ ├── friend.json │ │ │ │ │ │ ├── group.json │ │ │ │ │ │ └── groups.json │ │ │ │ │ ├── layim.css │ │ │ │ │ └── layim.js │ │ │ │ ├── mobile/ │ │ │ │ │ ├── layer.js │ │ │ │ │ └── need/ │ │ │ │ │ └── layer.css │ │ │ │ ├── skin/ │ │ │ │ │ ├── layer.css │ │ │ │ │ ├── layer.ext.css │ │ │ │ │ └── moon/ │ │ │ │ │ └── style.css │ │ │ │ └── theme/ │ │ │ │ └── default/ │ │ │ │ └── layer.css │ │ │ ├── markdown/ │ │ │ │ ├── bootstrap-markdown.js │ │ │ │ ├── bootstrap-markdown.zh.js │ │ │ │ ├── markdown.js │ │ │ │ └── to-markdown.js │ │ │ ├── metisMenu/ │ │ │ │ └── jquery.metisMenu.js │ │ │ ├── morris/ │ │ │ │ └── morris.js │ │ │ ├── multiselect/ │ │ │ │ └── bootstrap-multiselect.js │ │ │ ├── nestable/ │ │ │ │ └── jquery.nestable.js │ │ │ ├── plyr/ │ │ │ │ └── plyr.js │ │ │ ├── prettyfile/ │ │ │ │ └── bootstrap-prettyfile.js │ │ │ ├── rickshaw/ │ │ │ │ └── vendor/ │ │ │ │ └── d3.v3.js │ │ │ ├── select2/ │ │ │ │ ├── css/ │ │ │ │ │ └── select2.css │ │ │ │ └── js/ │ │ │ │ ├── i18n/ │ │ │ │ │ ├── af.js │ │ │ │ │ ├── ar.js │ │ │ │ │ ├── az.js │ │ │ │ │ ├── bg.js │ │ │ │ │ ├── bs.js │ │ │ │ │ ├── ca.js │ │ │ │ │ ├── cs.js │ │ │ │ │ ├── da.js │ │ │ │ │ ├── de.js │ │ │ │ │ ├── dsb.js │ │ │ │ │ ├── el.js │ │ │ │ │ ├── en.js │ │ │ │ │ ├── es.js │ │ │ │ │ ├── et.js │ │ │ │ │ ├── eu.js │ │ │ │ │ ├── fa.js │ │ │ │ │ ├── fi.js │ │ │ │ │ ├── fr.js │ │ │ │ │ ├── gl.js │ │ │ │ │ ├── he.js │ │ │ │ │ ├── hi.js │ │ │ │ │ ├── hr.js │ │ │ │ │ ├── hsb.js │ │ │ │ │ ├── hu.js │ │ │ │ │ ├── hy.js │ │ │ │ │ ├── id.js │ │ │ │ │ ├── is.js │ │ │ │ │ ├── it.js │ │ │ │ │ ├── ja.js │ │ │ │ │ ├── km.js │ │ │ │ │ ├── ko.js │ │ │ │ │ ├── lt.js │ │ │ │ │ ├── lv.js │ │ │ │ │ ├── mk.js │ │ │ │ │ ├── ms.js │ │ │ │ │ ├── nb.js │ │ │ │ │ ├── nl.js │ │ │ │ │ ├── pl.js │ │ │ │ │ ├── ps.js │ │ │ │ │ ├── pt-BR.js │ │ │ │ │ ├── pt.js │ │ │ │ │ ├── ro.js │ │ │ │ │ ├── ru.js │ │ │ │ │ ├── sk.js │ │ │ │ │ ├── sl.js │ │ │ │ │ ├── sr-Cyrl.js │ │ │ │ │ ├── sr.js │ │ │ │ │ ├── sv.js │ │ │ │ │ ├── th.js │ │ │ │ │ ├── tk.js │ │ │ │ │ ├── tr.js │ │ │ │ │ ├── uk.js │ │ │ │ │ ├── vi.js │ │ │ │ │ ├── zh-CN.js │ │ │ │ │ └── zh-TW.js │ │ │ │ ├── select2.full.js │ │ │ │ └── select2.js │ │ │ ├── simditor/ │ │ │ │ ├── hotkeys.js │ │ │ │ ├── module.js │ │ │ │ ├── simditor.js │ │ │ │ └── uploader.js │ │ │ ├── suggest/ │ │ │ │ └── data.json │ │ │ ├── summernote/ │ │ │ │ ├── summernote-zh-CN.js │ │ │ │ └── summernote.js │ │ │ ├── switchery/ │ │ │ │ └── switchery.js │ │ │ ├── treeview/ │ │ │ │ └── bootstrap-treeview.js │ │ │ ├── validate/ │ │ │ │ └── jquery.validate.extend.js │ │ │ └── webuploader/ │ │ │ ├── README.md │ │ │ ├── Uploader.swf │ │ │ ├── webuploader.css │ │ │ ├── webuploader.custom.js │ │ │ ├── webuploader.fis.js │ │ │ ├── webuploader.flashonly.js │ │ │ ├── webuploader.html5only.js │ │ │ ├── webuploader.js │ │ │ ├── webuploader.noimage.js │ │ │ ├── webuploader.nolog.js │ │ │ └── webuploader.withoutimage.js │ │ └── welcome.js │ ├── stencilset.json │ └── templates/ │ ├── act/ │ │ ├── model/ │ │ │ └── model.html │ │ ├── modeler.html │ │ ├── process/ │ │ │ ├── add.html │ │ │ └── process.html │ │ ├── salary/ │ │ │ ├── add.html │ │ │ ├── edit.html │ │ │ └── start.html │ │ └── task/ │ │ ├── gotoTask.html │ │ ├── task.html │ │ └── todoTask.html │ ├── app/ │ │ ├── data-maintenance/ │ │ │ ├── consumer/ │ │ │ │ ├── add.html │ │ │ │ ├── edit.html │ │ │ │ └── index.html │ │ │ ├── drug/ │ │ │ │ ├── add.html │ │ │ │ ├── edit.html │ │ │ │ └── index.html │ │ │ └── supplier/ │ │ │ ├── add.html │ │ │ ├── edit.html │ │ │ └── index.html │ │ ├── inventory/ │ │ │ ├── drug-in/ │ │ │ │ ├── add.html │ │ │ │ └── drug-in.html │ │ │ └── drug-out/ │ │ │ ├── drug-out.html │ │ │ └── out.html │ │ ├── sale/ │ │ │ ├── add.html │ │ │ ├── back.html │ │ │ └── index.html │ │ ├── sale-detail/ │ │ │ └── index.html │ │ └── statistics/ │ │ └── index.html │ ├── blog/ │ │ ├── bContent/ │ │ │ ├── add.html │ │ │ ├── bContent.html │ │ │ └── edit.html │ │ ├── bcomments/ │ │ │ ├── add.html │ │ │ └── bComments.html │ │ └── index/ │ │ ├── about.html │ │ ├── include_blog.html │ │ ├── main.html │ │ ├── page.html │ │ └── post.html │ ├── common/ │ │ ├── dict/ │ │ │ ├── add.html │ │ │ ├── dict.html │ │ │ └── edit.html │ │ ├── file/ │ │ │ └── file.html │ │ ├── generator/ │ │ │ ├── Controller.java.vm │ │ │ ├── Dao.java.vm │ │ │ ├── Mapper.java.vm │ │ │ ├── Mapper.xml.vm │ │ │ ├── Service.java.vm │ │ │ ├── ServiceImpl.java.vm │ │ │ ├── add.html.vm │ │ │ ├── add.js.vm │ │ │ ├── domain.java.vm │ │ │ ├── edit.html │ │ │ ├── edit.html.vm │ │ │ ├── edit.js.vm │ │ │ ├── list.html │ │ │ ├── list.html.vm │ │ │ ├── list.js.vm │ │ │ └── menu.sql.vm │ │ ├── job/ │ │ │ ├── add.html │ │ │ ├── edit.html │ │ │ └── job.html │ │ └── log/ │ │ └── log.html │ ├── error/ │ │ ├── 403.html │ │ ├── 404.html │ │ ├── 500.html │ │ └── error.html │ ├── include.html │ ├── index_v1.html │ ├── login.html │ ├── main.html │ ├── oa/ │ │ └── notify/ │ │ ├── add.html │ │ ├── edit.html │ │ ├── notify.html │ │ ├── read.html │ │ └── selfNotify.html │ └── system/ │ ├── dept/ │ │ ├── add.html │ │ ├── dept.html │ │ ├── deptTree.html │ │ └── edit.html │ ├── menu/ │ │ ├── add.html │ │ ├── edit.html │ │ └── menu.html │ ├── online/ │ │ └── online.html │ ├── role/ │ │ ├── add.html │ │ ├── edit.html │ │ └── role.html │ └── user/ │ ├── add.html │ ├── edit.html │ ├── include.html │ ├── personal.html │ ├── reset_pwd.html │ ├── user.html │ └── userTree.html └── test/ └── java/ └── me/ └── zbl/ ├── app/ │ └── LowerLimitTest.java └── testDemo/ └── TestDemo.java ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ *.js linguist-language=java ================================================ FILE: .gitignore ================================================ # Created by .ignore support plugin (hsz.mobi) ### Maven template target/ pom.xml.tag pom.xml.releaseBackup pom.xml.versionsBackup pom.xml.next release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) !/.mvn/wrapper/maven-wrapper.jar ### JetBrains template # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 .idea/ # User-specific stuff: # Sensitive or high-churn files: # Gradle: # CMake cmake-build-debug/ cmake-build-release/ # Mongo Explorer plugin: .idea/**/mongoSettings.xml ## File-based project format: *.iml *.iws ## Plugin-specific files: # IntelliJ out/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Cursive Clojure plugin .idea/replstate.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties applog/ ================================================ FILE: Dockerfile ================================================ FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD target/hospital-drug-0.0.1.jar app.jar ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=pro"] ================================================ FILE: README.md ================================================ ## 库存管理 - 登记入库的药品。 - 登记出库的药品。 - 每日检查库存下限,报警。 - 每日检查过期的药品,报警并做退回销毁处理。 - 对有问题的药品的退回供应商。记录退回的药品的名称、数量、金额和退货原因等。 ## 销售管理 - 记录每次销售行为。包括药品的编号、名称、数量、金额、经手人、经手日期等。 - 对每次退货进行记录,登记退货原因。 ## 汇总和统计 - 每日统计销售情况并生成报表。 - 月终和年终的销售数据统计。 - 查询销售明细和统计数据。 ## 明细查询 - 查询药品基本信息。 - 查询库存情况。 - 查询退回供应商的药品情况 - 查询供应商信息 - 查询与供应商的往来账目查询 ================================================ FILE: pom.xml ================================================ 4.0.0 me.zbl hospital-drug 0.0.1 jar hospital-drug Management system of hospital drug. org.springframework.boot spring-boot-starter-parent 1.5.9.RELEASE UTF-8 UTF-8 1.8 1.0.4 1.7 5.22.0 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-aop org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf net.sourceforge.nekohtml nekohtml mysql mysql-connector-java org.mybatis mybatis 3.4.4 org.mybatis mybatis-typehandlers-jsr310 1.0.2 org.mybatis.spring.boot mybatis-spring-boot-starter 1.1.1 com.alibaba druid 1.0.28 org.apache.commons commons-lang3 3.6 commons-configuration commons-configuration 1.10 commons-io commons-io 2.5 org.apache.shiro shiro-core 1.3.2 org.apache.shiro shiro-spring 1.3.2 org.apache.shiro shiro-ehcache 1.3.2 com.github.theborakompanioni thymeleaf-extras-shiro 1.2.1 com.alibaba fastjson 1.2.31 org.apache.velocity velocity 1.7 org.springframework.boot spring-boot-starter-cache net.sf.ehcache ehcache org.quartz-scheduler quartz 2.2.1 slf4j-api org.slf4j org.springframework.boot spring-boot-starter-websocket org.springframework spring-context-support org.springframework.boot spring-boot-devtools true org.activiti activiti-engine ${activiti.version} org.activiti activiti-spring ${activiti.version} org.activiti activiti-modeler ${activiti.version} org.activiti activiti-diagram-rest ${activiti.version} io.springfox springfox-swagger2 2.6.1 io.springfox springfox-swagger-ui 2.6.1 org.springframework.boot spring-boot-starter-data-redis org.jsoup jsoup 1.9.2 com.github.pagehelper pagehelper-spring-boot-starter 1.2.5 org.apache.maven.plugins maven-surefire-plugin true org.springframework.boot spring-boot-maven-plugin true org.mybatis.generator mybatis-generator-maven-plugin 1.3.5 src/main/resources/generatorConfig.xml true true mysql mysql-connector-java 5.1.6 public aliyun nexus http://maven.aliyun.com/nexus/content/groups/public/ true public aliyun nexus http://maven.aliyun.com/nexus/content/groups/public/ true false ================================================ FILE: rest-test/test_supplier_list.xml ================================================ ================================================ FILE: rest-test/test_supplier_save.xml ================================================ ================================================ FILE: sql/hospital-drug.sql ================================================ /* Navicat MySQL Data Transfer Source Server : 本地 MySQL Source Server Version : 50714 Source Host : localhost:3306 Source Database : hospital-drug Target Server Type : MYSQL Target Server Version : 50714 File Encoding : 65001 Date: 2018-04-23 13:17:46 */ CREATE DATABASE IF NOT EXISTS `hospital-drug`; USE `hospital-drug`; SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for act_id_user -- ---------------------------- DROP TABLE IF EXISTS `act_id_user`; CREATE TABLE `act_id_user` ( `ID_` varchar(64) COLLATE utf8_bin NOT NULL, `REV_` int(11) DEFAULT NULL, `FIRST_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `LAST_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `EMAIL_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `PWD_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `PICTURE_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`ID_`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- ---------------------------- -- Records of act_id_user -- ---------------------------- -- ---------------------------- -- Table structure for act_re_deployment -- ---------------------------- DROP TABLE IF EXISTS `act_re_deployment`; CREATE TABLE `act_re_deployment` ( `ID_` varchar(64) COLLATE utf8_bin NOT NULL, `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', `DEPLOY_TIME_` timestamp(3) NULL DEFAULT NULL, PRIMARY KEY (`ID_`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- ---------------------------- -- Records of act_re_deployment -- ---------------------------- -- ---------------------------- -- Table structure for act_re_procdef -- ---------------------------- DROP TABLE IF EXISTS `act_re_procdef`; CREATE TABLE `act_re_procdef` ( `ID_` varchar(64) COLLATE utf8_bin NOT NULL, `REV_` int(11) DEFAULT NULL, `CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `KEY_` varchar(255) COLLATE utf8_bin NOT NULL, `VERSION_` int(11) NOT NULL, `DEPLOYMENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `RESOURCE_NAME_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, `DGRM_RESOURCE_NAME_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, `DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, `HAS_START_FORM_KEY_` tinyint(4) DEFAULT NULL, `HAS_GRAPHICAL_NOTATION_` tinyint(4) DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', PRIMARY KEY (`ID_`), UNIQUE KEY `ACT_UNIQ_PROCDEF` (`KEY_`,`VERSION_`,`TENANT_ID_`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- ---------------------------- -- Records of act_re_procdef -- ---------------------------- -- ---------------------------- -- Table structure for act_ru_execution -- ---------------------------- DROP TABLE IF EXISTS `act_ru_execution`; CREATE TABLE `act_ru_execution` ( `ID_` varchar(64) COLLATE utf8_bin NOT NULL, `REV_` int(11) DEFAULT NULL, `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `BUSINESS_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `PARENT_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `SUPER_EXEC_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `ACT_ID_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `IS_ACTIVE_` tinyint(4) DEFAULT NULL, `IS_CONCURRENT_` tinyint(4) DEFAULT NULL, `IS_SCOPE_` tinyint(4) DEFAULT NULL, `IS_EVENT_SCOPE_` tinyint(4) DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `CACHED_ENT_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `LOCK_TIME_` timestamp(3) NULL DEFAULT NULL, PRIMARY KEY (`ID_`), KEY `ACT_IDX_EXEC_BUSKEY` (`BUSINESS_KEY_`), KEY `ACT_FK_EXE_PROCINST` (`PROC_INST_ID_`), KEY `ACT_FK_EXE_PARENT` (`PARENT_ID_`), KEY `ACT_FK_EXE_SUPER` (`SUPER_EXEC_`), KEY `ACT_FK_EXE_PROCDEF` (`PROC_DEF_ID_`), CONSTRAINT `ACT_FK_EXE_PARENT` FOREIGN KEY (`PARENT_ID_`) REFERENCES `act_ru_execution` (`ID_`), CONSTRAINT `ACT_FK_EXE_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`), CONSTRAINT `ACT_FK_EXE_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `ACT_FK_EXE_SUPER` FOREIGN KEY (`SUPER_EXEC_`) REFERENCES `act_ru_execution` (`ID_`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- ---------------------------- -- Records of act_ru_execution -- ---------------------------- -- ---------------------------- -- Table structure for act_ru_task -- ---------------------------- DROP TABLE IF EXISTS `act_ru_task`; CREATE TABLE `act_ru_task` ( `ID_` varchar(64) COLLATE utf8_bin NOT NULL, `REV_` int(11) DEFAULT NULL, `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `PROC_DEF_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `NAME_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `PARENT_TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `DESCRIPTION_` varchar(4000) COLLATE utf8_bin DEFAULT NULL, `TASK_DEF_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `OWNER_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `ASSIGNEE_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `DELEGATION_` varchar(64) COLLATE utf8_bin DEFAULT NULL, `PRIORITY_` int(11) DEFAULT NULL, `CREATE_TIME_` timestamp(3) NULL DEFAULT NULL, `DUE_DATE_` datetime(3) DEFAULT NULL, `CATEGORY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, `SUSPENSION_STATE_` int(11) DEFAULT NULL, `TENANT_ID_` varchar(255) COLLATE utf8_bin DEFAULT '', `FORM_KEY_` varchar(255) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`ID_`), KEY `ACT_IDX_TASK_CREATE` (`CREATE_TIME_`), KEY `ACT_FK_TASK_EXE` (`EXECUTION_ID_`), KEY `ACT_FK_TASK_PROCINST` (`PROC_INST_ID_`), KEY `ACT_FK_TASK_PROCDEF` (`PROC_DEF_ID_`), CONSTRAINT `ACT_FK_TASK_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `act_ru_execution` (`ID_`), CONSTRAINT `ACT_FK_TASK_PROCDEF` FOREIGN KEY (`PROC_DEF_ID_`) REFERENCES `act_re_procdef` (`ID_`), CONSTRAINT `ACT_FK_TASK_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `act_ru_execution` (`ID_`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; -- ---------------------------- -- Records of act_ru_task -- ---------------------------- -- ---------------------------- -- Table structure for app_consumer -- ---------------------------- DROP TABLE IF EXISTS `app_consumer`; CREATE TABLE `app_consumer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `tel` varchar(12) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='顾客表-存储顾客的基本信息'; -- ---------------------------- -- Records of app_consumer -- ---------------------------- -- ---------------------------- -- Table structure for app_drug -- ---------------------------- DROP TABLE IF EXISTS `app_drug`; CREATE TABLE `app_drug` ( `id` varchar(20) NOT NULL COMMENT '主键', `name` varchar(30) NOT NULL COMMENT '药品名称', `quantity` int(8) NOT NULL DEFAULT '0' COMMENT '库存数', `invalid_date` date NOT NULL COMMENT '失效日期', `price` decimal(10,2) NOT NULL COMMENT '单价', `invalid` varchar(2) NOT NULL DEFAULT '0' COMMENT '是否问题药品', `quality_guarantee_period` int(11) unsigned NOT NULL COMMENT '保质期(月)', `lower_limit` int(8) unsigned NOT NULL, `supplier_id` varchar(20) NOT NULL, PRIMARY KEY (`id`), KEY `supplier_id` (`supplier_id`), CONSTRAINT `app_drug_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `app_supplier` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='药品表-存储药品的基本信息'; -- ---------------------------- -- Records of app_drug -- ---------------------------- INSERT INTO `app_drug` VALUES ('6901894121021', '藿香正气水', '1000', '2018-04-06', '10.00', '0', '20180405', '20', 'HEB-0001'); -- ---------------------------- -- Table structure for app_expire -- ---------------------------- DROP TABLE IF EXISTS `app_expire`; CREATE TABLE `app_expire` ( `id` int(20) NOT NULL COMMENT '主键', `drug_id` varchar(20) NOT NULL COMMENT '药品 ID', `expired_date` date NOT NULL COMMENT '药品过期日期', PRIMARY KEY (`id`), KEY `drug_id` (`drug_id`), CONSTRAINT `app_expire_ibfk_1` FOREIGN KEY (`drug_id`) REFERENCES `app_drug` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='过期记录表-每次入库输入该批次的生产日期,计算过期的日期,存到这个表'; -- ---------------------------- -- Records of app_expire -- ---------------------------- -- ---------------------------- -- Table structure for app_inventory_record -- ---------------------------- DROP TABLE IF EXISTS `app_inventory_record`; CREATE TABLE `app_inventory_record` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `supplier_id` varchar(20) NOT NULL COMMENT '供应商 ID', `drug_id` varchar(20) NOT NULL COMMENT '药品 ID', `name` varchar(30) NOT NULL COMMENT '药品名称', `type` varchar(2) NOT NULL DEFAULT '1' COMMENT '1:入库,2:出库销售,3:出库退回', `quantity` int(8) NOT NULL COMMENT '进货/退回/销售数量', `ammount` decimal(10,2) NOT NULL COMMENT '金额', `comment` varchar(100) DEFAULT NULL COMMENT '入库、出库、退货原因等', `consumer_id` int(11) DEFAULT NULL COMMENT '顾客 ID', `manager` varchar(20) NOT NULL COMMENT '经办人', `gmt_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `supplier_id` (`supplier_id`), KEY `consumer_id` (`consumer_id`), CONSTRAINT `app_inventory_record_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `app_supplier` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `app_inventory_record_ibfk_2` FOREIGN KEY (`consumer_id`) REFERENCES `app_consumer` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='出入库记录表-存储每次出库和入库情况(注:销售、退回供应商都算出库,顾客退货算入库)'; -- ---------------------------- -- Records of app_inventory_record -- ---------------------------- -- ---------------------------- -- Table structure for app_supplier -- ---------------------------- DROP TABLE IF EXISTS `app_supplier`; CREATE TABLE `app_supplier` ( `id` varchar(20) NOT NULL, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='供应商表-存储供应商的基本信息'; -- ---------------------------- -- Records of app_supplier -- ---------------------------- INSERT INTO `app_supplier` VALUES ('HEB-0001', '石药集团'); -- ---------------------------- -- Table structure for blog_content -- ---------------------------- DROP TABLE IF EXISTS `blog_content`; CREATE TABLE `blog_content` ( `cid` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(255) DEFAULT NULL COMMENT '标题', `slug` varchar(255) DEFAULT NULL, `created` bigint(20) DEFAULT NULL COMMENT '创建人id', `modified` bigint(20) DEFAULT NULL COMMENT '最近修改人id', `content` text COMMENT '内容', `type` varchar(16) DEFAULT NULL COMMENT '类型', `tags` varchar(200) DEFAULT NULL COMMENT '标签', `categories` varchar(200) DEFAULT NULL COMMENT '分类', `hits` int(5) DEFAULT NULL, `comments_num` int(5) DEFAULT '0' COMMENT '评论数量', `allow_comment` int(1) DEFAULT '0' COMMENT '开启评论', `allow_ping` int(1) DEFAULT '0' COMMENT '允许ping', `allow_feed` int(1) DEFAULT '0' COMMENT '允许反馈', `status` int(1) DEFAULT NULL COMMENT '状态', `author` varchar(100) DEFAULT NULL COMMENT '作者', `gtm_create` datetime DEFAULT NULL COMMENT '创建时间', `gtm_modified` datetime DEFAULT NULL COMMENT '修改时间', PRIMARY KEY (`cid`) ) ENGINE=InnoDB AUTO_INCREMENT=122 DEFAULT CHARSET=utf8 COMMENT='文章内容'; -- ---------------------------- -- Records of blog_content -- ---------------------------- INSERT INTO `blog_content` VALUES ('75', '基于 Springboot 和 Mybatis 的后台管理系统 BootDo', null, null, null, '

项目介绍

演示地址 http://47.93.239.129

功能简介

1. 用户管理
2. 角色管理
3. 部门管理
4. 菜单管理
5. 系统日志
6. 代码生成
7. 内容管理

所用框架

前端
1. Bootstrap
2. jQuery
3. bootstrap-table
4. layer
5. jsTree 
6. summernote
7. jquery-validate
8. jquery-treegrid

后端
1. SpringBoot 
2. MyBatis
3. Thymeleaf
4. Shiro
5. druid

项目截图

', 'article', null, null, null, null, '0', '0', '1', '1', 'bootdo', '2017-09-22 14:44:44', '2017-09-22 14:44:44'); INSERT INTO `blog_content` VALUES ('100', 'springboot thymeleaf和shiro 整合——按钮可见性', null, null, null, '

添加依赖

<dependency> \r\n   <groupId>com.github.theborakompanioni</groupId>\r\n    <artifactId>thymeleaf-extras-shiro</artifactId>\r\n    <version>1.2.1</version> \r\n</dependency>

 

在shiro的configuration中配置

@Bean\r\n    public ShiroDialect shiroDialect() {\r\n        return new ShiroDialect();\r\n    }

 

在html中加入xmlns

<html lang=\"zh_CN\" xmlns:th=\"http://www.thymeleaf.org\"\r\n      xmlns:shiro=\"http://www.pollix.at/thymeleaf/shiro\">

例子

<button shiro:hasPermission=\"sys:user:add\" type=\"button\" class=\"btn  btn-primary\" onclick=\"add()\">\r\n   <i class=\"fa fa-plus\" aria-hidden=\"true\"></i>添加\r\n</button>
', 'article', null, null, null, null, '1', null, '0', '1', 'bootdo', '2017-09-22 13:24:30', '2017-09-22 13:24:30'); INSERT INTO `blog_content` VALUES ('108', 'spring boot ehcache整合', null, null, null, '

pom.xml配置 引入依赖包

<dependency>\r\n    <groupId>org.springframework.boot</groupId>\r\n    <artifactId>spring-boot-starter-cache</artifactId>\r\n</dependency>\r\n<dependency>\r\n    <groupId>net.sf.ehcache</groupId>\r\n    <artifactId>ehcache</artifactId>\r\n</dependency>

编写配置类,设置缓存机制

@Configuration\r\n@EnableCaching\r\npublic class CacheConfiguration {\r\n\r\n    @Bean\r\n    public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean) {\r\n        return new EhCacheCacheManager(bean.getObject());\r\n    }\r\n\r\n    @Bean\r\n    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {\r\n        EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();\r\n        cacheManagerFactoryBean.setConfigLocation(new ClassPathResource(\"config/ehcache.xml\"));\r\n        cacheManagerFactoryBean.setShared(true);\r\n        return cacheManagerFactoryBean;\r\n    }\r\n}

ehcache.xml配置:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ehcache xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://ehcache.org/ehcache.xsd\"\r\n    updateCheck=\"false\">\r\n    <!-- diskStore:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。\r\n    参数解释如下: user.home – 用户主目录 \r\n    user.dir – 用户当前工作目录 \r\n    java.io.tmpdir – 默认临时文件路径 -->\r\n    <diskStore path=\"java.io.tmpdir/Tmp_EhCache\" />\r\n    <!-- defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。 -->\r\n    <!-- name:缓存名称。 \r\n        maxElementsInMemory:缓存最大数目\r\n        maxElementsOnDisk:硬盘最大缓存个数。 \r\n        eternal:对象是否永久有效,一但设置了,timeout将不起作用。 \r\n        overflowToDisk:是否保存到磁盘,当系统当机时 \r\n        timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使 用,可选属性,默认值是0,也就是可闲置时间无穷大。\r\n        timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅 当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。 \r\n        diskPersistent:是否缓存虚拟机重启期数据Whether the disk store persists between restarts \r\n        of the Virtual Machine. The default value is false. \r\n        diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该 有自己的一个缓冲区。 \r\n        diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。 \r\n        memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内 存。默认策略是LRU(最近最少使用)。\r\n        你可以设置为FIFO(先进先出)或是LFU(较少使用)。 \r\n        clearOnFlush:内存数量最大时是否清除。\r\n        memoryStoreEvictionPolicy:可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少 访问次数)。 \r\n         FIFO,first in first out,这个是大家最熟的,先进先出。\r\n         LFU, Less Frequently Used,就是上面例子中使用的策略,直白一点就是讲一直以来最少被使用的。如上面 所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。 \r\n         LRU,Least Recently Used,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地 方来缓存新的元素的时候,\r\n         那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。 -->\r\n    <defaultCache eternal=\"false\" maxElementsInMemory=\"1000\" overflowToDisk=\"false\" diskPersistent=\"false\"\r\n        timeToIdleSeconds=\"0\" timeToLiveSeconds=\"600\" memoryStoreEvictionPolicy=\"LRU\" />\r\n    <cache name=\"snailAuthCache\" eternal=\"false\" maxElementsInMemory=\"10000\" overflowToDisk=\"false\" diskPersistent=\"false\"\r\n        timeToIdleSeconds=\"0\" timeToLiveSeconds=\"0\" memoryStoreEvictionPolicy=\"LFU\" />\r\n</ehcache>


', 'article', null, null, null, null, '1', null, '0', '1', 'bootdo', '2017-09-22 17:48:29', '2017-09-22 17:48:29'); INSERT INTO `blog_content` VALUES ('109', 'spring-boot整合ehcache实现缓存机制', null, null, null, '


  EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

  ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题。

  spring-boot是一个快速的集成框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

  由于spring-boot无需任何样板化的配置文件,所以spring-boot集成一些其他框架时会有略微的不同。

  1.spring-boot是一个通过maven管理的jar包的框架,集成ehcache需要的依赖如下

\"复制代码\"
 <dependency>\r\n    <groupId>org.springframework</groupId>\r\n     <artifactId>spring-context-support</artifactId>\r\n</dependency>\r\n<dependency>\r\n         <groupId>net.sf.ehcache</groupId>\r\n      <artifactId>ehcache</artifactId>\r\n          <version>2.8.3</version>\r\n</dependency>        
\"复制代码\"

    具体pom.xml文件如下

\"复制代码\"
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n    xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\">\r\n    <modelVersion>4.0.0</modelVersion>\r\n\r\n    <groupId>com.lclc.boot</groupId>\r\n    <artifactId>boot-cache</artifactId>\r\n    <version>0.0.1-SNAPSHOT</version>\r\n    <!-- Inherit defaults from Spring Boot -->\r\n    <parent>\r\n        <groupId>org.springframework.boot</groupId>\r\n        <artifactId>spring-boot-starter-parent</artifactId>\r\n        <version>1.1.3.RELEASE</version>\r\n    </parent>\r\n    <dependencies>\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter-web</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter-data-jpa</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>org.springframework.boot</groupId>\r\n            <artifactId>spring-boot-starter-thymeleaf</artifactId>\r\n        </dependency>\r\n        \r\n        <dependency>\r\n            <groupId>mysql</groupId>\r\n            <artifactId>mysql-connector-java</artifactId>\r\n        </dependency>\r\n\r\n        <dependency>\r\n            <groupId>com.google.guava</groupId>\r\n            <artifactId>guava</artifactId>\r\n            <version>17.0</version>\r\n        </dependency>\r\n        \r\n        <dependency>\r\n            <groupId>org.springframework</groupId>\r\n            <artifactId>spring-context-support</artifactId>\r\n        </dependency>\r\n        <dependency>\r\n            <groupId>net.sf.ehcache</groupId>\r\n            <artifactId>ehcache</artifactId>\r\n            <version>2.8.3</version>\r\n        </dependency>\r\n    </dependencies>\r\n\r\n    <dependencyManagement>\r\n        <dependencies>\r\n        </dependencies>\r\n    </dependencyManagement>\r\n\r\n    <build>\r\n        <plugins>\r\n            <plugin>\r\n                <groupId>org.springframework.boot</groupId>\r\n                <artifactId>spring-boot-maven-plugin</artifactId>\r\n            </plugin>\r\n        </plugins>\r\n    </build>\r\n\r\n    <repositories>\r\n        <repository>\r\n            <id>spring-snapshots</id>\r\n            <url>http://repo.spring.io/snapshot</url>\r\n            <snapshots>\r\n                <enabled>true</enabled>\r\n            </snapshots>\r\n        </repository>\r\n        <repository>\r\n            <id>spring-milestones</id>\r\n            <url>http://repo.spring.io/milestone</url>\r\n        </repository>\r\n    </repositories>\r\n    <pluginRepositories>\r\n        <pluginRepository>\r\n            <id>spring-snapshots</id>\r\n            <url>http://repo.spring.io/snapshot</url>\r\n        </pluginRepository>\r\n        <pluginRepository>\r\n            <id>spring-milestones</id>\r\n            <url>http://repo.spring.io/milestone</url>\r\n        </pluginRepository>\r\n    </pluginRepositories>\r\n\r\n</project>
\"复制代码\"

   2.使用ehcache,我们需要一个ehcache.xml来定义一些cache的属性。

\"复制代码\"
<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<ehcache xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://ehcache.org/ehcache.xsd\"\r\n  updateCheck=\"false\">\r\n          <diskStore path=\"java.io.tmpdir/Tmp_EhCache\" />\r\n           <defaultCache eternal=\"false\" maxElementsInMemory=\"1000\" overflowToDisk=\"false\" diskPersistent=\"false\"\r\n    timeToIdleSeconds=\"0\" timeToLiveSeconds=\"600\" memoryStoreEvictionPolicy=\"LRU\" />\r\n\r\n            <cache name=\"demo\" eternal=\"false\" maxElementsInMemory=\"100\" overflowToDisk=\"false\" diskPersistent=\"false\"\r\n    timeToIdleSeconds=\"0\" timeToLiveSeconds=\"300\" memoryStoreEvictionPolicy=\"LRU\" />\r\n\r\n</ehcache>
\"复制代码\"

   解释下这个xml文件中的标签。

  (1).diskStore: 为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。参数解释如下:    
             user.home – 用户主目录
             user.dir  – 用户当前工作目录
             java.io.tmpdir – 默认临时文件路径

  (2).defaultCache:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。

       (3).cache:自定缓存策略,为自定义的缓存策略。参数解释如下:

    cache元素的属性:   
            name:缓存名称                  
            maxElementsInMemory:内存中最大缓存对象数                  
            maxElementsOnDisk:硬盘中最大缓存对象数,若是0表示无穷大                  
            eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false                
            overflowToDisk:true表示当内存缓存的对象数目达到了maxElementsInMemory界限后,会把溢出的对象写到硬盘缓存中。注意:如果缓存的对象要写入到硬盘中的话,则该对象必须实现了Serializable接口才行。                  
            diskSpoolBufferSizeMB:磁盘缓存区大小,默认为30MB。每个Cache都应该有自己的一个缓存区。               
            diskPersistent:是否缓存虚拟机重启期数据                  
            diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认为120秒     
            timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态                  
            timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存中后,如果处于缓存中的时间超过了 timeToLiveSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清除。只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地存在于缓存中。timeToLiveSeconds必须大于timeToIdleSeconds属性,才有意义     
            memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。可选策略有:LRU(最近最少使用,默认策略)、FIFO(先进先出)、LFU(最少访问次数)。  

 

  3.将ehcache的管理器暴露给spring的上下文容器,

  

\"复制代码\"
@Configuration\r\n// 标注启动了缓存\r\n@EnableCaching\r\npublic class CacheConfiguration {\r\n\r\n    /*\r\n     * ehcache 主要的管理器\r\n     */\r\n    @Bean(name = \"appEhCacheCacheManager\")\r\n    public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){\r\n        return new EhCacheCacheManager (bean.getObject ());\r\n    }\r\n\r\n    /*\r\n     * 据shared与否的设置,Spring分别通过CacheManager.create()或new CacheManager()方式来创建一个ehcache基地.\r\n     */\r\n    @Bean\r\n    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){\r\n        EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean ();\r\n        cacheManagerFactoryBean.setConfigLocation (new ClassPathResource (\"conf/ehcache-app.xml\"));\r\n        cacheManagerFactoryBean.setShared (true);\r\n        return cacheManagerFactoryBean;\r\n    }\r\n}
\"复制代码\"

 

       @Configuration:为spring-boot注解,主要标注此为配置类,优先扫描。

      @Bean:向spring容器中加入bean。

  至此所有的配置都做好了,通过spring-boot进行集成框架就是这么简单。

  4.使用ehcache

    使用ehcache主要通过spring的缓存机制,上面我们将spring的缓存机制使用了ehcache进行实现,所以使用方面就完全使用spring缓存机制就行了。
    具体牵扯到几个注解:

    @Cacheable:负责将方法的返回值加入到缓存中,参数3
    @CacheEvict:负责清除缓存,参数4

     参数解释:

    value:缓存位置名称,不能为空,如果使用EHCache,就是ehcache.xml中声明的cache的name
    key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL
    condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL

    allEntries:CacheEvict参数,true表示清除value中的全部缓存,默认为false

  不多说,直接上代码:

  

\"复制代码\"
@Service\r\npublic class CacheDemoServiceImpl implements CacheDemoService {\r\n\r\n    /**\r\n     * 缓存的key\r\n     */\r\n    public static final String THING_ALL_KEY   = \"\\\"thing_all\\\"\";\r\n    /**\r\n     * value属性表示使用哪个缓存策略,缓存策略在ehcache.xml\r\n     */\r\n    public static final String DEMO_CACHE_NAME = \"demo\";\r\n   \r\n    @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)\r\n    @Override\r\n    public void create(Thing thing){\r\n        Long id = getNextId ();\r\n        thing.setId (id);\r\n        data.put (id, thing);\r\n    } \r\n      \r\n     @Cacheable(value = DEMO_CACHE_NAME,key = \"#thing.getId()+\'thing\'\")\r\n    @Override\r\n    public Thing findById(Long id){\r\n        System.err.println (\"没有走缓存!\" + id);\r\n        return data.get (id);\r\n    }\r\n\r\n      @Cacheable(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)\r\n    @Override\r\n    public List<Thing> findAll(){\r\n        return Lists.newArrayList (data.values ());\r\n    }\r\n   \r\n   \r\n      @Override\r\n    @CachePut(value = DEMO_CACHE_NAME,key = \"#thing.getId()+\'thing\'\")\r\n    @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)\r\n    public Thing update(Thing thing){\r\n        System.out.println (thing);\r\n        data.put (thing.getId (), thing);\r\n        return thing;\r\n    }\r\n\r\n    @CacheEvict(value = DEMO_CACHE_NAME)\r\n    @Override\r\n    public void delete(Long id){\r\n        data.remove (id);\r\n    }\r\n   \r\n}
\"复制代码\"

 

    5.只需要通过注解在service层方法上打注解便可以使用缓存,在find**上存入缓存,在delete**,update**上清除缓存。

 

', 'article', null, null, null, null, '1', null, '0', '1', 'bootdo', '2017-09-24 11:15:18', '2017-09-24 11:15:18'); INSERT INTO `blog_content` VALUES ('110', 'spring boot 图片上传后的图片读取路径在win与linux环境配置的差别', null, null, null, '
  1. win

    [java] view plain copy
    1. @Component  
    2. class WebConfigurer extends WebMvcConfigurerAdapter {  
    3.     @Override  
    4.     public void addResourceHandlers(ResourceHandlerRegistry registry) {  
    5.         registry.addResourceHandler(\"/files/**\").addResourceLocations(\"file:///E:/var/spring/uploaded_files/\");  
    6.     }  
    7.   
    8. }  
    linux
    [java] view plain copy
    1. @Component  
    2. class WebConfigurer extends WebMvcConfigurerAdapter {  
    3.     @Override  
    4.     public void addResourceHandlers(ResourceHandlerRegistry registry) {  
    5.         registry.addResourceHandler(\"/files/**\").addResourceLocations(\"file:///var/spring/uploaded_files\");  
    6.     }  
    7.   
    8. }  
', 'article', null, null, null, null, '1', null, '1', '1', 'bootdo', '2017-09-24 09:15:35', '2017-09-24 09:15:35'); INSERT INTO `blog_content` VALUES ('111', 'Springmvc提交日期类型参数', null, null, null, '
  1. 背景介绍 
    在springmvc框架中,前台传入到后台的form会经过springmvc自动封装到pojo类中,后台接受的时候可以在参数内直接接受这个java类。

  2. 传参 
    通常情况下,前台的表单的类型诸如int,string等,都会根据pojo中字段的类型自动转换。所以为我们省去了不少麻烦,但很可惜其中不包括日期类型。

  3. 原因 
    因为日期的格式多种多样,spring自身不适合对其进行封装。好在spring给出了便捷的方法给我们自己转换数据类型。

  4. 具体实现

在controller层中,加入以下代码段

@InitBinder\r\npublic void initBinder(WebDataBinder binder) {\r\n    SimpleDateFormat dateFormat = new SimpleDateFormat(\"yyyy-MM-dd\");\r\n    dateFormat.setLenient(false);\r\n    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));//true:允许输入空值,false:不能为空值\r\n}

可以解决这个问题。但是这个时候Date类型的参数是null的话,还是会报错。采用另外一种方式则更好,为null也不会报错,就是把请求参数封装为一个vo类,在对应的类属性上加上注解,这样

@DateTimeFormat(iso = ISO.DATE_TIME, pattern = \"w:yyyy\")\r\nprivate Date startTime;\r\n或者\r\n@DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\r\nprivate Date lastLoginDate;

另外如果使用验证框架,方法参数这样写(@Valid XxxParam param, BindingResult binding) ,就能直接通过BindingResult得到验证结果了。

', 'article', null, null, null, null, '1', null, '1', '1', 'bootdo', '2017-09-25 21:34:51', '2017-09-25 21:34:51'); INSERT INTO `blog_content` VALUES ('112', ' SpringBoot 在启动时运行代码', null, null, null, '

在Spring boot项目的实际开发中,我们有时需要项目服务启动时加载一些数据或预先完成某些动作。为了解决这样的问题,Spring boot 为我们提供了一个方法:通过实现接口 CommandLineRunner 来实现这样的需求。

实现方式:只需要一个类即可,无需其他配置。 

实现步骤:

1.创建实现接口 CommandLineRunner 的类 MyStartupRunnerTest

[java] view plain copy
  1. package com.energy;  
  2.   
  3. import org.springframework.boot.CommandLineRunner;  
  4. import org.springframework.core.annotation.Order;  
  5. import org.springframework.stereotype.Component;  
  6.   
  7. /** 
  8.  * Created by CavanLiu on 2017/2/28 0028. 
  9.  */  
  10. @Component  
  11. @Order(value=1)
  12. public class MyStartupRunnerTest implements CommandLineRunner  
  13. {  
  14.     @Override  
  15.     public void run(String... args) throws Exception  
  16.     {  
  17.         System.out.println(\">>>>This is MyStartupRunnerTest Order=1. Only testing CommandLineRunner...<<<<\");  
  18.     }  
  19. }  

2.创建实现接口CommandLineRunner 的类 MyStartupRunnerTest2

[java] view plain copy
  1. package com.energy;  
  2.   
  3. import org.springframework.boot.CommandLineRunner;  
  4. import org.springframework.core.annotation.Order;  
  5. import org.springframework.stereotype.Component;  
  6.   
  7. /** 
  8.  * Created by CavanLiu on 2017/2/28 0028. 
  9.  */  
  10. @Component  
  11. @Order(value=2)
  12. public class MyStartupRunnerTest2 implements CommandLineRunner  
  13. {  
  14.     @Override  
  15.     public void run(String... args) throws Exception  
  16.     {  
  17.         System.out.println(\">>>>This is MyStartupRunnerTest Order=2. Only testing CommandLineRunner...<<<<\");  
  18.     }  
  19. }  

3.启动Spring boot后查看控制台输出信息,如下所示:

[plain] view plain copy
  1. >>>>This is MyStartupRunnerTest Order=1. Only testing CommandLineRunner...<<<<  
  2. >>>>This is MyStartupRunnerTest2 Order=2. Only testing CommandLineRunner...<<<<  

4.Application启动类代码略。

说明:CommandLineRunner接口的运行顺序是依据@Order注解的value由小到大执行,即value值越小优先级越高。

', 'article', null, null, null, null, '1', null, '1', '1', 'bootdo', '2017-09-26 15:18:15', '2017-09-26 15:18:15'); INSERT INTO `blog_content` VALUES ('115', 'communication', null, null, null, '

qq群 669039323

', null, null, 'communication', null, null, '1', null, '0', '1', 'bootdo', '2017-09-30 14:43:30', '2017-09-30 14:43:30'); INSERT INTO `blog_content` VALUES ('116', 'ablout', null, null, null, '

BootDo 面向学习型的开源框架

平台简介

BootDo是高效率,低封装,面向学习型,面向微服的开源Java EE开发框架。

BootDo是在SpringBoot基础上搭建的一个Java基础开发平台,MyBatis为数据访问层,ApacheShiro为权限授权层,Ehcahe对常用数据进行缓存。

BootDo主要定位于后台管理系统学习交流,已内置后台管理系统的基础功能和高效的代码生成工具, 包括:系统权限组件、数据权限组件、数据字典组件、核心工具组件、视图操作组件、工作流组件、代码生成等。 前端界面风格采用了结构简单、性能优良、页面美观大气的Twitter Bootstrap页面展示框架。 采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。 使用Maven做项目管理,提高项目的易开发性、扩展性。

BootDo目前包括以下四大模块,系统管理(SYS)模块、 内容管理(CMS)模块、在线办公(OA)模块、代码生成(GEN)模块。 系统管理模块 ,包括企业组织架构(用户管理、机构管理、区域管理)、 菜单管理、角色权限管理、字典管理等功能; 内容管理模块 ,包括内容管理(文章、链接),栏目管理、站点管理、 公共留言、文件管理、前端网站展示等功能; 在线办公模块 ,提供简单的请假流程实例;代码生成模块 ,完成重复的工作。

BootDo 提供了常用工具进行封装,包括日志工具、缓存工具、服务器端验证、数据字典、当前组织机构数据 (用户、机构、区域)以及其它常用小工具等。另外还提供一个强大的在线 代码生成 工具。

内置功能

  1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
  2. 机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。
  3. 区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。
  4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
  5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
  6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护,如:是否、男女、类别、级别等。
  7. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
  8. 连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
  9. 工作流引擎:实现业务工单流转、在线流程设计器。

技术选型

1、后端

2、前端

4、平台

安全考虑

  1. 开发语言:系统采用Java 语言开发,具有卓越的通用性、高效性、平台移植性和安全性。
  2. 分层设计:(数据库层,数据访问层,业务逻辑层,展示层)层次清楚,低耦合,各层必须通过接口才能接入并进行参数校验(如:在展示层不可直接操作数据库),保证数据操作的安全。
  3. 双重验证:用户表单提交双验证:包括服务器端验证及客户端验证,防止用户通过浏览器恶意修改(如不可写文本域、隐藏变量篡改、上传非法文件等),跳过客户端验证操作数据库。
  4. 安全编码:用户表单提交所有数据,在服务器端都进行安全编码,防止用户提交非法脚本及SQL注入获取敏感数据等,确保数据安全。
  5. 密码加密:登录用户密码进行SHA1散列加密,此加密方法是不可逆的。保证密文泄露后的安全问题。
  6. 强制访问:系统对所有管理端链接都进行用户身份权限验证,防止用户直接填写url进行访问。

演示地址

布嘟开源www.bootdo.com

交流反馈

QQ群 669039323

版权声明

本软件使用 Apache License 2.0 协议,请严格遵照协议内容

', null, null, 'about', null, null, '1', null, '0', '1', 'bootdo', '2017-09-30 14:43:09', '2017-09-30 14:43:09'); INSERT INTO `blog_content` VALUES ('117', '页面加载速度优化建议', null, null, null, '

1、合并Js文件和CSS

将JS代码和CSS样式分别合并到一个共享的文件,这样不仅能简化代码,而且在执行JS文件的时候,如果JS文件比较多,就需要进行多次“Get”请求,延长加载速度,将JS文件合并在一起后,自然就减少了Get请求次数,提高了加载速度。

2、Sprites图片技术

Spriting是一种网页图片应用处理方式,它是将一个页面涉及到的所有零星图片都包含到一张大图中去,然后利用CSS技术展现出来。这样一来,当访问该页面时,载入的图片就不会像以前那样一幅一幅地慢慢显示出来了,可以减少了整个网页的图片大小,并且利用CSSSprites能很好地减少网页的http请求,从而大大的提高页面的性能。CSSSprites在国内很多人叫css精灵,很早就有了,在很多大型网站都有用到,特别是一些所有页面都存在的图标用得比较多,很好的提升加载速度。

3、压缩文本和图片

压缩技术如gzip可以有效减少页面加载的时间。包括HTML,XML,JSON(JavaScript对象符号),JavaScript和CSS等,压缩率都可以在大小70%左右。文本压缩用得比较多,一般直接在空间开启就行,而图片的压缩就比较随意,很多都是直接上传,其实还有很大的压缩空间。

4、延迟显示可见区域外的内容

为了确保用户可以更快地看见可见区域的网页可以延迟加载或展现可见区域外的内容,为了避免页面变形,可以使用占位符标签制定正确的高度和宽度。比如WP的jQueryImage LazyLoad插件就可以在用户停留在第一屏的时候,不加载任何第一屏以下的图片信息,只有当用户把鼠标往下滚动的时候,这些图片才开始加载。这样很明显提升可见区域的加载速度,提高用户体验。

5、确保功能图片优先加载

网站主要考虑可用性的重要性,一个功能按钮要提前加载出来,用户进入下载页,一个只需要8s时间的下载花了5s在等待、寻找下载按钮图片,谁能忍受?

6、重新布置Call-to-Action按钮

其实这个和上面一条是差不多的,都是从用户体验速度着手,跳过了网页的整体加载速度。速度没变,只是让一些行为按钮提前,Call-to-Action按钮一般习惯设计在页面底部,这样的习惯对于用户来说并不总是好的,购买用户需要等到最下面加载出来才能点击下一步操作。可以调整CTA按钮的位置或使用滑动的图片按钮。很多大型购物网站的加入购物车就是这种类型。

7、图片格式优化

不恰当的图像格式是一种极为常见的减慢加载速度的罪魁祸首。正确的图片格式可以让图片缩小数倍,如果保存为最佳格式。可以节省大量带宽,减少处理时间时间,大大加快页面加载速度,这是一种很常见的做法。

8、使用 Progressive JPEGs

ProgressiveJPEGs图片是JPEG格式的一个特殊变种,名为“高级JPEG”。在创建高级JPEG文件时,数据是这样安排的:在装入图像时,开始只显示一个模糊的图像,随着数据的装入,图像逐步变得清晰。它相当于交织的GIF格式的图片。高级JPEG主要是考虑到使用调制解调器的慢速网络而设计的,快速网络的使用者通常不会体会到它和正常JPEG格式图片的区别。对于网速比较慢的用户,这无疑有很好的体验。

9、精简代码

这个可以说是最直接的一个方法,也是用得比较多的,对网页代码进行瘦身,删除不必要的沉冗代码,比如不必要的空格、换行符、注释等,包括JS代码中的无用代码也需要清除。其中对于注释代码的清除可能有些人存在误区,甚至有的在里面堆砌关键词。

10、延迟加载和执行非必要脚本

网页中有很多脚本是在页面完全加载完前都不需要执行的,可以延迟加载和执行非必要脚本。这些脚本可以在onload事件之后执行,避免对网页上重要内容的呈现造成影响。这些脚本可能是你自己网页的甲苯,往往更多的是一些第三方脚本,这样的有很多,比如评论、广告、智能推荐、百度云图、分享等等,这些完全可以等主体内容加载完后再执行。

11、使用AJAX

AJAX即“Asynchronous Javascript +XML“,是指一种创建交互式网页应用的网页开发技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用AJAX)如果需要更新内容,必须重载整个网页面。

', null, null, '', null, null, '1', null, '0', '1', 'bootdo', '2017-09-30 16:13:35', '2017-09-30 16:13:35'); INSERT INTO `blog_content` VALUES ('118', 'elementUI select组件使用详解', null, null, null, '

elementUI select组件使用详解

  • 动态生成option选项
  • option选项绑定对应的文本值和value值
  • 作为表单项目,新增、编辑功能
  • 对选项改变后触发相关事件
<div id=\"app\">\r\n    <el-form :model=\"form\"  ref=\"form\" label-width=\"100px\" class=\"demo-ruleForm\">\r\n        <el-form-item label=\"姓名选择\" prop=\"typeId\">\r\n            <el-select v-model=\"form.typeId\" placeholder=\"请选择\" @change=\"change\">\r\n                <el-option v-for=\"item in items\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n            </el-select>\r\n        </el-form-item>\r\n        <el-form-item>\r\n            <el-button type=\"primary\" @click=\"add()\">新增</el-button>\r\n            <el-button type=\"primary\" @click=\"edit()\">编辑</el-button>\r\n            <el-button @click=\"cancel()\">取消</el-button>\r\n        </el-form-item>\r\n    </el-form>\r\n</div>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
<script>\r\n    var vm = new Vue({\r\n        el:\"#app\",\r\n        mounted(){\r\n            this.getData();\r\n        },\r\n        data:{\r\n            form:{\r\n                typeId:\'\'\r\n            },\r\n            items:[],\r\n            datas:[{name:\"senbo\",id:\'1\'},{name:\"muse\",id:\'2\'},{name:\"bobo\",id:\'3\'}]\r\n        },\r\n        methods:{\r\n            getData:function(){\r\n                this.items = this.datas; \r\n\r\n            },\r\n            add:function(){\r\n                this.form.typeId = \"\";\r\n            },\r\n            cancel(){\r\n                 this.form.typeId = \"\";   \r\n            },\r\n            change:function(){\r\n                console.log(this.form.typeId)\r\n            },\r\n            edit:function(){\r\n                this.form.typeId =\"1\";\r\n            }\r\n        }\r\n    })\r\n</script>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
转自http://blog.csdn.net/museions/article/details/77824361
', 'article', null, '', null, null, '1', null, '0', '1', 'bootdo', '2017-10-12 10:41:07', '2017-10-12 10:41:07'); INSERT INTO `blog_content` VALUES ('119', 'Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)', null, null, null, '

Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)

Cvte提前批

一面(电话)

  1. 自我介绍
  2. 介绍你的项目
  3. 加密解密了解么?几种算法,讲一下你了解的
  4. 多线程了解么?什么是线程安全?
  5. 说一个你最熟悉的设计模式
  6. 讲一下你项目中用到了哪些设计模式
  7. Java的hashmap的原理
  8. Hashmap的线程安全性,什么是线程安全的?如何实现线程安全

二面(视频)

  1. 自我介绍
  2. 介绍项目
  3. Mysql的数据库引擎,区别特点
  4. 设计模式了解?讲一下最熟悉的
  5. 写一个单例模式,答主写的是双检查锁单例,问了为什么用Volatile,synchronize移到方法最外面会怎么样?
  6. 单例模式在你项目里哪些应用?
  7. 数据连接池
  8. 对高负载有了解么
  9. 你意向的技术方向是哪块?(答主回答的高并发,然后面试官说他是做高负载的)
  10. 对高并发有了解么?

阿里内推

一面(电话)

  1. 听说你有博客,博客里大概有什么内容?
  2. 项目介绍,最复杂的表
  3. Hashmap的原理
  4. Hashmap为什么大小是2的幂次
  5. 介绍一下红黑树
  6. Arraylist的原理
  7. 场景题:设计判断论文抄袭的系统
  8. 堆排序的原理
  9. 抽象工厂和工厂方法模式的区别
  10. 工厂模式的思想
  11. object类你知道的方法
  12. 哪里用到了工厂模式
  13. Forward和redirect的区别

二面(视频)

1, 自我介绍
2, 项目介绍
3, 项目架构
4, 项目难点
5, Synchronize关键字为什么jdk1.5后效率提高了
6, 线程池的使用时的注意事项
7, Spring中autowire和resourse关键字的区别
8, Hashmap的原理
9, Hashmap的大小为什么指定为2的幂次
10, 讲一下线程状态转移图
11, 消息队列了解么
12, 分布式了解么

便利蜂内推

一面(电话)

  1. 自我介绍
  2. 项目介绍
  3. volatile和synchronized
  4. 来个算法题:一个无序数组,其中一个数字出现的次数大于其他数字之和,求这个数字 (主元素)
  5. 答完再来一个:一个数组,有正有负,不改变顺序的情况下,求和最大的最长子序列
  6. 项目用到什么数据库?隔离级别?每个隔离级别各做了什么
  7. 数据库的索引?mysql不同引擎索引的区别
  8. 垃圾回收算法的过程
  9. 你了解的垃圾收集器? Cms收集器的过程
  10. 怎样进入老年代?
  11. 平时用到了什么设计模式?
  12. 讲一下你最熟的两个设计模式
  13. 用过什么系统?shell写过脚本吗?

小米内推

一面(电话)

  1. 自我介绍
  2. 看你最近博客写的是redis,介绍redis和mysql的区别
  3. Redis的应用场景
  4. Hashmap的原理
  5. Hashmap中jdk1.8之后做了哪些优化
  6. 垃圾回收的过程
  7. Jvm的参数设置
  8. 项目中的优化

金山wps内推

一面(电话)

  1. 自我介绍
  2. 项目介绍
  3. 对Java的面向对象的理解
  4. 对java多线程的理解
  5. 数据库的索引
  6. 数据库的隔离级别
  7. 设计模式的理解
  8. 讲几个设计模式
  9. 对算法有什么了解?答主先回答了动态规划,解释了一下dp的思想
  10. 快排的思想讲一下

二面(电话)

  1. 自我介绍
  2. 项目介绍
  3. Tcp怎么保证可靠传输(中间穿插了好多小问题)
  4. Tcp的拥塞控制
  5. 让你设计一个即时聊天的系统
  6. 支付宝转账,是如何实现,几个小时通知转账成功的(面试官想让回答长连接,答主一直没get到点)
  7. 解释一下长连接

多益网络

一面(视频)

  1. 自我介绍
  2. 对面向对象的理解
  3. 介绍多态
  4. Java新建线程有哪几种方式
  5. 线程池的作用
  6. 看过框架源码么

拼多多学霸批

一面(现场面)

  1. 自我介绍
  2. 项目介绍
  3. 手撕算法:一棵二叉排序树,给定一个数,找到与给定数差值最小的数
  4. 场景题:设计一个系统,解决抢购时所需要的大量的短链接的功能,如何保证高并发,如何设计短链接

二面(现场面)

  1. 代码量多少
  2. 给了一张纸,各种名词,会的写出来
  3. 然后给它解释那些会的
  4. 设计题:设计一个系统,记录qq用户前一天的登录状态,提供16g内存和2tb的硬盘,要做到查询指定qq号的前一天的登录状态,快速查询O(1)复杂度

搜狗校招

一面(现场):

  1. 自我介绍
  2. 项目介绍
  3. 手撕算法:两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,答主用的二分,时间复杂度为O(log (m+n))。结果面试官不满意,让用归并的思想做,时间复杂度其实更高了
  4. 介绍网络编程

涂鸦移动

一面(现场)

  1. 自我介绍
  2. 项目介绍
  3. 数据库的索引原理
  4. 索引使用的注意事项
  5. 数据库的引擎
  6. Java垃圾回收机制
  7. Java的finalize,finally,final三个关键字的区别和应用场景
  8. String类可以被继承么
    手撕算法:假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。
    给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。

二面(电话)

  1. 自我介绍
  2. 对游戏的了解
  3. 项目介绍
  4. 算法题:给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
  5. 红黑树
  6. Redis的应用

中国电信it研发中心

一面(现场)

  1. 自我介绍
  2. 项目介绍
  3. 项目里用的什么服务器
  4. 自己写一个tomcat服务器,你会怎么写
  5. 分布式服务器会出现哪些问题
  6. 怎么解决session一致性缓存的问题
  7. Redis的优势和特点
  8. 一千万用户并发抢购,怎么设计
  9. 如果成功的用户有10万,redis存不下怎么处理
  10. 你项目中的难点

二面(现场)

  1. 自我介绍
  2. 项目介绍
  3. 介绍spring中的熟悉的注解
  4. 让你实现autowire注解的功能你会如何实现
  5. Redis和mysql的区别
  6. Redis的持久化有哪些方式,具体原理

中兴

专业面(现场)

  1. 自我介绍
  2. 项目介绍
  3. 你了解的设计模式,讲两个
  4. Java collection类,集合,讲两个你了解的,说实现原理
  5. Java线程池的作用
  6. 你觉得你在你实验室处于什么水平

综合面试(现场)

说好的综合面试纯聊天呢?
1. 自我介绍
2. 项目介绍
3. 说一下你知道的设计模式
4. 画一个策略模式的uml图
5. Java多线程的理解
6. 内存屏障是什么
7. 数据库索引
8. 项目中的优化
9. 然后开始聊人生
10. 你的缺点,你最不喜欢什么样的人,你的家庭等等

华为

一面(现场)

  1. 自我介绍
  2. 项目介绍
  3. 项目架构
  4. 项目一个完整的执行流程(由于我是搞java的,而面试官是搞c的,所以全程尬聊)
  5. 项目优化

二面(现场)

  1. 自我介绍
  2. 项目介绍
  3. 怎么管理项目进度
  4. 平常的爱好
  5. 感觉面试官也不是搞java的,所以又是一阵尬聊

苏宁内推

一面(现场)

  1. 自我介绍
  2. 项目介绍
  3. 面过哪些公司了
  4. 有哪些offer了
  5. 聊到多益,于是开始聊最近微博上很火的多益老板
  6. 得出结论,我和面试官都觉得多益老板三观有问题,但做游戏就是要偏执的人
  7. 你博客主要哪方面的
  8. 多线程并发包了解么
  9. 讲一下countDownLatch

苏宁聊了20分钟八卦就面完了,一轮技术面

美团内推

一面(电话)

  1. 自我介绍
  2. 项目介绍
  3. Redis介绍
  4. 了解redis源码么
  5. 了解redis集群么
  6. Hashmap的原理
  7. hashmap容量为什么是2的幂次
  8. hashset的源码
  9. object类你知道的方法
  10. hashcode和equals
  11. 你重写过hashcode和equals么,要注意什么
  12. 假设现在一个学生类,有学号和姓名,我现在hashcode方法重写的时候,只将学号参与计算,会出现什么情况?
  13. 往set里面put一个学生对象,然后将这个学生对象的学号改了,再put进去,可以放进set么?并讲出为什么
  14. Redis的持久化?有哪些方式,原理是什么?
  15. 讲一下稳定的排序算法和不稳定的排序算法
  16. 讲一下快速排序的思想

二面(现场)

  1. 自我介绍
  2. 讲一下数据的acid
  3. 什么是一致性
  4. 什么是隔离性
  5. Mysql的隔离级别
  6. 每个隔离级别是如何解决
  7. Mysql要加上nextkey锁,语句该怎么写
  8. Java的内存模型,垃圾回收
  9. 线程池的参数
  10. 每个参数解释一遍
  11. 然后面试官设置了每个参数,给了是个线程,让描述出完整的线程池执行的流程
  12. Nio和IO有什么区别
  13. Nio和aio的区别
  14. Spring的aop怎么实现
  15. Spring的aop有哪些实现方式
  16. 动态代理的实现方式和区别
  17. Linux了解么
  18. 怎么查看系统负载
  19. Cpu load的参数如果为4,描述一下现在系统处于什么情况
  20. Linux,查找磁盘上最大的文件的命令
  21. Linux,如何查看系统日志文件
  22. 手撕算法:leeetcode原题 22,Generate Parentheses,给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果。

三面(现场)

三面没怎么问技术,问了很多技术管理方面的问题

  1. 自我介绍
  2. 项目介绍
  3. 怎么管理项目成员
  4. 当意见不一致时,如何沟通并说服开发成员,并举个例子
  5. 怎么保证项目的进度
  6. 数据库的索引原理
  7. 非聚簇索引和聚簇索引
  8. 索引的使用注意事项
  9. 联合索引
  10. 从底层解释最左匹配原则
  11. Mysql对联合索引有优化么?会自动调整顺序么?哪个版本开始优化?
  12. Redis的应用
  13. Redis的持久化的方式和原理
  14. 技术选型,一个新技术和一个稳定的旧技术,你会怎么选择,选择的考虑有哪些
  15. 说你印象最深的美团点评技术团队的三篇博客
  16. 最近在学什么新技术
  17. 你是怎么去接触一门新技术的
  18. 会看哪些书
  19. 怎么选择要看的书

百度

一面(现场)

  1. 自我介绍
  2. Java中的多态
  3. Object类下的方法
  4. Finalize的作用和使用场景
  5. Hashcode和equals
  6. 为什么要同时重写hashcode和equals
  7. 不同时重写会出现哪些问题
  8. Hashmap的原理
  9. Hashmap如何变线程安全,每种方式的优缺点
  10. 垃圾回收机制
  11. Jvm的参数你知道的说一下
  12. 设计模式了解的说一下啊
  13. 手撕一个单例模式
  14. 快速排序的思想讲一下
  15. 给个数组,模拟快排的过程
  16. 手写快排
  17. 设计题,一个图书馆管理系统,数据库怎么设计,需求自己定

二面(现场)

  1. 自我介绍
  2. 项目介绍
  3. Redis的特点
  4. 分布式事务了解么
  5. 反爬虫的机制,有哪些方式
  6. 手撕算法:反转单链表
  7. 手撕算法:实现类似微博子结构的数据结构,输入一系列父子关系,输出一个类似微博评论的父子结构图
  8. 手写java多线程
  9. 手写java的soeket编程,服务端和客户端
  10. 进程间的通信方式
  11. 手撕算法: 爬楼梯,写出状态转移方程
  12. 智力题:时针分针什么时候重合

三面(现场)

由于三面面试官不懂java,我不熟c加加,所以全程尬聊

  1. 自我介绍
  2. 项目介绍
  3. 手撕算法:给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。
  4. 然后继续在这个问题上扩展
  5. 求出最短那条的路径
  6. 递归求出所有的路径
  7. 设计模式讲一下熟悉的
  8. 会不会滥用设计模式
  9. 多线程条件变量为什么要在while体里
  10. 你遇到什么挫折

腾讯

一面(现场)

  1. 自我介绍
  2. 项目介绍
  3. Hibernate的作用,你的理解
  4. 多线程的理解,如何保证线程安全
  5. mysql数据库的引擎和区别
  6. 场景题:千万用户抢购,如何处理高并发,并且有一个链接,指向前一天抢购成功的用户,如何设计这个系统和数据库
  7. 如果后台处理抢购请求的服务器,每次最多承受200的负载,系统该怎么设计
  8. 手撕算法:最小公倍数和最大公约数

二面

  1. 自我介绍
  2. 项目介绍
  3. 项目里一个完整请求的流程
  4. 项目的优化
  5. Hibernate和mybatis的区别
  6. 为什么用ssh框架
  7. Mysql的容灾备份
  8. Redis和memcache 的区别
  9. 为什么选择redis
  10. Java的full gc
  11. Full gc会导致什么问题

招商银行信用卡

一面

  1. 自我介绍
  2. 分布式事务
  3. 设计模式
  4. 访问者模式
  5. 装饰者模式
  6. 有哪些offer
  7. 为什么还来我们这

招银网络科技

一面

  1. 自我介绍
  2. 写一个两个有序链表合并成一个有序链表
  3. 死锁是什么呢
  4. 怎么解决死锁
  5. http请求流程
  6. 为什么负载均衡
  7. 怎么实现负载均衡
  8. 数据库挂了怎么办?除了热备份还有什么方法
  9. 讲讲你对spring的理解,不要把ioc和aop背给我听

二面

  1. 自我介绍
  2. 项目介绍
  3. 算法:找出两个数组相等的数,不能用其他数据结构
  4. 算法:给定一个数字,一个数组,找出数组中相加等于这两个数的和,不能用数据结构
  5. 算法:如何判断一个树是不是另一颗树的子树
  6. 如何解决并发访问的错误

网易

一面(现场)

  1. 自我介绍
  2. 项目介绍
  3. I++操作怎么保证线程安全
  4. 场景题:设计一个下单系统,下单成功后可以给用户发优惠券
  5. 接上面场景题:服务器挂了,优惠券还没发怎么办
  6. 数据库挂了怎么怎么办
  7. 怎么保证一致性
  8. 分布式事务知道么
  9. 介绍分布式事务
  10. 你的职业规划

二面

  1. 自我介绍
  2. 项目介绍
  3. Nio的原理
  4. Channel和buffer
  5. directBuffer和buffer的区别
  6. nio和aio的区别
  7. 锁的实现原理
  8. 怎么解决缓存和主存的一致性问题
  9. 缓存还没更新到主存,服务器挂了怎么办
  10. 数据库挂了怎么办

Vivo

一面

  1. 自我介绍
  2. 项目介绍
  3. Hibernate的batch有数量限制么
  4. Jquery用过么
  5. Extjs的优缺点
  6. 有没有扩展过extjs
  7. 读写锁
  8. 什么时候用读锁
  9. 什么时候用写锁
  10. Cas的原理,使用场景
  11. 数据库的瓶颈


转自http://www.jianshu.com//p/72712546648b
', 'article', null, '', null, null, '1', null, '0', '1', 'Bootdo', '2017-10-13 13:45:20', '2017-10-13 13:45:20'); INSERT INTO `blog_content` VALUES ('121', 'Spring Cloud下微服务权限方案', null, null, null, '


写文章
\"Spring

Spring Cloud下微服务权限方案

\"老A\"老A

背景

从传统的单体应用转型Spring Cloud的朋友都在问我,Spring Cloud下的微服务权限怎么管?怎么设计比较合理?从大层面讲叫服务权限,往小处拆分,分别为三块:用户认证、用户权限、服务校验。

用户认证

传统的单体应用可能习惯了session的存在,而到了Spring cloud的微服务化后,session虽然可以采取分布式会话来解决,但终究不是上上策。开始有人推行Spring Cloud Security结合很好的OAuth2,后面为了优化OAuth 2中Access Token的存储问题,提高后端服务的可用性和扩展性,有了更好Token验证方式JWT(JSON Web Token)。这里要强调一点的是,OAuth2和JWT这两个根本没有可比性,是两个完全不同的东西。 OAuth2是一种授权框架,而JWT是一种认证协议

OAuth2认证框架

OAuth2中包含四个角色:

OAuth2包含4种授权模式

其中,OAuth2的运行流程如下图,摘自RFC 6749:

+--------+                               +---------------+\r\n|        |--(A)- Authorization Request ->|   Resource    |\r\n|        |                               |     Owner     |\r\n|        |<-(B)-- Authorization Grant ---|               |\r\n|        |                               +---------------+\r\n|        |\r\n|        |                               +---------------+\r\n|        |--(C)-- Authorization Grant -->| Authorization |\r\n| Client |                               |     Server    |\r\n|        |<-(D)----- Access Token -------|               |\r\n|        |                               +---------------+\r\n|        |\r\n|        |                               +---------------+\r\n|        |--(E)----- Access Token ------>|    Resource   |\r\n|        |                               |     Server    |\r\n|        |<-(F)--- Protected Resource ---|               |\r\n+--------+                               +---------------+\r\n

我们在Spring Cloud OAuth2中,所有访问微服务资源的请求都在Http Header中携带Token,被访问的服务接下来再去请求授权服务器验证Token的有效性,目前这种方式,我们需要两次或者更多次的请求,所有的Token有效性校验都落在的授权服务器上,对于我们系统的水平扩展成为一个非常大的瓶颈。

JWT认证协议

授权服务器将用户信息和授权范围序列化后放入一个JSON字符串,然后使用Base64进行编码,最终在授权服务器用私钥对这个字符串进行签名,得到一个JSON Web Token。

假设其他所有的资源服务器都将持有一个RSA公钥,当资源服务器接收到这个在Http Header中存有Token的请求,资源服务器就可以拿到这个Token,并验证它是否使用正确的私钥签名(是否经过授权服务器签名,也就是验签)。验签通过,反序列化后就拿到Toekn中包含的有效验证信息。

其中,主体运作流程图如下:

+-----------+                                     +-------------+\r\n|           |       1-Request Authorization       |             |\r\n|           |------------------------------------>|             |\r\n|           |     grant_type&username&password    |             |--+\r\n|           |                                     |Authorization|  | 2-Gen\r\n|           |                                     |Service      |  |   JWT\r\n|           |       3-Response Authorization      |             |<-+\r\n|           |<------------------------------------| Private Key |\r\n|           |    access_token / refresh_token     |             |\r\n|           |    token_type / expire_in           |             |\r\n|  Client   |                                     +-------------+\r\n|           |                                 \r\n|           |                                     +-------------+\r\n|           |       4-Request Resource            |             |\r\n|           |-----------------------------------> |             |\r\n|           | Authorization: bearer Access Token  |             |--+\r\n|           |                                     | Resource    |  | 5-Verify\r\n|           |                                     | Service     |  |  Token\r\n|           |       6-Response Resource           |             |<-+\r\n|           |<----------------------------------- | Public Key  |\r\n+-----------+                                     +-------------+\r\n

通过上述的方式,我们可以很好地完成服务化后的用户认证。

用户权限

传统的单体应用的权限拦截,大家都喜欢shiro,而且用的颇为顺手。可是一旦拆分后,这权限开始分散在各个API了,shiro还好使吗?笔者在项目中,并没有用shiro。前后端分离后,交互都是token,后端的服务无状态化,前端按钮资源化,权限放哪儿管好使?

抽象与设计

在介绍灵活的核心设计前,先给大家普及一个入门的概念:RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。

RBAC其实是一种分析模型,主要分为:基本模型RBAC0(Core RBAC)、角色分层模型RBAC1(Hierarchal RBAC)、角色限制模型RBAC2(Constraint RBAC)和统一模型RBAC3(Combines RBAC)。

更多详情大家可以了解:RBAC权限模型

核心UML


这是笔者通过多种业务场景后抽象的RBAC关系图

类说明

群或组,拥有一定数量权限的集合,亦可以是权限的载体。

子类:User(用户)、Role(角色)、Position(岗位)、Unit(部门),通过用户的特定构成,形成不同业务场景的群或组,而通过对群或组的父类授权,完成了用户的权限获取。

权限,拥有一定数量资源的集成,亦可以是资源的载体。

权限下有资源,资源的来源有:Menu(菜单)、Button(动作权限)、页面元素(按钮、tab等)、数据权限等

程序,相关权限控制的呈现载体,可以在多个菜单中挂载。



模型与微服务的关系

如果把Spring Cloud服务化后的所有api接口都定义为上文的Resources,那么我们可以看到这么一个情况。

比如一个用户的增删改查,我们的页面会这么做


页面元素资源编码资源URI资源请求方式查询user_btn_get/api/user/{id}GET增加user_btn_add/api/userPOST编辑user_btn_edit/api/user/{id}PUT删除user_btn_del/api/user/{id}DELETE

在抽象成上述的映射关系后,我们的前后端的资源有了参照,我们对于用户组的权限授权就容易了。比如我授予一个用户增加、删除权限。在前端我们只需要检验该资源编码的有无就可以控制按钮的显示和隐藏,而在后端我们只需要统一拦截判断该用户是否具有URI和对应请求方式即可。

至于权限的统一拦截是放置在Zuul这个网关上,还是落在具体的后端服务的拦截器上(Filter、Inteceptor),都可以轻而易举地实现。不在局限于代码的侵入性。放置Zuul流程图如下:


要是权限的统一拦截放置在Zuul上,会有一个问题,那就是后端服务安不安全,服务只需要通过注册中心,即可对其他服务进行调用。这里就涉及到后面的第三个模块,服务之间的鉴权。

服务之间的鉴权

因为我们都知道服务之间开源通过注册中心寻到客户端后,直接远程过程调用的。对于生产上的各个服务,一个个敏感性的接口,我们更是需要加以保护。主题的流程如下图:


笔者的实现方式是基于Spring Cloud的FeignClient Inteceprot(自动申请服务token、传递当前上下文)和Mvc Inteceptor(服务token校验、更新当前上下文)来实现,从而对服务的安全性做进一步保护。

结合Spring Cloud的特性后,整体流程图如下:


优化点

虽然通过上述的用户合法性检验、用户权限拦截以及服务之间的鉴权,保证了Api接口的安全性,但是其间的Http访问频率是比较高的,请求数量上来的时候,慢的问题是就会特别明显。可以考虑一定的优化策略,比如用户权限缓存、服务授权信息的派发与混存、定时刷新服务鉴权Token等。

结语

上述是笔者在项目里的大体思路,有兴趣的朋友可以借鉴我的开源项目,欢迎star:

', 'article', null, '', null, null, '1', null, '0', '1', 'bootdo', '2017-10-25 12:28:19', '2017-10-25 12:28:19'); -- ---------------------------- -- Table structure for oa_notify -- ---------------------------- DROP TABLE IF EXISTS `oa_notify`; CREATE TABLE `oa_notify` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', `type` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '类型', `title` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '标题', `content` varchar(2000) COLLATE utf8_bin DEFAULT NULL COMMENT '内容', `files` varchar(2000) COLLATE utf8_bin DEFAULT NULL COMMENT '附件', `status` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '状态', `create_by` bigint(20) DEFAULT NULL COMMENT '创建者', `create_date` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '更新者', `update_date` datetime DEFAULT NULL COMMENT '更新时间', `remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注信息', `del_flag` char(1) COLLATE utf8_bin DEFAULT '0' COMMENT '删除标记', PRIMARY KEY (`id`), KEY `oa_notify_del_flag` (`del_flag`) ) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='通知通告'; -- ---------------------------- -- Records of oa_notify -- ---------------------------- INSERT INTO `oa_notify` VALUES ('41', '3', '十九大召开了', '十九大召开了,竟然没邀请我', '', '1', '1', null, null, '2017-10-10 17:21:11', '', null); INSERT INTO `oa_notify` VALUES ('42', '3', '苹果发布新手机了', '有全面屏的iphoneX', '', '1', '1', null, null, '2017-10-10 18:51:14', '', null); INSERT INTO `oa_notify` VALUES ('43', '3', '十九大要消灭贫困人口', '我还只有两三年的活头了', '', '1', '1', null, null, '2017-10-11 09:56:35', '', null); INSERT INTO `oa_notify` VALUES ('44', '3', '骑士又输了', '捉急', '', '1', '1', null, null, '2017-10-26 13:59:34', '', null); INSERT INTO `oa_notify` VALUES ('45', '3', '火箭5连败', '没有保罗不行呀', '', '1', '1', null, null, '2017-12-30 12:10:20', '', null); -- ---------------------------- -- Table structure for oa_notify_record -- ---------------------------- DROP TABLE IF EXISTS `oa_notify_record`; CREATE TABLE `oa_notify_record` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号', `notify_id` bigint(20) DEFAULT NULL COMMENT '通知通告ID', `user_id` bigint(20) DEFAULT NULL COMMENT '接受人', `is_read` tinyint(1) DEFAULT '0' COMMENT '阅读标记', `read_date` date DEFAULT NULL COMMENT '阅读时间', PRIMARY KEY (`id`), KEY `oa_notify_record_notify_id` (`notify_id`), KEY `oa_notify_record_user_id` (`user_id`), KEY `oa_notify_record_read_flag` (`is_read`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='通知通告发送记录'; -- ---------------------------- -- Records of oa_notify_record -- ---------------------------- INSERT INTO `oa_notify_record` VALUES ('18', '41', '1', '1', '2017-10-26'); INSERT INTO `oa_notify_record` VALUES ('19', '42', '1', '1', '2017-10-26'); INSERT INTO `oa_notify_record` VALUES ('20', '43', '136', '0', null); INSERT INTO `oa_notify_record` VALUES ('21', '43', '133', '0', null); INSERT INTO `oa_notify_record` VALUES ('22', '43', '130', '0', null); INSERT INTO `oa_notify_record` VALUES ('23', '43', '1', '1', '2017-10-26'); INSERT INTO `oa_notify_record` VALUES ('24', '44', '1', '1', '2017-12-29'); INSERT INTO `oa_notify_record` VALUES ('25', '45', '1', '1', '2018-01-07'); INSERT INTO `oa_notify_record` VALUES ('26', '45', '135', '0', null); -- ---------------------------- -- Table structure for salary -- ---------------------------- DROP TABLE IF EXISTS `salary`; CREATE TABLE `salary` ( `id` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '编号', `PROC_INS_ID` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '流程实例ID', `USER_ID` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '变动用户', `OFFICE_ID` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '归属部门', `POST` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '岗位', `AGE` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '性别', `EDU` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '学历', `CONTENT` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '调整原因', `OLDA` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '现行标准 薪酬档级', `OLDB` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '现行标准 月工资额', `OLDC` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '现行标准 年薪总额', `NEWA` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '调整后标准 薪酬档级', `NEWB` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '调整后标准 月工资额', `NEWC` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '调整后标准 年薪总额', `ADD_NUM` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '月增资', `EXE_DATE` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '执行时间', `HR_TEXT` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '人力资源部门意见', `LEAD_TEXT` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '分管领导意见', `MAIN_LEAD_TEXT` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '集团主要领导意见', `create_by` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '创建者', `create_date` datetime NOT NULL COMMENT '创建时间', `update_by` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '更新者', `update_date` datetime NOT NULL COMMENT '更新时间', `remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注信息', `del_flag` char(1) COLLATE utf8_bin NOT NULL DEFAULT '0' COMMENT '删除标记', PRIMARY KEY (`id`), KEY `OA_TEST_AUDIT_del_flag` (`del_flag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='审批流程测试表'; -- ---------------------------- -- Records of salary -- ---------------------------- INSERT INTO `salary` VALUES ('825693cd6c1c4f6b86699fc3f1a54887', '', '136', '', '', '', '', '技能提高', '', '', '', '', '100', '', '', '', '同意', '同意', '总经理审批', '1', '2017-12-15 22:01:41', '1', '2017-12-15 22:01:41', null, '1'); INSERT INTO `salary` VALUES ('a80e1d9ef35a4502bd65b0e5ba7eafff', '', 'cccc', 'ccc', 'ccccc', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '2017-11-30 16:35:15', '', '2017-11-30 16:35:15', '', ''); INSERT INTO `salary` VALUES ('b5d228f729f74833883917825749f0d5', '', '', '', '', '', '', '', '', '', '', '', '', '防守打法', '', '', '', '', '', '', '2017-11-30 19:58:36', '', '2017-11-30 19:58:36', '', ''); INSERT INTO `salary` VALUES ('cc2e8083f9d8478f831b2ea852e5c17b', '', '', 'cc', 'cc', '', '', 'xxx', '', '', '', '', '', '', '', '', '', '', '', '', '2017-11-30 19:18:59', '', '2017-11-30 19:18:59', '', ''); INSERT INTO `salary` VALUES ('cebdb316794b48be87d93dd4dbfb7d4b', '', '', '', '发的顺丰', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '2017-11-30 19:58:43', '', '2017-11-30 19:58:43', '', ''); -- ---------------------------- -- Table structure for sys_dept -- ---------------------------- DROP TABLE IF EXISTS `sys_dept`; CREATE TABLE `sys_dept` ( `dept_id` bigint(20) NOT NULL AUTO_INCREMENT, `parent_id` bigint(20) DEFAULT NULL COMMENT '上级部门ID,一级部门为0', `name` varchar(50) DEFAULT NULL COMMENT '部门名称', `order_num` int(11) DEFAULT NULL COMMENT '排序', `del_flag` tinyint(4) DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', PRIMARY KEY (`dept_id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='部门管理'; -- ---------------------------- -- Records of sys_dept -- ---------------------------- INSERT INTO `sys_dept` VALUES ('6', '0', '总部', '1', '1'); INSERT INTO `sys_dept` VALUES ('9', '0', '销售部', '2', '1'); INSERT INTO `sys_dept` VALUES ('11', '0', '仓储', '3', '1'); -- ---------------------------- -- Table structure for sys_dict -- ---------------------------- DROP TABLE IF EXISTS `sys_dict`; CREATE TABLE `sys_dict` ( `id` bigint(64) NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '标签名', `value` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '数据值', `type` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '类型', `description` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '描述', `sort` decimal(10,0) DEFAULT NULL COMMENT '排序(升序)', `parent_id` bigint(64) DEFAULT '0' COMMENT '父级编号', `create_by` int(64) DEFAULT NULL COMMENT '创建者', `create_date` datetime DEFAULT NULL COMMENT '创建时间', `update_by` bigint(64) DEFAULT NULL COMMENT '更新者', `update_date` datetime DEFAULT NULL COMMENT '更新时间', `remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注信息', `del_flag` char(1) COLLATE utf8_bin DEFAULT '0' COMMENT '删除标记', PRIMARY KEY (`id`), KEY `sys_dict_value` (`value`), KEY `sys_dict_label` (`name`), KEY `sys_dict_del_flag` (`del_flag`) ) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='字典表'; -- ---------------------------- -- Records of sys_dict -- ---------------------------- INSERT INTO `sys_dict` VALUES ('1', '正常', '0', 'del_flag', '删除标记', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('3', '显示', '1', 'show_hide', '显示/隐藏', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('4', '隐藏', '0', 'show_hide', '显示/隐藏', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('5', '是', '1', 'yes_no', '是/否', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('6', '否', '0', 'yes_no', '是/否', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('7', '红色', 'red', 'color', '颜色值', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('8', '绿色', 'green', 'color', '颜色值', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('9', '蓝色', 'blue', 'color', '颜色值', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('10', '黄色', 'yellow', 'color', '颜色值', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('11', '橙色', 'orange', 'color', '颜色值', '50', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('12', '默认主题', 'default', 'theme', '主题方案', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('13', '天蓝主题', 'cerulean', 'theme', '主题方案', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('14', '橙色主题', 'readable', 'theme', '主题方案', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('15', '红色主题', 'united', 'theme', '主题方案', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('16', 'Flat主题', 'flat', 'theme', '主题方案', '60', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('17', '国家', '1', 'sys_area_type', '区域类型', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('18', '省份、直辖市', '2', 'sys_area_type', '区域类型', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('19', '地市', '3', 'sys_area_type', '区域类型', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('20', '区县', '4', 'sys_area_type', '区域类型', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('21', '公司', '1', 'sys_office_type', '机构类型', '60', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('22', '部门', '2', 'sys_office_type', '机构类型', '70', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('23', '小组', '3', 'sys_office_type', '机构类型', '80', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('24', '其它', '4', 'sys_office_type', '机构类型', '90', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('25', '综合部', '1', 'sys_office_common', '快捷通用部门', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('26', '开发部', '2', 'sys_office_common', '快捷通用部门', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('27', '人力部', '3', 'sys_office_common', '快捷通用部门', '50', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('28', '一级', '1', 'sys_office_grade', '机构等级', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('29', '二级', '2', 'sys_office_grade', '机构等级', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('30', '三级', '3', 'sys_office_grade', '机构等级', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('31', '四级', '4', 'sys_office_grade', '机构等级', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('32', '所有数据', '1', 'sys_data_scope', '数据范围', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('33', '所在公司及以下数据', '2', 'sys_data_scope', '数据范围', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('34', '所在公司数据', '3', 'sys_data_scope', '数据范围', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('35', '所在部门及以下数据', '4', 'sys_data_scope', '数据范围', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('36', '所在部门数据', '5', 'sys_data_scope', '数据范围', '50', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('37', '仅本人数据', '8', 'sys_data_scope', '数据范围', '90', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('38', '按明细设置', '9', 'sys_data_scope', '数据范围', '100', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('39', '系统管理', '1', 'sys_user_type', '用户类型', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('40', '部门经理', '2', 'sys_user_type', '用户类型', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('41', '普通用户', '3', 'sys_user_type', '用户类型', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('42', '基础主题', 'basic', 'cms_theme', '站点主题', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('43', '蓝色主题', 'blue', 'cms_theme', '站点主题', '20', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('44', '红色主题', 'red', 'cms_theme', '站点主题', '30', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('45', '文章模型', 'article', 'cms_module', '栏目模型', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('46', '图片模型', 'picture', 'cms_module', '栏目模型', '20', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('47', '下载模型', 'download', 'cms_module', '栏目模型', '30', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('48', '链接模型', 'link', 'cms_module', '栏目模型', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('49', '专题模型', 'special', 'cms_module', '栏目模型', '50', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('50', '默认展现方式', '0', 'cms_show_modes', '展现方式', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('51', '首栏目内容列表', '1', 'cms_show_modes', '展现方式', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('52', '栏目第一条内容', '2', 'cms_show_modes', '展现方式', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('53', '发布', '0', 'cms_del_flag', '内容状态', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('54', '删除', '1', 'cms_del_flag', '内容状态', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('55', '审核', '2', 'cms_del_flag', '内容状态', '15', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('56', '首页焦点图', '1', 'cms_posid', '推荐位', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('57', '栏目页文章推荐', '2', 'cms_posid', '推荐位', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('58', '咨询', '1', 'cms_guestbook', '留言板分类', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('59', '建议', '2', 'cms_guestbook', '留言板分类', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('60', '投诉', '3', 'cms_guestbook', '留言板分类', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('61', '其它', '4', 'cms_guestbook', '留言板分类', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('62', '公休', '1', 'oa_leave_type', '请假类型', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('63', '病假', '2', 'oa_leave_type', '请假类型', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('64', '事假', '3', 'oa_leave_type', '请假类型', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('65', '调休', '4', 'oa_leave_type', '请假类型', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('66', '婚假', '5', 'oa_leave_type', '请假类型', '60', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('67', '接入日志', '1', 'sys_log_type', '日志类型', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('68', '异常日志', '2', 'sys_log_type', '日志类型', '40', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('69', '请假流程', 'leave', 'act_type', '流程类型', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('70', '审批测试流程', 'test_audit', 'act_type', '流程类型', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('71', '分类1', '1', 'act_category', '流程分类', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('72', '分类2', '2', 'act_category', '流程分类', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('73', '增删改查', 'crud', 'gen_category', '代码生成分类', '10', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('74', '增删改查(包含从表)', 'crud_many', 'gen_category', '代码生成分类', '20', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('75', '树结构', 'tree', 'gen_category', '代码生成分类', '30', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('76', '=', '=', 'gen_query_type', '查询方式', '10', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('77', '!=', '!=', 'gen_query_type', '查询方式', '20', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('78', '>', '>', 'gen_query_type', '查询方式', '30', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('79', '<', '<', 'gen_query_type', '查询方式', '40', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('80', 'Between', 'between', 'gen_query_type', '查询方式', '50', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('81', 'Like', 'like', 'gen_query_type', '查询方式', '60', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('82', 'Left Like', 'left_like', 'gen_query_type', '查询方式', '70', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('83', 'Right Like', 'right_like', 'gen_query_type', '查询方式', '80', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('84', '文本框', 'input', 'gen_show_type', '字段生成方案', '10', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('85', '文本域', 'textarea', 'gen_show_type', '字段生成方案', '20', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('86', '下拉框', 'select', 'gen_show_type', '字段生成方案', '30', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('87', '复选框', 'checkbox', 'gen_show_type', '字段生成方案', '40', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('88', '单选框', 'radiobox', 'gen_show_type', '字段生成方案', '50', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('89', '日期选择', 'dateselect', 'gen_show_type', '字段生成方案', '60', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('90', '人员选择', 'userselect', 'gen_show_type', '字段生成方案', '70', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('91', '部门选择', 'officeselect', 'gen_show_type', '字段生成方案', '80', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('92', '区域选择', 'areaselect', 'gen_show_type', '字段生成方案', '90', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('93', 'String', 'String', 'gen_java_type', 'Java类型', '10', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('94', 'Long', 'Long', 'gen_java_type', 'Java类型', '20', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('95', '仅持久层', 'dao', 'gen_category', '代码生成分类', '40', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('96', '男', '1', 'sex', '性别', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('97', '女', '2', 'sex', '性别', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('98', 'Integer', 'Integer', 'gen_java_type', 'Java类型', '30', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('99', 'Double', 'Double', 'gen_java_type', 'Java类型', '40', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('100', 'Date', 'java.util.Date', 'gen_java_type', 'Java类型', '50', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('104', 'Custom', 'Custom', 'gen_java_type', 'Java类型', '90', '0', '1', null, '1', null, null, '1'); INSERT INTO `sys_dict` VALUES ('105', '会议通告', '1', 'oa_notify_type', '通知通告类型', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('106', '奖惩通告', '2', 'oa_notify_type', '通知通告类型', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('107', '活动通告', '3', 'oa_notify_type', '通知通告类型', '30', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('108', '草稿', '0', 'oa_notify_status', '通知通告状态', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('109', '发布', '1', 'oa_notify_status', '通知通告状态', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('110', '未读', '0', 'oa_notify_read', '通知通告状态', '10', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('111', '已读', '1', 'oa_notify_read', '通知通告状态', '20', '0', '1', null, '1', null, null, '0'); INSERT INTO `sys_dict` VALUES ('112', '草稿', '0', 'oa_notify_status', '通知通告状态', '10', '0', '1', null, '1', null, '', '0'); INSERT INTO `sys_dict` VALUES ('113', '删除', '0', 'del_flag', '删除标记', null, null, null, null, null, null, '', ''); INSERT INTO `sys_dict` VALUES ('118', '关于', 'about', 'blog_type', '博客类型', null, null, null, null, null, null, '全url是:/blog/open/page/about', ''); INSERT INTO `sys_dict` VALUES ('119', '交流', 'communication', 'blog_type', '博客类型', null, null, null, null, null, null, '', ''); INSERT INTO `sys_dict` VALUES ('120', '文章', 'article', 'blog_type', '博客类型', null, null, null, null, null, null, '', ''); INSERT INTO `sys_dict` VALUES ('121', '编码', 'code', 'hobby', '爱好', null, null, null, null, null, null, '', ''); INSERT INTO `sys_dict` VALUES ('122', '绘画', 'painting', 'hobby', '爱好', null, null, null, null, null, null, '', ''); -- ---------------------------- -- Table structure for sys_file -- ---------------------------- DROP TABLE IF EXISTS `sys_file`; CREATE TABLE `sys_file` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `type` int(11) DEFAULT NULL COMMENT '文件类型', `url` varchar(200) DEFAULT NULL COMMENT 'URL地址', `create_date` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文件上传'; -- ---------------------------- -- Records of sys_file -- ---------------------------- -- ---------------------------- -- Table structure for sys_log -- ---------------------------- DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) DEFAULT NULL COMMENT '用户id', `username` varchar(50) DEFAULT NULL COMMENT '用户名', `operation` varchar(50) DEFAULT NULL COMMENT '用户操作', `time` int(11) DEFAULT NULL COMMENT '响应时间', `method` varchar(200) DEFAULT NULL COMMENT '请求方法', `params` varchar(5000) DEFAULT NULL COMMENT '请求参数', `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址', `gmt_create` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=757 DEFAULT CHARSET=utf8 COMMENT='系统日志'; -- ---------------------------- -- Records of sys_log -- ---------------------------- INSERT INTO `sys_log` VALUES ('609', '1', 'admin', '登录', '22', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:30:31'); INSERT INTO `sys_log` VALUES ('610', '1', 'admin', '请求访问主页', '64', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:30:31'); INSERT INTO `sys_log` VALUES ('611', '1', 'admin', 'error', null, 'http://localhost:8086/index', 'org.springframework.web.HttpRequestMethodNotSupportedException: Request method \'POST\' not supported', null, '2018-04-04 17:32:56'); INSERT INTO `sys_log` VALUES ('612', '1', 'admin', '请求访问主页', '16', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:32:57'); INSERT INTO `sys_log` VALUES ('613', '1', 'admin', '请求访问主页', '15', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:34:15'); INSERT INTO `sys_log` VALUES ('614', '1', 'admin', '请求访问主页', '16', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:34:18'); INSERT INTO `sys_log` VALUES ('615', '1', 'admin', '请求访问主页', '13', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:34:20'); INSERT INTO `sys_log` VALUES ('616', '1', 'admin', '请求访问主页', '17', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:34:21'); INSERT INTO `sys_log` VALUES ('617', '1', 'admin', '登录', '16', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:37:09'); INSERT INTO `sys_log` VALUES ('618', '1', 'admin', '请求访问主页', '86', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:37:10'); INSERT INTO `sys_log` VALUES ('619', '1', 'admin', '登录', '15', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:42:08'); INSERT INTO `sys_log` VALUES ('620', '1', 'admin', '请求访问主页', '140', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:42:08'); INSERT INTO `sys_log` VALUES ('621', '1', 'admin', '登录', '7', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:42:30'); INSERT INTO `sys_log` VALUES ('622', '1', 'admin', '请求访问主页', '20', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:42:30'); INSERT INTO `sys_log` VALUES ('623', '1', 'admin', '编辑角色', '6', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 17:44:33'); INSERT INTO `sys_log` VALUES ('624', '1', 'admin', '编辑角色', '2', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 17:44:59'); INSERT INTO `sys_log` VALUES ('625', '1', 'admin', '编辑角色', '2', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 17:45:05'); INSERT INTO `sys_log` VALUES ('626', '1', 'admin', '编辑角色', '2', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 17:45:12'); INSERT INTO `sys_log` VALUES ('627', '1', 'admin', '编辑角色', '2', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 17:45:14'); INSERT INTO `sys_log` VALUES ('628', '1', 'admin', '添加用户', '3', 'me.zbl.system.controller.UserController.add()', null, '127.0.0.1', '2018-04-04 17:46:11'); INSERT INTO `sys_log` VALUES ('629', '1', 'admin', '添加用户', '2', 'me.zbl.system.controller.UserController.add()', null, '127.0.0.1', '2018-04-04 17:46:37'); INSERT INTO `sys_log` VALUES ('630', '1', 'admin', '删除用户', '93', 'me.zbl.system.controller.UserController.remove()', null, '127.0.0.1', '2018-04-04 17:46:41'); INSERT INTO `sys_log` VALUES ('631', '1', 'admin', '批量删除用户', '84', 'me.zbl.system.controller.UserController.batchRemove()', null, '127.0.0.1', '2018-04-04 17:46:51'); INSERT INTO `sys_log` VALUES ('632', '1', 'admin', '添加用户', '6', 'me.zbl.system.controller.UserController.add()', null, '127.0.0.1', '2018-04-04 17:46:54'); INSERT INTO `sys_log` VALUES ('633', '1', 'admin', '编辑用户', '51', 'me.zbl.system.controller.UserController.edit()', null, '127.0.0.1', '2018-04-04 17:48:48'); INSERT INTO `sys_log` VALUES ('634', '1', 'admin', '更新用户', '54', 'me.zbl.system.controller.UserController.update()', null, '127.0.0.1', '2018-04-04 17:48:58'); INSERT INTO `sys_log` VALUES ('635', '1', 'admin', '编辑用户', '14', 'me.zbl.system.controller.UserController.edit()', null, '127.0.0.1', '2018-04-04 17:49:26'); INSERT INTO `sys_log` VALUES ('636', '1', 'admin', '更新用户', '145', 'me.zbl.system.controller.UserController.update()', null, '127.0.0.1', '2018-04-04 17:49:28'); INSERT INTO `sys_log` VALUES ('637', '1', 'admin', '添加角色', '0', 'me.zbl.system.controller.RoleController.add()', null, '127.0.0.1', '2018-04-04 17:50:07'); INSERT INTO `sys_log` VALUES ('638', '1', 'admin', '保存角色', '113', 'me.zbl.system.controller.RoleController.save()', null, '127.0.0.1', '2018-04-04 17:50:30'); INSERT INTO `sys_log` VALUES ('639', '1', 'admin', '编辑角色', '3', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 17:50:37'); INSERT INTO `sys_log` VALUES ('640', '1', 'admin', '更新角色', '107', 'me.zbl.system.controller.RoleController.update()', null, '127.0.0.1', '2018-04-04 17:51:02'); INSERT INTO `sys_log` VALUES ('641', '1', 'admin', '编辑角色', '2', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 17:51:16'); INSERT INTO `sys_log` VALUES ('642', '1', 'admin', '添加用户', '2', 'me.zbl.system.controller.UserController.add()', null, '127.0.0.1', '2018-04-04 17:51:24'); INSERT INTO `sys_log` VALUES ('643', '1', 'admin', '保存用户', '82', 'me.zbl.system.controller.UserController.save()', null, '127.0.0.1', '2018-04-04 17:52:33'); INSERT INTO `sys_log` VALUES ('644', '-1', '获取用户信息为空', '登录', '2', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:52:45'); INSERT INTO `sys_log` VALUES ('645', '138', 'administrator', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:52:49'); INSERT INTO `sys_log` VALUES ('646', '138', 'administrator', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:52:49'); INSERT INTO `sys_log` VALUES ('647', '1', 'admin', '登录', '2', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:53:00'); INSERT INTO `sys_log` VALUES ('648', '1', 'admin', '请求访问主页', '82', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:53:00'); INSERT INTO `sys_log` VALUES ('649', '1', 'admin', '添加用户', '5', 'me.zbl.system.controller.UserController.add()', null, '127.0.0.1', '2018-04-04 17:53:15'); INSERT INTO `sys_log` VALUES ('650', '1', 'admin', '编辑用户', '14', 'me.zbl.system.controller.UserController.edit()', null, '127.0.0.1', '2018-04-04 17:53:39'); INSERT INTO `sys_log` VALUES ('651', '1', 'admin', '删除用户', '87', 'me.zbl.system.controller.UserController.remove()', null, '127.0.0.1', '2018-04-04 17:53:56'); INSERT INTO `sys_log` VALUES ('652', '1', 'admin', '添加用户', '2', 'me.zbl.system.controller.UserController.add()', null, '127.0.0.1', '2018-04-04 17:53:58'); INSERT INTO `sys_log` VALUES ('653', '1', 'admin', '保存用户', '84', 'me.zbl.system.controller.UserController.save()', null, '127.0.0.1', '2018-04-04 17:54:18'); INSERT INTO `sys_log` VALUES ('654', '-1', '获取用户信息为空', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:54:23'); INSERT INTO `sys_log` VALUES ('655', '139', 'admin2', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 17:54:27'); INSERT INTO `sys_log` VALUES ('656', '139', 'admin2', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 17:54:27'); INSERT INTO `sys_log` VALUES ('657', '139', 'admin2', '添加用户', '3', 'me.zbl.system.controller.UserController.add()', null, '127.0.0.1', '2018-04-04 17:55:33'); INSERT INTO `sys_log` VALUES ('658', '139', 'admin2', '保存用户', '115', 'me.zbl.system.controller.UserController.save()', null, '127.0.0.1', '2018-04-04 17:56:22'); INSERT INTO `sys_log` VALUES ('659', '139', 'admin2', '编辑角色', '4', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 17:56:47'); INSERT INTO `sys_log` VALUES ('660', '1', 'admin', '登录', '5', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:03:11'); INSERT INTO `sys_log` VALUES ('661', '1', 'admin', '请求访问主页', '47', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:03:11'); INSERT INTO `sys_log` VALUES ('662', '1', 'admin', '请求访问主页', '7', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:03:53'); INSERT INTO `sys_log` VALUES ('663', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:04:09'); INSERT INTO `sys_log` VALUES ('664', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:04:29'); INSERT INTO `sys_log` VALUES ('665', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:05:10'); INSERT INTO `sys_log` VALUES ('666', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:05:24'); INSERT INTO `sys_log` VALUES ('667', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:05:38'); INSERT INTO `sys_log` VALUES ('668', '1', 'admin', '请求访问主页', '11', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:06:13'); INSERT INTO `sys_log` VALUES ('669', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:06:15'); INSERT INTO `sys_log` VALUES ('670', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:06:25'); INSERT INTO `sys_log` VALUES ('671', '1', 'admin', '请求访问主页', '47', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:06:48'); INSERT INTO `sys_log` VALUES ('672', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:07:14'); INSERT INTO `sys_log` VALUES ('673', '1', 'admin', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:07:17'); INSERT INTO `sys_log` VALUES ('674', '1', 'admin', '请求访问主页', '15', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:07:17'); INSERT INTO `sys_log` VALUES ('675', '1', 'admin', '登录', '4', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:07:40'); INSERT INTO `sys_log` VALUES ('676', '1', 'admin', '请求访问主页', '5', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:07:40'); INSERT INTO `sys_log` VALUES ('677', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:11:08'); INSERT INTO `sys_log` VALUES ('678', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:12:49'); INSERT INTO `sys_log` VALUES ('679', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:14:51'); INSERT INTO `sys_log` VALUES ('680', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:20:11'); INSERT INTO `sys_log` VALUES ('681', '1', 'admin', '登录', '2', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:20:19'); INSERT INTO `sys_log` VALUES ('682', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:20:19'); INSERT INTO `sys_log` VALUES ('683', '1', 'admin', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:20:23'); INSERT INTO `sys_log` VALUES ('684', '1', 'admin', '请求访问主页', '5', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:20:23'); INSERT INTO `sys_log` VALUES ('685', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:20:43'); INSERT INTO `sys_log` VALUES ('686', '1', 'admin', '登录', '2', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:20:47'); INSERT INTO `sys_log` VALUES ('687', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:20:47'); INSERT INTO `sys_log` VALUES ('688', '1', 'admin', '登录', '4', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:28:31'); INSERT INTO `sys_log` VALUES ('689', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:28:31'); INSERT INTO `sys_log` VALUES ('690', '-1', '获取用户信息为空', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:34:40'); INSERT INTO `sys_log` VALUES ('691', '-1', '获取用户信息为空', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:34:42'); INSERT INTO `sys_log` VALUES ('692', '-1', '获取用户信息为空', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:35:00'); INSERT INTO `sys_log` VALUES ('693', '1', 'admin', '登录', '2', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 18:35:04'); INSERT INTO `sys_log` VALUES ('694', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:35:04'); INSERT INTO `sys_log` VALUES ('695', '1', 'admin', '请求访问主页', '7', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:35:36'); INSERT INTO `sys_log` VALUES ('696', '1', 'admin', '更新用户', '67', 'me.zbl.system.controller.UserController.updatePeronal()', null, '127.0.0.1', '2018-04-04 18:37:43'); INSERT INTO `sys_log` VALUES ('697', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:39:00'); INSERT INTO `sys_log` VALUES ('698', '1', 'admin', '请求访问主页', '5', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:39:14'); INSERT INTO `sys_log` VALUES ('699', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:39:33'); INSERT INTO `sys_log` VALUES ('700', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:40:53'); INSERT INTO `sys_log` VALUES ('701', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:41:17'); INSERT INTO `sys_log` VALUES ('702', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:41:57'); INSERT INTO `sys_log` VALUES ('703', '1', 'admin', '请求访问主页', '11', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:42:13'); INSERT INTO `sys_log` VALUES ('704', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:42:18'); INSERT INTO `sys_log` VALUES ('705', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:43:12'); INSERT INTO `sys_log` VALUES ('706', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:43:37'); INSERT INTO `sys_log` VALUES ('707', '1', 'admin', '请求访问主页', '8', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:43:57'); INSERT INTO `sys_log` VALUES ('708', '1', 'admin', '请求访问主页', '10', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:44:11'); INSERT INTO `sys_log` VALUES ('709', '1', 'admin', '请求访问主页', '7', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:44:14'); INSERT INTO `sys_log` VALUES ('710', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:49:54'); INSERT INTO `sys_log` VALUES ('711', '1', 'admin', '请求访问主页', '5', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:50:34'); INSERT INTO `sys_log` VALUES ('712', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:50:48'); INSERT INTO `sys_log` VALUES ('713', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:52:00'); INSERT INTO `sys_log` VALUES ('714', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:53:23'); INSERT INTO `sys_log` VALUES ('715', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:53:39'); INSERT INTO `sys_log` VALUES ('716', '1', 'admin', '请求访问主页', '5', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 18:57:02'); INSERT INTO `sys_log` VALUES ('717', '1', 'admin', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 20:06:31'); INSERT INTO `sys_log` VALUES ('718', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 20:06:31'); INSERT INTO `sys_log` VALUES ('719', '1', 'admin', 'error', null, 'http://localhost:8086/common/sysFile/remove', 'java.lang.NullPointerException', null, '2018-04-04 20:06:51'); INSERT INTO `sys_log` VALUES ('720', '1', 'admin', 'error', null, 'http://localhost:8086/common/sysFile/info/%7Bid%7D', 'org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type \'java.lang.String\' to required type \'java.lang.Long\'; nested exception is java.lang.NumberFormatException: For input string: \"{id}\"', null, '2018-04-04 20:12:27'); INSERT INTO `sys_log` VALUES ('721', '1', 'admin', '登录', '3', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 20:12:45'); INSERT INTO `sys_log` VALUES ('722', '1', 'admin', '请求访问主页', '5', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 20:12:45'); INSERT INTO `sys_log` VALUES ('723', '1', 'admin', '登录', '2', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 20:12:53'); INSERT INTO `sys_log` VALUES ('724', '1', 'admin', '请求访问主页', '4', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 20:12:53'); INSERT INTO `sys_log` VALUES ('725', '1', 'admin', '登录', '2', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 20:25:32'); INSERT INTO `sys_log` VALUES ('726', '1', 'admin', '请求访问主页', '5', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 20:25:32'); INSERT INTO `sys_log` VALUES ('727', '1', 'admin', '请求访问主页', '4', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 20:25:36'); INSERT INTO `sys_log` VALUES ('728', '1', 'admin', '请求访问主页', '5', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 20:25:38'); INSERT INTO `sys_log` VALUES ('729', '1', 'admin', '添加用户', '2', 'me.zbl.system.controller.UserController.add()', null, '127.0.0.1', '2018-04-04 20:31:06'); INSERT INTO `sys_log` VALUES ('730', '1', 'admin', '请求更改用户密码', '1', 'me.zbl.system.controller.UserController.resetPwd()', null, '127.0.0.1', '2018-04-04 20:31:27'); INSERT INTO `sys_log` VALUES ('731', '1', 'admin', '请求更改用户密码', '0', 'me.zbl.system.controller.UserController.resetPwd()', null, '127.0.0.1', '2018-04-04 20:31:33'); INSERT INTO `sys_log` VALUES ('732', '1', 'admin', '编辑用户', '11', 'me.zbl.system.controller.UserController.edit()', null, '127.0.0.1', '2018-04-04 20:32:48'); INSERT INTO `sys_log` VALUES ('733', '1', 'admin', '编辑用户', '4', 'me.zbl.system.controller.UserController.edit()', null, '127.0.0.1', '2018-04-04 20:32:57'); INSERT INTO `sys_log` VALUES ('734', '1', 'admin', '编辑角色', '16', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 20:37:59'); INSERT INTO `sys_log` VALUES ('735', '1', 'admin', '编辑角色', '1', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 20:38:06'); INSERT INTO `sys_log` VALUES ('736', '1', 'admin', '编辑角色', '4', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 20:38:21'); INSERT INTO `sys_log` VALUES ('737', '1', 'admin', '编辑角色', '2', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 20:38:29'); INSERT INTO `sys_log` VALUES ('738', '1', 'admin', '请求访问主页', '6', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 20:39:02'); INSERT INTO `sys_log` VALUES ('739', '1', 'admin', '编辑角色', '1', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 20:39:31'); INSERT INTO `sys_log` VALUES ('740', '1', 'admin', '请求访问主页', '4', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 20:41:23'); INSERT INTO `sys_log` VALUES ('741', '1', 'admin', '编辑角色', '1', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 20:41:42'); INSERT INTO `sys_log` VALUES ('742', '1', 'admin', '编辑角色', '2', 'me.zbl.system.controller.RoleController.edit()', null, '127.0.0.1', '2018-04-04 20:41:48'); INSERT INTO `sys_log` VALUES ('743', '1', 'admin', '登录', '19', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 21:56:21'); INSERT INTO `sys_log` VALUES ('744', '1', 'admin', '请求访问主页', '50', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 21:56:22'); INSERT INTO `sys_log` VALUES ('745', '-1', '获取用户信息为空', '登录', '6', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 21:56:33'); INSERT INTO `sys_log` VALUES ('746', '140', 'cangchu', '登录', '6', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 21:56:36'); INSERT INTO `sys_log` VALUES ('747', '140', 'cangchu', '请求访问主页', '178', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 21:56:37'); INSERT INTO `sys_log` VALUES ('748', '1', 'admin', '登录', '6', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 21:56:48'); INSERT INTO `sys_log` VALUES ('749', '1', 'admin', '请求访问主页', '14', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 21:56:48'); INSERT INTO `sys_log` VALUES ('750', '139', 'admin2', '登录', '6', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 21:57:07'); INSERT INTO `sys_log` VALUES ('751', '139', 'admin2', '请求访问主页', '11', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 21:57:07'); INSERT INTO `sys_log` VALUES ('752', '1', 'admin', '登录', '7', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 21:57:13'); INSERT INTO `sys_log` VALUES ('753', '1', 'admin', '请求访问主页', '9', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 21:57:13'); INSERT INTO `sys_log` VALUES ('754', '1', 'admin', '登录', '17', 'me.zbl.system.controller.LoginController.ajaxLogin()', null, '127.0.0.1', '2018-04-04 23:01:55'); INSERT INTO `sys_log` VALUES ('755', '1', 'admin', '请求访问主页', '47', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 23:01:55'); INSERT INTO `sys_log` VALUES ('756', '1', 'admin', '请求访问主页', '11', 'me.zbl.system.controller.LoginController.index()', null, '127.0.0.1', '2018-04-04 23:02:08'); -- ---------------------------- -- Table structure for sys_menu -- ---------------------------- DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( `menu_id` bigint(20) NOT NULL AUTO_INCREMENT, `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID,一级菜单为0', `name` varchar(50) DEFAULT NULL COMMENT '菜单名称', `url` varchar(200) DEFAULT NULL COMMENT '菜单URL', `perms` varchar(500) DEFAULT NULL COMMENT '授权(多个用逗号分隔,如:user:list,user:create)', `type` int(11) DEFAULT NULL COMMENT '类型 0:目录 1:菜单 2:按钮', `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标', `order_num` int(11) DEFAULT NULL COMMENT '排序', `gmt_create` datetime DEFAULT NULL COMMENT '创建时间', `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', PRIMARY KEY (`menu_id`) ) ENGINE=InnoDB AUTO_INCREMENT=105 DEFAULT CHARSET=utf8 COMMENT='菜单管理'; -- ---------------------------- -- Records of sys_menu -- ---------------------------- INSERT INTO `sys_menu` VALUES ('1', '0', '基础管理', '', '', '0', 'fa fa-bars', '0', '2017-08-09 22:49:47', null); INSERT INTO `sys_menu` VALUES ('2', '3', '系统菜单', 'sys/menu/', 'sys:menu:menu', '1', 'fa fa-th-list', '2', '2017-08-09 22:55:15', null); INSERT INTO `sys_menu` VALUES ('3', '0', '系统管理', null, null, '0', 'fa fa-desktop', '1', '2017-08-09 23:06:55', '2017-08-14 14:13:43'); INSERT INTO `sys_menu` VALUES ('6', '3', '用户管理', 'sys/user/', 'sys:user:user', '1', 'fa fa-user', '0', '2017-08-10 14:12:11', null); INSERT INTO `sys_menu` VALUES ('7', '3', '角色管理', 'sys/role', 'sys:role:role', '1', 'fa fa-paw', '1', '2017-08-10 14:13:19', null); INSERT INTO `sys_menu` VALUES ('12', '6', '新增', '', 'sys:user:add', '2', '', '0', '2017-08-14 10:51:35', null); INSERT INTO `sys_menu` VALUES ('13', '6', '编辑', '', 'sys:user:edit', '2', '', '0', '2017-08-14 10:52:06', null); INSERT INTO `sys_menu` VALUES ('14', '6', '删除', null, 'sys:user:remove', '2', null, '0', '2017-08-14 10:52:24', null); INSERT INTO `sys_menu` VALUES ('15', '7', '新增', '', 'sys:role:add', '2', '', '0', '2017-08-14 10:56:37', null); INSERT INTO `sys_menu` VALUES ('20', '2', '新增', '', 'sys:menu:add', '2', '', '0', '2017-08-14 10:59:32', null); INSERT INTO `sys_menu` VALUES ('21', '2', '编辑', '', 'sys:menu:edit', '2', '', '0', '2017-08-14 10:59:56', null); INSERT INTO `sys_menu` VALUES ('22', '2', '删除', '', 'sys:menu:remove', '2', '', '0', '2017-08-14 11:00:26', null); INSERT INTO `sys_menu` VALUES ('24', '6', '批量删除', '', 'sys:user:batchRemove', '2', '', '0', '2017-08-14 17:27:18', null); INSERT INTO `sys_menu` VALUES ('25', '6', '停用', null, 'sys:user:disable', '2', null, '0', '2017-08-14 17:27:43', null); INSERT INTO `sys_menu` VALUES ('26', '6', '重置密码', '', 'sys:user:resetPwd', '2', '', '0', '2017-08-14 17:28:34', null); INSERT INTO `sys_menu` VALUES ('27', '91', '系统日志', 'common/log', 'common:log', '1', 'fa fa-warning', '0', '2017-08-14 22:11:53', null); INSERT INTO `sys_menu` VALUES ('28', '27', '刷新', null, 'sys:log:list', '2', null, '0', '2017-08-14 22:30:22', null); INSERT INTO `sys_menu` VALUES ('29', '27', '删除', null, 'sys:log:remove', '2', null, '0', '2017-08-14 22:30:43', null); INSERT INTO `sys_menu` VALUES ('30', '27', '清空', null, 'sys:log:clear', '2', null, '0', '2017-08-14 22:31:02', null); INSERT INTO `sys_menu` VALUES ('48', '77', '代码生成', 'common/generator', 'common:generator', '1', 'fa fa-code', '3', null, null); INSERT INTO `sys_menu` VALUES ('49', '0', '博客管理', '', '', '0', 'fa fa-rss', '6', null, null); INSERT INTO `sys_menu` VALUES ('50', '49', '文章列表', 'blog/bContent', 'blog:bContent:bContent', '1', 'fa fa-file-image-o', '1', null, null); INSERT INTO `sys_menu` VALUES ('51', '50', '新增', '', 'blog:bContent:add', '2', '', null, null, null); INSERT INTO `sys_menu` VALUES ('55', '7', '编辑', '', 'sys:role:edit', '2', '', null, null, null); INSERT INTO `sys_menu` VALUES ('56', '7', '删除', '', 'sys:role:remove', '2', null, null, null, null); INSERT INTO `sys_menu` VALUES ('57', '91', '运行监控', '/druid/index.html', '', '1', 'fa fa-caret-square-o-right', '1', null, null); INSERT INTO `sys_menu` VALUES ('58', '50', '编辑', '', 'blog:bContent:edit', '2', null, null, null, null); INSERT INTO `sys_menu` VALUES ('59', '50', '删除', '', 'blog:bContent:remove', '2', null, null, null, null); INSERT INTO `sys_menu` VALUES ('60', '50', '批量删除', '', 'blog:bContent:batchRemove', '2', null, null, null, null); INSERT INTO `sys_menu` VALUES ('61', '2', '批量删除', '', 'sys:menu:batchRemove', '2', null, null, null, null); INSERT INTO `sys_menu` VALUES ('62', '7', '批量删除', '', 'sys:role:batchRemove', '2', null, null, null, null); INSERT INTO `sys_menu` VALUES ('68', '49', '发布文章', '/blog/bContent/add', 'blog:bContent:add', '1', 'fa fa-edit', '0', null, null); INSERT INTO `sys_menu` VALUES ('71', '1', '文件管理', '/common/sysFile', 'common:sysFile:sysFile', '1', 'fa fa-folder-open', '2', null, null); INSERT INTO `sys_menu` VALUES ('72', '77', '计划任务', 'common/job', 'common:taskScheduleJob', '1', 'fa fa-hourglass-1', '4', null, null); INSERT INTO `sys_menu` VALUES ('73', '3', '部门管理', '/system/sysDept', 'system:sysDept:sysDept', '1', 'fa fa-users', '3', null, null); INSERT INTO `sys_menu` VALUES ('74', '73', '增加', '/system/sysDept/add', 'system:sysDept:add', '2', null, '1', null, null); INSERT INTO `sys_menu` VALUES ('75', '73', '刪除', 'system/sysDept/remove', 'system:sysDept:remove', '2', null, '2', null, null); INSERT INTO `sys_menu` VALUES ('76', '73', '编辑', '/system/sysDept/edit', 'system:sysDept:edit', '2', null, '3', null, null); INSERT INTO `sys_menu` VALUES ('77', '0', '系统工具', '', '', '0', 'fa fa-gear', '4', null, null); INSERT INTO `sys_menu` VALUES ('78', '1', '数据字典', '/common/dict', 'common:dict:dict', '1', 'fa fa-book', '1', null, null); INSERT INTO `sys_menu` VALUES ('79', '78', '增加', '/common/dict/add', 'common:dict:add', '2', null, '2', null, null); INSERT INTO `sys_menu` VALUES ('80', '78', '编辑', '/common/dict/edit', 'common:dict:edit', '2', null, '2', null, null); INSERT INTO `sys_menu` VALUES ('81', '78', '删除', '/common/dict/remove', 'common:dict:remove', '2', '', '3', null, null); INSERT INTO `sys_menu` VALUES ('83', '78', '批量删除', '/common/dict/batchRemove', 'common:dict:batchRemove', '2', '', '4', null, null); INSERT INTO `sys_menu` VALUES ('84', '0', '办公管理', '', '', '0', 'fa fa-laptop', '5', null, null); INSERT INTO `sys_menu` VALUES ('85', '84', '通知公告', 'oa/notify', 'oa:notify:notify', '1', 'fa fa-pencil-square', null, null, null); INSERT INTO `sys_menu` VALUES ('86', '85', '新增', 'oa/notify/add', 'oa:notify:add', '2', 'fa fa-plus', '1', null, null); INSERT INTO `sys_menu` VALUES ('87', '85', '编辑', 'oa/notify/edit', 'oa:notify:edit', '2', 'fa fa-pencil-square-o', '2', null, null); INSERT INTO `sys_menu` VALUES ('88', '85', '删除', 'oa/notify/remove', 'oa:notify:remove', '2', 'fa fa-minus', null, null, null); INSERT INTO `sys_menu` VALUES ('89', '85', '批量删除', 'oa/notify/batchRemove', 'oa:notify:batchRemove', '2', '', null, null, null); INSERT INTO `sys_menu` VALUES ('90', '84', '我的通知', 'oa/notify/selfNotify', '', '1', 'fa fa-envelope-square', null, null, null); INSERT INTO `sys_menu` VALUES ('91', '0', '系统监控', '', '', '0', 'fa fa-video-camera', '5', null, null); INSERT INTO `sys_menu` VALUES ('92', '91', '在线用户', 'sys/online', '', '1', 'fa fa-user', null, null, null); INSERT INTO `sys_menu` VALUES ('93', '0', '工作流程', '', '', '0', 'fa fa-print', '6', null, null); INSERT INTO `sys_menu` VALUES ('94', '93', '模型管理', 'activiti/model', '', '1', 'fa fa-sort-amount-asc', null, null, null); INSERT INTO `sys_menu` VALUES ('95', '94', '全部权限', '', 'activiti:model', '2', '', null, null, null); INSERT INTO `sys_menu` VALUES ('96', '93', '流程管理', 'activiti/process', '', '1', 'fa fa-flag', null, null, null); INSERT INTO `sys_menu` VALUES ('97', '0', '图表管理', '', '', '0', 'fa fa-bar-chart', '7', null, null); INSERT INTO `sys_menu` VALUES ('98', '97', '百度chart', '/chart/graph_echarts.html', '', '1', 'fa fa-area-chart', null, null, null); INSERT INTO `sys_menu` VALUES ('99', '96', '所有权限', '', 'act:process', '2', '', null, null, null); INSERT INTO `sys_menu` VALUES ('101', '93', '待办任务', 'activiti/task/todo', '', '1', '', null, null, null); INSERT INTO `sys_menu` VALUES ('104', '77', 'swagger', '/swagger-ui.html', '', '1', '', null, null, null); -- ---------------------------- -- Table structure for sys_role -- ---------------------------- DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( `role_id` bigint(20) NOT NULL AUTO_INCREMENT, `role_name` varchar(100) DEFAULT NULL COMMENT '角色名称', `role_sign` varchar(100) DEFAULT NULL COMMENT '角色标识', `remark` varchar(100) DEFAULT NULL COMMENT '备注', `user_id_create` bigint(255) DEFAULT NULL COMMENT '创建用户id', `gmt_create` datetime DEFAULT NULL COMMENT '创建时间', `gmt_modified` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8 COMMENT='角色'; -- ---------------------------- -- Records of sys_role -- ---------------------------- INSERT INTO `sys_role` VALUES ('1', '超级用户角色', 'admin', '拥有最高权限', '2', '2017-08-12 00:43:52', '2017-08-12 19:14:59'); INSERT INTO `sys_role` VALUES ('59', '仓储管理员', null, '仓储管理员', null, null, null); INSERT INTO `sys_role` VALUES ('60', '管理员', null, '普通管理员', null, null, null); -- ---------------------------- -- Table structure for sys_role_menu -- ---------------------------- DROP TABLE IF EXISTS `sys_role_menu`; CREATE TABLE `sys_role_menu` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID', `menu_id` bigint(20) DEFAULT NULL COMMENT '菜单ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3307 DEFAULT CHARSET=utf8 COMMENT='角色与菜单对应关系'; -- ---------------------------- -- Records of sys_role_menu -- ---------------------------- INSERT INTO `sys_role_menu` VALUES ('367', '44', '1'); INSERT INTO `sys_role_menu` VALUES ('368', '44', '32'); INSERT INTO `sys_role_menu` VALUES ('369', '44', '33'); INSERT INTO `sys_role_menu` VALUES ('370', '44', '34'); INSERT INTO `sys_role_menu` VALUES ('371', '44', '35'); INSERT INTO `sys_role_menu` VALUES ('372', '44', '28'); INSERT INTO `sys_role_menu` VALUES ('373', '44', '29'); INSERT INTO `sys_role_menu` VALUES ('374', '44', '30'); INSERT INTO `sys_role_menu` VALUES ('375', '44', '38'); INSERT INTO `sys_role_menu` VALUES ('376', '44', '4'); INSERT INTO `sys_role_menu` VALUES ('377', '44', '27'); INSERT INTO `sys_role_menu` VALUES ('378', '45', '38'); INSERT INTO `sys_role_menu` VALUES ('379', '46', '3'); INSERT INTO `sys_role_menu` VALUES ('380', '46', '20'); INSERT INTO `sys_role_menu` VALUES ('381', '46', '21'); INSERT INTO `sys_role_menu` VALUES ('382', '46', '22'); INSERT INTO `sys_role_menu` VALUES ('383', '46', '23'); INSERT INTO `sys_role_menu` VALUES ('384', '46', '11'); INSERT INTO `sys_role_menu` VALUES ('385', '46', '12'); INSERT INTO `sys_role_menu` VALUES ('386', '46', '13'); INSERT INTO `sys_role_menu` VALUES ('387', '46', '14'); INSERT INTO `sys_role_menu` VALUES ('388', '46', '24'); INSERT INTO `sys_role_menu` VALUES ('389', '46', '25'); INSERT INTO `sys_role_menu` VALUES ('390', '46', '26'); INSERT INTO `sys_role_menu` VALUES ('391', '46', '15'); INSERT INTO `sys_role_menu` VALUES ('392', '46', '2'); INSERT INTO `sys_role_menu` VALUES ('393', '46', '6'); INSERT INTO `sys_role_menu` VALUES ('394', '46', '7'); INSERT INTO `sys_role_menu` VALUES ('598', '50', '38'); INSERT INTO `sys_role_menu` VALUES ('632', '38', '42'); INSERT INTO `sys_role_menu` VALUES ('737', '51', '38'); INSERT INTO `sys_role_menu` VALUES ('738', '51', '39'); INSERT INTO `sys_role_menu` VALUES ('739', '51', '40'); INSERT INTO `sys_role_menu` VALUES ('740', '51', '41'); INSERT INTO `sys_role_menu` VALUES ('741', '51', '4'); INSERT INTO `sys_role_menu` VALUES ('742', '51', '32'); INSERT INTO `sys_role_menu` VALUES ('743', '51', '33'); INSERT INTO `sys_role_menu` VALUES ('744', '51', '34'); INSERT INTO `sys_role_menu` VALUES ('745', '51', '35'); INSERT INTO `sys_role_menu` VALUES ('746', '51', '27'); INSERT INTO `sys_role_menu` VALUES ('747', '51', '28'); INSERT INTO `sys_role_menu` VALUES ('748', '51', '29'); INSERT INTO `sys_role_menu` VALUES ('749', '51', '30'); INSERT INTO `sys_role_menu` VALUES ('750', '51', '1'); INSERT INTO `sys_role_menu` VALUES ('1064', '54', '53'); INSERT INTO `sys_role_menu` VALUES ('1095', '55', '2'); INSERT INTO `sys_role_menu` VALUES ('1096', '55', '6'); INSERT INTO `sys_role_menu` VALUES ('1097', '55', '7'); INSERT INTO `sys_role_menu` VALUES ('1098', '55', '3'); INSERT INTO `sys_role_menu` VALUES ('1099', '55', '50'); INSERT INTO `sys_role_menu` VALUES ('1100', '55', '49'); INSERT INTO `sys_role_menu` VALUES ('1101', '55', '1'); INSERT INTO `sys_role_menu` VALUES ('1856', '53', '28'); INSERT INTO `sys_role_menu` VALUES ('1857', '53', '29'); INSERT INTO `sys_role_menu` VALUES ('1858', '53', '30'); INSERT INTO `sys_role_menu` VALUES ('1859', '53', '27'); INSERT INTO `sys_role_menu` VALUES ('1860', '53', '57'); INSERT INTO `sys_role_menu` VALUES ('1861', '53', '71'); INSERT INTO `sys_role_menu` VALUES ('1862', '53', '48'); INSERT INTO `sys_role_menu` VALUES ('1863', '53', '72'); INSERT INTO `sys_role_menu` VALUES ('1864', '53', '1'); INSERT INTO `sys_role_menu` VALUES ('1865', '53', '7'); INSERT INTO `sys_role_menu` VALUES ('1866', '53', '55'); INSERT INTO `sys_role_menu` VALUES ('1867', '53', '56'); INSERT INTO `sys_role_menu` VALUES ('1868', '53', '62'); INSERT INTO `sys_role_menu` VALUES ('1869', '53', '15'); INSERT INTO `sys_role_menu` VALUES ('1870', '53', '2'); INSERT INTO `sys_role_menu` VALUES ('1871', '53', '61'); INSERT INTO `sys_role_menu` VALUES ('1872', '53', '20'); INSERT INTO `sys_role_menu` VALUES ('1873', '53', '21'); INSERT INTO `sys_role_menu` VALUES ('1874', '53', '22'); INSERT INTO `sys_role_menu` VALUES ('2084', '56', '68'); INSERT INTO `sys_role_menu` VALUES ('2085', '56', '60'); INSERT INTO `sys_role_menu` VALUES ('2086', '56', '59'); INSERT INTO `sys_role_menu` VALUES ('2087', '56', '58'); INSERT INTO `sys_role_menu` VALUES ('2088', '56', '51'); INSERT INTO `sys_role_menu` VALUES ('2089', '56', '50'); INSERT INTO `sys_role_menu` VALUES ('2090', '56', '49'); INSERT INTO `sys_role_menu` VALUES ('2243', '48', '72'); INSERT INTO `sys_role_menu` VALUES ('2247', '63', '-1'); INSERT INTO `sys_role_menu` VALUES ('2248', '63', '84'); INSERT INTO `sys_role_menu` VALUES ('2249', '63', '85'); INSERT INTO `sys_role_menu` VALUES ('2250', '63', '88'); INSERT INTO `sys_role_menu` VALUES ('2251', '63', '87'); INSERT INTO `sys_role_menu` VALUES ('2252', '64', '84'); INSERT INTO `sys_role_menu` VALUES ('2253', '64', '89'); INSERT INTO `sys_role_menu` VALUES ('2254', '64', '88'); INSERT INTO `sys_role_menu` VALUES ('2255', '64', '87'); INSERT INTO `sys_role_menu` VALUES ('2256', '64', '86'); INSERT INTO `sys_role_menu` VALUES ('2257', '64', '85'); INSERT INTO `sys_role_menu` VALUES ('2258', '65', '89'); INSERT INTO `sys_role_menu` VALUES ('2259', '65', '88'); INSERT INTO `sys_role_menu` VALUES ('2260', '65', '86'); INSERT INTO `sys_role_menu` VALUES ('2262', '67', '48'); INSERT INTO `sys_role_menu` VALUES ('2263', '68', '88'); INSERT INTO `sys_role_menu` VALUES ('2264', '68', '87'); INSERT INTO `sys_role_menu` VALUES ('2265', '69', '89'); INSERT INTO `sys_role_menu` VALUES ('2266', '69', '88'); INSERT INTO `sys_role_menu` VALUES ('2267', '69', '86'); INSERT INTO `sys_role_menu` VALUES ('2268', '69', '87'); INSERT INTO `sys_role_menu` VALUES ('2269', '69', '85'); INSERT INTO `sys_role_menu` VALUES ('2270', '69', '84'); INSERT INTO `sys_role_menu` VALUES ('2271', '70', '85'); INSERT INTO `sys_role_menu` VALUES ('2272', '70', '89'); INSERT INTO `sys_role_menu` VALUES ('2273', '70', '88'); INSERT INTO `sys_role_menu` VALUES ('2274', '70', '87'); INSERT INTO `sys_role_menu` VALUES ('2275', '70', '86'); INSERT INTO `sys_role_menu` VALUES ('2276', '70', '84'); INSERT INTO `sys_role_menu` VALUES ('2277', '71', '87'); INSERT INTO `sys_role_menu` VALUES ('2278', '72', '59'); INSERT INTO `sys_role_menu` VALUES ('2279', '73', '48'); INSERT INTO `sys_role_menu` VALUES ('2280', '74', '88'); INSERT INTO `sys_role_menu` VALUES ('2281', '74', '87'); INSERT INTO `sys_role_menu` VALUES ('2282', '75', '88'); INSERT INTO `sys_role_menu` VALUES ('2283', '75', '87'); INSERT INTO `sys_role_menu` VALUES ('2284', '76', '85'); INSERT INTO `sys_role_menu` VALUES ('2285', '76', '89'); INSERT INTO `sys_role_menu` VALUES ('2286', '76', '88'); INSERT INTO `sys_role_menu` VALUES ('2287', '76', '87'); INSERT INTO `sys_role_menu` VALUES ('2288', '76', '86'); INSERT INTO `sys_role_menu` VALUES ('2289', '76', '84'); INSERT INTO `sys_role_menu` VALUES ('2292', '78', '88'); INSERT INTO `sys_role_menu` VALUES ('2293', '78', '87'); INSERT INTO `sys_role_menu` VALUES ('2294', '78', null); INSERT INTO `sys_role_menu` VALUES ('2295', '78', null); INSERT INTO `sys_role_menu` VALUES ('2296', '78', null); INSERT INTO `sys_role_menu` VALUES ('2308', '80', '87'); INSERT INTO `sys_role_menu` VALUES ('2309', '80', '86'); INSERT INTO `sys_role_menu` VALUES ('2310', '80', '-1'); INSERT INTO `sys_role_menu` VALUES ('2311', '80', '84'); INSERT INTO `sys_role_menu` VALUES ('2312', '80', '85'); INSERT INTO `sys_role_menu` VALUES ('2328', '79', '72'); INSERT INTO `sys_role_menu` VALUES ('2329', '79', '48'); INSERT INTO `sys_role_menu` VALUES ('2330', '79', '77'); INSERT INTO `sys_role_menu` VALUES ('2331', '79', '84'); INSERT INTO `sys_role_menu` VALUES ('2332', '79', '89'); INSERT INTO `sys_role_menu` VALUES ('2333', '79', '88'); INSERT INTO `sys_role_menu` VALUES ('2334', '79', '87'); INSERT INTO `sys_role_menu` VALUES ('2335', '79', '86'); INSERT INTO `sys_role_menu` VALUES ('2336', '79', '85'); INSERT INTO `sys_role_menu` VALUES ('2337', '79', '-1'); INSERT INTO `sys_role_menu` VALUES ('2338', '77', '89'); INSERT INTO `sys_role_menu` VALUES ('2339', '77', '88'); INSERT INTO `sys_role_menu` VALUES ('2340', '77', '87'); INSERT INTO `sys_role_menu` VALUES ('2341', '77', '86'); INSERT INTO `sys_role_menu` VALUES ('2342', '77', '85'); INSERT INTO `sys_role_menu` VALUES ('2343', '77', '84'); INSERT INTO `sys_role_menu` VALUES ('2344', '77', '72'); INSERT INTO `sys_role_menu` VALUES ('2345', '77', '-1'); INSERT INTO `sys_role_menu` VALUES ('2346', '77', '77'); INSERT INTO `sys_role_menu` VALUES ('2974', '57', '93'); INSERT INTO `sys_role_menu` VALUES ('2975', '57', '99'); INSERT INTO `sys_role_menu` VALUES ('2976', '57', '95'); INSERT INTO `sys_role_menu` VALUES ('2977', '57', '101'); INSERT INTO `sys_role_menu` VALUES ('2978', '57', '96'); INSERT INTO `sys_role_menu` VALUES ('2979', '57', '94'); INSERT INTO `sys_role_menu` VALUES ('2980', '57', '-1'); INSERT INTO `sys_role_menu` VALUES ('2981', '58', '93'); INSERT INTO `sys_role_menu` VALUES ('2982', '58', '99'); INSERT INTO `sys_role_menu` VALUES ('2983', '58', '95'); INSERT INTO `sys_role_menu` VALUES ('2984', '58', '101'); INSERT INTO `sys_role_menu` VALUES ('2985', '58', '96'); INSERT INTO `sys_role_menu` VALUES ('2986', '58', '94'); INSERT INTO `sys_role_menu` VALUES ('2987', '58', '-1'); INSERT INTO `sys_role_menu` VALUES ('3115', '1', '103'); INSERT INTO `sys_role_menu` VALUES ('3116', '1', '98'); INSERT INTO `sys_role_menu` VALUES ('3117', '1', '101'); INSERT INTO `sys_role_menu` VALUES ('3118', '1', '99'); INSERT INTO `sys_role_menu` VALUES ('3119', '1', '95'); INSERT INTO `sys_role_menu` VALUES ('3120', '1', '92'); INSERT INTO `sys_role_menu` VALUES ('3121', '1', '57'); INSERT INTO `sys_role_menu` VALUES ('3122', '1', '30'); INSERT INTO `sys_role_menu` VALUES ('3123', '1', '29'); INSERT INTO `sys_role_menu` VALUES ('3124', '1', '28'); INSERT INTO `sys_role_menu` VALUES ('3125', '1', '90'); INSERT INTO `sys_role_menu` VALUES ('3126', '1', '89'); INSERT INTO `sys_role_menu` VALUES ('3127', '1', '88'); INSERT INTO `sys_role_menu` VALUES ('3128', '1', '87'); INSERT INTO `sys_role_menu` VALUES ('3129', '1', '86'); INSERT INTO `sys_role_menu` VALUES ('3130', '1', '72'); INSERT INTO `sys_role_menu` VALUES ('3131', '1', '48'); INSERT INTO `sys_role_menu` VALUES ('3132', '1', '68'); INSERT INTO `sys_role_menu` VALUES ('3133', '1', '60'); INSERT INTO `sys_role_menu` VALUES ('3134', '1', '59'); INSERT INTO `sys_role_menu` VALUES ('3135', '1', '58'); INSERT INTO `sys_role_menu` VALUES ('3136', '1', '51'); INSERT INTO `sys_role_menu` VALUES ('3137', '1', '76'); INSERT INTO `sys_role_menu` VALUES ('3138', '1', '75'); INSERT INTO `sys_role_menu` VALUES ('3139', '1', '74'); INSERT INTO `sys_role_menu` VALUES ('3140', '1', '62'); INSERT INTO `sys_role_menu` VALUES ('3141', '1', '56'); INSERT INTO `sys_role_menu` VALUES ('3142', '1', '55'); INSERT INTO `sys_role_menu` VALUES ('3143', '1', '15'); INSERT INTO `sys_role_menu` VALUES ('3144', '1', '26'); INSERT INTO `sys_role_menu` VALUES ('3145', '1', '25'); INSERT INTO `sys_role_menu` VALUES ('3146', '1', '24'); INSERT INTO `sys_role_menu` VALUES ('3147', '1', '14'); INSERT INTO `sys_role_menu` VALUES ('3148', '1', '13'); INSERT INTO `sys_role_menu` VALUES ('3149', '1', '12'); INSERT INTO `sys_role_menu` VALUES ('3150', '1', '61'); INSERT INTO `sys_role_menu` VALUES ('3151', '1', '22'); INSERT INTO `sys_role_menu` VALUES ('3152', '1', '21'); INSERT INTO `sys_role_menu` VALUES ('3153', '1', '20'); INSERT INTO `sys_role_menu` VALUES ('3154', '1', '83'); INSERT INTO `sys_role_menu` VALUES ('3155', '1', '81'); INSERT INTO `sys_role_menu` VALUES ('3156', '1', '80'); INSERT INTO `sys_role_menu` VALUES ('3157', '1', '79'); INSERT INTO `sys_role_menu` VALUES ('3158', '1', '71'); INSERT INTO `sys_role_menu` VALUES ('3159', '1', '102'); INSERT INTO `sys_role_menu` VALUES ('3160', '1', '97'); INSERT INTO `sys_role_menu` VALUES ('3161', '1', '96'); INSERT INTO `sys_role_menu` VALUES ('3162', '1', '94'); INSERT INTO `sys_role_menu` VALUES ('3163', '1', '93'); INSERT INTO `sys_role_menu` VALUES ('3164', '1', '27'); INSERT INTO `sys_role_menu` VALUES ('3165', '1', '91'); INSERT INTO `sys_role_menu` VALUES ('3166', '1', '85'); INSERT INTO `sys_role_menu` VALUES ('3167', '1', '84'); INSERT INTO `sys_role_menu` VALUES ('3168', '1', '50'); INSERT INTO `sys_role_menu` VALUES ('3169', '1', '49'); INSERT INTO `sys_role_menu` VALUES ('3170', '1', '73'); INSERT INTO `sys_role_menu` VALUES ('3171', '1', '7'); INSERT INTO `sys_role_menu` VALUES ('3172', '1', '6'); INSERT INTO `sys_role_menu` VALUES ('3173', '1', '2'); INSERT INTO `sys_role_menu` VALUES ('3174', '1', '3'); INSERT INTO `sys_role_menu` VALUES ('3175', '1', '78'); INSERT INTO `sys_role_menu` VALUES ('3176', '1', '1'); INSERT INTO `sys_role_menu` VALUES ('3177', '1', '104'); INSERT INTO `sys_role_menu` VALUES ('3178', '1', '77'); INSERT INTO `sys_role_menu` VALUES ('3179', '1', '-1'); INSERT INTO `sys_role_menu` VALUES ('3284', '60', '3'); INSERT INTO `sys_role_menu` VALUES ('3285', '60', '76'); INSERT INTO `sys_role_menu` VALUES ('3286', '60', '75'); INSERT INTO `sys_role_menu` VALUES ('3287', '60', '74'); INSERT INTO `sys_role_menu` VALUES ('3288', '60', '62'); INSERT INTO `sys_role_menu` VALUES ('3289', '60', '56'); INSERT INTO `sys_role_menu` VALUES ('3290', '60', '55'); INSERT INTO `sys_role_menu` VALUES ('3291', '60', '15'); INSERT INTO `sys_role_menu` VALUES ('3292', '60', '26'); INSERT INTO `sys_role_menu` VALUES ('3293', '60', '25'); INSERT INTO `sys_role_menu` VALUES ('3294', '60', '24'); INSERT INTO `sys_role_menu` VALUES ('3295', '60', '14'); INSERT INTO `sys_role_menu` VALUES ('3296', '60', '13'); INSERT INTO `sys_role_menu` VALUES ('3297', '60', '12'); INSERT INTO `sys_role_menu` VALUES ('3298', '60', '61'); INSERT INTO `sys_role_menu` VALUES ('3299', '60', '22'); INSERT INTO `sys_role_menu` VALUES ('3300', '60', '21'); INSERT INTO `sys_role_menu` VALUES ('3301', '60', '20'); INSERT INTO `sys_role_menu` VALUES ('3302', '60', '73'); INSERT INTO `sys_role_menu` VALUES ('3303', '60', '7'); INSERT INTO `sys_role_menu` VALUES ('3304', '60', '6'); INSERT INTO `sys_role_menu` VALUES ('3305', '60', '2'); INSERT INTO `sys_role_menu` VALUES ('3306', '60', '-1'); -- ---------------------------- -- Table structure for sys_task -- ---------------------------- DROP TABLE IF EXISTS `sys_task`; CREATE TABLE `sys_task` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `cron_expression` varchar(255) DEFAULT NULL COMMENT 'cron表达式', `method_name` varchar(255) DEFAULT NULL COMMENT '任务调用的方法名', `is_concurrent` varchar(255) DEFAULT NULL COMMENT '任务是否有状态', `description` varchar(255) DEFAULT NULL COMMENT '任务描述', `update_by` varchar(64) DEFAULT NULL COMMENT '更新者', `bean_class` varchar(255) DEFAULT NULL COMMENT '任务执行时调用哪个类的方法 包名+类名', `create_date` datetime DEFAULT NULL COMMENT '创建时间', `job_status` varchar(255) DEFAULT NULL COMMENT '任务状态', `job_group` varchar(255) DEFAULT NULL COMMENT '任务分组', `update_date` datetime DEFAULT NULL COMMENT '更新时间', `create_by` varchar(64) DEFAULT NULL COMMENT '创建者', `spring_bean` varchar(255) DEFAULT NULL COMMENT 'Spring bean', `job_name` varchar(255) DEFAULT NULL COMMENT '任务名', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of sys_task -- ---------------------------- INSERT INTO `sys_task` VALUES ('2', '0/10 * * * * ?', 'run1', '1', '', '4028ea815a3d2a8c015a3d2f8d2a0002', 'com.bootdo.common.task.WelcomeJob', '2017-05-19 18:30:56', '0', 'group1', '2017-05-19 18:31:07', null, '', 'welcomJob'); -- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `user_id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL COMMENT '用户名', `name` varchar(100) DEFAULT NULL, `password` varchar(50) DEFAULT NULL COMMENT '密码', `dept_id` bigint(20) DEFAULT NULL, `email` varchar(100) DEFAULT NULL COMMENT '邮箱', `mobile` varchar(100) DEFAULT NULL COMMENT '手机号', `status` tinyint(255) DEFAULT NULL COMMENT '状态 0:禁用,1:正常', `user_id_create` bigint(255) DEFAULT NULL COMMENT '创建用户id', `gmt_create` datetime DEFAULT NULL COMMENT '创建时间', `gmt_modified` datetime DEFAULT NULL COMMENT '修改时间', `sex` bigint(32) DEFAULT NULL COMMENT '性别', `birth` datetime DEFAULT NULL COMMENT '出身日期', `pic_id` bigint(32) DEFAULT NULL, `live_address` varchar(500) DEFAULT NULL COMMENT '现居住地', `hobby` varchar(255) DEFAULT NULL COMMENT '爱好', `province` varchar(255) DEFAULT NULL COMMENT '省份', `city` varchar(255) DEFAULT NULL COMMENT '所在城市', `district` varchar(255) DEFAULT NULL COMMENT '所在地区', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=141 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES ('1', 'admin', '超级管理员', 'd0af8fa1272ef5a152d9e27763eea293', '6', 'admin@example.com', '17699999999', '1', '1', '2017-08-15 21:40:39', '2017-08-15 21:41:00', '96', '2017-12-14 00:00:00', '138', 'ccc', '', '河北省', '石家庄市', '裕华区'); INSERT INTO `sys_user` VALUES ('139', 'admin2', '管理员-郑', '88d17235f597d36e4bca125853a9022a', '6', '1146556298@qq.com', null, '1', null, null, null, null, null, null, null, null, null, null, null); INSERT INTO `sys_user` VALUES ('140', 'cangchu', '仓储管理员', '098dc79ecd794a97dfae13b62a939052', '11', '234567890@qq.com', null, '1', null, null, null, null, null, null, null, null, null, null, null); -- ---------------------------- -- Table structure for sys_user_plus -- ---------------------------- DROP TABLE IF EXISTS `sys_user_plus`; CREATE TABLE `sys_user_plus` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) NOT NULL, `payment` double DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of sys_user_plus -- ---------------------------- -- ---------------------------- -- Table structure for sys_user_role -- ---------------------------- DROP TABLE IF EXISTS `sys_user_role`; CREATE TABLE `sys_user_role` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID', `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=140 DEFAULT CHARSET=utf8 COMMENT='用户与角色对应关系'; -- ---------------------------- -- Records of sys_user_role -- ---------------------------- INSERT INTO `sys_user_role` VALUES ('73', '30', '48'); INSERT INTO `sys_user_role` VALUES ('74', '30', '49'); INSERT INTO `sys_user_role` VALUES ('75', '30', '50'); INSERT INTO `sys_user_role` VALUES ('76', '31', '48'); INSERT INTO `sys_user_role` VALUES ('77', '31', '49'); INSERT INTO `sys_user_role` VALUES ('78', '31', '52'); INSERT INTO `sys_user_role` VALUES ('79', '32', '48'); INSERT INTO `sys_user_role` VALUES ('80', '32', '49'); INSERT INTO `sys_user_role` VALUES ('81', '32', '50'); INSERT INTO `sys_user_role` VALUES ('82', '32', '51'); INSERT INTO `sys_user_role` VALUES ('83', '32', '52'); INSERT INTO `sys_user_role` VALUES ('84', '33', '38'); INSERT INTO `sys_user_role` VALUES ('85', '33', '49'); INSERT INTO `sys_user_role` VALUES ('86', '33', '52'); INSERT INTO `sys_user_role` VALUES ('87', '34', '50'); INSERT INTO `sys_user_role` VALUES ('88', '34', '51'); INSERT INTO `sys_user_role` VALUES ('89', '34', '52'); INSERT INTO `sys_user_role` VALUES ('124', null, '48'); INSERT INTO `sys_user_role` VALUES ('136', '1', '1'); INSERT INTO `sys_user_role` VALUES ('138', '139', '60'); INSERT INTO `sys_user_role` VALUES ('139', '140', '59'); ================================================ FILE: src/main/java/me/zbl/HospitalApplication.java ================================================ package me.zbl; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @ServletComponentScan @MapperScan("me.zbl.*.dao") @SpringBootApplication public class HospitalApplication { public static void main(String[] args) { SpringApplication.run(HospitalApplication.class, args); } } ================================================ FILE: src/main/java/me/zbl/activity/config/ActivitiConfig.java ================================================ package me.zbl.activity.config; import org.activiti.engine.*; import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.activiti.spring.ProcessEngineFactoryBean; import org.activiti.spring.SpringProcessEngineConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; @Configuration public class ActivitiConfig { //流程配置,与spring整合采用SpringProcessEngineConfiguration这个实现 @Bean public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager) { SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration(); processEngineConfiguration.setDataSource(dataSource); processEngineConfiguration.setDatabaseSchemaUpdate("true"); processEngineConfiguration.setDatabaseType("mysql"); processEngineConfiguration.setTransactionManager(transactionManager); //流程图字体 processEngineConfiguration.setActivityFontName("宋体"); processEngineConfiguration.setAnnotationFontName("宋体"); processEngineConfiguration.setLabelFontName("宋体"); return processEngineConfiguration; } //流程引擎,与spring整合使用factoryBean @Bean public ProcessEngineFactoryBean processEngine(ProcessEngineConfiguration processEngineConfiguration) { ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean(); processEngineFactoryBean.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration); return processEngineFactoryBean; } //八大接口 @Bean public RepositoryService repositoryService(ProcessEngine processEngine) { return processEngine.getRepositoryService(); } @Bean public RuntimeService runtimeService(ProcessEngine processEngine) { return processEngine.getRuntimeService(); } @Bean public TaskService taskService(ProcessEngine processEngine) { return processEngine.getTaskService(); } @Bean public HistoryService historyService(ProcessEngine processEngine) { return processEngine.getHistoryService(); } @Bean public FormService formService(ProcessEngine processEngine) { return processEngine.getFormService(); } @Bean public IdentityService identityService(ProcessEngine processEngine) { return processEngine.getIdentityService(); } @Bean public ManagementService managementService(ProcessEngine processEngine) { return processEngine.getManagementService(); } @Bean public DynamicBpmnService dynamicBpmnService(ProcessEngine processEngine) { return processEngine.getDynamicBpmnService(); } //八大接口 end } ================================================ FILE: src/main/java/me/zbl/activity/config/ActivitiConstant.java ================================================ package me.zbl.activity.config; /** * */ public class ActivitiConstant { public static final String[] ACTIVITI_SALARY = new String[]{"salary", "salary"}; } ================================================ FILE: src/main/java/me/zbl/activity/controller/ModelController.java ================================================ package me.zbl.activity.controller; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.R; import org.activiti.bpmn.converter.BpmnXMLConverter; import org.activiti.bpmn.model.BpmnModel; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.editor.language.json.converter.BpmnJsonConverter; import org.activiti.engine.ActivitiException; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.Model; import org.activiti.rest.editor.model.ModelEditorJsonRestResource; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.PNGTranscoder; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.List; import static org.activiti.editor.constants.ModelDataJsonConstants.*; /** * @author 郑保乐 */ @RequestMapping("/activiti") @RestController public class ModelController extends BaseController { protected static final Logger LOGGER = LoggerFactory.getLogger(ModelEditorJsonRestResource.class); @Autowired private RepositoryService repositoryService; @Autowired private ObjectMapper objectMapper; @GetMapping("/model") ModelAndView model() { return new ModelAndView("act/model/model"); } @GetMapping("/model/list") PageWrapper list(int offset, int limit) { List list = repositoryService.createModelQuery().listPage(offset , limit); int total = (int) repositoryService.createModelQuery().count(); PageWrapper pageUtil = new PageWrapper(list, total); return pageUtil; } @RequestMapping("/model/add") public void newModel(HttpServletResponse response) throws UnsupportedEncodingException { //初始化一个空模型 Model model = repositoryService.newModel(); //设置一些默认信息 String name = "new-process"; String description = ""; int revision = 1; String key = "process"; ObjectNode modelNode = objectMapper.createObjectNode(); modelNode.put(ModelDataJsonConstants.MODEL_NAME, name); modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description); modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision); model.setName(name); model.setKey(key); model.setMetaInfo(modelNode.toString()); repositoryService.saveModel(model); String id = model.getId(); //完善ModelEditorSource ObjectNode editorNode = objectMapper.createObjectNode(); editorNode.put("id", "canvas"); editorNode.put("resourceId", "canvas"); ObjectNode stencilSetNode = objectMapper.createObjectNode(); stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#"); editorNode.put("stencilset", stencilSetNode); repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8")); try { response.sendRedirect("/modeler.html?modelId=" + id); } catch (IOException e) { e.printStackTrace(); } } @GetMapping(value = "/model/{modelId}/json") public ObjectNode getEditorJson(@PathVariable String modelId) { ObjectNode modelNode = null; Model model = repositoryService.getModel(modelId); if (model != null) { try { if (StringUtils.isNotEmpty(model.getMetaInfo())) { modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); } else { modelNode = objectMapper.createObjectNode(); modelNode.put(MODEL_NAME, model.getName()); } modelNode.put(MODEL_ID, model.getId()); ObjectNode editorJsonNode = (ObjectNode) objectMapper.readTree( new String(repositoryService.getModelEditorSource(model.getId()), "utf-8")); modelNode.put("model", editorJsonNode); } catch (Exception e) { LOGGER.error("Error creating model JSON", e); throw new ActivitiException("Error creating model JSON", e); } } return modelNode; } @RequestMapping(value = "/editor/stencilset", method = RequestMethod.GET, produces = "application/json;charset=utf-8") public String getStencilset() { InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json"); try { return IOUtils.toString(stencilsetStream, "utf-8"); } catch (Exception e) { throw new ActivitiException("Error while loading stencil set", e); } } @GetMapping("/model/edit/{id}") public void edit(HttpServletResponse response, @PathVariable("id") String id) { try { response.sendRedirect("/modeler.html?modelId=" + id); } catch (IOException e) { e.printStackTrace(); } } @DeleteMapping("/model/{id}") public R remove(@PathVariable("id") String id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } repositoryService.deleteModel(id); return R.ok(); } @PostMapping("/model/deploy/{id}") public R deploy(@PathVariable("id") String id) throws Exception { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } //获取模型 Model modelData = repositoryService.getModel(id); byte[] bytes = repositoryService.getModelEditorSource(modelData.getId()); if (bytes == null) { return R.error("模型数据为空,请先设计流程并成功保存,再进行发布。"); } JsonNode modelNode = new ObjectMapper().readTree(bytes); BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode); if (model.getProcesses().size() == 0) { return R.error("数据模型不符要求,请至少设计一条主线流程。"); } byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model); //发布流程 String processName = modelData.getName() + ".bpmn20.xml"; Deployment deployment = repositoryService.createDeployment() .name(modelData.getName()) .addString(processName, new String(bpmnBytes, "UTF-8")) .deploy(); modelData.setDeploymentId(deployment.getId()); repositoryService.saveModel(modelData); return R.ok(); } @PostMapping("/model/batchRemove") public R batchRemove(@RequestParam("ids[]") String[] ids) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } for (String id : ids) { repositoryService.deleteModel(id); } return R.ok(); } @RequestMapping(value = "/model/{modelId}/save", method = RequestMethod.PUT) @ResponseStatus(value = HttpStatus.OK) public void saveModel(@PathVariable String modelId , String name, String description , String json_xml, String svg_xml) { try { Model model = repositoryService.getModel(modelId); ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); modelJson.put(MODEL_NAME, name); modelJson.put(MODEL_DESCRIPTION, description); model.setMetaInfo(modelJson.toString()); model.setName(name); repositoryService.saveModel(model); repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8")); InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8")); TranscoderInput input = new TranscoderInput(svgStream); PNGTranscoder transcoder = new PNGTranscoder(); // Setup output ByteArrayOutputStream outStream = new ByteArrayOutputStream(); TranscoderOutput output = new TranscoderOutput(outStream); // Do the transformation transcoder.transcode(input, output); final byte[] result = outStream.toByteArray(); repositoryService.addModelEditorSourceExtra(model.getId(), result); outStream.close(); } catch (Exception e) { LOGGER.error("Error saving model", e); throw new ActivitiException("Error saving model", e); } } @GetMapping("/model/export/{id}") public void exportToXml(@PathVariable("id") String id, HttpServletResponse response) { try { org.activiti.engine.repository.Model modelData = repositoryService.getModel(id); BpmnJsonConverter jsonConverter = new BpmnJsonConverter(); JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId())); BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode); BpmnXMLConverter xmlConverter = new BpmnXMLConverter(); byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel); ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes); IOUtils.copy(in, response.getOutputStream()); String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml"; response.setHeader("Content-Disposition", "attachment; filename=" + filename); response.flushBuffer(); } catch (Exception e) { throw new ActivitiException("导出model的xml文件失败,模型ID=" + id, e); } } } ================================================ FILE: src/main/java/me/zbl/activity/controller/ProcessController.java ================================================ package me.zbl.activity.controller; import me.zbl.activity.service.ProcessService; import me.zbl.activity.vo.ProcessVO; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.R; import org.activiti.engine.ActivitiException; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.ProcessDefinition; import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.servlet.http.HttpServletResponse; import javax.xml.stream.XMLStreamException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.zip.ZipInputStream; @RequestMapping("activiti/process") @RestController public class ProcessController extends BaseController { @Autowired private RepositoryService repositoryService; @Autowired private ProcessService processService; @Autowired private RuntimeService runtimeService; @GetMapping ModelAndView process() { return new ModelAndView("act/process/process"); } @GetMapping("list") PageWrapper list(int offset, int limit) { List processDefinitions = repositoryService.createProcessDefinitionQuery() .listPage(offset, limit); int count = (int) repositoryService.createProcessDefinitionQuery().count(); List list = new ArrayList<>(); for (ProcessDefinition processDefinition : processDefinitions) { list.add(new ProcessVO(processDefinition)); } PageWrapper pageWrapper = new PageWrapper(list, count); return pageWrapper; } @GetMapping("/add") public ModelAndView add() { return new ModelAndView("act/process/add"); } @PostMapping("/save") @Transactional(readOnly = false) public R deploy(String exportDir, String category, MultipartFile file) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } String message = ""; String fileName = file.getOriginalFilename(); try { InputStream fileInputStream = file.getInputStream(); Deployment deployment = null; String extension = FilenameUtils.getExtension(fileName); if (extension.equals("zip") || extension.equals("bar")) { ZipInputStream zip = new ZipInputStream(fileInputStream); deployment = repositoryService.createDeployment().addZipInputStream(zip).deploy(); } else if (extension.equals("png")) { deployment = repositoryService.createDeployment().addInputStream(fileName, fileInputStream).deploy(); } else if (fileName.indexOf("bpmn20.xml") != -1) { deployment = repositoryService.createDeployment().addInputStream(fileName, fileInputStream).deploy(); } else if (extension.equals("bpmn")) { // bpmn扩展名特殊处理,转换为bpmn20.xml String baseName = FilenameUtils.getBaseName(fileName); deployment = repositoryService.createDeployment().addInputStream(baseName + ".bpmn20.xml", fileInputStream).deploy(); } else { message = "不支持的文件类型:" + extension; } List list = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).list(); // 设置流程分类 for (ProcessDefinition processDefinition : list) { // ActUtils.exportDiagramToFile(repositoryService, processDefinition, exportDir); repositoryService.setProcessDefinitionCategory(processDefinition.getId(), category); message += "部署成功,流程ID=" + processDefinition.getId() + "
"; } if (list.size() == 0) { message = "部署失败,没有流程。"; } } catch (Exception e) { throw new ActivitiException("部署失败!", e); } return R.ok(message); } /** * 将部署的流程转换为模型 * * @param procDefId * @param redirectAttributes * * @return * * @throws UnsupportedEncodingException * @throws XMLStreamException */ @RequestMapping(value = "/convertToModel/{procDefId}") public R convertToModel(@PathVariable("procDefId") String procDefId, RedirectAttributes redirectAttributes) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } org.activiti.engine.repository.Model modelData = null; try { modelData = processService.convertToModel(procDefId); return R.ok("转换模型成功,模型ID=" + modelData.getId()); } catch (Exception e) { e.printStackTrace(); return R.ok("转换模型失败"); } } @RequestMapping(value = "/resource/read/{xml}/{id}") public void resourceRead(@PathVariable("xml") String resType, @PathVariable("id") String id, HttpServletResponse response) throws Exception { InputStream resourceAsStream = processService.resourceRead(id, resType); byte[] b = new byte[1024]; int len = -1; while ((len = resourceAsStream.read(b, 0, 1024)) != -1) { response.getOutputStream().write(b, 0, len); } } @PostMapping("/remove") public R remove(String id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } repositoryService.deleteDeployment(id, true); return R.ok(); } @PostMapping("/batchRemove") public R batchRemove(@RequestParam("ids[]") String[] ids) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } for (String id : ids) { repositoryService.deleteDeployment(id, true); } return R.ok(); } } ================================================ FILE: src/main/java/me/zbl/activity/controller/SalaryController.java ================================================ package me.zbl.activity.controller; import me.zbl.activity.domain.SalaryDO; import me.zbl.activity.service.SalaryService; import me.zbl.activity.utils.ActivitiUtils; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import me.zbl.common.utils.ShiroUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.Date; import java.util.List; import java.util.Map; /** * 审批流程测试表 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-11-25 13:33:16 */ @Controller @RequestMapping("/act/salary") public class SalaryController extends BaseController { @Autowired ActivitiUtils activitiUtils; @Autowired private SalaryService salaryService; @GetMapping() String Salary() { return "activity/salary/salary"; } @ResponseBody @GetMapping("/list") public PageWrapper list(@RequestParam Map params) { Query query = new Query(params); List salaryList = salaryService.list(query); int total = salaryService.count(query); PageWrapper pageWrapper = new PageWrapper(salaryList, total); return pageWrapper; } @GetMapping("/form") String add() { return "act/salary/add"; } @GetMapping("/form/{taskId}") String edit(@PathVariable("taskId") String taskId, Model model) { SalaryDO salary = salaryService.get(activitiUtils.getBusinessKeyByTaskId(taskId)); salary.setTaskId(taskId); model.addAttribute("salary", salary); return "act/salary/edit"; } /** * 保存 */ @ResponseBody @PostMapping("/save") public R saveOrUpdate(SalaryDO salary) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } salary.setCreateDate(new Date()); salary.setUpdateDate(new Date()); salary.setCreateBy(ShiroUtils.getUserId().toString()); salary.setUpdateBy(ShiroUtils.getUserId().toString()); salary.setDelFlag("1"); if (salaryService.save(salary) > 0) { return R.ok(); } return R.error(); } /** * 修改 */ @ResponseBody @RequestMapping("/update") public R update(SalaryDO salary) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } String taskKey = activitiUtils.getTaskByTaskId(salary.getTaskId()).getTaskDefinitionKey(); if ("audit2".equals(taskKey)) { salary.setHrText(salary.getTaskComment()); } else if ("audit3".equals(taskKey)) { salary.setLeadText(salary.getTaskComment()); } else if ("audit4".equals(taskKey)) { salary.setMainLeadText(salary.getTaskComment()); } else if ("apply_end".equals(salary.getTaskComment())) { //流程完成,兑现 } salaryService.update(salary); return R.ok(); } /** * 删除 */ @PostMapping("/remove") @ResponseBody public R remove(String id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (salaryService.remove(id) > 0) { return R.ok(); } return R.error(); } /** * 删除 */ @PostMapping("/batchRemove") @ResponseBody public R remove(@RequestParam("ids[]") String[] ids) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } salaryService.batchRemove(ids); return R.ok(); } } ================================================ FILE: src/main/java/me/zbl/activity/controller/TaskController.java ================================================ package me.zbl.activity.controller; import me.zbl.activity.service.ActTaskService; import me.zbl.activity.vo.ProcessVO; import me.zbl.activity.vo.TaskVO; import me.zbl.common.utils.PageWrapper; import org.activiti.engine.FormService; import org.activiti.engine.RepositoryService; import org.activiti.engine.TaskService; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.task.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * */ @RequestMapping("activiti/task") @RestController public class TaskController { @Autowired RepositoryService repositoryService; @Autowired FormService formService; @Autowired TaskService taskService; @Autowired ActTaskService actTaskService; @GetMapping("goto") public ModelAndView gotoTask() { return new ModelAndView("act/task/gotoTask"); } @GetMapping("/gotoList") PageWrapper list(int offset, int limit) { List processDefinitions = repositoryService.createProcessDefinitionQuery() .listPage(offset, limit); int count = (int) repositoryService.createProcessDefinitionQuery().count(); List list = new ArrayList<>(); for (ProcessDefinition processDefinition : processDefinitions) { list.add(new ProcessVO(processDefinition)); } PageWrapper pageWrapper = new PageWrapper(list, count); return pageWrapper; } @GetMapping("/form/{procDefId}") public void startForm(@PathVariable("procDefId") String procDefId, HttpServletResponse response) throws IOException { String formKey = actTaskService.getFormKey(procDefId, null); response.sendRedirect(formKey); } @GetMapping("/form/{procDefId}/{taskId}") public void form(@PathVariable("procDefId") String procDefId, @PathVariable("taskId") String taskId, HttpServletResponse response) throws IOException { // 获取流程XML上的表单KEY String formKey = actTaskService.getFormKey(procDefId, taskId); response.sendRedirect(formKey + "/" + taskId); } @GetMapping("/todo") ModelAndView todo() { return new ModelAndView("act/task/todoTask"); } @GetMapping("/todoList") List todoList() { List tasks = taskService.createTaskQuery().taskAssignee("admin").list(); List taskVOS = new ArrayList<>(); for (Task task : tasks) { TaskVO taskVO = new TaskVO(task); taskVOS.add(taskVO); } return taskVOS; } /** * 读取带跟踪的图片 */ @RequestMapping(value = "/trace/photo/{procDefId}/{execId}") public void tracePhoto(@PathVariable("procDefId") String procDefId, @PathVariable("execId") String execId, HttpServletResponse response) throws Exception { InputStream imageStream = actTaskService.tracePhoto(procDefId, execId); // 输出资源内容到相应对象 byte[] b = new byte[1024]; int len; while ((len = imageStream.read(b, 0, 1024)) != -1) { response.getOutputStream().write(b, 0, len); } } } ================================================ FILE: src/main/java/me/zbl/activity/dao/SalaryDao.java ================================================ package me.zbl.activity.dao; import me.zbl.activity.domain.SalaryDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 审批流程测试表 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-11-25 13:28:58 */ @Mapper public interface SalaryDao { SalaryDO get(String id); List list(Map map); int count(Map map); int save(SalaryDO salary); int update(SalaryDO salary); int remove(String id); int batchRemove(String[] ids); } ================================================ FILE: src/main/java/me/zbl/activity/domain/ActivitiDO.java ================================================ package me.zbl.activity.domain; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import java.util.Date; import java.util.List; /** * */ public class ActivitiDO { private String taskId; // 任务编号 private String taskName; // 任务名称 private String taskDefKey; // 任务定义Key(任务环节标识) private String procInsId; // 流程实例ID private String procDefId; // 流程定义ID private String procDefKey; // 流程定义Key(流程定义标识) private String businessTable; // 业务绑定Table private String businessId; // 业务绑定ID private String title; // 任务标题 private String status; // 任务状态(todo/claim/finish) private String procExecUrl; // 流程执行(办理)RUL private String comment; // 任务意见 private String flag; // 意见状态 private Task task; // 任务对象 private ProcessDefinition procDef; // 流程定义对象 private ProcessInstance procIns; // 流程实例对象 private HistoricTaskInstance histTask; // 历史任务 private HistoricActivityInstance histIns; //历史活动任务 private String assignee; // 任务执行人编号 private String assigneeName; // 任务执行人名称 private Variable vars; // 流程变量 private Variable taskVars; // 流程任务变量 private Date beginDate; // 开始查询日期 private Date endDate; // 结束查询日期 private List list; // 任务列表 public String getTaskId() { return taskId; } public void setTaskId(String taskId) { this.taskId = taskId; } public String getTaskName() { return taskName; } public void setTaskName(String taskName) { this.taskName = taskName; } public String getTaskDefKey() { return taskDefKey; } public void setTaskDefKey(String taskDefKey) { this.taskDefKey = taskDefKey; } public String getProcInsId() { return procInsId; } public void setProcInsId(String procInsId) { this.procInsId = procInsId; } public String getProcDefId() { return procDefId; } public void setProcDefId(String procDefId) { this.procDefId = procDefId; } public String getProcDefKey() { return procDefKey; } public void setProcDefKey(String procDefKey) { this.procDefKey = procDefKey; } public String getBusinessTable() { return businessTable; } public void setBusinessTable(String businessTable) { this.businessTable = businessTable; } public String getBusinessId() { return businessId; } public void setBusinessId(String businessId) { this.businessId = businessId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getProcExecUrl() { return procExecUrl; } public void setProcExecUrl(String procExecUrl) { this.procExecUrl = procExecUrl; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public String getFlag() { return flag; } public void setFlag(String flag) { this.flag = flag; } public Task getTask() { return task; } public void setTask(Task task) { this.task = task; } public ProcessDefinition getProcDef() { return procDef; } public void setProcDef(ProcessDefinition procDef) { this.procDef = procDef; } public ProcessInstance getProcIns() { return procIns; } public void setProcIns(ProcessInstance procIns) { this.procIns = procIns; } public HistoricTaskInstance getHistTask() { return histTask; } public void setHistTask(HistoricTaskInstance histTask) { this.histTask = histTask; } public HistoricActivityInstance getHistIns() { return histIns; } public void setHistIns(HistoricActivityInstance histIns) { this.histIns = histIns; } public String getAssignee() { return assignee; } public void setAssignee(String assignee) { this.assignee = assignee; } public String getAssigneeName() { return assigneeName; } public void setAssigneeName(String assigneeName) { this.assigneeName = assigneeName; } public Variable getVars() { return vars; } public void setVars(Variable vars) { this.vars = vars; } public Variable getTaskVars() { return taskVars; } public void setTaskVars(Variable taskVars) { this.taskVars = taskVars; } public Date getBeginDate() { return beginDate; } public void setBeginDate(Date beginDate) { this.beginDate = beginDate; } public Date getEndDate() { return endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } public List getList() { return list; } public void setList(List list) { this.list = list; } } ================================================ FILE: src/main/java/me/zbl/activity/domain/SalaryDO.java ================================================ package me.zbl.activity.domain; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; /** * 审批流程测试表 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-11-25 13:28:58 */ public class SalaryDO extends TaskDO implements Serializable { private static final long serialVersionUID = 1L; //编号 private String id; //流程实例ID private String procInsId; //变动用户 private String userId; //归属部门 private String officeId; //岗位 private String post; //性别 private String age; //学历 private String edu; //调整原因 private String content; //现行标准 薪酬档级 private String olda; //现行标准 月工资额 private String oldb; //现行标准 年薪总额 private String oldc; //调整后标准 薪酬档级 private String newa; //调整后标准 月工资额 private String newb; //调整后标准 年薪总额 private String newc; //月增资 private String addNum; //执行时间 private String exeDate; //人力资源部门意见 private String hrText; //分管领导意见 private String leadText; //集团主要领导意见 private String mainLeadText; //创建者 private String createBy; //创建时间 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date createDate; //更新者 private String updateBy; //更新时间 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date updateDate; //备注信息 private String remarks; //删除标记 private String delFlag; /** * 获取:编号 */ public String getId() { return id; } /** * 设置:编号 */ public void setId(String id) { this.id = id; } /** * 获取:流程实例ID */ public String getProcInsId() { return procInsId; } /** * 设置:流程实例ID */ public void setProcInsId(String procInsId) { this.procInsId = procInsId; } /** * 获取:变动用户 */ public String getUserId() { return userId; } /** * 设置:变动用户 */ public void setUserId(String userId) { this.userId = userId; } /** * 获取:归属部门 */ public String getOfficeId() { return officeId; } /** * 设置:归属部门 */ public void setOfficeId(String officeId) { this.officeId = officeId; } /** * 获取:岗位 */ public String getPost() { return post; } /** * 设置:岗位 */ public void setPost(String post) { this.post = post; } /** * 获取:性别 */ public String getAge() { return age; } /** * 设置:性别 */ public void setAge(String age) { this.age = age; } /** * 获取:学历 */ public String getEdu() { return edu; } /** * 设置:学历 */ public void setEdu(String edu) { this.edu = edu; } /** * 获取:调整原因 */ public String getContent() { return content; } /** * 设置:调整原因 */ public void setContent(String content) { this.content = content; } /** * 获取:现行标准 薪酬档级 */ public String getOlda() { return olda; } /** * 设置:现行标准 薪酬档级 */ public void setOlda(String olda) { this.olda = olda; } /** * 获取:现行标准 月工资额 */ public String getOldb() { return oldb; } /** * 设置:现行标准 月工资额 */ public void setOldb(String oldb) { this.oldb = oldb; } /** * 获取:现行标准 年薪总额 */ public String getOldc() { return oldc; } /** * 设置:现行标准 年薪总额 */ public void setOldc(String oldc) { this.oldc = oldc; } /** * 获取:调整后标准 薪酬档级 */ public String getNewa() { return newa; } /** * 设置:调整后标准 薪酬档级 */ public void setNewa(String newa) { this.newa = newa; } /** * 获取:调整后标准 月工资额 */ public String getNewb() { return newb; } /** * 设置:调整后标准 月工资额 */ public void setNewb(String newb) { this.newb = newb; } /** * 获取:调整后标准 年薪总额 */ public String getNewc() { return newc; } /** * 设置:调整后标准 年薪总额 */ public void setNewc(String newc) { this.newc = newc; } /** * 获取:月增资 */ public String getAddNum() { return addNum; } /** * 设置:月增资 */ public void setAddNum(String addNum) { this.addNum = addNum; } /** * 获取:执行时间 */ public String getExeDate() { return exeDate; } /** * 设置:执行时间 */ public void setExeDate(String exeDate) { this.exeDate = exeDate; } /** * 获取:人力资源部门意见 */ public String getHrText() { return hrText; } /** * 设置:人力资源部门意见 */ public void setHrText(String hrText) { this.hrText = hrText; } /** * 获取:分管领导意见 */ public String getLeadText() { return leadText; } /** * 设置:分管领导意见 */ public void setLeadText(String leadText) { this.leadText = leadText; } /** * 获取:集团主要领导意见 */ public String getMainLeadText() { return mainLeadText; } /** * 设置:集团主要领导意见 */ public void setMainLeadText(String mainLeadText) { this.mainLeadText = mainLeadText; } /** * 获取:创建者 */ public String getCreateBy() { return createBy; } /** * 设置:创建者 */ public void setCreateBy(String createBy) { this.createBy = createBy; } /** * 获取:创建时间 */ public Date getCreateDate() { return createDate; } /** * 设置:创建时间 */ public void setCreateDate(Date createDate) { this.createDate = createDate; } /** * 获取:更新者 */ public String getUpdateBy() { return updateBy; } /** * 设置:更新者 */ public void setUpdateBy(String updateBy) { this.updateBy = updateBy; } /** * 获取:更新时间 */ public Date getUpdateDate() { return updateDate; } /** * 设置:更新时间 */ public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } /** * 获取:备注信息 */ public String getRemarks() { return remarks; } /** * 设置:备注信息 */ public void setRemarks(String remarks) { this.remarks = remarks; } /** * 获取:删除标记 */ public String getDelFlag() { return delFlag; } /** * 设置:删除标记 */ public void setDelFlag(String delFlag) { this.delFlag = delFlag; } } ================================================ FILE: src/main/java/me/zbl/activity/domain/TaskDO.java ================================================ package me.zbl.activity.domain; import java.util.Map; /** * @author 郑保乐 */ public class TaskDO { private String taskId; private String taskComment; private String taskPass; private Map vars; public String getTaskId() { return taskId; } public void setTaskId(String taskId) { this.taskId = taskId; } public String getTaskComment() { return taskComment; } public void setTaskComment(String taskComment) { this.taskComment = taskComment; } public String getTaskPass() { return taskPass; } public void setTaskPass(String taskPass) { this.taskPass = taskPass; } public Map getVars() { return vars; } public void setVars(Map vars) { this.vars = vars; } } ================================================ FILE: src/main/java/me/zbl/activity/domain/Variable.java ================================================ package me.zbl.activity.domain; /** * */ public class Variable { private String keys; private String values; private String types; public String getKeys() { return keys; } public void setKeys(String keys) { this.keys = keys; } public String getValues() { return values; } public void setValues(String values) { this.values = values; } public String getTypes() { return types; } public void setTypes(String types) { this.types = types; } } ================================================ FILE: src/main/java/me/zbl/activity/service/ActTaskService.java ================================================ package me.zbl.activity.service; import me.zbl.activity.domain.ActivitiDO; import java.io.InputStream; import java.util.List; import java.util.Map; /** */ public interface ActTaskService { List listTodo(ActivitiDO act); void complete(String taskId, String procInsId, String comment, String title, Map vars); void complete(String taskId, Map vars); String startProcess(String procDefKey, String businessTable, String businessId, String title, Map vars); String getFormKey(String procDefId, String taskDefKey); InputStream tracePhoto(String processDefinitionId, String executionId); } ================================================ FILE: src/main/java/me/zbl/activity/service/ProcessService.java ================================================ package me.zbl.activity.service; import org.activiti.engine.repository.Model; import org.springframework.stereotype.Service; import java.io.InputStream; /** */ @Service public interface ProcessService { Model convertToModel(String procDefId) throws Exception; InputStream resourceRead(String id, String resType) throws Exception; } ================================================ FILE: src/main/java/me/zbl/activity/service/SalaryService.java ================================================ package me.zbl.activity.service; import me.zbl.activity.domain.SalaryDO; import java.util.List; import java.util.Map; /** * 审批流程测试表 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-11-25 13:33:16 */ public interface SalaryService { SalaryDO get(String id); List list(Map map); int count(Map map); int save(SalaryDO salary); int update(SalaryDO salary); int remove(String id); int batchRemove(String[] ids); } ================================================ FILE: src/main/java/me/zbl/activity/service/impl/ActTaskServiceImpl.java ================================================ package me.zbl.activity.service.impl; import me.zbl.activity.domain.ActivitiDO; import me.zbl.activity.service.ActTaskService; import me.zbl.common.utils.ShiroUtils; import me.zbl.common.utils.StringUtils; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.*; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.impl.RepositoryServiceImpl; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.activiti.engine.impl.pvm.PvmTransition; import org.activiti.engine.impl.pvm.process.ActivityImpl; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.image.ProcessDiagramGenerator; import org.activiti.spring.ProcessEngineFactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * */ @Service public class ActTaskServiceImpl implements ActTaskService { @Autowired TaskService taskService; @Autowired IdentityService identityService; @Autowired RuntimeService runtimeService; @Autowired FormService formService; @Autowired RepositoryService repositoryService; @Autowired private ProcessEngineFactoryBean processEngineFactory; @Autowired private ProcessEngine processEngine; @Autowired private HistoryService historyService; @Override public List listTodo(ActivitiDO act) { String userId = String.valueOf(ShiroUtils.getUserId()); List result = new ArrayList(); return result; } /** * 提交任务, 并保存意见 * * @param taskId 任务ID * @param procInsId 流程实例ID,如果为空,则不保存任务提交意见 * @param comment 任务提交意见的内容 * @param title 流程标题,显示在待办任务标题 * @param vars 任务变量 */ @Override public void complete(String taskId, String procInsId, String comment, String title, Map vars) { // 添加意见 if (StringUtils.isNotBlank(procInsId) && StringUtils.isNotBlank(comment)) { taskService.addComment(taskId, procInsId, comment); } // 设置流程变量 if (vars == null) { vars = new HashMap<>(); } // 设置流程标题 if (StringUtils.isNotBlank(title)) { vars.put("title", title); } // 提交任务 taskService.complete(taskId, vars); } @Override public void complete(String taskId, Map vars) { // 2.1根据人物ID查询流程实力ID Task task = taskService.createTaskQuery() .taskId(taskId).singleResult(); // 获取流程实例ID String processInstance = task.getProcessInstanceId(); // 2.2根据流程实例ID,人物ID,评论的消息,保存教师或者学术对与该学生申请的评论信息 // taskService.addComment(taskId, // processInstance, ""); // Map vars = new HashMap<>(); // vars.put("pass", "1" ); // vars.put("title",""); taskService.complete(taskId, vars); } /** * 启动流程 * * @param procDefKey 流程定义KEY * @param businessTable 业务表表名 * @param businessId 业务表编号 * @param title 流程标题,显示在待办任务标题 * @param vars 流程变量 * * @return 流程实例ID */ @Override public String startProcess(String procDefKey, String businessTable, String businessId, String title, Map vars) { String userId = ShiroUtils.getUser().getUsername();//ObjectUtils.toString(UserUtils.getUser().getId()) // 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中 identityService.setAuthenticatedUserId(userId); // 设置流程变量 if (vars == null) { vars = new HashMap(); } // 设置流程标题 if (StringUtils.isNotBlank(title)) { vars.put("title", title); } // 启动流程 ProcessInstance procIns = runtimeService.startProcessInstanceByKey(procDefKey, businessId, vars); return null; } /** * 获取流程表单(首先获取任务节点表单KEY,如果没有则取流程开始节点表单KEY) * * @return */ @Override public String getFormKey(String procDefId, String taskDefKey) { String formKey = ""; if (StringUtils.isNotBlank(procDefId)) { if (StringUtils.isNotBlank(taskDefKey)) { try { formKey = formService.getTaskFormKey(procDefId, taskDefKey); } catch (Exception e) { formKey = ""; } } if (StringUtils.isBlank(formKey)) { formKey = formService.getStartFormKey(procDefId); } if (StringUtils.isBlank(formKey)) { formKey = "/404"; } } return formKey; } @Override public InputStream tracePhoto(String xx, String pProcessInstanceId) { //// ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(executionId).singleResult(); // BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); // // List activeActivityIds = new ArrayList(); // if (runtimeService.createExecutionQuery().executionId(executionId).count() > 0){ // activeActivityIds = runtimeService.getActiveActivityIds(executionId); // } // // // 不使用spring请使用下面的两行代码 // // ProcessEngineImpl defaultProcessEngine = (ProcessEngineImpl)ProcessEngines.getDefaultProcessEngine(); // // Context.setProcessEngineConfiguration(defaultProcessEngine.getProcessEngineConfiguration()); // // // 使用spring注入引擎请使用下面的这行代码 // Context.setProcessEngineConfiguration(processEngineFactory.getProcessEngineConfiguration()); //// return ProcessDiagramGenerator.generateDiagram(bpmnModel, "png", activeActivityIds); // return processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator() // .generateDiagram(bpmnModel, "png", activeActivityIds); // 获取历史流程实例 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(pProcessInstanceId).singleResult(); if (historicProcessInstance != null) { // 获取流程定义 ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService) .getDeployedProcessDefinition(historicProcessInstance.getProcessDefinitionId()); // 获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序 List historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery() .processInstanceId(pProcessInstanceId).orderByHistoricActivityInstanceId().asc().list(); // 已执行的节点ID集合 List executedActivityIdList = new ArrayList(); int index = 1; //获取已经执行的节点ID for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { executedActivityIdList.add(activityInstance.getActivityId()); index++; } // 已执行的线集合 List flowIds = new ArrayList(); // 获取流程走过的线 flowIds = getHighLightedFlows(processDefinition, historicActivityInstanceList); BpmnModel bpmnModel = repositoryService .getBpmnModel(historicProcessInstance.getProcessDefinitionId()); // 获取流程图图像字符流 ProcessDiagramGenerator pec = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator(); //配置字体 InputStream imageStream = pec.generateDiagram(bpmnModel, "png", executedActivityIdList, flowIds, "宋体", "微软雅黑", "黑体", null, 2.0); return imageStream; } return null; } /** * 获取需要高亮的线 * * @param processDefinitionEntity * @param historicActivityInstances * * @return */ private List getHighLightedFlows( ProcessDefinitionEntity processDefinitionEntity, List historicActivityInstances) { List highFlows = new ArrayList();// 用以保存高亮的线flowId for (int i = 0; i < historicActivityInstances.size() - 1; i++) {// 对历史流程节点进行遍历 ActivityImpl activityImpl = processDefinitionEntity .findActivity(historicActivityInstances.get(i) .getActivityId());// 得到节点定义的详细信息 List sameStartTimeNodes = new ArrayList();// 用以保存后需开始时间相同的节点 ActivityImpl sameActivityImpl1 = processDefinitionEntity .findActivity(historicActivityInstances.get(i + 1) .getActivityId()); // 将后面第一个节点放在时间相同节点的集合里 sameStartTimeNodes.add(sameActivityImpl1); for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) { HistoricActivityInstance activityImpl1 = historicActivityInstances .get(j);// 后续第一个节点 HistoricActivityInstance activityImpl2 = historicActivityInstances .get(j + 1);// 后续第二个节点 if (activityImpl1.getStartTime().equals( activityImpl2.getStartTime())) { // 如果第一个节点和第二个节点开始时间相同保存 ActivityImpl sameActivityImpl2 = processDefinitionEntity .findActivity(activityImpl2.getActivityId()); sameStartTimeNodes.add(sameActivityImpl2); } else { // 有不相同跳出循环 break; } } List pvmTransitions = activityImpl .getOutgoingTransitions();// 取出节点的所有出去的线 for (PvmTransition pvmTransition : pvmTransitions) { // 对所有的线进行遍历 ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition .getDestination(); // 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示 if (sameStartTimeNodes.contains(pvmActivityImpl)) { highFlows.add(pvmTransition.getId()); } } } return highFlows; } } ================================================ FILE: src/main/java/me/zbl/activity/service/impl/ProcessServiceImpl.java ================================================ package me.zbl.activity.service.impl; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import me.zbl.activity.service.ProcessService; import org.activiti.bpmn.converter.BpmnXMLConverter; import org.activiti.bpmn.model.BpmnModel; import org.activiti.editor.constants.ModelDataJsonConstants; import org.activiti.editor.language.json.converter.BpmnJsonConverter; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.repository.Model; import org.activiti.engine.repository.ProcessDefinition; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import java.io.InputStream; import java.io.InputStreamReader; /** */ @Service public class ProcessServiceImpl implements ProcessService { @Autowired RepositoryService repositoryService; @Autowired RuntimeService runtimeService; @Override public Model convertToModel(String procDefId) throws Exception { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(procDefId).singleResult(); InputStream bpmnStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName()); XMLInputFactory xif = XMLInputFactory.newInstance(); InputStreamReader in = new InputStreamReader(bpmnStream, "UTF-8"); XMLStreamReader xtr = xif.createXMLStreamReader(in); BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xtr); BpmnJsonConverter converter = new BpmnJsonConverter(); ObjectNode modelNode = converter.convertToJson(bpmnModel); org.activiti.engine.repository.Model modelData = repositoryService.newModel(); modelData.setKey(processDefinition.getKey()); modelData.setName(processDefinition.getResourceName()); modelData.setCategory(processDefinition.getCategory());//.getDeploymentId()); modelData.setDeploymentId(processDefinition.getDeploymentId()); modelData.setVersion(Integer.parseInt(String.valueOf(repositoryService.createModelQuery().modelKey(modelData.getKey()).count() + 1))); ObjectNode modelObjectNode = new ObjectMapper().createObjectNode(); modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, processDefinition.getName()); modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, modelData.getVersion()); modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, processDefinition.getDescription()); modelData.setMetaInfo(modelObjectNode.toString()); repositoryService.saveModel(modelData); repositoryService.addModelEditorSource(modelData.getId(), modelNode.toString().getBytes("utf-8")); return modelData; } @Override public InputStream resourceRead(String id, String resType) { ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(id).singleResult(); String resourceName = ""; if (resType.equals("image")) { resourceName = processDefinition.getDiagramResourceName(); } else if (resType.equals("xml")) { resourceName = processDefinition.getResourceName(); } InputStream resourceAsStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), resourceName); return resourceAsStream; } } ================================================ FILE: src/main/java/me/zbl/activity/service/impl/SalaryServiceImpl.java ================================================ package me.zbl.activity.service.impl; import me.zbl.activity.config.ActivitiConstant; import me.zbl.activity.dao.SalaryDao; import me.zbl.activity.domain.SalaryDO; import me.zbl.activity.service.SalaryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; @Service public class SalaryServiceImpl implements SalaryService { @Autowired private SalaryDao salaryDao; @Autowired private ActTaskServiceImpl actTaskService; @Override public SalaryDO get(String id) { return salaryDao.get(id); } @Override public List list(Map map) { return salaryDao.list(map); } @Override public int count(Map map) { return salaryDao.count(map); } @Transactional(rollbackFor = Exception.class) @Override public int save(SalaryDO salary) { salary.setId(UUID.randomUUID().toString().replace("-", "")); actTaskService.startProcess(ActivitiConstant.ACTIVITI_SALARY[0], ActivitiConstant.ACTIVITI_SALARY[1], salary.getId(), salary.getContent(), new HashMap<>()); return salaryDao.save(salary); } @Transactional(rollbackFor = Exception.class) @Override public int update(SalaryDO salary) { Map vars = new HashMap<>(16); vars.put("pass", salary.getTaskPass()); vars.put("title", ""); actTaskService.complete(salary.getTaskId(), vars); return salaryDao.update(salary); } @Override public int remove(String id) { return salaryDao.remove(id); } @Override public int batchRemove(String[] ids) { return salaryDao.batchRemove(ids); } } ================================================ FILE: src/main/java/me/zbl/activity/utils/ActivitiUtils.java ================================================ package me.zbl.activity.utils; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** */ @Component public class ActivitiUtils { /** * 根据taskId查找businessKey */ @Autowired TaskService taskService; @Autowired RuntimeService runtimeService; public String getBusinessKeyByTaskId(String taskId) { Task task = taskService .createTaskQuery() .taskId(taskId) .singleResult(); ProcessInstance pi = runtimeService .createProcessInstanceQuery() .processInstanceId(task.getProcessInstanceId()) .singleResult(); return pi.getBusinessKey(); } public Task getTaskByTaskId(String taskId) { Task task = taskService .createTaskQuery() .taskId(taskId) .singleResult(); return task; } } ================================================ FILE: src/main/java/me/zbl/activity/vo/DeploymentResponse.java ================================================ package me.zbl.activity.vo; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.activiti.engine.repository.Deployment; import org.activiti.rest.common.util.DateToStringSerializer; import java.util.Date; public class DeploymentResponse { private String id; private String name; @JsonSerialize(using = DateToStringSerializer.class, as = Date.class) private Date deploymentTime; private String category; private String tenantId; public DeploymentResponse(Deployment deployment) { setId(deployment.getId()); setName(deployment.getName()); setDeploymentTime(deployment.getDeploymentTime()); setCategory(deployment.getCategory()); setTenantId(deployment.getTenantId()); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getDeploymentTime() { return deploymentTime; } public void setDeploymentTime(Date deploymentTime) { this.deploymentTime = deploymentTime; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getTenantId() { return tenantId; } public void setTenantId(String tenantId) { this.tenantId = tenantId; } } ================================================ FILE: src/main/java/me/zbl/activity/vo/ProcessVO.java ================================================ package me.zbl.activity.vo; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.ProcessDefinition; public class ProcessVO { private String id; private String name; private String deploymentId; public ProcessVO(Deployment processDefinition) { this.setId(processDefinition.getId()); this.name = processDefinition.getName(); } public ProcessVO(ProcessDefinition processDefinition) { this.setId(processDefinition.getId()); this.name = processDefinition.getName(); this.deploymentId = processDefinition.getDeploymentId(); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDeploymentId() { return deploymentId; } public void setDeploymentId(String deploymentId) { this.deploymentId = deploymentId; } } ================================================ FILE: src/main/java/me/zbl/activity/vo/TaskVO.java ================================================ package me.zbl.activity.vo; import org.activiti.engine.task.Task; /** */ public class TaskVO { private String id; private String name; private String key; private String description; private String formKey; private String assignee; private String processId; private String processDefinitionId; private String executionId; public TaskVO(Task task) { this.setId(task.getId()); this.setKey(task.getTaskDefinitionKey()); this.setName(task.getName()); this.setDescription(task.getDescription()); this.setAssignee(task.getAssignee()); this.setFormKey(task.getFormKey()); this.setProcessId(task.getProcessInstanceId()); this.setProcessDefinitionId(task.getProcessDefinitionId()); this.setExecutionId(task.getExecutionId()); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getFormKey() { return formKey; } public void setFormKey(String formKey) { this.formKey = formKey; } public String getAssignee() { return assignee; } public void setAssignee(String assignee) { this.assignee = assignee; } public String getProcessId() { return processId; } public void setProcessId(String processId) { this.processId = processId; } public String getProcessDefinitionId() { return processDefinitionId; } public void setProcessDefinitionId(String processDefinitionId) { this.processDefinitionId = processDefinitionId; } public String getExecutionId() { return executionId; } public void setExecutionId(String executionId) { this.executionId = executionId; } } ================================================ FILE: src/main/java/me/zbl/app/controller/ConsumerController.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.controller; import me.zbl.app.domain.Consumer; import me.zbl.app.service.ConsumerService; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 顾客管理 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-19 */ @Controller public class ConsumerController { @Autowired private ConsumerService consumerService; @GetMapping("/consumer/index") public String index() { return "app/data-maintenance/consumer/index"; } @GetMapping("/consumer/add") public String add() { return "app/data-maintenance/consumer/add"; } @GetMapping("/consumer/edit/{id}") public String edit(@PathVariable("id") String id, Model model) { Consumer find = consumerService.selectByPrimaryKey(id); model.addAttribute("consumer", find); return "app/data-maintenance/consumer/edit"; } /** * 顾客列表 */ @GetMapping("/consumer/list") @ResponseBody public PageWrapper list(@RequestParam Map params) { Query query = new Query(params); List consumers = consumerService.selectAllConsumer(query); return new PageWrapper(consumers, consumerService.count()); } /** * 顾客保存 */ @PostMapping("/consumer/save") @ResponseBody public R save(Consumer consumer) { try { consumerService.insertConsumer(consumer); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } /** * 顾客更新 */ @PutMapping("/consumer/save") @ResponseBody public R saveUpdate(Consumer consumer) { try { consumerService.updateConsumer(consumer); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } /** * 顾客删除 */ @DeleteMapping("/consumer/remove/{id}") @ResponseBody public R remove(@PathVariable("id") String id) { try { consumerService.deleteConsumer(id); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } /** * 下拉选择顾客 */ @GetMapping("/consumer/search") @ResponseBody public Map search(@RequestParam("q") String name) { Map entity = new HashMap<>(); List consumers = consumerService.searchByName(name); List> results = new ArrayList<>(); consumers.forEach(c -> { Map item = new HashMap<>(); item.put("id", c.getId()); item.put("text", c.getName() + '-' + c.getTel()); results.add(item); }); entity.put("results", results); return entity; } } ================================================ FILE: src/main/java/me/zbl/app/controller/DrugController.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.controller; import me.zbl.app.domain.Drug; import me.zbl.app.domain.DrugDO; import me.zbl.app.service.DrugService; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-19 */ @Controller public class DrugController { @Autowired DrugService drugService; @GetMapping("/drug/index") public String index() { return "app/data-maintenance/drug/index"; } @GetMapping("/drug/add") public String add() { return "app/data-maintenance/drug/add"; } @GetMapping("/drug/edit/{id}") public String edit(@PathVariable("id") String id, Model model) { Drug find = drugService.selectDrugByPrimaryKey(id); model.addAttribute("drug", find); return "app/data-maintenance/drug/edit"; } @DeleteMapping("/drug/remove/{id}") @ResponseBody public R remove(@PathVariable("id") String id) { try { drugService.deleteDrug(id); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } @GetMapping("/drug/list") @ResponseBody public PageWrapper list(@RequestParam Map params) { Query query = new Query(params); List drugs = drugService.selectAllDrug(query); return new PageWrapper(drugs, drugService.count()); } @PostMapping("/drug/save") @ResponseBody public R save(Drug drug) { try { drugService.insertDrug(drug); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } @PutMapping("/drug/save") @ResponseBody public R saveEdit(Drug drug) { try { drugService.updateDrug(drug); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } } ================================================ FILE: src/main/java/me/zbl/app/controller/DrugInController.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.controller; import me.zbl.app.domain.DrugInDO; import me.zbl.app.domain.DrugInFormDO; import me.zbl.app.service.DrugInService; import me.zbl.common.controller.BaseController; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import java.util.Map; /** * 药品入库 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-07 */ @Controller public class DrugInController extends BaseController { @Autowired private DrugInService service; /** * 药品入库页面 */ @GetMapping("/inventory/drugin") public String drugInPage() { return "app/inventory/drug-in/drug-in"; } /** * 药品入库登记 */ @GetMapping("/inventory/add") public String drugInAddPage() { return "app/inventory/drug-in/add"; } /** * 入库记录列表 * * @param params 查询参数 */ @ResponseBody @GetMapping("/inventory/list") public PageWrapper list(@RequestParam Map params) { Query query = new Query(params); List list = service.list(query); return new PageWrapper(list, service.count()); } /** * 入库记录保存 * * @param params 参数 */ @ResponseBody @PostMapping("/inventory/drugin/save") public R save(DrugInFormDO params) { // 经办人姓名取当前用户的用户名 String username = getUser().getName(); params.setManager(username); try { service.drugInSave(params); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } } ================================================ FILE: src/main/java/me/zbl/app/controller/DrugOutController.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.controller; import me.zbl.app.domain.DrugOutDO; import me.zbl.app.domain.DrugOutFormDO; import me.zbl.app.service.DrugOutService; import me.zbl.common.controller.BaseController; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import java.util.Map; /** * 药品出库 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-08 */ @Controller public class DrugOutController extends BaseController { @Autowired private DrugOutService service; /** * 药品出库页面 */ @GetMapping("/inventory/drugout") public String drugOutPage() { return "app/inventory/drug-out/drug-out"; } /** * 药品出库登记 */ @GetMapping("/inventory/out") public String drugOutAddPage() { return "app/inventory/drug-out/out"; } /** * 出库记录列表 * * @param params 查询参数 */ @ResponseBody @GetMapping("/inventory/listout") public PageWrapper list(@RequestParam Map params) { Query query = new Query(params); List list = service.list(query); return new PageWrapper(list, service.count()); } /** * 出库记录保存 * * @param params 参数 */ @ResponseBody @PostMapping("/inventory/drugout/save") public R save(DrugOutFormDO params) { // 经办人姓名取当前用户的用户名 String username = getUser().getName(); params.setManager(username); // 保存出库记录 try { service.drugOutSave(params); } catch (IllegalArgumentException e) { e.printStackTrace(); return R.error(1, e.getMessage()); } // 检查库存下限 service.checkLowerLimit(); return R.ok(); } } ================================================ FILE: src/main/java/me/zbl/app/controller/SaleController.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.controller; import me.zbl.app.domain.BackFormDO; import me.zbl.app.domain.DrugOutFormDO; import me.zbl.app.domain.SaleDO; import me.zbl.app.service.DrugInService; import me.zbl.app.service.DrugOutService; import me.zbl.common.controller.BaseController; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import java.util.Map; /** * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-23 */ @Controller public class SaleController extends BaseController { @Autowired private DrugOutService drugOutService; @Autowired DrugInService drugInService; @GetMapping("/sale/index") public String index() { return "app/sale/index"; } @GetMapping("/sale/add") public String add() { return "app/sale/add"; } @GetMapping("/sale/back") public String back() { return "app/sale/back"; } @GetMapping("/sta/index") public String statistics() { return "app/statistics/index"; } @GetMapping("/sale_detail/index") public String saleDetail() { return "app/sale-detail/index"; } @GetMapping("/sale/list") @ResponseBody public PageWrapper list(@RequestParam Map params) { Query query = new Query(params); List list = drugOutService.saleList(query); return new PageWrapper(list, drugOutService.countSale()); } @PostMapping("/sale/save") @ResponseBody public R saleSave(DrugOutFormDO drugOutFormDO) { drugOutFormDO.setManager(getUser().getName()); try { drugOutService.saleSave(drugOutFormDO); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } // 检查库存下限 drugOutService.checkLowerLimit(); return R.ok(); } @PostMapping("/sale/back") @ResponseBody public R saleBackSave(BackFormDO backFormDO) { backFormDO.setManager(getUser().getName()); try { drugInService.back(backFormDO); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } @GetMapping("/sale/sta_sale_day") @ResponseBody public Object staSaleDay() { return drugOutService.staSaleDay(); } @GetMapping("/sale/sta_sale_month") @ResponseBody public Object staSaleMonth() { return drugOutService.staSaleMonth(); } @GetMapping("/sale/sta_sale_year") @ResponseBody public Object staSaleYear() { return drugOutService.staSaleYear(); } } ================================================ FILE: src/main/java/me/zbl/app/controller/SupplierController.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.controller; import me.zbl.app.domain.Supplier; import me.zbl.app.service.SupplierService; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * 供应商数据维护 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-17 */ @Controller public class SupplierController { @Autowired SupplierService supplierService; @GetMapping("/supplier/index") public String index() { return "app/data-maintenance/supplier/index"; } @GetMapping("/supplier/add") public String add() { return "app/data-maintenance/supplier/add"; } @GetMapping("/supplier/edit/{id}") public String edit(@PathVariable("id") String id, Model model) { Supplier find = supplierService.selectByPrimaryKey(id); model.addAttribute("supplier", find); return "app/data-maintenance/supplier/edit"; } /** * 供应商列表 */ @GetMapping("/supplier/list") @ResponseBody public PageWrapper list(@RequestParam Map params) { Query query = new Query(params); List list = supplierService.selectAllSupplier(query); return new PageWrapper(list, supplierService.count()); } /** * 供应商保存 */ @PostMapping("/supplier/save") @ResponseBody public R save(Supplier supplier) { try { supplierService.insertSupplier(supplier); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } @PutMapping("/supplier/save") @ResponseBody public R saveUpdate(Supplier supplier) { try { supplierService.updateSupplier(supplier); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } @DeleteMapping("/supplier/remove/{id}") @ResponseBody public R remove(@PathVariable("id") String id) { try { supplierService.deleteSupplier(id); } catch (Exception e) { e.printStackTrace(); return R.error(1, e.getMessage()); } return R.ok(); } } ================================================ FILE: src/main/java/me/zbl/app/dao/ConsumerMapper.java ================================================ package me.zbl.app.dao; import me.zbl.app.domain.Consumer; import java.util.List; import java.util.Map; public interface ConsumerMapper { List selectByName(String name); List selectAllConsumer(Map params); Consumer selectConsumerByTel(String tel); int count(); int deleteByPrimaryKey(String id); int insert(Consumer record); int insertSelective(Consumer record); Consumer selectByPrimaryKey(String id); int updateByPrimaryKeySelective(Consumer record); int updateByPrimaryKey(Consumer record); } ================================================ FILE: src/main/java/me/zbl/app/dao/DrugMapper.java ================================================ package me.zbl.app.dao; import me.zbl.app.domain.Drug; import me.zbl.app.domain.DrugDO; import java.util.Date; import java.util.List; import java.util.Map; public interface DrugMapper { List selectAllDrug(Map params); int count(); List selectOverLowerLimit(); List selectByExpireDate(Date date); int increaseAndDecreaseQuantity(Map params); int deleteByPrimaryKey(String id); int insert(Drug record); int insertSelective(Drug record); Drug selectByPrimaryKey(String id); int updateByPrimaryKeySelective(Drug record); int updateByPrimaryKey(Drug record); } ================================================ FILE: src/main/java/me/zbl/app/dao/ExpireMapper.java ================================================ package me.zbl.app.dao; import me.zbl.app.domain.Expire; import java.util.Date; import java.util.List; public interface ExpireMapper { List selectByDate(Date date); int deleteByPrimaryKey(String id); int insert(Expire record); int insertSelective(Expire record); Expire selectByPrimaryKey(String id); int updateByPrimaryKeySelective(Expire record); int updateByPrimaryKey(Expire record); } ================================================ FILE: src/main/java/me/zbl/app/dao/InventoryMapper.java ================================================ package me.zbl.app.dao; import me.zbl.app.domain.*; import java.util.List; import java.util.Map; public interface InventoryMapper { int saleSave(DrugOutFormDO drugOutFormDO); int drugOutSave(DrugOutFormDO drugOutFormDO); int drugInSave(DrugInFormDO drugInFormDO); List staSaleDay(); List staSaleMonth(); List staSaleYear(); List inList(Map param); List outList(Map param); List saleList(Map param); int deleteByPrimaryKey(String id); int countIn(); int countOut(); int countSale(); int insert(Inventory record); int insertSelective(Inventory record); Inventory selectByPrimaryKey(String id); int updateByPrimaryKeySelective(Inventory record); int updateByPrimaryKey(Inventory record); } ================================================ FILE: src/main/java/me/zbl/app/dao/SupplierMapper.java ================================================ package me.zbl.app.dao; import me.zbl.app.domain.Supplier; import java.util.List; import java.util.Map; public interface SupplierMapper { List selectAllSupplier(Map params); int count(); int deleteByPrimaryKey(String id); int insert(Supplier record); int insertSelective(Supplier record); Supplier selectByPrimaryKey(String id); int updateByPrimaryKeySelective(Supplier record); int updateByPrimaryKey(Supplier record); } ================================================ FILE: src/main/java/me/zbl/app/domain/BackFormDO.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.domain; /** * 退货表单 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-24 */ public class BackFormDO { // 流水号 private String orderId; // 药品是否有问题 private boolean hasProblem; // 退货操作人 private String manager; // 原因备注 private String comment; public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public boolean isHasProblem() { return hasProblem; } public void setHasProblem(boolean hasProblem) { this.hasProblem = hasProblem; } public String getManager() { return manager; } public void setManager(String manager) { this.manager = manager; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } } ================================================ FILE: src/main/java/me/zbl/app/domain/Consumer.java ================================================ package me.zbl.app.domain; public class Consumer { private String id; private String name; private String tel; public String getId() { return id; } public void setId(String id) { this.id = id == null ? null : id.trim(); } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel == null ? null : tel.trim(); } } ================================================ FILE: src/main/java/me/zbl/app/domain/Drug.java ================================================ package me.zbl.app.domain; import java.math.BigDecimal; public class Drug { private String id; private String name; private Integer quantity; private BigDecimal price; private String invalid; private Integer qualityGuaranteePeriod; private Integer lowerLimit; private String supplierId; private String specification; public String getId() { return id; } public void setId(String id) { this.id = id == null ? null : id.trim(); } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public String getInvalid() { return invalid; } public void setInvalid(String invalid) { this.invalid = invalid == null ? null : invalid.trim(); } public Integer getQualityGuaranteePeriod() { return qualityGuaranteePeriod; } public void setQualityGuaranteePeriod(Integer qualityGuaranteePeriod) { this.qualityGuaranteePeriod = qualityGuaranteePeriod; } public Integer getLowerLimit() { return lowerLimit; } public void setLowerLimit(Integer lowerLimit) { this.lowerLimit = lowerLimit; } public String getSupplierId() { return supplierId; } public void setSupplierId(String supplierId) { this.supplierId = supplierId == null ? null : supplierId.trim(); } public String getSpecification() { return specification; } public void setSpecification(String specification) { this.specification = specification == null ? null : specification.trim(); } } ================================================ FILE: src/main/java/me/zbl/app/domain/DrugDO.java ================================================ package me.zbl.app.domain; import java.math.BigDecimal; public class DrugDO { private String id; private String name; private Integer quantity; private BigDecimal price; private String invalid; private Integer qualityGuaranteePeriod; private Integer lowerLimit; private String supplierId; private String specification; private String supplier; public String getId() { return id; } public void setId(String id) { this.id = id == null ? null : id.trim(); } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public String getInvalid() { return invalid; } public void setInvalid(String invalid) { this.invalid = invalid == null ? null : invalid.trim(); } public Integer getQualityGuaranteePeriod() { return qualityGuaranteePeriod; } public void setQualityGuaranteePeriod(Integer qualityGuaranteePeriod) { this.qualityGuaranteePeriod = qualityGuaranteePeriod; } public Integer getLowerLimit() { return lowerLimit; } public void setLowerLimit(Integer lowerLimit) { this.lowerLimit = lowerLimit; } public String getSupplierId() { return supplierId; } public void setSupplierId(String supplierId) { this.supplierId = supplierId == null ? null : supplierId.trim(); } public String getSpecification() { return specification; } public void setSpecification(String specification) { this.specification = specification == null ? null : specification.trim(); } public String getSupplier() { return supplier; } public void setSupplier(String supplier) { this.supplier = supplier; } } ================================================ FILE: src/main/java/me/zbl/app/domain/DrugInDO.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.domain; import java.math.BigDecimal; import java.util.Date; /** * 药品入库列表 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-07 */ public class DrugInDO { // 类型 private String type; // 经办人 private String manager; // 实时库存 private int quantityNow; // 药品编号 private String drugId; // 药品名称 private String drugName; // 单价 private BigDecimal price; // 供应商 private String supplierName; // 规格 private String specification; // 数量 private Integer quantity; // 总金额 private BigDecimal ammount; // 入库时间 private Date gmtCreated; public String getDrugName() { return drugName; } public void setDrugName(String drugName) { this.drugName = drugName; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public String getSupplierName() { return supplierName; } public void setSupplierName(String supplierName) { this.supplierName = supplierName; } public String getSpecification() { return specification; } public void setSpecification(String specification) { this.specification = specification; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public BigDecimal getAmmount() { return ammount; } public void setAmmount(BigDecimal ammount) { this.ammount = ammount; } public Date getGmtCreated() { return gmtCreated; } public void setGmtCreated(Date gmtCreated) { this.gmtCreated = gmtCreated; } public String getDrugId() { return drugId; } public void setDrugId(String drugId) { this.drugId = drugId; } public int getQuantityNow() { return quantityNow; } public void setQuantityNow(int quantityNow) { this.quantityNow = quantityNow; } public String getManager() { return manager; } public void setManager(String manager) { this.manager = manager; } public String getType() { return type; } public void setType(String type) { this.type = type; } } ================================================ FILE: src/main/java/me/zbl/app/domain/DrugInFormDO.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.domain; import org.springframework.data.annotation.Transient; import java.util.Date; /** * 入库登记表单 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-07 */ public class DrugInFormDO { private String id; // 生产日期 @Transient private Date madeDate; // 药品 id private String drugId; // 入库数量 private int quantity; // 经办人 private String manager; // 总金额 private float ammount; public String getDrugId() { return drugId; } public void setDrugId(String drugId) { this.drugId = drugId; } public int getQuantity() { return quantity; } public void setQuantity(int quantity) { this.quantity = quantity; } public String getManager() { return manager; } public void setManager(String manager) { this.manager = manager; } public float getAmmount() { return ammount; } public void setAmmount(float ammount) { this.ammount = ammount; } public String getId() { return id; } public void setId(String id) { this.id = id; } public Date getMadeDate() { return madeDate; } public void setMadeDate(Date madeDate) { this.madeDate = madeDate; } } ================================================ FILE: src/main/java/me/zbl/app/domain/DrugOutDO.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.domain; import java.math.BigDecimal; import java.util.Date; /** * 药品入库列表 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-07 */ public class DrugOutDO { // 原因备注 private String comment; // 类型 private String type; // 经办人 private String manager; // 实时库存 private int quantityNow; // 药品编号 private String drugId; // 药品名称 private String drugName; // 单价 private BigDecimal price; // 供应商 private String supplierName; // 规格 private String specification; // 数量 private Integer quantity; // 总金额 private BigDecimal ammount; // 入库时间 private Date gmtCreated; public String getDrugName() { return drugName; } public void setDrugName(String drugName) { this.drugName = drugName; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public String getSupplierName() { return supplierName; } public void setSupplierName(String supplierName) { this.supplierName = supplierName; } public String getSpecification() { return specification; } public void setSpecification(String specification) { this.specification = specification; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public BigDecimal getAmmount() { return ammount; } public void setAmmount(BigDecimal ammount) { this.ammount = ammount; } public Date getGmtCreated() { return gmtCreated; } public void setGmtCreated(Date gmtCreated) { this.gmtCreated = gmtCreated; } public String getDrugId() { return drugId; } public void setDrugId(String drugId) { this.drugId = drugId; } public int getQuantityNow() { return quantityNow; } public void setQuantityNow(int quantityNow) { this.quantityNow = quantityNow; } public String getManager() { return manager; } public void setManager(String manager) { this.manager = manager; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } } ================================================ FILE: src/main/java/me/zbl/app/domain/DrugOutFormDO.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.domain; /** * 出库登记表单 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-07 */ public class DrugOutFormDO { private String id; // 药品 id private String drugId; // 出库数量 private int quantity; // 原因备注 private String comment; // 经办人 private String manager; // 总金额 private float ammount; // 顾客 id private String consumer; public String getDrugId() { return drugId; } public void setDrugId(String drugId) { this.drugId = drugId; } public int getQuantity() { return quantity; } public void setQuantity(int quantity) { this.quantity = quantity; } public String getManager() { return manager; } public void setManager(String manager) { this.manager = manager; } public float getAmmount() { return ammount; } public void setAmmount(float ammount) { this.ammount = ammount; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public String getConsumer() { return consumer; } public void setConsumer(String consumer) { this.consumer = consumer; } } ================================================ FILE: src/main/java/me/zbl/app/domain/Expire.java ================================================ package me.zbl.app.domain; import java.util.Date; public class Expire { private String id; private String drugId; private Date expiredDate; public String getId() { return id; } public void setId(String id) { this.id = id == null ? null : id.trim(); } public String getDrugId() { return drugId; } public void setDrugId(String drugId) { this.drugId = drugId == null ? null : drugId.trim(); } public Date getExpiredDate() { return expiredDate; } public void setExpiredDate(Date expiredDate) { this.expiredDate = expiredDate; } } ================================================ FILE: src/main/java/me/zbl/app/domain/Inventory.java ================================================ package me.zbl.app.domain; import java.math.BigDecimal; import java.util.Date; public class Inventory { private String id; private String consumerId; private String drugId; private String type; private Integer quantity; private BigDecimal ammount; private String comment; private String manager; private Date gmtCreated; private Date gmtModified; public String getId() { return id; } public void setId(String id) { this.id = id == null ? null : id.trim(); } public String getConsumerId() { return consumerId; } public void setConsumerId(String consumerId) { this.consumerId = consumerId == null ? null : consumerId.trim(); } public String getDrugId() { return drugId; } public void setDrugId(String drugId) { this.drugId = drugId == null ? null : drugId.trim(); } public String getType() { return type; } public void setType(String type) { this.type = type == null ? null : type.trim(); } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public BigDecimal getAmmount() { return ammount; } public void setAmmount(BigDecimal ammount) { this.ammount = ammount; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment == null ? null : comment.trim(); } public String getManager() { return manager; } public void setManager(String manager) { this.manager = manager == null ? null : manager.trim(); } public Date getGmtCreated() { return gmtCreated; } public void setGmtCreated(Date gmtCreated) { this.gmtCreated = gmtCreated; } public Date getGmtModified() { return gmtModified; } public void setGmtModified(Date gmtModified) { this.gmtModified = gmtModified; } } ================================================ FILE: src/main/java/me/zbl/app/domain/SaleDO.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.domain; import java.math.BigDecimal; import java.util.Date; /** * 药品入库列表 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-07 */ public class SaleDO { // 订单编号 private String orderId; // 原因备注 private String comment; // 类型 private String type; // 经办人 private String manager; // 实时库存 private int quantityNow; // 药品编号 private String drugId; // 药品名称 private String drugName; // 单价 private BigDecimal price; // 供应商 private String supplierName; // 规格 private String specification; // 数量 private Integer quantity; // 总金额 private BigDecimal ammount; // 顾客姓名 private String consumer; // 入库时间 private Date gmtCreated; public String getDrugName() { return drugName; } public void setDrugName(String drugName) { this.drugName = drugName; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public String getSupplierName() { return supplierName; } public void setSupplierName(String supplierName) { this.supplierName = supplierName; } public String getSpecification() { return specification; } public void setSpecification(String specification) { this.specification = specification; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public BigDecimal getAmmount() { return ammount; } public void setAmmount(BigDecimal ammount) { this.ammount = ammount; } public Date getGmtCreated() { return gmtCreated; } public void setGmtCreated(Date gmtCreated) { this.gmtCreated = gmtCreated; } public String getDrugId() { return drugId; } public void setDrugId(String drugId) { this.drugId = drugId; } public int getQuantityNow() { return quantityNow; } public void setQuantityNow(int quantityNow) { this.quantityNow = quantityNow; } public String getManager() { return manager; } public void setManager(String manager) { this.manager = manager; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public String getConsumer() { return consumer; } public void setConsumer(String consumer) { this.consumer = consumer; } public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } } ================================================ FILE: src/main/java/me/zbl/app/domain/StaSaleDO.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.domain; /** * 销售情况统计数据 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-25 */ public class StaSaleDO { // 日期标识 private String dateUnit; // 销量 private float saleCount; public String getDateUnit() { return dateUnit; } public void setDateUnit(String dateUnit) { this.dateUnit = dateUnit; } public float getSaleCount() { return saleCount; } public void setSaleCount(float saleCount) { this.saleCount = saleCount; } } ================================================ FILE: src/main/java/me/zbl/app/domain/Supplier.java ================================================ package me.zbl.app.domain; public class Supplier { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id == null ? null : id.trim(); } public String getName() { return name; } public void setName(String name) { this.name = name == null ? null : name.trim(); } } ================================================ FILE: src/main/java/me/zbl/app/service/ConsumerService.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service; import me.zbl.app.domain.Consumer; import java.util.List; import java.util.Map; /** * 顾客业务接口 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-17 */ public interface ConsumerService { List searchByName(String name); Consumer selectByPrimaryKey(String id); List selectAllConsumer(Map params); int count(); int insertConsumer(Consumer consumer); int deleteConsumer(String id); int updateConsumer(Consumer consumer); } ================================================ FILE: src/main/java/me/zbl/app/service/DrugInService.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service; import me.zbl.app.domain.BackFormDO; import me.zbl.app.domain.DrugInDO; import me.zbl.app.domain.DrugInFormDO; import java.util.List; import java.util.Map; /** * 药品入库业务接口 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-07 */ public interface DrugInService { int back(BackFormDO backFormDO); List list(Map params); int count(); int drugInSave(DrugInFormDO drugInFormDO); } ================================================ FILE: src/main/java/me/zbl/app/service/DrugOutService.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service; import com.github.pagehelper.Page; import me.zbl.app.domain.DrugOutDO; import me.zbl.app.domain.DrugOutFormDO; import me.zbl.app.domain.SaleDO; import me.zbl.app.domain.StaSaleDO; import java.util.List; import java.util.Map; /** * 药品出库业务接口 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-08 */ public interface DrugOutService { List staSaleDay(); List staSaleMonth(); List staSaleYear(); List list(Map params); Page saleList(Map params); int count(); int countSale(); int drugOutSave(DrugOutFormDO drugOutFormDO) throws IllegalArgumentException; int saleSave(DrugOutFormDO drugOutFormDO); /** * 检查库存下限 */ void checkLowerLimit(); } ================================================ FILE: src/main/java/me/zbl/app/service/DrugService.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service; import me.zbl.app.domain.Drug; import me.zbl.app.domain.DrugDO; import java.util.List; import java.util.Map; /** * 药品管理业务接口 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-19 */ public interface DrugService { Drug selectDrugByPrimaryKey(String id); List selectAllDrug(Map params); int count(); int insertDrug(Drug drug); int updateDrug(Drug drug); int deleteDrug(String id); } ================================================ FILE: src/main/java/me/zbl/app/service/ExpireNotifyService.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service; /** * 药品过期提醒业务接口 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-12 */ public interface ExpireNotifyService { /** * 向仓库管理员角色的用户发送药品过期提醒 */ void notifyDrugsExpiredToday(); } ================================================ FILE: src/main/java/me/zbl/app/service/SupplierService.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service; import me.zbl.app.domain.Supplier; import java.util.List; import java.util.Map; /** * 供应商业务接口 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-17 */ public interface SupplierService { Supplier selectByPrimaryKey(String id); List selectAllSupplier(Map params); int count(); int insertSupplier(Supplier supplier); int deleteSupplier(String id); int updateSupplier(Supplier id); } ================================================ FILE: src/main/java/me/zbl/app/service/impl/ConsumerServiceImpl.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service.impl; import me.zbl.app.dao.ConsumerMapper; import me.zbl.app.domain.Consumer; import me.zbl.app.service.ConsumerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.Optional; /** * 顾客业务实现 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-19 */ @Service public class ConsumerServiceImpl implements ConsumerService { @Autowired private ConsumerMapper consumerMapper; @Override public List searchByName(String name) { return consumerMapper.selectByName(name); } @Override public Consumer selectByPrimaryKey(String id) { return consumerMapper.selectByPrimaryKey(id); } @Override public List selectAllConsumer(Map params) { return consumerMapper.selectAllConsumer(params); } @Override public int count() { return consumerMapper.count(); } @Override public int insertConsumer(Consumer consumer) { Optional find = Optional.ofNullable(consumerMapper.selectConsumerByTel(consumer.getTel())); if (find.isPresent()) { throw new IllegalArgumentException("用户电话号码已存在"); } return consumerMapper.insertSelective(consumer); } @Override public int deleteConsumer(String id) { return consumerMapper.deleteByPrimaryKey(id); } @Override public int updateConsumer(Consumer consumer) { return consumerMapper.updateByPrimaryKeySelective(consumer); } } ================================================ FILE: src/main/java/me/zbl/app/service/impl/DrugInServiceImpl.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service.impl; import me.zbl.app.dao.DrugMapper; import me.zbl.app.dao.ExpireMapper; import me.zbl.app.dao.InventoryMapper; import me.zbl.app.domain.*; import me.zbl.app.service.DrugInService; import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; /** * 药品入库业务实现 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-07 */ @Service public class DrugInServiceImpl implements DrugInService { @Autowired private ExpireMapper expireMapper; @Autowired private InventoryMapper inventoryMapper; @Autowired private DrugMapper drugMapper; @Override public int back(BackFormDO backFormDO) { int result = 0; String orderId = backFormDO.getOrderId(); Inventory order = inventoryMapper.selectByPrimaryKey(orderId); if (null == order) { throw new IllegalArgumentException("订单不存在"); } order.setManager(backFormDO.getManager()); order.setComment(backFormDO.getComment()); order.setId(null); order.setGmtCreated(null); order.setGmtModified(null); // 如果没有问题,直接入库 if (!backFormDO.isHasProblem()) { order.setType("2"); // 保存入库记录 result = inventoryMapper.insertSelective(order); // 更新库存 Map param = new HashMap<>(); param.put("drugId", order.getDrugId()); param.put("quantity", order.getQuantity()); drugMapper.increaseAndDecreaseQuantity(param); } // 药品存在问题,直接退回供应商 else { order.setType("4"); // 保存入库记录 result = inventoryMapper.insertSelective(order); } // 删除订单 inventoryMapper.deleteByPrimaryKey(orderId); return result; } @Override public List list(Map params) { return inventoryMapper.inList(params); } @Override public int count() { return inventoryMapper.countIn(); } @Override public int drugInSave(DrugInFormDO drugInFormDO) throws IllegalArgumentException { Optional.ofNullable(drugMapper.selectByPrimaryKey(drugInFormDO.getDrugId())) .orElseThrow(() -> new IllegalArgumentException("输入的药品编号不存在")); // 生产日期 Date madeDate = drugInFormDO.getMadeDate(); // 保质期 int guarantee = drugMapper.selectByPrimaryKey(drugInFormDO.getDrugId()).getQualityGuaranteePeriod(); // 计算过期日期 Date expire = DateUtils.addMonths(madeDate, guarantee); Expire exp = new Expire(); exp.setDrugId(drugInFormDO.getDrugId()); exp.setExpiredDate(expire); // 保存过期提醒记录 expireMapper.insertSelective(exp); // 库存记录 Map params = new HashMap<>(); params.put("drugId", drugInFormDO.getDrugId()); params.put("quantity", drugInFormDO.getQuantity()); // 更新药品的库存 drugMapper.increaseAndDecreaseQuantity(params); // 保存仓储变动记录 return inventoryMapper.drugInSave(drugInFormDO); } } ================================================ FILE: src/main/java/me/zbl/app/service/impl/DrugOutServiceImpl.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service.impl; import com.github.pagehelper.Page; import me.zbl.app.dao.DrugMapper; import me.zbl.app.dao.InventoryMapper; import me.zbl.app.domain.*; import me.zbl.app.service.DrugOutService; import me.zbl.oa.domain.NotifyDO; import me.zbl.oa.service.NotifyService; import me.zbl.util.PageUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; /** * 药品出库业务实现 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-08 */ @Service public class DrugOutServiceImpl implements DrugOutService { @Autowired private DrugMapper drugMapper; @Autowired private InventoryMapper inventoryMapper; @Autowired private NotifyService notifyService; @Override public List staSaleDay() { return inventoryMapper.staSaleDay(); } @Override public List staSaleMonth() { return inventoryMapper.staSaleMonth(); } @Override public List staSaleYear() { return inventoryMapper.staSaleYear(); } @Override public List list(Map params) { return inventoryMapper.outList(params); } @Override public Page saleList(Map params) { return PageUtil.page(params, () -> inventoryMapper.saleList(params)); } @Override public int count() { return inventoryMapper.countOut(); } @Override public int countSale() { return inventoryMapper.countSale(); } @Transactional @Override public int drugOutSave(DrugOutFormDO drugOutFormDO) { Optional.ofNullable(drugMapper.selectByPrimaryKey(drugOutFormDO.getDrugId())). orElseThrow(() -> new IllegalArgumentException("输入的药品编号不存在")); Map params = new HashMap<>(); String drugId = drugOutFormDO.getDrugId(); params.put("drugId", drugId); params.put("quantity", 0 - drugOutFormDO.getQuantity()); // 更新药品的库存 drugMapper.increaseAndDecreaseQuantity(params); Drug post = drugMapper.selectByPrimaryKey(drugId); if (post.getQuantity() < 0) { throw new IllegalArgumentException("库存不足!"); } if (StringUtils.isEmpty(drugOutFormDO.getComment())) { drugOutFormDO.setComment("退回供应商出库"); } // 保存仓储变动记录 return inventoryMapper.drugOutSave(drugOutFormDO); } @Override public int saleSave(DrugOutFormDO drugOutFormDO) { Optional.ofNullable(drugMapper.selectByPrimaryKey(drugOutFormDO.getDrugId())). orElseThrow(() -> new IllegalArgumentException("输入的药品编号不存在")); Map params = new HashMap<>(); String drugId = drugOutFormDO.getDrugId(); params.put("drugId", drugId); params.put("quantity", 0 - drugOutFormDO.getQuantity()); // 更新药品的库存 drugMapper.increaseAndDecreaseQuantity(params); Drug post = drugMapper.selectByPrimaryKey(drugId); if (post.getQuantity() < 0) { throw new IllegalArgumentException("库存不足!"); } BigDecimal price = post.getPrice(); int quantity = drugOutFormDO.getQuantity(); float ammount = price.floatValue() * (float) quantity; drugOutFormDO.setAmmount(ammount); if (StringUtils.isEmpty(drugOutFormDO.getComment())) { drugOutFormDO.setComment("销售出库"); } // 保存仓储变动记录 return inventoryMapper.saleSave(drugOutFormDO); } @Override public void checkLowerLimit() { List drugs = drugMapper.selectOverLowerLimit(); drugs.forEach(d -> { String title = "有药品的库存低于预定下限值"; // 药品编号 String drugId = d.getId(); // 药名 String name = d.getName(); // 消息内容 String content = "有药品的库存低于预定下限值,请及时进货!药品编号:" + drugId + ",药名:" + name + ""; NotifyDO notify = new NotifyDO(); notify.setTitle(title); notify.setStatus("1"); notify.setContent(content); notify.setType("5"); notify.setCreateBy((long) 1); notify.setUserIds(new Long[]{(long) 140}); // 发送消息 notifyService.save(notify); }); } } ================================================ FILE: src/main/java/me/zbl/app/service/impl/DrugServiceImpl.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service.impl; import me.zbl.app.dao.DrugMapper; import me.zbl.app.dao.SupplierMapper; import me.zbl.app.domain.Drug; import me.zbl.app.domain.DrugDO; import me.zbl.app.domain.Supplier; import me.zbl.app.service.DrugService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.Optional; /** * 药品管理业务实现 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-19 */ @Service public class DrugServiceImpl implements DrugService { @Autowired private DrugMapper drugMapper; @Autowired private SupplierMapper supplierMapper; @Override public Drug selectDrugByPrimaryKey(String id) { return drugMapper.selectByPrimaryKey(id); } @Override public List selectAllDrug(Map params) { return drugMapper.selectAllDrug(params); } @Override public int count() { return drugMapper.count(); } @Override public int insertDrug(Drug drug) { Drug find = drugMapper.selectByPrimaryKey(drug.getId()); if (null != find) { throw new IllegalArgumentException("药品编号已经存在"); } Optional supplier = Optional.ofNullable(supplierMapper. selectByPrimaryKey(drug.getSupplierId())); supplier.orElseThrow(() -> new IllegalArgumentException("供应商编号不存在")); return drugMapper.insertSelective(drug); } @Override public int updateDrug(Drug drug) { return drugMapper.updateByPrimaryKeySelective(drug); } @Override public int deleteDrug(String id) { return drugMapper.deleteByPrimaryKey(id); } } ================================================ FILE: src/main/java/me/zbl/app/service/impl/ExpireNotifyServiceImpl.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service.impl; import me.zbl.app.dao.DrugMapper; import me.zbl.app.domain.Drug; import me.zbl.app.service.ExpireNotifyService; import me.zbl.oa.domain.NotifyDO; import me.zbl.oa.service.NotifyService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; /** * 药品过期提醒业务实现 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-12 */ @Service public class ExpireNotifyServiceImpl implements ExpireNotifyService { @Autowired private DrugMapper drugMapper; @Autowired NotifyService notifyService; @Override public void notifyDrugsExpiredToday() { List drugs = drugMapper.selectByExpireDate(new Date()); drugs.forEach(d -> { String title = "有药品将要在今天过期"; // 药品编号 String drugId = d.getId(); // 药名 String name = d.getName(); // 消息内容 String content = "有一批药品将于今天过期,如有剩余存货请及时处理!药品编号:" + drugId + ",药名:" + name + ""; NotifyDO notify = new NotifyDO(); notify.setTitle(title); notify.setStatus("1"); notify.setContent(content); notify.setType("4"); notify.setCreateBy((long) 1); notify.setUserIds(new Long[]{(long) 140}); // 发送消息 notifyService.save(notify); }); } } ================================================ FILE: src/main/java/me/zbl/app/service/impl/SupplierServiceImpl.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.service.impl; import me.zbl.app.dao.SupplierMapper; import me.zbl.app.domain.Supplier; import me.zbl.app.service.SupplierService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; /** * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-17 */ @Service public class SupplierServiceImpl implements SupplierService { @Autowired SupplierMapper supplierMapper; @Override public Supplier selectByPrimaryKey(String id) { return supplierMapper.selectByPrimaryKey(id); } @Override public List selectAllSupplier(Map params) { return supplierMapper.selectAllSupplier(params); } @Override public int count() { return supplierMapper.count(); } @Override public int insertSupplier(Supplier supplier) { Supplier virtual = supplierMapper.selectByPrimaryKey(supplier.getId()); if (null != virtual) { throw new IllegalArgumentException("该编号已经存在"); } return supplierMapper.insertSelective(supplier); } @Override public int deleteSupplier(String id) { return supplierMapper.deleteByPrimaryKey(id); } @Override public int updateSupplier(Supplier supplier) { return supplierMapper.updateByPrimaryKeySelective(supplier); } } ================================================ FILE: src/main/java/me/zbl/app/task/InventoryCheckTask.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app.task; import me.zbl.app.service.DrugOutService; import me.zbl.app.service.ExpireNotifyService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; /** * 定时任务 *

* 1. 药品过期检查 * 2. 药品库存检查 * * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-12 */ @Component public class InventoryCheckTask { private static final Logger log = LoggerFactory.getLogger(InventoryCheckTask.class); @Autowired private ExpireNotifyService expireNotifyService; @Autowired private DrugOutService drugOutService; /** * 检查药品过期 * 每天 00:00 执行 */ @Scheduled(cron = "0 0 0 * * ?") public void checkExpire() { expireNotifyService.notifyDrugsExpiredToday(); log.info("定时任务:发送药品过期提醒"); } /** * 检查药品库存 * 每天 00:00 执行 */ @Scheduled(cron = "0 0 0 * * ?") public void checkLowerLimit() { drugOutService.checkLowerLimit(); log.info("定时任务:发送药品库存提醒"); } } ================================================ FILE: src/main/java/me/zbl/blog/controller/BlogController.java ================================================ package me.zbl.blog.controller; import me.zbl.blog.domain.ContentDO; import me.zbl.blog.service.ContentService; import me.zbl.common.utils.DateUtils; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 郑保乐 */ @RequestMapping("/blog") @Controller public class BlogController { @Autowired ContentService bContentService; @GetMapping() String blog() { return "blog/index/main"; } @ResponseBody @GetMapping("/open/list") public PageWrapper opentList(@RequestParam Map params) { Query query = new Query(params); List bContentList = bContentService.list(query); int total = bContentService.count(query); PageWrapper pageWrapper = new PageWrapper(bContentList, total); return pageWrapper; } @GetMapping("/open/post/{cid}") String post(@PathVariable("cid") Long cid, Model model) { ContentDO bContentDO = bContentService.get(cid); model.addAttribute("bContent", bContentDO); model.addAttribute("gtmModified", DateUtils.format(bContentDO.getGtmModified())); return "blog/index/post"; } @GetMapping("/open/page/{categories}") String about(@PathVariable("categories") String categories, Model model) { Map map = new HashMap<>(16); map.put("categories", categories); ContentDO bContentDO = null; if (bContentService.list(map).size() > 0) { bContentDO = bContentService.list(map).get(0); } model.addAttribute("bContent", bContentDO); return "blog/index/post"; } } ================================================ FILE: src/main/java/me/zbl/blog/controller/ContentController.java ================================================ package me.zbl.blog.controller; import me.zbl.blog.domain.ContentDO; import me.zbl.blog.service.ContentService; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.Date; import java.util.List; import java.util.Map; /** * 文章内容 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-09 10:03:34 */ @Controller @RequestMapping("/blog/bContent") public class ContentController extends BaseController { @Autowired ContentService bContentService; @GetMapping() @RequiresPermissions("blog:bContent:bContent") String bContent() { return "blog/bContent/bContent"; } @ResponseBody @GetMapping("/list") @RequiresPermissions("blog:bContent:bContent") public PageWrapper list(@RequestParam Map params) { Query query = new Query(params); List bContentList = bContentService.list(query); int total = bContentService.count(query); PageWrapper pageWrapper = new PageWrapper(bContentList, total); return pageWrapper; } @GetMapping("/add") @RequiresPermissions("blog:bContent:add") String add() { return "blog/bContent/add"; } @GetMapping("/edit/{cid}") @RequiresPermissions("blog:bContent:edit") String edit(@PathVariable("cid") Long cid, Model model) { ContentDO bContentDO = bContentService.get(cid); model.addAttribute("bContent", bContentDO); return "blog/bContent/edit"; } /** * 保存 */ @ResponseBody @RequiresPermissions("blog:bContent:add") @PostMapping("/save") public R save(ContentDO bContent) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (bContent.getAllowComment() == null) { bContent.setAllowComment(0); } if (bContent.getAllowFeed() == null) { bContent.setAllowFeed(0); } if (null == bContent.getType()) { bContent.setType("article"); } bContent.setGtmCreate(new Date()); bContent.setGtmModified(new Date()); int count; if (bContent.getCid() == null || "".equals(bContent.getCid())) { count = bContentService.save(bContent); } else { count = bContentService.update(bContent); } if (count > 0) { return R.ok().put("cid", bContent.getCid()); } return R.error(); } /** * 修改 */ @RequiresPermissions("blog:bContent:edit") @ResponseBody @RequestMapping("/update") public R update(ContentDO bContent) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } bContent.setGtmCreate(new Date()); bContentService.update(bContent); return R.ok(); } /** * 删除 */ @RequiresPermissions("blog:bContent:remove") @PostMapping("/remove") @ResponseBody public R remove(Long id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (bContentService.remove(id) > 0) { return R.ok(); } return R.error(); } /** * 删除 */ @RequiresPermissions("blog:bContent:batchRemove") @PostMapping("/batchRemove") @ResponseBody public R remove(@RequestParam("ids[]") Long[] cids) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } bContentService.batchRemove(cids); return R.ok(); } } ================================================ FILE: src/main/java/me/zbl/blog/dao/ContentDao.java ================================================ package me.zbl.blog.dao; import me.zbl.blog.domain.ContentDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 文章内容 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 16:17:48 */ @Mapper public interface ContentDao { ContentDO get(Long cid); List list(Map map); int count(Map map); int save(ContentDO content); int update(ContentDO content); int remove(Long cid); int batchRemove(Long[] cids); } ================================================ FILE: src/main/java/me/zbl/blog/domain/ContentDO.java ================================================ package me.zbl.blog.domain; import java.io.Serializable; import java.util.Date; /** * 文章内容 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-22 13:16:10 */ public class ContentDO implements Serializable { private static final long serialVersionUID = 1L; // private Long cid; //标题 private String title; // private String slug; //创建人id private Long created; //最近修改人id private Long modified; //内容 private String content; //类型 private String type; //标签 private String tags; //分类 private String categories; // private Integer hits; //评论数量 private Integer commentsNum; //开启评论 private Integer allowComment; //允许ping private Integer allowPing; //允许反馈 private Integer allowFeed; //状态 private Integer status; //作者 private String author; //创建时间 private Date gtmCreate; //修改时间 private Date gtmModified; /** * 获取: */ public Long getCid() { return cid; } /** * 设置: */ public void setCid(Long cid) { this.cid = cid; } /** * 获取:标题 */ public String getTitle() { return title; } /** * 设置:标题 */ public void setTitle(String title) { this.title = title; } /** * 获取: */ public String getSlug() { return slug; } /** * 设置: */ public void setSlug(String slug) { this.slug = slug; } /** * 获取:创建人id */ public Long getCreated() { return created; } /** * 设置:创建人id */ public void setCreated(Long created) { this.created = created; } /** * 获取:最近修改人id */ public Long getModified() { return modified; } /** * 设置:最近修改人id */ public void setModified(Long modified) { this.modified = modified; } /** * 获取:内容 */ public String getContent() { return content; } /** * 设置:内容 */ public void setContent(String content) { this.content = content; } /** * 获取:类型 */ public String getType() { return type; } /** * 设置:类型 */ public void setType(String type) { this.type = type; } /** * 获取:标签 */ public String getTags() { return tags; } /** * 设置:标签 */ public void setTags(String tags) { this.tags = tags; } /** * 获取:分类 */ public String getCategories() { return categories; } /** * 设置:分类 */ public void setCategories(String categories) { this.categories = categories; } /** * 获取: */ public Integer getHits() { return hits; } /** * 设置: */ public void setHits(Integer hits) { this.hits = hits; } /** * 获取:评论数量 */ public Integer getCommentsNum() { return commentsNum; } /** * 设置:评论数量 */ public void setCommentsNum(Integer commentsNum) { this.commentsNum = commentsNum; } /** * 获取:开启评论 */ public Integer getAllowComment() { return allowComment; } /** * 设置:开启评论 */ public void setAllowComment(Integer allowComment) { this.allowComment = allowComment; } /** * 获取:允许ping */ public Integer getAllowPing() { return allowPing; } /** * 设置:允许ping */ public void setAllowPing(Integer allowPing) { this.allowPing = allowPing; } /** * 获取:允许反馈 */ public Integer getAllowFeed() { return allowFeed; } /** * 设置:允许反馈 */ public void setAllowFeed(Integer allowFeed) { this.allowFeed = allowFeed; } /** * 获取:状态 */ public Integer getStatus() { return status; } /** * 设置:状态 */ public void setStatus(Integer status) { this.status = status; } /** * 获取:作者 */ public String getAuthor() { return author; } /** * 设置:作者 */ public void setAuthor(String author) { this.author = author; } /** * 获取:创建时间 */ public Date getGtmCreate() { return gtmCreate; } /** * 设置:创建时间 */ public void setGtmCreate(Date gtmCreate) { this.gtmCreate = gtmCreate; } /** * 获取:修改时间 */ public Date getGtmModified() { return gtmModified; } /** * 设置:修改时间 */ public void setGtmModified(Date gtmModified) { this.gtmModified = gtmModified; } @Override public String toString() { return "ContentDO{" + "cid=" + cid + ", title='" + title + '\'' + ", slug='" + slug + '\'' + ", created=" + created + ", modified=" + modified + ", content='" + content + '\'' + ", type='" + type + '\'' + ", tags='" + tags + '\'' + ", categories='" + categories + '\'' + ", hits=" + hits + ", commentsNum=" + commentsNum + ", allowComment=" + allowComment + ", allowPing=" + allowPing + ", allowFeed=" + allowFeed + ", status=" + status + ", author='" + author + '\'' + ", gtmCreate=" + gtmCreate + ", gtmModified=" + gtmModified + '}'; } } ================================================ FILE: src/main/java/me/zbl/blog/service/ContentService.java ================================================ package me.zbl.blog.service; import me.zbl.blog.domain.ContentDO; import java.util.List; import java.util.Map; /** * 文章内容 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-09 10:03:34 */ public interface ContentService { ContentDO get(Long cid); List list(Map map); int count(Map map); int save(ContentDO bContent); int update(ContentDO bContent); int remove(Long cid); int batchRemove(Long[] cids); } ================================================ FILE: src/main/java/me/zbl/blog/service/impl/ContentServiceImpl.java ================================================ package me.zbl.blog.service.impl; import me.zbl.blog.dao.ContentDao; import me.zbl.blog.domain.ContentDO; import me.zbl.blog.service.ContentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service public class ContentServiceImpl implements ContentService { @Autowired private ContentDao bContentMapper; @Override public ContentDO get(Long cid) { return bContentMapper.get(cid); } @Override public List list(Map map) { return bContentMapper.list(map); } @Override public int count(Map map) { return bContentMapper.count(map); } @Override public int save(ContentDO bContent) { return bContentMapper.save(bContent); } @Override public int update(ContentDO bContent) { return bContentMapper.update(bContent); } @Override public int remove(Long cid) { return bContentMapper.remove(cid); } @Override public int batchRemove(Long[] cids) { return bContentMapper.batchRemove(cids); } } ================================================ FILE: src/main/java/me/zbl/common/annotation/Log.java ================================================ package me.zbl.common.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Log { String value() default ""; } ================================================ FILE: src/main/java/me/zbl/common/aspect/LogAspect.java ================================================ package me.zbl.common.aspect; import me.zbl.common.annotation.Log; import me.zbl.common.domain.LogDO; import me.zbl.common.service.LogService; import me.zbl.common.utils.HttpContextUtils; import me.zbl.common.utils.IPUtils; import me.zbl.common.utils.JSONUtils; import me.zbl.common.utils.ShiroUtils; import me.zbl.system.domain.UserDO; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.Date; @Aspect @Component public class LogAspect { private static final Logger logger = LoggerFactory.getLogger(LogAspect.class); @Autowired LogService logService; @Pointcut("@annotation(me.zbl.common.annotation.Log)") public void logPointCut() { } @Around("logPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { long beginTime = System.currentTimeMillis(); // 执行方法 Object result = point.proceed(); // 执行时长(毫秒) long time = System.currentTimeMillis() - beginTime; //异步保存日志 saveLog(point, time); return result; } void saveLog(ProceedingJoinPoint joinPoint, long time) { MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); LogDO sysLog = new LogDO(); Log syslog = method.getAnnotation(Log.class); if (syslog != null) { // 注解上的描述 sysLog.setOperation(syslog.value()); } // 请求的方法名 String className = joinPoint.getTarget().getClass().getName(); String methodName = signature.getName(); sysLog.setMethod(className + "." + methodName + "()"); // 请求的参数 Object[] args = joinPoint.getArgs(); try { String params = JSONUtils.beanToJson(args[0]).substring(0, 4999); sysLog.setParams(params); } catch (Exception e) { } // 获取request HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); // 设置IP地址 sysLog.setIp(IPUtils.getIpAddr(request)); // 用户名 UserDO currUser = ShiroUtils.getUser(); if (null == currUser) { if (null != sysLog.getParams()) { sysLog.setUserId(-1L); sysLog.setUsername(sysLog.getParams()); } else { sysLog.setUserId(-1L); sysLog.setUsername("获取用户信息为空"); } } else { sysLog.setUserId(ShiroUtils.getUserId()); sysLog.setUsername(ShiroUtils.getUser().getUsername()); } sysLog.setTime((int) time); // 系统当前时间 Date date = new Date(); sysLog.setGmtCreate(date); // 保存系统日志 logService.save(sysLog); } } ================================================ FILE: src/main/java/me/zbl/common/aspect/WebLogAspect.java ================================================ package me.zbl.common.aspect; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; @Aspect @Component public class WebLogAspect { private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class); @Pointcut("execution( * me.zbl..controller.*.*(..))")//两个..代表所有子目录,最后括号里的两个..代表所有参数 public void logPointCut() { } @Before("logPointCut()") public void doBefore(JoinPoint joinPoint) { // 接收到请求,记录请求内容 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 记录下请求内容 logger.info("请求地址 : " + request.getRequestURL().toString()); logger.info("HTTP METHOD : " + request.getMethod()); // 获取真实的ip地址 //logger.info("IP : " + IPAddressUtil.getClientIpAddress(request)); logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); logger.info("参数 : " + Arrays.toString(joinPoint.getArgs())); // loggger.info("参数 : " + joinPoint.getArgs()); } @AfterReturning(returning = "ret", pointcut = "logPointCut()")// returning的值和doAfterReturning的参数名一致 public void doAfterReturning(Object ret) { // 处理完请求,返回内容(返回值太复杂时,打印的是物理存储空间的地址) logger.debug("返回值 : " + ret); } @Around("logPointCut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { long startTime = System.currentTimeMillis(); Object ob = pjp.proceed();// ob 为方法的返回值 logger.info("耗时 : " + (System.currentTimeMillis() - startTime)); return ob; } } ================================================ FILE: src/main/java/me/zbl/common/config/ApplicationContextRegister.java ================================================ package me.zbl.common.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * @author 郑保乐 * @date 2017/9/4 *

* @email 18333298410@163.dom *

* Describe: */ @Component public class ApplicationContextRegister implements ApplicationContextAware { private static Logger logger = LoggerFactory.getLogger(ApplicationContextRegister.class); private static ApplicationContext APPLICATION_CONTEXT; /** * 获取容器 * * @return */ public static ApplicationContext getApplicationContext() { return APPLICATION_CONTEXT; } /** * 设置spring上下文 * * @param applicationContext spring上下文 * * @throws BeansException */ @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { logger.debug("ApplicationContext registed-->{}", applicationContext); APPLICATION_CONTEXT = applicationContext; } /** * 获取容器对象 * * @param type * @param * * @return */ public static T getBean(Class type) { return APPLICATION_CONTEXT.getBean(type); } } ================================================ FILE: src/main/java/me/zbl/common/config/Constant.java ================================================ package me.zbl.common.config; public class Constant { //演示系统账户 public static String DEMO_ACCOUNT = "test"; //自动去除表前缀 public static String AUTO_REOMVE_PRE = "true"; //停止计划任务 public static String STATUS_RUNNING_STOP = "stop"; //开启计划任务 public static String STATUS_RUNNING_START = "start"; //通知公告阅读状态-未读 public static String OA_NOTIFY_READ_NO = "0"; //通知公告阅读状态-已读 public static int OA_NOTIFY_READ_YES = 1; //部门根节点id public static Long DEPT_ROOT_ID = 0l; //缓存方式 public static String CACHE_TYPE_REDIS = "redis"; public static String LOG_ERROR = "error"; } ================================================ FILE: src/main/java/me/zbl/common/config/DateConverConfig.java ================================================ package me.zbl.common.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * @author 郑保乐 * @date 2017/12/14. */ @Configuration public class DateConverConfig { @Bean public Converter stringDateConvert() { return new Converter() { @Override public Date convert(String source) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = null; try { date = sdf.parse(source); } catch (Exception e) { SimpleDateFormat sdfday = new SimpleDateFormat("yyyy-MM-dd"); try { date = sdfday.parse(source); } catch (ParseException e1) { e1.printStackTrace(); } } return date; } }; } } ================================================ FILE: src/main/java/me/zbl/common/config/DruidDBConfig.java ================================================ package me.zbl.common.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; import java.sql.SQLException; /** * Created by PrimaryKey on 17/2/4. */ @SuppressWarnings("AlibabaRemoveCommentedCode") @Configuration public class DruidDBConfig { private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class); @Value("${spring.datasource.url}") private String dbUrl; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.driverClassName}") private String driverClassName; @Value("${spring.datasource.initialSize}") private int initialSize; @Value("${spring.datasource.minIdle}") private int minIdle; @Value("${spring.datasource.maxActive}") private int maxActive; @Value("${spring.datasource.maxWait}") private int maxWait; @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") private int timeBetweenEvictionRunsMillis; @Value("${spring.datasource.minEvictableIdleTimeMillis}") private int minEvictableIdleTimeMillis; @Value("${spring.datasource.validationQuery}") private String validationQuery; @Value("${spring.datasource.testWhileIdle}") private boolean testWhileIdle; @Value("${spring.datasource.testOnBorrow}") private boolean testOnBorrow; @Value("${spring.datasource.testOnReturn}") private boolean testOnReturn; @Value("${spring.datasource.poolPreparedStatements}") private boolean poolPreparedStatements; @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}") private int maxPoolPreparedStatementPerConnectionSize; @Value("${spring.datasource.filters}") private String filters; @Value("{spring.datasource.connectionProperties}") private String connectionProperties; @Bean(initMethod = "init", destroyMethod = "close") //声明其为Bean实例 @Primary //在同样的DataSource中,首先使用被标注的DataSource public DataSource dataSource() { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(this.dbUrl); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); //configuration datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { datasource.setFilters(filters); } catch (SQLException e) { logger.error("druid configuration initialization filter", e); } datasource.setConnectionProperties(connectionProperties); return datasource; } @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean reg = new ServletRegistrationBean(); reg.setServlet(new StatViewServlet()); reg.addUrlMappings("/druid/*"); reg.addInitParameter("allow", ""); //白名单 return reg; } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); filterRegistrationBean.addInitParameter("profileEnable", "true"); filterRegistrationBean.addInitParameter("principalCookieName", "USER_COOKIE"); filterRegistrationBean.addInitParameter("principalSessionName", "USER_SESSION"); filterRegistrationBean.addInitParameter("DruidWebStatFilter", "/*"); return filterRegistrationBean; } } ================================================ FILE: src/main/java/me/zbl/common/config/HospitalConfig.java ================================================ package me.zbl.common.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "hospital") public class HospitalConfig { //上传路径 private String uploadPath; public String getUploadPath() { return uploadPath; } public void setUploadPath(String uploadPath) { this.uploadPath = uploadPath; } } ================================================ FILE: src/main/java/me/zbl/common/config/QuartzConfigration.java ================================================ package me.zbl.common.config; import me.zbl.common.quartz.factory.JobFactory; import org.quartz.Scheduler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import java.io.IOException; import java.util.Properties; @Configuration public class QuartzConfigration { @Autowired JobFactory jobFactory; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); try { schedulerFactoryBean.setOverwriteExistingJobs(true); schedulerFactoryBean.setQuartzProperties(quartzProperties()); schedulerFactoryBean.setJobFactory(jobFactory); } catch (IOException e) { e.printStackTrace(); } return schedulerFactoryBean; } // 指定quartz.properties @Bean public Properties quartzProperties() throws IOException { PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); propertiesFactoryBean.setLocation(new ClassPathResource("/config/quartz.properties")); propertiesFactoryBean.afterPropertiesSet(); return propertiesFactoryBean.getObject(); } // 创建schedule @Bean(name = "scheduler") public Scheduler scheduler() { return schedulerFactoryBean().getScheduler(); } } ================================================ FILE: src/main/java/me/zbl/common/config/SchedulerConf.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.common.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; /** * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-12 */ @Configuration @EnableScheduling public class SchedulerConf { } ================================================ FILE: src/main/java/me/zbl/common/config/SpringAsyncConfig.java ================================================ package me.zbl.common.config; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; @Configuration @EnableAsync public class SpringAsyncConfig { // @Bean // public AsyncTaskExecutor taskExecutor() { // ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // executor.setMaxPoolSize(10); // return executor; // } } ================================================ FILE: src/main/java/me/zbl/common/config/WebConfigurer.java ================================================ package me.zbl.common.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Component class WebConfigurer extends WebMvcConfigurerAdapter { @Autowired HospitalConfig hospitalConfig; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/files/**").addResourceLocations("file:///" + hospitalConfig.getUploadPath()); } } ================================================ FILE: src/main/java/me/zbl/common/controller/BaseController.java ================================================ package me.zbl.common.controller; import me.zbl.common.utils.ShiroUtils; import me.zbl.system.domain.UserDO; import org.springframework.stereotype.Controller; @Controller public class BaseController { public UserDO getUser() { return ShiroUtils.getUser(); } public Long getUserId() { return getUser().getUserId(); } public String getUsername() { return getUser().getUsername(); } } ================================================ FILE: src/main/java/me/zbl/common/controller/DictController.java ================================================ package me.zbl.common.controller; import me.zbl.common.config.Constant; import me.zbl.common.domain.DictDO; import me.zbl.common.service.DictService; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 字典表 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-29 18:28:07 */ @Controller @RequestMapping("/common/dict") public class DictController extends BaseController { @Autowired private DictService dictService; @GetMapping() @RequiresPermissions("common:dict:dict") String dict() { return "common/dict/dict"; } @ResponseBody @GetMapping("/list") @RequiresPermissions("common:dict:dict") public PageWrapper list(@RequestParam Map params) { // 查询列表数据 Query query = new Query(params); List dictList = dictService.list(query); int total = dictService.count(query); PageWrapper pageWrapper = new PageWrapper(dictList, total); return pageWrapper; } @GetMapping("/add") @RequiresPermissions("common:dict:add") String add() { return "common/dict/add"; } @GetMapping("/edit/{id}") @RequiresPermissions("common:dict:edit") String edit(@PathVariable("id") Long id, Model model) { DictDO dict = dictService.get(id); model.addAttribute("dict", dict); return "common/dict/edit"; } /** * 保存 */ @ResponseBody @PostMapping("/save") @RequiresPermissions("common:dict:add") public R save(DictDO dict) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (dictService.save(dict) > 0) { return R.ok(); } return R.error(); } /** * 修改 */ @ResponseBody @RequestMapping("/update") @RequiresPermissions("common:dict:edit") public R update(DictDO dict) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } dictService.update(dict); return R.ok(); } /** * 删除 */ @PostMapping("/remove") @ResponseBody @RequiresPermissions("common:dict:remove") public R remove(Long id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (dictService.remove(id) > 0) { return R.ok(); } return R.error(); } /** * 删除 */ @PostMapping("/batchRemove") @ResponseBody @RequiresPermissions("common:dict:batchRemove") public R remove(@RequestParam("ids[]") Long[] ids) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } dictService.batchRemove(ids); return R.ok(); } @GetMapping("/type") @ResponseBody public List listType() { return dictService.listType(); } // 类别已经指定增加 @GetMapping("/add/{type}/{description}") @RequiresPermissions("common:dict:add") String addD(Model model, @PathVariable("type") String type, @PathVariable("description") String description) { model.addAttribute("type", type); model.addAttribute("description", description); return "common/dict/add"; } @ResponseBody @GetMapping("/list/{type}") public List listByType(@PathVariable("type") String type) { // 查询列表数据 Map map = new HashMap<>(16); map.put("type", type); List dictList = dictService.list(map); return dictList; } } ================================================ FILE: src/main/java/me/zbl/common/controller/FileController.java ================================================ package me.zbl.common.controller; import me.zbl.common.config.HospitalConfig; import me.zbl.common.domain.FileDO; import me.zbl.common.service.FileService; import me.zbl.common.utils.*; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 文件上传 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-19 16:02:20 */ @Controller @RequestMapping("/common/sysFile") public class FileController extends BaseController { @Autowired private FileService sysFileService; @Autowired private HospitalConfig hospitalConfig; @GetMapping() @RequiresPermissions("common:sysFile:sysFile") String sysFile(Model model) { Map params = new HashMap<>(16); return "common/file/file"; } @ResponseBody @GetMapping("/list") @RequiresPermissions("common:sysFile:sysFile") public PageWrapper list(@RequestParam Map params) { // 查询列表数据 Query query = new Query(params); List sysFileList = sysFileService.list(query); int total = sysFileService.count(query); PageWrapper pageWrapper = new PageWrapper(sysFileList, total); return pageWrapper; } @GetMapping("/add") // @RequiresPermissions("common:bComments") String add() { return "common/sysFile/add"; } @GetMapping("/edit") // @RequiresPermissions("common:bComments") String edit(Long id, Model model) { FileDO sysFile = sysFileService.get(id); model.addAttribute("sysFile", sysFile); return "common/sysFile/edit"; } /** * 信息 */ @RequestMapping("/info/{id}") @RequiresPermissions("common:info") public R info(@PathVariable("id") Long id) { FileDO sysFile = sysFileService.get(id); return R.ok().put("sysFile", sysFile); } /** * 保存 */ @ResponseBody @PostMapping("/save") @RequiresPermissions("common:save") public R save(FileDO sysFile) { if (sysFileService.save(sysFile) > 0) { return R.ok(); } return R.error(); } /** * 修改 */ @RequestMapping("/update") @RequiresPermissions("common:update") public R update(@RequestBody FileDO sysFile) { sysFileService.update(sysFile); return R.ok(); } /** * 删除 */ @PostMapping("/remove") @ResponseBody // @RequiresPermissions("common:remove") public R remove(Long id, HttpServletRequest request) { if ("test".equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } String fileName = hospitalConfig.getUploadPath() + sysFileService.get(id).getUrl().replace("/files/", ""); if (sysFileService.remove(id) > 0) { boolean b = FileUtil.deleteFile(fileName); if (!b) { return R.error("数据库记录删除成功,文件删除失败"); } return R.ok(); } else { return R.error(); } } /** * 删除 */ @PostMapping("/batchRemove") @ResponseBody @RequiresPermissions("common:remove") public R remove(@RequestParam("ids[]") Long[] ids) { if ("test".equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } sysFileService.batchRemove(ids); return R.ok(); } @ResponseBody @PostMapping("/upload") R upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) { if ("test".equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } String fileName = file.getOriginalFilename(); fileName = FileUtil.renameToUUID(fileName); FileDO sysFile = new FileDO(FileType.fileType(fileName), "/files/" + fileName, new Date()); try { FileUtil.uploadFile(file.getBytes(), hospitalConfig.getUploadPath(), fileName); } catch (Exception e) { return R.error(); } if (sysFileService.save(sysFile) > 0) { return R.ok().put("fileName", sysFile.getUrl()); } return R.error(); } } ================================================ FILE: src/main/java/me/zbl/common/controller/GeneratorController.java ================================================ package me.zbl.common.controller; import com.alibaba.fastjson.JSON; import me.zbl.common.service.GeneratorService; import me.zbl.common.utils.GenUtils; import me.zbl.common.utils.R; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @RequestMapping("/common/generator") @Controller public class GeneratorController { String prefix = "common/generator"; @Autowired GeneratorService generatorService; @GetMapping() String generator() { return prefix + "/list"; } @ResponseBody @GetMapping("/list") List> list() { List> list = generatorService.list(); return list; } @RequestMapping("/code/{tableName}") public void code(HttpServletRequest request, HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { String[] tableNames = new String[]{tableName}; byte[] data = generatorService.generatorCode(tableNames); response.reset(); response.setHeader("Content-Disposition", "attachment; filename=\"bootdo.zip\""); response.addHeader("Content-Length", "" + data.length); response.setContentType("application/octet-stream; charset=UTF-8"); IOUtils.write(data, response.getOutputStream()); } @RequestMapping("/batchCode") public void batchCode(HttpServletRequest request, HttpServletResponse response, String tables) throws IOException { String[] tableNames = new String[]{}; tableNames = JSON.parseArray(tables).toArray(tableNames); byte[] data = generatorService.generatorCode(tableNames); response.reset(); response.setHeader("Content-Disposition", "attachment; filename=\"bootdo.zip\""); response.addHeader("Content-Length", "" + data.length); response.setContentType("application/octet-stream; charset=UTF-8"); IOUtils.write(data, response.getOutputStream()); } @GetMapping("/edit") public String edit(Model model) { Configuration conf = GenUtils.getConfig(); Map property = new HashMap<>(16); property.put("author", conf.getProperty("author")); property.put("email", conf.getProperty("email")); property.put("package", conf.getProperty("package")); property.put("autoRemovePre", conf.getProperty("autoRemovePre")); property.put("tablePrefix", conf.getProperty("tablePrefix")); model.addAttribute("property", property); return prefix + "/edit"; } @ResponseBody @PostMapping("/update") R update(@RequestParam Map map) { try { PropertiesConfiguration conf = new PropertiesConfiguration("generator.properties"); conf.setProperty("author", map.get("author")); conf.setProperty("email", map.get("email")); conf.setProperty("package", map.get("package")); conf.setProperty("autoRemovePre", map.get("autoRemovePre")); conf.setProperty("tablePrefix", map.get("tablePrefix")); conf.save(); } catch (ConfigurationException e) { return R.error("保存配置文件出错"); } return R.ok(); } } ================================================ FILE: src/main/java/me/zbl/common/controller/JobController.java ================================================ package me.zbl.common.controller; import me.zbl.common.config.Constant; import me.zbl.common.domain.TaskDO; import me.zbl.common.service.JobService; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-26 20:53:48 */ @Controller @RequestMapping("/common/job") public class JobController extends BaseController { @Autowired private JobService taskScheduleJobService; @GetMapping() String taskScheduleJob() { return "common/job/job"; } @ResponseBody @GetMapping("/list") public PageWrapper list(@RequestParam Map params) { // 查询列表数据 Query query = new Query(params); List taskScheduleJobList = taskScheduleJobService.list(query); int total = taskScheduleJobService.count(query); PageWrapper pageWrapper = new PageWrapper(taskScheduleJobList, total); return pageWrapper; } @GetMapping("/add") String add() { return "common/job/add"; } @GetMapping("/edit/{id}") String edit(@PathVariable("id") Long id, Model model) { TaskDO job = taskScheduleJobService.get(id); model.addAttribute("job", job); return "common/job/edit"; } /** * 信息 */ @RequestMapping("/info/{id}") public R info(@PathVariable("id") Long id) { TaskDO taskScheduleJob = taskScheduleJobService.get(id); return R.ok().put("taskScheduleJob", taskScheduleJob); } /** * 保存 */ @ResponseBody @PostMapping("/save") public R save(TaskDO taskScheduleJob) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (taskScheduleJobService.save(taskScheduleJob) > 0) { return R.ok(); } return R.error(); } /** * 修改 */ @ResponseBody @PostMapping("/update") public R update(TaskDO taskScheduleJob) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } taskScheduleJobService.update(taskScheduleJob); return R.ok(); } /** * 删除 */ @PostMapping("/remove") @ResponseBody public R remove(Long id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (taskScheduleJobService.remove(id) > 0) { return R.ok(); } return R.error(); } /** * 删除 */ @PostMapping("/batchRemove") @ResponseBody public R remove(@RequestParam("ids[]") Long[] ids) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } taskScheduleJobService.batchRemove(ids); return R.ok(); } @PostMapping(value = "/changeJobStatus") @ResponseBody public R changeJobStatus(Long id, String cmd) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } String label = "停止"; if ("start".equals(cmd)) { label = "启动"; } else { label = "停止"; } try { taskScheduleJobService.changeStatus(id, cmd); return R.ok("任务" + label + "成功"); } catch (Exception e) { e.printStackTrace(); } return R.ok("任务" + label + "失败"); } } ================================================ FILE: src/main/java/me/zbl/common/controller/LogController.java ================================================ package me.zbl.common.controller; import me.zbl.common.domain.LogDO; import me.zbl.common.domain.PageDO; import me.zbl.common.service.LogService; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.Map; @RequestMapping("/common/log") @Controller public class LogController { @Autowired LogService logService; String prefix = "common/log"; @GetMapping() String log() { return prefix + "/log"; } @ResponseBody @GetMapping("/list") PageDO list(@RequestParam Map params) { Query query = new Query(params); PageDO page = logService.queryList(query); return page; } @ResponseBody @PostMapping("/remove") R remove(Long id) { if (logService.remove(id) > 0) { return R.ok(); } return R.error(); } @ResponseBody @PostMapping("/batchRemove") R batchRemove(@RequestParam("ids[]") Long[] ids) { int r = logService.batchRemove(ids); if (r > 0) { return R.ok(); } return R.error(); } } ================================================ FILE: src/main/java/me/zbl/common/dao/DictDao.java ================================================ package me.zbl.common.dao; import me.zbl.common.domain.DictDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 字典表 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 15:45:42 */ @Mapper public interface DictDao { DictDO get(Long id); List list(Map map); int count(Map map); int save(DictDO dict); int update(DictDO dict); int remove(Long id); int batchRemove(Long[] ids); List listType(); } ================================================ FILE: src/main/java/me/zbl/common/dao/FileDao.java ================================================ package me.zbl.common.dao; import me.zbl.common.domain.FileDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 文件上传 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 15:45:42 */ @Mapper public interface FileDao { FileDO get(Long id); List list(Map map); int count(Map map); int save(FileDO file); int update(FileDO file); int remove(Long id); int batchRemove(Long[] ids); } ================================================ FILE: src/main/java/me/zbl/common/dao/GeneratorMapper.java ================================================ package me.zbl.common.dao; import org.apache.ibatis.annotations.Select; import java.util.List; import java.util.Map; public interface GeneratorMapper { @Select("select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables" + " where table_schema = (select database())") List> list(); @Select("select count(*) from information_schema.tables where table_schema = (select database())") int count(Map map); @Select("select table_name tableName, engine, table_comment tableComment, create_time createTime from information_schema.tables \r\n" + " where table_schema = (select database()) and table_name = #{tableName}") Map get(String tableName); @Select("select column_name columnName, data_type dataType, column_comment columnComment, column_key columnKey, extra from information_schema.columns\r\n" + " where table_name = #{tableName} and table_schema = (select database()) order by ordinal_position") List> listColumns(String tableName); } ================================================ FILE: src/main/java/me/zbl/common/dao/LogDao.java ================================================ package me.zbl.common.dao; import me.zbl.common.domain.LogDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 系统日志 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 15:45:42 */ @Mapper public interface LogDao { LogDO get(Long id); List list(Map map); int count(Map map); int save(LogDO log); int update(LogDO log); int remove(Long id); int batchRemove(Long[] ids); } ================================================ FILE: src/main/java/me/zbl/common/dao/TaskDao.java ================================================ package me.zbl.common.dao; import me.zbl.common.domain.TaskDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 15:45:42 */ @Mapper public interface TaskDao { TaskDO get(Long id); List list(Map map); int count(Map map); int save(TaskDO task); int update(TaskDO task); int remove(Long id); int batchRemove(Long[] ids); } ================================================ FILE: src/main/java/me/zbl/common/domain/ColumnDO.java ================================================ package me.zbl.common.domain; /** * 列的属性 */ public class ColumnDO { // 列名 private String columnName; // 列名类型 private String dataType; // 列名备注 private String comments; // 属性名称(第一个字母大写),如:user_name => UserName private String attrName; // 属性名称(第一个字母小写),如:user_name => userName private String attrname; // 属性类型 private String attrType; // auto_increment private String extra; public String getColumnName() { return columnName; } public void setColumnName(String columnName) { this.columnName = columnName; } public String getDataType() { return dataType; } public void setDataType(String dataType) { this.dataType = dataType; } public String getComments() { return comments; } public void setComments(String comments) { this.comments = comments; } public String getAttrname() { return attrname; } public void setAttrname(String attrname) { this.attrname = attrname; } public String getAttrName() { return attrName; } public void setAttrName(String attrName) { this.attrName = attrName; } public String getAttrType() { return attrType; } public void setAttrType(String attrType) { this.attrType = attrType; } public String getExtra() { return extra; } public void setExtra(String extra) { this.extra = extra; } @Override public String toString() { return "ColumnDO{" + "columnName='" + columnName + '\'' + ", dataType='" + dataType + '\'' + ", comments='" + comments + '\'' + ", attrName='" + attrName + '\'' + ", attrname='" + attrname + '\'' + ", attrType='" + attrType + '\'' + ", extra='" + extra + '\'' + '}'; } } ================================================ FILE: src/main/java/me/zbl/common/domain/DictDO.java ================================================ package me.zbl.common.domain; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** * 字典表 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-29 18:28:07 */ public class DictDO implements Serializable { private static final long serialVersionUID = 1L; //编号 private Long id; //标签名 private String name; //数据值 private String value; //类型 private String type; //描述 private String description; //排序(升序) private BigDecimal sort; //父级编号 private Long parentId; //创建者 private Integer createBy; //创建时间 private Date createDate; //更新者 private Long updateBy; //更新时间 private Date updateDate; //备注信息 private String remarks; //删除标记 private String delFlag; /** * 获取:编号 */ public Long getId() { return id; } /** * 设置:编号 */ public void setId(Long id) { this.id = id; } /** * 获取:标签名 */ public String getName() { return name; } /** * 设置:标签名 */ public void setName(String name) { this.name = name; } /** * 获取:数据值 */ public String getValue() { return value; } /** * 设置:数据值 */ public void setValue(String value) { this.value = value; } /** * 获取:类型 */ public String getType() { return type; } /** * 设置:类型 */ public void setType(String type) { this.type = type; } /** * 获取:描述 */ public String getDescription() { return description; } /** * 设置:描述 */ public void setDescription(String description) { this.description = description; } /** * 获取:排序(升序) */ public BigDecimal getSort() { return sort; } /** * 设置:排序(升序) */ public void setSort(BigDecimal sort) { this.sort = sort; } /** * 获取:父级编号 */ public Long getParentId() { return parentId; } /** * 设置:父级编号 */ public void setParentId(Long parentId) { this.parentId = parentId; } /** * 获取:创建者 */ public Integer getCreateBy() { return createBy; } /** * 设置:创建者 */ public void setCreateBy(Integer createBy) { this.createBy = createBy; } /** * 获取:创建时间 */ public Date getCreateDate() { return createDate; } /** * 设置:创建时间 */ public void setCreateDate(Date createDate) { this.createDate = createDate; } /** * 获取:更新者 */ public Long getUpdateBy() { return updateBy; } /** * 设置:更新者 */ public void setUpdateBy(Long updateBy) { this.updateBy = updateBy; } /** * 获取:更新时间 */ public Date getUpdateDate() { return updateDate; } /** * 设置:更新时间 */ public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } /** * 获取:备注信息 */ public String getRemarks() { return remarks; } /** * 设置:备注信息 */ public void setRemarks(String remarks) { this.remarks = remarks; } /** * 获取:删除标记 */ public String getDelFlag() { return delFlag; } /** * 设置:删除标记 */ public void setDelFlag(String delFlag) { this.delFlag = delFlag; } @Override public String toString() { return "DictDO{" + "id=" + id + ", name='" + name + '\'' + ", value='" + value + '\'' + ", type='" + type + '\'' + ", description='" + description + '\'' + ", sort=" + sort + ", parentId=" + parentId + ", createBy=" + createBy + ", createDate=" + createDate + ", updateBy=" + updateBy + ", updateDate=" + updateDate + ", remarks='" + remarks + '\'' + ", delFlag='" + delFlag + '\'' + '}'; } } ================================================ FILE: src/main/java/me/zbl/common/domain/FileDO.java ================================================ package me.zbl.common.domain; import java.io.Serializable; import java.util.Date; /** * 文件上传 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-19 16:02:20 */ public class FileDO implements Serializable { private static final long serialVersionUID = 1L; // private Long id; // 文件类型 private Integer type; // URL地址 private String url; // 创建时间 private Date createDate; public FileDO() { super(); } public FileDO(Integer type, String url, Date createDate) { super(); this.type = type; this.url = url; this.createDate = createDate; } /** * 获取: */ public Long getId() { return id; } /** * 设置: */ public void setId(Long id) { this.id = id; } /** * 获取:文件类型 */ public Integer getType() { return type; } /** * 设置:文件类型 */ public void setType(Integer type) { this.type = type; } /** * 获取:URL地址 */ public String getUrl() { return url; } /** * 设置:URL地址 */ public void setUrl(String url) { this.url = url; } /** * 获取:创建时间 */ public Date getCreateDate() { return createDate; } /** * 设置:创建时间 */ public void setCreateDate(Date createDate) { this.createDate = createDate; } @Override public String toString() { return "FileDO{" + "id=" + id + ", type=" + type + ", url='" + url + '\'' + ", createDate=" + createDate + '}'; } } ================================================ FILE: src/main/java/me/zbl/common/domain/LogDO.java ================================================ package me.zbl.common.domain; import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; public class LogDO { private Long id; private Long userId; private String username; private String operation; private Integer time; private String method; private String params; private String ip; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") private Date gmtCreate; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username == null ? null : username.trim(); } public String getOperation() { return operation; } public void setOperation(String operation) { this.operation = operation == null ? null : operation.trim(); } public Integer getTime() { return time; } public void setTime(Integer time) { this.time = time; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method == null ? null : method.trim(); } public String getParams() { return params; } public void setParams(String params) { this.params = params == null ? null : params.trim(); } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip == null ? null : ip.trim(); } public Date getGmtCreate() { return gmtCreate; } public void setGmtCreate(Date gmtCreate) { this.gmtCreate = gmtCreate; } @Override public String toString() { return "LogDO{" + "id=" + id + ", userId=" + userId + ", username='" + username + '\'' + ", operation='" + operation + '\'' + ", time=" + time + ", method='" + method + '\'' + ", params='" + params + '\'' + ", ip='" + ip + '\'' + ", gmtCreate=" + gmtCreate + '}'; } } ================================================ FILE: src/main/java/me/zbl/common/domain/PageDO.java ================================================ package me.zbl.common.domain; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PageDO { private int offset; private int limit; private int total; private Map params; private String param; private List rows; public PageDO() { super(); this.offset = 0; this.limit = 10; this.total = 1; this.params = new HashMap<>(); this.param = ""; this.rows = new ArrayList<>(); } public int getOffset() { return offset; } public void setOffset(int offset) { this.offset = offset; } public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public Map getParams() { return params; } public void setParams(Map params) { this.params = params; } public List getRows() { return rows; } public void setRows(List rows) { this.rows = rows; } public String getParam() { return param; } public void setParam(String param) { this.param = param; } @Override public String toString() { return "PageDO{" + "offset=" + offset + ", limit=" + limit + ", total=" + total + ", params=" + params + ", param='" + param + '\'' + ", rows=" + rows + '}'; } } ================================================ FILE: src/main/java/me/zbl/common/domain/ScheduleJob.java ================================================ package me.zbl.common.domain; import org.quartz.Job; import org.quartz.JobExecutionContext; import java.io.Serializable; @SuppressWarnings("serial") public class ScheduleJob implements Serializable, Job { public static final String STATUS_RUNNING = "1"; public static final String STATUS_NOT_RUNNING = "0"; public static final String CONCURRENT_IS = "1"; public static final String CONCURRENT_NOT = "0"; /** * 任务名称 */ private String jobName; /** * 任务分组 */ private String jobGroup; /** * 任务状态 是否启动任务 */ private String jobStatus; /** * cron表达式 */ private String cronExpression; /** * 描述 */ private String description; /** * 任务执行时调用哪个类的方法 包名+类名 */ private String beanClass; /** * 任务是否有状态 */ private String isConcurrent; /** * Spring bean */ private String springBean; /** * 任务调用的方法名 */ private String methodName; public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; } public String getJobGroup() { return jobGroup; } public void setJobGroup(String jobGroup) { this.jobGroup = jobGroup; } public String getJobStatus() { return jobStatus; } public void setJobStatus(String jobStatus) { this.jobStatus = jobStatus; } public String getCronExpression() { return cronExpression; } public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getBeanClass() { return beanClass; } public void setBeanClass(String beanClass) { this.beanClass = beanClass; } public String getIsConcurrent() { return isConcurrent; } public void setIsConcurrent(String isConcurrent) { this.isConcurrent = isConcurrent; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getSpringBean() { return springBean; } public void setSpringBean(String springBean) { this.springBean = springBean; } @Override public void execute(JobExecutionContext context) { // TODO Auto-generated method stub } } ================================================ FILE: src/main/java/me/zbl/common/domain/TableDO.java ================================================ package me.zbl.common.domain; import java.util.List; /** * 表数据 * * @author 郑保乐 * @email 18333298410@163.com * @date 2016年12月20日 上午12:02:55 */ public class TableDO { //表的名称 private String tableName; //表的备注 private String comments; //表的主键 private ColumnDO pk; //表的列名(不包含主键) private List columns; //类名(第一个字母大写),如:sys_user => SysUser private String className; //类名(第一个字母小写),如:sys_user => sysUser private String classname; public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } public String getComments() { return comments; } public void setComments(String comments) { this.comments = comments; } public ColumnDO getPk() { return pk; } public void setPk(ColumnDO pk) { this.pk = pk; } public List getColumns() { return columns; } public void setColumns(List columns) { this.columns = columns; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getClassname() { return classname; } public void setClassname(String classname) { this.classname = classname; } @Override public String toString() { return "TableDO{" + "tableName='" + tableName + '\'' + ", comments='" + comments + '\'' + ", pk=" + pk + ", columns=" + columns + ", className='" + className + '\'' + ", classname='" + classname + '\'' + '}'; } } ================================================ FILE: src/main/java/me/zbl/common/domain/TaskDO.java ================================================ package me.zbl.common.domain; import java.io.Serializable; import java.util.Date; /** * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-25 15:09:21 */ public class TaskDO implements Serializable { private static final long serialVersionUID = 1L; // private Long id; // cron表达式 private String cronExpression; // 任务调用的方法名 private String methodName; // 任务是否有状态 private String isConcurrent; // 任务描述 private String description; // 更新者 private String updateBy; // 任务执行时调用哪个类的方法 包名+类名 private String beanClass; // 创建时间 private Date createDate; // 任务状态 private String jobStatus; // 任务分组 private String jobGroup; // 更新时间 private Date updateDate; // 创建者 private String createBy; // Spring bean private String springBean; // 任务名 private String jobName; /** * 获取: */ public Long getId() { return id; } /** * 设置: */ public void setId(Long id) { this.id = id; } /** * 获取:cron表达式 */ public String getCronExpression() { return cronExpression; } /** * 设置:cron表达式 */ public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } /** * 获取:任务调用的方法名 */ public String getMethodName() { return methodName; } /** * 设置:任务调用的方法名 */ public void setMethodName(String methodName) { this.methodName = methodName; } /** * 获取:任务是否有状态 */ public String getIsConcurrent() { return isConcurrent; } /** * 设置:任务是否有状态 */ public void setIsConcurrent(String isConcurrent) { this.isConcurrent = isConcurrent; } /** * 获取:任务描述 */ public String getDescription() { return description; } /** * 设置:任务描述 */ public void setDescription(String description) { this.description = description; } /** * 获取:更新者 */ public String getUpdateBy() { return updateBy; } /** * 设置:更新者 */ public void setUpdateBy(String updateBy) { this.updateBy = updateBy; } /** * 获取:任务执行时调用哪个类的方法 包名+类名 */ public String getBeanClass() { return beanClass; } /** * 设置:任务执行时调用哪个类的方法 包名+类名 */ public void setBeanClass(String beanClass) { this.beanClass = beanClass; } /** * 获取:创建时间 */ public Date getCreateDate() { return createDate; } /** * 设置:创建时间 */ public void setCreateDate(Date createDate) { this.createDate = createDate; } /** * 获取:任务状态 */ public String getJobStatus() { return jobStatus; } /** * 设置:任务状态 */ public void setJobStatus(String jobStatus) { this.jobStatus = jobStatus; } /** * 获取:任务分组 */ public String getJobGroup() { return jobGroup; } /** * 设置:任务分组 */ public void setJobGroup(String jobGroup) { this.jobGroup = jobGroup; } /** * 获取:更新时间 */ public Date getUpdateDate() { return updateDate; } /** * 设置:更新时间 */ public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } /** * 获取:创建者 */ public String getCreateBy() { return createBy; } /** * 设置:创建者 */ public void setCreateBy(String createBy) { this.createBy = createBy; } /** * 获取:Spring bean */ public String getSpringBean() { return springBean; } /** * 设置:Spring bean */ public void setSpringBean(String springBean) { this.springBean = springBean; } /** * 获取:任务名 */ public String getJobName() { return jobName; } /** * 设置:任务名 */ public void setJobName(String jobName) { this.jobName = jobName; } @Override public String toString() { return "TaskDO{" + "id=" + id + ", cronExpression='" + cronExpression + '\'' + ", methodName='" + methodName + '\'' + ", isConcurrent='" + isConcurrent + '\'' + ", description='" + description + '\'' + ", updateBy='" + updateBy + '\'' + ", beanClass='" + beanClass + '\'' + ", createDate=" + createDate + ", jobStatus='" + jobStatus + '\'' + ", jobGroup='" + jobGroup + '\'' + ", updateDate=" + updateDate + ", createBy='" + createBy + '\'' + ", springBean='" + springBean + '\'' + ", jobName='" + jobName + '\'' + '}'; } } ================================================ FILE: src/main/java/me/zbl/common/domain/Tree.java ================================================ package me.zbl.common.domain; import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * tree TODO
* * @author 郑保乐 */ public class Tree { /** * 节点ID */ private String id; /** * 显示节点文本 */ private String text; /** * 节点状态,open closed */ private Map state; /** * 节点是否被选中 true false */ private boolean checked = false; /** * 节点属性 */ private Map attributes; /** * 节点的子节点 */ private List> children = new ArrayList>(); /** * 父ID */ private String parentId; /** * 是否有父节点 */ private boolean hasParent = false; /** * 是否有子节点 */ private boolean hasChildren = false; public Tree(String id, String text, Map state, boolean checked, Map attributes, List> children, boolean isParent, boolean isChildren, String parentID) { super(); this.id = id; this.text = text; this.state = state; this.checked = checked; this.attributes = attributes; this.children = children; this.hasParent = isParent; this.hasChildren = isChildren; this.parentId = parentID; } public Tree() { super(); } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } public Map getState() { return state; } public void setState(Map state) { this.state = state; } public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } public Map getAttributes() { return attributes; } public void setAttributes(Map attributes) { this.attributes = attributes; } public List> getChildren() { return children; } public void setChildren(boolean isChildren) { this.hasChildren = isChildren; } public void setChildren(List> children) { this.children = children; } public boolean isHasParent() { return hasParent; } public void setHasParent(boolean isParent) { this.hasParent = isParent; } public boolean isHasChildren() { return hasChildren; } public String getParentId() { return parentId; } public void setParentId(String parentId) { this.parentId = parentId; } @Override public String toString() { return JSON.toJSONString(this); } } ================================================ FILE: src/main/java/me/zbl/common/exception/BDException.java ================================================ package me.zbl.common.exception; /** * 自定义异常 */ public class BDException extends RuntimeException { private static final long serialVersionUID = 1L; private String msg; private int code = 500; public BDException(String msg) { super(msg); this.msg = msg; } public BDException(String msg, Throwable e) { super(msg, e); this.msg = msg; } public BDException(String msg, int code) { super(msg); this.msg = msg; this.code = code; } public BDException(String msg, int code, Throwable e) { super(msg, e); this.msg = msg; this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } } ================================================ FILE: src/main/java/me/zbl/common/exception/BDExceptionHandler.java ================================================ package me.zbl.common.exception; import me.zbl.common.config.Constant; import me.zbl.common.domain.LogDO; import me.zbl.common.service.LogService; import me.zbl.common.utils.HttpServletUtils; import me.zbl.common.utils.R; import me.zbl.common.utils.ShiroUtils; import me.zbl.system.domain.UserDO; import org.apache.shiro.authz.AuthorizationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.util.Date; /** * 异常处理器 */ @RestControllerAdvice public class BDExceptionHandler { @Autowired LogService logService; private Logger logger = LoggerFactory.getLogger(getClass()); // // /** // * 自定义异常 // */ // @ExceptionHandler(BDException.class) // public R handleBDException(BDException e) { // logger.error(e.getMessage(), e); // R r = new R(); // r.put("code", e.getCode()); // r.put("msg", e.getMessage()); // return r; // } // // @ExceptionHandler(DuplicateKeyException.class) // public R handleDuplicateKeyException(DuplicateKeyException e) { // logger.error(e.getMessage(), e); // return R.error("数据库中已存在该记录"); // } // // @ExceptionHandler(org.springframework.web.servlet.NoHandlerFoundException.class) // public R noHandlerFoundException(org.springframework.web.servlet.NoHandlerFoundException e) { // logger.error(e.getMessage(), e); // return R.error(404, "没找找到页面"); // } @ExceptionHandler(AuthorizationException.class) public Object handleAuthorizationException(AuthorizationException e, HttpServletRequest request) { logger.error(e.getMessage(), e); if (HttpServletUtils.jsAjax(request)) { return R.error(403, "未授权"); } return new ModelAndView("error/403"); } @ExceptionHandler({Exception.class}) public Object handleException(Exception e, HttpServletRequest request) { LogDO logDO = new LogDO(); logDO.setGmtCreate(new Date()); logDO.setOperation(Constant.LOG_ERROR); logDO.setMethod(request.getRequestURL().toString()); logDO.setParams(e.toString()); UserDO current = ShiroUtils.getUser(); if (null != current) { logDO.setUserId(current.getUserId()); logDO.setUsername(current.getUsername()); } logService.save(logDO); logger.error(e.getMessage(), e); if (HttpServletUtils.jsAjax(request)) { return R.error(500, "服务器错误,请联系管理员"); } return new ModelAndView("error/500"); } } ================================================ FILE: src/main/java/me/zbl/common/exception/MainsiteErrorController.java ================================================ package me.zbl.common.exception; import me.zbl.common.utils.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.web.ErrorAttributes; import org.springframework.boot.autoconfigure.web.ErrorController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @RestController public class MainsiteErrorController implements ErrorController { private static final String ERROR_PATH = "/error"; @Autowired ErrorAttributes errorAttributes; private Logger logger = LoggerFactory.getLogger(getClass()); @RequestMapping( value = {ERROR_PATH}, produces = {"text/html"} ) public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) { int code = response.getStatus(); if (404 == code) { return new ModelAndView("error/404"); } else if (403 == code) { return new ModelAndView("error/403"); } else if (401 == code) { return new ModelAndView("login"); } else { return new ModelAndView("error/500"); } } @RequestMapping(value = ERROR_PATH) public R handleError(HttpServletRequest request, HttpServletResponse response) { response.setStatus(200); int code = response.getStatus(); if (404 == code) { return R.error(404, "未找到资源"); } else if (403 == code) { return R.error(403, "没有访问权限"); } else if (401 == code) { return R.error(403, "登录过期"); } else { return R.error(500, "服务器错误"); } } @Override public String getErrorPath() { return ERROR_PATH; } } ================================================ FILE: src/main/java/me/zbl/common/listenner/ScheduleJobInitListener.java ================================================ package me.zbl.common.listenner; import me.zbl.common.quartz.utils.QuartzManager; import me.zbl.common.service.JobService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @Component @Order(value = 1) public class ScheduleJobInitListener implements CommandLineRunner { @Autowired JobService scheduleJobService; @Autowired QuartzManager quartzManager; @Override public void run(String... arg0) { try { scheduleJobService.initSchedule(); } catch (Exception e) { e.printStackTrace(); } } } ================================================ FILE: src/main/java/me/zbl/common/quartz/factory/JobFactory.java ================================================ package me.zbl.common.quartz.factory; import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.scheduling.quartz.AdaptableJobFactory; import org.springframework.stereotype.Component; @Component public class JobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { //调用父类的方法 Object jobInstance = super.createJobInstance(bundle); //进行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance; } } ================================================ FILE: src/main/java/me/zbl/common/quartz/utils/QuartzManager.java ================================================ package me.zbl.common.quartz.utils; import me.zbl.common.domain.ScheduleJob; import org.apache.log4j.Logger; import org.quartz.*; import org.quartz.DateBuilder.IntervalUnit; import org.quartz.impl.matchers.GroupMatcher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Set; /** * @title: QuartzManager.java * @description: 计划任务管理 */ @Service public class QuartzManager { public final Logger log = Logger.getLogger(this.getClass()); // private SchedulerFactoryBean schedulerFactoryBean // =SpringContextHolder.getBean(SchedulerFactoryBean.class); // @Autowired // @Qualifier("schedulerFactoryBean") // private SchedulerFactoryBean schedulerFactoryBean; @Autowired private Scheduler scheduler; /** * 添加任务 * * @param job * * @throws SchedulerException */ public void addJob(ScheduleJob job) { try { // 创建jobDetail实例,绑定Job实现类 // 指明job的名称,所在组的名称,以及绑定job类 Class jobClass = (Class) (Class.forName(job.getBeanClass()).newInstance() .getClass()); JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(job.getJobName(), job.getJobGroup())// 任务名称和组构成任务key .build(); // 定义调度触发规则 // 使用cornTrigger规则 Trigger trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup())// 触发器key .startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND)) .withSchedule(CronScheduleBuilder.cronSchedule(job.getCronExpression())).startNow().build(); // 把作业和触发器注册到任务调度中 scheduler.scheduleJob(jobDetail, trigger); // 启动 if (!scheduler.isShutdown()) { scheduler.start(); } } catch (Exception e) { e.printStackTrace(); } } /** * 获取所有计划中的任务列表 * * @return * * @throws SchedulerException */ public List getAllJob() throws SchedulerException { GroupMatcher matcher = GroupMatcher.anyJobGroup(); Set jobKeys = scheduler.getJobKeys(matcher); List jobList = new ArrayList(); for (JobKey jobKey : jobKeys) { List triggers = scheduler.getTriggersOfJob(jobKey); for (Trigger trigger : triggers) { ScheduleJob job = new ScheduleJob(); job.setJobName(jobKey.getName()); job.setJobGroup(jobKey.getGroup()); job.setDescription("触发器:" + trigger.getKey()); Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); job.setJobStatus(triggerState.name()); if (trigger instanceof CronTrigger) { CronTrigger cronTrigger = (CronTrigger) trigger; String cronExpression = cronTrigger.getCronExpression(); job.setCronExpression(cronExpression); } jobList.add(job); } } return jobList; } /** * 所有正在运行的job * * @return * * @throws SchedulerException */ public List getRunningJob() throws SchedulerException { List executingJobs = scheduler.getCurrentlyExecutingJobs(); List jobList = new ArrayList(executingJobs.size()); for (JobExecutionContext executingJob : executingJobs) { ScheduleJob job = new ScheduleJob(); JobDetail jobDetail = executingJob.getJobDetail(); JobKey jobKey = jobDetail.getKey(); Trigger trigger = executingJob.getTrigger(); job.setJobName(jobKey.getName()); job.setJobGroup(jobKey.getGroup()); job.setDescription("触发器:" + trigger.getKey()); Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey()); job.setJobStatus(triggerState.name()); if (trigger instanceof CronTrigger) { CronTrigger cronTrigger = (CronTrigger) trigger; String cronExpression = cronTrigger.getCronExpression(); job.setCronExpression(cronExpression); } jobList.add(job); } return jobList; } /** * 暂停一个job * * @param scheduleJob * * @throws SchedulerException */ public void pauseJob(ScheduleJob scheduleJob) throws SchedulerException { JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.pauseJob(jobKey); } /** * 恢复一个job * * @param scheduleJob * * @throws SchedulerException */ public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException { JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.resumeJob(jobKey); } /** * 删除一个job * * @param scheduleJob * * @throws SchedulerException */ public void deleteJob(ScheduleJob scheduleJob) throws SchedulerException { JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.deleteJob(jobKey); } /** * 立即执行job * * @param scheduleJob * * @throws SchedulerException */ public void runAJobNow(ScheduleJob scheduleJob) throws SchedulerException { JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); scheduler.triggerJob(jobKey); } /** * 更新job时间表达式 * * @param scheduleJob * * @throws SchedulerException */ public void updateJobCron(ScheduleJob scheduleJob) throws SchedulerException { TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()); trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); scheduler.rescheduleJob(triggerKey, trigger); } } ================================================ FILE: src/main/java/me/zbl/common/redis/shiro/RedisCache.java ================================================ package me.zbl.common.redis.shiro; /** * @author 郑保乐 * @version V1.0 */ import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheException; import org.apache.shiro.util.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; public class RedisCache implements Cache { private Logger logger = LoggerFactory.getLogger(this.getClass()); /** * The wrapped Jedis instance. */ private RedisManager cache; /** * The Redis key prefix for the sessions */ private String keyPrefix = "shiro_redis_session:"; /** * 通过一个JedisManager实例构造RedisCache */ public RedisCache(RedisManager cache) { if (cache == null) { throw new IllegalArgumentException("Cache argument cannot be null."); } this.cache = cache; } /** * Constructs a cache instance with the specified * Redis manager and using a custom key prefix. * * @param cache The cache manager instance * @param prefix The Redis key prefix */ public RedisCache(RedisManager cache, String prefix) { this(cache); // set the prefix this.keyPrefix = prefix; } /** * Returns the Redis session keys * prefix. * * @return The prefix */ public String getKeyPrefix() { return keyPrefix; } /** * Sets the Redis sessions key * prefix. * * @param keyPrefix The prefix */ public void setKeyPrefix(String keyPrefix) { this.keyPrefix = keyPrefix; } /** * 获得byte[]型的key * * @param key * * @return */ private byte[] getByteKey(K key) { if (key instanceof String) { String preKey = this.keyPrefix + key; return preKey.getBytes(); } else { return SerializeUtils.serialize(key); } } @Override public V get(K key) throws CacheException { logger.debug("根据key从Redis中获取对象 key [" + key + "]"); try { if (key == null) { return null; } else { byte[] rawValue = cache.get(getByteKey(key)); @SuppressWarnings("unchecked") V value = (V) SerializeUtils.deserialize(rawValue); return value; } } catch (Throwable t) { throw new CacheException(t); } } @Override public V put(K key, V value) throws CacheException { logger.debug("根据key从存储 key [" + key + "]"); try { cache.set(getByteKey(key), SerializeUtils.serialize(value)); return value; } catch (Throwable t) { throw new CacheException(t); } } @Override public V remove(K key) throws CacheException { logger.debug("从redis中删除 key [" + key + "]"); try { V previous = get(key); cache.del(getByteKey(key)); return previous; } catch (Throwable t) { throw new CacheException(t); } } @Override public void clear() throws CacheException { logger.debug("从redis中删除所有元素"); try { cache.flushDB(); } catch (Throwable t) { throw new CacheException(t); } } @Override public int size() { try { Long longSize = new Long(cache.dbSize()); return longSize.intValue(); } catch (Throwable t) { throw new CacheException(t); } } @SuppressWarnings("unchecked") @Override public Set keys() { try { Set keys = cache.keys(this.keyPrefix + "*"); if (CollectionUtils.isEmpty(keys)) { return Collections.emptySet(); } else { Set newKeys = new HashSet(); for (byte[] key : keys) { newKeys.add((K) key); } return newKeys; } } catch (Throwable t) { throw new CacheException(t); } } @Override public Collection values() { try { Set keys = cache.keys(this.keyPrefix + "*"); if (!CollectionUtils.isEmpty(keys)) { List values = new ArrayList(keys.size()); for (byte[] key : keys) { @SuppressWarnings("unchecked") V value = get((K) key); if (value != null) { values.add(value); } } return Collections.unmodifiableList(values); } else { return Collections.emptyList(); } } catch (Throwable t) { throw new CacheException(t); } } } ================================================ FILE: src/main/java/me/zbl/common/redis/shiro/RedisCacheManager.java ================================================ package me.zbl.common.redis.shiro; /** * @author 郑保乐 * @version V1.0 */ import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheException; import org.apache.shiro.cache.CacheManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; public class RedisCacheManager implements CacheManager { private static final Logger logger = LoggerFactory .getLogger(RedisCacheManager.class); // fast lookup by name map private final ConcurrentMap caches = new ConcurrentHashMap(); private RedisManager redisManager; /** * The Redis key prefix for caches */ private String keyPrefix = "shiro_redis_cache:"; /** * Returns the Redis session keys * prefix. * * @return The prefix */ public String getKeyPrefix() { return keyPrefix; } /** * Sets the Redis sessions key * prefix. * * @param keyPrefix The prefix */ public void setKeyPrefix(String keyPrefix) { this.keyPrefix = keyPrefix; } @Override public Cache getCache(String name) throws CacheException { logger.debug("获取名称为: " + name + " 的RedisCache实例"); Cache c = caches.get(name); if (c == null) { // initialize the Redis manager instance redisManager.init(); // create a new cache instance c = new RedisCache(redisManager, keyPrefix); // add it to the cache collection caches.put(name, c); } return c; } public RedisManager getRedisManager() { return redisManager; } public void setRedisManager(RedisManager redisManager) { this.redisManager = redisManager; } } ================================================ FILE: src/main/java/me/zbl/common/redis/shiro/RedisManager.java ================================================ package me.zbl.common.redis.shiro; /** * @author 郑保乐 * @version V1.0 */ import org.springframework.beans.factory.annotation.Value; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.util.Set; /** * */ public class RedisManager { private static JedisPool jedisPool = null; @Value("${spring.redis.host}") private String host = "127.0.0.1"; @Value("${spring.redis.port}") private int port = 6379; // 0 - never expire private int expire = 0; //timeout for jedis try to connect to redis server, not expire time! In milliseconds @Value("${spring.redis.timeout}") private int timeout = 0; @Value("${spring.redis.password}") private String password = ""; public RedisManager() { } /** * 初始化方法 */ public void init() { if (jedisPool == null) { if (password != null && !"".equals(password)) { jedisPool = new JedisPool(new JedisPoolConfig(), host, port, timeout, password); } else if (timeout != 0) { jedisPool = new JedisPool(new JedisPoolConfig(), host, port, timeout); } else { jedisPool = new JedisPool(new JedisPoolConfig(), host, port); } } } /** * get value from redis * * @param key * * @return */ public byte[] get(byte[] key) { byte[] value = null; Jedis jedis = jedisPool.getResource(); try { value = jedis.get(key); } finally { if (jedis != null) { jedis.close(); } } return value; } /** * set * * @param key * @param value * * @return */ public byte[] set(byte[] key, byte[] value) { Jedis jedis = jedisPool.getResource(); try { jedis.set(key, value); if (this.expire != 0) { jedis.expire(key, this.expire); } } finally { if (jedis != null) { jedis.close(); } } return value; } /** * set * * @param key * @param value * @param expire * * @return */ public byte[] set(byte[] key, byte[] value, int expire) { Jedis jedis = jedisPool.getResource(); try { jedis.set(key, value); if (expire != 0) { jedis.expire(key, expire); } } finally { if (jedis != null) { jedis.close(); } } return value; } /** * del * * @param key */ public void del(byte[] key) { Jedis jedis = jedisPool.getResource(); try { jedis.del(key); } finally { if (jedis != null) { jedis.close(); } } } /** * flush */ public void flushDB() { Jedis jedis = jedisPool.getResource(); try { jedis.flushDB(); } finally { if (jedis != null) { jedis.close(); } } } /** * size */ public Long dbSize() { Long dbSize = 0L; Jedis jedis = jedisPool.getResource(); try { dbSize = jedis.dbSize(); } finally { if (jedis != null) { jedis.close(); } } return dbSize; } /** * keys * * @param regex * * @return */ public Set keys(String pattern) { Set keys = null; Jedis jedis = jedisPool.getResource(); try { keys = jedis.keys(pattern.getBytes()); } finally { if (jedis != null) { jedis.close(); } } return keys; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public int getExpire() { return expire; } public void setExpire(int expire) { this.expire = expire; } public int getTimeout() { return timeout; } public void setTimeout(int timeout) { this.timeout = timeout; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ================================================ FILE: src/main/java/me/zbl/common/redis/shiro/RedisSessionDAO.java ================================================ package me.zbl.common.redis.shiro; import org.apache.shiro.session.Session; import org.apache.shiro.session.UnknownSessionException; import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Serializable; import java.util.Collection; import java.util.HashSet; import java.util.Set; /** * @author 郑保乐 * @version V1.0 */ public class RedisSessionDAO extends AbstractSessionDAO { private static Logger logger = LoggerFactory.getLogger(RedisSessionDAO.class); /** * shiro-redis的session对象前缀 */ private RedisManager redisManager; /** * The Redis key prefix for the sessions */ private String keyPrefix = "shiro_redis_session:"; @Override public void update(Session session) throws UnknownSessionException { this.saveSession(session); } /** * save session * * @param session * * @throws UnknownSessionException */ private void saveSession(Session session) throws UnknownSessionException { if (session == null || session.getId() == null) { logger.error("session or session id is null"); return; } byte[] key = getByteKey(session.getId()); byte[] value = SerializeUtils.serialize(session); session.setTimeout(redisManager.getExpire() * 1000); this.redisManager.set(key, value, redisManager.getExpire()); } @Override public void delete(Session session) { if (session == null || session.getId() == null) { logger.error("session or session id is null"); return; } redisManager.del(this.getByteKey(session.getId())); } @Override public Collection getActiveSessions() { Set sessions = new HashSet(); Set keys = redisManager.keys(this.keyPrefix + "*"); if (keys != null && keys.size() > 0) { for (byte[] key : keys) { Session s = (Session) SerializeUtils.deserialize(redisManager.get(key)); sessions.add(s); } } return sessions; } @Override protected Serializable doCreate(Session session) { Serializable sessionId = this.generateSessionId(session); this.assignSessionId(session, sessionId); this.saveSession(session); return sessionId; } @Override protected Session doReadSession(Serializable sessionId) { if (sessionId == null) { logger.error("session id is null"); return null; } Session s = (Session) SerializeUtils.deserialize(redisManager.get(this.getByteKey(sessionId))); return s; } /** * 获得byte[]型的key * * @param key * * @return */ private byte[] getByteKey(Serializable sessionId) { String preKey = this.keyPrefix + sessionId; return preKey.getBytes(); } public RedisManager getRedisManager() { return redisManager; } public void setRedisManager(RedisManager redisManager) { this.redisManager = redisManager; /** * 初始化redisManager */ this.redisManager.init(); } /** * Returns the Redis session keys * prefix. * * @return The prefix */ public String getKeyPrefix() { return keyPrefix; } /** * Sets the Redis sessions key * prefix. * * @param keyPrefix The prefix */ public void setKeyPrefix(String keyPrefix) { this.keyPrefix = keyPrefix; } } ================================================ FILE: src/main/java/me/zbl/common/redis/shiro/SerializeUtils.java ================================================ package me.zbl.common.redis.shiro; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.*; /** * @author 郑保乐 * @version V1.0 */ public class SerializeUtils { private static Logger logger = LoggerFactory.getLogger(SerializeUtils.class); /** * 反序列化 * * @param bytes * * @return */ public static Object deserialize(byte[] bytes) { Object result = null; if (isEmpty(bytes)) { return null; } try { ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes); try { ObjectInputStream objectInputStream = new ObjectInputStream(byteStream); try { result = objectInputStream.readObject(); } catch (ClassNotFoundException ex) { throw new Exception("Failed to deserialize object type", ex); } } catch (Throwable ex) { throw new Exception("Failed to deserialize", ex); } } catch (Exception e) { logger.error("Failed to deserialize", e); } return result; } public static boolean isEmpty(byte[] data) { return (data == null || data.length == 0); } /** * 序列化 * * @param object * * @return */ public static byte[] serialize(Object object) { byte[] result = null; if (object == null) { return new byte[0]; } try { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(128); try { if (!(object instanceof Serializable)) { throw new IllegalArgumentException(SerializeUtils.class.getSimpleName() + " requires a Serializable payload " + "but received an object of type [" + object.getClass().getName() + "]"); } ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteStream); objectOutputStream.writeObject(object); objectOutputStream.flush(); result = byteStream.toByteArray(); } catch (Throwable ex) { throw new Exception("Failed to serialize", ex); } } catch (Exception ex) { logger.error("Failed to serialize", ex); } return result; } } ================================================ FILE: src/main/java/me/zbl/common/service/DictService.java ================================================ package me.zbl.common.service; import me.zbl.common.domain.DictDO; import me.zbl.system.domain.UserDO; import java.util.List; import java.util.Map; /** * 字典表 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-29 18:28:07 */ public interface DictService { DictDO get(Long id); List list(Map map); int count(Map map); int save(DictDO dict); int update(DictDO dict); int remove(Long id); int batchRemove(Long[] ids); List listType(); String getName(String type, String value); /** * 获取爱好列表 * * @param userDO * * @return */ List getHobbyList(UserDO userDO); /** * 获取性别列表 * * @return */ List getSexList(); /** * 根据type获取数据 * * @param map * * @return */ List listByType(String type); } ================================================ FILE: src/main/java/me/zbl/common/service/FileService.java ================================================ package me.zbl.common.service; import me.zbl.common.domain.FileDO; import java.util.List; import java.util.Map; /** * 文件上传 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-19 16:02:20 */ public interface FileService { FileDO get(Long id); List list(Map map); int count(Map map); int save(FileDO sysFile); int update(FileDO sysFile); int remove(Long id); int batchRemove(Long[] ids); /** * 判断一个文件是否存在 * * @param url FileDO中存的路径 * * @return */ Boolean isExist(String url); } ================================================ FILE: src/main/java/me/zbl/common/service/GeneratorService.java ================================================ /** * */ package me.zbl.common.service; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; /** * @author 郑保乐 * @Time 2017年9月6日 * @description */ @Service public interface GeneratorService { List> list(); byte[] generatorCode(String[] tableNames); } ================================================ FILE: src/main/java/me/zbl/common/service/JobService.java ================================================ package me.zbl.common.service; import me.zbl.common.domain.TaskDO; import org.quartz.SchedulerException; import java.util.List; import java.util.Map; /** * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-26 20:53:48 */ public interface JobService { TaskDO get(Long id); List list(Map map); int count(Map map); int save(TaskDO taskScheduleJob); int update(TaskDO taskScheduleJob); int remove(Long id); int batchRemove(Long[] ids); void initSchedule() throws SchedulerException; void changeStatus(Long jobId, String cmd) throws SchedulerException; void updateCron(Long jobId) throws SchedulerException; } ================================================ FILE: src/main/java/me/zbl/common/service/LogService.java ================================================ package me.zbl.common.service; import me.zbl.common.domain.LogDO; import me.zbl.common.domain.PageDO; import me.zbl.common.utils.Query; import org.springframework.stereotype.Service; @Service public interface LogService { void save(LogDO logDO); PageDO queryList(Query query); int remove(Long id); int batchRemove(Long[] ids); } ================================================ FILE: src/main/java/me/zbl/common/service/impl/DictServiceImpl.java ================================================ package me.zbl.common.service.impl; import me.zbl.common.dao.DictDao; import me.zbl.common.domain.DictDO; import me.zbl.common.service.DictService; import me.zbl.common.utils.StringUtils; import me.zbl.system.domain.UserDO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @Service public class DictServiceImpl implements DictService { @Autowired private DictDao dictDao; @Override public DictDO get(Long id) { return dictDao.get(id); } @Override public List list(Map map) { return dictDao.list(map); } @Override public int count(Map map) { return dictDao.count(map); } @Override public int save(DictDO dict) { return dictDao.save(dict); } @Override public int update(DictDO dict) { return dictDao.update(dict); } @Override public int remove(Long id) { return dictDao.remove(id); } @Override public int batchRemove(Long[] ids) { return dictDao.batchRemove(ids); } @Override public List listType() { return dictDao.listType(); } @Override public String getName(String type, String value) { Map param = new HashMap(16); param.put("type", type); param.put("value", value); String rString = dictDao.list(param).get(0).getName(); return rString; } @Override public List getHobbyList(UserDO userDO) { Map param = new HashMap<>(16); param.put("type", "hobby"); List hobbyList = dictDao.list(param); if (StringUtils.isNotEmpty(userDO.getHobby())) { String userHobbys[] = userDO.getHobby().split(";"); for (String userHobby : userHobbys) { for (DictDO hobby : hobbyList) { if (!Objects.equals(userHobby, hobby.getId().toString())) { continue; } hobby.setRemarks("true"); break; } } } return hobbyList; } @Override public List getSexList() { Map param = new HashMap<>(16); param.put("type", "sex"); return dictDao.list(param); } @Override public List listByType(String type) { Map param = new HashMap<>(16); param.put("type", type); return dictDao.list(param); } } ================================================ FILE: src/main/java/me/zbl/common/service/impl/FileServiceImpl.java ================================================ package me.zbl.common.service.impl; import me.zbl.common.config.HospitalConfig; import me.zbl.common.dao.FileDao; import me.zbl.common.domain.FileDO; import me.zbl.common.service.FileService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.io.File; import java.util.List; import java.util.Map; @Service public class FileServiceImpl implements FileService { @Autowired private FileDao sysFileMapper; @Autowired private HospitalConfig hospitalConfig; @Override public FileDO get(Long id) { return sysFileMapper.get(id); } @Override public List list(Map map) { return sysFileMapper.list(map); } @Override public int count(Map map) { return sysFileMapper.count(map); } @Override public int save(FileDO sysFile) { return sysFileMapper.save(sysFile); } @Override public int update(FileDO sysFile) { return sysFileMapper.update(sysFile); } @Override public int remove(Long id) { return sysFileMapper.remove(id); } @Override public int batchRemove(Long[] ids) { return sysFileMapper.batchRemove(ids); } @Override public Boolean isExist(String url) { Boolean isExist = false; if (!StringUtils.isEmpty(url)) { String filePath = url.replace("/files/", ""); filePath = hospitalConfig.getUploadPath() + filePath; File file = new File(filePath); if (file.exists()) { isExist = true; } } return isExist; } } ================================================ FILE: src/main/java/me/zbl/common/service/impl/GeneratorServiceImpl.java ================================================ package me.zbl.common.service.impl; import me.zbl.common.dao.GeneratorMapper; import me.zbl.common.service.GeneratorService; import me.zbl.common.utils.GenUtils; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; import java.util.List; import java.util.Map; import java.util.zip.ZipOutputStream; @Service public class GeneratorServiceImpl implements GeneratorService { @Autowired GeneratorMapper generatorMapper; @Override public List> list() { List> list = generatorMapper.list(); return list; } @Override public byte[] generatorCode(String[] tableNames) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); for (String tableName : tableNames) { //查询表信息 Map table = generatorMapper.get(tableName); //查询列信息 List> columns = generatorMapper.listColumns(tableName); //生成代码 GenUtils.generatorCode(table, columns, zip); } IOUtils.closeQuietly(zip); return outputStream.toByteArray(); } } ================================================ FILE: src/main/java/me/zbl/common/service/impl/JobServiceImpl.java ================================================ package me.zbl.common.service.impl; import me.zbl.common.config.Constant; import me.zbl.common.dao.TaskDao; import me.zbl.common.domain.ScheduleJob; import me.zbl.common.domain.TaskDO; import me.zbl.common.quartz.utils.QuartzManager; import me.zbl.common.service.JobService; import me.zbl.common.utils.ScheduleJobUtils; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class JobServiceImpl implements JobService { @Autowired QuartzManager quartzManager; @Autowired private TaskDao taskScheduleJobMapper; @Override public TaskDO get(Long id) { return taskScheduleJobMapper.get(id); } @Override public List list(Map map) { return taskScheduleJobMapper.list(map); } @Override public int count(Map map) { return taskScheduleJobMapper.count(map); } @Override public int save(TaskDO taskScheduleJob) { return taskScheduleJobMapper.save(taskScheduleJob); } @Override public int update(TaskDO taskScheduleJob) { return taskScheduleJobMapper.update(taskScheduleJob); } @Override public int remove(Long id) { try { TaskDO scheduleJob = get(id); quartzManager.deleteJob(ScheduleJobUtils.entityToData(scheduleJob)); return taskScheduleJobMapper.remove(id); } catch (SchedulerException e) { e.printStackTrace(); return 0; } } @Override public int batchRemove(Long[] ids) { for (Long id : ids) { try { TaskDO scheduleJob = get(id); quartzManager.deleteJob(ScheduleJobUtils.entityToData(scheduleJob)); } catch (SchedulerException e) { e.printStackTrace(); return 0; } } return taskScheduleJobMapper.batchRemove(ids); } @Override public void initSchedule() { // 这里获取任务信息数据 List jobList = taskScheduleJobMapper.list(new HashMap(16)); for (TaskDO scheduleJob : jobList) { if ("1".equals(scheduleJob.getJobStatus())) { ScheduleJob job = ScheduleJobUtils.entityToData(scheduleJob); quartzManager.addJob(job); } } } @Override public void changeStatus(Long jobId, String cmd) throws SchedulerException { TaskDO scheduleJob = get(jobId); if (scheduleJob == null) { return; } if (Constant.STATUS_RUNNING_STOP.equals(cmd)) { quartzManager.deleteJob(ScheduleJobUtils.entityToData(scheduleJob)); scheduleJob.setJobStatus(ScheduleJob.STATUS_NOT_RUNNING); } else { if (!Constant.STATUS_RUNNING_START.equals(cmd)) { } else { scheduleJob.setJobStatus(ScheduleJob.STATUS_RUNNING); quartzManager.addJob(ScheduleJobUtils.entityToData(scheduleJob)); } } update(scheduleJob); } @Override public void updateCron(Long jobId) throws SchedulerException { TaskDO scheduleJob = get(jobId); if (scheduleJob == null) { return; } if (ScheduleJob.STATUS_RUNNING.equals(scheduleJob.getJobStatus())) { quartzManager.updateJobCron(ScheduleJobUtils.entityToData(scheduleJob)); } update(scheduleJob); } } ================================================ FILE: src/main/java/me/zbl/common/service/impl/LogServiceImpl.java ================================================ package me.zbl.common.service.impl; import me.zbl.common.dao.LogDao; import me.zbl.common.domain.LogDO; import me.zbl.common.domain.PageDO; import me.zbl.common.service.LogService; import me.zbl.common.utils.Query; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.List; @Service public class LogServiceImpl implements LogService { @Autowired LogDao logMapper; @Async @Override public void save(LogDO logDO) { logMapper.save(logDO); } @Override public PageDO queryList(Query query) { int total = logMapper.count(query); List logs = logMapper.list(query); PageDO page = new PageDO<>(); page.setTotal(total); page.setRows(logs); return page; } @Override public int remove(Long id) { int count = logMapper.remove(id); return count; } @Override public int batchRemove(Long[] ids) { return logMapper.batchRemove(ids); } } ================================================ FILE: src/main/java/me/zbl/common/task/WelcomeJob.java ================================================ package me.zbl.common.task; import me.zbl.oa.domain.Response; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; @Component public class WelcomeJob implements Job { @Autowired SimpMessagingTemplate template; @Override public void execute(JobExecutionContext arg0) { template.convertAndSend("/topic/getResponse", new Response("欢迎体验bootdo,这是一个任务计划,使用了websocket和quzrtz技术,可以在计划列表中取消,欢迎您加入qq群交流学习!")); } } ================================================ FILE: src/main/java/me/zbl/common/utils/BDException.java ================================================ package me.zbl.common.utils; /** * 自定义异常 */ public class BDException extends RuntimeException { private static final long serialVersionUID = 1L; private String msg; private int code = 500; public BDException(String msg) { super(msg); this.msg = msg; } public BDException(String msg, Throwable e) { super(msg, e); this.msg = msg; } public BDException(String msg, int code) { super(msg); this.msg = msg; this.code = code; } public BDException(String msg, int code, Throwable e) { super(msg, e); this.msg = msg; this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } } ================================================ FILE: src/main/java/me/zbl/common/utils/Base64Utils.java ================================================ package me.zbl.common.utils; public class Base64Utils { } ================================================ FILE: src/main/java/me/zbl/common/utils/BuildTree.java ================================================ package me.zbl.common.utils; import me.zbl.common.domain.Tree; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class BuildTree { public static Tree build(List> nodes) { if (nodes == null) { return null; } List> topNodes = new ArrayList>(); for (Tree children : nodes) { String pid = children.getParentId(); if (pid == null || "0".equals(pid)) { topNodes.add(children); continue; } for (Tree parent : nodes) { String id = parent.getId(); if (id != null && id.equals(pid)) { parent.getChildren().add(children); children.setHasParent(true); parent.setChildren(true); continue; } } } Tree root = new Tree(); if (topNodes.size() == 1) { root = topNodes.get(0); } else { root.setId("-1"); root.setParentId(""); root.setHasParent(false); root.setChildren(true); root.setChecked(true); root.setChildren(topNodes); root.setText("顶级节点"); Map state = new HashMap<>(16); state.put("opened", true); root.setState(state); } return root; } public static List> buildList(List> nodes, String idParam) { if (nodes == null) { return null; } List> topNodes = new ArrayList>(); for (Tree children : nodes) { String pid = children.getParentId(); if (pid == null || idParam.equals(pid)) { topNodes.add(children); continue; } for (Tree parent : nodes) { String id = parent.getId(); if (id != null && id.equals(pid)) { parent.getChildren().add(children); children.setHasParent(true); parent.setChildren(true); continue; } } } return topNodes; } } ================================================ FILE: src/main/java/me/zbl/common/utils/DateUtils.java ================================================ package me.zbl.common.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.SimpleDateFormat; import java.util.Date; /** * 日期处理 */ public class DateUtils { /** * 时间格式(yyyy-MM-dd) */ public final static String DATE_PATTERN = "yyyy-MM-dd"; /** * 时间格式(yyyy-MM-dd HH:mm:ss) */ public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; private final static Logger logger = LoggerFactory.getLogger(DateUtils.class); public static String format(Date date) { return format(date, DATE_PATTERN); } public static String format(Date date, String pattern) { if (date != null) { SimpleDateFormat df = new SimpleDateFormat(pattern); return df.format(date); } return null; } /** * 计算距离现在多久,非精确 * * @param date * * @return */ public static String getTimeBefore(Date date) { Date now = new Date(); long l = now.getTime() - date.getTime(); long day = l / (24 * 60 * 60 * 1000); long hour = (l / (60 * 60 * 1000) - day * 24); long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60); long s = (l / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); String r = ""; if (day > 0) { r += day + "天"; } else if (hour > 0) { r += hour + "小时"; } else if (min > 0) { r += min + "分"; } else if (s > 0) { r += s + "秒"; } r += "前"; return r; } /** * 计算距离现在多久,精确 * * @param date * * @return */ public static String getTimeBeforeAccurate(Date date) { Date now = new Date(); long l = now.getTime() - date.getTime(); long day = l / (24 * 60 * 60 * 1000); long hour = (l / (60 * 60 * 1000) - day * 24); long min = ((l / (60 * 1000)) - day * 24 * 60 - hour * 60); long s = (l / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); String r = ""; if (day > 0) { r += day + "天"; } if (hour > 0) { r += hour + "小时"; } if (min > 0) { r += min + "分"; } if (s > 0) { r += s + "秒"; } r += "前"; return r; } } ================================================ FILE: src/main/java/me/zbl/common/utils/ExceptionUtils.java ================================================ package me.zbl.common.utils; public class ExceptionUtils { public static String getExceptionAllinformation(Exception ex) { String sOut = ""; StackTraceElement[] trace = ex.getStackTrace(); for (StackTraceElement s : trace) { sOut += "\tat " + s + "\r\n"; } return sOut; } } ================================================ FILE: src/main/java/me/zbl/common/utils/FileType.java ================================================ package me.zbl.common.utils; /* author:zss * 日期:2017年3月31日 * 功能:根据文件名称判断类型 * 接受参数类型:String * 返回参数类型:String * 备注:文件类型不完善,有需要的自行添加 */ public class FileType { public static int fileType(String fileName) { if (fileName == null) { fileName = "文件名为空!"; return 500; } else { // 获取文件后缀名并转化为写,用于后续比较 String fileType = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()).toLowerCase(); // 创建图片类型数组0 String[] img = {"bmp", "jpg", "jpeg", "png", "tiff", "gif", "pcx", "tga", "exif", "fpx", "svg", "psd", "cdr", "pcd", "dxf", "ufo", "eps", "ai", "raw", "wmf"}; for (int i = 0; i < img.length; i++) { if (img[i].equals(fileType)) { return 0; } } // 创建文档类型数组1 String[] document = {"txt", "doc", "docx", "xls", "htm", "html", "jsp", "rtf", "wpd", "pdf", "ppt"}; for (int i = 0; i < document.length; i++) { if (document[i].equals(fileType)) { return 1; } } // 创建视频类型数组2 String[] video = {"mp4", "avi", "mov", "wmv", "asf", "navi", "3gp", "mkv", "f4v", "rmvb", "webm"}; for (int i = 0; i < video.length; i++) { if (video[i].equals(fileType)) { return 2; } } // 创建音乐类型数组3 String[] music = {"mp3", "wma", "wav", "mod", "ra", "cd", "md", "asf", "aac", "vqf", "ape", "mid", "ogg", "m4a", "vqf"}; for (int i = 0; i < music.length; i++) { if (music[i].equals(fileType)) { return 3; } } } //4 return 99; } } ================================================ FILE: src/main/java/me/zbl/common/utils/FileUtil.java ================================================ package me.zbl.common.utils; import java.io.File; import java.io.FileOutputStream; import java.util.UUID; public class FileUtil { public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception { File targetFile = new File(filePath); if (!targetFile.exists()) { targetFile.mkdirs(); } FileOutputStream out = new FileOutputStream(filePath + fileName); out.write(file); out.flush(); out.close(); } public static boolean deleteFile(String fileName) { File file = new File(fileName); // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除 if (file.exists() && file.isFile()) { return file.delete(); } else { return false; } } public static String renameToUUID(String fileName) { return UUID.randomUUID() + "." + fileName.substring(fileName.lastIndexOf(".") + 1); } } ================================================ FILE: src/main/java/me/zbl/common/utils/GenUtils.java ================================================ package me.zbl.common.utils; import me.zbl.common.config.Constant; import me.zbl.common.domain.ColumnDO; import me.zbl.common.domain.TableDO; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.WordUtils; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 代码生成器 工具类 */ public class GenUtils { public static List getTemplates() { List templates = new ArrayList(); templates.add("templates/common/generator/domain.java.vm"); templates.add("templates/common/generator/Dao.java.vm"); //templates.add("templates/common/generator/Mapper.java.vm"); templates.add("templates/common/generator/Mapper.xml.vm"); templates.add("templates/common/generator/Service.java.vm"); templates.add("templates/common/generator/ServiceImpl.java.vm"); templates.add("templates/common/generator/Controller.java.vm"); templates.add("templates/common/generator/list.html.vm"); templates.add("templates/common/generator/add.html.vm"); templates.add("templates/common/generator/edit.html.vm"); templates.add("templates/common/generator/list.js.vm"); templates.add("templates/common/generator/add.js.vm"); templates.add("templates/common/generator/edit.js.vm"); //templates.add("templates/common/generator/menu.sql.vm"); return templates; } /** * 生成代码 */ public static void generatorCode(Map table, List> columns, ZipOutputStream zip) { //配置信息 Configuration config = getConfig(); //表信息 TableDO tableDO = new TableDO(); tableDO.setTableName(table.get("tableName")); tableDO.setComments(table.get("tableComment")); //表名转换成Java类名 String className = tableToJava(tableDO.getTableName(), config.getString("tablePrefix"), config.getString("autoRemovePre")); tableDO.setClassName(className); tableDO.setClassname(StringUtils.uncapitalize(className)); //列信息 List columsList = new ArrayList<>(); for (Map column : columns) { ColumnDO columnDO = new ColumnDO(); columnDO.setColumnName(column.get("columnName")); columnDO.setDataType(column.get("dataType")); columnDO.setComments(column.get("columnComment")); columnDO.setExtra(column.get("extra")); //列名转换成Java属性名 String attrName = columnToJava(columnDO.getColumnName()); columnDO.setAttrName(attrName); columnDO.setAttrname(StringUtils.uncapitalize(attrName)); //列的数据类型,转换成Java类型 String attrType = config.getString(columnDO.getDataType(), "unknowType"); columnDO.setAttrType(attrType); //是否主键 if ("PRI".equalsIgnoreCase(column.get("columnKey")) && tableDO.getPk() == null) { tableDO.setPk(columnDO); } columsList.add(columnDO); } tableDO.setColumns(columsList); //没主键,则第一个字段为主键 if (tableDO.getPk() == null) { tableDO.setPk(tableDO.getColumns().get(0)); } //设置velocity资源加载器 Properties prop = new Properties(); prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); Velocity.init(prop); //封装模板数据 Map map = new HashMap<>(16); map.put("tableName", tableDO.getTableName()); map.put("comments", tableDO.getComments()); map.put("pk", tableDO.getPk()); map.put("className", tableDO.getClassName()); map.put("classname", tableDO.getClassname()); map.put("pathName", config.getString("package").substring(config.getString("package").lastIndexOf(".") + 1)); map.put("columns", tableDO.getColumns()); map.put("package", config.getString("package")); map.put("author", config.getString("author")); map.put("email", config.getString("email")); map.put("datetime", DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN)); VelocityContext context = new VelocityContext(map); //获取模板列表 List templates = getTemplates(); for (String template : templates) { //渲染模板 StringWriter sw = new StringWriter(); Template tpl = Velocity.getTemplate(template, "UTF-8"); tpl.merge(context, sw); try { //添加到zip zip.putNextEntry(new ZipEntry(getFileName(template, tableDO.getClassname(), tableDO.getClassName(), config.getString("package").substring(config.getString("package").lastIndexOf(".") + 1)))); IOUtils.write(sw.toString(), zip, "UTF-8"); IOUtils.closeQuietly(sw); zip.closeEntry(); } catch (IOException e) { throw new BDException("渲染模板失败,表名:" + tableDO.getTableName(), e); } } } /** * 列名转换成Java属性名 */ public static String columnToJava(String columnName) { return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", ""); } /** * 表名转换成Java类名 */ public static String tableToJava(String tableName, String tablePrefix, String autoRemovePre) { if (Constant.AUTO_REOMVE_PRE.equals(autoRemovePre)) { tableName = tableName.substring(tableName.indexOf("_") + 1); } if (StringUtils.isNotBlank(tablePrefix)) { tableName = tableName.replace(tablePrefix, ""); } return columnToJava(tableName); } /** * 获取配置信息 */ public static Configuration getConfig() { try { return new PropertiesConfiguration("generator.properties"); } catch (ConfigurationException e) { throw new BDException("获取配置文件失败,", e); } } /** * 获取文件名 */ public static String getFileName(String template, String classname, String className, String packageName) { String packagePath = "main" + File.separator + "java" + File.separator; //String modulesname=config.getString("packageName"); if (StringUtils.isNotBlank(packageName)) { packagePath += packageName.replace(".", File.separator) + File.separator; } if (template.contains("domain.java.vm")) { return packagePath + "domain" + File.separator + className + "DO.java"; } if (template.contains("Dao.java.vm")) { return packagePath + "repo" + File.separator + className + "Dao.java"; } // if(template.contains("Mapper.java.vm")){ // return packagePath + "repo" + File.separator + className + "Mapper.java"; // } if (template.contains("Service.java.vm")) { return packagePath + "service" + File.separator + className + "Service.java"; } if (template.contains("ServiceImpl.java.vm")) { return packagePath + "service" + File.separator + "impl" + File.separator + className + "ServiceImpl.java"; } if (template.contains("Controller.java.vm")) { return packagePath + "controller" + File.separator + className + "Controller.java"; } if (template.contains("Mapper.xml.vm")) { return "main" + File.separator + "resources" + File.separator + "mapper" + File.separator + packageName + File.separator + className + "Mapper.xml"; } if (template.contains("list.html.vm")) { return "main" + File.separator + "resources" + File.separator + "templates" + File.separator + packageName + File.separator + classname + File.separator + classname + ".html"; // + "modules" + File.separator + "generator" + File.separator + className.toLowerCase() + ".html"; } if (template.contains("add.html.vm")) { return "main" + File.separator + "resources" + File.separator + "templates" + File.separator + packageName + File.separator + classname + File.separator + "add.html"; } if (template.contains("edit.html.vm")) { return "main" + File.separator + "resources" + File.separator + "templates" + File.separator + packageName + File.separator + classname + File.separator + "edit.html"; } if (template.contains("list.js.vm")) { return "main" + File.separator + "resources" + File.separator + "static" + File.separator + "js" + File.separator + "appjs" + File.separator + packageName + File.separator + classname + File.separator + classname + ".js"; // + "modules" + File.separator + "generator" + File.separator + className.toLowerCase() + ".js"; } if (template.contains("add.js.vm")) { return "main" + File.separator + "resources" + File.separator + "static" + File.separator + "js" + File.separator + "appjs" + File.separator + packageName + File.separator + classname + File.separator + "add.js"; } if (template.contains("edit.js.vm")) { return "main" + File.separator + "resources" + File.separator + "static" + File.separator + "js" + File.separator + "appjs" + File.separator + packageName + File.separator + classname + File.separator + "edit.js"; } // if(template.contains("menu.sql.vm")){ // return className.toLowerCase() + "_menu.sql"; // } return null; } } ================================================ FILE: src/main/java/me/zbl/common/utils/HttpContextUtils.java ================================================ package me.zbl.common.utils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; public class HttpContextUtils { public static HttpServletRequest getHttpServletRequest() { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } } ================================================ FILE: src/main/java/me/zbl/common/utils/HttpServletUtils.java ================================================ package me.zbl.common.utils; import javax.servlet.http.HttpServletRequest; public class HttpServletUtils { public static boolean jsAjax(HttpServletRequest req) { //判断是否为ajax请求,默认不是 boolean isAjaxRequest = false; if (!StringUtils.isBlank(req.getHeader("x-requested-with")) && req.getHeader("x-requested-with").equals("XMLHttpRequest")) { isAjaxRequest = true; } return isAjaxRequest; } } ================================================ FILE: src/main/java/me/zbl/common/utils/IPUtils.java ================================================ package me.zbl.common.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.HttpServletRequest; public class IPUtils { private static Logger logger = LoggerFactory.getLogger(IPUtils.class); /** * 获取IP地址 *

* 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; } } ================================================ FILE: src/main/java/me/zbl/common/utils/ImageUtils.java ================================================ package me.zbl.common.utils; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; /** * @author 郑保乐 * @date 2017/12/18. */ public class ImageUtils { /*** * 剪裁图片 * @param file 图片 * @param x 起点横坐标 * @param y 纵坐标 * @param w 长 * @param h 高 * @throws IOException * @date */ public static BufferedImage cutImage(MultipartFile file, int x, int y, int w, int h, String prefix) { Iterator iterator = ImageIO.getImageReadersByFormatName(prefix); try { ImageReader reader = (ImageReader) iterator.next(); //转换成输入流 InputStream in = file.getInputStream(); ImageInputStream iis = ImageIO.createImageInputStream(in); reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); Rectangle rect = new Rectangle(x, y, w, h); param.setSourceRegion(rect); BufferedImage bi = reader.read(0, param); return bi; } catch (Exception ignored) { } return null; } /*** * 图片旋转指定角度 * @param bufferedimage 图像 * @param degree 角度 * @return * @date */ public static BufferedImage rotateImage(BufferedImage bufferedimage, int degree) { int w = bufferedimage.getWidth(); int h = bufferedimage.getHeight(); int type = bufferedimage.getColorModel().getTransparency(); BufferedImage img; Graphics2D graphics2d; (graphics2d = (img = new BufferedImage(w, h, type)) .createGraphics()).setRenderingHint( RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); graphics2d.setPaint(Color.WHITE); graphics2d.fillRect(0, 0, w, h); graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2); graphics2d.drawImage(bufferedimage, 0, 0, Color.WHITE, null); graphics2d.dispose(); return img; } } ================================================ FILE: src/main/java/me/zbl/common/utils/JSONUtils.java ================================================ package me.zbl.common.utils; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import java.util.HashMap; import java.util.Map; public class JSONUtils { /** * Bean对象转JSON * * @param object * @param dataFormatString * * @return */ public static String beanToJson(Object object, String dataFormatString) { if (object != null) { if (StringUtils.isEmpty(dataFormatString)) { return JSONObject.toJSONString(object); } return JSON.toJSONStringWithDateFormat(object, dataFormatString); } else { return null; } } /** * Bean对象转JSON * * @param object * * @return */ public static String beanToJson(Object object) { if (object != null) { return JSON.toJSONString(object); } else { return null; } } /** * String转JSON字符串 * * @param key * @param value * * @return */ public static String stringToJsonByFastjson(String key, String value) { if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) { return null; } Map map = new HashMap(16); map.put(key, value); return beanToJson(map, null); } /** * 将json字符串转换成对象 * * @param json * @param clazz * * @return */ public static Object jsonToBean(String json, Object clazz) { if (StringUtils.isEmpty(json) || clazz == null) { return null; } return JSON.parseObject(json, clazz.getClass()); } /** * json字符串转map * * @param json * * @return */ @SuppressWarnings("unchecked") public static Map jsonToMap(String json) { if (StringUtils.isEmpty(json)) { return null; } return JSON.parseObject(json, Map.class); } } ================================================ FILE: src/main/java/me/zbl/common/utils/MD5Utils.java ================================================ package me.zbl.common.utils; import org.apache.shiro.crypto.hash.SimpleHash; import org.apache.shiro.util.ByteSource; public class MD5Utils { private static final String SALT = "1qazxsw2"; private static final String ALGORITH_NAME = "md5"; private static final int HASH_ITERATIONS = 2; public static String encrypt(String pswd) { String newPassword = new SimpleHash(ALGORITH_NAME, pswd, ByteSource.Util.bytes(SALT), HASH_ITERATIONS).toHex(); return newPassword; } public static String encrypt(String username, String pswd) { String newPassword = new SimpleHash(ALGORITH_NAME, pswd, ByteSource.Util.bytes(username + SALT), HASH_ITERATIONS).toHex(); return newPassword; } public static void main(String[] args) { //System.out.println(MD5Utils.encrypt("admin", "1")); } } ================================================ FILE: src/main/java/me/zbl/common/utils/PageWrapper.java ================================================ package me.zbl.common.utils; import java.io.Serializable; import java.util.List; /** * @author 郑保乐 */ public class PageWrapper implements Serializable { private static final long serialVersionUID = 1L; private int total; private List rows; public PageWrapper(List list, int total) { this.rows = list; this.total = total; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public List getRows() { return rows; } public void setRows(List rows) { this.rows = rows; } } ================================================ FILE: src/main/java/me/zbl/common/utils/Query.java ================================================ package me.zbl.common.utils; import java.util.LinkedHashMap; import java.util.Map; /** * 查询参数 */ public class Query extends LinkedHashMap { private static final long serialVersionUID = 1L; // private int offset; // 每页条数 private int limit; public Query(Map params) { this.putAll(params); // 分页参数 this.offset = Integer.parseInt(params.get("offset").toString()); this.limit = Integer.parseInt(params.get("limit").toString()); this.put("offset", offset); this.put("page", offset / limit + 1); this.put("limit", limit); } public int getOffset() { return offset; } public void setOffset(int offset) { this.put("offset", offset); } public int getLimit() { return limit; } public void setLimit(int limit) { this.limit = limit; } } ================================================ FILE: src/main/java/me/zbl/common/utils/R.java ================================================ package me.zbl.common.utils; import java.util.HashMap; import java.util.Map; public class R extends HashMap { private static final long serialVersionUID = 1L; public R() { put("code", 0); put("msg", "操作成功"); } public static R error() { return error(1, "操作失败"); } public static R error(String msg) { return error(500, msg); } public static R error(int code, String msg) { R r = new R(); r.put("code", code); r.put("msg", msg); return r; } public static R ok(String msg) { R r = new R(); r.put("msg", msg); return r; } public static R ok(Map map) { R r = new R(); r.putAll(map); return r; } public static R ok() { return new R(); } @Override public R put(String key, Object value) { super.put(key, value); return this; } } ================================================ FILE: src/main/java/me/zbl/common/utils/ScheduleJobUtils.java ================================================ package me.zbl.common.utils; import me.zbl.common.domain.ScheduleJob; import me.zbl.common.domain.TaskDO; public class ScheduleJobUtils { public static ScheduleJob entityToData(TaskDO scheduleJobEntity) { ScheduleJob scheduleJob = new ScheduleJob(); scheduleJob.setBeanClass(scheduleJobEntity.getBeanClass()); scheduleJob.setCronExpression(scheduleJobEntity.getCronExpression()); scheduleJob.setDescription(scheduleJobEntity.getDescription()); scheduleJob.setIsConcurrent(scheduleJobEntity.getIsConcurrent()); scheduleJob.setJobName(scheduleJobEntity.getJobName()); scheduleJob.setJobGroup(scheduleJobEntity.getJobGroup()); scheduleJob.setJobStatus(scheduleJobEntity.getJobStatus()); scheduleJob.setMethodName(scheduleJobEntity.getMethodName()); scheduleJob.setSpringBean(scheduleJobEntity.getSpringBean()); return scheduleJob; } } ================================================ FILE: src/main/java/me/zbl/common/utils/ShiroUtils.java ================================================ package me.zbl.common.utils; import me.zbl.system.domain.UserDO; import org.apache.shiro.SecurityUtils; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import java.security.Principal; import java.util.Collection; import java.util.List; public class ShiroUtils { @Autowired private static SessionDAO sessionDAO; public static Subject getSubjct() { return SecurityUtils.getSubject(); } public static UserDO getUser() { Object object = getSubjct().getPrincipal(); return (UserDO) object; } public static Long getUserId() { return getUser().getUserId(); } public static void logout() { getSubjct().logout(); } public static List getPrinciples() { List principals = null; Collection sessions = sessionDAO.getActiveSessions(); return principals; } } ================================================ FILE: src/main/java/me/zbl/common/utils/StringUtils.java ================================================ package me.zbl.common.utils; /** * @author 郑保乐 */ public class StringUtils extends org.apache.commons.lang3.StringUtils { } ================================================ FILE: src/main/java/me/zbl/common/utils/TimeUtils.java ================================================ package me.zbl.common.utils; import org.apache.commons.lang3.time.DateFormatUtils; import java.util.Arrays; import java.util.Date; /** * 时间计算工具类 */ public class TimeUtils { /** * 时间字段常量,表示“秒” */ public final static int SECOND = 0; /** * 时间字段常量,表示“分” */ public final static int MINUTE = 1; /** * 时间字段常量,表示“时” */ public final static int HOUR = 2; /** * 时间字段常量,表示“天” */ public final static int DAY = 3; /** * 各常量允许的最大值 */ private final int[] maxFields = {59, 59, 23, Integer.MAX_VALUE - 1}; /** * 各常量允许的最小值 */ private final int[] minFields = {0, 0, 0, Integer.MIN_VALUE}; /** * 默认的字符串格式时间分隔符 */ private String timeSeparator = ":"; /** * 时间数据容器 */ private int[] fields = new int[4]; /** * 无参构造,将各字段置为 0 */ public TimeUtils() { this(0, 0, 0, 0); } /** * 使用时、分构造一个时间 * * @param hour 小时 * @param minute 分钟 */ public TimeUtils(int hour, int minute) { this(0, hour, minute, 0); } /** * 使用时、分、秒构造一个时间 * * @param hour 小时 * @param minute 分钟 * @param second 秒 */ public TimeUtils(int hour, int minute, int second) { this(0, hour, minute, second); } /** * 使用一个字符串构造时间
* Time time = new Time("14:22:23"); * * @param time 字符串格式的时间,默认采用“:”作为分隔符 */ public TimeUtils(String time) { this(time, null); } /** * 使用时间毫秒构建时间 * * @param time */ public TimeUtils(long time) { this(new Date(time)); } /** * 使用日期对象构造时间 * * @param date */ public TimeUtils(Date date) { this(DateFormatUtils.formatUTC(date, "HH:mm:ss")); } /** * 使用天、时、分、秒构造时间,进行全字符的构造 * * @param day 天 * @param hour 时 * @param minute 分 * @param second 秒 */ public TimeUtils(int day, int hour, int minute, int second) { initialize(day, hour, minute, second); } /** * 使用一个字符串构造时间,指定分隔符
* Time time = new Time("14-22-23", "-"); * * @param time 字符串格式的时间 */ public TimeUtils(String time, String timeSeparator) { if (timeSeparator != null) { setTimeSeparator(timeSeparator); } parseTime(time); } public static String toTimeString(long time) { TimeUtils t = new TimeUtils(time); int day = t.get(TimeUtils.DAY); int hour = t.get(TimeUtils.HOUR); int minute = t.get(TimeUtils.MINUTE); int second = t.get(TimeUtils.SECOND); StringBuilder sb = new StringBuilder(); if (day > 0) { sb.append(day).append("天"); } if (hour > 0) { sb.append(hour).append("时"); } if (minute > 0) { sb.append(minute).append("分"); } if (second > 0) { sb.append(second).append("秒"); } return sb.toString(); } /** * 设置时间字段的值 * * @param field 时间字段常量 * @param value 时间字段的值 */ public void set(int field, int value) { if (value < minFields[field]) { throw new IllegalArgumentException(value + ", time value must be positive."); } fields[field] = value % (maxFields[field] + 1); // 进行进位计算 int carry = value / (maxFields[field] + 1); if (carry > 0) { int upFieldValue = get(field + 1); set(field + 1, upFieldValue + carry); } } /** * 获得时间字段的值 * * @param field 时间字段常量 * * @return 该时间字段的值 */ public int get(int field) { if (field < 0 || field > fields.length - 1) { throw new IllegalArgumentException(field + ", field value is error."); } return fields[field]; } /** * 将时间进行“加”运算,即加上一个时间 * * @param time 需要加的时间 * * @return 运算后的时间 */ public TimeUtils addTime(TimeUtils time) { TimeUtils result = new TimeUtils(); int up = 0; // 进位标志 for (int i = 0; i < fields.length; i++) { int sum = fields[i] + time.fields[i] + up; up = sum / (maxFields[i] + 1); result.fields[i] = sum % (maxFields[i] + 1); } return result; } /** * 将时间进行“减”运算,即减去一个时间 * * @param time 需要减的时间 * * @return 运算后的时间 */ public TimeUtils subtractTime(TimeUtils time) { TimeUtils result = new TimeUtils(); int down = 0; // 退位标志 for (int i = 0, k = fields.length - 1; i < k; i++) { int difference = fields[i] + down; if (difference >= time.fields[i]) { difference -= time.fields[i]; down = 0; } else { difference += maxFields[i] + 1 - time.fields[i]; down = -1; } result.fields[i] = difference; } result.fields[DAY] = fields[DAY] - time.fields[DAY] + down; return result; } /** * 获得时间字段的分隔符 * * @return */ public String getTimeSeparator() { return timeSeparator; } /** * 设置时间字段的分隔符(用于字符串格式的时间) * * @param timeSeparator 分隔符字符串 */ public void setTimeSeparator(String timeSeparator) { this.timeSeparator = timeSeparator; } private void initialize(int day, int hour, int minute, int second) { set(DAY, day); set(HOUR, hour); set(MINUTE, minute); set(SECOND, second); } private void parseTime(String time) { if (time == null) { initialize(0, 0, 0, 0); return; } String t = time; int field = DAY; set(field--, 0); int p = -1; while ((p = t.indexOf(timeSeparator)) > -1) { parseTimeField(time, t.substring(0, p), field--); t = t.substring(p + timeSeparator.length()); } parseTimeField(time, t, field--); } private void parseTimeField(String time, String t, int field) { if (field < SECOND || t.length() < 1) { parseTimeException(time); } char[] chs = t.toCharArray(); int n = 0; for (int i = 0; i < chs.length; i++) { if (chs[i] <= ' ') { continue; } if (chs[i] >= '0' && chs[i] <= '9') { n = n * 10 + chs[i] - '0'; continue; } parseTimeException(time); } set(field, n); } private void parseTimeException(String time) { throw new IllegalArgumentException(time + ", time format error, HH" + this.timeSeparator + "mm" + this.timeSeparator + "ss"); } @Override public String toString() { StringBuilder sb = new StringBuilder(16); sb.append(fields[DAY]).append(',').append(' '); buildString(sb, HOUR).append(timeSeparator); buildString(sb, MINUTE).append(timeSeparator); buildString(sb, SECOND); return sb.toString(); } private StringBuilder buildString(StringBuilder sb, int field) { if (fields[field] < 10) { sb.append('0'); } return sb.append(fields[field]); } public int hashCode() { final int PRIME = 31; int result = 1; result = PRIME * result + Arrays.hashCode(fields); return result; } public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final TimeUtils other = (TimeUtils) obj; return Arrays.equals(fields, other.fields); } } ================================================ FILE: src/main/java/me/zbl/common/utils/UploadUtils.java ================================================ package me.zbl.common.utils; public class UploadUtils { } ================================================ FILE: src/main/java/me/zbl/common/utils/xss/JsoupUtil.java ================================================ package me.zbl.common.utils.xss; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.safety.Whitelist; /** * xss非法标签过滤 * {@link http://www.jianshu.com/p/32abc12a175a?nomobile=yes} * * @author 郑保乐 * @version v2.0 * @time 2017年4月27日 下午5:47:09 */ public class JsoupUtil { /** * 使用自带的basicWithImages 白名单 * 允许的便签有a,b,blockquote,br,cite,code,dd,dl,dt,em,i,li,ol,p,pre,q,small,span, * strike,strong,sub,sup,u,ul,img * 以及a标签的href,img标签的src,align,alt,height,width,title属性 */ private static final Whitelist whitelist = Whitelist.basicWithImages(); /** 配置过滤化参数,不对代码进行格式化 */ private static final Document.OutputSettings outputSettings = new Document.OutputSettings().prettyPrint(false); static { // 富文本编辑时一些样式是使用style来进行实现的 // 比如红色字体 style="color:red;" // 所以需要给所有标签添加style属性 whitelist.addAttributes(":all", "style"); } public static String clean(String content) { return Jsoup.clean(content, "", whitelist, outputSettings); } public static void main(String[] args) { String text = "ssssss"; System.out.println(clean(text)); } } ================================================ FILE: src/main/java/me/zbl/oa/config/WebSocketConfig.java ================================================ package me.zbl.oa.config; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; /** * 通过EnableWebSocketMessageBroker 开启使用STOMP协议来传输基于代理(message broker)的消息,此时浏览器支持使用@MessageMapping 就像支持@RequestMapping一样。 */ @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { // /** // * endPoint 注册协议节点,并映射指定的URl // * // * @param registry // */ // @Override // public void registerStompEndpoints(StompEndpointRegistry registry) { // //注册一个Stomp 协议的endpoint,并指定 SockJS协议。 // registry.addEndpoint("/endpointWisely").withSockJS(); // } // // /** // * 配置消息代理(message broker) // * // * @param registry // */ // @Override // public void configureMessageBroker(MessageBrokerRegistry registry) { // //广播式应配置一个/topic 消息代理 // registry.enableSimpleBroker("/topic"); // } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { //endPoint 注册协议节点,并映射指定的URl //注册一个名字为"endpointChat" 的endpoint,并指定 SockJS协议。 点对点-用 registry.addEndpoint("/endpointChat").withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代理(message broker) //点对点式增加一个/queue 消息代理 registry.enableSimpleBroker("/queue", "/topic"); } } ================================================ FILE: src/main/java/me/zbl/oa/controller/NotifyController.java ================================================ package me.zbl.oa.controller; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.domain.DictDO; import me.zbl.common.service.DictService; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import me.zbl.oa.domain.NotifyDO; import me.zbl.oa.domain.NotifyRecordDO; import me.zbl.oa.service.NotifyRecordService; import me.zbl.oa.service.NotifyService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 通知通告 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-05 17:11:16 */ @Controller @RequestMapping("/oa/notify") public class NotifyController extends BaseController { @Autowired private NotifyService notifyService; @Autowired private NotifyRecordService notifyRecordService; @Autowired private DictService dictService; @GetMapping() @RequiresPermissions("oa:notify:notify") String oaNotify() { return "oa/notify/notify"; } @ResponseBody @GetMapping("/list") @RequiresPermissions("oa:notify:notify") public PageWrapper list(@RequestParam Map params) { // 查询列表数据 Query query = new Query(params); List notifyList = notifyService.list(query); int total = notifyService.count(query); PageWrapper pageWrapper = new PageWrapper(notifyList, total); return pageWrapper; } @GetMapping("/add") @RequiresPermissions("oa:notify:add") String add() { return "oa/notify/add"; } @GetMapping("/edit/{id}") @RequiresPermissions("oa:notify:edit") String edit(@PathVariable("id") Long id, Model model) { NotifyDO notify = notifyService.get(id); List dictDOS = dictService.listByType("oa_notify_type"); String type = notify.getType(); for (DictDO dictDO : dictDOS) { if (type.equals(dictDO.getValue())) { dictDO.setRemarks("checked"); } } model.addAttribute("oaNotifyTypes", dictDOS); model.addAttribute("notify", notify); return "oa/notify/edit"; } /** * 保存 */ @ResponseBody @PostMapping("/save") @RequiresPermissions("oa:notify:add") public R save(NotifyDO notify) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } notify.setCreateBy(getUserId()); if (notifyService.save(notify) > 0) { return R.ok(); } return R.error(); } /** * 修改 */ @ResponseBody @RequestMapping("/update") @RequiresPermissions("oa:notify:edit") public R update(NotifyDO notify) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } notifyService.update(notify); return R.ok(); } /** * 删除 */ @PostMapping("/remove") @ResponseBody @RequiresPermissions("oa:notify:remove") public R remove(Long id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (notifyService.remove(id) > 0) { return R.ok(); } return R.error(); } /** * 删除 */ @PostMapping("/batchRemove") @ResponseBody @RequiresPermissions("oa:notify:batchRemove") public R remove(@RequestParam("ids[]") Long[] ids) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } notifyService.batchRemove(ids); return R.ok(); } @ResponseBody @GetMapping("/message") PageWrapper message() { Map params = new HashMap<>(16); params.put("offset", 0); params.put("limit", 3); Query query = new Query(params); query.put("userId", getUserId()); query.put("isRead", Constant.OA_NOTIFY_READ_NO); return notifyService.selfList(query); } @GetMapping("/selfNotify") String selefNotify() { return "oa/notify/selfNotify"; } @ResponseBody @GetMapping("/selfList") PageWrapper selfList(@RequestParam Map params) { Query query = new Query(params); query.put("userId", getUserId()); return notifyService.selfList(query); } @GetMapping("/read/{id}") @RequiresPermissions("oa:notify:edit") String read(@PathVariable("id") Long id, Model model) { NotifyDO notify = notifyService.get(id); //更改阅读状态 NotifyRecordDO notifyRecordDO = new NotifyRecordDO(); notifyRecordDO.setNotifyId(id); notifyRecordDO.setUserId(getUserId()); notifyRecordDO.setReadDate(new Date()); notifyRecordDO.setIsRead(Constant.OA_NOTIFY_READ_YES); notifyRecordService.changeRead(notifyRecordDO); model.addAttribute("notify", notify); return "oa/notify/read"; } } ================================================ FILE: src/main/java/me/zbl/oa/controller/WebSocketController.java ================================================ package me.zbl.oa.controller; import me.zbl.system.service.SessionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Controller; @Controller public class WebSocketController { @Autowired SimpMessagingTemplate template; @Autowired SessionService sessionService; /*@Autowired WelcomeTask welcomeTask; @MessageMapping("/welcome") // 浏览器发送请求通过@messageMapping 映射/welcome 这个地址。 @SendTo("/topic/getResponse") // 服务器端有消息时,会订阅@SendTo 中的路径的浏览器发送消息。 public Response say(Message message) throws Exception { Thread.sleep(1000); return new Response("Welcome, " + message.getName() + "!"); } @GetMapping("/test") String test() { return "test"; } @RequestMapping("/welcome") @ResponseBody public R say02() { try { welcomeTask.sayWelcome(); } catch (Exception e) { e.printStackTrace(); } return R.ok(); }*/ // @ResponseBody // @GetMapping("/chat") // public String handleChat(Principal principal, String msg) { // template.convertAndSendToUser(sessionService.listPrincipal().get(0).toString(), "/queue/notifications", principal.getName() + "给您发来了消息:" + msg); // return sessionService.listPrincipal().get(0).toString(); // } } ================================================ FILE: src/main/java/me/zbl/oa/dao/NotifyDao.java ================================================ package me.zbl.oa.dao; import me.zbl.oa.domain.NotifyDO; import me.zbl.oa.domain.NotifyDTO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 通知通告 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-05 17:11:16 */ @Mapper public interface NotifyDao { NotifyDO get(Long id); List list(Map map); int count(Map map); int save(NotifyDO notify); int update(NotifyDO notify); int remove(Long id); int batchRemove(Long[] ids); List listByIds(Long[] ids); int countDTO(Map map); List listDTO(Map map); } ================================================ FILE: src/main/java/me/zbl/oa/dao/NotifyRecordDao.java ================================================ package me.zbl.oa.dao; import me.zbl.oa.domain.NotifyRecordDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 通知通告发送记录 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-09 17:18:45 */ @Mapper public interface NotifyRecordDao { NotifyRecordDO get(Long id); List list(Map map); int count(Map map); int save(NotifyRecordDO notifyRecord); int update(NotifyRecordDO notifyRecord); int remove(Long id); int batchRemove(Long[] ids); int batchSave(List records); Long[] listNotifyIds(Map map); int removeByNotifbyId(Long notifyId); int batchRemoveByNotifbyId(Long[] notifyIds); int changeRead(NotifyRecordDO notifyRecord); } ================================================ FILE: src/main/java/me/zbl/oa/domain/Message.java ================================================ package me.zbl.oa.domain; public class Message { private String name; public String getName() { return name; } } ================================================ FILE: src/main/java/me/zbl/oa/domain/NotifyDO.java ================================================ package me.zbl.oa.domain; import java.io.Serializable; import java.util.Arrays; import java.util.Date; /** * 通知通告 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-05 17:11:16 */ public class NotifyDO implements Serializable { private static final long serialVersionUID = 1L; //编号 private Long id; //类型 private String type; //标题 private String title; //内容 private String content; //附件 private String files; //状态 private String status; //创建者 private Long createBy; //创建时间 private Date createDate; //更新者 private String updateBy; //更新时间 private Date updateDate; //备注信息 private String remarks; //删除标记 private String delFlag; private Long[] userIds; /** * 获取:编号 */ public Long getId() { return id; } /** * 设置:编号 */ public void setId(Long id) { this.id = id; } /** * 获取:类型 */ public String getType() { return type; } /** * 设置:类型 */ public void setType(String type) { this.type = type; } /** * 获取:标题 */ public String getTitle() { return title; } /** * 设置:标题 */ public void setTitle(String title) { this.title = title; } /** * 获取:内容 */ public String getContent() { return content; } /** * 设置:内容 */ public void setContent(String content) { this.content = content; } /** * 获取:附件 */ public String getFiles() { return files; } /** * 设置:附件 */ public void setFiles(String files) { this.files = files; } /** * 获取:状态 */ public String getStatus() { return status; } /** * 设置:状态 */ public void setStatus(String status) { this.status = status; } /** * 获取:创建者 */ public Long getCreateBy() { return createBy; } /** * 设置:创建者 */ public void setCreateBy(Long createBy) { this.createBy = createBy; } /** * 获取:创建时间 */ public Date getCreateDate() { return createDate; } /** * 设置:创建时间 */ public void setCreateDate(Date createDate) { this.createDate = createDate; } /** * 获取:更新者 */ public String getUpdateBy() { return updateBy; } /** * 设置:更新者 */ public void setUpdateBy(String updateBy) { this.updateBy = updateBy; } /** * 获取:更新时间 */ public Date getUpdateDate() { return updateDate; } /** * 设置:更新时间 */ public void setUpdateDate(Date updateDate) { this.updateDate = updateDate; } /** * 获取:备注信息 */ public String getRemarks() { return remarks; } /** * 设置:备注信息 */ public void setRemarks(String remarks) { this.remarks = remarks; } /** * 获取:删除标记 */ public String getDelFlag() { return delFlag; } /** * 设置:删除标记 */ public void setDelFlag(String delFlag) { this.delFlag = delFlag; } public Long[] getUserIds() { return userIds; } public void setUserIds(Long[] userIds) { this.userIds = userIds; } @Override public String toString() { return "NotifyDO{" + "id=" + id + ", type='" + type + '\'' + ", title='" + title + '\'' + ", content='" + content + '\'' + ", files='" + files + '\'' + ", status='" + status + '\'' + ", createBy=" + createBy + ", createDate=" + createDate + ", updateBy='" + updateBy + '\'' + ", updateDate=" + updateDate + ", remarks='" + remarks + '\'' + ", delFlag='" + delFlag + '\'' + ", userIds=" + Arrays.toString(userIds) + '}'; } } ================================================ FILE: src/main/java/me/zbl/oa/domain/NotifyDTO.java ================================================ package me.zbl.oa.domain; public class NotifyDTO extends NotifyDO { private static final long serialVersionUID = 1L; private String isRead; private String before; private String sender; public String getIsRead() { return isRead; } public void setIsRead(String isRead) { this.isRead = isRead; } public String getBefore() { return before; } public void setBefore(String before) { this.before = before; } public String getSender() { return sender; } public void setSender(String sender) { this.sender = sender; } @Override public String toString() { return "NotifyDTO{" + "isRead='" + isRead + '\'' + ", before='" + before + '\'' + ", sender='" + sender + '\'' + '}'; } } ================================================ FILE: src/main/java/me/zbl/oa/domain/NotifyRecordDO.java ================================================ package me.zbl.oa.domain; import java.io.Serializable; import java.util.Date; /** * 通知通告发送记录 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-10 11:08:06 */ public class NotifyRecordDO implements Serializable { private static final long serialVersionUID = 1L; /** * 编号 */ private Long id; //通知通告ID private Long notifyId; //接受人 private Long userId; //阅读标记 private Integer isRead; //阅读时间 private Date readDate; /** * 获取:编号 */ public Long getId() { return id; } /** * 设置:编号 */ public void setId(Long id) { this.id = id; } /** * 获取:通知通告ID */ public Long getNotifyId() { return notifyId; } /** * 设置:通知通告ID */ public void setNotifyId(Long notifyId) { this.notifyId = notifyId; } /** * 获取:接受人 */ public Long getUserId() { return userId; } /** * 设置:接受人 */ public void setUserId(Long userId) { this.userId = userId; } /** * 获取:阅读标记 */ public Integer getIsRead() { return isRead; } /** * 设置:阅读标记 */ public void setIsRead(Integer isRead) { this.isRead = isRead; } /** * 获取:阅读时间 */ public Date getReadDate() { return readDate; } /** * 设置:阅读时间 */ public void setReadDate(Date readDate) { this.readDate = readDate; } @Override public String toString() { return "NotifyRecordDO{" + "id=" + id + ", notifyId=" + notifyId + ", userId=" + userId + ", isRead=" + isRead + ", readDate=" + readDate + '}'; } } ================================================ FILE: src/main/java/me/zbl/oa/domain/Response.java ================================================ package me.zbl.oa.domain; public class Response { private String responseMessage; public Response(String responseMessage) { this.responseMessage = responseMessage; } public String getResponseMessage() { return responseMessage; } public void setResponseMessage(String responseMessage) { this.responseMessage = responseMessage; } } ================================================ FILE: src/main/java/me/zbl/oa/service/NotifyRecordService.java ================================================ package me.zbl.oa.service; import me.zbl.oa.domain.NotifyRecordDO; import java.util.List; import java.util.Map; /** * 通知通告发送记录 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-09 17:18:45 */ public interface NotifyRecordService { NotifyRecordDO get(Long id); List list(Map map); int count(Map map); int save(NotifyRecordDO notifyRecord); int update(NotifyRecordDO notifyRecord); int remove(Long id); int batchRemove(Long[] ids); /** * 更改阅读状态 * * @return */ int changeRead(NotifyRecordDO notifyRecord); } ================================================ FILE: src/main/java/me/zbl/oa/service/NotifyService.java ================================================ package me.zbl.oa.service; import me.zbl.common.utils.PageWrapper; import me.zbl.oa.domain.NotifyDO; import java.util.List; import java.util.Map; /** * 通知通告 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-05 17:11:16 */ public interface NotifyService { NotifyDO get(Long id); List list(Map map); int count(Map map); int save(NotifyDO notify); int update(NotifyDO notify); int remove(Long id); int batchRemove(Long[] ids); // Map message(Long userId); PageWrapper selfList(Map map); } ================================================ FILE: src/main/java/me/zbl/oa/service/impl/NotifyRecordServiceImpl.java ================================================ package me.zbl.oa.service.impl; import me.zbl.oa.dao.NotifyRecordDao; import me.zbl.oa.domain.NotifyRecordDO; import me.zbl.oa.service.NotifyRecordService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service public class NotifyRecordServiceImpl implements NotifyRecordService { @Autowired private NotifyRecordDao notifyRecordDao; @Override public NotifyRecordDO get(Long id) { return notifyRecordDao.get(id); } @Override public List list(Map map) { return notifyRecordDao.list(map); } @Override public int count(Map map) { return notifyRecordDao.count(map); } @Override public int save(NotifyRecordDO notifyRecord) { return notifyRecordDao.save(notifyRecord); } @Override public int update(NotifyRecordDO notifyRecord) { return notifyRecordDao.update(notifyRecord); } @Override public int remove(Long id) { return notifyRecordDao.remove(id); } @Override public int batchRemove(Long[] ids) { return notifyRecordDao.batchRemove(ids); } @Override public int changeRead(NotifyRecordDO notifyRecord) { return notifyRecordDao.changeRead(notifyRecord); } } ================================================ FILE: src/main/java/me/zbl/oa/service/impl/NotifyServiceImpl.java ================================================ package me.zbl.oa.service.impl; import me.zbl.common.service.DictService; import me.zbl.common.utils.DateUtils; import me.zbl.common.utils.PageWrapper; import me.zbl.oa.dao.NotifyDao; import me.zbl.oa.dao.NotifyRecordDao; import me.zbl.oa.domain.NotifyDO; import me.zbl.oa.domain.NotifyDTO; import me.zbl.oa.domain.NotifyRecordDO; import me.zbl.oa.service.NotifyService; import me.zbl.system.dao.UserDao; import me.zbl.system.domain.UserDO; import me.zbl.system.service.SessionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Service public class NotifyServiceImpl implements NotifyService { @Autowired private NotifyDao notifyDao; @Autowired private NotifyRecordDao recordDao; @Autowired private UserDao userDao; @Autowired private DictService dictService; @Autowired private SessionService sessionService; @Autowired private SimpMessagingTemplate template; @Override public NotifyDO get(Long id) { NotifyDO rDO = notifyDao.get(id); rDO.setType(dictService.getName("oa_notify_type", rDO.getType())); return rDO; } @Override public List list(Map map) { List notifys = notifyDao.list(map); for (NotifyDO notifyDO : notifys) { notifyDO.setType(dictService.getName("oa_notify_type", notifyDO.getType())); } return notifys; } @Override public int count(Map map) { return notifyDao.count(map); } @Transactional(rollbackFor = Exception.class) @Override public int save(NotifyDO notify) { notify.setUpdateDate(new Date()); int r = notifyDao.save(notify); // 保存到接受者列表中 Long[] userIds = notify.getUserIds(); Long notifyId = notify.getId(); List records = new ArrayList<>(); for (Long userId : userIds) { NotifyRecordDO record = new NotifyRecordDO(); record.setNotifyId(notifyId); record.setUserId(userId); record.setIsRead(0); records.add(record); } recordDao.batchSave(records); //给在线用户发送通知 ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>()); executor.execute(new Runnable() { @Override public void run() { for (UserDO userDO : sessionService.listOnlineUser()) { for (Long userId : userIds) { if (userId.equals(userDO.getUserId())) { template.convertAndSendToUser(userDO.toString(), "/queue/notifications", "新消息:" + notify.getTitle()); } } } } }); executor.shutdown(); return r; } @Override public int update(NotifyDO notify) { return notifyDao.update(notify); } @Transactional @Override public int remove(Long id) { recordDao.removeByNotifbyId(id); return notifyDao.remove(id); } @Transactional @Override public int batchRemove(Long[] ids) { recordDao.batchRemoveByNotifbyId(ids); return notifyDao.batchRemove(ids); } @Override public PageWrapper selfList(Map map) { List rows = notifyDao.listDTO(map); for (NotifyDTO notifyDTO : rows) { notifyDTO.setBefore(DateUtils.getTimeBefore(notifyDTO.getUpdateDate())); notifyDTO.setSender(userDao.get(notifyDTO.getCreateBy()).getName()); } PageWrapper page = new PageWrapper(rows, notifyDao.countDTO(map)); return page; } } ================================================ FILE: src/main/java/me/zbl/system/config/BDSessionListener.java ================================================ package me.zbl.system.config; import org.apache.shiro.session.Session; import org.apache.shiro.session.SessionListener; import java.util.concurrent.atomic.AtomicInteger; public class BDSessionListener implements SessionListener { private final AtomicInteger sessionCount = new AtomicInteger(0); @Override public void onStart(Session session) { sessionCount.incrementAndGet(); } @Override public void onStop(Session session) { sessionCount.decrementAndGet(); } @Override public void onExpiration(Session session) { sessionCount.decrementAndGet(); } public int getSessionCount() { return sessionCount.get(); } } ================================================ FILE: src/main/java/me/zbl/system/config/ShiroConfig.java ================================================ package me.zbl.system.config; import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; import me.zbl.common.config.Constant; import me.zbl.common.redis.shiro.RedisCacheManager; import me.zbl.common.redis.shiro.RedisManager; import me.zbl.common.redis.shiro.RedisSessionDAO; import me.zbl.system.shiro.UserRealm; import org.apache.shiro.cache.ehcache.EhCacheManager; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.session.SessionListener; import org.apache.shiro.session.mgt.eis.MemorySessionDAO; import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.spring.LifecycleBeanPostProcessor; import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; /** * @author 郑保乐 */ @Configuration public class ShiroConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.password}") private String password; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.timeout}") private int timeout; @Value("${cacheType}") private String cacheType; @Value("${server.session-timeout}") private int tomcatTimeout; @Bean public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); } /** * ShiroDialect,为了在thymeleaf里使用shiro的标签的bean * * @return */ @Bean public ShiroDialect shiroDialect() { return new ShiroDialect(); } @Bean ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); shiroFilterFactoryBean.setLoginUrl("/login"); shiroFilterFactoryBean.setSuccessUrl("/index"); shiroFilterFactoryBean.setUnauthorizedUrl("/403"); LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/favicon.ico", "anon"); filterChainDefinitionMap.put("/css/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/fonts/**", "anon"); filterChainDefinitionMap.put("/img/**", "anon"); filterChainDefinitionMap.put("/docs/**", "anon"); filterChainDefinitionMap.put("/druid/**", "anon"); filterChainDefinitionMap.put("/upload/**", "anon"); filterChainDefinitionMap.put("/files/**", "anon"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/", "anon"); filterChainDefinitionMap.put("/blog", "anon"); filterChainDefinitionMap.put("/blog/open/**", "anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); //设置realm. securityManager.setRealm(userRealm()); // 自定义缓存实现 使用redis if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) { securityManager.setCacheManager(cacheManager()); } else { securityManager.setCacheManager(ehCacheManager()); } securityManager.setSessionManager(sessionManager()); return securityManager; } @Bean UserRealm userRealm() { UserRealm userRealm = new UserRealm(); return userRealm; } /** * 开启shiro aop注解支持. * 使用代理方式;所以需要开启代码支持; * * @param securityManager * * @return */ @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor; } /** * 配置shiro redisManager * * @return */ @Bean public RedisManager redisManager() { RedisManager redisManager = new RedisManager(); redisManager.setHost(host); redisManager.setPort(port); redisManager.setExpire(1800);// 配置缓存过期时间 //redisManager.setTimeout(1800); redisManager.setPassword(password); return redisManager; } /** * cacheManager 缓存 redis实现 * 使用的是shiro-redis开源插件 * * @return */ public RedisCacheManager cacheManager() { RedisCacheManager redisCacheManager = new RedisCacheManager(); redisCacheManager.setRedisManager(redisManager()); return redisCacheManager; } /** * RedisSessionDAO shiro sessionDao层的实现 通过redis * 使用的是shiro-redis开源插件 */ @Bean public RedisSessionDAO redisSessionDAO() { RedisSessionDAO redisSessionDAO = new RedisSessionDAO(); redisSessionDAO.setRedisManager(redisManager()); return redisSessionDAO; } @Bean public SessionDAO sessionDAO() { if (Constant.CACHE_TYPE_REDIS.equals(cacheType)) { return redisSessionDAO(); } else { return new MemorySessionDAO(); } } /** * shiro session的管理 */ @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setGlobalSessionTimeout(tomcatTimeout * 1000); sessionManager.setSessionDAO(sessionDAO()); Collection listeners = new ArrayList(); listeners.add(new BDSessionListener()); sessionManager.setSessionListeners(listeners); return sessionManager; } @Bean public EhCacheManager ehCacheManager() { EhCacheManager em = new EhCacheManager(); em.setCacheManagerConfigFile("classpath:config/ehcache.xml"); return em; } } ================================================ FILE: src/main/java/me/zbl/system/config/Swagger2Config.java ================================================ package me.zbl.system.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; /** * ${DESCRIPTION} * * @author 郑保乐 * @create 2017-01-02 23:53 */ @EnableSwagger2 @Configuration public class Swagger2Config { @Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() //为当前包路径 .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build(); } //构建 api文档的详细信息函数 private ApiInfo apiInfo() { return new ApiInfoBuilder() //页面标题 .title("功能测试") //创建人 .contact(new Contact("Edison", "xxx@qq.com", "xxx@qq.com")) //版本号 .version("1.0") //描述 .description("API 描述") .build(); } } ================================================ FILE: src/main/java/me/zbl/system/config/XssConfig.java ================================================ package me.zbl.system.config; import com.google.common.collect.Maps; import me.zbl.system.filter.XssFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Map; @Configuration public class XssConfig { /** * xss过滤拦截器 */ @Bean public FilterRegistrationBean xssFilterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new XssFilter()); filterRegistrationBean.setOrder(1); filterRegistrationBean.setEnabled(false); filterRegistrationBean.addUrlPatterns("/*"); Map initParameters = Maps.newHashMap(); initParameters.put("excludes", "/favicon.ico,/img/*,/js/*,/css/*"); initParameters.put("isIncludeRichText", "true"); filterRegistrationBean.setInitParameters(initParameters); return filterRegistrationBean; } } ================================================ FILE: src/main/java/me/zbl/system/controller/DeptController.java ================================================ package me.zbl.system.controller; import io.swagger.annotations.ApiOperation; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.domain.Tree; import me.zbl.common.utils.R; import me.zbl.system.domain.DeptDO; import me.zbl.system.service.DeptService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 部门管理 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-27 14:40:36 */ @Controller @RequestMapping("/system/sysDept") public class DeptController extends BaseController { private String prefix = "system/dept"; @Autowired private DeptService sysDeptService; @GetMapping() @RequiresPermissions("system:sysDept:sysDept") String dept() { return prefix + "/dept"; } @ApiOperation(value = "获取部门列表", notes = "") @ResponseBody @GetMapping("/list") @RequiresPermissions("system:sysDept:sysDept") public List list() { Map query = new HashMap<>(16); List sysDeptList = sysDeptService.list(query); return sysDeptList; } @GetMapping("/add/{pId}") @RequiresPermissions("system:sysDept:add") String add(@PathVariable("pId") Long pId, Model model) { model.addAttribute("pId", pId); if (pId == 0) { model.addAttribute("pName", "总部门"); } else { model.addAttribute("pName", sysDeptService.get(pId).getName()); } return prefix + "/add"; } @GetMapping("/edit/{deptId}") @RequiresPermissions("system:sysDept:edit") String edit(@PathVariable("deptId") Long deptId, Model model) { DeptDO sysDept = sysDeptService.get(deptId); model.addAttribute("sysDept", sysDept); if (Constant.DEPT_ROOT_ID.equals(sysDept.getParentId())) { model.addAttribute("parentDeptName", "无"); } else { DeptDO parDept = sysDeptService.get(sysDept.getParentId()); model.addAttribute("parentDeptName", parDept.getName()); } return prefix + "/edit"; } /** * 保存 */ @ResponseBody @PostMapping("/save") @RequiresPermissions("system:sysDept:add") public R save(DeptDO sysDept) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (sysDeptService.save(sysDept) > 0) { return R.ok(); } return R.error(); } /** * 修改 */ @ResponseBody @RequestMapping("/update") @RequiresPermissions("system:sysDept:edit") public R update(DeptDO sysDept) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (sysDeptService.update(sysDept) > 0) { return R.ok(); } return R.error(); } /** * 删除 */ @PostMapping("/remove") @ResponseBody @RequiresPermissions("system:sysDept:remove") public R remove(Long deptId) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } Map map = new HashMap(); map.put("parentId", deptId); if (sysDeptService.count(map) > 0) { return R.error(1, "包含下级部门,不允许修改"); } if (sysDeptService.checkDeptHasUser(deptId)) { if (sysDeptService.remove(deptId) > 0) { return R.ok(); } } else { return R.error(1, "部门包含用户,不允许修改"); } return R.error(); } /** * 删除 */ @PostMapping("/batchRemove") @ResponseBody @RequiresPermissions("system:sysDept:batchRemove") public R remove(@RequestParam("ids[]") Long[] deptIds) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } sysDeptService.batchRemove(deptIds); return R.ok(); } @GetMapping("/tree") @ResponseBody public Tree tree() { Tree tree = new Tree(); tree = sysDeptService.getTree(); return tree; } @GetMapping("/treeView") String treeView() { return prefix + "/deptTree"; } } ================================================ FILE: src/main/java/me/zbl/system/controller/LoginController.java ================================================ package me.zbl.system.controller; import me.zbl.common.annotation.Log; import me.zbl.common.controller.BaseController; import me.zbl.common.domain.FileDO; import me.zbl.common.domain.Tree; import me.zbl.common.service.FileService; import me.zbl.common.utils.MD5Utils; import me.zbl.common.utils.R; import me.zbl.common.utils.ShiroUtils; import me.zbl.system.domain.MenuDO; import me.zbl.system.service.MenuService; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; @Controller public class LoginController extends BaseController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired MenuService menuService; @Autowired FileService fileService; @GetMapping({"/", ""}) String welcome(Model model) { return "redirect:/login"; } @Log("请求访问主页") @GetMapping({"/index"}) String index(Model model) { List> menus = menuService.listMenuTree(getUserId()); model.addAttribute("menus", menus); model.addAttribute("name", getUser().getName()); FileDO fileDO = fileService.get(getUser().getPicId()); if (fileDO != null && fileDO.getUrl() != null) { if (fileService.isExist(fileDO.getUrl())) { model.addAttribute("picUrl", fileDO.getUrl()); } else { model.addAttribute("picUrl", "/img/photo_s.jpg"); } } else { model.addAttribute("picUrl", "/img/photo_s.jpg"); } model.addAttribute("username", getUser().getUsername()); return "index_v1"; } @GetMapping("/login") String login() { return "login"; } @Log("登录") @PostMapping("/login") @ResponseBody R ajaxLogin(String username, String password) { password = MD5Utils.encrypt(username, password); UsernamePasswordToken token = new UsernamePasswordToken(username, password); Subject subject = SecurityUtils.getSubject(); try { subject.login(token); return R.ok(); } catch (AuthenticationException e) { return R.error("用户或密码错误"); } } @GetMapping("/logout") String logout() { ShiroUtils.logout(); return "redirect:/login"; } @GetMapping("/main") String main() { return "main"; } } ================================================ FILE: src/main/java/me/zbl/system/controller/MenuController.java ================================================ package me.zbl.system.controller; import me.zbl.common.annotation.Log; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.domain.Tree; import me.zbl.common.utils.R; import me.zbl.system.domain.MenuDO; import me.zbl.system.service.MenuService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; /** * @author 郑保乐 */ @RequestMapping("/sys/menu") @Controller public class MenuController extends BaseController { String prefix = "system/menu"; @Autowired MenuService menuService; @RequiresPermissions("sys:menu:menu") @GetMapping() String menu(Model model) { return prefix + "/menu"; } @RequiresPermissions("sys:menu:menu") @RequestMapping("/list") @ResponseBody List list(@RequestParam Map params) { List menus = menuService.list(params); return menus; } @Log("添加菜单") @RequiresPermissions("sys:menu:add") @GetMapping("/add/{pId}") String add(Model model, @PathVariable("pId") Long pId) { model.addAttribute("pId", pId); if (pId == 0) { model.addAttribute("pName", "根目录"); } else { model.addAttribute("pName", menuService.get(pId).getName()); } return prefix + "/add"; } @Log("编辑菜单") @RequiresPermissions("sys:menu:edit") @GetMapping("/edit/{id}") String edit(Model model, @PathVariable("id") Long id) { MenuDO mdo = menuService.get(id); Long pId = mdo.getParentId(); model.addAttribute("pId", pId); if (pId == 0) { model.addAttribute("pName", "根目录"); } else { model.addAttribute("pName", menuService.get(pId).getName()); } model.addAttribute("menu", mdo); return prefix + "/edit"; } @Log("保存菜单") @RequiresPermissions("sys:menu:add") @PostMapping("/save") @ResponseBody R save(MenuDO menu) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (menuService.save(menu) > 0) { return R.ok(); } else { return R.error(1, "保存失败"); } } @Log("更新菜单") @RequiresPermissions("sys:menu:edit") @PostMapping("/update") @ResponseBody R update(MenuDO menu) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (menuService.update(menu) > 0) { return R.ok(); } else { return R.error(1, "更新失败"); } } @Log("删除菜单") @RequiresPermissions("sys:menu:remove") @PostMapping("/remove") @ResponseBody R remove(Long id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (menuService.remove(id) > 0) { return R.ok(); } else { return R.error(1, "删除失败"); } } @GetMapping("/tree") @ResponseBody Tree tree() { Tree tree = new Tree(); tree = menuService.getTree(); return tree; } @GetMapping("/tree/{roleId}") @ResponseBody Tree tree(@PathVariable("roleId") Long roleId) { Tree tree = new Tree(); tree = menuService.getTree(roleId); return tree; } } ================================================ FILE: src/main/java/me/zbl/system/controller/RoleController.java ================================================ package me.zbl.system.controller; import me.zbl.common.annotation.Log; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.utils.R; import me.zbl.system.domain.RoleDO; import me.zbl.system.service.RoleService; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; @RequestMapping("/sys/role") @Controller public class RoleController extends BaseController { String prefix = "system/role"; @Autowired RoleService roleService; @RequiresPermissions("sys:role:role") @GetMapping() String role() { return prefix + "/role"; } @RequiresPermissions("sys:role:role") @GetMapping("/list") @ResponseBody() List list() { List roles = roleService.list(); return roles; } @Log("添加角色") @RequiresPermissions("sys:role:add") @GetMapping("/add") String add() { return prefix + "/add"; } @Log("编辑角色") @RequiresPermissions("sys:role:edit") @GetMapping("/edit/{id}") String edit(@PathVariable("id") Long id, Model model) { RoleDO roleDO = roleService.get(id); model.addAttribute("role", roleDO); return prefix + "/edit"; } @Log("保存角色") @RequiresPermissions("sys:role:add") @PostMapping("/save") @ResponseBody() R save(RoleDO role) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (roleService.save(role) > 0) { return R.ok(); } else { return R.error(1, "保存失败"); } } @Log("更新角色") @RequiresPermissions("sys:role:edit") @PostMapping("/update") @ResponseBody() R update(RoleDO role) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (roleService.update(role) > 0) { return R.ok(); } else { return R.error(1, "保存失败"); } } @Log("删除角色") @RequiresPermissions("sys:role:remove") @PostMapping("/remove") @ResponseBody() R save(Long id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (roleService.remove(id) > 0) { return R.ok(); } else { return R.error(1, "删除失败"); } } @RequiresPermissions("sys:role:batchRemove") @Log("批量删除角色") @PostMapping("/batchRemove") @ResponseBody R batchRemove(@RequestParam("ids[]") Long[] ids) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } int r = roleService.batchremove(ids); if (r > 0) { return R.ok(); } return R.error(); } } ================================================ FILE: src/main/java/me/zbl/system/controller/SessionController.java ================================================ package me.zbl.system.controller; import me.zbl.common.utils.R; import me.zbl.system.domain.UserOnline; import me.zbl.system.service.SessionService; import org.apache.shiro.session.Session; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.Collection; import java.util.List; @RequestMapping("/sys/online") @Controller public class SessionController { @Autowired SessionService sessionService; @GetMapping() public String online() { return "system/online/online"; } @ResponseBody @RequestMapping("/list") public List list() { return sessionService.list(); } @ResponseBody @RequestMapping("/forceLogout/{sessionId}") public R forceLogout(@PathVariable("sessionId") String sessionId, RedirectAttributes redirectAttributes) { try { sessionService.forceLogout(sessionId); return R.ok(); } catch (Exception e) { e.printStackTrace(); return R.error(); } } @ResponseBody @RequestMapping("/sessionList") public Collection sessionList() { return sessionService.sessionList(); } } ================================================ FILE: src/main/java/me/zbl/system/controller/UserController.java ================================================ package me.zbl.system.controller; import me.zbl.common.annotation.Log; import me.zbl.common.config.Constant; import me.zbl.common.controller.BaseController; import me.zbl.common.domain.Tree; import me.zbl.common.service.DictService; import me.zbl.common.utils.MD5Utils; import me.zbl.common.utils.PageWrapper; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; import me.zbl.system.domain.DeptDO; import me.zbl.system.domain.RoleDO; import me.zbl.system.domain.UserDO; import me.zbl.system.service.RoleService; import me.zbl.system.service.UserService; import me.zbl.system.vo.UserVO; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; @RequestMapping("/sys/user") @Controller public class UserController extends BaseController { @Autowired UserService userService; @Autowired RoleService roleService; @Autowired DictService dictService; private String prefix = "system/user"; @RequiresPermissions("sys:user:user") @GetMapping("") String user(Model model) { return prefix + "/user"; } @GetMapping("/list") @ResponseBody PageWrapper list(@RequestParam Map params) { // 查询列表数据 Query query = new Query(params); List sysUserList = userService.list(query); int total = userService.count(query); PageWrapper pageUtil = new PageWrapper(sysUserList, total); return pageUtil; } @RequiresPermissions("sys:user:add") @Log("添加用户") @GetMapping("/add") String add(Model model) { List roles = roleService.list(); model.addAttribute("roles", roles); return prefix + "/add"; } @RequiresPermissions("sys:user:edit") @Log("编辑用户") @GetMapping("/edit/{id}") String edit(Model model, @PathVariable("id") Long id) { UserDO userDO = userService.get(id); model.addAttribute("user", userDO); List roles = roleService.list(id); model.addAttribute("roles", roles); return prefix + "/edit"; } @RequiresPermissions("sys:user:add") @Log("保存用户") @PostMapping("/save") @ResponseBody R save(UserDO user) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } user.setPassword(MD5Utils.encrypt(user.getUsername(), user.getPassword())); if (userService.save(user) > 0) { return R.ok(); } return R.error(); } @RequiresPermissions("sys:user:edit") @Log("更新用户") @PostMapping("/update") @ResponseBody R update(UserDO user) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (userService.update(user) > 0) { return R.ok(); } return R.error(); } @RequiresPermissions("sys:user:edit") @Log("更新用户") @PostMapping("/updatePeronal") @ResponseBody R updatePeronal(UserDO user) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (userService.updatePersonal(user) > 0) { return R.ok(); } return R.error(); } @RequiresPermissions("sys:user:remove") @Log("删除用户") @PostMapping("/remove") @ResponseBody R remove(Long id) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } if (userService.remove(id) > 0) { return R.ok(); } return R.error(); } @RequiresPermissions("sys:user:batchRemove") @Log("批量删除用户") @PostMapping("/batchRemove") @ResponseBody R batchRemove(@RequestParam("ids[]") Long[] userIds) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } int r = userService.batchremove(userIds); if (r > 0) { return R.ok(); } return R.error(); } @PostMapping("/exit") @ResponseBody boolean exit(@RequestParam Map params) { // 存在,不通过,false return !userService.exit(params); } @RequiresPermissions("sys:user:resetPwd") @Log("请求更改用户密码") @GetMapping("/resetPwd/{id}") String resetPwd(@PathVariable("id") Long userId, Model model) { UserDO userDO = new UserDO(); userDO.setUserId(userId); model.addAttribute("user", userDO); return prefix + "/reset_pwd"; } @Log("提交更改用户密码") @PostMapping("/resetPwd") @ResponseBody R resetPwd(UserVO userVO) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } try { userService.resetPwd(userVO, getUser()); return R.ok(); } catch (Exception e) { return R.error(1, e.getMessage()); } } @RequiresPermissions("sys:user:resetPwd") @Log("admin提交更改用户密码") @PostMapping("/adminResetPwd") @ResponseBody R adminResetPwd(UserVO userVO) { if (Constant.DEMO_ACCOUNT.equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } try { userService.adminResetPwd(userVO); return R.ok(); } catch (Exception e) { return R.error(1, e.getMessage()); } } @GetMapping("/tree") @ResponseBody public Tree tree() { Tree tree = new Tree(); tree = userService.getTree(); return tree; } @GetMapping("/treeView") String treeView() { return prefix + "/userTree"; } @GetMapping("/personal") String personal(Model model) { UserDO userDO = userService.get(getUserId()); model.addAttribute("user", userDO); model.addAttribute("hobbyList", dictService.getHobbyList(userDO)); model.addAttribute("sexList", dictService.getSexList()); return prefix + "/personal"; } @ResponseBody @PostMapping("/uploadImg") R uploadImg(@RequestParam("avatar_file") MultipartFile file, String avatar_data, HttpServletRequest request) { if ("test".equals(getUsername())) { return R.error(1, "演示系统不允许修改,完整体验请部署程序"); } Map result = new HashMap<>(); try { result = userService.updatePersonalImg(file, avatar_data, getUserId()); } catch (Exception e) { return R.error("更新图像失败!"); } if (result != null && result.size() > 0) { return R.ok(result); } else { return R.error("更新图像失败!"); } } } ================================================ FILE: src/main/java/me/zbl/system/dao/DeptDao.java ================================================ package me.zbl.system.dao; import me.zbl.system.domain.DeptDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 部门管理 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 15:35:39 */ @Mapper public interface DeptDao { DeptDO get(Long deptId); List list(Map map); int count(Map map); int save(DeptDO dept); int update(DeptDO dept); int remove(Long deptId); int batchRemove(Long[] deptIds); Long[] listParentDept(); int getDeptUserNumber(Long deptId); } ================================================ FILE: src/main/java/me/zbl/system/dao/MenuDao.java ================================================ package me.zbl.system.dao; import me.zbl.system.domain.MenuDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 菜单管理 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 09:45:09 */ @Mapper public interface MenuDao { MenuDO get(Long menuId); List list(Map map); int count(Map map); int save(MenuDO menu); int update(MenuDO menu); int remove(Long menuId); int batchRemove(Long[] menuIds); List listMenuByUserId(Long id); List listUserPerms(Long id); } ================================================ FILE: src/main/java/me/zbl/system/dao/RoleDao.java ================================================ package me.zbl.system.dao; import me.zbl.system.domain.RoleDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 角色 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-02 20:24:47 */ @Mapper public interface RoleDao { RoleDO get(Long roleId); List list(Map map); int count(Map map); int save(RoleDO role); int update(RoleDO role); int remove(Long roleId); int batchRemove(Long[] roleIds); } ================================================ FILE: src/main/java/me/zbl/system/dao/RoleMenuDao.java ================================================ package me.zbl.system.dao; import me.zbl.system.domain.RoleMenuDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 角色与菜单对应关系 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 11:08:59 */ @Mapper public interface RoleMenuDao { RoleMenuDO get(Long id); List list(Map map); int count(Map map); int save(RoleMenuDO roleMenu); int update(RoleMenuDO roleMenu); int remove(Long id); int batchRemove(Long[] ids); List listMenuIdByRoleId(Long roleId); int removeByRoleId(Long roleId); int removeByMenuId(Long menuId); int batchSave(List list); } ================================================ FILE: src/main/java/me/zbl/system/dao/UserDao.java ================================================ package me.zbl.system.dao; import me.zbl.system.domain.UserDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 09:45:11 */ @Mapper public interface UserDao { UserDO get(Long userId); List list(Map map); int count(Map map); int save(UserDO user); int update(UserDO user); int remove(Long userId); int batchRemove(Long[] userIds); Long[] listAllDept(); } ================================================ FILE: src/main/java/me/zbl/system/dao/UserRoleDao.java ================================================ package me.zbl.system.dao; import me.zbl.system.domain.UserRoleDO; import org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; /** * 用户与角色对应关系 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-10-03 11:08:59 */ @Mapper public interface UserRoleDao { UserRoleDO get(Long id); List list(Map map); int count(Map map); int save(UserRoleDO userRole); int update(UserRoleDO userRole); int remove(Long id); int batchRemove(Long[] ids); List listRoleId(Long userId); int removeByUserId(Long userId); int removeByRoleId(Long roleId); int batchSave(List list); int batchRemoveByUserId(Long[] ids); } ================================================ FILE: src/main/java/me/zbl/system/domain/DeptDO.java ================================================ package me.zbl.system.domain; import java.io.Serializable; /** * 部门管理 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-27 14:28:36 */ public class DeptDO implements Serializable { private static final long serialVersionUID = 1L; // private Long deptId; //上级部门ID,一级部门为0 private Long parentId; //部门名称 private String name; //排序 private Integer orderNum; //是否删除 -1:已删除 0:正常 private Integer delFlag; /** * 获取: */ public Long getDeptId() { return deptId; } /** * 设置: */ public void setDeptId(Long deptId) { this.deptId = deptId; } /** * 获取:上级部门ID,一级部门为0 */ public Long getParentId() { return parentId; } /** * 设置:上级部门ID,一级部门为0 */ public void setParentId(Long parentId) { this.parentId = parentId; } /** * 获取:部门名称 */ public String getName() { return name; } /** * 设置:部门名称 */ public void setName(String name) { this.name = name; } /** * 获取:排序 */ public Integer getOrderNum() { return orderNum; } /** * 设置:排序 */ public void setOrderNum(Integer orderNum) { this.orderNum = orderNum; } /** * 获取:是否删除 -1:已删除 0:正常 */ public Integer getDelFlag() { return delFlag; } /** * 设置:是否删除 -1:已删除 0:正常 */ public void setDelFlag(Integer delFlag) { this.delFlag = delFlag; } @Override public String toString() { return "DeptDO{" + "deptId=" + deptId + ", parentId=" + parentId + ", name='" + name + '\'' + ", orderNum=" + orderNum + ", delFlag=" + delFlag + '}'; } } ================================================ FILE: src/main/java/me/zbl/system/domain/MenuDO.java ================================================ package me.zbl.system.domain; import java.io.Serializable; import java.util.Date; public class MenuDO implements Serializable { private static final long serialVersionUID = 1L; // private Long menuId; // 父菜单ID,一级菜单为0 private Long parentId; // 菜单名称 private String name; // 菜单URL private String url; // 授权(多个用逗号分隔,如:user:list,user:create) private String perms; // 类型 0:目录 1:菜单 2:按钮 private Integer type; // 菜单图标 private String icon; // 排序 private Integer orderNum; // 创建时间 private Date gmtCreate; // 修改时间 private Date gmtModified; /** * 获取: */ public Long getMenuId() { return menuId; } /** * 设置: */ public void setMenuId(Long menuId) { this.menuId = menuId; } /** * 获取:父菜单ID,一级菜单为0 */ public Long getParentId() { return parentId; } /** * 设置:父菜单ID,一级菜单为0 */ public void setParentId(Long parentId) { this.parentId = parentId; } /** * 获取:菜单名称 */ public String getName() { return name; } /** * 设置:菜单名称 */ public void setName(String name) { this.name = name; } /** * 获取:菜单URL */ public String getUrl() { return url; } /** * 设置:菜单URL */ public void setUrl(String url) { this.url = url; } /** * 获取:授权(多个用逗号分隔,如:user:list,user:create) */ public String getPerms() { return perms; } /** * 设置:授权(多个用逗号分隔,如:user:list,user:create) */ public void setPerms(String perms) { this.perms = perms; } /** * 获取:类型 0:目录 1:菜单 2:按钮 */ public Integer getType() { return type; } /** * 设置:类型 0:目录 1:菜单 2:按钮 */ public void setType(Integer type) { this.type = type; } /** * 获取:菜单图标 */ public String getIcon() { return icon; } /** * 设置:菜单图标 */ public void setIcon(String icon) { this.icon = icon; } /** * 获取:排序 */ public Integer getOrderNum() { return orderNum; } /** * 设置:排序 */ public void setOrderNum(Integer orderNum) { this.orderNum = orderNum; } /** * 获取:创建时间 */ public Date getGmtCreate() { return gmtCreate; } /** * 设置:创建时间 */ public void setGmtCreate(Date gmtCreate) { this.gmtCreate = gmtCreate; } /** * 获取:修改时间 */ public Date getGmtModified() { return gmtModified; } /** * 设置:修改时间 */ public void setGmtModified(Date gmtModified) { this.gmtModified = gmtModified; } @Override public String toString() { return "MenuDO{" + "menuId=" + menuId + ", parentId=" + parentId + ", name='" + name + '\'' + ", url='" + url + '\'' + ", perms='" + perms + '\'' + ", type=" + type + ", icon='" + icon + '\'' + ", orderNum=" + orderNum + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified + '}'; } } ================================================ FILE: src/main/java/me/zbl/system/domain/RoleDO.java ================================================ package me.zbl.system.domain; import java.sql.Timestamp; import java.util.List; public class RoleDO { private Long roleId; private String roleName; private String roleSign; private String remark; private Long userIdCreate; private Timestamp gmtCreate; private Timestamp gmtModified; private List menuIds; public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public String getRoleSign() { return roleSign; } public void setRoleSign(String roleSign) { this.roleSign = roleSign; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public Long getUserIdCreate() { return userIdCreate; } public void setUserIdCreate(Long userIdCreate) { this.userIdCreate = userIdCreate; } public Timestamp getGmtCreate() { return gmtCreate; } public void setGmtCreate(Timestamp gmtCreate) { this.gmtCreate = gmtCreate; } public Timestamp getGmtModified() { return gmtModified; } public void setGmtModified(Timestamp gmtModified) { this.gmtModified = gmtModified; } public List getMenuIds() { return menuIds; } public void setMenuIds(List menuIds) { this.menuIds = menuIds; } @Override public String toString() { return "RoleDO{" + "roleId=" + roleId + ", roleName='" + roleName + '\'' + ", roleSign='" + roleSign + '\'' + ", remark='" + remark + '\'' + ", userIdCreate=" + userIdCreate + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified + ", menuIds=" + menuIds + '}'; } } ================================================ FILE: src/main/java/me/zbl/system/domain/RoleMenuDO.java ================================================ package me.zbl.system.domain; public class RoleMenuDO { private Long id; private Long roleId; private Long menuId; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } public Long getMenuId() { return menuId; } public void setMenuId(Long menuId) { this.menuId = menuId; } @Override public String toString() { return "RoleMenuDO{" + "id=" + id + ", roleId=" + roleId + ", menuId=" + menuId + '}'; } } ================================================ FILE: src/main/java/me/zbl/system/domain/UserDO.java ================================================ package me.zbl.system.domain; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; import java.util.List; public class UserDO implements Serializable { private static final long serialVersionUID = 1L; // private Long userId; // 用户名 private String username; // 用户真实姓名 private String name; // 密码 private String password; // 部门 private Long deptId; private String deptName; // 邮箱 private String email; // 手机号 private String mobile; // 状态 0:禁用,1:正常 private Integer status; // 创建用户id private Long userIdCreate; // 创建时间 private Date gmtCreate; // 修改时间 private Date gmtModified; //角色 private List roleIds; //性别 private Long sex; //出身日期 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birth; //图片ID private Long picId; //现居住地 private String liveAddress; //爱好 private String hobby; //省份 private String province; //所在城市 private String city; //所在地区 private String district; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Long getDeptId() { return deptId; } public void setDeptId(Long deptId) { this.deptId = deptId; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public Long getUserIdCreate() { return userIdCreate; } public void setUserIdCreate(Long userIdCreate) { this.userIdCreate = userIdCreate; } public Date getGmtCreate() { return gmtCreate; } public void setGmtCreate(Date gmtCreate) { this.gmtCreate = gmtCreate; } public Date getGmtModified() { return gmtModified; } public void setGmtModified(Date gmtModified) { this.gmtModified = gmtModified; } public List getRoleIds() { return roleIds; } public void setRoleIds(List roleIds) { this.roleIds = roleIds; } public Long getSex() { return sex; } public void setSex(Long sex) { this.sex = sex; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public Long getPicId() { return picId; } public void setPicId(Long picId) { this.picId = picId; } public String getLiveAddress() { return liveAddress; } public void setLiveAddress(String liveAddress) { this.liveAddress = liveAddress; } public String getHobby() { return hobby; } public void setHobby(String hobby) { this.hobby = hobby; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getDistrict() { return district; } public void setDistrict(String district) { this.district = district; } @Override public String toString() { return "UserDO{" + "userId=" + userId + ", username='" + username + '\'' + ", name='" + name + '\'' + ", password='" + password + '\'' + ", deptId=" + deptId + ", deptName='" + deptName + '\'' + ", email='" + email + '\'' + ", mobile='" + mobile + '\'' + ", status=" + status + ", userIdCreate=" + userIdCreate + ", gmtCreate=" + gmtCreate + ", gmtModified=" + gmtModified + ", roleIds=" + roleIds + ", sex=" + sex + ", birth=" + birth + ", picId=" + picId + ", liveAddress='" + liveAddress + '\'' + ", hobby='" + hobby + '\'' + ", province='" + province + '\'' + ", city='" + city + '\'' + ", district='" + district + '\'' + '}'; } } ================================================ FILE: src/main/java/me/zbl/system/domain/UserOnline.java ================================================ package me.zbl.system.domain; import java.util.Date; /** * * */ public class UserOnline { /** */ private String id; private String userId; private String username; /** * 用户主机地址 */ private String host; /** * 用户登录时系统IP */ private String systemHost; /** * 用户浏览器类型 */ private String userAgent; /** * 在线状态 */ private String status = "on_line"; /** * session创建时间 */ private Date startTimestamp; /** * session最后访问时间 */ private Date lastAccessTime; /** * 超时时间 */ private Long timeout; /** * 备份的当前用户会话 */ private String onlineSession; public String getId() { return id; } public void setId(String id) { this.id = id; } public Date getStartTimestamp() { return startTimestamp; } public void setStartTimestamp(Date startTimestamp) { this.startTimestamp = startTimestamp; } public Date getLastAccessTime() { return lastAccessTime; } public void setLastAccessTime(Date lastAccessTime) { this.lastAccessTime = lastAccessTime; } public Long getTimeout() { return timeout; } public void setTimeout(Long timeout) { this.timeout = timeout; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserAgent() { return userAgent; } public void setUserAgent(String userAgent) { this.userAgent = userAgent; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getOnlineSession() { return onlineSession; } public void setOnlineSession(String onlineSession) { this.onlineSession = onlineSession; } public String getSystemHost() { return systemHost; } public void setSystemHost(String systemHost) { this.systemHost = systemHost; } } ================================================ FILE: src/main/java/me/zbl/system/domain/UserRoleDO.java ================================================ package me.zbl.system.domain; public class UserRoleDO { private Long id; private Long userId; private Long roleId; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } @Override public String toString() { return "UserRoleDO{" + "id=" + id + ", userId=" + userId + ", roleId=" + roleId + '}'; } } ================================================ FILE: src/main/java/me/zbl/system/domain/UserToken.java ================================================ package me.zbl.system.domain; import java.io.Serializable; /** * @author 郑保乐 * @version V1.0 */ public class UserToken implements Serializable { private static final long serialVersionUID = 1L; private Long userId; private String username; private String name; private String password; private Long deptId; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Long getDeptId() { return deptId; } public void setDeptId(Long deptId) { this.deptId = deptId; } } ================================================ FILE: src/main/java/me/zbl/system/filter/XssFilter.java ================================================ package me.zbl.system.filter; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 拦截防止xss注入 * 通过Jsoup过滤请求参数内的特定字符 * * @author 郑保乐 */ public class XssFilter implements Filter { private static Logger logger = LoggerFactory.getLogger(XssFilter.class); /** * 是否过滤富文本内容 */ private static boolean IS_INCLUDE_RICH_TEXT = false; public List excludes = new ArrayList<>(); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { if (logger.isDebugEnabled()) { logger.debug("xss filter is open"); } HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; if (handleExcludeURL(req, resp)) { filterChain.doFilter(request, response); return; } XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request, IS_INCLUDE_RICH_TEXT); filterChain.doFilter(xssRequest, response); } private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) { if (excludes == null || excludes.isEmpty()) { return false; } String url = request.getServletPath(); for (String pattern : excludes) { Pattern p = Pattern.compile("^" + pattern); Matcher m = p.matcher(url); if (m.find()) { return true; } } return false; } @Override public void init(FilterConfig filterConfig) { if (logger.isDebugEnabled()) { logger.debug("xss filter init~~~~~~~~~~~~"); } String isIncludeRichText = filterConfig.getInitParameter("isIncludeRichText"); if (StringUtils.isNotBlank(isIncludeRichText)) { IS_INCLUDE_RICH_TEXT = BooleanUtils.toBoolean(isIncludeRichText); } String temp = filterConfig.getInitParameter("excludes"); if (temp != null) { String[] url = temp.split(","); for (int i = 0; url != null && i < url.length; i++) { excludes.add(url[i]); } } } @Override public void destroy() { } } ================================================ FILE: src/main/java/me/zbl/system/filter/XssHttpServletRequestWrapper.java ================================================ package me.zbl.system.filter; import me.zbl.common.utils.xss.JsoupUtil; import org.apache.commons.lang3.StringUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; /** * {@link XssHttpServletRequestWrapper} * * @author 郑保乐 */ public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { HttpServletRequest orgRequest = null; private boolean isIncludeRichText = false; public XssHttpServletRequestWrapper(HttpServletRequest request, boolean isIncludeRichText) { super(request); orgRequest = request; this.isIncludeRichText = isIncludeRichText; } /** * 获取最原始的request的静态方法 * * @return */ public static HttpServletRequest getOrgRequest(HttpServletRequest req) { if (req instanceof XssHttpServletRequestWrapper) { return ((XssHttpServletRequestWrapper) req).getOrgRequest(); } return req; } /** * 覆盖getParameter方法,将参数名和参数值都做xss过滤。
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖 */ @Override public String getParameter(String name) { Boolean flag = ("content".equals(name) || name.endsWith("WithHtml")); if (flag && !isIncludeRichText) { return super.getParameter(name); } name = JsoupUtil.clean(name); String value = super.getParameter(name); if (StringUtils.isNotBlank(value)) { value = JsoupUtil.clean(value); } return value; } @Override public String[] getParameterValues(String name) { String[] arr = super.getParameterValues(name); if (arr != null) { for (int i = 0; i < arr.length; i++) { arr[i] = JsoupUtil.clean(arr[i]); } } return arr; } /** * 覆盖getHeader方法,将参数名和参数值都做xss过滤。
* 如果需要获得原始的值,则通过super.getHeaders(name)来获取
* getHeaderNames 也可能需要覆盖 */ @Override public String getHeader(String name) { name = JsoupUtil.clean(name); String value = super.getHeader(name); if (StringUtils.isNotBlank(value)) { value = JsoupUtil.clean(value); } return value; } /** * 获取最原始的request * * @return */ public HttpServletRequest getOrgRequest() { return orgRequest; } } ================================================ FILE: src/main/java/me/zbl/system/service/DeptService.java ================================================ package me.zbl.system.service; import me.zbl.common.domain.Tree; import me.zbl.system.domain.DeptDO; import java.util.List; import java.util.Map; /** * 部门管理 * * @author 郑保乐 * @email 18333298410@163.com * @date 2017-09-27 14:28:36 */ public interface DeptService { DeptDO get(Long deptId); List list(Map map); int count(Map map); int save(DeptDO sysDept); int update(DeptDO sysDept); int remove(Long deptId); int batchRemove(Long[] deptIds); Tree getTree(); boolean checkDeptHasUser(Long deptId); } ================================================ FILE: src/main/java/me/zbl/system/service/MenuService.java ================================================ package me.zbl.system.service; import me.zbl.common.domain.Tree; import me.zbl.system.domain.MenuDO; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import java.util.Set; @Service public interface MenuService { Tree getSysMenuTree(Long id); List> listMenuTree(Long id); Tree getTree(); Tree getTree(Long id); List list(Map params); int remove(Long id); int save(MenuDO menu); int update(MenuDO menu); MenuDO get(Long id); Set listPerms(Long userId); } ================================================ FILE: src/main/java/me/zbl/system/service/RoleService.java ================================================ package me.zbl.system.service; import me.zbl.system.domain.RoleDO; import org.springframework.stereotype.Service; import java.util.List; @Service public interface RoleService { RoleDO get(Long id); List list(); int save(RoleDO role); int update(RoleDO role); int remove(Long id); List list(Long userId); int batchremove(Long[] ids); } ================================================ FILE: src/main/java/me/zbl/system/service/SessionService.java ================================================ package me.zbl.system.service; import me.zbl.system.domain.UserDO; import me.zbl.system.domain.UserOnline; import org.apache.shiro.session.Session; import org.springframework.stereotype.Service; import java.util.Collection; import java.util.List; @Service public interface SessionService { List list(); List listOnlineUser(); Collection sessionList(); boolean forceLogout(String sessionId); } ================================================ FILE: src/main/java/me/zbl/system/service/UserService.java ================================================ package me.zbl.system.service; import me.zbl.common.domain.Tree; import me.zbl.system.domain.DeptDO; import me.zbl.system.domain.UserDO; import me.zbl.system.vo.UserVO; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.util.List; import java.util.Map; import java.util.Set; @Service public interface UserService { UserDO get(Long id); List list(Map map); int count(Map map); int save(UserDO user); int update(UserDO user); int remove(Long userId); int batchremove(Long[] userIds); boolean exit(Map params); Set listRoles(Long userId); int resetPwd(UserVO userVO, UserDO userDO) throws Exception; int adminResetPwd(UserVO userVO) throws Exception; Tree getTree(); /** * 更新个人信息 * * @param userDO * * @return */ int updatePersonal(UserDO userDO); /** * 更新个人图片 * * @param file 图片 * @param avatar_data 裁剪信息 * @param userId 用户ID * * @throws Exception */ Map updatePersonalImg(MultipartFile file, String avatar_data, Long userId) throws Exception; } ================================================ FILE: src/main/java/me/zbl/system/service/impl/DeptServiceImpl.java ================================================ package me.zbl.system.service.impl; import me.zbl.common.domain.Tree; import me.zbl.common.utils.BuildTree; import me.zbl.system.dao.DeptDao; import me.zbl.system.domain.DeptDO; import me.zbl.system.service.DeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class DeptServiceImpl implements DeptService { @Autowired private DeptDao sysDeptMapper; @Override public DeptDO get(Long deptId) { return sysDeptMapper.get(deptId); } @Override public List list(Map map) { return sysDeptMapper.list(map); } @Override public int count(Map map) { return sysDeptMapper.count(map); } @Override public int save(DeptDO sysDept) { return sysDeptMapper.save(sysDept); } @Override public int update(DeptDO sysDept) { return sysDeptMapper.update(sysDept); } @Override public int remove(Long deptId) { return sysDeptMapper.remove(deptId); } @Override public int batchRemove(Long[] deptIds) { return sysDeptMapper.batchRemove(deptIds); } @Override public Tree getTree() { List> trees = new ArrayList>(); List sysDepts = sysDeptMapper.list(new HashMap(16)); for (DeptDO sysDept : sysDepts) { Tree tree = new Tree(); tree.setId(sysDept.getDeptId().toString()); tree.setParentId(sysDept.getParentId().toString()); tree.setText(sysDept.getName()); Map state = new HashMap<>(16); state.put("opened", true); tree.setState(state); trees.add(tree); } // 默认顶级菜单为0,根据数据库实际情况调整 Tree t = BuildTree.build(trees); return t; } @Override public boolean checkDeptHasUser(Long deptId) { //查询部门以及此部门的下级部门 int result = sysDeptMapper.getDeptUserNumber(deptId); return result == 0; } } ================================================ FILE: src/main/java/me/zbl/system/service/impl/MenuServiceImpl.java ================================================ package me.zbl.system.service.impl; import me.zbl.common.domain.Tree; import me.zbl.common.utils.BuildTree; import me.zbl.system.dao.MenuDao; import me.zbl.system.dao.RoleMenuDao; import me.zbl.system.domain.MenuDO; import me.zbl.system.service.MenuService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.*; @SuppressWarnings("AlibabaRemoveCommentedCode") @Service @Transactional(readOnly = true, rollbackFor = Exception.class) public class MenuServiceImpl implements MenuService { @Autowired MenuDao menuMapper; @Autowired RoleMenuDao roleMenuMapper; /** * @param * * @return 树形菜单 */ @Cacheable @Override public Tree getSysMenuTree(Long id) { List> trees = new ArrayList>(); List menuDOs = menuMapper.listMenuByUserId(id); for (MenuDO sysMenuDO : menuDOs) { Tree tree = new Tree(); tree.setId(sysMenuDO.getMenuId().toString()); tree.setParentId(sysMenuDO.getParentId().toString()); tree.setText(sysMenuDO.getName()); Map attributes = new HashMap<>(16); attributes.put("url", sysMenuDO.getUrl()); attributes.put("icon", sysMenuDO.getIcon()); tree.setAttributes(attributes); trees.add(tree); } // 默认顶级菜单为0,根据数据库实际情况调整 Tree t = BuildTree.build(trees); return t; } @Override public List list(Map params) { List menus = menuMapper.list(params); return menus; } @Transactional(readOnly = false, rollbackFor = Exception.class) @Override public int remove(Long id) { int result = menuMapper.remove(id); return result; } @Transactional(readOnly = false, rollbackFor = Exception.class) @Override public int save(MenuDO menu) { int r = menuMapper.save(menu); return r; } @Transactional(readOnly = false, rollbackFor = Exception.class) @Override public int update(MenuDO menu) { int r = menuMapper.update(menu); return r; } @Override public MenuDO get(Long id) { MenuDO menuDO = menuMapper.get(id); return menuDO; } @Override public Tree getTree() { List> trees = new ArrayList>(); List menuDOs = menuMapper.list(new HashMap<>(16)); for (MenuDO sysMenuDO : menuDOs) { Tree tree = new Tree(); tree.setId(sysMenuDO.getMenuId().toString()); tree.setParentId(sysMenuDO.getParentId().toString()); tree.setText(sysMenuDO.getName()); trees.add(tree); } // 默认顶级菜单为0,根据数据库实际情况调整 Tree t = BuildTree.build(trees); return t; } @Override public Tree getTree(Long id) { // 根据roleId查询权限 List menus = menuMapper.list(new HashMap(16)); List menuIds = roleMenuMapper.listMenuIdByRoleId(id); List temp = menuIds; for (MenuDO menu : menus) { if (temp.contains(menu.getParentId())) { menuIds.remove(menu.getParentId()); } } List> trees = new ArrayList>(); List menuDOs = menuMapper.list(new HashMap(16)); for (MenuDO sysMenuDO : menuDOs) { Tree tree = new Tree(); tree.setId(sysMenuDO.getMenuId().toString()); tree.setParentId(sysMenuDO.getParentId().toString()); tree.setText(sysMenuDO.getName()); Map state = new HashMap<>(16); Long menuId = sysMenuDO.getMenuId(); if (menuIds.contains(menuId)) { state.put("selected", true); } else { state.put("selected", false); } tree.setState(state); trees.add(tree); } // 默认顶级菜单为0,根据数据库实际情况调整 Tree t = BuildTree.build(trees); return t; } @Override public Set listPerms(Long userId) { List perms = menuMapper.listUserPerms(userId); Set permsSet = new HashSet<>(); for (String perm : perms) { if (StringUtils.isNotBlank(perm)) { permsSet.addAll(Arrays.asList(perm.trim().split(","))); } } return permsSet; } @Override public List> listMenuTree(Long id) { List> trees = new ArrayList>(); List menuDOs = menuMapper.listMenuByUserId(id); for (MenuDO sysMenuDO : menuDOs) { Tree tree = new Tree(); tree.setId(sysMenuDO.getMenuId().toString()); tree.setParentId(sysMenuDO.getParentId().toString()); tree.setText(sysMenuDO.getName()); Map attributes = new HashMap<>(16); attributes.put("url", sysMenuDO.getUrl()); attributes.put("icon", sysMenuDO.getIcon()); tree.setAttributes(attributes); trees.add(tree); } // 默认顶级菜单为0,根据数据库实际情况调整 List> list = BuildTree.buildList(trees, "0"); return list; } } ================================================ FILE: src/main/java/me/zbl/system/service/impl/RoleServiceImpl.java ================================================ package me.zbl.system.service.impl; import me.zbl.system.dao.RoleDao; import me.zbl.system.dao.RoleMenuDao; import me.zbl.system.dao.UserDao; import me.zbl.system.dao.UserRoleDao; import me.zbl.system.domain.RoleDO; import me.zbl.system.domain.RoleMenuDO; import me.zbl.system.service.RoleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Objects; @Service public class RoleServiceImpl implements RoleService { public static final String ROLE_ALL_KEY = "\"role_all\""; public static final String DEMO_CACHE_NAME = "role"; @Autowired RoleDao roleMapper; @Autowired RoleMenuDao roleMenuMapper; @Autowired UserDao userMapper; @Autowired UserRoleDao userRoleMapper; @Override public List list() { List roles = roleMapper.list(new HashMap<>(16)); return roles; } @Override public List list(Long userId) { List rolesIds = userRoleMapper.listRoleId(userId); List roles = roleMapper.list(new HashMap<>(16)); for (RoleDO roleDO : roles) { roleDO.setRoleSign("false"); for (Long roleId : rolesIds) { if (Objects.equals(roleDO.getRoleId(), roleId)) { roleDO.setRoleSign("true"); break; } } } return roles; } @Transactional @Override public int save(RoleDO role) { int count = roleMapper.save(role); List menuIds = role.getMenuIds(); Long roleId = role.getRoleId(); List rms = new ArrayList<>(); for (Long menuId : menuIds) { RoleMenuDO rmDo = new RoleMenuDO(); rmDo.setRoleId(roleId); rmDo.setMenuId(menuId); rms.add(rmDo); } roleMenuMapper.removeByRoleId(roleId); if (rms.size() > 0) { roleMenuMapper.batchSave(rms); } return count; } @Transactional @Override public int remove(Long id) { int count = roleMapper.remove(id); userRoleMapper.removeByRoleId(id); roleMenuMapper.removeByRoleId(id); return count; } @Override public RoleDO get(Long id) { RoleDO roleDO = roleMapper.get(id); return roleDO; } @Override public int update(RoleDO role) { int r = roleMapper.update(role); List menuIds = role.getMenuIds(); Long roleId = role.getRoleId(); roleMenuMapper.removeByRoleId(roleId); List rms = new ArrayList<>(); for (Long menuId : menuIds) { RoleMenuDO rmDo = new RoleMenuDO(); rmDo.setRoleId(roleId); rmDo.setMenuId(menuId); rms.add(rmDo); } if (rms.size() > 0) { roleMenuMapper.batchSave(rms); } return r; } @Override public int batchremove(Long[] ids) { int r = roleMapper.batchRemove(ids); return r; } } ================================================ FILE: src/main/java/me/zbl/system/service/impl/SessionServiceImpl.java ================================================ package me.zbl.system.service.impl; import me.zbl.system.domain.UserDO; import me.zbl.system.domain.UserOnline; import me.zbl.system.service.SessionService; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.subject.SimplePrincipalCollection; import org.apache.shiro.subject.support.DefaultSubjectContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * 待完善 * * @author 郑保乐 */ @Service public class SessionServiceImpl implements SessionService { private final SessionDAO sessionDAO; @Autowired public SessionServiceImpl(SessionDAO sessionDAO) { this.sessionDAO = sessionDAO; } @Override public List list() { List list = new ArrayList<>(); Collection sessions = sessionDAO.getActiveSessions(); for (Session session : sessions) { UserOnline userOnline = new UserOnline(); if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) == null) { continue; } else { SimplePrincipalCollection principalCollection = (SimplePrincipalCollection) session .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); UserDO userDO = (UserDO) principalCollection.getPrimaryPrincipal(); userOnline.setUsername(userDO.getUsername()); } userOnline.setId((String) session.getId()); userOnline.setHost(session.getHost()); userOnline.setStartTimestamp(session.getStartTimestamp()); userOnline.setLastAccessTime(session.getLastAccessTime()); userOnline.setTimeout(session.getTimeout()); list.add(userOnline); } return list; } @Override public List listOnlineUser() { List list = new ArrayList<>(); UserDO userDO; Collection sessions = sessionDAO.getActiveSessions(); for (Session session : sessions) { SimplePrincipalCollection principalCollection = new SimplePrincipalCollection(); if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) == null) { continue; } else { principalCollection = (SimplePrincipalCollection) session .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); userDO = (UserDO) principalCollection.getPrimaryPrincipal(); list.add(userDO); } } return list; } @Override public Collection sessionList() { return sessionDAO.getActiveSessions(); } @Override public boolean forceLogout(String sessionId) { Session session = sessionDAO.readSession(sessionId); session.setTimeout(0); return true; } } ================================================ FILE: src/main/java/me/zbl/system/service/impl/UserServiceImpl.java ================================================ package me.zbl.system.service.impl; import me.zbl.common.config.HospitalConfig; import me.zbl.common.domain.FileDO; import me.zbl.common.domain.Tree; import me.zbl.common.service.FileService; import me.zbl.common.utils.*; import me.zbl.system.dao.DeptDao; import me.zbl.system.dao.UserDao; import me.zbl.system.dao.UserRoleDao; import me.zbl.system.domain.DeptDO; import me.zbl.system.domain.UserDO; import me.zbl.system.domain.UserRoleDO; import me.zbl.system.service.UserService; import me.zbl.system.vo.UserVO; import org.apache.commons.lang.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.util.*; @Transactional @Service public class UserServiceImpl implements UserService { private static final Logger logger = LoggerFactory.getLogger(UserService.class); @Autowired UserDao userMapper; @Autowired UserRoleDao userRoleMapper; @Autowired DeptDao deptMapper; @Autowired private FileService sysFileService; @Autowired private HospitalConfig hospitalConfig; @Override public UserDO get(Long id) { List roleIds = userRoleMapper.listRoleId(id); UserDO user = userMapper.get(id); user.setDeptName(deptMapper.get(user.getDeptId()).getName()); user.setRoleIds(roleIds); return user; } @Override public List list(Map map) { return userMapper.list(map); } @Override public int count(Map map) { return userMapper.count(map); } @Transactional @Override public int save(UserDO user) { int count = userMapper.save(user); Long userId = user.getUserId(); List roles = user.getRoleIds(); userRoleMapper.removeByUserId(userId); List list = new ArrayList<>(); for (Long roleId : roles) { UserRoleDO ur = new UserRoleDO(); ur.setUserId(userId); ur.setRoleId(roleId); list.add(ur); } if (list.size() > 0) { userRoleMapper.batchSave(list); } return count; } @Override public int update(UserDO user) { int r = userMapper.update(user); Long userId = user.getUserId(); List roles = user.getRoleIds(); userRoleMapper.removeByUserId(userId); List list = new ArrayList<>(); for (Long roleId : roles) { UserRoleDO ur = new UserRoleDO(); ur.setUserId(userId); ur.setRoleId(roleId); list.add(ur); } if (list.size() > 0) { userRoleMapper.batchSave(list); } return r; } @Override public int remove(Long userId) { userRoleMapper.removeByUserId(userId); return userMapper.remove(userId); } @Override public boolean exit(Map params) { boolean exit; exit = userMapper.list(params).size() > 0; return exit; } @Override public Set listRoles(Long userId) { return null; } @Override public int resetPwd(UserVO userVO, UserDO userDO) throws Exception { if (Objects.equals(userVO.getUserDO().getUserId(), userDO.getUserId())) { if (Objects.equals(MD5Utils.encrypt(userDO.getUsername(), userVO.getPwdOld()), userDO.getPassword())) { userDO.setPassword(MD5Utils.encrypt(userDO.getUsername(), userVO.getPwdNew())); return userMapper.update(userDO); } else { throw new Exception("输入的旧密码有误!"); } } else { throw new Exception("你修改的不是你登录的账号!"); } } @Override public int adminResetPwd(UserVO userVO) throws Exception { UserDO userDO = get(userVO.getUserDO().getUserId()); if ("admin".equals(userDO.getUsername())) { throw new Exception("超级管理员的账号不允许直接重置!"); } userDO.setPassword(MD5Utils.encrypt(userDO.getUsername(), userVO.getPwdNew())); return userMapper.update(userDO); } @Transactional @Override public int batchremove(Long[] userIds) { int count = userMapper.batchRemove(userIds); userRoleMapper.batchRemoveByUserId(userIds); return count; } @Override public Tree getTree() { List> trees = new ArrayList>(); List depts = deptMapper.list(new HashMap(16)); Long[] pDepts = deptMapper.listParentDept(); Long[] uDepts = userMapper.listAllDept(); Long[] allDepts = (Long[]) ArrayUtils.addAll(pDepts, uDepts); for (DeptDO dept : depts) { if (!ArrayUtils.contains(allDepts, dept.getDeptId())) { continue; } Tree tree = new Tree(); tree.setId(dept.getDeptId().toString()); tree.setParentId(dept.getParentId().toString()); tree.setText(dept.getName()); Map state = new HashMap<>(16); state.put("opened", true); state.put("mType", "dept"); tree.setState(state); trees.add(tree); } List users = userMapper.list(new HashMap(16)); for (UserDO user : users) { Tree tree = new Tree(); tree.setId(user.getUserId().toString()); tree.setParentId(user.getDeptId().toString()); tree.setText(user.getName()); Map state = new HashMap<>(16); state.put("opened", true); state.put("mType", "user"); tree.setState(state); trees.add(tree); } // 默认顶级菜单为0,根据数据库实际情况调整 Tree t = BuildTree.build(trees); return t; } @Override public int updatePersonal(UserDO userDO) { return userMapper.update(userDO); } @Override public Map updatePersonalImg(MultipartFile file, String avatar_data, Long userId) throws Exception { String fileName = file.getOriginalFilename(); fileName = FileUtil.renameToUUID(fileName); FileDO sysFile = new FileDO(FileType.fileType(fileName), "/files/" + fileName, new Date()); //获取图片后缀 String prefix = fileName.substring((fileName.lastIndexOf(".") + 1)); String[] str = avatar_data.split(","); //获取截取的x坐标 int x = (int) Math.floor(Double.parseDouble(str[0].split(":")[1])); //获取截取的y坐标 int y = (int) Math.floor(Double.parseDouble(str[1].split(":")[1])); //获取截取的高度 int h = (int) Math.floor(Double.parseDouble(str[2].split(":")[1])); //获取截取的宽度 int w = (int) Math.floor(Double.parseDouble(str[3].split(":")[1])); //获取旋转的角度 int r = Integer.parseInt(str[4].split(":")[1].replaceAll("}", "")); try { BufferedImage cutImage = ImageUtils.cutImage(file, x, y, w, h, prefix); BufferedImage rotateImage = ImageUtils.rotateImage(cutImage, r); ByteArrayOutputStream out = new ByteArrayOutputStream(); boolean flag = ImageIO.write(rotateImage, prefix, out); //转换后存入数据库 byte[] b = out.toByteArray(); FileUtil.uploadFile(b, hospitalConfig.getUploadPath(), fileName); } catch (Exception e) { throw new Exception("图片裁剪错误!!"); } Map result = new HashMap<>(); if (sysFileService.save(sysFile) > 0) { UserDO userDO = new UserDO(); userDO.setUserId(userId); userDO.setPicId(sysFile.getId()); if (userMapper.update(userDO) > 0) { result.put("url", sysFile.getUrl()); } } return result; } } ================================================ FILE: src/main/java/me/zbl/system/shiro/UserRealm.java ================================================ package me.zbl.system.shiro; import me.zbl.common.config.ApplicationContextRegister; import me.zbl.common.utils.ShiroUtils; import me.zbl.system.dao.UserDao; import me.zbl.system.domain.UserDO; import me.zbl.system.service.MenuService; import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import java.util.HashMap; import java.util.Map; import java.util.Set; public class UserRealm extends AuthorizingRealm { /* @Autowired UserDao userMapper; @Autowired MenuService menuService;*/ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { Long userId = ShiroUtils.getUserId(); MenuService menuService = ApplicationContextRegister.getBean(MenuService.class); Set perms = menuService.listPerms(userId); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setStringPermissions(perms); return info; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); Map map = new HashMap<>(16); map.put("username", username); String password = new String((char[]) token.getCredentials()); UserDao userMapper = ApplicationContextRegister.getBean(UserDao.class); // 查询用户信息 UserDO user = userMapper.list(map).get(0); // 账号不存在 if (user == null) { throw new UnknownAccountException("账号或密码不正确"); } // 密码错误 if (!password.equals(user.getPassword())) { throw new IncorrectCredentialsException("账号或密码不正确"); } // 账号锁定 if (user.getStatus() == 0) { throw new LockedAccountException("账号已被锁定,请联系管理员"); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName()); return info; } } ================================================ FILE: src/main/java/me/zbl/system/vo/UserVO.java ================================================ package me.zbl.system.vo; import me.zbl.system.domain.UserDO; /** * @author 郑保乐 * @date 2017/12/15. */ public class UserVO { /** * 更新的用户对象 */ private UserDO userDO = new UserDO(); /** * 旧密码 */ private String pwdOld; /** * 新密码 */ private String pwdNew; public UserDO getUserDO() { return userDO; } public void setUserDO(UserDO userDO) { this.userDO = userDO; } public String getPwdOld() { return pwdOld; } public void setPwdOld(String pwdOld) { this.pwdOld = pwdOld; } public String getPwdNew() { return pwdNew; } public void setPwdNew(String pwdNew) { this.pwdNew = pwdNew; } } ================================================ FILE: src/main/java/me/zbl/util/PageUtil.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.util; import com.github.pagehelper.ISelect; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import java.util.Map; import java.util.Optional; /** * @author JamesZBL * @email 1146556298@qq.com * @date 2018-06-24 */ public class PageUtil { public static Page page(Map params, ISelect select) { Optional orderby = Optional.ofNullable((String) (params.get("orderby"))); Page page = PageHelper.offsetPage( (Integer) params.get("offset"), (Integer) params.get("limit")); orderby.ifPresent(page::setOrderBy); return page.doSelectPage(select); } } ================================================ FILE: src/main/resources/application-dev.yml ================================================ hospital: uploadPath: D:/var/uploaded_files/ logging: level: root: info me.zbl: debug spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://47.93.187.44:3306/hospital-drug?useUnicode=true&characterEncoding=utf8 username: dev password: 19961120 initialSize: 1 minIdle: 3 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 30000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 #useGlobalDataSourceStat: true redis: host: localhost port: 6379 password: # 连接超时时间(毫秒) timeout: 10000 pool: # 连接池中的最大空闲连接 max-idle: 8 # 连接池中的最小空闲连接 min-idle: 10 # 连接池最大连接数(使用负值表示没有限制) max-active: 100 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1 ================================================ FILE: src/main/resources/application-pro.yml ================================================ hospital: uploadPath: drug-sys/uploaded_files/ logging: level: root: error me.zbl: info spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.jdbc.Driver url: jdbc:mysql://47.93.187.44:3306/hospital-drug?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC username: dev password: 19961120 initialSize: 1 minIdle: 3 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 30000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false # 打开PSCache,并且指定每个连接上PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 filters: stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 #useGlobalDataSourceStat: true redis: host: localhost port: 6379 password: # 连接超时时间(毫秒) timeout: 10000 pool: # 连接池中的最大空闲连接 max-idle: 8 # 连接池中的最小空闲连接 min-idle: 10 # 连接池最大连接数(使用负值表示没有限制) max-active: 100 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1 ================================================ FILE: src/main/resources/application.yml ================================================ server: port: 8086 session-timeout: 36000 tomcat: uri-encoding: utf-8 # max-threads: 1000 # min-spare-threads: 30 security: basic: enabled: false spring: thymeleaf: mode: LEGACYHTML5 cache: false jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss profiles: active: dev http: multipart: max-file-size: 30Mb max-request-size: 30Mb devtools: restart: enabled: true mybatis: configuration: map-underscore-to-camel-case: true mapper-locations: mybatis/**/*Mapper.xml typeAliasesPackage: me.zbl.**.domain #配置缓存和session存储方式,默认ehcache,可选redis cacheType: ehcache ================================================ FILE: src/main/resources/config/ehcache.xml ================================================ ================================================ FILE: src/main/resources/config/quartz.properties ================================================ ================================================ FILE: src/main/resources/generatorConfig.xml ================================================
================================================ FILE: src/main/resources/logback-spring.xml ================================================ logback %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n true applog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log %d{yyyy-MM-dd HH:mm:ss} -%msg%n ================================================ FILE: src/main/resources/mybatis/activiti/SalaryMapper.xml ================================================ insert into salary ( `id`, `PROC_INS_ID`, `USER_ID`, `OFFICE_ID`, `POST`, `AGE`, `EDU`, `CONTENT`, `OLDA`, `OLDB`, `OLDC`, `NEWA`, `NEWB`, `NEWC`, `ADD_NUM`, `EXE_DATE`, `HR_TEXT`, `LEAD_TEXT`, `MAIN_LEAD_TEXT`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag` ) values ( #{id}, #{procInsId}, #{userId}, #{officeId}, #{post}, #{age}, #{edu}, #{content}, #{olda}, #{oldb}, #{oldc}, #{newa}, #{newb}, #{newc}, #{addNum}, #{exeDate}, #{hrText}, #{leadText}, #{mainLeadText}, #{createBy}, #{createDate}, #{updateBy}, #{updateDate}, #{remarks}, #{delFlag} ) update salary `PROC_INS_ID` = #{procInsId}, `USER_ID` = #{userId}, `OFFICE_ID` = #{officeId}, `POST` = #{post}, `AGE` = #{age}, `EDU` = #{edu}, `CONTENT` = #{content}, `OLDA` = #{olda}, `OLDB` = #{oldb}, `OLDC` = #{oldc}, `NEWA` = #{newa}, `NEWB` = #{newb}, `NEWC` = #{newc}, `ADD_NUM` = #{addNum}, `EXE_DATE` = #{exeDate}, `HR_TEXT` = #{hrText}, `LEAD_TEXT` = #{leadText}, `MAIN_LEAD_TEXT` = #{mainLeadText}, `create_by` = #{createBy}, `create_date` = #{createDate}, `update_by` = #{updateBy}, `update_date` = #{updateDate}, `remarks` = #{remarks}, `del_flag` = #{delFlag} where id = #{id} delete from salary where id = #{value} delete from salary where id in #{id} ================================================ FILE: src/main/resources/mybatis/app/ConsumerMapper.xml ================================================ id, name, tel delete from app_consumer where id = #{id,jdbcType=VARCHAR} select replace(uuid(),'-','') from dual insert into app_consumer (id, name, tel ) values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{tel,jdbcType=VARCHAR} ) select replace(uuid(),'-','') from dual insert into app_consumer id, name, tel, #{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{tel,jdbcType=VARCHAR}, update app_consumer name = #{name,jdbcType=VARCHAR}, tel = #{tel,jdbcType=VARCHAR}, where id = #{id,jdbcType=VARCHAR} update app_consumer set name = #{name,jdbcType=VARCHAR}, tel = #{tel,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} ================================================ FILE: src/main/resources/mybatis/app/DrugMapper.xml ================================================ id, name, quantity, price, invalid, quality_guarantee_period, lower_limit, supplier_id, specification delete from app_drug where id = #{id,jdbcType=VARCHAR} insert into app_drug (id, name, quantity, price, invalid, quality_guarantee_period, lower_limit, supplier_id, specification ) values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{quantity,jdbcType=INTEGER}, #{price,jdbcType=DECIMAL}, #{invalid,jdbcType=VARCHAR}, #{qualityGuaranteePeriod,jdbcType=INTEGER}, #{lowerLimit,jdbcType=INTEGER}, #{supplierId,jdbcType=VARCHAR}, #{specification,jdbcType=VARCHAR} ) insert into app_drug id, name, quantity, price, invalid, quality_guarantee_period, lower_limit, supplier_id, specification, #{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{quantity,jdbcType=INTEGER}, #{price,jdbcType=DECIMAL}, #{invalid,jdbcType=VARCHAR}, #{qualityGuaranteePeriod,jdbcType=INTEGER}, #{lowerLimit,jdbcType=INTEGER}, #{supplierId,jdbcType=VARCHAR}, #{specification,jdbcType=VARCHAR}, update app_drug set quantity = quantity + #{quantity,jdbcType=INTEGER} where id = #{drugId,jdbcType=VARCHAR} update app_drug name = #{name,jdbcType=VARCHAR}, quantity = #{quantity,jdbcType=INTEGER}, price = #{price,jdbcType=DECIMAL}, invalid = #{invalid,jdbcType=VARCHAR}, quality_guarantee_period = #{qualityGuaranteePeriod,jdbcType=INTEGER}, lower_limit = #{lowerLimit,jdbcType=INTEGER}, supplier_id = #{supplierId,jdbcType=VARCHAR}, specification = #{specification,jdbcType=VARCHAR}, where id = #{id,jdbcType=VARCHAR} update app_drug set name = #{name,jdbcType=VARCHAR}, quantity = #{quantity,jdbcType=INTEGER}, price = #{price,jdbcType=DECIMAL}, invalid = #{invalid,jdbcType=VARCHAR}, quality_guarantee_period = #{qualityGuaranteePeriod,jdbcType=INTEGER}, lower_limit = #{lowerLimit,jdbcType=INTEGER}, supplier_id = #{supplierId,jdbcType=VARCHAR}, specification = #{specification,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} ================================================ FILE: src/main/resources/mybatis/app/ExpireMapper.xml ================================================ id, drug_id, expired_date delete from app_expire where id = #{id,jdbcType=VARCHAR} select replace(uuid(),'-','') from dual insert into app_expire (id, drug_id, expired_date ) values (#{id,jdbcType=VARCHAR}, #{drugId,jdbcType=VARCHAR}, #{expiredDate,jdbcType=DATE} ) select replace(uuid(),'-','') from dual insert into app_expire id, drug_id, expired_date, #{id,jdbcType=VARCHAR}, #{drugId,jdbcType=VARCHAR}, #{expiredDate,jdbcType=DATE}, update app_expire drug_id = #{drugId,jdbcType=VARCHAR}, expired_date = #{expiredDate,jdbcType=DATE}, where id = #{id,jdbcType=VARCHAR} update app_expire set drug_id = #{drugId,jdbcType=VARCHAR}, expired_date = #{expiredDate,jdbcType=DATE} where id = #{id,jdbcType=VARCHAR} ================================================ FILE: src/main/resources/mybatis/app/InventoryMapper.xml ================================================ id, consumer_id, drug_id, type, quantity, ammount, comment, manager, gmt_created, gmt_modified delete from app_inventory_record where id = #{id,jdbcType=VARCHAR} select replace(uuid(),'-','') from dual insert into app_inventory_record (id, drug_id, type, quantity, ammount, comment, manager) values (#{id,jdbcType=VARCHAR}, #{drugId,jdbcType=VARCHAR}, '1', #{quantity,jdbcType=INTEGER}, #{ammount,jdbcType=INTEGER}, '进货入库', #{manager,jdbcType=VARCHAR}) select replace(uuid(),'-','') from dual insert into app_inventory_record (id, drug_id, type, quantity, ammount, comment, manager) values (#{id,jdbcType=VARCHAR}, #{drugId,jdbcType=VARCHAR}, '4', #{quantity,jdbcType=INTEGER}, #{ammount,jdbcType=INTEGER}, #{comment,jdbcType=VARCHAR}, #{manager,jdbcType=VARCHAR}) select replace(uuid(),'-','') from dual insert into app_inventory_record (id, drug_id, type, quantity, ammount, comment, manager, consumer_id) values (#{id,jdbcType=VARCHAR}, #{drugId,jdbcType=VARCHAR}, '3', #{quantity,jdbcType=INTEGER}, #{ammount,jdbcType=INTEGER}, #{comment,jdbcType=VARCHAR}, #{manager,jdbcType=VARCHAR}, #{consumer}) select replace(uuid(),'-','') from dual insert into app_inventory_record (id, consumer_id, drug_id, type, quantity, ammount, comment, manager, gmt_created, gmt_modified) values (#{id,jdbcType=VARCHAR}, #{consumerId,jdbcType=VARCHAR}, #{drugId,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, #{quantity,jdbcType=INTEGER}, #{ammount,jdbcType=DECIMAL}, #{comment,jdbcType=VARCHAR}, #{manager,jdbcType=VARCHAR}, #{gmtCreated,jdbcType=TIMESTAMP}, #{gmtModified,jdbcType=TIMESTAMP}) select replace(uuid(),'-','') from dual insert into app_inventory_record id, consumer_id, drug_id, type, quantity, ammount, comment, manager, gmt_created, gmt_modified, #{id,jdbcType=VARCHAR}, #{consumerId,jdbcType=VARCHAR}, #{drugId,jdbcType=VARCHAR}, #{type,jdbcType=VARCHAR}, #{quantity,jdbcType=INTEGER}, #{ammount,jdbcType=DECIMAL}, #{comment,jdbcType=VARCHAR}, #{manager,jdbcType=VARCHAR}, #{gmtCreated,jdbcType=TIMESTAMP}, #{gmtModified,jdbcType=TIMESTAMP}, update app_inventory_record consumer_id = #{consumerId,jdbcType=VARCHAR}, drug_id = #{drugId,jdbcType=VARCHAR}, type = #{type,jdbcType=VARCHAR}, quantity = #{quantity,jdbcType=INTEGER}, ammount = #{ammount,jdbcType=DECIMAL}, comment = #{comment,jdbcType=VARCHAR}, manager = #{manager,jdbcType=VARCHAR}, gmt_created = #{gmtCreated,jdbcType=TIMESTAMP}, gmt_modified = #{gmtModified,jdbcType=TIMESTAMP}, where id = #{id,jdbcType=VARCHAR} update app_inventory_record set consumer_id = #{consumerId,jdbcType=VARCHAR}, drug_id = #{drugId,jdbcType=VARCHAR}, type = #{type,jdbcType=VARCHAR}, quantity = #{quantity,jdbcType=INTEGER}, ammount = #{ammount,jdbcType=DECIMAL}, comment = #{comment,jdbcType=VARCHAR}, manager = #{manager,jdbcType=VARCHAR}, gmt_created = #{gmtCreated,jdbcType=TIMESTAMP}, gmt_modified = #{gmtModified,jdbcType=TIMESTAMP} where id = #{id,jdbcType=VARCHAR} ================================================ FILE: src/main/resources/mybatis/app/SupplierMapper.xml ================================================ id, name delete from app_supplier where id = #{id,jdbcType=VARCHAR} select replace(uuid(),'-','') from dual insert into app_supplier (id, name) values (#{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}) insert into app_supplier id, name, #{id,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, update app_supplier name = #{name,jdbcType=VARCHAR}, where id = #{id,jdbcType=VARCHAR} update app_supplier set name = #{name,jdbcType=VARCHAR} where id = #{id,jdbcType=VARCHAR} ================================================ FILE: src/main/resources/mybatis/blog/ContentMapper.xml ================================================ insert into blog_content ( `title`, `slug`, `created`, `modified`, `content`, `type`, `tags`, `categories`, `hits`, `comments_num`, `allow_comment`, `allow_ping`, `allow_feed`, `status`, `author`, `gtm_create`, `gtm_modified` ) values ( #{title}, #{slug}, #{created}, #{modified}, #{content}, #{type}, #{tags}, #{categories}, #{hits}, #{commentsNum}, #{allowComment}, #{allowPing}, #{allowFeed}, #{status}, #{author}, #{gtmCreate}, #{gtmModified} ) update blog_content `title` = #{title}, `slug` = #{slug}, `created` = #{created}, `modified` = #{modified}, `content` = #{content}, `type` = #{type}, `tags` = #{tags}, `categories` = #{categories}, `hits` = #{hits}, `comments_num` = #{commentsNum}, `allow_comment` = #{allowComment}, `allow_ping` = #{allowPing}, `allow_feed` = #{allowFeed}, `status` = #{status}, `author` = #{author}, `gtm_create` = #{gtmCreate}, `gtm_modified` = #{gtmModified} where cid = #{cid} delete from blog_content where cid = #{value} delete from blog_content where cid in #{cid} ================================================ FILE: src/main/resources/mybatis/common/DictMapper.xml ================================================ insert into sys_dict ( `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag` ) values ( #{name}, #{value}, #{type}, #{description}, #{sort}, #{parentId}, #{createBy}, #{createDate}, #{updateBy}, #{updateDate}, #{remarks}, #{delFlag} ) update sys_dict `name` = #{name}, `value` = #{value}, `type` = #{type}, `description` = #{description}, `sort` = #{sort}, `parent_id` = #{parentId}, `create_by` = #{createBy}, `create_date` = #{createDate}, `update_by` = #{updateBy}, `update_date` = #{updateDate}, `remarks` = #{remarks}, `del_flag` = #{delFlag} where id = #{id} delete from sys_dict where id = #{value} delete from sys_dict where id in #{id} ================================================ FILE: src/main/resources/mybatis/common/FileMapper.xml ================================================ insert into sys_file ( `type`, `url`, `create_date` ) values ( #{type}, #{url}, #{createDate} ) update sys_file `type` = #{type}, `url` = #{url}, `create_date` = #{createDate} where id = #{id} delete from sys_file where id = #{value} delete from sys_file where id in #{id} ================================================ FILE: src/main/resources/mybatis/common/LogMapper.xml ================================================ insert into sys_log ( `user_id`, `username`, `operation`, `time`, `method`, `params`, `ip`, `gmt_create` ) values ( #{userId}, #{username}, #{operation}, #{time}, #{method}, #{params}, #{ip}, #{gmtCreate} ) update sys_log `user_id` = #{userId}, `username` = #{username}, `operation` = #{operation}, `time` = #{time}, `method` = #{method}, `params` = #{params}, `ip` = #{ip}, `gmt_create` = #{gmtCreate} where id = #{id} delete from sys_log where id = #{value} delete from sys_log where id in #{id} ================================================ FILE: src/main/resources/mybatis/common/TaskMapper.xml ================================================ insert into sys_task ( `cron_expression`, `method_name`, `is_concurrent`, `description`, `update_by`, `bean_class`, `create_date`, `job_status`, `job_group`, `update_date`, `create_by`, `spring_bean`, `job_name` ) values ( #{cronExpression}, #{methodName}, #{isConcurrent}, #{description}, #{updateBy}, #{beanClass}, #{createDate}, #{jobStatus}, #{jobGroup}, #{updateDate}, #{createBy}, #{springBean}, #{jobName} ) update sys_task `cron_expression` = #{cronExpression}, `method_name` = #{methodName}, `is_concurrent` = #{isConcurrent}, `description` = #{description}, `update_by` = #{updateBy}, `bean_class` = #{beanClass}, `create_date` = #{createDate}, `job_status` = #{jobStatus}, `job_group` = #{jobGroup}, `update_date` = #{updateDate}, `create_by` = #{createBy}, `spring_bean` = #{springBean}, `job_name` = #{jobName} where id = #{id} delete from sys_task where id = #{value} delete from sys_task where id in #{id} ================================================ FILE: src/main/resources/mybatis/oa/NotifyMapper.xml ================================================ insert into oa_notify ( `type`, `title`, `content`, `files`, `status`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag` ) values ( #{type}, #{title}, #{content}, #{files}, #{status}, #{createBy}, #{createDate}, #{updateBy}, #{updateDate}, #{remarks}, #{delFlag} ) update oa_notify `type` = #{type}, `title` = #{title}, `content` = #{content}, `files` = #{files}, `status` = #{status}, `create_by` = #{createBy}, `create_date` = #{createDate}, `update_by` = #{updateBy}, `update_date` = #{updateDate}, `remarks` = #{remarks}, `del_flag` = #{delFlag} where id = #{id} delete from oa_notify where id = #{value} delete from oa_notify where id in #{id} ================================================ FILE: src/main/resources/mybatis/oa/NotifyRecordMapper.xml ================================================ insert into oa_notify_record ( `notify_id`, `user_id`, `is_read`, `read_date` ) values ( #{notifyId}, #{userId}, #{isRead}, #{readDate} ) update oa_notify_record `notify_id` = #{notifyId}, `user_id` = #{userId}, `is_read` = #{isRead}, `read_date` = #{readDate} where id = #{id} delete from oa_notify_record where id = #{value} delete from oa_notify_record where id in #{id} insert into oa_notify_record ( `notify_id`, `user_id`, `is_read`, `read_date` ) values ( #{item.notifyId}, #{item.userId}, #{item.isRead}, #{item.readDate} ) delete from oa_notify_record where notify_id = #{value} delete from oa_notify_record where notify_id in #{id} update oa_notify_record `is_read` = #{isRead}, `read_date` = #{readDate} where notify_id = #{notifyId} and user_id = #{userId} ================================================ FILE: src/main/resources/mybatis/system/DeptMapper.xml ================================================ insert into sys_dept ( `parent_id`, `name`, `order_num`, `del_flag` ) values ( #{parentId}, #{name}, #{orderNum}, #{delFlag} ) update sys_dept `parent_id` = #{parentId}, `name` = #{name}, `order_num` = #{orderNum}, `del_flag` = #{delFlag} where dept_id = #{deptId} delete from sys_dept where dept_id = #{value} delete from sys_dept where dept_id in #{deptId} ================================================ FILE: src/main/resources/mybatis/system/MenuMapper.xml ================================================ insert into sys_menu ( `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified` ) values ( #{parentId}, #{name}, #{url}, #{perms}, #{type}, #{icon}, #{orderNum}, #{gmtCreate}, #{gmtModified} ) update sys_menu `parent_id` = #{parentId}, `name` = #{name}, `url` = #{url}, `perms` = #{perms}, `type` = #{type}, `icon` = #{icon}, `order_num` = #{orderNum}, `gmt_create` = #{gmtCreate}, `gmt_modified` = #{gmtModified} where menu_id = #{menuId} delete from sys_menu where menu_id = #{value} delete from sys_menu where menu_id in #{menuId} ================================================ FILE: src/main/resources/mybatis/system/RoleMapper.xml ================================================ insert into sys_role ( `role_name`, `role_sign`, `remark`, `user_id_create`, `gmt_create`, `gmt_modified` ) values ( #{roleName}, #{roleSign}, #{remark}, #{userIdCreate}, #{gmtCreate}, #{gmtModified} ) update sys_role `role_name` = #{roleName}, `role_sign` = #{roleSign}, `remark` = #{remark}, `user_id_create` = #{userIdCreate}, `gmt_create` = #{gmtCreate}, `gmt_modified` = #{gmtModified} where role_id = #{roleId} delete from sys_role where role_id = #{value} delete from sys_role where role_id in #{roleId} ================================================ FILE: src/main/resources/mybatis/system/RoleMenuMapper.xml ================================================ insert into sys_role_menu ( `role_id`, `menu_id` ) values ( #{roleId}, #{menuId} ) update sys_role_menu `role_id` = #{roleId}, `menu_id` = #{menuId} where id = #{id} delete from sys_role_menu where id = #{value} delete from sys_role_menu where id in #{id} DELETE FROM sys_role_menu WHERE role_id=#{roleId} DELETE FROM sys_role_menu WHERE menu_id=#{menuId} INSERT INTO sys_role_menu(role_id, menu_id) values (#{item.roleId},#{item.menuId}) ================================================ FILE: src/main/resources/mybatis/system/UserMapper.xml ================================================ insert into sys_user ( `username`, `name`, `password`, `dept_id`, `email`, `mobile`, `status`, `user_id_create`, `gmt_create`, `gmt_modified`, `sex`, `birth`, `pic_id`, `live_address`, `hobby`, `province`, `city`, `district` ) values ( #{username}, #{name}, #{password}, #{deptId}, #{email}, #{mobile}, #{status}, #{userIdCreate}, #{gmtCreate}, #{gmtModified}, #{sex}, #{birth}, #{picId}, #{liveAddress}, #{hobby}, #{province}, #{city}, #{district} ) update sys_user `username` = #{username}, `name` = #{name}, `password` = #{password}, `dept_id` = #{deptId}, `email` = #{email}, `mobile` = #{mobile}, `status` = #{status}, `user_id_create` = #{userIdCreate}, `gmt_create` = #{gmtCreate}, `gmt_modified` = #{gmtModified}, `sex` = #{sex}, `birth` = #{birth}, `pic_id` = #{picId}, `live_address` = #{liveAddress}, `hobby` = #{hobby}, `province` = #{province}, `city` = #{city}, `district` = #{district} where user_id = #{userId} delete from sys_user where user_id = #{value} delete from sys_user where user_id in #{userId} ================================================ FILE: src/main/resources/mybatis/system/UserRoleMapper.xml ================================================ insert into sys_user_role ( `user_id`, `role_id` ) values ( #{userId}, #{roleId} ) update sys_user_role `user_id` = #{userId}, `role_id` = #{roleId} where id = #{id} delete from sys_user_role where id = #{value} delete from sys_user_role where id in #{id} delete from sys_user_role where user_id=#{userId} delete from sys_user_role where role_id=#{roleId} delete from sys_user_role where user_id in #{id} INSERT INTO sys_user_role(user_id, role_id) values (#{item.userId},#{item.roleId}) ================================================ FILE: src/main/resources/public/FontIcoList.html ================================================ Font Awesome Ico list
================================================ FILE: src/main/resources/public/chart/graph_echarts.html ================================================ 百度ECHarts

ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。 了解更多

ECharts官网:http://echarts.baidu.com/

================================================ FILE: src/main/resources/public/diagram-viewer/index.html ================================================ 
================================================ FILE: src/main/resources/public/diagram-viewer/js/ActivitiRest.js ================================================ var ActivitiRest = { options: {}, getProcessDefinitionByKey: function(processDefinitionKey, callback) { var url = Lang.sub(this.options.processDefinitionByKeyUrl, {processDefinitionKey: processDefinitionKey}); $.ajax({ url: url, dataType: 'jsonp', cache: false, async: true, success: function(data, textStatus) { var processDefinition = data; if (!processDefinition) { console.error("Process definition '" + processDefinitionKey + "' not found"); } else { callback.apply({processDefinitionId: processDefinition.id}); } } }).done(function(data, textStatus) { console.log("ajax done"); }).fail(function(jqXHR, textStatus, error){ console.error('Get diagram layout['+processDefinitionKey+'] failure: ', textStatus, 'error: ', error, jqXHR); }); }, getProcessDefinition: function(processDefinitionId, callback) { var url = Lang.sub(this.options.processDefinitionUrl, {processDefinitionId: processDefinitionId}); $.ajax({ url: url, dataType: 'jsonp', cache: false, async: true, success: function(data, textStatus) { var processDefinitionDiagramLayout = data; if (!processDefinitionDiagramLayout) { console.error("Process definition diagram layout '" + processDefinitionId + "' not found"); return; } else { callback.apply({processDefinitionDiagramLayout: processDefinitionDiagramLayout}); } } }).done(function(data, textStatus) { console.log("ajax done"); }).fail(function(jqXHR, textStatus, error){ console.log('Get diagram layout['+processDefinitionId+'] failure: ', textStatus, jqXHR); }); }, getHighLights: function(processInstanceId, callback) { var url = Lang.sub(this.options.processInstanceHighLightsUrl, {processInstanceId: processInstanceId}); $.ajax({ url: url, dataType: 'jsonp', cache: false, async: true, success: function(data, textStatus) { console.log("ajax returned data"); var highLights = data; if (!highLights) { console.log("highLights not found"); return; } else { callback.apply({highLights: highLights}); } } }).done(function(data, textStatus) { console.log("ajax done"); }).fail(function(jqXHR, textStatus, error){ console.log('Get HighLights['+processInstanceId+'] failure: ', textStatus, jqXHR); }); } }; ================================================ FILE: src/main/resources/public/diagram-viewer/js/ActivityImpl.js ================================================ /** * * @author 郑保乐 * @author 郑保乐 */ var ActivityImpl = function(activityJson){ this.outgoingTransitions = []; this.outgoingTransitions = []; this.incomingTransitions = []; this.activityBehavior = null; this.parent = null; this.isScope = false; this.isAsync = false; this.isExclusive = false; this.x = -1; this.y = -1; this.width = -1; this.height = -1; this.properties = {}; //console.log("activityJson: ", activityJson); if (activityJson != undefined) { this.setId(activityJson.activityId); for (var propertyName in activityJson.properties) { this.setProperty(propertyName, activityJson.properties[propertyName]); } //this.setProperty("name", activityJson.activityName); //this.setProperty("type", activityJson.activityType); this.setX(activityJson.x); this.setY(activityJson.y); this.setWidth(activityJson.width); this.setHeight(activityJson.height); if (activityJson.multiInstance) this.setProperty("multiInstance", activityJson.multiInstance); if (activityJson.collapsed) { this.setProperty("collapsed", activityJson.collapsed); } if (activityJson.isInterrupting != undefined) this.setProperty("isInterrupting", activityJson.isInterrupting); } }; ActivityImpl.prototype = { outgoingTransitions: [], outgoingTransitions: [], incomingTransitions: [], activityBehavior: null, parent: null, isScope: false, isAsync: false, isExclusive: false, id: null, properties: {}, // Graphical information x: -1, y: -1, width: -1, height: -1, setId: function(id){ this.id = id; }, getId: function(){ return this.id; }, setProperty: function(name, value){ this.properties[name] = value; }, getProperty: function(name){ return this.properties[name]; }, createOutgoingTransition: function(transitionId){ }, toString: function(id) { return "Activity("+id+")"; }, getParentActivity: function(){ /* if (parent instanceof ActivityImpl) { 79 return (ActivityImpl) parent; 80 } 81 return null; */ return this.parent; }, // restricted setters /////////////////////////////////////////////////////// setOutgoingTransitions: function(outgoingTransitions){ this.outgoingTransitions = outgoingTransitions; }, setParent: function(parent){ this.parent = parent; }, setIncomingTransitions: function(incomingTransitions){ this.incomingTransitions = incomingTransitions; }, // getters and setters ////////////////////////////////////////////////////// getOutgoingTransitions: function(){ return this.outgoingTransitions; }, getActivityBehavior: function(){ return this.activityBehavior; }, setActivityBehavior: function(activityBehavior){ this.activityBehavior = activityBehavior; }, getParent: function(){ return this.parent; }, getIncomingTransitions: function(){ return this.incomingTransitions; }, isScope: function(){ return this.isScope; }, setScope: function(isScope){ this.isScope = isScope; }, getX: function(){ return this.x; }, setX: function(x){ this.x = x; }, getY: function(){ return this.y; }, setY: function(y){ this.y = y; }, getWidth: function(){ return this.width; }, setWidth: function(width){ this.width = width; }, getHeight: function(){ return this.height; }, setHeight: function(height){ this.height = height; }, isAsync: function() { return this.isAsync; }, setAsync: function(isAsync) { this.isAsync = isAsync; }, isExclusive: function() { return this.isExclusive; }, setExclusive: function(isExclusive) { this.isExclusive = isExclusive; }, vvoid: function(){} }; ================================================ FILE: src/main/resources/public/diagram-viewer/js/Color.js ================================================ /** * Web color table * * @author 郑保乐 */ var Color = { /** * The color white. In the default sRGB space. */ white : Raphael.getRGB("rgb(255,255,255)"), /** * The color white. In the default sRGB space. */ WHITE : this.white, /** * The color light gray. In the default sRGB space. */ lightGray : Raphael.getRGB("rgb(192, 192, 192)"), /** * The color light gray. In the default sRGB space. */ LIGHT_GRAY : this.lightGray, /** * The color gray. In the default sRGB space. */ gray : Raphael.getRGB("rgb(128, 128, 128)"), /** * The color gray. In the default sRGB space. */ GRAY : this.gray, /** * The color dark gray. In the default sRGB space. */ darkGray : Raphael.getRGB("rgb(64, 64, 64)"), /** * The color dark gray. In the default sRGB space. */ DARK_GRAY : this.darkGray, /** * The color black. In the default sRGB space. */ black : Raphael.getRGB("rgb(0, 0, 0)"), /** * The color black. In the default sRGB space. */ BLACK : this.black, /** * The color red. In the default sRGB space. */ red : Raphael.getRGB("rgb(255, 0, 0)"), /** * The color red. In the default sRGB space. */ RED : this.red, /** * The color pink. In the default sRGB space. */ pink : Raphael.getRGB("rgb(255, 175, 175)"), /** * The color pink. In the default sRGB space. */ PINK : this.pink, /** * The color orange. In the default sRGB space. */ orange : Raphael.getRGB("rgb(255, 200, 0)"), /** * The color orange. In the default sRGB space. */ ORANGE : this.orange, /** * The color yellow. In the default sRGB space. */ yellow : Raphael.getRGB("rgb(255, 255, 0)"), /** * The color yellow. In the default sRGB space. */ YELLOW : this.yellow, /** * The color green. In the default sRGB space. */ green : Raphael.getRGB("rgb(0, 255, 0)"), /** * The color green. In the default sRGB space. */ GREEN : this.green, /** * The color magenta. In the default sRGB space. */ magenta : Raphael.getRGB("rgb(255, 0, 255)"), /** * The color magenta. In the default sRGB space. */ MAGENTA : this.magenta, /** * The color cyan. In the default sRGB space. */ cyan : Raphael.getRGB("rgb(0, 255, 255)"), /** * The color cyan. In the default sRGB space. */ CYAN : this.cyan, /** * The color blue. In the default sRGB space. */ blue : Raphael.getRGB("rgb(0, 0, 255)"), /** * The color blue. In the default sRGB space. */ BLUE : this.blue, /************************************************************************/ // http://www.stm.dp.ua/web-design/color-html.php Snow : Raphael.getRGB("#FFFAFA "), // 255 250 250 GhostWhite : Raphael.getRGB("#F8F8FF "), // 248 248 255 WhiteSmoke : Raphael.getRGB("#F5F5F5 "), // 245 245 245 Gainsboro : Raphael.getRGB("#DCDCDC "), // 220 220 220 FloralWhite : Raphael.getRGB("#FFFAF0 "), // 255 250 240 OldLace : Raphael.getRGB("#FDF5E6 "), // 253 245 230 Linen : Raphael.getRGB("#FAF0E6 "), // 250 240 230 AntiqueWhite : Raphael.getRGB("#FAEBD7 "), // 250 235 215 PapayaWhip : Raphael.getRGB("#FFEFD5 "), // 255 239 213 BlanchedAlmond : Raphael.getRGB("#FFEBCD "), // 255 235 205 Bisque : Raphael.getRGB("#FFE4C4 "), // 255 228 196 PeachPuff : Raphael.getRGB("#FFDAB9 "), // 255 218 185 NavajoWhite : Raphael.getRGB("#FFDEAD "), // 255 222 173 Moccasin : Raphael.getRGB("#FFE4B5 "), // 255 228 181 Cornsilk : Raphael.getRGB("#FFF8DC "), // 255 248 220 Ivory : Raphael.getRGB("#FFFFF0 "), // 255 255 240 LemonChiffon : Raphael.getRGB("#FFFACD "), // 255 250 205 Seashell : Raphael.getRGB("#FFF5EE "), // 255 245 238 Honeydew : Raphael.getRGB("#F0FFF0 "), // 240 255 240 MintCream : Raphael.getRGB("#F5FFFA "), // 245 255 250 Azure : Raphael.getRGB("#F0FFFF "), // 240 255 255 AliceBlue : Raphael.getRGB("#F0F8FF "), // 240 248 255 lavender : Raphael.getRGB("#E6E6FA "), // 230 230 250 LavenderBlush : Raphael.getRGB("#FFF0F5 "), // 255 240 245 MistyRose : Raphael.getRGB("#FFE4E1 "), // 255 228 225 White : Raphael.getRGB("#FFFFFF "), // 255 255 255 Black : Raphael.getRGB("#000000 "), // 0 0 0 DarkSlateGray : Raphael.getRGB("#2F4F4F "), // 47 79 79 DimGrey : Raphael.getRGB("#696969 "), // 105 105 105 SlateGrey : Raphael.getRGB("#708090 "), // 112 128 144 LightSlateGray : Raphael.getRGB("#778899 "), // 119 136 153 Grey : Raphael.getRGB("#BEBEBE "), // 190 190 190 LightGray : Raphael.getRGB("#D3D3D3 "), // 211 211 211 MidnightBlue : Raphael.getRGB("#191970 "), // 25 25 112 NavyBlue : Raphael.getRGB("#000080 "), // 0 0 128 CornflowerBlue : Raphael.getRGB("#6495ED "), // 100 149 237 DarkSlateBlue : Raphael.getRGB("#483D8B "), // 72 61 139 SlateBlue : Raphael.getRGB("#6A5ACD "), // 106 90 205 MediumSlateBlue : Raphael.getRGB("#7B68EE "), // 123 104 238 LightSlateBlue : Raphael.getRGB("#8470FF "), // 132 112 255 MediumBlue : Raphael.getRGB("#0000CD "), // 0 0 205 RoyalBlue : Raphael.getRGB("#4169E1 "), // 65 105 225 Blue : Raphael.getRGB("#0000FF "), // 0 0 255 DodgerBlue : Raphael.getRGB("#1E90FF "), // 30 144 255 DeepSkyBlue : Raphael.getRGB("#00BFFF "), // 0 191 255 SkyBlue : Raphael.getRGB("#87CEEB "), // 135 206 235 LightSkyBlue : Raphael.getRGB("#87CEFA "), // 135 206 250 SteelBlue : Raphael.getRGB("#4682B4 "), // 70 130 180 LightSteelBlue : Raphael.getRGB("#B0C4DE "), // 176 196 222 LightBlue : Raphael.getRGB("#ADD8E6 "), // 173 216 230 PowderBlue : Raphael.getRGB("#B0E0E6 "), // 176 224 230 PaleTurquoise : Raphael.getRGB("#AFEEEE "), // 175 238 238 DarkTurquoise : Raphael.getRGB("#00CED1 "), // 0 206 209 MediumTurquoise : Raphael.getRGB("#48D1CC "), // 72 209 204 Turquoise : Raphael.getRGB("#40E0D0 "), // 64 224 208 Cyan : Raphael.getRGB("#00FFFF "), // 0 255 255 LightCyan : Raphael.getRGB("#E0FFFF "), // 224 255 255 CadetBlue : Raphael.getRGB("#5F9EA0 "), // 95 158 160 MediumAquamarine: Raphael.getRGB("#66CDAA "), // 102 205 170 Aquamarine : Raphael.getRGB("#7FFFD4 "), // 127 255 212 DarkGreen : Raphael.getRGB("#006400 "), // 0 100 0 DarkOliveGreen : Raphael.getRGB("#556B2F "), // 85 107 47 DarkSeaGreen : Raphael.getRGB("#8FBC8F "), // 143 188 143 SeaGreen : Raphael.getRGB("#2E8B57 "), // 46 139 87 MediumSeaGreen : Raphael.getRGB("#3CB371 "), // 60 179 113 LightSeaGreen : Raphael.getRGB("#20B2AA "), // 32 178 170 PaleGreen : Raphael.getRGB("#98FB98 "), // 152 251 152 SpringGreen : Raphael.getRGB("#00FF7F "), // 0 255 127 LawnGreen : Raphael.getRGB("#7CFC00 "), // 124 252 0 Green : Raphael.getRGB("#00FF00 "), // 0 255 0 Chartreuse : Raphael.getRGB("#7FFF00 "), // 127 255 0 MedSpringGreen : Raphael.getRGB("#00FA9A "), // 0 250 154 GreenYellow : Raphael.getRGB("#ADFF2F "), // 173 255 47 LimeGreen : Raphael.getRGB("#32CD32 "), // 50 205 50 YellowGreen : Raphael.getRGB("#9ACD32 "), // 154 205 50 ForestGreen : Raphael.getRGB("#228B22 "), // 34 139 34 OliveDrab : Raphael.getRGB("#6B8E23 "), // 107 142 35 DarkKhaki : Raphael.getRGB("#BDB76B "), // 189 183 107 PaleGoldenrod : Raphael.getRGB("#EEE8AA "), // 238 232 170 LtGoldenrodYello: Raphael.getRGB("#FAFAD2 "), // 250 250 210 LightYellow : Raphael.getRGB("#FFFFE0 "), // 255 255 224 Yellow : Raphael.getRGB("#FFFF00 "), // 255 255 0 Gold : Raphael.getRGB("#FFD700 "), // 255 215 0 LightGoldenrod : Raphael.getRGB("#EEDD82 "), // 238 221 130 goldenrod : Raphael.getRGB("#DAA520 "), // 218 165 32 DarkGoldenrod : Raphael.getRGB("#B8860B "), // 184 134 11 RosyBrown : Raphael.getRGB("#BC8F8F "), // 188 143 143 IndianRed : Raphael.getRGB("#CD5C5C "), // 205 92 92 SaddleBrown : Raphael.getRGB("#8B4513 "), // 139 69 19 Sienna : Raphael.getRGB("#A0522D "), // 160 82 45 Peru : Raphael.getRGB("#CD853F "), // 205 133 63 Burlywood : Raphael.getRGB("#DEB887 "), // 222 184 135 Beige : Raphael.getRGB("#F5F5DC "), // 245 245 220 Wheat : Raphael.getRGB("#F5DEB3 "), // 245 222 179 SandyBrown : Raphael.getRGB("#F4A460 "), // 244 164 96 Tan : Raphael.getRGB("#D2B48C "), // 210 180 140 Chocolate : Raphael.getRGB("#D2691E "), // 210 105 30 Firebrick : Raphael.getRGB("#B22222 "), // 178 34 34 Brown : Raphael.getRGB("#A52A2A "), // 165 42 42 DarkSalmon : Raphael.getRGB("#E9967A "), // 233 150 122 Salmon : Raphael.getRGB("#FA8072 "), // 250 128 114 LightSalmon : Raphael.getRGB("#FFA07A "), // 255 160 122 Orange : Raphael.getRGB("#FFA500 "), // 255 165 0 DarkOrange : Raphael.getRGB("#FF8C00 "), // 255 140 0 Coral : Raphael.getRGB("#FF7F50 "), // 255 127 80 LightCoral : Raphael.getRGB("#F08080 "), // 240 128 128 Tomato : Raphael.getRGB("#FF6347 "), // 255 99 71 OrangeRed : Raphael.getRGB("#FF4500 "), // 255 69 0 Red : Raphael.getRGB("#FF0000 "), // 255 0 0 HotPink : Raphael.getRGB("#FF69B4 "), // 255 105 180 DeepPink : Raphael.getRGB("#FF1493 "), // 255 20 147 Pink : Raphael.getRGB("#FFC0CB "), // 255 192 203 LightPink : Raphael.getRGB("#FFB6C1 "), // 255 182 193 PaleVioletRed : Raphael.getRGB("#DB7093 "), // 219 112 147 Maroon : Raphael.getRGB("#B03060 "), // 176 48 96 MediumVioletRed : Raphael.getRGB("#C71585 "), // 199 21 133 VioletRed : Raphael.getRGB("#D02090 "), // 208 32 144 Magenta : Raphael.getRGB("#FF00FF "), // 255 0 255 Violet : Raphael.getRGB("#EE82EE "), // 238 130 238 Plum : Raphael.getRGB("#DDA0DD "), // 221 160 221 Orchid : Raphael.getRGB("#DA70D6 "), // 218 112 214 MediumOrchid : Raphael.getRGB("#BA55D3 "), // 186 85 211 DarkOrchid : Raphael.getRGB("#9932CC "), // 153 50 204 DarkViolet : Raphael.getRGB("#9400D3 "), // 148 0 211 BlueViolet : Raphael.getRGB("#8A2BE2 "), // 138 43 226 Purple : Raphael.getRGB("#A020F0 "), // 160 32 240 MediumPurple : Raphael.getRGB("#9370DB "), // 147 112 219 Thistle : Raphael.getRGB("#D8BFD8 "), // 216 191 216 Snow1 : Raphael.getRGB("#FFFAFA "), // 255 250 250 Snow2 : Raphael.getRGB("#EEE9E9 "), // 238 233 233 Snow3 : Raphael.getRGB("#CDC9C9 "), // 205 201 201 Snow4 : Raphael.getRGB("#8B8989 "), // 139 137 137 Seashell1 : Raphael.getRGB("#FFF5EE "), // 255 245 238 Seashell2 : Raphael.getRGB("#EEE5DE "), // 238 229 222 Seashell3 : Raphael.getRGB("#CDC5BF "), // 205 197 191 Seashell4 : Raphael.getRGB("#8B8682 "), // 139 134 130 AntiqueWhite1 : Raphael.getRGB("#FFEFDB "), // 255 239 219 AntiqueWhite2 : Raphael.getRGB("#EEDFCC "), // 238 223 204 AntiqueWhite3 : Raphael.getRGB("#CDC0B0 "), // 205 192 176 AntiqueWhite4 : Raphael.getRGB("#8B8378 "), // 139 131 120 Bisque1 : Raphael.getRGB("#FFE4C4 "), // 255 228 196 Bisque2 : Raphael.getRGB("#EED5B7 "), // 238 213 183 Bisque3 : Raphael.getRGB("#CDB79E "), // 205 183 158 Bisque4 : Raphael.getRGB("#8B7D6B "), // 139 125 107 PeachPuff1 : Raphael.getRGB("#FFDAB9 "), // 255 218 185 PeachPuff2 : Raphael.getRGB("#EECBAD "), // 238 203 173 PeachPuff3 : Raphael.getRGB("#CDAF95 "), // 205 175 149 PeachPuff4 : Raphael.getRGB("#8B7765 "), // 139 119 101 NavajoWhite1 : Raphael.getRGB("#FFDEAD "), // 255 222 173 NavajoWhite2 : Raphael.getRGB("#EECFA1 "), // 238 207 161 NavajoWhite3 : Raphael.getRGB("#CDB38B "), // 205 179 139 NavajoWhite4 : Raphael.getRGB("#8B795E "), // 139 121 94 LemonChiffon1 : Raphael.getRGB("#FFFACD "), // 255 250 205 LemonChiffon2 : Raphael.getRGB("#EEE9BF "), // 238 233 191 LemonChiffon3 : Raphael.getRGB("#CDC9A5 "), // 205 201 165 LemonChiffon4 : Raphael.getRGB("#8B8970 "), // 139 137 112 Cornsilk1 : Raphael.getRGB("#FFF8DC "), // 255 248 220 Cornsilk2 : Raphael.getRGB("#EEE8CD "), // 238 232 205 Cornsilk3 : Raphael.getRGB("#CDC8B1 "), // 205 200 177 Cornsilk4 : Raphael.getRGB("#8B8878 "), // 139 136 120 Ivory1 : Raphael.getRGB("#FFFFF0 "), // 255 255 240 Ivory2 : Raphael.getRGB("#EEEEE0 "), // 238 238 224 Ivory3 : Raphael.getRGB("#CDCDC1 "), // 205 205 193 Ivory4 : Raphael.getRGB("#8B8B83 "), // 139 139 131 Honeydew1 : Raphael.getRGB("#F0FFF0 "), // 240 255 240 Honeydew2 : Raphael.getRGB("#E0EEE0 "), // 224 238 224 Honeydew3 : Raphael.getRGB("#C1CDC1 "), // 193 205 193 Honeydew4 : Raphael.getRGB("#838B83 "), // 131 139 131 LavenderBlush1 : Raphael.getRGB("#FFF0F5 "), // 255 240 245 LavenderBlush2 : Raphael.getRGB("#EEE0E5 "), // 238 224 229 LavenderBlush3 : Raphael.getRGB("#CDC1C5 "), // 205 193 197 LavenderBlush4 : Raphael.getRGB("#8B8386 "), // 139 131 134 MistyRose1 : Raphael.getRGB("#FFE4E1 "), // 255 228 225 MistyRose2 : Raphael.getRGB("#EED5D2 "), // 238 213 210 MistyRose3 : Raphael.getRGB("#CDB7B5 "), // 205 183 181 MistyRose4 : Raphael.getRGB("#8B7D7B "), // 139 125 123 Azure1 : Raphael.getRGB("#F0FFFF "), // 240 255 255 Azure2 : Raphael.getRGB("#E0EEEE "), // 224 238 238 Azure3 : Raphael.getRGB("#C1CDCD "), // 193 205 205 Azure4 : Raphael.getRGB("#838B8B "), // 131 139 139 SlateBlue1 : Raphael.getRGB("#836FFF "), // 131 111 255 SlateBlue2 : Raphael.getRGB("#7A67EE "), // 122 103 238 SlateBlue3 : Raphael.getRGB("#6959CD "), // 105 89 205 SlateBlue4 : Raphael.getRGB("#473C8B "), // 71 60 139 RoyalBlue1 : Raphael.getRGB("#4876FF "), // 72 118 255 RoyalBlue2 : Raphael.getRGB("#436EEE "), // 67 110 238 RoyalBlue3 : Raphael.getRGB("#3A5FCD "), // 58 95 205 RoyalBlue4 : Raphael.getRGB("#27408B "), // 39 64 139 Blue1 : Raphael.getRGB("#0000FF "), // 0 0 255 Blue2 : Raphael.getRGB("#0000EE "), // 0 0 238 Blue3 : Raphael.getRGB("#0000CD "), // 0 0 205 Blue4 : Raphael.getRGB("#00008B "), // 0 0 139 DodgerBlue1 : Raphael.getRGB("#1E90FF "), // 30 144 255 DodgerBlue2 : Raphael.getRGB("#1C86EE "), // 28 134 238 DodgerBlue3 : Raphael.getRGB("#1874CD "), // 24 116 205 DodgerBlue4 : Raphael.getRGB("#104E8B "), // 16 78 139 SteelBlue1 : Raphael.getRGB("#63B8FF "), // 99 184 255 SteelBlue2 : Raphael.getRGB("#5CACEE "), // 92 172 238 SteelBlue3 : Raphael.getRGB("#4F94CD "), // 79 148 205 SteelBlue4 : Raphael.getRGB("#36648B "), // 54 100 139 DeepSkyBlue1 : Raphael.getRGB("#00BFFF "), // 0 191 255 DeepSkyBlue2 : Raphael.getRGB("#00B2EE "), // 0 178 238 DeepSkyBlue3 : Raphael.getRGB("#009ACD "), // 0 154 205 DeepSkyBlue4 : Raphael.getRGB("#00688B "), // 0 104 139 SkyBlue1 : Raphael.getRGB("#87CEFF "), // 135 206 255 SkyBlue2 : Raphael.getRGB("#7EC0EE "), // 126 192 238 SkyBlue3 : Raphael.getRGB("#6CA6CD "), // 108 166 205 SkyBlue4 : Raphael.getRGB("#4A708B "), // 74 112 139 LightSkyBlue1 : Raphael.getRGB("#B0E2FF "), // 176 226 255 LightSkyBlue2 : Raphael.getRGB("#A4D3EE "), // 164 211 238 LightSkyBlue3 : Raphael.getRGB("#8DB6CD "), // 141 182 205 LightSkyBlue4 : Raphael.getRGB("#607B8B "), // 96 123 139 SlateGray1 : Raphael.getRGB("#C6E2FF "), // 198 226 255 SlateGray2 : Raphael.getRGB("#B9D3EE "), // 185 211 238 SlateGray3 : Raphael.getRGB("#9FB6CD "), // 159 182 205 SlateGray4 : Raphael.getRGB("#6C7B8B "), // 108 123 139 LightSteelBlue1 : Raphael.getRGB("#CAE1FF "), // 202 225 255 LightSteelBlue2 : Raphael.getRGB("#BCD2EE "), // 188 210 238 LightSteelBlue3 : Raphael.getRGB("#A2B5CD "), // 162 181 205 LightSteelBlue4 : Raphael.getRGB("#6E7B8B "), // 110 123 139 LightBlue1 : Raphael.getRGB("#BFEFFF "), // 191 239 255 LightBlue2 : Raphael.getRGB("#B2DFEE "), // 178 223 238 LightBlue3 : Raphael.getRGB("#9AC0CD "), // 154 192 205 LightBlue4 : Raphael.getRGB("#68838B "), // 104 131 139 LightCyan1 : Raphael.getRGB("#E0FFFF "), // 224 255 255 LightCyan2 : Raphael.getRGB("#D1EEEE "), // 209 238 238 LightCyan3 : Raphael.getRGB("#B4CDCD "), // 180 205 205 LightCyan4 : Raphael.getRGB("#7A8B8B "), // 122 139 139 PaleTurquoise1 : Raphael.getRGB("#BBFFFF "), // 187 255 255 PaleTurquoise2 : Raphael.getRGB("#AEEEEE "), // 174 238 238 PaleTurquoise3 : Raphael.getRGB("#96CDCD "), // 150 205 205 PaleTurquoise4 : Raphael.getRGB("#668B8B "), // 102 139 139 CadetBlue1 : Raphael.getRGB("#98F5FF "), // 152 245 255 CadetBlue2 : Raphael.getRGB("#8EE5EE "), // 142 229 238 CadetBlue3 : Raphael.getRGB("#7AC5CD "), // 122 197 205 CadetBlue4 : Raphael.getRGB("#53868B "), // 83 134 139 Turquoise1 : Raphael.getRGB("#00F5FF "), // 0 245 255 Turquoise2 : Raphael.getRGB("#00E5EE "), // 0 229 238 Turquoise3 : Raphael.getRGB("#00C5CD "), // 0 197 205 Turquoise4 : Raphael.getRGB("#00868B "), // 0 134 139 Cyan1 : Raphael.getRGB("#00FFFF "), // 0 255 255 Cyan2 : Raphael.getRGB("#00EEEE "), // 0 238 238 Cyan3 : Raphael.getRGB("#00CDCD "), // 0 205 205 Cyan4 : Raphael.getRGB("#008B8B "), // 0 139 139 DarkSlateGray1 : Raphael.getRGB("#97FFFF "), // 151 255 255 DarkSlateGray2 : Raphael.getRGB("#8DEEEE "), // 141 238 238 DarkSlateGray3 : Raphael.getRGB("#79CDCD "), // 121 205 205 DarkSlateGray4 : Raphael.getRGB("#528B8B "), // 82 139 139 Aquamarine1 : Raphael.getRGB("#7FFFD4 "), // 127 255 212 Aquamarine2 : Raphael.getRGB("#76EEC6 "), // 118 238 198 Aquamarine3 : Raphael.getRGB("#66CDAA "), // 102 205 170 Aquamarine4 : Raphael.getRGB("#458B74 "), // 69 139 116 DarkSeaGreen1 : Raphael.getRGB("#C1FFC1 "), // 193 255 193 DarkSeaGreen2 : Raphael.getRGB("#B4EEB4 "), // 180 238 180 DarkSeaGreen3 : Raphael.getRGB("#9BCD9B "), // 155 205 155 DarkSeaGreen4 : Raphael.getRGB("#698B69 "), // 105 139 105 SeaGreen1 : Raphael.getRGB("#54FF9F "), // 84 255 159 SeaGreen2 : Raphael.getRGB("#4EEE94 "), // 78 238 148 SeaGreen3 : Raphael.getRGB("#43CD80 "), // 67 205 128 SeaGreen4 : Raphael.getRGB("#2E8B57 "), // 46 139 87 PaleGreen1 : Raphael.getRGB("#9AFF9A "), // 154 255 154 PaleGreen2 : Raphael.getRGB("#90EE90 "), // 144 238 144 PaleGreen3 : Raphael.getRGB("#7CCD7C "), // 124 205 124 PaleGreen4 : Raphael.getRGB("#548B54 "), // 84 139 84 SpringGreen1 : Raphael.getRGB("#00FF7F "), // 0 255 127 SpringGreen2 : Raphael.getRGB("#00EE76 "), // 0 238 118 SpringGreen3 : Raphael.getRGB("#00CD66 "), // 0 205 102 SpringGreen4 : Raphael.getRGB("#008B45 "), // 0 139 69 Green1 : Raphael.getRGB("#00FF00 "), // 0 255 0 Green2 : Raphael.getRGB("#00EE00 "), // 0 238 0 Green3 : Raphael.getRGB("#00CD00 "), // 0 205 0 Green4 : Raphael.getRGB("#008B00 "), // 0 139 0 Chartreuse1 : Raphael.getRGB("#7FFF00 "), // 127 255 0 Chartreuse2 : Raphael.getRGB("#76EE00 "), // 118 238 0 Chartreuse3 : Raphael.getRGB("#66CD00 "), // 102 205 0 Chartreuse4 : Raphael.getRGB("#458B00 "), // 69 139 0 OliveDrab1 : Raphael.getRGB("#C0FF3E "), // 192 255 62 OliveDrab2 : Raphael.getRGB("#B3EE3A "), // 179 238 58 OliveDrab3 : Raphael.getRGB("#9ACD32 "), // 154 205 50 OliveDrab4 : Raphael.getRGB("#698B22 "), // 105 139 34 DarkOliveGreen1 : Raphael.getRGB("#CAFF70 "), // 202 255 112 DarkOliveGreen2 : Raphael.getRGB("#BCEE68 "), // 188 238 104 DarkOliveGreen3 : Raphael.getRGB("#A2CD5A "), // 162 205 90 DarkOliveGreen4 : Raphael.getRGB("#6E8B3D "), // 110 139 61 Khaki1 : Raphael.getRGB("#FFF68F "), // 255 246 143 Khaki2 : Raphael.getRGB("#EEE685 "), // 238 230 133 Khaki3 : Raphael.getRGB("#CDC673 "), // 205 198 115 Khaki4 : Raphael.getRGB("#8B864E "), // 139 134 78 LightGoldenrod1 : Raphael.getRGB("#FFEC8B "), // 255 236 139 LightGoldenrod2 : Raphael.getRGB("#EEDC82 "), // 238 220 130 LightGoldenrod3 : Raphael.getRGB("#CDBE70 "), // 205 190 112 LightGoldenrod4 : Raphael.getRGB("#8B814C "), // 139 129 76 LightYellow1 : Raphael.getRGB("#FFFFE0 "), // 255 255 224 LightYellow2 : Raphael.getRGB("#EEEED1 "), // 238 238 209 LightYellow3 : Raphael.getRGB("#CDCDB4 "), // 205 205 180 LightYellow4 : Raphael.getRGB("#8B8B7A "), // 139 139 122 Yellow1 : Raphael.getRGB("#FFFF00 "), // 255 255 0 Yellow2 : Raphael.getRGB("#EEEE00 "), // 238 238 0 Yellow3 : Raphael.getRGB("#CDCD00 "), // 205 205 0 Yellow4 : Raphael.getRGB("#8B8B00 "), // 139 139 0 Gold1 : Raphael.getRGB("#FFD700 "), // 255 215 0 Gold2 : Raphael.getRGB("#EEC900 "), // 238 201 0 Gold3 : Raphael.getRGB("#CDAD00 "), // 205 173 0 Gold4 : Raphael.getRGB("#8B7500 "), // 139 117 0 Goldenrod1 : Raphael.getRGB("#FFC125 "), // 255 193 37 Goldenrod2 : Raphael.getRGB("#EEB422 "), // 238 180 34 Goldenrod3 : Raphael.getRGB("#CD9B1D "), // 205 155 29 Goldenrod4 : Raphael.getRGB("#8B6914 "), // 139 105 20 DarkGoldenrod1 : Raphael.getRGB("#FFB90F "), // 255 185 15 DarkGoldenrod2 : Raphael.getRGB("#EEAD0E "), // 238 173 14 DarkGoldenrod3 : Raphael.getRGB("#CD950C "), // 205 149 12 DarkGoldenrod4 : Raphael.getRGB("#8B658B "), // 139 101 8 RosyBrown1 : Raphael.getRGB("#FFC1C1 "), // 255 193 193 RosyBrown2 : Raphael.getRGB("#EEB4B4 "), // 238 180 180 RosyBrown3 : Raphael.getRGB("#CD9B9B "), // 205 155 155 RosyBrown4 : Raphael.getRGB("#8B6969 "), // 139 105 105 IndianRed1 : Raphael.getRGB("#FF6A6A "), // 255 106 106 IndianRed2 : Raphael.getRGB("#EE6363 "), // 238 99 99 IndianRed3 : Raphael.getRGB("#CD5555 "), // 205 85 85 IndianRed4 : Raphael.getRGB("#8B3A3A "), // 139 58 58 Sienna1 : Raphael.getRGB("#FF8247 "), // 255 130 71 Sienna2 : Raphael.getRGB("#EE7942 "), // 238 121 66 Sienna3 : Raphael.getRGB("#CD6839 "), // 205 104 57 Sienna4 : Raphael.getRGB("#8B4726 "), // 139 71 38 Burlywood1 : Raphael.getRGB("#FFD39B "), // 255 211 155 Burlywood2 : Raphael.getRGB("#EEC591 "), // 238 197 145 Burlywood3 : Raphael.getRGB("#CDAA7D "), // 205 170 125 Burlywood4 : Raphael.getRGB("#8B7355 "), // 139 115 85 Wheat1 : Raphael.getRGB("#FFE7BA "), // 255 231 186 Wheat2 : Raphael.getRGB("#EED8AE "), // 238 216 174 Wheat3 : Raphael.getRGB("#CDBA96 "), // 205 186 150 Wheat4 : Raphael.getRGB("#8B7E66 "), // 139 126 102 Tan1 : Raphael.getRGB("#FFA54F "), // 255 165 79 Tan2 : Raphael.getRGB("#EE9A49 "), // 238 154 73 Tan3 : Raphael.getRGB("#CD853F "), // 205 133 63 Tan4 : Raphael.getRGB("#8B5A2B "), // 139 90 43 Chocolate1 : Raphael.getRGB("#FF7F24 "), // 255 127 36 Chocolate2 : Raphael.getRGB("#EE7621 "), // 238 118 33 Chocolate3 : Raphael.getRGB("#CD661D "), // 205 102 29 Chocolate4 : Raphael.getRGB("#8B4513 "), // 139 69 19 Firebrick1 : Raphael.getRGB("#FF3030 "), // 255 48 48 Firebrick2 : Raphael.getRGB("#EE2C2C "), // 238 44 44 Firebrick3 : Raphael.getRGB("#CD2626 "), // 205 38 38 Firebrick4 : Raphael.getRGB("#8B1A1A "), // 139 26 26 Brown1 : Raphael.getRGB("#FF4040 "), // 255 64 64 Brown2 : Raphael.getRGB("#EE3B3B "), // 238 59 59 Brown3 : Raphael.getRGB("#CD3333 "), // 205 51 51 Brown4 : Raphael.getRGB("#8B2323 "), // 139 35 35 Salmon1 : Raphael.getRGB("#FF8C69 "), // 255 140 105 Salmon2 : Raphael.getRGB("#EE8262 "), // 238 130 98 Salmon3 : Raphael.getRGB("#CD7054 "), // 205 112 84 Salmon4 : Raphael.getRGB("#8B4C39 "), // 139 76 57 LightSalmon1 : Raphael.getRGB("#FFA07A "), // 255 160 122 LightSalmon2 : Raphael.getRGB("#EE9572 "), // 238 149 114 LightSalmon3 : Raphael.getRGB("#CD8162 "), // 205 129 98 LightSalmon4 : Raphael.getRGB("#8B5742 "), // 139 87 66 Orange1 : Raphael.getRGB("#FFA500 "), // 255 165 0 Orange2 : Raphael.getRGB("#EE9A00 "), // 238 154 0 Orange3 : Raphael.getRGB("#CD8500 "), // 205 133 0 Orange4 : Raphael.getRGB("#8B5A00 "), // 139 90 0 DarkOrange1 : Raphael.getRGB("#FF7F00 "), // 255 127 0 DarkOrange2 : Raphael.getRGB("#EE7600 "), // 238 118 0 DarkOrange3 : Raphael.getRGB("#CD6600 "), // 205 102 0 DarkOrange4 : Raphael.getRGB("#8B4500 "), // 139 69 0 Coral1 : Raphael.getRGB("#FF7256 "), // 255 114 86 Coral2 : Raphael.getRGB("#EE6A50 "), // 238 106 80 Coral3 : Raphael.getRGB("#CD5B45 "), // 205 91 69 Coral4 : Raphael.getRGB("#8B3E2F "), // 139 62 47 Tomato1 : Raphael.getRGB("#FF6347 "), // 255 99 71 Tomato2 : Raphael.getRGB("#EE5C42 "), // 238 92 66 Tomato3 : Raphael.getRGB("#CD4F39 "), // 205 79 57 Tomato4 : Raphael.getRGB("#8B3626 "), // 139 54 38 OrangeRed1 : Raphael.getRGB("#FF4500 "), // 255 69 0 OrangeRed2 : Raphael.getRGB("#EE4000 "), // 238 64 0 OrangeRed3 : Raphael.getRGB("#CD3700 "), // 205 55 0 OrangeRed4 : Raphael.getRGB("#8B2500 "), // 139 37 0 Red1 : Raphael.getRGB("#FF0000 "), // 255 0 0 Red2 : Raphael.getRGB("#EE0000 "), // 238 0 0 Red3 : Raphael.getRGB("#CD0000 "), // 205 0 0 Red4 : Raphael.getRGB("#8B0000 "), // 139 0 0 DeepPink1 : Raphael.getRGB("#FF1493 "), // 255 20 147 DeepPink2 : Raphael.getRGB("#EE1289 "), // 238 18 137 DeepPink3 : Raphael.getRGB("#CD1076 "), // 205 16 118 DeepPink4 : Raphael.getRGB("#8B0A50 "), // 139 10 80 HotPink1 : Raphael.getRGB("#FF6EB4 "), // 255 110 180 HotPink2 : Raphael.getRGB("#EE6AA7 "), // 238 106 167 HotPink3 : Raphael.getRGB("#CD6090 "), // 205 96 144 HotPink4 : Raphael.getRGB("#8B3A62 "), // 139 58 98 Pink1 : Raphael.getRGB("#FFB5C5 "), // 255 181 197 Pink2 : Raphael.getRGB("#EEA9B8 "), // 238 169 184 Pink3 : Raphael.getRGB("#CD919E "), // 205 145 158 Pink4 : Raphael.getRGB("#8B636C "), // 139 99 108 LightPink1 : Raphael.getRGB("#FFAEB9 "), // 255 174 185 LightPink2 : Raphael.getRGB("#EEA2AD "), // 238 162 173 LightPink3 : Raphael.getRGB("#CD8C95 "), // 205 140 149 LightPink4 : Raphael.getRGB("#8B5F65 "), // 139 95 101 PaleVioletRed1 : Raphael.getRGB("#FF82AB "), // 255 130 171 PaleVioletRed2 : Raphael.getRGB("#EE799F "), // 238 121 159 PaleVioletRed3 : Raphael.getRGB("#CD6889 "), // 205 104 137 PaleVioletRed4 : Raphael.getRGB("#8B475D "), // 139 71 93 Maroon1 : Raphael.getRGB("#FF34B3 "), // 255 52 179 Maroon2 : Raphael.getRGB("#EE30A7 "), // 238 48 167 Maroon3 : Raphael.getRGB("#CD2990 "), // 205 41 144 Maroon4 : Raphael.getRGB("#8B1C62 "), // 139 28 98 VioletRed1 : Raphael.getRGB("#FF3E96 "), // 255 62 150 VioletRed2 : Raphael.getRGB("#EE3A8C "), // 238 58 140 VioletRed3 : Raphael.getRGB("#CD3278 "), // 205 50 120 VioletRed4 : Raphael.getRGB("#8B2252 "), // 139 34 82 Magenta1 : Raphael.getRGB("#FF00FF "), // 255 0 255 Magenta2 : Raphael.getRGB("#EE00EE "), // 238 0 238 Magenta3 : Raphael.getRGB("#CD00CD "), // 205 0 205 Magenta4 : Raphael.getRGB("#8B008B "), // 139 0 139 Orchid1 : Raphael.getRGB("#FF83FA "), // 255 131 250 Orchid2 : Raphael.getRGB("#EE7AE9 "), // 238 122 233 Orchid3 : Raphael.getRGB("#CD69C9 "), // 205 105 201 Orchid4 : Raphael.getRGB("#8B4789 "), // 139 71 137 Plum1 : Raphael.getRGB("#FFBBFF "), // 255 187 255 Plum2 : Raphael.getRGB("#EEAEEE "), // 238 174 238 Plum3 : Raphael.getRGB("#CD96CD "), // 205 150 205 Plum4 : Raphael.getRGB("#8B668B "), // 139 102 139 MediumOrchid1 : Raphael.getRGB("#E066FF "), // 224 102 255 MediumOrchid2 : Raphael.getRGB("#D15FEE "), // 209 95 238 MediumOrchid3 : Raphael.getRGB("#B452CD "), // 180 82 205 MediumOrchid4 : Raphael.getRGB("#7A378B "), // 122 55 139 DarkOrchid1 : Raphael.getRGB("#BF3EFF "), // 191 62 255 DarkOrchid2 : Raphael.getRGB("#B23AEE "), // 178 58 238 DarkOrchid3 : Raphael.getRGB("#9A32CD "), // 154 50 205 DarkOrchid4 : Raphael.getRGB("#68228B "), // 104 34 139 Purple1 : Raphael.getRGB("#9B30FF "), // 155 48 255 Purple2 : Raphael.getRGB("#912CEE "), // 145 44 238 Purple3 : Raphael.getRGB("#7D26CD "), // 125 38 205 Purple4 : Raphael.getRGB("#551A8B "), // 85 26 139 MediumPurple1 : Raphael.getRGB("#AB82FF "), // 171 130 255 MediumPurple2 : Raphael.getRGB("#9F79EE "), // 159 121 238 MediumPurple3 : Raphael.getRGB("#8968CD "), // 137 104 205 MediumPurple4 : Raphael.getRGB("#5D478B "), // 93 71 139 Thistle1 : Raphael.getRGB("#FFE1FF "), // 255 225 255 Thistle2 : Raphael.getRGB("#EED2EE "), // 238 210 238 Thistle3 : Raphael.getRGB("#CDB5CD "), // 205 181 205 Thistle4 : Raphael.getRGB("#8B7B8B "), // 139 123 139 grey11 : Raphael.getRGB("#1C1C1C "), // 28 28 28 grey21 : Raphael.getRGB("#363636 "), // 54 54 54 grey31 : Raphael.getRGB("#4F4F4F "), // 79 79 79 grey41 : Raphael.getRGB("#696969 "), // 105 105 105 grey51 : Raphael.getRGB("#828282 "), // 130 130 130 grey61 : Raphael.getRGB("#9C9C9C "), // 156 156 156 grey71 : Raphael.getRGB("#B5B5B5 "), // 181 181 181 gray81 : Raphael.getRGB("#CFCFCF "), // 207 207 207 gray91 : Raphael.getRGB("#E8E8E8 "), // 232 232 232 DarkGrey : Raphael.getRGB("#A9A9A9 "), // 169 169 169 DarkBlue : Raphael.getRGB("#00008B "), // 0 0 139 DarkCyan : Raphael.getRGB("#008B8B "), // 0 139 139 DarkMagenta : Raphael.getRGB("#8B008B "), // 139 0 139 DarkRed : Raphael.getRGB("#8B0000 "), // 139 0 0 LightGreen : Raphael.getRGB("#90EE90 "), // 144 238 144 get: function(R, G, B){ return Raphael.getRGB("rgb(" + R + ", " + G + ", " + B + ")"); } }; ================================================ FILE: src/main/resources/public/diagram-viewer/js/LineBreakMeasurer.js ================================================ /** * Word wrapping * * @author 郑保乐 */ var AttributedStringIterator = function(text){ //this.text = this.rtrim(this.ltrim(text)); text = text.replace(/(\s)+/, " "); this.text = this.rtrim(text); /* if (beginIndex < 0 || beginIndex > endIndex || endIndex > length()) { throw new IllegalArgumentException("Invalid substring range"); } */ this.beginIndex = 0; this.endIndex = this.text.length; this.currentIndex = this.beginIndex; //console.group("[AttributedStringIterator]"); var i = 0; var string = this.text; var fullPos = 0; //console.log("string: \"" + string + "\", length: " + string.length); this.startWordOffsets = []; this.startWordOffsets.push(fullPos); // TODO: remove i 1000 while (i<1000) { var pos = string.search(/[ \t\n\f-\.\,]/); if (pos == -1) break; // whitespace start fullPos += pos; string = string.substr(pos); ////console.log("fullPos: " + fullPos + ", pos: " + pos + ", string: ", string); // remove whitespaces var pos = string.search(/[^ \t\n\f-\.\,]/); if (pos == -1) break; // whitespace end fullPos += pos; string = string.substr(pos); ////console.log("fullPos: " + fullPos); this.startWordOffsets.push(fullPos); i++; } //console.log("startWordOffsets: ", this.startWordOffsets); //console.groupEnd(); }; AttributedStringIterator.prototype = { getEndIndex: function(pos){ if (typeof(pos) == "undefined") return this.endIndex; var string = this.text.substr(pos, this.endIndex - pos); var posEndOfLine = string.search(/[\n]/); if (posEndOfLine == -1) return this.endIndex; else return pos + posEndOfLine; }, getBeginIndex: function(){ return this.beginIndex; }, isWhitespace: function(pos){ var str = this.text[pos]; var whitespaceChars = " \t\n\f"; return (whitespaceChars.indexOf(str) != -1); }, isNewLine: function(pos){ var str = this.text[pos]; var whitespaceChars = "\n"; return (whitespaceChars.indexOf(str) != -1); }, preceding: function(pos){ //console.group("[AttributedStringIterator.preceding]"); for(var i in this.startWordOffsets) { var startWordOffset = this.startWordOffsets[i]; if (pos < startWordOffset && i>0) { //console.log("startWordOffset: " + this.startWordOffsets[i-1]); //console.groupEnd(); return this.startWordOffsets[i-1]; } } //console.log("pos: " + pos); //console.groupEnd(); return this.startWordOffsets[i]; }, following: function(pos){ //console.group("[AttributedStringIterator.following]"); for(var i in this.startWordOffsets) { var startWordOffset = this.startWordOffsets[i]; if (pos < startWordOffset && i>0) { //console.log("startWordOffset: " + this.startWordOffsets[i]); //console.groupEnd(); return this.startWordOffsets[i]; } } //console.log("pos: " + pos); //console.groupEnd(); return this.startWordOffsets[i]; }, ltrim: function(str){ var patt2=/^\s+/g; return str.replace(patt2, ""); }, rtrim: function(str){ var patt2=/\s+$/g; return str.replace(patt2, ""); }, getLayout: function(start, limit){ return this.text.substr(start, limit - start); }, getCharAtPos: function(pos) { return this.text[pos]; } }; var LineBreakMeasurer = function(paper, x, y, text, fontAttrs){ this.paper = paper; this.text = new AttributedStringIterator(text); this.fontAttrs = fontAttrs; if (this.text.getEndIndex() - this.text.getBeginIndex() < 1) { throw {message: "Text must contain at least one character.", code: "IllegalArgumentException"}; } //this.measurer = new TextMeasurer(paper, this.text, this.fontAttrs); this.limit = this.text.getEndIndex(); this.pos = this.start = this.text.getBeginIndex(); this.rafaelTextObject = this.paper.text(x, y, this.text.text).attr(fontAttrs).attr("text-anchor", "start"); this.svgTextObject = this.rafaelTextObject[0]; }; LineBreakMeasurer.prototype = { nextOffset: function(wrappingWidth, offsetLimit, requireNextWord) { //console.group("[nextOffset]"); var nextOffset = this.pos; if (this.pos < this.limit) { if (offsetLimit <= this.pos) { throw {message: "offsetLimit must be after current position", code: "IllegalArgumentException"}; } var charAtMaxAdvance = this.getLineBreakIndex(this.pos, wrappingWidth); //charAtMaxAdvance --; //console.log("charAtMaxAdvance:", charAtMaxAdvance, ", [" + this.text.getCharAtPos(charAtMaxAdvance) + "]"); if (charAtMaxAdvance == this.limit) { nextOffset = this.limit; //console.log("charAtMaxAdvance == this.limit"); } else if (this.text.isNewLine(charAtMaxAdvance)) { //console.log("isNewLine"); nextOffset = charAtMaxAdvance+1; } else if (this.text.isWhitespace(charAtMaxAdvance)) { // TODO: find next noSpaceChar //return nextOffset; nextOffset = this.text.following(charAtMaxAdvance); } else { // Break is in a word; back up to previous break. /* var testPos = charAtMaxAdvance + 1; if (testPos == this.limit) { console.error("hbz..."); } else { nextOffset = this.text.preceding(charAtMaxAdvance); } */ nextOffset = this.text.preceding(charAtMaxAdvance); if (nextOffset <= this.pos) { nextOffset = Math.max(this.pos+1, charAtMaxAdvance); } } } if (nextOffset > offsetLimit) { nextOffset = offsetLimit; } //console.log("nextOffset: " + nextOffset); //console.groupEnd(); return nextOffset; }, nextLayout: function(wrappingWidth) { //console.groupCollapsed("[nextLayout]"); if (this.pos < this.limit) { var requireNextWord = false; var layoutLimit = this.nextOffset(wrappingWidth, this.limit, requireNextWord); //console.log("layoutLimit:", layoutLimit); if (layoutLimit == this.pos) { //console.groupEnd(); return null; } var result = this.text.getLayout(this.pos, layoutLimit); //console.log("layout: \"" + result + "\""); // remove end of line //var posEndOfLine = this.text.getEndIndex(this.pos); //if (posEndOfLine < result.length) // result = result.substr(0, posEndOfLine); this.pos = layoutLimit; //console.groupEnd(); return result; } else { //console.groupEnd(); return null; } }, getLineBreakIndex: function(pos, wrappingWidth) { //console.group("[getLineBreakIndex]"); //console.log("pos:"+pos + ", text: \""+ this.text.text.replace(/\n/g, "_").substr(pos, 1) + "\""); var bb = this.rafaelTextObject.getBBox(); var charNum = -1; try { var svgPoint = this.svgTextObject.getStartPositionOfChar(pos); //var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.blue}); svgPoint.x = svgPoint.x + wrappingWidth; //svgPoint.y = bb.y; //console.log("svgPoint:", svgPoint); //var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.red}); charNum = this.svgTextObject.getCharNumAtPosition(svgPoint); } catch (e){ console.warn("getStartPositionOfChar error, pos:" + pos); /* var testPos = pos + 1; if (testPos < this.limit) { return testPos } */ } //console.log("charNum:", charNum); if (charNum == -1) { //console.groupEnd(); return this.text.getEndIndex(pos); } else { // When case there is new line between pos and charnum then use this new line var newLineIndex = this.text.getEndIndex(pos); if (newLineIndex < charNum ) { console.log("newLineIndex <= charNum, newLineIndex:"+newLineIndex+", charNum:"+charNum, "\"" + this.text.text.substr(newLineIndex+1).replace(/\n/g, "?") + "\""); //console.groupEnd(); return newLineIndex; } //var charAtMaxAdvance = this.text.text.substring(charNum, charNum + 1); var charAtMaxAdvance = this.text.getCharAtPos(charNum); //console.log("!!charAtMaxAdvance: " + charAtMaxAdvance); //console.groupEnd(); return charNum; } }, getPosition: function() { return this.pos; } }; ================================================ FILE: src/main/resources/public/diagram-viewer/js/Polyline.js ================================================ /** * Class to generate polyline * * @author 郑保乐 */ var ANCHOR_TYPE= { main: "main", middle: "middle", first: "first", last: "last" }; function Anchor(uuid, type, x, y) { this.uuid = uuid; this.x = x this.y = y this.type = (type == ANCHOR_TYPE.middle) ? ANCHOR_TYPE.middle : ANCHOR_TYPE.main; }; Anchor.prototype = { uuid: null, x: 0, y: 0, type: ANCHOR_TYPE.main, isFirst: false, isLast: false, ndex: 0, typeIndex: 0 }; function Polyline(uuid, points, strokeWidth) { /* Array on coordinates: * points: [{x: 410, y: 110}, 1 * {x: 570, y: 110}, 1 2 * {x: 620, y: 240}, 2 3 * {x: 750, y: 270}, 3 4 * {x: 650, y: 370}]; 4 */ this.points = points; /* * path for graph * [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]] */ this.path = []; this.anchors = []; if (strokeWidth) this.strokeWidth = strokeWidth; this.closePath = false; this.init(); }; Polyline.prototype = { id: null, points: [], path: [], anchors: [], strokeWidth: 1, radius: 15, showDetails: false, element: null, isDefaultConditionAvailable: false, closePath: false, init: function(points){ var linesCount = this.getLinesCount(); if (linesCount < 1) return; this.normalizeCoordinates(); // create anchors this.pushAnchor(ANCHOR_TYPE.first, this.getLine(0).x1, this.getLine(0).y1); for(var i = 1; i < linesCount; i++){ var line1 = this.getLine(i-1), line2 = this.getLine(i); //this.pushAnchor(ANCHOR_TYPE.middle, line1.x1 + line1.x2-line1.x1, line1.y1 + line1.y2-line1.y1); this.pushAnchor(ANCHOR_TYPE.main, line1.x2, line1.y2); //this.pushAnchor(ANCHOR_TYPE.middle, line2.x1 + line2.x2-line2.x1, line2.y1 + line2.y2-line2.y1); } this.pushAnchor(ANCHOR_TYPE.last, this.getLine(linesCount-1).x2, this.getLine(linesCount-1).y2); this.rebuildPath(); }, normalizeCoordinates: function(){ for(var i=0; i < this.points.length; i++){ this.points[i].x = parseFloat(this.points[i].x); this.points[i].y = parseFloat(this.points[i].y); } }, getLinesCount: function(){ return this.points.length-1; }, _getLine: function(i){ return {x1: this.points[i].x, y1: this.points[i].y, x2: this.points[i+1].x, y2: this.points[i+1].y}; }, getLine: function(i){ var line = this._getLine(i); line.angle = this.getLineAngle(i) ; return line; }, getLineAngle: function(i){ var line = this._getLine(i); return Math.atan2(line.y2 - line.y1, line.x2 - line.x1); }, getLineLengthX: function(i){ var line = this.getLine(i); return (line.x2 - line.x1); }, getLineLengthY: function(i){ var line = this.getLine(i); return (line.y2 - line.y1); }, getLineLength: function(i){ var line = this.getLine(i); return Math.sqrt(Math.pow(this.getLineLengthX(i), 2) + Math.pow(this.getLineLengthY(i), 2)); }, getAnchors: function(){ // ������� ��������������� ������ // ???? return this.anchors; }, getAnchorsCount: function(type){ if (!type) return this.anchors.length; else { var count = 0; for(var i=0; i < this.getAnchorsCount(); i++){ var anchor = this.anchors[i]; if (anchor.getType() == type) { count++; } } return count; } }, pushAnchor: function(type, x, y, index){ if (type == ANCHOR_TYPE.first) { index = 0; typeIndex = 0; } else if (type == ANCHOR_TYPE.last) { index = this.getAnchorsCount(); typeIndex = 0; } else if (!index) { index = this.anchors.length; } else { // ��������� anchors, �������� ������� ��� �������, ������� � index //var anchor = this.getAnchor() for(var i=0; i < this.getAnchorsCount(); i++){ var anchor = this.anchors[i]; if (anchor.index > index) { anchor.index++; anchor.typeIndex++; } } } var anchor = new Anchor(this.id, ANCHOR_TYPE.main, x, y, index, typeIndex); this.anchors.push(anchor); }, getAnchor: function(position){ return this.anchors[position]; }, getAnchorByType: function(type, position){ if (type == ANCHOR_TYPE.first) return this.anchors[0]; if (type == ANCHOR_TYPE.last) return this.anchors[this.getAnchorsCount()-1]; for(var i=0; i < this.getAnchorsCount(); i++){ var anchor = this.anchors[i]; if (anchor.type == type) { if( position == anchor.position) return anchor; } } return null; }, addNewPoint: function(position, x, y){ // for(var i = 0; i < this.getLinesCount(); i++){ var line = this.getLine(i); if (x > line.x1 && x < line.x2 && y > line.y1 && y < line.y2) { this.points.splice(i+1,0,{x: x, y: y}); break; } } this.rebuildPath(); }, rebuildPath: function(){ var path = []; for(var i = 0; i < this.getAnchorsCount(); i++){ var anchor = this.getAnchor(i); var pathType = "" if (i==0) pathType = "M"; else pathType = "L"; // TODO: save previous points and calculate new path just if points are updated, and then save currents values as previous var targetX = anchor.x, targetY = anchor.y; if (i>0 && i < this.getAnchorsCount()-1) { // get new x,y var cx = anchor.x, cy = anchor.y; // pivot point of prev line var AO = this.getLineLength(i-1); if (AO < this.radius) { AO = this.radius; } this.isDefaultConditionAvailable = (this.isDefaultConditionAvailable || (i == 1 && AO > 10)); //console.log("isDefaultConditionAvailable", this.isDefaultConditionAvailable); var ED = this.getLineLengthY(i-1) * this.radius / AO; var OD = this.getLineLengthX(i-1) * this.radius / AO; targetX = anchor.x - OD; targetY = anchor.y - ED; if (AO < 2*this.radius && i>1) { targetX = anchor.x - this.getLineLengthX(i-1)/2; targetY = anchor.y - this.getLineLengthY(i-1)/2;; } // pivot point of next line var AO = this.getLineLength(i); if (AO < this.radius) { AO = this.radius; } var ED = this.getLineLengthY(i) * this.radius / AO; var OD = this.getLineLengthX(i) * this.radius / AO; var nextSrcX = anchor.x + OD; var nextSrcY = anchor.y + ED; if (AO < 2*this.radius && i 10)); //console.log("-- isDefaultConditionAvailable", this.isDefaultConditionAvailable); } // anti smoothing if (this.strokeWidth%2 == 1) { targetX += 0.5; targetY += 0.5; } path.push([pathType, targetX, targetY]); if (i>0 && i < this.getAnchorsCount()-1) { path.push(["C", ax, ay, bx, by, zx, zy]); } } if (this.closePath) { console.log("closePath:", this.closePath); path.push(["Z"]); } this.path = path; }, transform: function(transformation){ this.element.transform(transformation); }, attr: function(attrs){ //console.log("attrs: " +attrs, "", this.element); // TODO: foreach and set each this.element.attr(attrs); } }; function Polygone(points, strokeWidth) { /* Array on coordinates: * points: [{x: 410, y: 110}, 1 * {x: 570, y: 110}, 1 2 * {x: 620, y: 240}, 2 3 * {x: 750, y: 270}, 3 4 * {x: 650, y: 370}]; 4 */ this.points = points; /* * path for graph * [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]] */ this.path = []; this.anchors = []; if (strokeWidth) this.strokeWidth = strokeWidth; this.closePath = true; this.init(); }; /* * Poligone is inherited from Poliline: draws closedPath of polyline */ var Foo = function () { }; Foo.prototype = Polyline.prototype; Polygone.prototype = new Foo(); Polygone.prototype.rebuildPath = function(){ var path = []; //console.log("Polygone rebuildPath"); for(var i = 0; i < this.getAnchorsCount(); i++){ var anchor = this.getAnchor(i); var pathType = "" if (i==0) pathType = "M"; else pathType = "L"; var targetX = anchor.x, targetY = anchor.y; // anti smoothing if (this.strokeWidth%2 == 1) { targetX += 0.5; targetY += 0.5; } path.push([pathType, targetX, targetY]); } if (this.closePath) path.push(["Z"]); this.path = path; }; /* Polygone.prototype.transform = function(transformation){ this.element.transform(transformation); }; */ ================================================ FILE: src/main/resources/public/diagram-viewer/js/ProcessDiagramCanvas.js ================================================ /** * Represents a canvas on which BPMN 2.0 constructs can be drawn. * * Some of the icons used are licenced under a Creative Commons Attribution 2.5 * License, see http://www.famfamfam.com/lab/icons/silk/ * * @see ProcessDiagramGenerator * @author 郑保乐 * @author 郑保乐 */ //Color.Cornsilk var ARROW_HEAD_SIMPLE = "simple"; var ARROW_HEAD_EMPTY = "empty"; var ARROW_HEAD_FILL = "FILL"; var MULTILINE_VERTICAL_ALIGN_TOP = "top"; var MULTILINE_VERTICAL_ALIGN_MIDDLE = "middle"; var MULTILINE_VERTICAL_ALIGN_BOTTOM = "bottom"; var MULTILINE_HORIZONTAL_ALIGN_LEFT = "start"; var MULTILINE_HORIZONTAL_ALIGN_MIDDLE = "middle"; var MULTILINE_HORIZONTAL_ALIGN_RIGHT = "end"; // Predefined sized var TEXT_PADDING = 3; var ARROW_WIDTH = 4; var CONDITIONAL_INDICATOR_WIDTH = 16; var MARKER_WIDTH = 12; var ANNOTATION_TEXT_PADDING = 7; // Colors var TASK_COLOR = Color.OldLace; // original: Color.get(255, 255, 204); var TASK_STROKE_COLOR = Color.black; /*Color.SlateGrey; */ //var EXPANDED_SUBPROCESS_ATTRS = Color.black; /*Color.SlateGrey; */ var BOUNDARY_EVENT_COLOR = Color.white; var CONDITIONAL_INDICATOR_COLOR = Color.get(255, 255, 255); var HIGHLIGHT_COLOR = Color.Firebrick1; //var SEQUENCEFLOW_COLOR = Color.DimGrey; var SEQUENCEFLOW_COLOR = Color.black; var CATCHING_EVENT_COLOR = Color.black; /* Color.SlateGrey; */ var START_EVENT_COLOR = Color.get(251,251,251); var START_EVENT_STROKE_COLOR = Color.black; /* Color.SlateGrey; */ var END_EVENT_COLOR = Color.get(251,251,251); //var END_EVENT_STROKE_COLOR = Color.black; var NONE_END_EVENT_COLOR = Color.Firebrick4; var NONE_END_EVENT_STROKE_COLOR = Color.Firebrick4; var ERROR_END_EVENT_COLOR = Color.Firebrick; var ERROR_END_EVENT_STROKE_COLOR = Color.Firebrick; //var LABEL_COLOR = Color.get(112, 146, 190); var LABEL_COLOR = Color.get(72, 106, 150); // Fonts var NORMAL_FONT = {font: "10px Arial", opacity: 1, fill: Color.black}; var LABEL_FONT = {font: "11px Arial", "font-style":"italic", opacity: 1, "fill": LABEL_COLOR}; var LABEL_FONT_SMOOTH = {font: "10px Arial", "font-style":"italic", opacity: 1, "fill": LABEL_COLOR, stroke: LABEL_COLOR, "stroke-width":.4}; var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; var TASK_FONT_SMOOTH = {font: "11px Arial", opacity: 1, fill: Color.black, stroke: LABEL_COLOR, "stroke-width":.4}; var POOL_LANE_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; var EXPANDED_SUBPROCESS_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; // Strokes var NORMAL_STROKE = 1; var SEQUENCEFLOW_STROKE = 1.5; var SEQUENCEFLOW_HIGHLIGHT_STROKE = 2; var THICK_TASK_BORDER_STROKE = 2.5; var GATEWAY_TYPE_STROKE = 3.2; var END_EVENT_STROKE = NORMAL_STROKE+2; var MULTI_INSTANCE_STROKE = 1.3; var EVENT_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "stroke-dasharray": ". "}; //var EXPANDED_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "fill": Color.FloralWhite}; var EXPANDED_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "fill": Color.WhiteSmoke}; var NON_INTERRUPTING_EVENT_STROKE = "- "; var TASK_CORNER_ROUND = 10; var EXPANDED_SUBPROCESS_CORNER_ROUND = 10; // icons var ICON_SIZE = 16; var ICON_PADDING = 4; var USERTASK_IMAGE = "images/deployer/user.png"; var SCRIPTTASK_IMAGE = "images/deployer/script.png"; var SERVICETASK_IMAGE = "images/deployer/service.png"; var RECEIVETASK_IMAGE = "images/deployer/receive.png"; var SENDTASK_IMAGE = "images/deployer/send.png"; var MANUALTASK_IMAGE = "images/deployer/manual.png"; var BUSINESS_RULE_TASK_IMAGE = "images/deployer/business_rule.png"; var TIMER_IMAGE = "images/deployer/timer.png"; var MESSAGE_CATCH_IMAGE = "images/deployer/message_catch.png"; var MESSAGE_THROW_IMAGE = "images/deployer/message_throw.png"; var ERROR_THROW_IMAGE = "images/deployer/error_throw.png"; var ERROR_CATCH_IMAGE = "images/deployer/error_catch.png"; var SIGNAL_CATCH_IMAGE = "images/deployer/signal_catch.png"; var SIGNAL_THROW_IMAGE = "images/deployer/signal_throw.png"; var MULTIPLE_CATCH_IMAGE = "images/deployer/multiple_catch.png"; var ObjectType = { ELLIPSE: "ellipse", FLOW: "flow", RECT: "rect", RHOMBUS: "rhombus" }; function OBJ(type){ this.c = null; this.type = type; this.nestedElements = []; }; OBJ.prototype = { }; var CONNECTION_TYPE = { SEQUENCE_FLOW: "sequence_flow", MESSAGE_FLOW: "message_flow", ASSOCIATION: "association" }; var ProcessDiagramCanvas = function(){ }; ProcessDiagramCanvas.prototype = { // var DefaultProcessDiagramCanvas = { canvasHolder: "holder", canvasWidth: 0, canvasHeight: 0, paint: Color.black, strokeWidth: 0, font: null, fontSmoothing: null, g: null, ninjaPaper: null, objects: [], processDefinitionId: null, activity: null, frame: null, debug: false, /** * Creates an empty canvas with given width and height. */ init: function(width, height, processDefinitionId){ this.canvasWidth = width; this.canvasHeight = height; // TODO: name it as 'canvasName' if (!processDefinitionId) processDefinitionId = "holder"; this.processDefinitionId = processDefinitionId; this.canvasHolder = this.processDefinitionId; var h = document.getElementById(this.canvasHolder); if (!h) return; h.style.width = this.canvasWidth; h.style.height = this.canvasHeight; this.g = Raphael(this.canvasHolder); this.g.clear(); //this.setPaint(Color.DimGrey); this.setPaint(Color.black); //this.setPaint(Color.white); this.setStroke(NORMAL_STROKE); //this.setFont("Arial", 11); this.setFont(NORMAL_FONT); //this.font = this.g.getFont("Arial"); this.fontSmoothing = true; // ninja! var RaphaelOriginal = Raphael; this.ninjaPaper =(function (local_raphael) { var paper = local_raphael(1, 1, 1, 1, processDefinitionId); return paper; })(Raphael.ninja()); Raphael = RaphaelOriginal; }, setPaint: function(color){ this.paint = color; }, getPaint: function(){ return this.paint; }, setStroke: function(strokeWidth){ this.strokeWidth = strokeWidth; }, getStroke: function(){ return this.strokeWidth; }, /* setFont: function(family, weight, style, stretch){ this.font = this.g.getFont(family, weight); }, */ setFont: function(font){ this.font = font; }, getFont: function(){ return this.font; }, drawShaddow: function(object){ var border = object.clone(); border.attr({"stroke-width": this.strokeWidth + 6, "stroke": Color.white, "fill": Color.white, "opacity": 1, "stroke-dasharray":null}); //border.toBack(); object.toFront(); return border; }, setConextObject: function(obj){ this.contextObject = obj; }, getConextObject: function(){ return this.contextObject; }, setContextToElement: function(object){ var contextObject = this.getConextObject(); object.id = contextObject.id; object.data("contextObject", contextObject); }, onClick: function(event, instance, element){ var overlay = element; var set = overlay.data("set"); var contextObject = overlay.data("contextObject"); //console.log("["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId()); if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.click) { var args = [instance, element, contextObject]; ProcessDiagramGenerator.options.on.click.apply(event, args); } }, onRightClick: function(event, instance, element){ var overlay = element; var set = overlay.data("set"); var contextObject = overlay.data("contextObject"); //console.log("[%s], activityId: %s (RIGHTCLICK)", contextObject.getProperty("type"), contextObject.getId()); if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.rightClick) { var args = [instance, element, contextObject]; ProcessDiagramGenerator.options.on.rightClick.apply(event, args); } }, onHoverIn: function(event, instance, element){ var overlay = element; var set = overlay.data("set"); var contextObject = overlay.data("contextObject"); var border = instance.g.getById(contextObject.id + "_border"); border.attr("opacity", 0.3); // provide callback if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.over) { var args = [instance, element, contextObject]; ProcessDiagramGenerator.options.on.over.apply(event, args); } }, onHoverOut: function(event, instance, element){ var overlay = element; var set = overlay.data("set"); var contextObject = overlay.data("contextObject"); var border = instance.g.getById(contextObject.id + "_border"); border.attr("opacity", 0.0); // provide callback if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.out) { var args = [instance, element, contextObject]; ProcessDiagramGenerator.options.on.out.apply(event, args); } }, addHandlers: function(set, x, y, width, height, type){ var contextObject = this.getConextObject(); var cx = x+width/2, cy = y+height/2; if (type == "event") { var border = this.g.ellipse(cx, cy, width/2+4, height/2+4); var overlay = this.g.ellipse(cx, cy, width/2, height/2); } else if (type == "gateway") { // rhombus var border = this.g.path( "M" + (x - 4) + " " + (y + (height / 2)) + "L" + (x + (width / 2)) + " " + (y + height + 4) + "L" + (x + width + 4) + " " + (y + (height / 2)) + "L" + (x + (width / 2)) + " " + (y - 4) + "z" ); var overlay = this.g.path( "M" + x + " " + (y + (height / 2)) + "L" + (x + (width / 2)) + " " + (y + height) + "L" + (x + width) + " " + (y + (height / 2)) + "L" + (x + (width / 2)) + " " + y + "z" ); } else if (type == "task") { var border = this.g.rect(x - 4, y - 4, width+9, height+9, TASK_CORNER_ROUND+4); var overlay = this.g.rect(x, y, width, height, TASK_CORNER_ROUND); } border.attr({stroke: Color.get(132,112,255)/*Color.Tan1*/,"stroke-width": 4, opacity: 0.0}); border.id = contextObject.id + "_border"; set.push(border); overlay.attr({stroke: Color.Orange,"stroke-width": 3, fill: Color.get(0,0,0), opacity: 0.0, cursor: "hand"}); overlay.data("set",set); overlay.id = contextObject.id; overlay.data("contextObject",contextObject); var instance = this; overlay.mousedown(function(event){if (event.button == 2) instance.onRightClick(event, instance, this);}); overlay.click(function(event){instance.onClick(event, instance, this);}); overlay.hover(function(event){instance.onHoverIn(event, instance, this);}, function(event){instance.onHoverOut(event, instance, this);}); }, /* * Start Events: * * drawNoneStartEvent * drawTimerStartEvent * drawMessageStartEvent * drawErrorStartEvent * drawSignalStartEvent * _drawStartEventImage * _drawStartEvent */ drawNoneStartEvent: function(x, y, width, height) { this.g.setStart(); var isInterrupting = undefined; this._drawStartEvent(x, y, width, height, isInterrupting, null); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawTimerStartEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawStartEvent(x, y, width, height, isInterrupting, null); var cx = x + width/2 - this.getStroke()/4; var cy = y + height/2 - this.getStroke()/4; var w = width*.9;// - this.getStroke()*2; var h = height*.9;// - this.getStroke()*2; this._drawClock(cx, cy, w, h); if (this.gebug) var center = this.g.ellipse(cx, cy, 3, 3).attr({stroke:"none", fill: Color.green}); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawMessageStartEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawStartEvent(x, y, width, height, isInterrupting, null); this._drawStartEventImage(x, y, width, height, MESSAGE_CATCH_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawErrorStartEvent: function(x, y, width, height, name) { this.g.setStart(); var isInterrupting = undefined; this._drawStartEvent(x, y, width, height, isInterrupting); this._drawStartEventImage(x, y, width, height, ERROR_CATCH_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawSignalStartEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawStartEvent(x, y, width, height, isInterrupting, null); this._drawStartEventImage(x, y, width, height, SIGNAL_CATCH_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawMultipleStartEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawStartEvent(x, y, width, height, isInterrupting, null); var cx = x + width/2 - this.getStroke()/4; var cy = y + height/2 - this.getStroke()/4; var w = width*1; var h = height*1; this._drawPentagon(cx, cy, w, h); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, _drawStartEventImage: function(x, y, width, height, image){ var cx = x + width/2 - this.getStroke()/2; var cy = y + height/2 - this.getStroke()/2; var w = width*.65;// - this.getStroke()*2; var h = height*.65;// - this.getStroke()*2; var img = this.g.image(image, cx-w/2, cy-h/2, w, h); }, _drawStartEvent: function(x, y, width, height, isInterrupting){ var originalPaint = this.getPaint(); if (typeof(START_EVENT_STROKE_COLOR) != "undefined") this.setPaint(START_EVENT_STROKE_COLOR); width -= this.strokeWidth / 2; height -= this.strokeWidth / 2; x = x + width/2; y = y + height/2; var circle = this.g.ellipse(x, y, width/2, height/2); circle.attr({"stroke-width": this.strokeWidth, "stroke": this.paint, //"stroke": START_EVENT_STROKE_COLOR, "fill": START_EVENT_COLOR}); // white shaddow this.drawShaddow(circle); if (isInterrupting!=null && isInterrupting!=undefined && !isInterrupting) circle.attr({"stroke-dasharray": NON_INTERRUPTING_EVENT_STROKE}); this.setContextToElement(circle); this.setPaint(originalPaint); }, /* * End Events: * * drawNoneEndEvent * drawErrorEndEvent * drawMessageEndEvent * drawSignalEndEvent * drawMultipleEndEvent * _drawEndEventImage * _drawNoneEndEvent */ drawNoneEndEvent: function(x, y, width, height) { this.g.setStart(); this._drawNoneEndEvent(x, y, width, height, null, "noneEndEvent"); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawErrorEndEvent: function(x, y, width, height) { this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); this._drawEndEventImage(x, y, width, height, ERROR_THROW_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawMessageEndEvent: function(x, y, width, height, name) { this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); this._drawEndEventImage(x, y, width, height, MESSAGE_THROW_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawSignalEndEvent: function(x, y, width, height, name) { this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); this._drawEndEventImage(x, y, width, height, SIGNAL_THROW_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawMultipleEndEvent: function(x, y, width, height, name) { this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); var cx = x + width/2;// - this.getStroke(); var cy = y + height/2;// - this.getStroke(); var w = width*1; var h = height*1; var filled = true; this._drawPentagon(cx, cy, w, h, filled); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawTerminateEndEvent: function(x, y, width, height) { this.g.setStart(); var type = "errorEndEvent"; this._drawNoneEndEvent(x, y, width, height, null, type); var cx = x + width/2;// - this.getStroke()/2; var cy = y + height/2;// - this.getStroke()/2; var w = width/2*.6; var h = height/2*.6; var circle = this.g.ellipse(cx, cy, w, h).attr({fill: Color.black}); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, _drawEndEventImage: function(x, y, width, height, image){ var cx = x + width/2 - this.getStroke()/2; var cy = y + height/2 - this.getStroke()/2; var w = width*.65; var h = height*.65; var img = this.g.image(image, cx-w/2, cy-h/2, w, h); }, _drawNoneEndEvent: function(x, y, width, height, image, type) { var originalPaint = this.getPaint(); if (typeof(CATCHING_EVENT_COLOR) != "undefined") this.setPaint(CATCHING_EVENT_COLOR); var strokeColor = this.getPaint(); var fillColor = this.getPaint(); if (type == "errorEndEvent") { strokeColor = ERROR_END_EVENT_STROKE_COLOR; fillColor = ERROR_END_EVENT_COLOR; } else if (type == "noneEndEvent") { strokeColor = NONE_END_EVENT_STROKE_COLOR; fillColor = NONE_END_EVENT_COLOR; } else // event circles width -= this.strokeWidth / 2; height -= this.strokeWidth / 2; x = x + width/2;// + this.strokeWidth/2; y = y + width/2;// + this.strokeWidth/2; // outerCircle var outerCircle = this.g.ellipse(x, y, width/2, height/2); // white shaddow var shaddow = this.drawShaddow(outerCircle); outerCircle.attr({"stroke-width": this.strokeWidth, "stroke": strokeColor, "fill": fillColor}); var innerCircleX = x; var innerCircleY = y; var innerCircleWidth = width/2 - 2; var innerCircleHeight = height/2 - 2; var innerCircle = this.g.ellipse(innerCircleX, innerCircleY, innerCircleWidth, innerCircleHeight); innerCircle.attr({"stroke-width": this.strokeWidth, "stroke": strokeColor, "fill": Color.white}); // TODO: implement it //var originalPaint = this.getPaint(); //this.g.setPaint(BOUNDARY_EVENT_COLOR); this.setPaint(originalPaint); }, /* * Catching Events: * * drawCatchingTimerEvent * drawCatchingErrorEvent * drawCatchingSignalEvent * drawCatchingMessageEvent * drawCatchingMultipleEvent * _drawCatchingEventImage * _drawCatchingEvent */ drawCatchingTimerEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); var innerCircleWidth = width - 4; var innerCircleHeight = height - 4; var cx = x + width/2 - this.getStroke()/4; var cy = y + height/2 - this.getStroke()/4; var w = innerCircleWidth*.9;// - this.getStroke()*2; var h = innerCircleHeight*.9;// - this.getStroke()*2; this._drawClock(cx, cy, w, h); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawCatchingErrorEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); this._drawCatchingEventImage(x, y, width, height, ERROR_CATCH_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawCatchingSignalEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); this._drawCatchingEventImage(x, y, width, height, SIGNAL_CATCH_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawCatchingMessageEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); this._drawCatchingEventImage(x, y, width, height, MESSAGE_CATCH_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawCatchingMultipleEvent: function(x, y, width, height, isInterrupting, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, isInterrupting, null); var cx = x + width/2 - this.getStroke(); var cy = y + height/2 - this.getStroke(); var w = width*.9; var h = height*.9; this._drawPentagon(cx, cy, w, h); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, _drawCatchingEventImage: function(x, y, width, height, image){ var innerCircleWidth = width - 4; var innerCircleHeight = height - 4; var cx = x + width/2 - this.getStroke()/2; var cy = y + height/2 - this.getStroke()/2; var w = innerCircleWidth*.6;// - this.getStroke()*2; var h = innerCircleHeight*.6;// - this.getStroke()*2; var img = this.g.image(image, cx-w/2, cy-h/2, w, h); }, _drawCatchingEvent: function(x, y, width, height, isInterrupting, image) { var originalPaint = this.getPaint(); if (typeof(CATCHING_EVENT_COLOR) != "undefined") this.setPaint(CATCHING_EVENT_COLOR); // event circles width -= this.strokeWidth / 2; height -= this.strokeWidth / 2; x = x + width/2;// + this.strokeWidth/2; y = y + width/2;// + this.strokeWidth/2; // outerCircle var outerCircle = this.g.ellipse(x, y, width/2, height/2); // white shaddow var shaddow = this.drawShaddow(outerCircle); //console.log("isInterrupting: " + isInterrupting, "x:" , x, "y:",y); if (isInterrupting!=null && isInterrupting!=undefined && !isInterrupting) outerCircle.attr({"stroke-dasharray": NON_INTERRUPTING_EVENT_STROKE}); outerCircle.attr({"stroke-width": this.strokeWidth, "stroke": this.getPaint(), "fill": BOUNDARY_EVENT_COLOR}); var innerCircleX = x; var innerCircleY = y; var innerCircleRadiusX = width/2 - 4; var innerCircleRadiusY = height/2 - 4; var innerCircle = this.g.ellipse(innerCircleX, innerCircleY, innerCircleRadiusX, innerCircleRadiusY); innerCircle.attr({"stroke-width": this.strokeWidth, "stroke": this.getPaint()}); if (image) { var imageWidth = imageHeight = innerCircleRadiusX*1.2 + this.getStroke()*2; var imageX = innerCircleX-imageWidth/2 - this.strokeWidth/2; var imageY = innerCircleY-imageWidth/2 - this.strokeWidth/2; var img = this.g.image(image, imageX, imageY, imageWidth, imageHeight); } this.setPaint(originalPaint); var set = this.g.set(); set.push(outerCircle, innerCircle, shaddow); this.setContextToElement(outerCircle); // TODO: add shapes to set /* var st = this.g.set(); st.push( this.g.ellipse(innerCircleX, innerCircleY, 2, 2), this.g.ellipse(imageX, imageY, 2, 2) ); st.attr({fill: "red", "stroke-width":0}); */ }, /* * Catching Events: * * drawThrowingNoneEvent * drawThrowingSignalEvent * drawThrowingMessageEvent * drawThrowingMultipleEvent */ drawThrowingNoneEvent: function(x, y, width, height, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, null, null); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawThrowingSignalEvent: function(x, y, width, height, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, null, null); this._drawCatchingEventImage(x, y, width, height, SIGNAL_THROW_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawThrowingMessageEvent: function(x, y, width, height, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, null, null); this._drawCatchingEventImage(x, y, width, height, MESSAGE_THROW_IMAGE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, drawThrowingMultipleEvent: function(x, y, width, height, name) { this.g.setStart(); this._drawCatchingEvent(x, y, width, height, null, null); var cx = x + width/2 - this.getStroke(); var cy = y + height/2 - this.getStroke(); var w = width*.9; var h = height*.9; var filled = true; this._drawPentagon(cx, cy, w, h, filled); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "event"); }, /* * Draw flows: * * _connectFlowToActivity * _drawFlow * _drawDefaultSequenceFlowIndicator * drawSequenceflow * drawMessageflow * drawAssociation * _drawCircleTail * _drawArrowHead * _drawConditionalSequenceFlowIndicator * drawSequenceflowWithoutArrow */ _connectFlowToActivity: function(sourceActivityId, destinationActivityId, waypoints){ var sourceActivity = this.g.getById(sourceActivityId); var destinationActivity = this.g.getById(destinationActivityId); if (sourceActivity == null || destinationActivity == null) { if (sourceActivity == null) console.error("source activity["+sourceActivityId+"] not found"); else console.error("destination activity["+destinationActivityId+"] not found"); return null; } var bbSourceActivity = sourceActivity.getBBox() var bbDestinationActivity = destinationActivity.getBBox() var path = []; var newWaypoints = []; for(var i = 0; i < waypoints.length; i++){ var pathType = "" if (i==0) pathType = "M"; else pathType = "L"; path.push([pathType, waypoints[i].x, waypoints[i].y]); newWaypoints.push({x:waypoints[i].x, y:waypoints[i].y}); } var ninjaPathSourceActivity = this.ninjaPaper.path(sourceActivity.realPath); var ninjaPathDestinationActivity = this.ninjaPaper.path(destinationActivity.realPath); var ninjaBBSourceActivity = ninjaPathSourceActivity.getBBox(); var ninjaBBDestinationActivity = ninjaPathDestinationActivity.getBBox(); // set target of the flow to the center of the taskObject var newPath = path; var originalSource = {x: newPath[0][1], y: newPath[0][2]}; var originalTarget = {x: newPath[newPath.length-1][1], y: newPath[newPath.length-1][2]}; newPath[0][1] = ninjaBBSourceActivity.x + (ninjaBBSourceActivity.x2 - ninjaBBSourceActivity.x ) / 2; newPath[0][2] = ninjaBBSourceActivity.y + (ninjaBBSourceActivity.y2 - ninjaBBSourceActivity.y ) / 2; newPath[newPath.length-1][1] = ninjaBBDestinationActivity.x + (ninjaBBDestinationActivity.x2 - ninjaBBDestinationActivity.x ) / 2; newPath[newPath.length-1][2] = ninjaBBDestinationActivity.y + (ninjaBBDestinationActivity.y2 - ninjaBBDestinationActivity.y ) / 2; var ninjaPathFlowObject = this.ninjaPaper.path(newPath); var ninjaBBFlowObject = ninjaPathFlowObject.getBBox(); var intersectionsSource = Raphael.pathIntersection(ninjaPathSourceActivity.realPath, ninjaPathFlowObject.realPath); var intersectionsDestination = Raphael.pathIntersection(ninjaPathDestinationActivity.realPath, ninjaPathFlowObject.realPath); var intersectionSource = intersectionsSource.pop(); var intersectionDestination = intersectionsDestination.pop(); if (intersectionSource != undefined) { if (this.gebug) { var diameter = 5; var dotOriginal = this.g.ellipse(originalSource.x, originalSource.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Pink}); var dot = this.g.ellipse(intersectionSource.x, intersectionSource.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Green}); } newWaypoints[0].x = intersectionSource.x; newWaypoints[0].y = intersectionSource.y; } if (intersectionDestination != undefined) { if (this.gebug) { var diameter = 5; var dotOriginal = this.g.ellipse(originalTarget.x, originalTarget.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Red}); var dot = this.g.ellipse(intersectionDestination.x, intersectionDestination.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Blue}); } newWaypoints[newWaypoints.length-1].x = intersectionDestination.x; newWaypoints[newWaypoints.length-1].y = intersectionDestination.y; } this.ninjaPaper.clear(); return newWaypoints; }, _drawFlow: function(waypoints, conditional, isDefault, highLighted, withArrowHead, connectionType){ var originalPaint = this.getPaint(); var originalStroke = this.getStroke(); this.setPaint(SEQUENCEFLOW_COLOR); this.setStroke(SEQUENCEFLOW_STROKE); if (highLighted) { this.setPaint(HIGHLIGHT_COLOR); this.setStroke(SEQUENCEFLOW_HIGHLIGHT_STROKE); } // TODO: generate polylineId or do something!! var uuid = Raphael.createUUID(); var contextObject = this.getConextObject(); var newWaypoints = waypoints; if (contextObject) { var newWaypoints = this._connectFlowToActivity(contextObject.sourceActivityId, contextObject.destinationActivityId, waypoints); if (!newWaypoints) { console.error("Error draw flow from '"+contextObject.sourceActivityId+"' to '"+contextObject.destinationActivityId+"' "); return; } } var polyline = new Polyline(uuid, newWaypoints, this.getStroke()); //var polyline = new Polyline(waypoints, 3); polyline.element = this.g.path(polyline.path); polyline.element.attr("stroke-width", this.getStroke()); polyline.element.attr("stroke", this.getPaint()); if (contextObject) { polyline.element.id = contextObject.id; polyline.element.data("contextObject", contextObject); } else { polyline.element.id = uuid; } /* polyline.element.mouseover(function(){ this.attr({"stroke-width": NORMAL_STROKE + 2}); }).mouseout(function(){ this.attr({"stroke-width": NORMAL_STROKE}); }); */ var last = polyline.getAnchorsCount()-1; var x = polyline.getAnchor(last).x; var y = polyline.getAnchor(last).y; //var c = this.g.ellipse(x, y, 5, 5); var lastLineIndex = polyline.getLinesCount()-1; var line = polyline.getLine(lastLineIndex); var firstLine = polyline.getLine(0); var arrowHead = null, circleTail = null, defaultSequenceFlowIndicator = null, conditionalSequenceFlowIndicator = null; if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) { circleTail = this._drawCircleTail(firstLine, connectionType); } if(withArrowHead) arrowHead = this._drawArrowHead(line, connectionType); //console.log("isDefault: ", isDefault, ", isDefaultConditionAvailable: ", polyline.isDefaultConditionAvailable); if (isDefault && polyline.isDefaultConditionAvailable) { //var angle = polyline.getLineAngle(0); //console.log("firstLine", firstLine); defaultSequenceFlowIndicator = this._drawDefaultSequenceFlowIndicator(firstLine); } if (conditional) { conditionalSequenceFlowIndicator = this._drawConditionalSequenceFlowIndicator(firstLine); } // draw flow name var flowName = contextObject.name; if (flowName) { var xPointArray = contextObject.xPointArray; var yPointArray = contextObject.yPointArray; var textX = xPointArray[0] < xPointArray[1] ? xPointArray[0] : xPointArray[1]; var textY = yPointArray[0] < yPointArray[1] ? yPointArray[1] : yPointArray[0]; // fix xy textX += 20; textY -= 10; this.g.text(textX, textY, flowName).attr(LABEL_FONT); } var st = this.g.set(); st.push(polyline.element, arrowHead, circleTail, conditionalSequenceFlowIndicator); polyline.element.data("set", st); polyline.element.data("withArrowHead", withArrowHead); var polyCloneAttrNormal = {"stroke-width": this.getStroke() + 5, stroke: Color.get(132,112,255), opacity: 0.0, cursor: "hand"}; var polyClone = st.clone().attr(polyCloneAttrNormal).hover(function () { //if (polyLine.data("isSelected")) return; polyClone.attr({opacity: 0.2}); }, function () { //if (polyLine.data("isSelected")) return; polyClone.attr({opacity: 0.0}); }); polyClone.data("objectId", polyline.element.id); polyClone.click(function(){ var instance = this; var objectId = instance.data("objectId"); var object = this.paper.getById(objectId); var contextObject = object.data("contextObject"); if (contextObject) { console.log("[flow], objectId: " + object.id +", flow: " + contextObject.flow); ProcessDiagramGenerator.showFlowInfo(contextObject); } }).dblclick(function(){ console.log("!!! DOUBLE CLICK !!!"); }).hover(function (mouseEvent) { var instance = this; var objectId = instance.data("objectId"); var object = this.paper.getById(objectId); var contextObject = object.data("contextObject"); if (contextObject) ProcessDiagramGenerator.showFlowInfo(contextObject); }); polyClone.data("parentId", uuid); if (!connectionType || connectionType == CONNECTION_TYPE.SEQUENCE_FLOW) polyline.element.attr("stroke-width", this.getStroke()); else if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) polyline.element.attr({"stroke-dasharray": "--"}); else if (connectionType == CONNECTION_TYPE.ASSOCIATION) polyline.element.attr({"stroke-dasharray": ". "}); this.setPaint(originalPaint); this.setStroke(originalStroke); }, _drawDefaultSequenceFlowIndicator: function(line) { //console.log("line: ", line); var len = 10; c = len/2, f = 8; var defaultIndicator = this.g.path("M" + (-c) + " " + 0 + "L" + (c) + " " + 0); defaultIndicator.attr("stroke-width", this.getStroke()+0); defaultIndicator.attr("stroke", this.getPaint()); var cosAngle = Math.cos((line.angle)); var sinAngle = Math.sin((line.angle)); var dx = f * cosAngle; var dy = f * sinAngle; var x1 = line.x1 + dx + 0*c*cosAngle; var y1 = line.y1 + dy + 0*c*sinAngle; defaultIndicator.transform("t" + (x1) + "," + (y1) + ""); defaultIndicator.transform("...r" + Raphael.deg(line.angle - 3*Math.PI / 4) + " " + 0 + " " + 0); /* var c0 = this.g.ellipse(0, 0, 1, 1).attr({stroke: Color.Blue}); c0.transform("t" + (line.x1) + "," + (line.y1) + ""); var center = this.g.ellipse(0, 0, 1, 1).attr({stroke: Color.Red}); center.transform("t" + (line.x1+dx) + "," + (line.y1+dy) + ""); */ return defaultIndicator; }, drawSequenceflow: function(waypoints, conditional, isDefault, highLighted) { var withArrowHead = true; this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.SEQUENCE_FLOW); }, drawMessageflow: function(waypoints, highLighted) { var withArrowHead = true; var conditional=isDefault=false; this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.MESSAGE_FLOW); }, drawAssociation: function(waypoints, withArrowHead, highLighted) { var withArrowHead = withArrowHead; var conditional=isDefault=false; this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.ASSOCIATION); }, _drawCircleTail: function(line, connectionType){ var diameter = ARROW_WIDTH/2*1.5; // anti smoothing if (this.strokeWidth%2 == 1) line.x1 += .5, line.y1 += .5; var circleTail = this.g.ellipse(line.x1, line.y1, diameter, diameter); circleTail.attr("fill", Color.white); circleTail.attr("stroke", this.getPaint()); return circleTail; }, _drawArrowHead: function(line, connectionType){ var doubleArrowWidth = 2 * ARROW_WIDTH; if (connectionType == CONNECTION_TYPE.ASSOCIATION) var arrowHead = this.g.path("M-" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "L 0 0 L" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth); else var arrowHead = this.g.path("M0 0L-" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "z"); //arrowHead.transform("t" + 0 + ",-" + this.getStroke() + ""); // anti smoothing if (this.strokeWidth%2 == 1) line.x2 += .5, line.y2 += .5; arrowHead.transform("t" + line.x2 + "," + line.y2 + ""); arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); if (!connectionType || connectionType == CONNECTION_TYPE.SEQUENCE_FLOW) arrowHead.attr("fill", this.getPaint()); else if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) arrowHead.attr("fill", Color.white); arrowHead.attr("stroke-width", this.getStroke()); arrowHead.attr("stroke", this.getPaint()); return arrowHead; }, /* drawArrowHead2: function(srcX, srcY, targetX, targetY) { var doubleArrowWidth = 2 * ARROW_WIDTH; //var arrowHead = this.g.path("M-" + ARROW_WIDTH/2 + " -" + doubleArrowWidth + "L0 0" + "L" + ARROW_WIDTH/2 + " -" + doubleArrowWidth + "z"); var arrowHead = this.g.path("M0 0L-" + ARROW_WIDTH/1.5 + " -" + doubleArrowWidth + "L" + ARROW_WIDTH/1.5 + " -" + doubleArrowWidth + "z"); //var c = DefaultProcessDiagramCanvas.g.ellipse(0, 0, 3, 3); //c.transform("t"+targetX+","+targetY+""); var angle = Math.atan2(targetY - srcY, targetX - srcX); arrowHead.transform("t"+targetX+","+targetY+""); arrowHead.transform("...r" + Raphael.deg(angle - Math.PI / 2) + " "+0+" "+0); //console.log(arrowHead.transform()); //console.log("--> " + Raphael.deg(angle - Math.PI / 2)); arrowHead.attr("fill", this.getPaint()); arrowHead.attr("stroke", this.getPaint()); / * // shaddow var c0 = arrowHead.clone(); c0.transform("...t-1 1"); c0.attr("stroke-width", this.strokeWidth); c0.attr("stroke", Color.black); c0.attr("opacity", 0.15); c0.toBack(); * / }, */ _drawConditionalSequenceFlowIndicator: function(line){ var horizontal = (CONDITIONAL_INDICATOR_WIDTH * 0.7); var halfOfHorizontal = horizontal / 2; var halfOfVertical = CONDITIONAL_INDICATOR_WIDTH / 2; var uuid = null; var waypoints = [{x: 0, y: 0}, {x: -halfOfHorizontal, y: halfOfVertical}, {x: 0, y: CONDITIONAL_INDICATOR_WIDTH}, {x: halfOfHorizontal, y: halfOfVertical}]; /* var polyline = new Polyline(uuid, waypoints, this.getStroke()); polyline.element = this.g.path(polyline.path); polyline.element.attr("stroke-width", this.getStroke()); polyline.element.attr("stroke", this.getPaint()); polyline.element.id = uuid; */ var polygone = new Polygone(waypoints, this.getStroke()); polygone.element = this.g.path(polygone.path); polygone.element.attr("fill", Color.white); polygone.transform("t" + line.x1 + "," + line.y1 + ""); polygone.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); var cosAngle = Math.cos((line.angle)); var sinAngle = Math.sin((line.angle)); //polygone.element.attr("stroke-width", this.getStroke()); //polygone.element.attr("stroke", this.getPaint()); polygone.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); return polygone.element; }, drawSequenceflowWithoutArrow: function(waypoints, conditional, isDefault, highLighted) { var withArrowHead = false; this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.SEQUENCE_FLOW); }, /* * Draw artifacts */ drawPoolOrLane: function(x, y, width, height, name){ // anti smoothing if (this.strokeWidth%2 == 1) x = Math.round(x) + .5, y = Math.round(y) + .5; // shape var rect = this.g.rect(x, y, width, height); var attr = {"stroke-width": NORMAL_STROKE, stroke: TASK_STROKE_COLOR}; rect.attr(attr); // Add the name as text, vertical if(name != null && name.length > 0) { var attr = POOL_LANE_FONT; // Include some padding var availableTextSpace = height - 6; // Create rotation for derived font var truncated = this.fitTextToWidth(name, availableTextSpace); var realWidth = this.getStringWidth(truncated, attr); var realHeight = this.getStringHeight(truncated, attr); //console.log("truncated:", truncated, ", height:", height, ", realHeight:", realHeight, ", availableTextSpace:", availableTextSpace, ", realWidth:", realWidth); var newX = x + 2 + realHeight*1 - realHeight/2; var newY = 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2 - realWidth/2; var textElement = this.g.text(newX, newY, truncated).attr(attr); //console.log(".getBBox(): ", t.getBBox()); textElement.transform("r" + Raphael.deg(270 * Math.PI/180) + " " + newX + " " + newY); } // TODO: add to set }, _drawTask: function(name, x, y, width, height, thickBorder) { var originalPaint = this.getPaint(); this.setPaint(TASK_COLOR); // anti smoothing if (this.strokeWidth%2 == 1) x = Math.round(x) + .5, y = Math.round(y) + .5; // shape var shape = this.g.rect(x, y, width, height, TASK_CORNER_ROUND); var attr = {"stroke-width": this.strokeWidth, stroke: TASK_STROKE_COLOR, fill: this.getPaint()}; shape.attr(attr); //shape.attr({fill: "90-"+this.getPaint()+"-" + Color.get(250, 250, 244)}); var contextObject = this.getConextObject(); if (contextObject) { shape.id = contextObject.id; shape.data("contextObject", contextObject); } //var activity = this.getConextObject(); //console.log("activity: " + activity.getId(), activity); //Object.clone(activity); /* c.mouseover(function(){ this.attr({"stroke-width": NORMAL_STROKE + 2}); }).mouseout(function(){ this.attr({"stroke-width": NORMAL_STROKE}); }); */ this.setPaint(originalPaint); // white shaddow this.drawShaddow(shape); if (thickBorder) { shape.attr({"stroke-width": THICK_TASK_BORDER_STROKE}); } else { //g.draw(rect); } // text if (name) { var fontAttr = TASK_FONT; // Include some padding var paddingX = 5; var paddingY = 5; var availableTextSpace = width - paddingX*2; // TODO: this.setFont // var originalFont = this.getFont(); // this.setFont(TASK_FONT) /* var truncated = this.fitTextToWidth(name, availableTextSpace); var realWidth = this.getStringWidth(truncated, fontAttr); var realHeight = this.getStringHeight(truncated, fontAttr); //var t = this.g.text(x + width/2 + realWidth*0/2 + paddingX*0, y + height/2, truncated).attr(fontAttr); */ //console.log("draw task name: " + name); var boxWidth = width - (2 * TEXT_PADDING); var boxHeight = height - ICON_SIZE - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; var boxX = x + width/2 - boxWidth/2; var boxY = y + height/2 - boxHeight/2 + ICON_PADDING + ICON_PADDING - 2 - 2; /* var boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); var boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); var boxX = x + width/2 - boxWidth/2; var boxY = y + height/2 - boxHeight/2; */ this.drawTaskLabel(name, boxX, boxY, boxWidth, boxHeight); } }, drawTaskLabel: function(text, x, y, boxWidth, boxHeight){ var originalFont = this.getFont(); this.setFont(TASK_FONT); this._drawMultilineText(text, x, y, boxWidth, boxHeight, MULTILINE_VERTICAL_ALIGN_MIDDLE, MULTILINE_HORIZONTAL_ALIGN_MIDDLE); this.setFont(originalFont); }, drawAnnotationText: function(text, x, y, width, height){ //this._drawMultilineText(text, x, y, width, height, "start"); var originalPaint = this.getPaint(); var originalFont = this.getFont(); this.setPaint(Color.black); this.setFont(TASK_FONT); this._drawMultilineText(text, x, y, width, height, MULTILINE_VERTICAL_ALIGN_TOP, MULTILINE_HORIZONTAL_ALIGN_LEFT); this.setPaint(originalPaint); this.setFont(originalFont); }, drawLabel: function(text, x, y, width, height){ //this._drawMultilineText(text, x, y, width, height, "start"); var originalPaint = this.getPaint(); var originalFont = this.getFont(); this.setPaint(LABEL_COLOR); //this.setFont(LABEL_FONT); this.setFont(LABEL_FONT_SMOOTH); // predefined box width for labels // TODO: use label width as is, but not height (for stretching) if (!width || !height) { width = 100; height = 0; } // TODO: remove it. It is debug x = x - width/2; this._drawMultilineText(text, x, y, width, height, MULTILINE_VERTICAL_ALIGN_TOP, MULTILINE_HORIZONTAL_ALIGN_MIDDLE); this.setPaint(originalPaint); this.setFont(originalFont); }, /* drawMultilineLabel: function(text, x, y){ var originalFont = this.getFont(); this.setFont(LABEL_FONT_SMOOTH); var boxWidth = 80; x = x - boxWidth/2 this._drawMultilineText(text, x, y, boxWidth, null, "middle"); this.setFont(originalFont); }, */ getStringWidth: function(text, fontAttrs){ var textElement = this.g.text(0, 0, text).attr(fontAttrs).hide(); var bb = textElement.getBBox(); //console.log("string width: ", t.getBBox().width); return textElement.getBBox().width; }, getStringHeight: function(text, fontAttrs){ var textElement = this.g.text(0, 0, text).attr(fontAttrs).hide(); var bb = textElement.getBBox(); //console.log("string height: ", t.getBBox().height); return textElement.getBBox().height; }, fitTextToWidth: function(original, width) { var text = original; // TODO: move attr on parameters var attr = {font: "11px Arial", opacity: 0}; // remove length for "..." var dots = this.g.text(0, 0, "...").attr(attr).hide(); var dotsBB = dots.getBBox(); var maxWidth = width - dotsBB.width; var textElement = this.g.text(0, 0, text).attr(attr).hide(); var bb = textElement.getBBox(); // it's a little bit incorrect with "..." while (bb.width > maxWidth && text.length > 0) { text = text.substring(0, text.length - 1); textElement.attr({"text": text}); bb = textElement.getBBox(); } // remove element from paper textElement.remove(); if (text != original) { text = text + "..."; } return text; }, wrapTextToWidth: function(original, width){ //return original; var text = original; var wrappedText = "\n"; // TODO: move attr on parameters var attr = {font: "11px Arial", opacity: 0}; var textElement = this.g.text(0, 0, wrappedText).attr(attr).hide(); var bb = textElement.getBBox(); var resultText = ""; var i = 0, j = 0; while (text.length > 0) { while (bb.width < width && text.length>0) { // remove "\n" wrappedText = wrappedText.substring(0,wrappedText.length-1); // add new char, add "\n" wrappedText = wrappedText + text.substring(0,1) + "\n"; text = text.substring(1); textElement.attr({"text": wrappedText}); bb = textElement.getBBox(); i++; if (i>200) break; } // remove "\n" wrappedText = wrappedText.substring(0, wrappedText.length - 1); if (text.length == 0) { resultText += wrappedText; break; } // return last char to text text = wrappedText.substring(wrappedText.length-1) + text; // remove last char from wrappedText wrappedText = wrappedText.substring(0, wrappedText.length-1) + "\n"; textElement.attr({"text": wrappedText}); bb = textElement.getBBox(); //console.log(">> ", wrappedText, ", ", text); resultText += wrappedText; wrappedText = "\n"; j++; if (j>20) break; } // remove element from paper textElement.remove(); return resultText; }, wrapTextToWidth2: function(original, width){ var text = original; var wrappedText = "\n"; // TODO: move attr on parameters var attr = {font: "11px Arial", opacity: 0}; var textElement = this.g.text(0, 0, wrappedText).attr(attr).hide(); var bb = textElement.getBBox(); var resultText = ""; var i = 0, j = 0; while (text.length > 0) { while (bb.width < width && text.length>0) { // remove "\n" wrappedText = wrappedText.substring(0,wrappedText.length-1); // add new char, add "\n" wrappedText = wrappedText + text.substring(0,1) + "\n"; text = text.substring(1); textElement.attr({"text": wrappedText}); bb = textElement.getBBox(); i++; if (i>200) break; } // remove "\n" wrappedText = wrappedText.substring(0, wrappedText.length - 1); if (text.length == 0) { resultText += wrappedText; break; } // return last char to text text = wrappedText.substring(wrappedText.length-1) + text; // remove last char from wrappedText wrappedText = wrappedText.substring(0, wrappedText.length-1) + "\n"; textElement.attr({"text": wrappedText}); bb = textElement.getBBox(); //console.log(">> ", wrappedText, ", ", text); resultText += wrappedText; wrappedText = "\n"; j++; if (j>20) break; } // remove element from paper textElement.remove(); return resultText; }, drawUserTask: function(name, x, y, width, height) { this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(USERTASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, drawScriptTask: function(name, x, y, width, height) { this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(SCRIPTTASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, drawServiceTask: function(name, x, y, width, height) { this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(SERVICETASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, drawReceiveTask: function(name, x, y, width, height) { this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(RECEIVETASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, drawSendTask: function(name, x, y, width, height) { this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(SENDTASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, drawManualTask: function(name, x, y, width, height) { this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(MANUALTASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, drawBusinessRuleTask: function(name, x, y, width, height) { this.g.setStart(); this._drawTask(name, x, y, width, height); var img = this.g.image(BUSINESS_RULE_TASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, drawExpandedSubProcess: function(name, x, y, width, height, isTriggeredByEvent){ this.g.setStart(); // anti smoothing if (this.strokeWidth%2 == 1) x = Math.round(x) + .5, y = Math.round(y) + .5; // shape var rect = this.g.rect(x, y, width, height, EXPANDED_SUBPROCESS_CORNER_ROUND); // Use different stroke (dashed) if(isTriggeredByEvent) { rect.attr(EVENT_SUBPROCESS_ATTRS); } else { rect.attr(EXPANDED_SUBPROCESS_ATTRS); } this.setContextToElement(rect); var fontAttr = EXPANDED_SUBPROCESS_FONT; // Include some padding var paddingX = 10; var paddingY = 5; var availableTextSpace = width - paddingX*2; var truncated = this.fitTextToWidth(name, availableTextSpace); var realWidth = this.getStringWidth(truncated, fontAttr); var realHeight = this.getStringHeight(truncated, fontAttr); var textElement = this.g.text(x + width/2 - realWidth*0/2 + 0*paddingX, y + realHeight/2 + paddingY, truncated).attr(fontAttr); var set = this.g.setFinish(); // TODO: Expanded Sub Process may has specific handlers //this.addHandlers(set, x, y, width, height, "task"); }, drawCollapsedSubProcess: function(name, x, y, width, height, isTriggeredByEvent) { this.g.setStart(); this._drawCollapsedTask(name, x, y, width, height, false); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, drawCollapsedCallActivity: function(name, x, y, width, height) { this.g.setStart(); this._drawCollapsedTask(name, x, y, width, height, true); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "task"); }, _drawCollapsedTask: function(name, x, y, width, height, thickBorder) { // The collapsed marker is now visualized separately this._drawTask(name, x, y, width, height, thickBorder); }, drawCollapsedMarker: function(x, y, width, height){ // rectangle var rectangleWidth = MARKER_WIDTH; var rectangleHeight = MARKER_WIDTH; // anti smoothing if (this.strokeWidth%2 == 1) y += .5; var rect = this.g.rect(x + (width - rectangleWidth) / 2, y + height - rectangleHeight - 3, rectangleWidth, rectangleHeight); // plus inside rectangle var cx = rect.attr("x") + rect.attr("width")/2; var cy = rect.attr("y") + rect.attr("height")/2; var line = this.g.path( "M" + cx + " " + (cy+2) + "L" + cx + " " + (cy-2) + "M" + (cx-2) + " " + cy + "L" + (cx+2) + " " + cy ).attr({"stroke-width": this.strokeWidth}); }, drawActivityMarkers: function(x, y, width, height, multiInstanceSequential, multiInstanceParallel, collapsed){ if (collapsed) { if (!multiInstanceSequential && !multiInstanceParallel) { this.drawCollapsedMarker(x, y, width, height); } else { this.drawCollapsedMarker(x - MARKER_WIDTH / 2 - 2, y, width, height); if (multiInstanceSequential) { console.log("is collapsed and multiInstanceSequential"); this.drawMultiInstanceMarker(true, x + MARKER_WIDTH / 2 + 2, y, width, height); } else if (multiInstanceParallel) { console.log("is collapsed and multiInstanceParallel"); this.drawMultiInstanceMarker(false, x + MARKER_WIDTH / 2 + 2, y, width, height); } } } else { if (multiInstanceSequential) { console.log("is multiInstanceSequential"); this.drawMultiInstanceMarker(true, x, y, width, height); } else if (multiInstanceParallel) { console.log("is multiInstanceParallel"); this.drawMultiInstanceMarker(false, x, y, width, height); } } }, drawGateway: function(x, y, width, height) { var rhombus = this.g.path( "M" + x + " " + (y + (height / 2)) + "L" + (x + (width / 2)) + " " + (y + height) + "L" + (x + width) + " " + (y + (height / 2)) + "L" + (x + (width / 2)) + " " + y + "z" ); // white shaddow this.drawShaddow(rhombus); rhombus.attr("stroke-width", this.strokeWidth); rhombus.attr("stroke", Color.SlateGrey); rhombus.attr({fill: Color.white}); this.setContextToElement(rhombus); return rhombus; }, drawParallelGateway: function(x, y, width, height) { this.g.setStart(); // rhombus this.drawGateway(x, y, width, height); // plus inside rhombus var originalStroke = this.getStroke(); this.setStroke(GATEWAY_TYPE_STROKE); var plus = this.g.path( "M" + (x + 10) + " " + (y + height / 2) + "L" + (x + width - 10) + " " + (y + height / 2) + // horizontal "M" + (x + width / 2) + " " + (y + height - 10) + "L" + (x + width / 2) + " " + (y + 10) // vertical ); plus.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); this.setStroke(originalStroke); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "gateway"); }, drawExclusiveGateway: function(x, y, width, height) { this.g.setStart(); // rhombus var rhombus = this.drawGateway(x, y, width, height); var quarterWidth = width / 4; var quarterHeight = height / 4; // X inside rhombus var originalStroke = this.getStroke(); this.setStroke(GATEWAY_TYPE_STROKE); var iks = this.g.path( "M" + (x + quarterWidth + 3) + " " + (y + quarterHeight + 3) + "L" + (x + 3 * quarterWidth - 3) + " " + (y + 3 * quarterHeight - 3) + "M" + (x + quarterWidth + 3) + " " + (y + 3 * quarterHeight - 3) + "L" + (x + 3 * quarterWidth - 3) + " " + (y + quarterHeight + 3) ); iks.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); this.setStroke(originalStroke); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "gateway"); }, drawInclusiveGateway: function(x, y, width, height){ this.g.setStart(); // rhombus this.drawGateway(x, y, width, height); var diameter = width / 4; // circle inside rhombus var originalStroke = this.getStroke(); this.setStroke(GATEWAY_TYPE_STROKE); var circle = this.g.ellipse(width/2 + x, height/2 + y, diameter, diameter); circle.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); this.setStroke(originalStroke); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "gateway"); }, drawEventBasedGateway: function(x, y, width, height){ this.g.setStart(); // rhombus this.drawGateway(x, y, width, height); var diameter = width / 2; // rombus inside rhombus var originalStroke = this.getStroke(); this.setStroke(GATEWAY_TYPE_STROKE); // draw GeneralPath (polygon) var n=5; var angle = 2*Math.PI/n; var x1Points = []; var y1Points = []; for ( var index = 0; index < n; index++ ) { var v = index*angle - Math.PI/2; x1Points[index] = x + parseInt(Math.round(width/2)) + parseInt(Math.round((width/4)*Math.cos(v))); y1Points[index] = y + parseInt(Math.round(height/2)) + parseInt(Math.round((height/4)*Math.sin(v))); } //g.drawPolygon(x1Points, y1Points, n); var path = ""; for ( var index = 0; index < n; index++ ) { if (index == 0) path += "M"; else path += "L"; path += x1Points[index] + "," + y1Points[index]; } path += "z"; var polygone = this.g.path(path); polygone.attr("stroke-width", this.strokeWidth); polygone.attr("stroke", this.getPaint()); this.setStroke(originalStroke); var set = this.g.setFinish(); this.addHandlers(set, x, y, width, height, "gateway"); }, /* * drawMultiInstanceMarker * drawHighLight * highLightFlow */ drawMultiInstanceMarker: function(sequential, x, y, width, height) { var rectangleWidth = MARKER_WIDTH; var rectangleHeight = MARKER_WIDTH; // anti smoothing if (this.strokeWidth%2 == 1) x += .5;//, y += .5; var lineX = x + (width - rectangleWidth) / 2; var lineY = y + height - rectangleHeight - 3; var originalStroke = this.getStroke(); this.setStroke(MULTI_INSTANCE_STROKE); if (sequential) { var line = this.g.path( "M" + lineX + " " + lineY + "L" + (lineX + rectangleWidth) + " " + lineY + "M" + lineX + " " + (lineY + rectangleHeight / 2) + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight / 2) + "M" + lineX + " " + (lineY + rectangleHeight) + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight) ).attr({"stroke-width": this.strokeWidth}); } else { var line = this.g.path( "M" + lineX + " " + lineY + "L" + lineX + " " + (lineY + rectangleHeight) + "M" + (lineX + rectangleWidth / 2) + " " + lineY + "L" + (lineX + rectangleWidth / 2) + " " + (lineY + rectangleHeight) + "M" + (lineX + rectangleWidth) + " " + lineY + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight) ).attr({"stroke-width": this.strokeWidth}); } this.setStroke(originalStroke); }, drawHighLight: function(x, y, width, height){ var originalPaint = this.getPaint(); var originalStroke = this.getStroke(); this.setPaint(HIGHLIGHT_COLOR); this.setStroke(THICK_TASK_BORDER_STROKE); //var c = this.g.rect(x - width/2 - THICK_TASK_BORDER_STROKE, y - height/2 - THICK_TASK_BORDER_STROKE, width + THICK_TASK_BORDER_STROKE*2, height + THICK_TASK_BORDER_STROKE*2, 5); var rect = this.g.rect(x - THICK_TASK_BORDER_STROKE, y - THICK_TASK_BORDER_STROKE, width + THICK_TASK_BORDER_STROKE*2, height + THICK_TASK_BORDER_STROKE*2, TASK_CORNER_ROUND); rect.attr("stroke-width", this.strokeWidth); rect.attr("stroke", this.getPaint()); this.setPaint(originalPaint); this.setStroke(originalStroke); }, highLightActivity: function(activityId){ var shape = this.g.getById(activityId); if (!shape) { console.error("Activity " + activityId + " not found"); return; } var contextObject = shape.data("contextObject"); if (contextObject) console.log("--> highLightActivity: ["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId()); else console.log("--> highLightActivity: ", shape, shape.data("contextObject")); shape.attr("stroke-width", THICK_TASK_BORDER_STROKE); shape.attr("stroke", HIGHLIGHT_COLOR); }, highLightFlow: function(flowId){ var shapeFlow = this.g.getById(flowId); if (!shapeFlow) { console.error("Flow " + flowId + " not found"); return; } var contextObject = shapeFlow.data("contextObject"); if (contextObject) console.log("--> highLightFlow: ["+contextObject.id+"] " + contextObject.flow); //console.log("--> highLightFlow: ", flow.flow, flow.data("set")); var st = shapeFlow.data("set"); st.attr("stroke-width", SEQUENCEFLOW_HIGHLIGHT_STROKE); st.attr("stroke", HIGHLIGHT_COLOR); var withArrowHead = shapeFlow.data("withArrowHead"); if (withArrowHead) st[1].attr("fill", HIGHLIGHT_COLOR); st.forEach(function(el){ //console.log("---->", el); //el.attr("") }); }, _drawClock: function(cx, cy, width, height){ var circle = this.g.ellipse(cx, cy, 1, 1).attr({stroke:"none", fill: Color.get(232, 239, 241)}); //var c = this.g.ellipse(cx, cy, width, height).attr({stroke:"none", fill: Color.red}); //x = cx - width/2; //y = cy - height/2; var clock = this.g.path( /* outer circle */ "M15.5,2.374 C8.251,2.375,2.376,8.251,2.374,15.5 C2.376,22.748,8.251,28.623,15.5,28.627c7.249-0.004,13.124-5.879,13.125-13.127C28.624,8.251,22.749,2.375,15.5,2.374z" + /* inner circle */ "M15.5,26.623 C8.909,26.615,4.385,22.09,4.375,15.5 C4.385,8.909,8.909,4.384,15.5,4.374c4.59,0.01,11.115,3.535,11.124,11.125C26.615,22.09,22.091,26.615,15.5,26.623z" + /* 9 */ "M8.625,15.5c-0.001-0.552-0.448-0.999-1.001-1c-0.553,0-1,0.448-1,1c0,0.553,0.449,1,1,1C8.176,16.5,8.624,16.053,8.625,15.5z" + /* 8 */ "M8.179,18.572c-0.478,0.277-0.642,0.889-0.365,1.367c0.275,0.479,0.889,0.641,1.365,0.365c0.479-0.275,0.643-0.887,0.367-1.367C9.27,18.461,8.658,18.297,8.179,18.572z" + /* 10 */ "M9.18,10.696c-0.479-0.276-1.09-0.112-1.366,0.366s-0.111,1.09,0.365,1.366c0.479,0.276,1.09,0.113,1.367-0.366C9.821,11.584,9.657,10.973,9.18,10.696z" + /* 2 */ "M22.822,12.428c0.478-0.275,0.643-0.888,0.366-1.366c-0.275-0.478-0.89-0.642-1.366-0.366c-0.479,0.278-0.642,0.89-0.366,1.367C21.732,12.54,22.344,12.705,22.822,12.428z" + /* 7 */ "M12.062,21.455c-0.478-0.275-1.089-0.111-1.366,0.367c-0.275,0.479-0.111,1.09,0.366,1.365c0.478,0.277,1.091,0.111,1.365-0.365C12.704,22.344,12.54,21.732,12.062,21.455z" + /* 11 */ "M12.062,9.545c0.479-0.276,0.642-0.888,0.366-1.366c-0.276-0.478-0.888-0.642-1.366-0.366s-0.642,0.888-0.366,1.366C10.973,9.658,11.584,9.822,12.062,9.545z" + /* 4 */ "M22.823,18.572c-0.48-0.275-1.092-0.111-1.367,0.365c-0.275,0.479-0.112,1.092,0.367,1.367c0.477,0.275,1.089,0.113,1.365-0.365C23.464,19.461,23.3,18.848,22.823,18.572z" + /* 2 */ "M19.938,7.813c-0.477-0.276-1.091-0.111-1.365,0.366c-0.275,0.48-0.111,1.091,0.366,1.367s1.089,0.112,1.366-0.366C20.581,8.702,20.418,8.089,19.938,7.813z" + /* 3 */ "M23.378,14.5c-0.554,0.002-1.001,0.45-1.001,1c0.001,0.552,0.448,1,1.001,1c0.551,0,1-0.447,1-1C24.378,14.949,23.929,14.5,23.378,14.5z" + /* arrows */ "M15.501,6.624c-0.552,0-1,0.448-1,1l-0.466,7.343l-3.004,1.96c-0.478,0.277-0.642,0.889-0.365,1.365c0.275,0.479,0.889,0.643,1.365,0.367l3.305-1.676C15.39,16.99,15.444,17,15.501,17c0.828,0,1.5-0.671,1.5-1.5l-0.5-7.876C16.501,7.072,16.053,6.624,15.501,6.624z" + /* 9 */ "M15.501,22.377c-0.552,0-1,0.447-1,1s0.448,1,1,1s1-0.447,1-1S16.053,22.377,15.501,22.377z" + /* 8 */ "M18.939,21.455c-0.479,0.277-0.643,0.889-0.366,1.367c0.275,0.477,0.888,0.643,1.366,0.365c0.478-0.275,0.642-0.889,0.366-1.365C20.028,21.344,19.417,21.18,18.939,21.455z" + ""); clock.attr({fill: Color.black, stroke: "none"}); //clock.transform("t " + (cx-29.75/2) + " " + (cy-29.75/2)); //clock.transform("...s 0.85"); //clock.transform("...s " + .85 + " " + .85); clock.transform("t " + (-2.374) + " " + (-2.374) ); clock.transform("...t -" + (15.5-2.374) + " -" + (15.5-2.374) ); clock.transform("...s " + 1*(width/35) + " " + 1*(height/35)); clock.transform("...T " + cx + " " + cy); //clock.transform("t " + (cx-width/2) + " " + (cy-height/2)); //console.log(".getBBox(): ", clock.getBBox()); //console.log(".attr(): ", c.attrs); circle.attr("rx", clock.getBBox().width/2); circle.attr("ry", clock.getBBox().height/2); //return circle }, _drawPentagon: function(cx, cy, width, height, filled){ // draw GeneralPath (polygon) var n=5; var angle = 2*Math.PI/n; var waypoints = []; for ( var index = 0; index < n; index++ ) { var v = index*angle - Math.PI/2; var point = {}; point.x = -width*1.2/2 + parseInt(Math.round(width*1.2/2)) + parseInt(Math.round((width*1.2/4)*Math.cos(v))); point.y = -height*1.2/2 + parseInt(Math.round(height*1.2/2)) + parseInt(Math.round((height*1.2/4)*Math.sin(v))); waypoints[index] = point; } var polygone = new Polygone(waypoints, this.getStroke()); polygone.element = this.g.path(polygone.path); if (filled) polygone.element.attr("fill", Color.black); else polygone.element.attr("fill", Color.white); polygone.element.transform("s " + 1*(width/35) + " " + 1*(height/35)); polygone.element.transform("...T " + cx + " " + cy); }, //_drawMultilineText: function(text, x, y, boxWidth, boxHeight, textAnchor) { _drawMultilineText: function(text, x, y, boxWidth, boxHeight, verticalAlign, horizontalAlign) { if (!text || text == "") return; // Autostretch boxHeight if boxHeight is 0 if (boxHeight == 0) verticalAlign = MULTILINE_VERTICAL_ALIGN_TOP; //var TEXT_PADDING = 3; var width = boxWidth; if (boxHeight) var height = boxHeight; var layouts = []; //var font = {font: "11px Arial", opacity: 1, "fill": LABEL_COLOR}; var font = this.getFont(); var measurer = new LineBreakMeasurer(this.g, x, y, text, font); var lineHeight = measurer.rafaelTextObject.getBBox().height; //console.log("text: ", text.replace(/\n/g, "?")); if (height) { var availableLinesCount = parseInt(height/lineHeight); //console.log("availableLinesCount: " + availableLinesCount); } var i = 1; while (measurer.getPosition() < measurer.text.getEndIndex()) { var layout = measurer.nextLayout(width); //console.log("LAYOUT: " + layout + ", getPosition: " + measurer.getPosition()); if (layout != null) { // TODO: and check if measurer has next layout. If no then don't draw dots if (!availableLinesCount || i < availableLinesCount) { layouts.push(layout); } else { layouts.push(this.fitTextToWidth(layout + "...", boxWidth)); break; } } i++; }; //console.log(layouts); measurer.rafaelTextObject.attr({"text": layouts.join("\n")}); if (horizontalAlign) measurer.rafaelTextObject.attr({"text-anchor": horizontalAlign}); // end, middle, start var bb = measurer.rafaelTextObject.getBBox(); // TODO: there is somethin wrong with wertical align. May be: measurer.rafaelTextObject.attr({"y": y + height/2 - bb.height/2}) measurer.rafaelTextObject.attr({"y": y + bb.height/2}); //var bb = measurer.rafaelTextObject.getBBox(); if (measurer.rafaelTextObject.attr("text-anchor") == MULTILINE_HORIZONTAL_ALIGN_MIDDLE ) measurer.rafaelTextObject.attr("x", x + boxWidth/2); else if (measurer.rafaelTextObject.attr("text-anchor") == MULTILINE_HORIZONTAL_ALIGN_RIGHT ) measurer.rafaelTextObject.attr("x", x + boxWidth); var boxStyle = {stroke: Color.LightSteelBlue2, "stroke-width": 1.0, "stroke-dasharray": "- "}; //var box = this.g.rect(x+.5, y + .5, width, height).attr(boxStyle); var textAreaCX = x + boxWidth/2; var height = boxHeight; if (!height) height = bb.height; var textAreaCY = y + height/2; var dotLeftTop = this.g.ellipse(x, y, 3, 3).attr({"stroke-width": 0, fill: Color.LightSteelBlue, stroke: "none"}).hide(); var dotCenter = this.g.ellipse(textAreaCX, textAreaCY, 3, 3).attr({fill: Color.LightSteelBlue2, stroke: "none"}).hide(); /* // real bbox var bb = measurer.rafaelTextObject.getBBox(); var rect = paper.rect(bb.x+.5, bb.y + .5, bb.width, bb.height).attr({"stroke-width": 1}); */ var rect = this.g.rect(x, y, boxWidth, height).attr({"stroke-width": 1}).attr(boxStyle).hide(); var debugSet = this.g.set(); debugSet.push(dotLeftTop, dotCenter, rect); //debugSet.show(); }, drawTextAnnotation: function(text, x, y, width, height){ var lineLength = 18; var path = []; path.push(["M", x + lineLength, y]); path.push(["L", x, y]); path.push(["L", x, y + height]); path.push(["L", x + lineLength, y + height]); path.push(["L", x + lineLength, y + height -1]); path.push(["L", x + 1, y + height -1]); path.push(["L", x + 1, y + 1]); path.push(["L", x + lineLength, y + 1]); path.push(["z"]); var textAreaLines = this.g.path(path); var boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); var boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); var boxX = x + width/2 - boxWidth/2; var boxY = y + height/2 - boxHeight/2; // for debug var rectStyle = {stroke: Color(112, 146, 190), "stroke-width": 1.0, "stroke-dasharray": "- "}; var r = this.g.rect(boxX, boxY, boxWidth, boxHeight).attr(rectStyle); // this.drawAnnotationText(text, boxX, boxY, boxWidth, boxHeight); }, drawLabel111111111: function(text, x, y, width, height, labelAttrs){ var debug = false; // text if (text != null && text != undefined && text != "") { var attr = LABEL_FONT; //console.log("x", x, "y", y, "width", width, "height", height ); wrappedText = text; if (labelAttrs && labelAttrs.wrapWidth) { wrappedText = this.wrapTextToWidth(wrappedText, labelAttrs.wrapWidth); } var realWidth = this.getStringWidth(wrappedText, attr); var realHeight = this.getStringHeight(wrappedText, attr); var textAreaCX = x + width/2; var textAreaCY = y + 3 + height + this.getStringHeight(wrappedText, attr)/2; var textX = textAreaCX; var textY = textAreaCY; var textAttrs = {}; if (labelAttrs && labelAttrs.align) { switch (labelAttrs.align) { case "left": textAttrs["text-anchor"] = "start"; textX = textX - realWidth/2; break; case "center": textAttrs["text-anchor"] = "middle"; break; case "right": textAttrs["text-anchor"] = "end"; textX = textX + realWidth/2; break; } } if (labelAttrs && labelAttrs.wrapWidth) { if (true) { // Draw frameborder var textAreaStyle = {stroke: Color.LightSteelBlue2, "stroke-width": 1.0, "stroke-dasharray": "- "}; var textAreaX = textAreaCX - realWidth/2; var textAreaY = textAreaCY+.5 - realHeight/2; var textArea = this.g.rect(textAreaX, textAreaY, realWidth, realHeight).attr(textAreaStyle); var textAreaLines = this.g.path("M" + textAreaX + " " + textAreaY + "L" + (textAreaX+realWidth) + " " + (textAreaY+realHeight) + "M" + + (textAreaX+realWidth) + " " + textAreaY + "L" + textAreaX + " " + (textAreaY+realHeight)); textAreaLines.attr(textAreaStyle); this.g.ellipse(textAreaCX, textAreaCY, 3, 3).attr({fill: Color.LightSteelBlue2, stroke: "none"}); } } var label = this.g.text(textX, textY, wrappedText).attr(attr).attr(textAttrs); //label.id = Raphael.createUUID(); //console.log("label ", label.id, ", ", wrappedText); if (this.fontSmoothing) { label.attr({stroke: LABEL_COLOR, "stroke-width":.4}); } // debug if (debug) { var imageAreaStyle = {stroke: Color.grey61, "stroke-width": 1.0, "stroke-dasharray": "- "}; var imageArea = this.g.rect(x+.5, y+.5, width, height).attr(imageAreaStyle); var imageAreaLines = this.g.path("M" + x + " " + y + "L" + (x+width) + " " + (y+height) + "M" + + (x+width) + " " + y + "L" + x + " " + (y+height)); imageAreaLines.attr(imageAreaStyle); var dotStyle = {fill: Color.Coral, stroke: "none"}; this.g.ellipse(x, y, 3, 3).attr(dotStyle); this.g.ellipse(x+width, y, 2, 2).attr(dotStyle); this.g.ellipse(x+width, y+height, 2, 2).attr(dotStyle); this.g.ellipse(x, y+height, 2, 2).attr(dotStyle); } return label; } }, vvoid: function(){} }; ================================================ FILE: src/main/resources/public/diagram-viewer/js/ProcessDiagramGenerator.js ================================================ /** * Class to generate an image based the diagram interchange information in a * BPMN 2.0 process. * * @author 郑保乐 */ var ProcessDiagramGenerator = { options: {}, processDiagramCanvas: [], activityDrawInstructions:{}, processDiagrams: {}, diagramBreadCrumbs: null, init: function(){ // start event this.activityDrawInstructions["startEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawNoneStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // start timer event this.activityDrawInstructions["startTimerEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawTimerStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; // start event this.activityDrawInstructions["messageStartEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawMessageStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; // start signal event this.activityDrawInstructions["startSignalEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawSignalStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; // start multiple event this.activityDrawInstructions["startMultipleEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawMultipleStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; // signal catch this.activityDrawInstructions["intermediateSignalCatch"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // message catch this.activityDrawInstructions["intermediateMessageCatch"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // multiple catch this.activityDrawInstructions["intermediateMultipleCatch"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingMultipleEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // signal throw this.activityDrawInstructions["intermediateSignalThrow"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawThrowingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // message throw this.activityDrawInstructions["intermediateMessageThrow"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawThrowingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // multiple throw this.activityDrawInstructions["intermediateMultipleThrow"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawThrowingMultipleEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // none throw this.activityDrawInstructions["intermediateThrowEvent"] = function() { var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawThrowingNoneEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // end event this.activityDrawInstructions["endEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawNoneEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // error end event this.activityDrawInstructions["errorEndEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawErrorEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // message end event this.activityDrawInstructions["messageEndEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawMessageEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // signal end event this.activityDrawInstructions["signalEndEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawSignalEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // multiple end event this.activityDrawInstructions["multipleEndEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawMultipleEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // terminate end event this.activityDrawInstructions["terminateEndEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawTerminateEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // error start event this.activityDrawInstructions["errorStartEvent"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawErrorStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // task this.activityDrawInstructions["task"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); // TODO: //console.error("task is not implemented yet"); /* var activityImpl = this; processDiagramCanvas.drawTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), thickBorder); */ }; // user task this.activityDrawInstructions["userTask"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawUserTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // script task this.activityDrawInstructions["scriptTask"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawScriptTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // service task this.activityDrawInstructions["serviceTask"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawServiceTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // receive task this.activityDrawInstructions["receiveTask"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawReceiveTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // send task this.activityDrawInstructions["sendTask"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawSendTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // manual task this.activityDrawInstructions["manualTask"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawManualTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // businessRuleTask task this.activityDrawInstructions["businessRuleTask"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawBusinessRuleTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // exclusive gateway this.activityDrawInstructions["exclusiveGateway"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawExclusiveGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // inclusive gateway this.activityDrawInstructions["inclusiveGateway"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawInclusiveGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // parallel gateway this.activityDrawInstructions["parallelGateway"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawParallelGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // eventBasedGateway this.activityDrawInstructions["eventBasedGateway"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawEventBasedGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; // Boundary timer this.activityDrawInstructions["boundaryTimer"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingTimerEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // Boundary catch error this.activityDrawInstructions["boundaryError"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingErrorEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // Boundary signal event this.activityDrawInstructions["boundarySignal"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // Boundary message event this.activityDrawInstructions["boundaryMessage"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = activityImpl.getProperty("isInterrupting"); processDiagramCanvas.drawCatchingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); if (label) processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); }; // timer catch event this.activityDrawInstructions["intermediateTimer"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); var isInterrupting = null; processDiagramCanvas.drawCatchingTimerEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); }; // subprocess this.activityDrawInstructions["subProcess"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; // TODO: processDiagramCanvas.setConextObject(activityImpl); var isExpanded = activityImpl.getProperty("isExpanded"); var isTriggeredByEvent = activityImpl.getProperty("triggeredByEvent"); if(isTriggeredByEvent == undefined) { isTriggeredByEvent = true; } // TODO: check why isTriggeredByEvent = true when undefined isTriggeredByEvent = false; if (isExpanded != undefined && isExpanded == false) { processDiagramCanvas.drawCollapsedSubProcess(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent); } else { processDiagramCanvas.drawExpandedSubProcess(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent); } //console.error("subProcess is not implemented yet"); }; // call activity this.activityDrawInstructions["callActivity"] = function(){ var activityImpl = this.activity; var processDiagramCanvas = this.processDiagramCanvas; processDiagramCanvas.setConextObject(activityImpl); processDiagramCanvas.drawCollapsedCallActivity(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); }; $(document).ready(function(){ // Protect right click on SVG elements (and on canvas too) document.body.oncontextmenu = function(event) { if (window.event.srcElement.tagName == "shape" || window.event.srcElement.tagName == "DIV" && window.event.srcElement.parentElement.className == "diagram") { // IE DIAGRAM CANVAS OR SHAPE DETECTED! return false; } return (!Object.isSVGElement(window.event.srcElement)); }; }); }, getActivitiLabel:function(activityImpl){ /* TODO: Label object should be in activityImpl and looks like: { x: 250, y: 250, width: 80, height: 30 } And then: if (!activityImpl.label) return null; var label = activityImpl.label; label.text = activityImpl.name; return label; */ // But now default label for all events is: return { text: activityImpl.getProperty("name"), x: activityImpl.getX() + .5 + activityImpl.getWidth()/2, y: activityImpl.getY() + .5 + activityImpl.getHeight() + ICON_PADDING, width: 100, height: 0 }; }, generateDiagram: function(processDefinitionDiagramLayout){ // Init canvas var processDefinitionId = processDefinitionDiagramLayout.processDefinition.id; //console.log("Init canvas ", processDefinitionId); if (this.getProcessDiagram(processDefinitionId) != undefined) { // TODO: may be reset canvas if exists.. Or just show //console.log("ProcessDiagram '" + processDefinitionId + "' is already generated. Just show it."); return; } var processDiagram = this.initProcessDiagramCanvas(processDefinitionDiagramLayout); var processDiagramCanvas = processDiagram.diagramCanvas; // Draw pool shape, if process is participant in collaboration if(processDefinitionDiagramLayout.participantProcess != undefined) { //console.log("Draw pool shape"); var pProc = processDefinitionDiagramLayout.participantProcess; processDiagramCanvas.drawPoolOrLane(pProc.x, pProc.y, pProc.width, pProc.height, pProc.name); } var laneSets = processDefinitionDiagramLayout.laneSets; var activities = processDefinitionDiagramLayout.activities; var sequenceFlows = processDefinitionDiagramLayout.sequenceFlows; pb1.set('value', 0); var cnt = 0; if (laneSets) for(var i in laneSets) { cnt += laneSets[i].lanes.length; } if (activities) cnt += activities.length; if (sequenceFlows) cnt += sequenceFlows.length; var step = (cnt>0)? 100/cnt : 0; var progress = 0; //console.log("progress bar step: ", step); var task1 = new $.AsyncQueue(); // Draw lanes task1.add(function (task1) { if (!laneSets) laneSets = []; //console.log("> draw lane sets, count:", laneSets.length) }); for(var i in laneSets) { var laneSet = laneSets[i]; //laneSet.id, laneSet.name task1.add(laneSet.lanes,function (task1, lane) { progress += step; pb1.set('value', parseInt(progress)); //console.log("--> laneId: " + lane.name + ", name: " + lane.name); processDiagramCanvas.drawPoolOrLane(lane.x, lane.y, lane.width, lane.height, lane.name); }); } // Draw activities task1.add(function (task1) { if (!activities) activities = []; //console.log("> draw activities, count:", activities.length) }); var activitiesLength = activities.length; task1.add(activities,function (task1, activityJson) { var activity = new ActivityImpl(activityJson); activitiesLength --; progress += step; pb1.set('value', parseInt(progress)); //console.log(activitiesLength, "--> activityId: " + activity.getId() + ", name: " + activity.getProperty("name")); ProcessDiagramGenerator.drawActivity(processDiagramCanvas, activity); }); // Draw sequence-flows task1.add(function (task1) { if (!sequenceFlows) sequenceFlows = []; //console.log("> draw sequence flows, count:", sequenceFlows.length) }); var flowsLength = sequenceFlows.length; task1.add(sequenceFlows,function (task1, flow) { var waypoints = []; for(var j in flow.xPointArray) { waypoints[j] = {x: flow.xPointArray[j], y: flow.yPointArray[j]}; } var isDefault = flow.isDefault; var isConditional = flow.isConditional; var isHighLighted = flow.isHighLighted; // TODO: add source and destination for sequence flows in REST // parse for test var f = flow.flow; var matches = f.match(/\((.*)\)--.*-->\((.*)\)/); var sourceActivityId, destinationActivityId; if (matches != null) { sourceActivityId = matches[1]; destinationActivityId = matches[2]; } flow.sourceActivityId = sourceActivityId; flow.destinationActivityId = destinationActivityId; // flowsLength--; progress += step; pb1.set('value', parseInt(progress)); //console.log(flowsLength, "--> flow: " + flow.flow); processDiagramCanvas.setConextObject(flow); processDiagramCanvas.drawSequenceflow(waypoints, isConditional, isDefault, isHighLighted); }); task1.onComplete(function(){ if (progress<100) pb1.set('value', 100); //console.log("COMPLETE!!!"); //console.timeEnd('generateDiagram'); }); task1.run(); }, getProcessDiagram: function (processDefinitionId) { return this.processDiagrams[processDefinitionId]; }, initProcessDiagramCanvas: function (processDefinitionDiagramLayout) { var minX = 0; var maxX = 0; var minY = 0; var maxY = 0; if(processDefinitionDiagramLayout.participantProcess != undefined) { var pProc = processDefinitionDiagramLayout.participantProcess; minX = pProc.x; maxX = pProc.x + pProc.width; minY = pProc.y; maxY = pProc.y + pProc.height; } var activities = processDefinitionDiagramLayout.activities; for(var i in activities) { var activityJson = activities[i]; var activity = new ActivityImpl(activityJson); // width if (activity.getX() + activity.getWidth() > maxX) { maxX = activity.getX() + activity.getWidth(); } if (activity.getX() < minX) { minX = activity.getX(); } // height if (activity.getY() + activity.getHeight() > maxY) { maxY = activity.getY() + activity.getHeight(); } if (activity.getY() < minY) { minY = activity.getY(); } } var sequenceFlows = processDefinitionDiagramLayout.sequenceFlows; for(var i in sequenceFlows) { var flow = sequenceFlows[i]; var waypoints = []; for(var j in flow.xPointArray) { waypoints[j] = {x: flow.xPointArray[j], y: flow.yPointArray[j]}; // width if (waypoints[j].x > maxX) { maxX = waypoints[j].x; } if (waypoints[j].x < minX) { minX = waypoints[j].x; } // height if (waypoints[j].y > maxY) { maxY = waypoints[j].y; } if (waypoints[j].y < minY) { minY = waypoints[j].y; } } } var laneSets = processDefinitionDiagramLayout.laneSets; for(var i in laneSets) { var laneSet = laneSets[i]; //laneSet.id, laneSet.name for(var j in laneSet.lanes) { var lane = laneSet.lanes[j]; // width if (lane.x + lane.width > maxX) { maxX = lane.x + lane.width; } if (lane.x < minX) { minX = lane.x; } // height if (lane.y + lane.height > maxY) { maxY = lane.y + lane.height; } if (lane.y < minY) { minY = lane.y; } } } var diagramCanvas = new ProcessDiagramCanvas(); if (diagramCanvas) { // create div in diagramHolder var diagramHolder = document.getElementById(this.options.diagramHolderId); if (!diagramHolder) throw {msg: "Diagram holder not found", error: "diagramHolderNotFound"}; var div = document.createElement("DIV"); div.id = processDefinitionDiagramLayout.processDefinition.id; div.className = "diagram"; diagramHolder.appendChild(div); diagramCanvas.init(maxX + 20, maxY + 20, processDefinitionDiagramLayout.processDefinition.id); this.processDiagrams[processDefinitionDiagramLayout.processDefinition.id] = { processDefinitionDiagramLayout: processDefinitionDiagramLayout, diagramCanvas: diagramCanvas }; } return this.getProcessDiagram(processDefinitionDiagramLayout.processDefinition.id); //return new DefaultProcessDiagramCanvas(maxX + 10, maxY + 10, minX, minY); }, drawActivity: function(processDiagramCanvas, activity, highLightedActivities) { var type = activity.getProperty("type"); var drawInstruction = this.activityDrawInstructions[type]; if (drawInstruction != null) { drawInstruction.apply({processDiagramCanvas:processDiagramCanvas, activity:activity}); } else { //console.error("no drawInstruction for " + type + ": ", activity); } // Actually draw the markers if (activity.getProperty("multiInstance") != undefined || activity.getProperty("collapsed") != undefined) { //console.log(activity.getProperty("name"), activity.properties); var multiInstanceSequential = (activity.getProperty("multiInstance") == "sequential"); var multiInstanceParallel = (activity.getProperty("multiInstance") == "parrallel"); var collapsed = activity.getProperty("collapsed"); processDiagramCanvas.drawActivityMarkers(activity.getX(), activity.getY(), activity.getWidth(), activity.getHeight(), multiInstanceSequential, multiInstanceParallel, collapsed); } /* processDiagramCanvas.drawActivityMarkers(activity.getX(), activity.getY(), activity.getWidth(), activity.getHeight(), multiInstanceSequential, multiInstanceParallel, collapsed); */ // TODO: Draw highlighted activities if they are present }, setHighLights: function(highLights){ if (highLights.processDefinitionId == undefined) { //console.error("Process instance " + highLights.processInstanceId + " doesn't exist"); return; } var processDiagram = this.getProcessDiagram(highLights.processDefinitionId); if (processDiagram == undefined) { //console.error("Process diagram " + highLights.processDefinitionId + " not found"); return; } var processDiagramCanvas = processDiagram.diagramCanvas; // TODO: remove highLightes from all activities before set new highLight for (var i in highLights.activities) { var activityId = highLights.activities[i]; processDiagramCanvas.highLightActivity(activityId); } // TODO: remove highLightes from all flows before set new highLight for (var i in highLights.flows) { var flowId = highLights.flows[i]; var object = processDiagramCanvas.g.getById(flowId); var flow = object.data("contextObject"); flow.isHighLighted = true; processDiagramCanvas.highLightFlow(flowId); } }, drawHighLights: function(processInstanceId) { // Load highLights for the processInstanceId /* var url = Lang.sub(this.options.processInstanceHighLightsUrl, {processInstanceId: processInstanceId}); $.ajax({ url: url, type: 'GET', dataType: 'json', cache: false, async: true, }).done(function(data) { var highLights = data; if (!highLights) { console.log("highLights not found"); return; } console.log("highLights[" + highLights.processDefinitionId + "][" + processInstanceId + "]: ", highLights); ProcessDiagramGenerator.setHighLights(highLights); }).fail(function(jqXHR, textStatus){ console.log('Get HighLights['+processDefinitionId+'] failure: ', textStatus, jqXHR); }); */ // ���������ʵ����ʱ���׳��쳣���⡣ var url = Lang.sub(ActivitiRest.options.processInstanceUrl, {processInstanceId: processInstanceId}); var _drawHighLights = this._drawHighLights; $.ajax({ url: url, type: 'GET', dataType: 'json', cache: false, async: true, }).done(function(data) { ActivitiRest.getHighLights(processInstanceId, _drawHighLights); }).fail(function(jqXHR, textStatus){ console.log('Get HighLights['+processInstanceId+'] failure: ', textStatus, jqXHR); }); //ActivitiRest.getHighLights(processInstanceId, this._drawHighLights); }, _drawHighLights: function() { var highLights = this.highLights; ProcessDiagramGenerator.setHighLights(highLights); }, // Load processDefinition drawDiagram: function(processDefinitionId) { // Hide all diagrams var diagrams = $("#" + this.options.diagramHolderId + " div.diagram"); diagrams.addClass("hidden"); // If processDefinitionId doesn't contain ":" then it's a "processDefinitionKey", not an id. // Get process definition by key if (processDefinitionId.indexOf(":") < 0) { ActivitiRest.getProcessDefinitionByKey(processDefinitionId, this._drawDiagram); } else { this._drawDiagram.apply({processDefinitionId: processDefinitionId}); } }, _drawDiagram: function() { var processDefinitionId = this.processDefinitionId; ProcessDiagramGenerator.addBreadCrumbsItem(processDefinitionId); // Check if processDefinition is already loaded and rendered var processDiagram = ProcessDiagramGenerator.getProcessDiagram(processDefinitionId); if (processDiagram != undefined && processDiagram != null) { //console.log("Process diagram " + processDefinitionId + " is already loaded"); //return; var diagram = document.getElementById(processDefinitionId); $(diagram).removeClass("hidden"); // Regenerate image var processDefinitionDiagramLayout = processDiagram.processDefinitionDiagramLayout; ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); return; } //console.time('loadDiagram'); // Load processDefinition ActivitiRest.getProcessDefinition(processDefinitionId, ProcessDiagramGenerator._generateDiagram); }, _generateDiagram: function() { var processDefinitionDiagramLayout = this.processDefinitionDiagramLayout; //console.log("process-definition-diagram-layout["+processDefinitionDiagramLayout.processDefinition.id+"]: ", processDefinitionDiagramLayout); //console.timeEnd('loadDiagram'); //console.time('generateDiagram'); pb1.set('value', 0); ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); }, getProcessDefinitionByKey: function(processDefinitionKey) { var url = Lang.sub(this.options.processDefinitionByKeyUrl, {processDefinitionKey: processDefinitionKey}); var processDefinition; $.ajax({ url: url, type: 'POST', dataType: 'json', cache: false, async: false }).done(function(data) { //console.log("ajax returned data"); //console.log("ajax returned data:", data); processDefinition = data; if (!processDefinition) { //console.error("Process definition '" + processDefinitionKey + "' not found"); } }).fail(function(jqXHR, textStatus){ //console.error('Get diagram layout['+processDefinitionKey+'] failure: ', textStatus, jqXHR); }); if (processDefinition) { //console.log("Get process definition by key '" + processDefinitionKey + "': ", processDefinition.id); return processDefinition; } else { return null; } }, addBreadCrumbsItem: function(processDefinitionId){ var TPL_UL_CONTAINER = '
    ', TPL_LI_CONTAINER = '
  • {name}
  • '; if (!this.diagramBreadCrumbs) this.diagramBreadCrumbs = $("#" + this.options.diagramBreadCrumbsId); if (!this.diagramBreadCrumbs) return; var ul = this.diagramBreadCrumbs.find("ul"); //console.log("ul: ", ul); if (ul.size() == 0) { ul = $(TPL_UL_CONTAINER); this.diagramBreadCrumbs.append(ul); } var liListOld = ul.find("li"); //console.warn("liListOld", liListOld); // TODO: if there is any items after current then remove that before adding new item (m.b. it is a duplicate) var currentBreadCrumbsItemId = this.currentBreadCrumbsItemId; found = false; liListOld.each( function(index, item) { //console.warn("item:", $(this)); if (!found && currentBreadCrumbsItemId == $(this).attr("id")) { found = true; return; } if (found) { //console.warn("remove ", $(this).attr("id")); $(this).remove(); } } ); var liListNew = ul.find("li"); //console.log("liListNew size: ", liListNew.size()); var values = { id: 'breadCrumbsItem_' + liListNew.size(), processDefinitionId: processDefinitionId, name: processDefinitionId }; var tpl = Lang.sub(TPL_LI_CONTAINER, values); //console.log("tpl: ", tpl); ul.append(tpl); var li = ul.find("#" + values.id); //console.warn("li:", li); $('#' + values.id).on('click', this._breadCrumbsItemClick); ul.find("li").removeClass("selected"); li.attr("num", liListNew.size()); li.addClass("selected"); this.currentBreadCrumbsItemId = li.attr("id"); }, _breadCrumbsItemClick: function(){ var li = $(this), id = li.attr("id"), processDefinitionId = li.attr("processDefinitionId"); //console.warn("_breadCrumbsItemClick: ", id, ", processDefinitionId: ", processDefinitionId); var ul = ProcessDiagramGenerator.diagramBreadCrumbs.one("ul"); ul.find("li").removeClass("selected"); li.addClass("selected"); ProcessDiagramGenerator.currentBreadCrumbsItemId = li.attr("id"); // Hide all diagrams var diagrams = $("#"+ProcessDiagramGenerator.options.diagramHolderId+" div.diagram"); diagrams.addClass("hidden"); var processDiagram = ProcessDiagramGenerator.getProcessDiagram(processDefinitionId); var diagram = document.getElementById(processDefinitionId); if (!diagram) return; $(diagram).removeClass("hidden"); // Regenerate image var processDefinitionDiagramLayout = processDiagram.processDefinitionDiagramLayout; ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); }, showFlowInfo: function(flow){ var diagramInfo = $("#" + this.options.diagramInfoId); if (!diagramInfo) return; var values = { flow: flow.flow, isDefault: (flow.isDefault)? "true":"", isConditional: (flow.isConditional)? "true":"", isHighLighted: (flow.isHighLighted)? "true":"", sourceActivityId: flow.sourceActivityId, destinationActivityId: flow.destinationActivityId }; var TPL_FLOW_INFO = '
    {flow}
    ' + '
    sourceActivityId: {sourceActivityId}
    ' + '
    destinationActivityId: {destinationActivityId}
    ' + '
    isDefault: {isDefault}
    ' + '
    isConditional: {isConditional}
    ' + '
    isHighLighted: {isHighLighted}
    '; var tpl = Lang.sub(TPL_FLOW_INFO, values); //console.log("info: ", tpl); diagramInfo.html(tpl); }, showActivityInfo: function(activity){ var diagramInfo = $("#" + this.options.diagramInfoId); if (!diagramInfo) return; var values = { activityId: activity.getId(), name: activity.getProperty("name"), type: activity.getProperty("type") }; var TPL_ACTIVITY_INFO = '' + '
    activityId: {activityId}
    ' + '
    name: {name}
    ' + '
    type: {type}
    '; var TPL_CALLACTIVITY_INFO = '' + '
    collapsed: {collapsed}
    ' + '
    processDefinitonKey: {processDefinitonKey}
    '; var template = TPL_ACTIVITY_INFO; if (activity.getProperty("type") == "callActivity") { values.collapsed = activity.getProperty("collapsed"); values.processDefinitonKey = activity.getProperty("processDefinitonKey"); template += TPL_CALLACTIVITY_INFO; } else if (activity.getProperty("type") == "callActivity") { } var tpl = Lang.sub(template, values); //console.log("info: ", tpl); diagramInfo.html(tpl); }, hideInfo: function(){ var diagramInfo = $("#" + this.options.diagramInfoId); if (!diagramInfo) return; diagramInfo.html(""); }, vvoid: function(){} }; var Lang = { SUBREGEX: /\{\s*([^\|\}]+?)\s*(?:\|([^\}]*))?\s*\}/g, UNDEFINED: 'undefined', isUndefined: function(o) { return typeof o === Lang.UNDEFINED; }, sub: function(s, o) { return ((s.replace) ? s.replace(Lang.SUBREGEX, function(match, key) { return (!Lang.isUndefined(o[key])) ? o[key] : match; }) : s); } }; if (Lang.isUndefined(console)) { console = { log: function() {}, warn: function() {}, error: function() {}}; } ProcessDiagramGenerator.init(); ================================================ FILE: src/main/resources/public/diagram-viewer/js/jquery/jquery.asyncqueue.js ================================================ /* * This file is part of the jquery plugin "asyncQueue". * * (c) Sebastien Roch * @author 郑保乐 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ (function($){ $.AsyncQueue = function() { var that = this, queue = [], completeFunc, failureFunc, paused = false, lastCallbackData, _run, _complete, inQueue = 0, defaultTimeOut = 10; _run = function() { var f = queue.shift(); if (f) { inQueue++; setTimeout(function(){ f.fn.apply(that, [that]); if (!f.isParallel) if (paused === false) { _run(); } inQueue --; if (inQueue == 0 && queue.length == 0) _complete(); }, f.timeOut); if (f.isParallel) if (paused === false) { _run(); } } }; _complete = function(){ if (completeFunc) completeFunc.apply(that, [that]); }; this.onComplete = function(func) { completeFunc = func; }; this.onFailure = function(func) { failureFunc = func; }; this.add = function(func) { // TODO: add callback for queue[i] complete var obj = arguments[0]; if (obj && Object.prototype.toString.call(obj) === "[object Array]") { var fn = arguments[1]; var timeOut = (typeof(arguments[2]) != "undefined")? arguments[2] : defaultTimeOut; if (typeof(fn) == "function") { for(var i = 0; i < obj.length; i++) { var f = function(objx){ queue.push({isParallel: true, fn: function(){fn.apply(that, [that, objx]);}, timeOut: timeOut}); }(obj[i]) } } } else { var fn = arguments[0]; var timeOut = (typeof(arguments[1]) != "undefined")? arguments[2] : defaultTimeOut; queue.push({isParallel: false, fn: func, timeOut: timeOut}); } return this; }; this.addParallel = function(func, timeOut) { // TODO: add callback for queue[i] complete queue.push({isParallel: true, fn: func, timeOut: timeOut}); return this; }; this.storeData = function(dataObject) { lastCallbackData = dataObject; return this; }; this.lastCallbackData = function () { return lastCallbackData; }; this.run = function() { paused = false; _run(); }; this.pause = function () { paused = true; return this; }; this.failure = function() { paused = true; if (failureFunc) { var args = [that]; for(i = 0; i < arguments.length; i++) { args.push(arguments[i]); } failureFunc.apply(that, args); } }; this.size = function(){ return queue.length; }; return this; } })(jQuery); ================================================ FILE: src/main/resources/public/diagram-viewer/js/jquery/jquery.js ================================================ /*! * jQuery JavaScript Library v1.7.1 * http://jquery.com/ * * Copyright 2011, John Resig * Dual licensed under the MIT or GPL Version 2 licenses. * http://jquery.org/license * * Includes Sizzle.js * http://sizzlejs.com/ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * * Date: Mon Nov 21 21:11:03 2011 -0500 */ (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document, navigator = window.navigator, location = window.location; var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' return new jQuery.fn.init( selector, context, rootjQuery ); }, // Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$, // A central reference to the root jQuery(document) rootjQuery, // A simple way to check for HTML strings or ID strings // Prioritize #id over to avoid XSS via location.hash (#9521) quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, // Check if a string has a non-whitespace character in it rnotwhite = /\S/, // Used for trimming whitespace trimLeft = /^\s+/, trimRight = /\s+$/, // Match a standalone tag rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, // JSON RegExp rvalidchars = /^[\],:{}\s]*$/, rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, // Useragent RegExp rwebkit = /(webkit)[ \/]([\w.]+)/, ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, rmsie = /(msie) ([\w.]+)/, rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, // Matches dashed string for camelizing rdashAlpha = /-([a-z]|[0-9])/ig, rmsPrefix = /^-ms-/, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return ( letter + "" ).toUpperCase(); }, // Keep a UserAgent string for use with jQuery.browser userAgent = navigator.userAgent, // For matching the engine and version of the browser browserMatch, // The deferred used on DOM ready readyList, // The ready event handler DOMContentLoaded, // Save a reference to some core methods toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, push = Array.prototype.push, slice = Array.prototype.slice, trim = String.prototype.trim, indexOf = Array.prototype.indexOf, // [[Class]] -> type pairs class2type = {}; jQuery.fn = jQuery.prototype = { constructor: jQuery, init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(""), $(null), or $(undefined) if ( !selector ) { return this; } // Handle $(DOMElement) if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; } // The body element only exists once, optimize finding it if ( selector === "body" && !context && document.body ) { this.context = document; this[0] = document.body; this.selector = selector; this.length = 1; return this; } // Handle HTML strings if ( typeof selector === "string" ) { // Are we dealing with HTML string or an ID? if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = quickExpr.exec( selector ); } // Verify a match, and that no context was specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; doc = ( context ? context.ownerDocument || context : document ); // If a single string is passed in and it's a single tag // just do a createElement and skip the rest ret = rsingleTag.exec( selector ); if ( ret ) { if ( jQuery.isPlainObject( context ) ) { selector = [ document.createElement( ret[1] ) ]; jQuery.fn.attr.call( selector, context, true ); } else { selector = [ doc.createElement( ret[1] ) ]; } } else { ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; } return jQuery.merge( this, selector ); // HANDLE: $("#id") } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return rootjQuery.ready( selector ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }, // Start with an empty selector selector: "", // The current version of jQuery being used jquery: "1.7.1", // The default length of a jQuery object is 0 length: 0, // The number of elements contained in the matched element set size: function() { return this.length; }, toArray: function() { return slice.call( this, 0 ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num == null ? // Return a 'clean' array this.toArray() : // Return just the object ( num < 0 ? this[ this.length + num ] : this[ num ] ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems, name, selector ) { // Build a new jQuery matched element set var ret = this.constructor(); if ( jQuery.isArray( elems ) ) { push.apply( ret, elems ); } else { jQuery.merge( ret, elems ); } // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; if ( name === "find" ) { ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; } else if ( name ) { ret.selector = this.selector + "." + name + "(" + selector + ")"; } // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, ready: function( fn ) { // Attach the listeners jQuery.bindReady(); // Add the callback readyList.add( fn ); return this; }, eq: function( i ) { i = +i; return i === -1 ? this.slice( i ) : this.slice( i, i + 1 ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, slice: function() { return this.pushStack( slice.apply( this, arguments ), "slice", slice.call(arguments).join(",") ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: [].sort, splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; target = arguments[1] || {}; // skip the boolean and the target i = 2; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( length === i ) { target = this; --i; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }, // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Either a released hold or an DOMready/load event and not yet ready if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.fireWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.trigger ) { jQuery( document ).trigger( "ready" ).off( "ready" ); } } }, bindReady: function() { if ( readyList ) { return; } readyList = jQuery.Callbacks( "once memory" ); // Catch cases where $(document).ready() is called after the // browser event has already occurred. if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready return setTimeout( jQuery.ready, 1 ); } // Mozilla, Opera and webkit nightlies currently support this event if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", jQuery.ready, false ); // If IE event model is used } else if ( document.attachEvent ) { // ensure firing before onload, // maybe late but safe also for iframes document.attachEvent( "onreadystatechange", DOMContentLoaded ); // A fallback to window.onload, that will always work window.attachEvent( "onload", jQuery.ready ); // If IE and not a frame // continually check to see if the document is ready var toplevel = false; try { toplevel = window.frameElement == null; } catch(e) {} if ( document.documentElement.doScroll && toplevel ) { doScrollCheck(); } } }, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, // A crude way of determining if an object is a window isWindow: function( obj ) { return obj && typeof obj === "object" && "setInterval" in obj; }, isNumeric: function( obj ) { return !isNaN( parseFloat(obj) ) && isFinite( obj ); }, type: function( obj ) { return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object"; }, isPlainObject: function( obj ) { // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. var key; for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, isEmptyObject: function( obj ) { for ( var name in obj ) { return false; } return true; }, error: function( msg ) { throw new Error( msg ); }, parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can't handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); } // Make sure the incoming data is actual JSON // Logic borrowed from http://json.org/json2.js if ( rvalidchars.test( data.replace( rvalidescape, "@" ) .replace( rvalidtokens, "]" ) .replace( rvalidbraces, "")) ) { return ( new Function( "return " + data ) )(); } jQuery.error( "Invalid JSON: " + data ); }, // Cross-browser xml parsing parseXML: function( data ) { var xml, tmp; try { if ( window.DOMParser ) { // Standard tmp = new DOMParser(); xml = tmp.parseFromString( data , "text/xml" ); } else { // IE xml = new ActiveXObject( "Microsoft.XMLDOM" ); xml.async = "false"; xml.loadXML( data ); } } catch( e ) { xml = undefined; } if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { jQuery.error( "Invalid XML: " + data ); } return xml; }, noop: function() {}, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && rnotwhite.test( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); }, // args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.apply( object[ i++ ], args ) === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; }, // Use native String.trim function wherever possible trim: trim ? function( text ) { return text == null ? "" : trim.call( text ); } : // Otherwise use our own trimming functionality function( text ) { return text == null ? "" : text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); }, // results is for internal usage only makeArray: function( array, results ) { var ret = results || []; if ( array != null ) { // The window, strings (and functions) also have 'length' // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 var type = jQuery.type( array ); if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { push.call( ret, array ); } else { jQuery.merge( ret, array ); } } return ret; }, inArray: function( elem, array, i ) { var len; if ( array ) { if ( indexOf ) { return indexOf.call( array, elem, i ); } len = array.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in array && array[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var i = first.length, j = 0; if ( typeof second.length === "number" ) { for ( var l = second.length; j < l; j++ ) { first[ i++ ] = second[ j ]; } } else { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, key, ret = [], i = 0, length = elems.length, // jquery objects are treated as arrays isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; // Go through the array, translating each of the items to their if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret[ ret.length ] = value; } } // Go through every key on the object, } else { for ( key in elems ) { value = callback( elems[ key ], key, arg ); if ( value != null ) { ret[ ret.length ] = value; } } } // Flatten any nested arrays return ret.concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { if ( typeof context === "string" ) { var tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind var args = slice.call( arguments, 2 ), proxy = function() { return fn.apply( context, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; return proxy; }, // Mutifunctional method to get and set values to a collection // The value/s can optionally be executed if it's a function access: function( elems, key, value, exec, fn, pass ) { var length = elems.length; // Setting many attributes if ( typeof key === "object" ) { for ( var k in key ) { jQuery.access( elems, k, key[k], exec, fn, value ); } return elems; } // Setting one attribute if ( value !== undefined ) { // Optionally, function values get executed if exec is true exec = !pass && exec && jQuery.isFunction(value); for ( var i = 0; i < length; i++ ) { fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } return elems; } // Getting an attribute return length ? fn( elems[0], key ) : undefined; }, now: function() { return ( new Date() ).getTime(); }, // Use of jQuery.browser is frowned upon. // More details: http://docs.jquery.com/Utilities/jQuery.browser uaMatch: function( ua ) { ua = ua.toLowerCase(); var match = rwebkit.exec( ua ) || ropera.exec( ua ) || rmsie.exec( ua ) || ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || []; return { browser: match[1] || "", version: match[2] || "0" }; }, sub: function() { function jQuerySub( selector, context ) { return new jQuerySub.fn.init( selector, context ); } jQuery.extend( true, jQuerySub, this ); jQuerySub.superclass = this; jQuerySub.fn = jQuerySub.prototype = this(); jQuerySub.fn.constructor = jQuerySub; jQuerySub.sub = this.sub; jQuerySub.fn.init = function init( selector, context ) { if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { context = jQuerySub( context ); } return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); }; jQuerySub.fn.init.prototype = jQuerySub.fn; var rootjQuerySub = jQuerySub(document); return jQuerySub; }, browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { jQuery.browser[ browserMatch.browser ] = true; jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { trimLeft = /^[\s\xA0]+/; trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these rootjQuery = jQuery(document); // Cleanup functions for the document ready method if ( document.addEventListener ) { DOMContentLoaded = function() { document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); jQuery.ready(); }; } else if ( document.attachEvent ) { DOMContentLoaded = function() { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( document.readyState === "complete" ) { document.detachEvent( "onreadystatechange", DOMContentLoaded ); jQuery.ready(); } }; } // The DOM ready check for Internet Explorer function doScrollCheck() { if ( jQuery.isReady ) { return; } try { // If IE is used, use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ document.documentElement.doScroll("left"); } catch(e) { setTimeout( doScrollCheck, 1 ); return; } // and execute any waiting functions jQuery.ready(); } return jQuery; })(); // String to Object flags format cache var flagsCache = {}; // Convert String-formatted flags into Object-formatted ones and store in cache function createFlags( flags ) { var object = flagsCache[ flags ] = {}, i, length; flags = flags.split( /\s+/ ); for ( i = 0, length = flags.length; i < length; i++ ) { object[ flags[i] ] = true; } return object; } /* * Create a callback list using the following parameters: * * flags: an optional list of space-separated flags that will change how * the callback list behaves * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible flags: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // (we check in cache first) flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; var // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = [], // Last fire value (for non-forgettable lists) memory, // Flag to know if list is currently firing firing, // First callback to fire (used internally by add and fireWith) firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // Add one or several callbacks to the list add = function( args ) { var i, length, elem, type, actual; for ( i = 0, length = args.length; i < length; i++ ) { elem = args[ i ]; type = jQuery.type( elem ); if ( type === "array" ) { // Inspect recursively add( elem ); } else if ( type === "function" ) { // Add if not in unique mode and callback is not in if ( !flags.unique || !self.has( elem ) ) { list.push( elem ); } } } }, // Fire callbacks fire = function( context, args ) { args = args || []; memory = !flags.memory || [ context, args ]; firing = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { memory = true; // Mark as halted break; } } firing = false; if ( list ) { if ( !flags.once ) { if ( stack && stack.length ) { memory = stack.shift(); self.fireWith( memory[ 0 ], memory[ 1 ] ); } } else if ( memory === true ) { self.disable(); } else { list = []; } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { var length = list.length; add( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away, unless previous // firing was halted (stopOnFalse) } else if ( memory && memory !== true ) { firingStart = length; fire( memory[ 0 ], memory[ 1 ] ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { var args = arguments, argIndex = 0, argLength = args.length; for ( ; argIndex < argLength ; argIndex++ ) { for ( var i = 0; i < list.length; i++ ) { if ( args[ argIndex ] === list[ i ] ) { // Handle firingIndex and firingLength if ( firing ) { if ( i <= firingLength ) { firingLength--; if ( i <= firingIndex ) { firingIndex--; } } } // Remove the element list.splice( i--, 1 ); // If we have some unicity property then // we only need to do this once if ( flags.unique ) { break; } } } } } return this; }, // Control if a given callback is in the list has: function( fn ) { if ( list ) { var i = 0, length = list.length; for ( ; i < length; i++ ) { if ( fn === list[ i ] ) { return true; } } } return false; }, // Remove all callbacks from the list empty: function() { list = []; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory || memory === true ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( stack ) { if ( firing ) { if ( !flags.once ) { stack.push( [ context, args ] ); } } else if ( !( flags.once && memory ) ) { fire( context, args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!memory; } }; return self; }; var // Static reference to slice sliceDeferred = [].slice; jQuery.extend({ Deferred: function( func ) { var doneList = jQuery.Callbacks( "once memory" ), failList = jQuery.Callbacks( "once memory" ), progressList = jQuery.Callbacks( "memory" ), state = "pending", lists = { resolve: doneList, reject: failList, notify: progressList }, promise = { done: doneList.add, fail: failList.add, progress: progressList.add, state: function() { return state; }, // Deprecated isResolved: doneList.fired, isRejected: failList.fired, then: function( doneCallbacks, failCallbacks, progressCallbacks ) { deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); return this; }, always: function() { deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); return this; }, pipe: function( fnDone, fnFail, fnProgress ) { return jQuery.Deferred(function( newDefer ) { jQuery.each( { done: [ fnDone, "resolve" ], fail: [ fnFail, "reject" ], progress: [ fnProgress, "notify" ] }, function( handler, data ) { var fn = data[ 0 ], action = data[ 1 ], returned; if ( jQuery.isFunction( fn ) ) { deferred[ handler ](function() { returned = fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); } else { newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); } }); } else { deferred[ handler ]( newDefer[ action ] ); } }); }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { if ( obj == null ) { obj = promise; } else { for ( var key in promise ) { obj[ key ] = promise[ key ]; } } return obj; } }, deferred = promise.promise({}), key; for ( key in lists ) { deferred[ key ] = lists[ key ].fire; deferred[ key + "With" ] = lists[ key ].fireWith; } // Handle state deferred.done( function() { state = "resolved"; }, failList.disable, progressList.lock ).fail( function() { state = "rejected"; }, doneList.disable, progressList.lock ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( firstParam ) { var args = sliceDeferred.call( arguments, 0 ), i = 0, length = args.length, pValues = new Array( length ), count = length, pCount = length, deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? firstParam : jQuery.Deferred(), promise = deferred.promise(); function resolveFunc( i ) { return function( value ) { args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; if ( !( --count ) ) { deferred.resolveWith( deferred, args ); } }; } function progressFunc( i ) { return function( value ) { pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; deferred.notifyWith( promise, pValues ); }; } if ( length > 1 ) { for ( ; i < length; i++ ) { if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); } else { --count; } } if ( !count ) { deferred.resolveWith( deferred, args ); } } else if ( deferred !== firstParam ) { deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); } return promise; } }); jQuery.support = (function() { var support, all, a, select, opt, input, marginDiv, fragment, tds, events, eventName, i, isSupported, div = document.createElement( "div" ), documentElement = document.documentElement; // Preliminary tests div.setAttribute("className", "t"); div.innerHTML = "
    a"; all = div.getElementsByTagName( "*" ); a = div.getElementsByTagName( "a" )[ 0 ]; // Can't get basic test support if ( !all || !all.length || !a ) { return {}; } // First batch of supports tests select = document.createElement( "select" ); opt = select.appendChild( document.createElement("option") ); input = div.getElementsByTagName( "input" )[ 0 ]; support = { // IE strips leading whitespace when .innerHTML is used leadingWhitespace: ( div.firstChild.nodeType === 3 ), // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables tbody: !div.getElementsByTagName("tbody").length, // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE htmlSerialize: !!div.getElementsByTagName("link").length, // Get the style information from getAttribute // (IE uses .cssText instead) style: /top/.test( a.getAttribute("style") ), // Make sure that URLs aren't manipulated // (IE normalizes it by default) hrefNormalized: ( a.getAttribute("href") === "/a" ), // Make sure that element opacity exists // (IE uses filter instead) // Use a regex to work around a WebKit issue. See #5145 opacity: /^0.55/.test( a.style.opacity ), // Verify style float existence // (IE uses styleFloat instead of cssFloat) cssFloat: !!a.style.cssFloat, // Make sure that if no value is specified for a checkbox // that it defaults to "on". // (WebKit defaults to "" instead) checkOn: ( input.value === "on" ), // Make sure that a selected-by-default option has a working selected property. // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) optSelected: opt.selected, // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) getSetAttribute: div.className !== "t", // Tests for enctype support on a form(#6743) enctype: !!document.createElement("form").enctype, // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", // Will be defined later submitBubbles: true, changeBubbles: true, focusinBubbles: false, deleteExpando: true, noCloneEvent: true, inlineBlockNeedsLayout: false, shrinkWrapBlocks: false, reliableMarginRight: true }; // Make sure checked status is properly cloned input.checked = true; support.noCloneChecked = input.cloneNode( true ).checked; // Make sure that the options inside disabled selects aren't marked as disabled // (WebKit marks them as disabled) select.disabled = true; support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element // Fails in Internet Explorer try { delete div.test; } catch( e ) { support.deleteExpando = false; } if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { div.attachEvent( "onclick", function() { // Cloning a node shouldn't copy over any // bound event handlers (IE does this) support.noCloneEvent = false; }); div.cloneNode( true ).fireEvent( "onclick" ); } // Check if a radio maintains its value // after being appended to the DOM input = document.createElement("input"); input.value = "t"; input.setAttribute("type", "radio"); support.radioValue = input.value === "t"; input.setAttribute("checked", "checked"); div.appendChild( input ); fragment = document.createDocumentFragment(); fragment.appendChild( div.lastChild ); // WebKit doesn't clone checked state correctly in fragments support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) support.appendChecked = input.checked; fragment.removeChild( input ); fragment.appendChild( div ); div.innerHTML = ""; // Check if div with explicit width and no margin-right incorrectly // gets computed margin-right based on width of container. For more // info see bug #3333 // Fails in WebKit before Feb 2011 nightlies // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right if ( window.getComputedStyle ) { marginDiv = document.createElement( "div" ); marginDiv.style.width = "0"; marginDiv.style.marginRight = "0"; div.style.width = "2px"; div.appendChild( marginDiv ); support.reliableMarginRight = ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems // are used, namely in IE. Short-circuiting here helps us to // avoid an eval call (in setAttribute) which can cause CSP // to go haywire. See: https://developer.mozilla.org/en/Security/CSP if ( div.attachEvent ) { for( i in { submit: 1, change: 1, focusin: 1 }) { eventName = "on" + i; isSupported = ( eventName in div ); if ( !isSupported ) { div.setAttribute( eventName, "return;" ); isSupported = ( typeof div[ eventName ] === "function" ); } support[ i + "Bubbles" ] = isSupported; } } fragment.removeChild( div ); // Null elements to avoid leaks in IE fragment = select = opt = marginDiv = div = input = null; // Run tests that need a body at doc ready jQuery(function() { var container, outer, inner, table, td, offsetSupport, conMarginTop, ptlm, vb, style, html, body = document.getElementsByTagName("body")[0]; if ( !body ) { // Return for frameset docs that don't have a body return; } conMarginTop = 1; ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; vb = "visibility:hidden;border:0;"; style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; html = "
    " + "" + "
    "; container = document.createElement("div"); container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; body.insertBefore( container, body.firstChild ); // Construct the test element div = document.createElement("div"); container.appendChild( div ); // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when // determining if an element has been hidden directly using // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) div.innerHTML = "
    t
    "; tds = div.getElementsByTagName( "td" ); isSupported = ( tds[ 0 ].offsetHeight === 0 ); tds[ 0 ].style.display = ""; tds[ 1 ].style.display = "none"; // Check if empty table cells still have offsetWidth/Height // (IE <= 8 fail this test) support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); // Figure out if the W3C box model works as expected div.innerHTML = ""; div.style.width = div.style.paddingLeft = "1px"; jQuery.boxModel = support.boxModel = div.offsetWidth === 2; if ( typeof div.style.zoom !== "undefined" ) { // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout // (IE < 8 does this) div.style.display = "inline"; div.style.zoom = 1; support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); // Check if elements with layout shrink-wrap their children // (IE 6 does this) div.style.display = ""; div.innerHTML = "
    "; support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); } div.style.cssText = ptlm + vb; div.innerHTML = html; outer = div.firstChild; inner = outer.firstChild; td = outer.nextSibling.firstChild.firstChild; offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; inner.style.position = "fixed"; inner.style.top = "20px"; // safari subtracts parent border width here which is 5px offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); body.removeChild( container ); div = container = null; jQuery.extend( support, offsetSupport ); }); return support; })(); var rbrace = /^(?:\{.*\}|\[.*\])$/, rmultiDash = /([A-Z])/g; jQuery.extend({ cache: {}, // Please use with caution uuid: 0, // Unique for each copy of jQuery on the page // Non-digits removed to match rinlinejQuery expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), // The following elements throw uncatchable exceptions if you // attempt to add expando properties to them. noData: { "embed": true, // Ban all objects except for Flash (which handle expandos) "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", "applet": true }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var privateCache, thisCache, ret, internalKey = jQuery.expando, getByName = typeof name === "string", // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, isEvents = name === "events"; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { elem[ internalKey ] = id = ++jQuery.uuid; } else { id = internalKey; } } if ( !cache[ id ] ) { cache[ id ] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify if ( !isNode ) { cache[ id ].toJSON = jQuery.noop; } } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } privateCache = thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Users should not attempt to inspect the internal events object using jQuery.data, // it is undocumented and subject to change. But does anyone listen? No. if ( isEvents && !thisCache[ name ] ) { return privateCache.events; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( getByName ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; }, removeData: function( elem, name, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, l, // Reference to internal data cache key internalKey = jQuery.expando, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, // See jQuery.data for more information id = isNode ? elem[ internalKey ] : internalKey; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split( " " ); } } } for ( i = 0, l = name.length; i < l; i++ ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject(cache[ id ]) ) { return; } } // Browsers that fail expando deletion also refuse to delete expandos on // the window, but it will allow it on all other JS objects; other browsers // don't care // Ensure that `cache` is not a window object #10080 if ( jQuery.support.deleteExpando || !cache.setInterval ) { delete cache[ id ]; } else { cache[ id ] = null; } // We destroyed the cache and need to eliminate the expando on the node to avoid // false lookups in the cache for entries that no longer exist if ( isNode ) { // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( jQuery.support.deleteExpando ) { delete elem[ internalKey ]; } else if ( elem.removeAttribute ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } } }, // For internal use only. _data: function( elem, name, data ) { return jQuery.data( elem, name, data, true ); }, // A method for determining if a DOM node can handle the data expando acceptData: function( elem ) { if ( elem.nodeName ) { var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; if ( match ) { return !(match === true || elem.getAttribute("classid") !== match); } } return true; } }); jQuery.fn.extend({ data: function( key, value ) { var parts, attr, name, data = null; if ( typeof key === "undefined" ) { if ( this.length ) { data = jQuery.data( this[0] ); if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { attr = this[0].attributes; for ( var i = 0, l = attr.length; i < l; i++ ) { name = attr[i].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.substring(5) ); dataAttr( this[0], name, data[ name ] ); } } jQuery._data( this[0], "parsedAttrs", true ); } } return data; } else if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } parts = key.split("."); parts[1] = parts[1] ? "." + parts[1] : ""; if ( value === undefined ) { data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); // Try to fetch any internally stored data first if ( data === undefined && this.length ) { data = jQuery.data( this[0], key ); data = dataAttr( this[0], key, data ); } return data === undefined && parts[1] ? this.data( parts[0] ) : data; } else { return this.each(function() { var self = jQuery( this ), args = [ parts[0], value ]; self.triggerHandler( "setData" + parts[1] + "!", args ); jQuery.data( this, key, value ); self.triggerHandler( "changeData" + parts[1] + "!", args ); }); } }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : jQuery.isNumeric( data ) ? parseFloat( data ) : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { for ( var name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function handleQueueMarkDefer( elem, type, src ) { var deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", defer = jQuery._data( elem, deferDataKey ); if ( defer && ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { // Give room for hard-coded callbacks to fire first // and eventually mark/queue something else on the element setTimeout( function() { if ( !jQuery._data( elem, queueDataKey ) && !jQuery._data( elem, markDataKey ) ) { jQuery.removeData( elem, deferDataKey, true ); defer.fire(); } }, 0 ); } } jQuery.extend({ _mark: function( elem, type ) { if ( elem ) { type = ( type || "fx" ) + "mark"; jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); } }, _unmark: function( force, elem, type ) { if ( force !== true ) { type = elem; elem = force; force = false; } if ( elem ) { type = type || "fx"; var key = type + "mark", count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); if ( count ) { jQuery._data( elem, key, count ); } else { jQuery.removeData( elem, key, true ); handleQueueMarkDefer( elem, type, "mark" ); } } }, queue: function( elem, type, data ) { var q; if ( elem ) { type = ( type || "fx" ) + "queue"; q = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !q || jQuery.isArray(data) ) { q = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { q.push( data ); } } return q || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), fn = queue.shift(), hooks = {}; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } jQuery._data( elem, type + ".run", hooks ); fn.call( elem, function() { jQuery.dequeue( elem, type ); }, hooks ); } if ( !queue.length ) { jQuery.removeData( elem, type + "queue " + type + ".run", true ); handleQueueMarkDefer( elem, type, "queue" ); } } }); jQuery.fn.extend({ queue: function( type, data ) { if ( typeof type !== "string" ) { data = type; type = "fx"; } if ( data === undefined ) { return jQuery.queue( this[0], type ); } return this.each(function() { var queue = jQuery.queue( this, type, data ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, // Based off of the plugin by Clint Helfers, with permission. // http://blindsignals.com/index.php/2009/07/jquery-delay/ delay: function( time, type ) { time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; type = type || "fx"; return this.queue( type, function( next, hooks ) { var timeout = setTimeout( next, time ); hooks.stop = function() { clearTimeout( timeout ); }; }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, object ) { if ( typeof type !== "string" ) { object = type; type = undefined; } type = type || "fx"; var defer = jQuery.Deferred(), elements = this, i = elements.length, count = 1, deferDataKey = type + "defer", queueDataKey = type + "queue", markDataKey = type + "mark", tmp; function resolve() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } } while( i-- ) { if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { count++; tmp.add( resolve ); } } resolve(); return defer.promise(); } }); var rclass = /[\n\t\r]/g, rspace = /\s+/, rreturn = /\r/g, rtype = /^(?:button|input)$/i, rfocusable = /^(?:button|input|object|select|textarea)$/i, rclickable = /^a(?:rea)?$/i, rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, getSetAttribute = jQuery.support.getSetAttribute, nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, name, value, true, jQuery.attr ); }, removeAttr: function( name ) { return this.each(function() { jQuery.removeAttr( this, name ); }); }, prop: function( name, value ) { return jQuery.access( this, name, value, true, jQuery.prop ); }, removeProp: function( name ) { name = jQuery.propFix[ name ] || name; return this.each(function() { // try/catch handles cases where IE balks (such as removing a property on window) try { this[ name ] = undefined; delete this[ name ]; } catch( e ) {} }); }, addClass: function( value ) { var classNames, i, l, elem, setClass, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).addClass( value.call(this, j, this.className) ); }); } if ( value && typeof value === "string" ) { classNames = value.split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 ) { if ( !elem.className && classNames.length === 1 ) { elem.className = value; } else { setClass = " " + elem.className + " "; for ( c = 0, cl = classNames.length; c < cl; c++ ) { if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { setClass += classNames[ c ] + " "; } } elem.className = jQuery.trim( setClass ); } } } } return this; }, removeClass: function( value ) { var classNames, i, l, elem, className, c, cl; if ( jQuery.isFunction( value ) ) { return this.each(function( j ) { jQuery( this ).removeClass( value.call(this, j, this.className) ); }); } if ( (value && typeof value === "string") || value === undefined ) { classNames = ( value || "" ).split( rspace ); for ( i = 0, l = this.length; i < l; i++ ) { elem = this[ i ]; if ( elem.nodeType === 1 && elem.className ) { if ( value ) { className = (" " + elem.className + " ").replace( rclass, " " ); for ( c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[ c ] + " ", " "); } elem.className = jQuery.trim( className ); } else { elem.className = ""; } } } } return this; }, toggleClass: function( value, stateVal ) { var type = typeof value, isBool = typeof stateVal === "boolean"; if ( jQuery.isFunction( value ) ) { return this.each(function( i ) { jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); }); } return this.each(function() { if ( type === "string" ) { // toggle individual class names var className, i = 0, self = jQuery( this ), state = stateVal, classNames = value.split( rspace ); while ( (className = classNames[ i++ ]) ) { // check each className given, space seperated list state = isBool ? state : !self.hasClass( className ); self[ state ? "addClass" : "removeClass" ]( className ); } } else if ( type === "undefined" || type === "boolean" ) { if ( this.className ) { // store className if set jQuery._data( this, "__className__", this.className ); } // toggle whole className this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; } }); }, hasClass: function( selector ) { var className = " " + selector + " ", i = 0, l = this.length; for ( ; i < l; i++ ) { if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } return false; }, val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) { if ( elem ) { hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } ret = elem.value; return typeof ret === "string" ? // handle most common string cases ret.replace(rreturn, "") : // handle cases where value is null/undef or number ret == null ? "" : ret; } return; } isFunction = jQuery.isFunction( value ); return this.each(function( i ) { var self = jQuery(this), val; if ( this.nodeType !== 1 ) { return; } if ( isFunction ) { val = value.call( this, i, self.val() ); } else { val = value; } // Treat null/undefined as ""; convert numbers to string if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jQuery.isArray( val ) ) { val = jQuery.map(val, function ( value ) { return value == null ? "" : value + ""; }); } hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; // If set returns undefined, fall back to normal setting if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); } }); jQuery.extend({ valHooks: { option: { get: function( elem ) { // attributes.value is undefined in Blackberry 4.7 but // uses .value. See #6932 var val = elem.attributes.value; return !val || val.specified ? elem.value : elem.text; } }, select: { get: function( elem ) { var value, i, max, option, index = elem.selectedIndex, values = [], options = elem.options, one = elem.type === "select-one"; // Nothing was selected if ( index < 0 ) { return null; } // Loop through all the selected options i = one ? index : 0; max = one ? index + 1 : options.length; for ( ; i < max; i++ ) { option = options[ i ]; // Don't return options that are disabled or in a disabled optgroup if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { // Get the specific value for the option value = jQuery( option ).val(); // We don't need an array for one selects if ( one ) { return value; } // Multi-Selects return an array values.push( value ); } } // Fixes Bug #2551 -- select.val() broken in IE after form.reset() if ( one && !values.length && options.length ) { return jQuery( options[ index ] ).val(); } return values; }, set: function( elem, value ) { var values = jQuery.makeArray( value ); jQuery(elem).find("option").each(function() { this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; }); if ( !values.length ) { elem.selectedIndex = -1; } return values; } } }, attrFn: { val: true, css: true, html: true, text: true, data: true, width: true, height: true, offset: true }, attr: function( elem, name, value, pass ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } if ( pass && name in jQuery.attrFn ) { return jQuery( elem )[ name ]( value ); } // Fallback to prop when attributes are not supported if ( typeof elem.getAttribute === "undefined" ) { return jQuery.prop( elem, name, value ); } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); // All attributes are lowercase // Grab necessary hook if one is defined if ( notxml ) { name = name.toLowerCase(); hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); } if ( value !== undefined ) { if ( value === null ) { jQuery.removeAttr( elem, name ); return; } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { elem.setAttribute( name, "" + value ); return value; } } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { ret = elem.getAttribute( name ); // Non-existent attributes return null, we normalize to undefined return ret === null ? undefined : ret; } }, removeAttr: function( elem, value ) { var propName, attrNames, name, l, i = 0; if ( value && elem.nodeType === 1 ) { attrNames = value.toLowerCase().split( rspace ); l = attrNames.length; for ( ; i < l; i++ ) { name = attrNames[ i ]; if ( name ) { propName = jQuery.propFix[ name ] || name; // See #9699 for explanation of this approach (setting first, then removal) jQuery.attr( elem, name, "" ); elem.removeAttribute( getSetAttribute ? name : propName ); // Set corresponding property to false for boolean attributes if ( rboolean.test( name ) && propName in elem ) { elem[ propName ] = false; } } } } }, attrHooks: { type: { set: function( elem, value ) { // We can't allow the type property to be changed (since it causes problems in IE) if ( rtype.test( elem.nodeName ) && elem.parentNode ) { jQuery.error( "type property can't be changed" ); } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { // Setting the type on a radio button after the value resets the value in IE6-9 // Reset value to it's default in case type is set after value // This is for element creation var val = elem.value; elem.setAttribute( "type", value ); if ( val ) { elem.value = val; } return value; } } }, // Use the value property for back compat // Use the nodeHook for button elements in IE6/7 (#1954) value: { get: function( elem, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.get( elem, name ); } return name in elem ? elem.value : null; }, set: function( elem, value, name ) { if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { return nodeHook.set( elem, value, name ); } // Does not return so that setAttribute is also used elem.value = value; } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function( elem, name, value ) { var ret, hooks, notxml, nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { return; } notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); if ( notxml ) { // Fix name and attach hooks name = jQuery.propFix[ name ] || name; hooks = jQuery.propHooks[ name ]; } if ( value !== undefined ) { if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { return ret; } else { return ( elem[ name ] = value ); } } else { if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { return ret; } else { return elem[ name ]; } } }, propHooks: { tabIndex: { get: function( elem ) { // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ var attributeNode = elem.getAttributeNode("tabindex"); return attributeNode && attributeNode.specified ? parseInt( attributeNode.value, 10 ) : rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? 0 : undefined; } } } }); // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { get: function( elem, name ) { // Align boolean attributes with corresponding properties // Fall back to attribute presence where some booleans are not supported var attrNode, property = jQuery.prop( elem, name ); return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined; }, set: function( elem, value, name ) { var propName; if ( value === false ) { // Remove boolean attributes when set to false jQuery.removeAttr( elem, name ); } else { // value is true since we know at this point it's type boolean and not false // Set boolean attributes to the same name and set the DOM property propName = jQuery.propFix[ name ] || name; if ( propName in elem ) { // Only set the IDL specifically if it already exists on the element elem[ propName ] = true; } elem.setAttribute( name, name.toLowerCase() ); } return name; } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute if ( !getSetAttribute ) { fixSpecified = { name: true, id: true }; // Use this for any attribute in IE6/7 // This fixes almost every IE6/7 issue nodeHook = jQuery.valHooks.button = { get: function( elem, name ) { var ret; ret = elem.getAttributeNode( name ); return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? ret.nodeValue : undefined; }, set: function( elem, value, name ) { // Set the existing or create a new attribute node var ret = elem.getAttributeNode( name ); if ( !ret ) { ret = document.createAttribute( name ); elem.setAttributeNode( ret ); } return ( ret.nodeValue = value + "" ); } }; // Apply the nodeHook to tabindex jQuery.attrHooks.tabindex.set = nodeHook.set; // Set width and height to auto instead of 0 on empty string( Bug #8150 ) // This is for removals jQuery.each([ "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { set: function( elem, value ) { if ( value === "" ) { elem.setAttribute( name, "auto" ); return value; } } }); }); // Set contenteditable to false on removals(#10429) // Setting to empty string throws an error as an invalid value jQuery.attrHooks.contenteditable = { get: nodeHook.get, set: function( elem, value, name ) { if ( value === "" ) { value = "false"; } nodeHook.set( elem, value, name ); } }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { get: function( elem ) { var ret = elem.getAttribute( name, 2 ); return ret === null ? undefined : ret; } }); }); } if ( !jQuery.support.style ) { jQuery.attrHooks.style = { get: function( elem ) { // Return undefined in the case of empty string // Normalize to lowercase since IE uppercases css property names return elem.style.cssText.toLowerCase() || undefined; }, set: function( elem, value ) { return ( elem.style.cssText = "" + value ); } }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { get: function( elem ) { var parent = elem.parentNode; if ( parent ) { parent.selectedIndex; // Make sure that it also works with optgroups, see #5701 if ( parent.parentNode ) { parent.parentNode.selectedIndex; } } return null; } }); } // IE6/7 call enctype encoding if ( !jQuery.support.enctype ) { jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = { get: function( elem ) { // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified return elem.getAttribute("value") === null ? "on" : elem.value; } }; }); } jQuery.each([ "radio", "checkbox" ], function() { jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { set: function( elem, value ) { if ( jQuery.isArray( value ) ) { return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); } } }); }); var rformElems = /^(?:textarea|input|select)$/i, rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, rhoverHack = /\bhover(\.\S+)?\b/, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, quickParse = function( selector ) { var quick = rquickIs.exec( selector ); if ( quick ) { // 0 1 2 3 // [ _, tag, id, class ] quick[1] = ( quick[1] || "" ).toLowerCase(); quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); } return quick; }, quickIs = function( elem, m ) { var attrs = elem.attributes || {}; return ( (!m[1] || elem.nodeName.toLowerCase() === m[1]) && (!m[2] || (attrs.id || {}).value === m[2]) && (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) ); }, hoverHack = function( events ) { return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); }; /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { add: function( elem, types, handler, data, selector ) { var elemData, eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, quick, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho) if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first events = elemData.events; if ( !events ) { elemData.events = events = {}; } eventHandle = elemData.handle; if ( !eventHandle ) { elemData.handle = eventHandle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space // jQuery(...).bind("mouseover mouseout", fn); types = jQuery.trim( hoverHack(types) ).split( " " ); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = tns[1]; namespaces = ( tns[2] || "" ).split( "." ).sort(); // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: tns[1], data: data, handler: handler, guid: handler.guid, selector: selector, quick: quickParse( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first handlers = events[ type ]; if ( !handlers ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, global: {}, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), t, tns, type, origType, namespaces, origCount, j, events, special, handle, eventType, handleObj; if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = jQuery.trim( hoverHack( types || "" ) ).split(" "); for ( t = 0; t < types.length; t++ ) { tns = rtypenamespace.exec( types[t] ) || []; type = origType = tns[1]; namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector? special.delegateType : special.bindType ) || type; eventType = events[ type ] || []; origCount = eventType.length; namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; // Remove matching events for ( j = 0; j < eventType.length; j++ ) { handleObj = eventType[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !namespaces || namespaces.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { eventType.splice( j--, 1 ); if ( handleObj.selector ) { eventType.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( eventType.length === 0 && origCount !== eventType.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { handle = elemData.handle; if ( handle ) { handle.elem = null; } // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery.removeData( elem, [ "events", "handle" ], true ); } }, // Events that are safe to short-circuit if no handlers are attached. // Native DOM events should not be added, they may have inline handlers. customEvent: { "getData": true, "setData": true, "changeData": true }, trigger: function( event, data, elem, onlyHandlers ) { // Don't do events on text and comment nodes if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { return; } // Event object or event type var type = event.type || event, namespaces = [], cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf( "!" ) >= 0 ) { // Exclusive events trigger only for the exact event (no namespaces) type = type.slice(0, -1); exclusive = true; } if ( type.indexOf( "." ) >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { // No jQuery handlers for this event type, and it can't have inline handlers return; } // Caller can pass in an Event, Object, or just an event type string event = typeof event === "object" ? // jQuery.Event object event[ jQuery.expando ] ? event : // Object literal new jQuery.Event( type, event ) : // Just the event type (string) new jQuery.Event( type ); event.type = type; event.isTrigger = true; event.exclusive = exclusive; event.namespace = namespaces.join( "." ); event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; // Handle a global trigger if ( !elem ) { // TODO: Stop taunting the data cache; remove global events and always attach to document cache = jQuery.cache; for ( i in cache ) { if ( cache[ i ].events && cache[ i ].events[ type ] ) { jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); } } return; } // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data != null ? jQuery.makeArray( data ) : []; data.unshift( event ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) eventPath = [[ elem, special.bindType || type ]]; if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; old = null; for ( ; cur; cur = cur.parentNode ) { eventPath.push([ cur, bubbleType ]); old = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( old && old === elem.ownerDocument ) { eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); } } // Fire handlers on the event path for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { cur = eventPath[i][0]; event.type = eventPath[i][1]; handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Note that this is a bare JS function and not a jQuery handler handle = ontype && cur[ ontype ]; if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { event.preventDefault(); } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) // IE<9 dies on focus/blur to hidden element (#1486) if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method old = elem[ ontype ]; if ( old ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; elem[ type ](); jQuery.event.triggered = undefined; if ( old ) { elem[ ontype ] = old; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event || window.event ); var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), delegateCount = handlers.delegateCount, args = [].slice.call( arguments, 0 ), run_all = !event.exclusive && !event.namespace, handlerQueue = [], i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Determine handlers that should run if there are delegated events // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { // Pregenerate a single jQuery object for reuse with .is() jqcur = jQuery(this); jqcur.context = this.ownerDocument || this; for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { selMatch = {}; matches = []; jqcur[0] = cur; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; sel = handleObj.selector; if ( selMatch[ sel ] === undefined ) { selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) ); } if ( selMatch[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, matches: matches }); } } } // Add the remaining (directly-bound) handlers if ( handlers.length > delegateCount ) { handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); } // Run delegates first; they may want to stop propagation beneath us for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { matched = handlerQueue[ i ]; event.currentTarget = matched.elem; for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { handleObj = matched.matches[ j ]; // Triggered event must either 1) be non-exclusive and have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { event.data = handleObj.data; event.handleObj = handleObj; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { event.result = ret; if ( ret === false ) { event.preventDefault(); event.stopPropagation(); } } } } } return event.result; }, // Includes some event props shared by KeyEvent and MouseEvent // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var eventDoc, doc, body, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, originalEvent = event, fixHook = jQuery.event.fixHooks[ event.type ] || {}, copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = jQuery.Event( originalEvent ); for ( i = copy.length; i; ) { prop = copy[ --i ]; event[ prop ] = originalEvent[ prop ]; } // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Target should not be a text node (#504, Safari) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) if ( event.metaKey === undefined ) { event.metaKey = event.ctrlKey; } return fixHook.filter? fixHook.filter( event, originalEvent ) : event; }, special: { ready: { // Make sure the ready event is setup setup: jQuery.bindReady }, load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function( data, namespaces, eventHandle ) { // We only want to do this special case on windows if ( jQuery.isWindow( this ) ) { this.onbeforeunload = eventHandle; } }, teardown: function( namespaces, eventHandle ) { if ( this.onbeforeunload === eventHandle ) { this.onbeforeunload = null; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; // Some plugins are using, but it's undocumented/deprecated and will be removed. // The 1.7 special event interface should provide all the hooks needed now. jQuery.event.handle = jQuery.event.dispatch; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { if ( elem.detachEvent ) { elem.detachEvent( "on" + type, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; function returnFalse() { return false; } function returnTrue() { return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { preventDefault: function() { this.isDefaultPrevented = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if preventDefault exists run it on the original event if ( e.preventDefault ) { e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE) } else { e.returnValue = false; } }, stopPropagation: function() { this.isPropagationStopped = returnTrue; var e = this.originalEvent; if ( !e ) { return; } // if stopPropagation exists run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // otherwise set the cancelBubble property of the original event to true (IE) e.cancelBubble = true; }, stopImmediatePropagation: function() { this.isImmediatePropagationStopped = returnTrue; this.stopPropagation(); }, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var target = this, related = event.relatedTarget, handleObj = event.handleObj, selector = handleObj.selector, ret; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !jQuery.support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !form._submit_attached ) { jQuery.event.add( form, "submit._submit", function( event ) { // If form was submitted by the user, bubble the event up the tree if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } }); form._submit_attached = true; } }); // return undefined since we don't need an event listener }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; jQuery.event.simulate( "change", this, event, true ); } }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); elem._change_attached = true; } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler while someone wants focusin/focusout var attaches = 0, handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { if ( attaches++ === 0 ) { document.addEventListener( orig, handler, true ); } }, teardown: function() { if ( --attaches === 0 ) { document.removeEventListener( orig, handler, true ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on.call( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event var handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( var type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { if ( this[0] ) { return jQuery.event.trigger( type, data, this[0], true ); } }, toggle: function( fn ) { // Save reference to arguments for access in closure var args = arguments, guid = fn.guid || jQuery.guid++, i = 0, toggler = function( event ) { // Figure out which function to execute var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); // Make sure that clicks stop event.preventDefault(); // and execute the function return args[ lastToggle ].apply( this, arguments ) || false; }; // link all the functions, so any of them can unbind this click handler toggler.guid = guid; while ( i < args.length ) { args[ i++ ].guid = guid; } return this.click( toggler ); }, hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } }); jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { if ( fn == null ) { fn = data; data = null; } return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; if ( jQuery.attrFn ) { jQuery.attrFn[ name ] = true; } if ( rkeyEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; } if ( rmouseEvent.test( name ) ) { jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; } }); /*! * Sizzle CSS Selector Engine * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * More information: http://sizzlejs.com/ */ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, expando = "sizcache" + (Math.random() + '').replace('.', ''), done = 0, toString = Object.prototype.toString, hasDuplicate = false, baseHasDuplicate = true, rBackslash = /\\/g, rReturn = /\r\n/g, rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { baseHasDuplicate = false; return 0; }); var Sizzle = function( selector, context, results, seed ) { results = results || []; context = context || document; var origContext = context; if ( context.nodeType !== 1 && context.nodeType !== 9 ) { return []; } if ( !selector || typeof selector !== "string" ) { return results; } var m, set, checkSet, extra, ret, cur, pop, i, prune = true, contextXML = Sizzle.isXML( context ), parts = [], soFar = selector; // Reset the position of the chunker regexp (start from head) do { chunker.exec( "" ); m = chunker.exec( soFar ); if ( m ) { soFar = m[3]; parts.push( m[1] ); if ( m[2] ) { extra = m[3]; break; } } } while ( m ); if ( parts.length > 1 && origPOS.exec( selector ) ) { if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { set = posProcess( parts[0] + parts[1], context, seed ); } else { set = Expr.relative[ parts[0] ] ? [ context ] : Sizzle( parts.shift(), context ); while ( parts.length ) { selector = parts.shift(); if ( Expr.relative[ selector ] ) { selector += parts.shift(); } set = posProcess( selector, set, seed ); } } } else { // Take a shortcut and set the context if the root selector is an ID // (but not if it'll be faster if the inner selector is an ID) if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { ret = Sizzle.find( parts.shift(), context, contextXML ); context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; } if ( context ) { ret = seed ? { expr: parts.pop(), set: makeArray(seed) } : Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; if ( parts.length > 0 ) { checkSet = makeArray( set ); } else { prune = false; } while ( parts.length ) { cur = parts.pop(); pop = cur; if ( !Expr.relative[ cur ] ) { cur = ""; } else { pop = parts.pop(); } if ( pop == null ) { pop = context; } Expr.relative[ cur ]( checkSet, pop, contextXML ); } } else { checkSet = parts = []; } } if ( !checkSet ) { checkSet = set; } if ( !checkSet ) { Sizzle.error( cur || selector ); } if ( toString.call(checkSet) === "[object Array]" ) { if ( !prune ) { results.push.apply( results, checkSet ); } else if ( context && context.nodeType === 1 ) { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { results.push( set[i] ); } } } else { for ( i = 0; checkSet[i] != null; i++ ) { if ( checkSet[i] && checkSet[i].nodeType === 1 ) { results.push( set[i] ); } } } } else { makeArray( checkSet, results ); } if ( extra ) { Sizzle( extra, origContext, results, seed ); Sizzle.uniqueSort( results ); } return results; }; Sizzle.uniqueSort = function( results ) { if ( sortOrder ) { hasDuplicate = baseHasDuplicate; results.sort( sortOrder ); if ( hasDuplicate ) { for ( var i = 1; i < results.length; i++ ) { if ( results[i] === results[ i - 1 ] ) { results.splice( i--, 1 ); } } } } return results; }; Sizzle.matches = function( expr, set ) { return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { var set, i, len, match, type, left; if ( !expr ) { return []; } for ( i = 0, len = Expr.order.length; i < len; i++ ) { type = Expr.order[i]; if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { left = match[1]; match.splice( 1, 1 ); if ( left.substr( left.length - 1 ) !== "\\" ) { match[1] = (match[1] || "").replace( rBackslash, "" ); set = Expr.find[ type ]( match, context, isXML ); if ( set != null ) { expr = expr.replace( Expr.match[ type ], "" ); break; } } } } if ( !set ) { set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName( "*" ) : []; } return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { var match, anyFound, type, found, item, filter, left, i, pass, old = expr, result = [], curLoop = set, isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); while ( expr && set.length ) { for ( type in Expr.filter ) { if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { filter = Expr.filter[ type ]; left = match[1]; anyFound = false; match.splice(1,1); if ( left.substr( left.length - 1 ) === "\\" ) { continue; } if ( curLoop === result ) { result = []; } if ( Expr.preFilter[ type ] ) { match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); if ( !match ) { anyFound = found = true; } else if ( match === true ) { continue; } } if ( match ) { for ( i = 0; (item = curLoop[i]) != null; i++ ) { if ( item ) { found = filter( item, match, i, curLoop ); pass = not ^ found; if ( inplace && found != null ) { if ( pass ) { anyFound = true; } else { curLoop[i] = false; } } else if ( pass ) { result.push( item ); anyFound = true; } } } } if ( found !== undefined ) { if ( !inplace ) { curLoop = result; } expr = expr.replace( Expr.match[ type ], "" ); if ( !anyFound ) { return []; } break; } } } // Improper expression if ( expr === old ) { if ( anyFound == null ) { Sizzle.error( expr ); } else { break; } } old = expr; } return curLoop; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Utility function for retreiving the text value of an array of DOM nodes * @param {Array|Element} elem */ var getText = Sizzle.getText = function( elem ) { var i, node, nodeType = elem.nodeType, ret = ""; if ( nodeType ) { if ( nodeType === 1 || nodeType === 9 ) { // Use textContent || innerText for elements if ( typeof elem.textContent === 'string' ) { return elem.textContent; } else if ( typeof elem.innerText === 'string' ) { // Replace IE's carriage returns return elem.innerText.replace( rReturn, '' ); } else { // Traverse it's children for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } } else { // If no nodeType, this is expected to be an array for ( i = 0; (node = elem[i]); i++ ) { // Do not traverse comment nodes if ( node.nodeType !== 8 ) { ret += getText( node ); } } } return ret; }; var Expr = Sizzle.selectors = { order: [ "ID", "NAME", "TAG" ], match: { ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ }, leftMatch: {}, attrMap: { "class": "className", "for": "htmlFor" }, attrHandle: { href: function( elem ) { return elem.getAttribute( "href" ); }, type: function( elem ) { return elem.getAttribute( "type" ); } }, relative: { "+": function(checkSet, part){ var isPartStr = typeof part === "string", isTag = isPartStr && !rNonWord.test( part ), isPartStrNotTag = isPartStr && !isTag; if ( isTag ) { part = part.toLowerCase(); } for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { if ( (elem = checkSet[i]) ) { while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? elem || false : elem === part; } } if ( isPartStrNotTag ) { Sizzle.filter( part, checkSet, true ); } }, ">": function( checkSet, part ) { var elem, isPartStr = typeof part === "string", i = 0, l = checkSet.length; if ( isPartStr && !rNonWord.test( part ) ) { part = part.toLowerCase(); for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { var parent = elem.parentNode; checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; } } } else { for ( ; i < l; i++ ) { elem = checkSet[i]; if ( elem ) { checkSet[i] = isPartStr ? elem.parentNode : elem.parentNode === part; } } if ( isPartStr ) { Sizzle.filter( part, checkSet, true ); } } }, "": function(checkSet, part, isXML){ var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); }, "~": function( checkSet, part, isXML ) { var nodeCheck, doneName = done++, checkFn = dirCheck; if ( typeof part === "string" && !rNonWord.test( part ) ) { part = part.toLowerCase(); nodeCheck = part; checkFn = dirNodeCheck; } checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); } }, find: { ID: function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [m] : []; } }, NAME: function( match, context ) { if ( typeof context.getElementsByName !== "undefined" ) { var ret = [], results = context.getElementsByName( match[1] ); for ( var i = 0, l = results.length; i < l; i++ ) { if ( results[i].getAttribute("name") === match[1] ) { ret.push( results[i] ); } } return ret.length === 0 ? null : ret; } }, TAG: function( match, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( match[1] ); } } }, preFilter: { CLASS: function( match, curLoop, inplace, result, not, isXML ) { match = " " + match[1].replace( rBackslash, "" ) + " "; if ( isXML ) { return match; } for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { if ( elem ) { if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { if ( !inplace ) { result.push( elem ); } } else if ( inplace ) { curLoop[i] = false; } } } return false; }, ID: function( match ) { return match[1].replace( rBackslash, "" ); }, TAG: function( match, curLoop ) { return match[1].replace( rBackslash, "" ).toLowerCase(); }, CHILD: function( match ) { if ( match[1] === "nth" ) { if ( !match[2] ) { Sizzle.error( match[0] ); } match[2] = match[2].replace(/^\+|\s*/g, ''); // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); // calculate the numbers (first)n+(last) including if they are negative match[2] = (test[1] + (test[2] || 1)) - 0; match[3] = test[3] - 0; } else if ( match[2] ) { Sizzle.error( match[0] ); } // TODO: Move to normal caching system match[0] = done++; return match; }, ATTR: function( match, curLoop, inplace, result, not, isXML ) { var name = match[1] = match[1].replace( rBackslash, "" ); if ( !isXML && Expr.attrMap[name] ) { match[1] = Expr.attrMap[name]; } // Handle if an un-quoted value was used match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); if ( match[2] === "~=" ) { match[4] = " " + match[4] + " "; } return match; }, PSEUDO: function( match, curLoop, inplace, result, not ) { if ( match[1] === "not" ) { // If we're dealing with a complex expression, or a simple one if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { match[3] = Sizzle(match[3], null, null, curLoop); } else { var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); if ( !inplace ) { result.push.apply( result, ret ); } return false; } } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { return true; } return match; }, POS: function( match ) { match.unshift( true ); return match; } }, filters: { enabled: function( elem ) { return elem.disabled === false && elem.type !== "hidden"; }, disabled: function( elem ) { return elem.disabled === true; }, checked: function( elem ) { return elem.checked === true; }, selected: function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, parent: function( elem ) { return !!elem.firstChild; }, empty: function( elem ) { return !elem.firstChild; }, has: function( elem, i, match ) { return !!Sizzle( match[3], elem ).length; }, header: function( elem ) { return (/h\d/i).test( elem.nodeName ); }, text: function( elem ) { var attr = elem.getAttribute( "type" ), type = elem.type; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) // use getAttribute instead to test this case return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); }, radio: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; }, checkbox: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; }, file: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; }, password: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; }, submit: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "submit" === elem.type; }, image: function( elem ) { return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; }, reset: function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && "reset" === elem.type; }, button: function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && "button" === elem.type || name === "button"; }, input: function( elem ) { return (/input|select|textarea|button/i).test( elem.nodeName ); }, focus: function( elem ) { return elem === elem.ownerDocument.activeElement; } }, setFilters: { first: function( elem, i ) { return i === 0; }, last: function( elem, i, match, array ) { return i === array.length - 1; }, even: function( elem, i ) { return i % 2 === 0; }, odd: function( elem, i ) { return i % 2 === 1; }, lt: function( elem, i, match ) { return i < match[3] - 0; }, gt: function( elem, i, match ) { return i > match[3] - 0; }, nth: function( elem, i, match ) { return match[3] - 0 === i; }, eq: function( elem, i, match ) { return match[3] - 0 === i; } }, filter: { PSEUDO: function( elem, match, i, array ) { var name = match[1], filter = Expr.filters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } else if ( name === "contains" ) { return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; } else if ( name === "not" ) { var not = match[3]; for ( var j = 0, l = not.length; j < l; j++ ) { if ( not[j] === elem ) { return false; } } return true; } else { Sizzle.error( name ); } }, CHILD: function( elem, match ) { var first, last, doneName, parent, cache, count, diff, type = match[1], node = elem; switch ( type ) { case "only": case "first": while ( (node = node.previousSibling) ) { if ( node.nodeType === 1 ) { return false; } } if ( type === "first" ) { return true; } node = elem; case "last": while ( (node = node.nextSibling) ) { if ( node.nodeType === 1 ) { return false; } } return true; case "nth": first = match[2]; last = match[3]; if ( first === 1 && last === 0 ) { return true; } doneName = match[0]; parent = elem.parentNode; if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { count = 0; for ( node = parent.firstChild; node; node = node.nextSibling ) { if ( node.nodeType === 1 ) { node.nodeIndex = ++count; } } parent[ expando ] = doneName; } diff = elem.nodeIndex - last; if ( first === 0 ) { return diff === 0; } else { return ( diff % first === 0 && diff / first >= 0 ); } } }, ID: function( elem, match ) { return elem.nodeType === 1 && elem.getAttribute("id") === match; }, TAG: function( elem, match ) { return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; }, CLASS: function( elem, match ) { return (" " + (elem.className || elem.getAttribute("class")) + " ") .indexOf( match ) > -1; }, ATTR: function( elem, match ) { var name = match[1], result = Sizzle.attr ? Sizzle.attr( elem, name ) : Expr.attrHandle[ name ] ? Expr.attrHandle[ name ]( elem ) : elem[ name ] != null ? elem[ name ] : elem.getAttribute( name ), value = result + "", type = match[2], check = match[4]; return result == null ? type === "!=" : !type && Sizzle.attr ? result != null : type === "=" ? value === check : type === "*=" ? value.indexOf(check) >= 0 : type === "~=" ? (" " + value + " ").indexOf(check) >= 0 : !check ? value && result !== false : type === "!=" ? value !== check : type === "^=" ? value.indexOf(check) === 0 : type === "$=" ? value.substr(value.length - check.length) === check : type === "|=" ? value === check || value.substr(0, check.length + 1) === check + "-" : false; }, POS: function( elem, match, i, array ) { var name = match[2], filter = Expr.setFilters[ name ]; if ( filter ) { return filter( elem, i, match, array ); } } } }; var origPOS = Expr.match.POS, fescape = function(all, num){ return "\\" + (num - 0 + 1); }; for ( var type in Expr.match ) { Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } var makeArray = function( array, results ) { array = Array.prototype.slice.call( array, 0 ); if ( results ) { results.push.apply( results, array ); return results; } return array; }; // Perform a simple check to determine if the browser is capable of // converting a NodeList to an array using builtin methods. // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { makeArray = function( array, results ) { var i = 0, ret = results || []; if ( toString.call(array) === "[object Array]" ) { Array.prototype.push.apply( ret, array ); } else { if ( typeof array.length === "number" ) { for ( var l = array.length; i < l; i++ ) { ret.push( array[i] ); } } else { for ( ; array[i]; i++ ) { ret.push( array[i] ); } } } return ret; }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; return 0; } if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { return a.compareDocumentPosition ? -1 : 1; } return a.compareDocumentPosition(b) & 4 ? -1 : 1; }; } else { sortOrder = function( a, b ) { // The nodes are identical, we can exit early if ( a === b ) { hasDuplicate = true; return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes } else if ( a.sourceIndex && b.sourceIndex ) { return a.sourceIndex - b.sourceIndex; } var al, bl, ap = [], bp = [], aup = a.parentNode, bup = b.parentNode, cur = aup; // If the nodes are siblings (or identical) we can do a quick check if ( aup === bup ) { return siblingCheck( a, b ); // If no parents were found then the nodes are disconnected } else if ( !aup ) { return -1; } else if ( !bup ) { return 1; } // Otherwise they're somewhere else in the tree so we need // to build up a full list of the parentNodes for comparison while ( cur ) { ap.unshift( cur ); cur = cur.parentNode; } cur = bup; while ( cur ) { bp.unshift( cur ); cur = cur.parentNode; } al = ap.length; bl = bp.length; // Start walking down the tree looking for a discrepancy for ( var i = 0; i < al && i < bl; i++ ) { if ( ap[i] !== bp[i] ) { return siblingCheck( ap[i], bp[i] ); } } // We ended someplace up the tree so do a sibling check return i === al ? siblingCheck( a, bp[i], -1 ) : siblingCheck( ap[i], b, 1 ); }; siblingCheck = function( a, b, ret ) { if ( a === b ) { return ret; } var cur = a.nextSibling; while ( cur ) { if ( cur === b ) { return -1; } cur = cur.nextSibling; } return 1; }; } // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ // We're going to inject a fake input element with a specified name var form = document.createElement("div"), id = "script" + (new Date()).getTime(), root = document.documentElement; form.innerHTML = ""; // Inject it into the root element, check its status, and remove it quickly root.insertBefore( form, root.firstChild ); // The workaround has to do additional checks after a getElementById // Which slows things down for other browsers (hence the branching) if ( document.getElementById( id ) ) { Expr.find.ID = function( match, context, isXML ) { if ( typeof context.getElementById !== "undefined" && !isXML ) { var m = context.getElementById(match[1]); return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; } }; Expr.filter.ID = function( elem, match ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return elem.nodeType === 1 && node && node.nodeValue === match; }; } root.removeChild( form ); // release memory in IE root = form = null; })(); (function(){ // Check to see if the browser returns only elements // when doing getElementsByTagName("*") // Create a fake element var div = document.createElement("div"); div.appendChild( document.createComment("") ); // Make sure no comments are found if ( div.getElementsByTagName("*").length > 0 ) { Expr.find.TAG = function( match, context ) { var results = context.getElementsByTagName( match[1] ); // Filter out possible comments if ( match[1] === "*" ) { var tmp = []; for ( var i = 0; results[i]; i++ ) { if ( results[i].nodeType === 1 ) { tmp.push( results[i] ); } } results = tmp; } return results; }; } // Check to see if an attribute returns normalized href attributes div.innerHTML = ""; if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && div.firstChild.getAttribute("href") !== "#" ) { Expr.attrHandle.href = function( elem ) { return elem.getAttribute( "href", 2 ); }; } // release memory in IE div = null; })(); if ( document.querySelectorAll ) { (function(){ var oldSizzle = Sizzle, div = document.createElement("div"), id = "__sizzle__"; div.innerHTML = "

    "; // Safari can't handle uppercase or unicode characters when // in quirks mode. if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { return; } Sizzle = function( query, context, extra, seed ) { context = context || document; // Only use querySelectorAll on non-XML documents // (ID selectors don't work in non-HTML documents) if ( !seed && !Sizzle.isXML(context) ) { // See if we find a selector to speed up var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { // Speed-up: Sizzle("TAG") if ( match[1] ) { return makeArray( context.getElementsByTagName( query ), extra ); // Speed-up: Sizzle(".CLASS") } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { return makeArray( context.getElementsByClassName( match[2] ), extra ); } } if ( context.nodeType === 9 ) { // Speed-up: Sizzle("body") // The body element only exists once, optimize finding it if ( query === "body" && context.body ) { return makeArray( [ context.body ], extra ); // Speed-up: Sizzle("#ID") } else if ( match && match[3] ) { var elem = context.getElementById( match[3] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id === match[3] ) { return makeArray( [ elem ], extra ); } } else { return makeArray( [], extra ); } } try { return makeArray( context.querySelectorAll(query), extra ); } catch(qsaError) {} // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { var oldContext = context, old = context.getAttribute( "id" ), nid = old || id, hasParent = context.parentNode, relativeHierarchySelector = /^\s*[+~]/.test( query ); if ( !old ) { context.setAttribute( "id", nid ); } else { nid = nid.replace( /'/g, "\\$&" ); } if ( relativeHierarchySelector && hasParent ) { context = context.parentNode; } try { if ( !relativeHierarchySelector || hasParent ) { return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); } } catch(pseudoError) { } finally { if ( !old ) { oldContext.removeAttribute( "id" ); } } } } return oldSizzle(query, context, extra, seed); }; for ( var prop in oldSizzle ) { Sizzle[ prop ] = oldSizzle[ prop ]; } // release memory in IE div = null; })(); } (function(){ var html = document.documentElement, matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; if ( matches ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9 fails this) var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), pseudoWorks = false; try { // This should fail with an exception // Gecko does not error, returns false instead matches.call( document.documentElement, "[test!='']:sizzle" ); } catch( pseudoError ) { pseudoWorks = true; } Sizzle.matchesSelector = function( node, expr ) { // Make sure that attribute selectors are quoted expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); if ( !Sizzle.isXML( node ) ) { try { if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { var ret = matches.call( node, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || !disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9, so check for that node.document && node.document.nodeType !== 11 ) { return ret; } } } catch(e) {} } return Sizzle(expr, null, null, [node]).length > 0; }; } })(); (function(){ var div = document.createElement("div"); div.innerHTML = "
    "; // Opera can't find a second classname (in 9.6) // Also, make sure that getElementsByClassName actually exists if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { return; } // Safari caches class attributes, doesn't catch changes (in 3.2) div.lastChild.className = "e"; if ( div.getElementsByClassName("e").length === 1 ) { return; } Expr.order.splice(1, 0, "CLASS"); Expr.find.CLASS = function( match, context, isXML ) { if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { return context.getElementsByClassName(match[1]); } }; // release memory in IE div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 && !isXML ){ elem[ expando ] = doneName; elem.sizset = i; } if ( elem.nodeName.toLowerCase() === cur ) { match = elem; break; } elem = elem[dir]; } checkSet[i] = match; } } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { for ( var i = 0, l = checkSet.length; i < l; i++ ) { var elem = checkSet[i]; if ( elem ) { var match = false; elem = elem[dir]; while ( elem ) { if ( elem[ expando ] === doneName ) { match = checkSet[elem.sizset]; break; } if ( elem.nodeType === 1 ) { if ( !isXML ) { elem[ expando ] = doneName; elem.sizset = i; } if ( typeof cur !== "string" ) { if ( elem === cur ) { match = true; break; } } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { match = elem; break; } } elem = elem[dir]; } checkSet[i] = match; } } } if ( document.documentElement.contains ) { Sizzle.contains = function( a, b ) { return a !== b && (a.contains ? a.contains(b) : true); }; } else if ( document.documentElement.compareDocumentPosition ) { Sizzle.contains = function( a, b ) { return !!(a.compareDocumentPosition(b) & 16); }; } else { Sizzle.contains = function() { return false; }; } Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; var posProcess = function( selector, context, seed ) { var match, tmpSet = [], later = "", root = context.nodeType ? [context] : context; // Position selectors must be done after the filter // And so must :not(positional) so we move all PSEUDOs to the end while ( (match = Expr.match.PSEUDO.exec( selector )) ) { later += match[0]; selector = selector.replace( Expr.match.PSEUDO, "" ); } selector = Expr.relative[selector] ? selector + "*" : selector; for ( var i = 0, l = root.length; i < l; i++ ) { Sizzle( selector, root[i], tmpSet, seed ); } return Sizzle.filter( later, tmpSet ); }; // EXPOSE // Override sizzle attribute retrieval Sizzle.attr = jQuery.attr; Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; })(); var runtil = /Until$/, rparentsprev = /^(?:parents|prevUntil|prevAll)/, // Note: This RegExp should be improved, or likely pulled from Sizzle rmultiselector = /,/, isSimple = /^.[^:#\[\.,]*$/, slice = Array.prototype.slice, POS = jQuery.expr.match.POS, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.fn.extend({ find: function( selector ) { var self = this, i, l; if ( typeof selector !== "string" ) { return jQuery( selector ).filter(function() { for ( i = 0, l = self.length; i < l; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }); } var ret = this.pushStack( "", "find", selector ), length, n, r; for ( i = 0, l = this.length; i < l; i++ ) { length = ret.length; jQuery.find( selector, this[i], ret ); if ( i > 0 ) { // Make sure that the results are unique for ( n = length; n < ret.length; n++ ) { for ( r = 0; r < length; r++ ) { if ( ret[r] === ret[n] ) { ret.splice(n--, 1); break; } } } } } return ret; }, has: function( target ) { var targets = jQuery( target ); return this.filter(function() { for ( var i = 0, l = targets.length; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, not: function( selector ) { return this.pushStack( winnow(this, selector, false), "not", selector); }, filter: function( selector ) { return this.pushStack( winnow(this, selector, true), "filter", selector ); }, is: function( selector ) { return !!selector && ( typeof selector === "string" ? // If this is a positional selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". POS.test( selector ) ? jQuery( selector, this.context ).index( this[0] ) >= 0 : jQuery.filter( selector, this ).length > 0 : this.filter( selector ).length > 0 ); }, closest: function( selectors, context ) { var ret = [], i, l, cur = this[0]; // Array (deprecated as of jQuery 1.7) if ( jQuery.isArray( selectors ) ) { var level = 1; while ( cur && cur.ownerDocument && cur !== context ) { for ( i = 0; i < selectors.length; i++ ) { if ( jQuery( cur ).is( selectors[ i ] ) ) { ret.push({ selector: selectors[ i ], elem: cur, level: level }); } } cur = cur.parentNode; level++; } return ret; } // String var pos = POS.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( i = 0, l = this.length; i < l; i++ ) { cur = this[i]; while ( cur ) { if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { ret.push( cur ); break; } else { cur = cur.parentNode; if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { break; } } } } ret = ret.length > 1 ? jQuery.unique( ret ) : ret; return this.pushStack( ret, "closest", selectors ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { var set = typeof selector === "string" ? jQuery( selector, context ) : jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), all = jQuery.merge( this.get(), set ); return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? all : jQuery.unique( all ) ); }, andSelf: function() { return this.add( this.prevObject ); } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return jQuery.nth( elem, 2, "nextSibling" ); }, prev: function( elem ) { return jQuery.nth( elem, 2, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( elem.parentNode.firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.makeArray( elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( !runtil.test( name ) ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { ret = ret.reverse(); } return this.pushStack( ret, name, slice.call( arguments ).join(",") ); }; }); jQuery.extend({ filter: function( expr, elems, not ) { if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : jQuery.find.matches(expr, elems); }, dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, nth: function( cur, result, dir, elem ) { result = result || 1; var num = 0; for ( ; cur; cur = cur[dir] ) { if ( cur.nodeType === 1 && ++num === result ) { break; } } return cur; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { // Can't pass null or undefined to indexOf in Firefox 4 // Set to 0 to skip string check qualifier = qualifier || 0; if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep(elements, function( elem, i ) { var retVal = !!qualifier.call( elem, i, elem ); return retVal === keep; }); } else if ( qualifier.nodeType ) { return jQuery.grep(elements, function( elem, i ) { return ( elem === qualifier ) === keep; }); } else if ( typeof qualifier === "string" ) { var filtered = jQuery.grep(elements, function( elem ) { return elem.nodeType === 1; }); if ( isSimple.test( qualifier ) ) { return jQuery.filter(qualifier, filtered, !keep); } else { qualifier = jQuery.filter( qualifier, filtered ); } } return jQuery.grep(elements, function( elem, i ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; }); } function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, rtagName = /<([\w:]+)/, rtbody = /", "" ], legend: [ 1, "
    ", "
    " ], thead: [ 1, "", "
    " ], tr: [ 2, "", "
    " ], td: [ 3, "", "
    " ], col: [ 2, "", "
    " ], area: [ 1, "", "" ], _default: [ 0, "", "" ] }, safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; // IE can't serialize and ================================================ FILE: src/main/resources/static/css/animate.css ================================================ /* @charset "UTF-8"; ! Animate.css - http://daneden.me/animate Licensed under the MIT license Copyright (c) 2013 Daniel Eden Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .animated { -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-fill-mode: both; animation-fill-mode: both; z-index: 100; } .animated.infinite { -webkit-animation-iteration-count: infinite; animation-iteration-count: infinite; } .animated.hinge { -webkit-animation-duration: 2s; animation-duration: 2s; } @-webkit-keyframes bounce { 0%, 20%, 50%, 80%, 100% { -webkit-transform: translateY(0); transform: translateY(0); } 40% { -webkit-transform: translateY(-30px); transform: translateY(-30px); } 60% { -webkit-transform: translateY(-15px); transform: translateY(-15px); } } @keyframes bounce { 0%, 20%, 50%, 80%, 100% { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 40% { -webkit-transform: translateY(-30px); -ms-transform: translateY(-30px); transform: translateY(-30px); } 60% { -webkit-transform: translateY(-15px); -ms-transform: translateY(-15px); transform: translateY(-15px); } } .bounce { -webkit-animation-name: bounce; animation-name: bounce; } @-webkit-keyframes flash { 0%, 50%, 100% { opacity: 1; } 25%, 75% { opacity: 0; } } @keyframes flash { 0%, 50%, 100% { opacity: 1; } 25%, 75% { opacity: 0; } } .flash { -webkit-animation-name: flash; animation-name: flash; } originally authored by Nick Pettit - https://github.com/nickpettit/glide @-webkit-keyframes pulse { 0% { -webkit-transform: scale(1); transform: scale(1); } 50% { -webkit-transform: scale(1.1); transform: scale(1.1); } 100% { -webkit-transform: scale(1); transform: scale(1); } } @keyframes pulse { 0% { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } 50% { -webkit-transform: scale(1.1); -ms-transform: scale(1.1); transform: scale(1.1); } 100% { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } } .pulse { -webkit-animation-name: pulse; animation-name: pulse; } @-webkit-keyframes rubberBand { 0% { -webkit-transform: scale(1); transform: scale(1); } 30% { -webkit-transform: scaleX(1.25) scaleY(0.75); transform: scaleX(1.25) scaleY(0.75); } 40% { -webkit-transform: scaleX(0.75) scaleY(1.25); transform: scaleX(0.75) scaleY(1.25); } 60% { -webkit-transform: scaleX(1.15) scaleY(0.85); transform: scaleX(1.15) scaleY(0.85); } 100% { -webkit-transform: scale(1); transform: scale(1); } } @keyframes rubberBand { 0% { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } 30% { -webkit-transform: scaleX(1.25) scaleY(0.75); -ms-transform: scaleX(1.25) scaleY(0.75); transform: scaleX(1.25) scaleY(0.75); } 40% { -webkit-transform: scaleX(0.75) scaleY(1.25); -ms-transform: scaleX(0.75) scaleY(1.25); transform: scaleX(0.75) scaleY(1.25); } 60% { -webkit-transform: scaleX(1.15) scaleY(0.85); -ms-transform: scaleX(1.15) scaleY(0.85); transform: scaleX(1.15) scaleY(0.85); } 100% { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } } .rubberBand { -webkit-animation-name: rubberBand; animation-name: rubberBand; } @-webkit-keyframes shake { 0%, 100% { -webkit-transform: translateX(0); transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { -webkit-transform: translateX(-10px); transform: translateX(-10px); } 20%, 40%, 60%, 80% { -webkit-transform: translateX(10px); transform: translateX(10px); } } @keyframes shake { 0%, 100% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { -webkit-transform: translateX(-10px); -ms-transform: translateX(-10px); transform: translateX(-10px); } 20%, 40%, 60%, 80% { -webkit-transform: translateX(10px); -ms-transform: translateX(10px); transform: translateX(10px); } } .shake { -webkit-animation-name: shake; animation-name: shake; } @-webkit-keyframes swing { 20% { -webkit-transform: rotate(15deg); transform: rotate(15deg); } 40% { -webkit-transform: rotate(-10deg); transform: rotate(-10deg); } 60% { -webkit-transform: rotate(5deg); transform: rotate(5deg); } 80% { -webkit-transform: rotate(-5deg); transform: rotate(-5deg); } 100% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } } @keyframes swing { 20% { -webkit-transform: rotate(15deg); -ms-transform: rotate(15deg); transform: rotate(15deg); } 40% { -webkit-transform: rotate(-10deg); -ms-transform: rotate(-10deg); transform: rotate(-10deg); } 60% { -webkit-transform: rotate(5deg); -ms-transform: rotate(5deg); transform: rotate(5deg); } 80% { -webkit-transform: rotate(-5deg); -ms-transform: rotate(-5deg); transform: rotate(-5deg); } 100% { -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } } .swing { -webkit-transform-origin: top center; -ms-transform-origin: top center; transform-origin: top center; -webkit-animation-name: swing; animation-name: swing; } @-webkit-keyframes tada { 0% { -webkit-transform: scale(1); transform: scale(1); } 10%, 20% { -webkit-transform: scale(0.9) rotate(-3deg); transform: scale(0.9) rotate(-3deg); } 30%, 50%, 70%, 90% { -webkit-transform: scale(1.1) rotate(3deg); transform: scale(1.1) rotate(3deg); } 40%, 60%, 80% { -webkit-transform: scale(1.1) rotate(-3deg); transform: scale(1.1) rotate(-3deg); } 100% { -webkit-transform: scale(1) rotate(0); transform: scale(1) rotate(0); } } @keyframes tada { 0% { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } 10%, 20% { -webkit-transform: scale(0.9) rotate(-3deg); -ms-transform: scale(0.9) rotate(-3deg); transform: scale(0.9) rotate(-3deg); } 30%, 50%, 70%, 90% { -webkit-transform: scale(1.1) rotate(3deg); -ms-transform: scale(1.1) rotate(3deg); transform: scale(1.1) rotate(3deg); } 40%, 60%, 80% { -webkit-transform: scale(1.1) rotate(-3deg); -ms-transform: scale(1.1) rotate(-3deg); transform: scale(1.1) rotate(-3deg); } 100% { -webkit-transform: scale(1) rotate(0); -ms-transform: scale(1) rotate(0); transform: scale(1) rotate(0); } } .tada { -webkit-animation-name: tada; animation-name: tada; } originally authored by Nick Pettit - https://github.com/nickpettit/glide @-webkit-keyframes wobble { 0% { -webkit-transform: translateX(0%); transform: translateX(0%); } 15% { -webkit-transform: translateX(-25%) rotate(-5deg); transform: translateX(-25%) rotate(-5deg); } 30% { -webkit-transform: translateX(20%) rotate(3deg); transform: translateX(20%) rotate(3deg); } 45% { -webkit-transform: translateX(-15%) rotate(-3deg); transform: translateX(-15%) rotate(-3deg); } 60% { -webkit-transform: translateX(10%) rotate(2deg); transform: translateX(10%) rotate(2deg); } 75% { -webkit-transform: translateX(-5%) rotate(-1deg); transform: translateX(-5%) rotate(-1deg); } 100% { -webkit-transform: translateX(0%); transform: translateX(0%); } } @keyframes wobble { 0% { -webkit-transform: translateX(0%); -ms-transform: translateX(0%); transform: translateX(0%); } 15% { -webkit-transform: translateX(-25%) rotate(-5deg); -ms-transform: translateX(-25%) rotate(-5deg); transform: translateX(-25%) rotate(-5deg); } 30% { -webkit-transform: translateX(20%) rotate(3deg); -ms-transform: translateX(20%) rotate(3deg); transform: translateX(20%) rotate(3deg); } 45% { -webkit-transform: translateX(-15%) rotate(-3deg); -ms-transform: translateX(-15%) rotate(-3deg); transform: translateX(-15%) rotate(-3deg); } 60% { -webkit-transform: translateX(10%) rotate(2deg); -ms-transform: translateX(10%) rotate(2deg); transform: translateX(10%) rotate(2deg); } 75% { -webkit-transform: translateX(-5%) rotate(-1deg); -ms-transform: translateX(-5%) rotate(-1deg); transform: translateX(-5%) rotate(-1deg); } 100% { -webkit-transform: translateX(0%); -ms-transform: translateX(0%); transform: translateX(0%); } } .wobble { -webkit-animation-name: wobble; animation-name: wobble; } @-webkit-keyframes bounceIn { 0% { opacity: 0; -webkit-transform: scale(.3); transform: scale(.3); } 50% { opacity: 1; -webkit-transform: scale(1.05); transform: scale(1.05); } 70% { -webkit-transform: scale(.9); transform: scale(.9); } 100% { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } } @keyframes bounceIn { 0% { opacity: 0; -webkit-transform: scale(.3); -ms-transform: scale(.3); transform: scale(.3); } 50% { opacity: 1; -webkit-transform: scale(1.05); -ms-transform: scale(1.05); transform: scale(1.05); } 70% { -webkit-transform: scale(.9); -ms-transform: scale(.9); transform: scale(.9); } 100% { opacity: 1; -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } } .bounceIn { -webkit-animation-name: bounceIn; animation-name: bounceIn; } @-webkit-keyframes bounceInDown { 0% { opacity: 0; -webkit-transform: translateY(-2000px); transform: translateY(-2000px); } 60% { opacity: 1; -webkit-transform: translateY(30px); transform: translateY(30px); } 80% { -webkit-transform: translateY(-10px); transform: translateY(-10px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes bounceInDown { 0% { opacity: 0; -webkit-transform: translateY(-2000px); -ms-transform: translateY(-2000px); transform: translateY(-2000px); } 60% { opacity: 1; -webkit-transform: translateY(30px); -ms-transform: translateY(30px); transform: translateY(30px); } 80% { -webkit-transform: translateY(-10px); -ms-transform: translateY(-10px); transform: translateY(-10px); } 100% { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } } .bounceInDown { -webkit-animation-name: bounceInDown; animation-name: bounceInDown; } @-webkit-keyframes bounceInLeft { 0% { opacity: 0; -webkit-transform: translateX(-2000px); transform: translateX(-2000px); } 60% { opacity: 1; -webkit-transform: translateX(30px); transform: translateX(30px); } 80% { -webkit-transform: translateX(-10px); transform: translateX(-10px); } 100% { -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes bounceInLeft { 0% { opacity: 0; -webkit-transform: translateX(-2000px); -ms-transform: translateX(-2000px); transform: translateX(-2000px); } 60% { opacity: 1; -webkit-transform: translateX(30px); -ms-transform: translateX(30px); transform: translateX(30px); } 80% { -webkit-transform: translateX(-10px); -ms-transform: translateX(-10px); transform: translateX(-10px); } 100% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } } .bounceInLeft { -webkit-animation-name: bounceInLeft; animation-name: bounceInLeft; } @-webkit-keyframes bounceInRight { 0% { opacity: 0; -webkit-transform: translateX(2000px); transform: translateX(2000px); } 60% { opacity: 1; -webkit-transform: translateX(-30px); transform: translateX(-30px); } 80% { -webkit-transform: translateX(10px); transform: translateX(10px); } 100% { -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes bounceInRight { 0% { opacity: 0; -webkit-transform: translateX(2000px); -ms-transform: translateX(2000px); transform: translateX(2000px); } 60% { opacity: 1; -webkit-transform: translateX(-30px); -ms-transform: translateX(-30px); transform: translateX(-30px); } 80% { -webkit-transform: translateX(10px); -ms-transform: translateX(10px); transform: translateX(10px); } 100% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } } .bounceInRight { -webkit-animation-name: bounceInRight; animation-name: bounceInRight; } @-webkit-keyframes bounceInUp { 0% { opacity: 0; -webkit-transform: translateY(2000px); transform: translateY(2000px); } 60% { opacity: 1; -webkit-transform: translateY(-30px); transform: translateY(-30px); } 80% { -webkit-transform: translateY(10px); transform: translateY(10px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes bounceInUp { 0% { opacity: 0; -webkit-transform: translateY(2000px); -ms-transform: translateY(2000px); transform: translateY(2000px); } 60% { opacity: 1; -webkit-transform: translateY(-30px); -ms-transform: translateY(-30px); transform: translateY(-30px); } 80% { -webkit-transform: translateY(10px); -ms-transform: translateY(10px); transform: translateY(10px); } 100% { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } } .bounceInUp { -webkit-animation-name: bounceInUp; animation-name: bounceInUp; } @-webkit-keyframes bounceOut { 0% { -webkit-transform: scale(1); transform: scale(1); } 25% { -webkit-transform: scale(.95); transform: scale(.95); } 50% { opacity: 1; -webkit-transform: scale(1.1); transform: scale(1.1); } 100% { opacity: 0; -webkit-transform: scale(.3); transform: scale(.3); } } @keyframes bounceOut { 0% { -webkit-transform: scale(1); -ms-transform: scale(1); transform: scale(1); } 25% { -webkit-transform: scale(.95); -ms-transform: scale(.95); transform: scale(.95); } 50% { opacity: 1; -webkit-transform: scale(1.1); -ms-transform: scale(1.1); transform: scale(1.1); } 100% { opacity: 0; -webkit-transform: scale(.3); -ms-transform: scale(.3); transform: scale(.3); } } .bounceOut { -webkit-animation-name: bounceOut; animation-name: bounceOut; } @-webkit-keyframes bounceOutDown { 0% { -webkit-transform: translateY(0); transform: translateY(0); } 20% { opacity: 1; -webkit-transform: translateY(-20px); transform: translateY(-20px); } 100% { opacity: 0; -webkit-transform: translateY(2000px); transform: translateY(2000px); } } @keyframes bounceOutDown { 0% { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 20% { opacity: 1; -webkit-transform: translateY(-20px); -ms-transform: translateY(-20px); transform: translateY(-20px); } 100% { opacity: 0; -webkit-transform: translateY(2000px); -ms-transform: translateY(2000px); transform: translateY(2000px); } } .bounceOutDown { -webkit-animation-name: bounceOutDown; animation-name: bounceOutDown; } @-webkit-keyframes bounceOutLeft { 0% { -webkit-transform: translateX(0); transform: translateX(0); } 20% { opacity: 1; -webkit-transform: translateX(20px); transform: translateX(20px); } 100% { opacity: 0; -webkit-transform: translateX(-2000px); transform: translateX(-2000px); } } @keyframes bounceOutLeft { 0% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 20% { opacity: 1; -webkit-transform: translateX(20px); -ms-transform: translateX(20px); transform: translateX(20px); } 100% { opacity: 0; -webkit-transform: translateX(-2000px); -ms-transform: translateX(-2000px); transform: translateX(-2000px); } } .bounceOutLeft { -webkit-animation-name: bounceOutLeft; animation-name: bounceOutLeft; } @-webkit-keyframes bounceOutRight { 0% { -webkit-transform: translateX(0); transform: translateX(0); } 20% { opacity: 1; -webkit-transform: translateX(-20px); transform: translateX(-20px); } 100% { opacity: 0; -webkit-transform: translateX(2000px); transform: translateX(2000px); } } @keyframes bounceOutRight { 0% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 20% { opacity: 1; -webkit-transform: translateX(-20px); -ms-transform: translateX(-20px); transform: translateX(-20px); } 100% { opacity: 0; -webkit-transform: translateX(2000px); -ms-transform: translateX(2000px); transform: translateX(2000px); } } .bounceOutRight { -webkit-animation-name: bounceOutRight; animation-name: bounceOutRight; } @-webkit-keyframes bounceOutUp { 0% { -webkit-transform: translateY(0); transform: translateY(0); } 20% { opacity: 1; -webkit-transform: translateY(20px); transform: translateY(20px); } 100% { opacity: 0; -webkit-transform: translateY(-2000px); transform: translateY(-2000px); } } @keyframes bounceOutUp { 0% { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 20% { opacity: 1; -webkit-transform: translateY(20px); -ms-transform: translateY(20px); transform: translateY(20px); } 100% { opacity: 0; -webkit-transform: translateY(-2000px); -ms-transform: translateY(-2000px); transform: translateY(-2000px); } } .bounceOutUp { -webkit-animation-name: bounceOutUp; animation-name: bounceOutUp; } @-webkit-keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes fadeIn { 0% { opacity: 0; } 100% { opacity: 1; } } .fadeIn { -webkit-animation-name: fadeIn; animation-name: fadeIn; } @-webkit-keyframes fadeInDown { 0% { opacity: 0; -webkit-transform: translateY(-20px); transform: translateY(-20px); } 100% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes fadeInDown { 0% { opacity: 0; -webkit-transform: translateY(-20px); -ms-transform: translateY(-20px); transform: translateY(-20px); } 100% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } } .fadeInDown { -webkit-animation-name: fadeInDown; animation-name: fadeInDown; } @-webkit-keyframes fadeInDownBig { 0% { opacity: 0; -webkit-transform: translateY(-2000px); transform: translateY(-2000px); } 100% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes fadeInDownBig { 0% { opacity: 0; -webkit-transform: translateY(-2000px); -ms-transform: translateY(-2000px); transform: translateY(-2000px); } 100% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } } .fadeInDownBig { -webkit-animation-name: fadeInDownBig; animation-name: fadeInDownBig; } @-webkit-keyframes fadeInLeft { 0% { opacity: 0; -webkit-transform: translateX(-20px); transform: translateX(-20px); } 100% { opacity: 1; -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes fadeInLeft { 0% { opacity: 0; -webkit-transform: translateX(-20px); -ms-transform: translateX(-20px); transform: translateX(-20px); } 100% { opacity: 1; -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } } .fadeInLeft { -webkit-animation-name: fadeInLeft; animation-name: fadeInLeft; } @-webkit-keyframes fadeInLeftBig { 0% { opacity: 0; -webkit-transform: translateX(-2000px); transform: translateX(-2000px); } 100% { opacity: 1; -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes fadeInLeftBig { 0% { opacity: 0; -webkit-transform: translateX(-2000px); -ms-transform: translateX(-2000px); transform: translateX(-2000px); } 100% { opacity: 1; -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } } .fadeInLeftBig { -webkit-animation-name: fadeInLeftBig; animation-name: fadeInLeftBig; } @-webkit-keyframes fadeInRight { 0% { opacity: 0; -webkit-transform: translateX(20px); transform: translateX(20px); } 100% { opacity: 1; -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes fadeInRight { 0% { opacity: 0; -webkit-transform: translateX(40px); -ms-transform: translateX(40px); transform: translateX(40px); } 100% { opacity: 1; -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } } .fadeInRight { -webkit-animation-name: fadeInRight; animation-name: fadeInRight; } @-webkit-keyframes fadeInRightBig { 0% { opacity: 0; -webkit-transform: translateX(2000px); transform: translateX(2000px); } 100% { opacity: 1; -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes fadeInRightBig { 0% { opacity: 0; -webkit-transform: translateX(2000px); -ms-transform: translateX(2000px); transform: translateX(2000px); } 100% { opacity: 1; -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } } .fadeInRightBig { -webkit-animation-name: fadeInRightBig; animation-name: fadeInRightBig; } @-webkit-keyframes fadeInUp { 0% { opacity: 0; -webkit-transform: translateY(20px); transform: translateY(20px); } 100% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes fadeInUp { 0% { opacity: 0; -webkit-transform: translateY(20px); -ms-transform: translateY(20px); transform: translateY(20px); } 100% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } } .fadeInUp { -webkit-animation-name: fadeInUp; animation-name: fadeInUp; } @-webkit-keyframes fadeInUpBig { 0% { opacity: 0; -webkit-transform: translateY(2000px); transform: translateY(2000px); } 100% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes fadeInUpBig { 0% { opacity: 0; -webkit-transform: translateY(2000px); -ms-transform: translateY(2000px); transform: translateY(2000px); } 100% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } } .fadeInUpBig { -webkit-animation-name: fadeInUpBig; animation-name: fadeInUpBig; } @-webkit-keyframes fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } @keyframes fadeOut { 0% { opacity: 1; } 100% { opacity: 0; } } .fadeOut { -webkit-animation-name: fadeOut; animation-name: fadeOut; } @-webkit-keyframes fadeOutDown { 0% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(20px); transform: translateY(20px); } } @keyframes fadeOutDown { 0% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(20px); -ms-transform: translateY(20px); transform: translateY(20px); } } .fadeOutDown { -webkit-animation-name: fadeOutDown; animation-name: fadeOutDown; } @-webkit-keyframes fadeOutDownBig { 0% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(2000px); transform: translateY(2000px); } } @keyframes fadeOutDownBig { 0% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(2000px); -ms-transform: translateY(2000px); transform: translateY(2000px); } } .fadeOutDownBig { -webkit-animation-name: fadeOutDownBig; animation-name: fadeOutDownBig; } @-webkit-keyframes fadeOutLeft { 0% { opacity: 1; -webkit-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(-20px); transform: translateX(-20px); } } @keyframes fadeOutLeft { 0% { opacity: 1; -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(-20px); -ms-transform: translateX(-20px); transform: translateX(-20px); } } .fadeOutLeft { -webkit-animation-name: fadeOutLeft; animation-name: fadeOutLeft; } @-webkit-keyframes fadeOutLeftBig { 0% { opacity: 1; -webkit-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(-2000px); transform: translateX(-2000px); } } @keyframes fadeOutLeftBig { 0% { opacity: 1; -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(-2000px); -ms-transform: translateX(-2000px); transform: translateX(-2000px); } } .fadeOutLeftBig { -webkit-animation-name: fadeOutLeftBig; animation-name: fadeOutLeftBig; } @-webkit-keyframes fadeOutRight { 0% { opacity: 1; -webkit-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(20px); transform: translateX(20px); } } @keyframes fadeOutRight { 0% { opacity: 1; -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(20px); -ms-transform: translateX(20px); transform: translateX(20px); } } .fadeOutRight { -webkit-animation-name: fadeOutRight; animation-name: fadeOutRight; } @-webkit-keyframes fadeOutRightBig { 0% { opacity: 1; -webkit-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(2000px); transform: translateX(2000px); } } @keyframes fadeOutRightBig { 0% { opacity: 1; -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(2000px); -ms-transform: translateX(2000px); transform: translateX(2000px); } } .fadeOutRightBig { -webkit-animation-name: fadeOutRightBig; animation-name: fadeOutRightBig; } @-webkit-keyframes fadeOutUp { 0% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(-20px); transform: translateY(-20px); } } @keyframes fadeOutUp { 0% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(-20px); -ms-transform: translateY(-20px); transform: translateY(-20px); } } .fadeOutUp { -webkit-animation-name: fadeOutUp; animation-name: fadeOutUp; } @-webkit-keyframes fadeOutUpBig { 0% { opacity: 1; -webkit-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(-2000px); transform: translateY(-2000px); } } @keyframes fadeOutUpBig { 0% { opacity: 1; -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(-2000px); -ms-transform: translateY(-2000px); transform: translateY(-2000px); } } .fadeOutUpBig { -webkit-animation-name: fadeOutUpBig; animation-name: fadeOutUpBig; } @-webkit-keyframes flip { 0% { -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); transform: perspective(400px) translateZ(0) rotateY(0) scale(1); -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } 40% { -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } 50% { -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); -webkit-animation-timing-function: ease-in; animation-timing-function: ease-in; } 80% { -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); -webkit-animation-timing-function: ease-in; animation-timing-function: ease-in; } 100% { -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); -webkit-animation-timing-function: ease-in; animation-timing-function: ease-in; } } @keyframes flip { 0% { -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); transform: perspective(400px) translateZ(0) rotateY(0) scale(1); -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } 40% { -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } 50% { -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); -webkit-animation-timing-function: ease-in; animation-timing-function: ease-in; } 80% { -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); -webkit-animation-timing-function: ease-in; animation-timing-function: ease-in; } 100% { -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); -webkit-animation-timing-function: ease-in; animation-timing-function: ease-in; } } .animated.flip { -webkit-backface-visibility: visible; -ms-backface-visibility: visible; backface-visibility: visible; -webkit-animation-name: flip; animation-name: flip; } @-webkit-keyframes flipInX { 0% { -webkit-transform: perspective(400px) rotateX(90deg); transform: perspective(400px) rotateX(90deg); opacity: 0; } 40% { -webkit-transform: perspective(400px) rotateX(-10deg); transform: perspective(400px) rotateX(-10deg); } 70% { -webkit-transform: perspective(400px) rotateX(10deg); transform: perspective(400px) rotateX(10deg); } 100% { -webkit-transform: perspective(400px) rotateX(0deg); transform: perspective(400px) rotateX(0deg); opacity: 1; } } @keyframes flipInX { 0% { -webkit-transform: perspective(400px) rotateX(90deg); -ms-transform: perspective(400px) rotateX(90deg); transform: perspective(400px) rotateX(90deg); opacity: 0; } 40% { -webkit-transform: perspective(400px) rotateX(-10deg); -ms-transform: perspective(400px) rotateX(-10deg); transform: perspective(400px) rotateX(-10deg); } 70% { -webkit-transform: perspective(400px) rotateX(10deg); -ms-transform: perspective(400px) rotateX(10deg); transform: perspective(400px) rotateX(10deg); } 100% { -webkit-transform: perspective(400px) rotateX(0deg); -ms-transform: perspective(400px) rotateX(0deg); transform: perspective(400px) rotateX(0deg); opacity: 1; } } .flipInX { -webkit-backface-visibility: visible !important; -ms-backface-visibility: visible !important; backface-visibility: visible !important; -webkit-animation-name: flipInX; animation-name: flipInX; } @-webkit-keyframes flipInY { 0% { -webkit-transform: perspective(400px) rotateY(90deg); transform: perspective(400px) rotateY(90deg); opacity: 0; } 40% { -webkit-transform: perspective(400px) rotateY(-10deg); transform: perspective(400px) rotateY(-10deg); } 70% { -webkit-transform: perspective(400px) rotateY(10deg); transform: perspective(400px) rotateY(10deg); } 100% { -webkit-transform: perspective(400px) rotateY(0deg); transform: perspective(400px) rotateY(0deg); opacity: 1; } } @keyframes flipInY { 0% { -webkit-transform: perspective(400px) rotateY(90deg); -ms-transform: perspective(400px) rotateY(90deg); transform: perspective(400px) rotateY(90deg); opacity: 0; } 40% { -webkit-transform: perspective(400px) rotateY(-10deg); -ms-transform: perspective(400px) rotateY(-10deg); transform: perspective(400px) rotateY(-10deg); } 70% { -webkit-transform: perspective(400px) rotateY(10deg); -ms-transform: perspective(400px) rotateY(10deg); transform: perspective(400px) rotateY(10deg); } 100% { -webkit-transform: perspective(400px) rotateY(0deg); -ms-transform: perspective(400px) rotateY(0deg); transform: perspective(400px) rotateY(0deg); opacity: 1; } } .flipInY { -webkit-backface-visibility: visible !important; -ms-backface-visibility: visible !important; backface-visibility: visible !important; -webkit-animation-name: flipInY; animation-name: flipInY; } @-webkit-keyframes flipOutX { 0% { -webkit-transform: perspective(400px) rotateX(0deg); transform: perspective(400px) rotateX(0deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotateX(90deg); transform: perspective(400px) rotateX(90deg); opacity: 0; } } @keyframes flipOutX { 0% { -webkit-transform: perspective(400px) rotateX(0deg); -ms-transform: perspective(400px) rotateX(0deg); transform: perspective(400px) rotateX(0deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotateX(90deg); -ms-transform: perspective(400px) rotateX(90deg); transform: perspective(400px) rotateX(90deg); opacity: 0; } } .flipOutX { -webkit-animation-name: flipOutX; animation-name: flipOutX; -webkit-backface-visibility: visible !important; -ms-backface-visibility: visible !important; backface-visibility: visible !important; } @-webkit-keyframes flipOutY { 0% { -webkit-transform: perspective(400px) rotateY(0deg); transform: perspective(400px) rotateY(0deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotateY(90deg); transform: perspective(400px) rotateY(90deg); opacity: 0; } } @keyframes flipOutY { 0% { -webkit-transform: perspective(400px) rotateY(0deg); -ms-transform: perspective(400px) rotateY(0deg); transform: perspective(400px) rotateY(0deg); opacity: 1; } 100% { -webkit-transform: perspective(400px) rotateY(90deg); -ms-transform: perspective(400px) rotateY(90deg); transform: perspective(400px) rotateY(90deg); opacity: 0; } } .flipOutY { -webkit-backface-visibility: visible !important; -ms-backface-visibility: visible !important; backface-visibility: visible !important; -webkit-animation-name: flipOutY; animation-name: flipOutY; } @-webkit-keyframes lightSpeedIn { 0% { -webkit-transform: translateX(100%) skewX(-30deg); transform: translateX(100%) skewX(-30deg); opacity: 0; } 60% { -webkit-transform: translateX(-20%) skewX(30deg); transform: translateX(-20%) skewX(30deg); opacity: 1; } 80% { -webkit-transform: translateX(0%) skewX(-15deg); transform: translateX(0%) skewX(-15deg); opacity: 1; } 100% { -webkit-transform: translateX(0%) skewX(0deg); transform: translateX(0%) skewX(0deg); opacity: 1; } } @keyframes lightSpeedIn { 0% { -webkit-transform: translateX(100%) skewX(-30deg); -ms-transform: translateX(100%) skewX(-30deg); transform: translateX(100%) skewX(-30deg); opacity: 0; } 60% { -webkit-transform: translateX(-20%) skewX(30deg); -ms-transform: translateX(-20%) skewX(30deg); transform: translateX(-20%) skewX(30deg); opacity: 1; } 80% { -webkit-transform: translateX(0%) skewX(-15deg); -ms-transform: translateX(0%) skewX(-15deg); transform: translateX(0%) skewX(-15deg); opacity: 1; } 100% { -webkit-transform: translateX(0%) skewX(0deg); -ms-transform: translateX(0%) skewX(0deg); transform: translateX(0%) skewX(0deg); opacity: 1; } } .lightSpeedIn { -webkit-animation-name: lightSpeedIn; animation-name: lightSpeedIn; -webkit-animation-timing-function: ease-out; animation-timing-function: ease-out; } @-webkit-keyframes lightSpeedOut { 0% { -webkit-transform: translateX(0%) skewX(0deg); transform: translateX(0%) skewX(0deg); opacity: 1; } 100% { -webkit-transform: translateX(100%) skewX(-30deg); transform: translateX(100%) skewX(-30deg); opacity: 0; } } @keyframes lightSpeedOut { 0% { -webkit-transform: translateX(0%) skewX(0deg); -ms-transform: translateX(0%) skewX(0deg); transform: translateX(0%) skewX(0deg); opacity: 1; } 100% { -webkit-transform: translateX(100%) skewX(-30deg); -ms-transform: translateX(100%) skewX(-30deg); transform: translateX(100%) skewX(-30deg); opacity: 0; } } .lightSpeedOut { -webkit-animation-name: lightSpeedOut; animation-name: lightSpeedOut; -webkit-animation-timing-function: ease-in; animation-timing-function: ease-in; } @-webkit-keyframes rotateIn { 0% { -webkit-transform-origin: center center; transform-origin: center center; -webkit-transform: rotate(-200deg); transform: rotate(-200deg); opacity: 0; } 100% { -webkit-transform-origin: center center; transform-origin: center center; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } } @keyframes rotateIn { 0% { -webkit-transform-origin: center center; -ms-transform-origin: center center; transform-origin: center center; -webkit-transform: rotate(-200deg); -ms-transform: rotate(-200deg); transform: rotate(-200deg); opacity: 0; } 100% { -webkit-transform-origin: center center; -ms-transform-origin: center center; transform-origin: center center; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } } .rotateIn { -webkit-animation-name: rotateIn; animation-name: rotateIn; } @-webkit-keyframes rotateInDownLeft { 0% { -webkit-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(-90deg); transform: rotate(-90deg); opacity: 0; } 100% { -webkit-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } } @keyframes rotateInDownLeft { 0% { -webkit-transform-origin: left bottom; -ms-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg); opacity: 0; } 100% { -webkit-transform-origin: left bottom; -ms-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } } .rotateInDownLeft { -webkit-animation-name: rotateInDownLeft; animation-name: rotateInDownLeft; } @-webkit-keyframes rotateInDownRight { 0% { -webkit-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } 100% { -webkit-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } } @keyframes rotateInDownRight { 0% { -webkit-transform-origin: right bottom; -ms-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } 100% { -webkit-transform-origin: right bottom; -ms-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } } .rotateInDownRight { -webkit-animation-name: rotateInDownRight; animation-name: rotateInDownRight; } @-webkit-keyframes rotateInUpLeft { 0% { -webkit-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } 100% { -webkit-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } } @keyframes rotateInUpLeft { 0% { -webkit-transform-origin: left bottom; -ms-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } 100% { -webkit-transform-origin: left bottom; -ms-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } } .rotateInUpLeft { -webkit-animation-name: rotateInUpLeft; animation-name: rotateInUpLeft; } @-webkit-keyframes rotateInUpRight { 0% { -webkit-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(-90deg); transform: rotate(-90deg); opacity: 0; } 100% { -webkit-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } } @keyframes rotateInUpRight { 0% { -webkit-transform-origin: right bottom; -ms-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg); opacity: 0; } 100% { -webkit-transform-origin: right bottom; -ms-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } } .rotateInUpRight { -webkit-animation-name: rotateInUpRight; animation-name: rotateInUpRight; } @-webkit-keyframes rotateOut { 0% { -webkit-transform-origin: center center; transform-origin: center center; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: center center; transform-origin: center center; -webkit-transform: rotate(200deg); transform: rotate(200deg); opacity: 0; } } @keyframes rotateOut { 0% { -webkit-transform-origin: center center; -ms-transform-origin: center center; transform-origin: center center; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: center center; -ms-transform-origin: center center; transform-origin: center center; -webkit-transform: rotate(200deg); -ms-transform: rotate(200deg); transform: rotate(200deg); opacity: 0; } } .rotateOut { -webkit-animation-name: rotateOut; animation-name: rotateOut; } @-webkit-keyframes rotateOutDownLeft { 0% { -webkit-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } } @keyframes rotateOutDownLeft { 0% { -webkit-transform-origin: left bottom; -ms-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: left bottom; -ms-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } } .rotateOutDownLeft { -webkit-animation-name: rotateOutDownLeft; animation-name: rotateOutDownLeft; } @-webkit-keyframes rotateOutDownRight { 0% { -webkit-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(-90deg); transform: rotate(-90deg); opacity: 0; } } @keyframes rotateOutDownRight { 0% { -webkit-transform-origin: right bottom; -ms-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: right bottom; -ms-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg); opacity: 0; } } .rotateOutDownRight { -webkit-animation-name: rotateOutDownRight; animation-name: rotateOutDownRight; } @-webkit-keyframes rotateOutUpLeft { 0% { -webkit-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(-90deg); transform: rotate(-90deg); opacity: 0; } } @keyframes rotateOutUpLeft { 0% { -webkit-transform-origin: left bottom; -ms-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: left bottom; -ms-transform-origin: left bottom; transform-origin: left bottom; -webkit-transform: rotate(-90deg); -ms-transform: rotate(-90deg); transform: rotate(-90deg); opacity: 0; } } .rotateOutUpLeft { -webkit-animation-name: rotateOutUpLeft; animation-name: rotateOutUpLeft; } @-webkit-keyframes rotateOutUpRight { 0% { -webkit-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } } @keyframes rotateOutUpRight { 0% { -webkit-transform-origin: right bottom; -ms-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); opacity: 1; } 100% { -webkit-transform-origin: right bottom; -ms-transform-origin: right bottom; transform-origin: right bottom; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); opacity: 0; } } .rotateOutUpRight { -webkit-animation-name: rotateOutUpRight; animation-name: rotateOutUpRight; } @-webkit-keyframes slideInDown { 0% { opacity: 0; -webkit-transform: translateY(-2000px); transform: translateY(-2000px); } 100% { -webkit-transform: translateY(0); transform: translateY(0); } } @keyframes slideInDown { 0% { opacity: 0; -webkit-transform: translateY(-2000px); -ms-transform: translateY(-2000px); transform: translateY(-2000px); } 100% { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } } .slideInDown { -webkit-animation-name: slideInDown; animation-name: slideInDown; } @-webkit-keyframes slideInLeft { 0% { opacity: 0; -webkit-transform: translateX(-2000px); transform: translateX(-2000px); } 100% { -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes slideInLeft { 0% { opacity: 0; -webkit-transform: translateX(-2000px); -ms-transform: translateX(-2000px); transform: translateX(-2000px); } 100% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } } .slideInLeft { -webkit-animation-name: slideInLeft; animation-name: slideInLeft; } @-webkit-keyframes slideInRight { 0% { opacity: 0; -webkit-transform: translateX(2000px); transform: translateX(2000px); } 100% { -webkit-transform: translateX(0); transform: translateX(0); } } @keyframes slideInRight { 0% { opacity: 0; -webkit-transform: translateX(2000px); -ms-transform: translateX(2000px); transform: translateX(2000px); } 100% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } } .slideInRight { -webkit-animation-name: slideInRight; animation-name: slideInRight; } @-webkit-keyframes slideOutLeft { 0% { -webkit-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(-2000px); transform: translateX(-2000px); } } @keyframes slideOutLeft { 0% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(-2000px); -ms-transform: translateX(-2000px); transform: translateX(-2000px); } } .slideOutLeft { -webkit-animation-name: slideOutLeft; animation-name: slideOutLeft; } @-webkit-keyframes slideOutRight { 0% { -webkit-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(2000px); transform: translateX(2000px); } } @keyframes slideOutRight { 0% { -webkit-transform: translateX(0); -ms-transform: translateX(0); transform: translateX(0); } 100% { opacity: 0; -webkit-transform: translateX(2000px); -ms-transform: translateX(2000px); transform: translateX(2000px); } } .slideOutRight { -webkit-animation-name: slideOutRight; animation-name: slideOutRight; } @-webkit-keyframes slideOutUp { 0% { -webkit-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(-2000px); transform: translateY(-2000px); } } @keyframes slideOutUp { 0% { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(-2000px); -ms-transform: translateY(-2000px); transform: translateY(-2000px); } } .slideOutUp { -webkit-animation-name: slideOutUp; animation-name: slideOutUp; } @-webkit-keyframes slideOutDown { 0% { -webkit-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(2000px); transform: translateY(2000px); } } @keyframes slideOutDown { 0% { -webkit-transform: translateY(0); -ms-transform: translateY(0); transform: translateY(0); } 100% { opacity: 0; -webkit-transform: translateY(2000px); -ms-transform: translateY(2000px); transform: translateY(2000px); } } .slideOutDown { -webkit-animation-name: slideOutDown; animation-name: slideOutDown; } @-webkit-keyframes hinge { 0% { -webkit-transform: rotate(0); transform: rotate(0); -webkit-transform-origin: top left; transform-origin: top left; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 20%, 60% { -webkit-transform: rotate(80deg); transform: rotate(80deg); -webkit-transform-origin: top left; transform-origin: top left; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 40% { -webkit-transform: rotate(60deg); transform: rotate(60deg); -webkit-transform-origin: top left; transform-origin: top left; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 80% { -webkit-transform: rotate(60deg) translateY(0); transform: rotate(60deg) translateY(0); -webkit-transform-origin: top left; transform-origin: top left; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; opacity: 1; } 100% { -webkit-transform: translateY(700px); transform: translateY(700px); opacity: 0; } } @keyframes hinge { 0% { -webkit-transform: rotate(0); -ms-transform: rotate(0); transform: rotate(0); -webkit-transform-origin: top left; -ms-transform-origin: top left; transform-origin: top left; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 20%, 60% { -webkit-transform: rotate(80deg); -ms-transform: rotate(80deg); transform: rotate(80deg); -webkit-transform-origin: top left; -ms-transform-origin: top left; transform-origin: top left; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 40% { -webkit-transform: rotate(60deg); -ms-transform: rotate(60deg); transform: rotate(60deg); -webkit-transform-origin: top left; -ms-transform-origin: top left; transform-origin: top left; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; } 80% { -webkit-transform: rotate(60deg) translateY(0); -ms-transform: rotate(60deg) translateY(0); transform: rotate(60deg) translateY(0); -webkit-transform-origin: top left; -ms-transform-origin: top left; transform-origin: top left; -webkit-animation-timing-function: ease-in-out; animation-timing-function: ease-in-out; opacity: 1; } 100% { -webkit-transform: translateY(700px); -ms-transform: translateY(700px); transform: translateY(700px); opacity: 0; } } .hinge { -webkit-animation-name: hinge; animation-name: hinge; } originally authored by Nick Pettit - https://github.com/nickpettit/glide @-webkit-keyframes rollIn { 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); transform: translateX(-100%) rotate(-120deg); } 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); transform: translateX(0px) rotate(0deg); } } @keyframes rollIn { 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); -ms-transform: translateX(-100%) rotate(-120deg); transform: translateX(-100%) rotate(-120deg); } 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); -ms-transform: translateX(0px) rotate(0deg); transform: translateX(0px) rotate(0deg); } } .rollIn { -webkit-animation-name: rollIn; animation-name: rollIn; } originally authored by Nick Pettit - https://github.com/nickpettit/glide @-webkit-keyframes rollOut { 0% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); transform: translateX(0px) rotate(0deg); } 100% { opacity: 0; -webkit-transform: translateX(100%) rotate(120deg); transform: translateX(100%) rotate(120deg); } } @keyframes rollOut { 0% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); -ms-transform: translateX(0px) rotate(0deg); transform: translateX(0px) rotate(0deg); } 100% { opacity: 0; -webkit-transform: translateX(100%) rotate(120deg); -ms-transform: translateX(100%) rotate(120deg); transform: translateX(100%) rotate(120deg); } } .rollOut { -webkit-animation-name: rollOut; animation-name: rollOut; } */ ================================================ FILE: src/main/resources/static/css/blog/clean-blog.css ================================================ /*! * Clean Blog v1.0.0 (http://startbootstrap.com) * Copyright 2014 Start Bootstrap * Licensed under Apache 2.0 (https://github.com/IronSummitMedia/startbootstrap/blob/gh-pages/LICENSE) */ body { font-family: 'Lora', 'Times New Roman', serif; font-size: 20px; color: #404040; } p { line-height: 1.5; margin: 30px 0; } p a { text-decoration: underline; } h1, h2, h3, h4, h5, h6 { font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 800; } a { color: #404040; } a:hover, a:focus { color: #0085a1; } a img:hover, a img:focus { cursor: zoom-in; } blockquote { color: #808080; font-style: italic; } hr.small { max-width: 100px; margin: 15px auto; border-width: 4px; border-color: white; } .navbar-custom { position: absolute; top: 0; left: 0; width: 100%; z-index: 3; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; } .navbar-custom .navbar-brand { font-weight: 800; } .navbar-custom .nav li a { text-transform: uppercase; font-size: 18px; font-weight: 800; letter-spacing: 1px; } @media only screen and (min-width: 768px) { .navbar-custom { background: transparent; border-bottom: 1px solid transparent; } .navbar-custom .navbar-brand { color: white; padding: 20px; } .navbar-custom .navbar-brand:hover, .navbar-custom .navbar-brand:focus { color: rgba(255, 255, 255, 0.8); } .navbar-custom .nav li a { color: white; padding: 20px; } .navbar-custom .nav li a:hover, .navbar-custom .nav li a:focus { color: rgba(255, 255, 255, 0.8); } } @media only screen and (min-width: 1170px) { .navbar-custom { -webkit-transition: background-color 0.3s; -moz-transition: background-color 0.3s; transition: background-color 0.3s; /* Force Hardware Acceleration in WebKit */ -webkit-transform: translate3d(0, 0, 0); -moz-transform: translate3d(0, 0, 0); -ms-transform: translate3d(0, 0, 0); -o-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); -webkit-backface-visibility: hidden; backface-visibility: hidden; } .navbar-custom.is-fixed { /* when the user scrolls down, we hide the header right above the viewport */ position: fixed; top: -61px; background-color: rgba(255, 255, 255, 0.9); border-bottom: 1px solid #f2f2f2; -webkit-transition: -webkit-transform 0.3s; -moz-transition: -moz-transform 0.3s; transition: transform 0.3s; } .navbar-custom.is-fixed .navbar-brand { color: #404040; } .navbar-custom.is-fixed .navbar-brand:hover, .navbar-custom.is-fixed .navbar-brand:focus { color: #0085a1; } .navbar-custom.is-fixed .nav li a { color: #404040; } .navbar-custom.is-fixed .nav li a:hover, .navbar-custom.is-fixed .nav li a:focus { color: #0085a1; } .navbar-custom.is-visible { /* if the user changes the scrolling direction, we show the header */ -webkit-transform: translate3d(0, 100%, 0); -moz-transform: translate3d(0, 100%, 0); -ms-transform: translate3d(0, 100%, 0); -o-transform: translate3d(0, 100%, 0); transform: translate3d(0, 100%, 0); } } .intro-header { background-color: #808080; background: no-repeat center center; background-attachment: scroll; -webkit-background-size: cover; -moz-background-size: cover; background-size: cover; -o-background-size: cover; margin-bottom: 50px; } .intro-header .site-heading, .intro-header .post-heading, .intro-header .page-heading { padding: 100px 0 50px; color: white; } @media only screen and (min-width: 768px) { .intro-header .site-heading, .intro-header .post-heading, .intro-header .page-heading { padding: 150px 0; } } .intro-header .site-heading, .intro-header .page-heading { text-align: center; } .intro-header .site-heading h1, .intro-header .page-heading h1 { margin-top: 0; font-size: 50px; } .intro-header .site-heading .subheading, .intro-header .page-heading .subheading { font-size: 24px; line-height: 1.1; display: block; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-weight: 300; margin: 10px 0 0; } @media only screen and (min-width: 768px) { .intro-header .site-heading h1, .intro-header .page-heading h1 { font-size: 80px; } } .intro-header .post-heading h1 { font-size: 35px; } .intro-header .post-heading .subheading, .intro-header .post-heading .meta { line-height: 1.1; display: block; } .intro-header .post-heading .subheading { font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 24px; margin: 10px 0 30px; font-weight: 600; } .intro-header .post-heading .meta { font-family: 'Lora', 'Times New Roman', serif; font-style: italic; font-weight: 300; font-size: 20px; } .intro-header .post-heading .meta a { color: white; } @media only screen and (min-width: 768px) { .intro-header .post-heading h1 { font-size: 55px; } .intro-header .post-heading .subheading { font-size: 30px; } } .post-preview > a { color: #404040; } .post-preview > a:hover, .post-preview > a:focus { text-decoration: none; color: #0085a1; } .post-preview > a > .post-title { font-size: 30px; margin-top: 30px; margin-bottom: 10px; } .post-preview > a > .post-subtitle { margin: 0; font-weight: 300; margin-bottom: 10px; } .post-preview > .post-meta { color: #808080; font-size: 18px; font-style: italic; margin-top: 0; } .post-preview > .post-meta > a { text-decoration: none; color: #404040; } .post-preview > .post-meta > a:hover, .post-preview > .post-meta > a:focus { color: #0085a1; text-decoration: underline; } @media only screen and (min-width: 768px) { .post-preview > a > .post-title { font-size: 36px; } } .section-heading { font-size: 36px; margin-top: 60px; font-weight: 700; } .caption { text-align: center; font-size: 14px; padding: 10px; font-style: italic; margin: 0; display: block; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; } footer { padding: 50px 0 65px; } footer .list-inline { margin: 0; padding: 0; } footer .copyright { font-size: 14px; text-align: center; margin-bottom: 0; } .floating-label-form-group { font-size: 14px; position: relative; margin-bottom: 0; padding-bottom: 0.5em; border-bottom: 1px solid #eeeeee; } .floating-label-form-group input, .floating-label-form-group textarea { z-index: 1; position: relative; padding-right: 0; padding-left: 0; border: none; border-radius: 0; font-size: 1.5em; background: none; box-shadow: none !important; resize: none; } .floating-label-form-group label { display: block; z-index: 0; position: relative; top: 2em; margin: 0; font-size: 0.85em; line-height: 1.764705882em; vertical-align: middle; vertical-align: baseline; opacity: 0; -webkit-transition: top 0.3s ease,opacity 0.3s ease; -moz-transition: top 0.3s ease,opacity 0.3s ease; -ms-transition: top 0.3s ease,opacity 0.3s ease; transition: top 0.3s ease,opacity 0.3s ease; } .floating-label-form-group::not(:first-child) { padding-left: 14px; border-left: 1px solid #eeeeee; } .floating-label-form-group-with-value label { top: 0; opacity: 1; } .floating-label-form-group-with-focus label { color: #0085a1; } form .row:first-child .floating-label-form-group { border-top: 1px solid #eeeeee; } .btn { font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; text-transform: uppercase; font-size: 14px; font-weight: 800; letter-spacing: 1px; border-radius: 0; padding: 15px 25px; } .btn-lg { font-size: 16px; padding: 25px 35px; } .btn-default:hover, .btn-default:focus { background-color: #0085a1; border: 1px solid #0085a1; color: white; } .pager { margin: 20px 0 0; } .pager li > a, .pager li > span { font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; text-transform: uppercase; font-size: 14px; font-weight: 800; letter-spacing: 1px; padding: 15px 25px; background-color: white; border-radius: 0; } .pager li > a:hover, .pager li > a:focus { color: white; background-color: #0085a1; border: 1px solid #0085a1; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #808080; background-color: #404040; cursor: not-allowed; } ::-moz-selection { color: white; text-shadow: none; background: #0085a1; } ::selection { color: white; text-shadow: none; background: #0085a1; } img::selection { color: white; background: transparent; } img::-moz-selection { color: white; background: transparent; } body { webkit-tap-highlight-color: #0085a1; } ================================================ FILE: src/main/resources/static/css/bootstrap-rtl.css ================================================ /******************************************************************************* * bootstrap-rtl (version 3.3.1) * Author: Morteza Ansarinia (http://github.com/morteza) * Created on: January 21,2015 * Project: bootstrap-rtl * Copyright: Unlicensed Public Domain *******************************************************************************/ html { direction: rtl; } body { direction: rtl; } .list-unstyled { padding-right: 0; padding-left: initial; } .list-inline { padding-right: 0; padding-left: initial; margin-right: -5px; margin-left: 0; } dd { margin-right: 0; margin-left: initial; } @media (min-width: 768px) { .dl-horizontal dt { float: right; clear: right; text-align: left; } .dl-horizontal dd { margin-right: 180px; margin-left: 0; } } blockquote { border-right: 5px solid #eeeeee; border-left: 0; } .blockquote-reverse, blockquote.pull-left { padding-left: 15px; padding-right: 0; border-left: 5px solid #eeeeee; border-right: 0; text-align: left; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 15px; padding-right: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: right; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { left: 100%; right: auto; } .col-xs-pull-11 { left: 91.66666667%; right: auto; } .col-xs-pull-10 { left: 83.33333333%; right: auto; } .col-xs-pull-9 { left: 75%; right: auto; } .col-xs-pull-8 { left: 66.66666667%; right: auto; } .col-xs-pull-7 { left: 58.33333333%; right: auto; } .col-xs-pull-6 { left: 50%; right: auto; } .col-xs-pull-5 { left: 41.66666667%; right: auto; } .col-xs-pull-4 { left: 33.33333333%; right: auto; } .col-xs-pull-3 { left: 25%; right: auto; } .col-xs-pull-2 { left: 16.66666667%; right: auto; } .col-xs-pull-1 { left: 8.33333333%; right: auto; } .col-xs-pull-0 { left: auto; right: auto; } .col-xs-push-12 { right: 100%; left: 0; } .col-xs-push-11 { right: 91.66666667%; left: 0; } .col-xs-push-10 { right: 83.33333333%; left: 0; } .col-xs-push-9 { right: 75%; left: 0; } .col-xs-push-8 { right: 66.66666667%; left: 0; } .col-xs-push-7 { right: 58.33333333%; left: 0; } .col-xs-push-6 { right: 50%; left: 0; } .col-xs-push-5 { right: 41.66666667%; left: 0; } .col-xs-push-4 { right: 33.33333333%; left: 0; } .col-xs-push-3 { right: 25%; left: 0; } .col-xs-push-2 { right: 16.66666667%; left: 0; } .col-xs-push-1 { right: 8.33333333%; left: 0; } .col-xs-push-0 { right: auto; left: 0; } .col-xs-offset-12 { margin-right: 100%; margin-left: 0; } .col-xs-offset-11 { margin-right: 91.66666667%; margin-left: 0; } .col-xs-offset-10 { margin-right: 83.33333333%; margin-left: 0; } .col-xs-offset-9 { margin-right: 75%; margin-left: 0; } .col-xs-offset-8 { margin-right: 66.66666667%; margin-left: 0; } .col-xs-offset-7 { margin-right: 58.33333333%; margin-left: 0; } .col-xs-offset-6 { margin-right: 50%; margin-left: 0; } .col-xs-offset-5 { margin-right: 41.66666667%; margin-left: 0; } .col-xs-offset-4 { margin-right: 33.33333333%; margin-left: 0; } .col-xs-offset-3 { margin-right: 25%; margin-left: 0; } .col-xs-offset-2 { margin-right: 16.66666667%; margin-left: 0; } .col-xs-offset-1 { margin-right: 8.33333333%; margin-left: 0; } .col-xs-offset-0 { margin-right: 0%; margin-left: 0; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: right; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { left: 100%; right: auto; } .col-sm-pull-11 { left: 91.66666667%; right: auto; } .col-sm-pull-10 { left: 83.33333333%; right: auto; } .col-sm-pull-9 { left: 75%; right: auto; } .col-sm-pull-8 { left: 66.66666667%; right: auto; } .col-sm-pull-7 { left: 58.33333333%; right: auto; } .col-sm-pull-6 { left: 50%; right: auto; } .col-sm-pull-5 { left: 41.66666667%; right: auto; } .col-sm-pull-4 { left: 33.33333333%; right: auto; } .col-sm-pull-3 { left: 25%; right: auto; } .col-sm-pull-2 { left: 16.66666667%; right: auto; } .col-sm-pull-1 { left: 8.33333333%; right: auto; } .col-sm-pull-0 { left: auto; right: auto; } .col-sm-push-12 { right: 100%; left: 0; } .col-sm-push-11 { right: 91.66666667%; left: 0; } .col-sm-push-10 { right: 83.33333333%; left: 0; } .col-sm-push-9 { right: 75%; left: 0; } .col-sm-push-8 { right: 66.66666667%; left: 0; } .col-sm-push-7 { right: 58.33333333%; left: 0; } .col-sm-push-6 { right: 50%; left: 0; } .col-sm-push-5 { right: 41.66666667%; left: 0; } .col-sm-push-4 { right: 33.33333333%; left: 0; } .col-sm-push-3 { right: 25%; left: 0; } .col-sm-push-2 { right: 16.66666667%; left: 0; } .col-sm-push-1 { right: 8.33333333%; left: 0; } .col-sm-push-0 { right: auto; left: 0; } .col-sm-offset-12 { margin-right: 100%; margin-left: 0; } .col-sm-offset-11 { margin-right: 91.66666667%; margin-left: 0; } .col-sm-offset-10 { margin-right: 83.33333333%; margin-left: 0; } .col-sm-offset-9 { margin-right: 75%; margin-left: 0; } .col-sm-offset-8 { margin-right: 66.66666667%; margin-left: 0; } .col-sm-offset-7 { margin-right: 58.33333333%; margin-left: 0; } .col-sm-offset-6 { margin-right: 50%; margin-left: 0; } .col-sm-offset-5 { margin-right: 41.66666667%; margin-left: 0; } .col-sm-offset-4 { margin-right: 33.33333333%; margin-left: 0; } .col-sm-offset-3 { margin-right: 25%; margin-left: 0; } .col-sm-offset-2 { margin-right: 16.66666667%; margin-left: 0; } .col-sm-offset-1 { margin-right: 8.33333333%; margin-left: 0; } .col-sm-offset-0 { margin-right: 0%; margin-left: 0; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: right; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { left: 100%; right: auto; } .col-md-pull-11 { left: 91.66666667%; right: auto; } .col-md-pull-10 { left: 83.33333333%; right: auto; } .col-md-pull-9 { left: 75%; right: auto; } .col-md-pull-8 { left: 66.66666667%; right: auto; } .col-md-pull-7 { left: 58.33333333%; right: auto; } .col-md-pull-6 { left: 50%; right: auto; } .col-md-pull-5 { left: 41.66666667%; right: auto; } .col-md-pull-4 { left: 33.33333333%; right: auto; } .col-md-pull-3 { left: 25%; right: auto; } .col-md-pull-2 { left: 16.66666667%; right: auto; } .col-md-pull-1 { left: 8.33333333%; right: auto; } .col-md-pull-0 { left: auto; right: auto; } .col-md-push-12 { right: 100%; left: 0; } .col-md-push-11 { right: 91.66666667%; left: 0; } .col-md-push-10 { right: 83.33333333%; left: 0; } .col-md-push-9 { right: 75%; left: 0; } .col-md-push-8 { right: 66.66666667%; left: 0; } .col-md-push-7 { right: 58.33333333%; left: 0; } .col-md-push-6 { right: 50%; left: 0; } .col-md-push-5 { right: 41.66666667%; left: 0; } .col-md-push-4 { right: 33.33333333%; left: 0; } .col-md-push-3 { right: 25%; left: 0; } .col-md-push-2 { right: 16.66666667%; left: 0; } .col-md-push-1 { right: 8.33333333%; left: 0; } .col-md-push-0 { right: auto; left: 0; } .col-md-offset-12 { margin-right: 100%; margin-left: 0; } .col-md-offset-11 { margin-right: 91.66666667%; margin-left: 0; } .col-md-offset-10 { margin-right: 83.33333333%; margin-left: 0; } .col-md-offset-9 { margin-right: 75%; margin-left: 0; } .col-md-offset-8 { margin-right: 66.66666667%; margin-left: 0; } .col-md-offset-7 { margin-right: 58.33333333%; margin-left: 0; } .col-md-offset-6 { margin-right: 50%; margin-left: 0; } .col-md-offset-5 { margin-right: 41.66666667%; margin-left: 0; } .col-md-offset-4 { margin-right: 33.33333333%; margin-left: 0; } .col-md-offset-3 { margin-right: 25%; margin-left: 0; } .col-md-offset-2 { margin-right: 16.66666667%; margin-left: 0; } .col-md-offset-1 { margin-right: 8.33333333%; margin-left: 0; } .col-md-offset-0 { margin-right: 0%; margin-left: 0; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: right; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { left: 100%; right: auto; } .col-lg-pull-11 { left: 91.66666667%; right: auto; } .col-lg-pull-10 { left: 83.33333333%; right: auto; } .col-lg-pull-9 { left: 75%; right: auto; } .col-lg-pull-8 { left: 66.66666667%; right: auto; } .col-lg-pull-7 { left: 58.33333333%; right: auto; } .col-lg-pull-6 { left: 50%; right: auto; } .col-lg-pull-5 { left: 41.66666667%; right: auto; } .col-lg-pull-4 { left: 33.33333333%; right: auto; } .col-lg-pull-3 { left: 25%; right: auto; } .col-lg-pull-2 { left: 16.66666667%; right: auto; } .col-lg-pull-1 { left: 8.33333333%; right: auto; } .col-lg-pull-0 { left: auto; right: auto; } .col-lg-push-12 { right: 100%; left: 0; } .col-lg-push-11 { right: 91.66666667%; left: 0; } .col-lg-push-10 { right: 83.33333333%; left: 0; } .col-lg-push-9 { right: 75%; left: 0; } .col-lg-push-8 { right: 66.66666667%; left: 0; } .col-lg-push-7 { right: 58.33333333%; left: 0; } .col-lg-push-6 { right: 50%; left: 0; } .col-lg-push-5 { right: 41.66666667%; left: 0; } .col-lg-push-4 { right: 33.33333333%; left: 0; } .col-lg-push-3 { right: 25%; left: 0; } .col-lg-push-2 { right: 16.66666667%; left: 0; } .col-lg-push-1 { right: 8.33333333%; left: 0; } .col-lg-push-0 { right: auto; left: 0; } .col-lg-offset-12 { margin-right: 100%; margin-left: 0; } .col-lg-offset-11 { margin-right: 91.66666667%; margin-left: 0; } .col-lg-offset-10 { margin-right: 83.33333333%; margin-left: 0; } .col-lg-offset-9 { margin-right: 75%; margin-left: 0; } .col-lg-offset-8 { margin-right: 66.66666667%; margin-left: 0; } .col-lg-offset-7 { margin-right: 58.33333333%; margin-left: 0; } .col-lg-offset-6 { margin-right: 50%; margin-left: 0; } .col-lg-offset-5 { margin-right: 41.66666667%; margin-left: 0; } .col-lg-offset-4 { margin-right: 33.33333333%; margin-left: 0; } .col-lg-offset-3 { margin-right: 25%; margin-left: 0; } .col-lg-offset-2 { margin-right: 16.66666667%; margin-left: 0; } .col-lg-offset-1 { margin-right: 8.33333333%; margin-left: 0; } .col-lg-offset-0 { margin-right: 0%; margin-left: 0; } } caption { text-align: right; } th { text-align: right; } @media screen and (max-width: 767px) { .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-right: 0; border-left: initial; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-left: 0; border-right: initial; } } .radio label, .checkbox label { padding-right: 20px; padding-left: initial; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { margin-right: -20px; margin-left: auto; } .radio-inline, .checkbox-inline { padding-right: 20px; padding-left: 0; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-right: 10px; margin-left: 0; } .has-feedback .form-control { padding-left: 42.5px; padding-right: 12px; } .form-control-feedback { left: 0; right: auto; } @media (min-width: 768px) { .form-inline label { padding-right: 0; padding-left: initial; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { margin-right: 0; margin-left: auto; } } @media (min-width: 768px) { .form-horizontal .control-label { text-align: left; } } .form-horizontal .has-feedback .form-control-feedback { left: 15px; right: auto; } .caret { margin-right: 2px; margin-left: 0; } .dropdown-menu { right: 0; left: auto; float: left; text-align: right; } .dropdown-menu.pull-right { left: 0; right: auto; float: right; } .dropdown-menu-right { left: auto; right: 0; } .dropdown-menu-left { left: 0; right: auto; } @media (min-width: 768px) { .navbar-right .dropdown-menu { left: auto; right: 0; } .navbar-right .dropdown-menu-left { left: 0; right: auto; } } .btn-group > .btn, .btn-group-vertical > .btn { float: right; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-right: -1px; margin-left: 0px; } .btn-toolbar { margin-right: -5px; margin-left: 0px; } .btn-toolbar .btn-group, .btn-toolbar .input-group { float: right; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-right: 5px; margin-left: 0px; } .btn-group > .btn:first-child { margin-right: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-top-left-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn-group { float: right; } .btn-group.btn-group-justified > .btn, .btn-group.btn-group-justified > .btn-group { float: none; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group:last-child > .btn:first-child { border-top-left-radius: 4px; border-bottom-left-radius: 4px; border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn .caret { margin-right: 0; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-right: 0; } .input-group .form-control { float: right; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:first-child { border-right-width: 1px; border-right-style: solid; border-left: 0px; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-bottom-left-radius: 4px; border-top-left-radius: 4px; border-bottom-right-radius: 0; border-top-right-radius: 0; } .input-group-addon:last-child { border-left-width: 1px; border-left-style: solid; border-right: 0px; } .input-group-btn > .btn + .btn { margin-right: -1px; margin-left: auto; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-left: -1px; margin-right: auto; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { margin-right: -1px; margin-left: auto; } .nav { padding-right: 0; padding-left: initial; } .nav-tabs > li { float: right; } .nav-tabs > li > a { margin-left: auto; margin-right: -2px; border-radius: 4px 4px 0 0; } .nav-pills > li { float: right; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-right: 2px; margin-left: auto; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-right: 0; margin-left: auto; } .nav-justified > .dropdown .dropdown-menu { right: auto; } .nav-tabs-justified > li > a { margin-left: 0; margin-right: auto; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-radius: 4px 4px 0 0; } } @media (min-width: 768px) { .navbar-header { float: right; } } .navbar-collapse { padding-right: 15px; padding-left: 15px; } .navbar-brand { float: right; } @media (min-width: 768px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-right: -15px; margin-left: auto; } } .navbar-toggle { float: left; margin-left: 15px; margin-right: auto; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 25px 5px 15px; } } @media (min-width: 768px) { .navbar-nav { float: right; } .navbar-nav > li { float: right; } } @media (min-width: 768px) { .navbar-left.flip { float: right !important; } .navbar-right:last-child { margin-left: -15px; margin-right: auto; } .navbar-right.flip { float: left !important; margin-left: -15px; margin-right: auto; } .navbar-right .dropdown-menu { left: 0; right: auto; } } @media (min-width: 768px) { .navbar-text { float: right; } .navbar-text.navbar-right:last-child { margin-left: 0; margin-right: auto; } } .pagination { padding-right: 0; } .pagination > li > a, .pagination > li > span { float: right; margin-right: -1px; margin-left: 0px; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-right-radius: 4px; border-top-right-radius: 4px; border-bottom-left-radius: 0; border-top-left-radius: 0; } .pagination > li:last-child > a, .pagination > li:last-child > span { margin-right: -1px; border-bottom-left-radius: 4px; border-top-left-radius: 4px; border-bottom-right-radius: 0; border-top-right-radius: 0; } .pager { padding-right: 0; padding-left: initial; } .pager .next > a, .pager .next > span { float: left; } .pager .previous > a, .pager .previous > span { float: right; } .nav-pills > li > a > .badge { margin-left: 0px; margin-right: 3px; } .list-group-item > .badge { float: left; } .list-group-item > .badge + .badge { margin-left: 5px; margin-right: auto; } .alert-dismissable, .alert-dismissible { padding-left: 35px; padding-right: 15px; } .alert-dismissable .close, .alert-dismissible .close { right: auto; left: -21px; } .progress-bar { float: right; } .media > .pull-left { margin-right: 10px; } .media > .pull-left.flip { margin-right: 0; margin-left: 10px; } .media > .pull-right { margin-left: 10px; } .media > .pull-right.flip { margin-left: 0; margin-right: 10px; } .media-right, .media > .pull-right { padding-right: 10px; padding-left: initial; } .media-left, .media > .pull-left { padding-left: 10px; padding-right: initial; } .media-list { padding-right: 0; padding-left: initial; list-style: none; } .list-group { padding-right: 0; padding-left: initial; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-right-radius: 3px; border-top-left-radius: 0; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-left-radius: 3px; border-top-right-radius: 0; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 3px; border-top-right-radius: 0; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 3px; border-top-left-radius: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-right: 0; border-left: none; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: none; border-left: 0; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object { right: 0; left: auto; } .close { float: left; } .modal-footer { text-align: left; } .modal-footer .btn + .btn { margin-left: auto; margin-right: 5px; } .modal-footer .btn-group .btn + .btn { margin-right: -1px; margin-left: auto; } .modal-footer .btn-block + .btn-block { margin-right: 0; margin-left: auto; } .popover { left: auto; text-align: right; } .popover.top > .arrow { right: 50%; left: auto; margin-right: -11px; margin-left: auto; } .popover.top > .arrow:after { margin-right: -10px; margin-left: auto; } .popover.bottom > .arrow { right: 50%; left: auto; margin-right: -11px; margin-left: auto; } .popover.bottom > .arrow:after { margin-right: -10px; margin-left: auto; } .carousel-control { right: 0; bottom: 0; } .carousel-control.left { right: auto; left: 0; background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { left: auto; right: 0; background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; right: auto; margin-right: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; left: auto; margin-left: -10px; } .carousel-indicators { right: 50%; left: 0; margin-right: -30%; margin-left: 0; padding-left: 0; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: 0; margin-right: -15px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-left: 0; margin-right: -15px; } .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; } } .pull-right.flip { float: left !important; } .pull-left.flip { float: right !important; } /*# sourceMappingURL=bootstrap-rtl.css.map */ ================================================ FILE: src/main/resources/static/css/demo/webuploader-demo.css ================================================ #container { color: #838383; font-size: 12px; } #uploader .queueList { margin: 20px; border: 3px dashed #e6e6e6; } #uploader .queueList.filled { padding: 17px; margin: 0; border: 3px dashed transparent; } #uploader .queueList.webuploader-dnd-over { border: 3px dashed #999999; } #uploader p {margin: 0;} .element-invisible { position: absolute !important; clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ clip: rect(1px,1px,1px,1px); } #uploader .placeholder { min-height: 350px; padding-top: 178px; text-align: center; background: url(../../../img/webuploader.png) center 93px no-repeat; color: #cccccc; font-size: 18px; position: relative; } #uploader .placeholder .webuploader-pick { font-size: 18px; background: #00b7ee; border-radius: 3px; line-height: 44px; padding: 0 30px; *width: 120px; color: #fff; display: inline-block; margin: 0 auto 20px auto; cursor: pointer; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } #uploader .placeholder .webuploader-pick-hover { background: #00a2d4; } #uploader .placeholder .flashTip { color: #666666; font-size: 12px; position: absolute; width: 100%; text-align: center; bottom: 20px; } #uploader .placeholder .flashTip a { color: #0785d1; text-decoration: none; } #uploader .placeholder .flashTip a:hover { text-decoration: underline; } #uploader .filelist { list-style: none; margin: 0; padding: 0; } #uploader .filelist:after { content: ''; display: block; width: 0; height: 0; overflow: hidden; clear: both; } #uploader .filelist li { width: 110px; height: 110px; background: url(../../img/bg.png) no-repeat; text-align: center; margin: 0 8px 20px 0; position: relative; display: inline; float: left; overflow: hidden; font-size: 12px; } #uploader .filelist li p.log { position: relative; top: -45px; } #uploader .filelist li p.title { position: absolute; top: 0; left: 0; width: 100%; overflow: hidden; white-space: nowrap; text-overflow : ellipsis; top: 5px; text-indent: 5px; text-align: left; } #uploader .filelist li p.progress { position: absolute; width: 100%; bottom: 0; left: 0; height: 8px; overflow: hidden; z-index: 50; margin: 0; border-radius: 0; background: none; -webkit-box-shadow: 0 0 0; } #uploader .filelist li p.progress span { display: none; overflow: hidden; width: 0; height: 100%; background: #1483d8 url(../../img/progress.png) repeat-x; -webit-transition: width 200ms linear; -moz-transition: width 200ms linear; -o-transition: width 200ms linear; -ms-transition: width 200ms linear; transition: width 200ms linear; -webkit-animation: progressmove 2s linear infinite; -moz-animation: progressmove 2s linear infinite; -o-animation: progressmove 2s linear infinite; -ms-animation: progressmove 2s linear infinite; animation: progressmove 2s linear infinite; -webkit-transform: translateZ(0); } @-webkit-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @-moz-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } #uploader .filelist li p.imgWrap { position: relative; z-index: 2; line-height: 110px; vertical-align: middle; overflow: hidden; width: 110px; height: 110px; -webkit-transform-origin: 50% 50%; -moz-transform-origin: 50% 50%; -o-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; -webit-transition: 200ms ease-out; -moz-transition: 200ms ease-out; -o-transition: 200ms ease-out; -ms-transition: 200ms ease-out; transition: 200ms ease-out; } #uploader .filelist li img { width: 100%; } #uploader .filelist li p.error { background: #f43838; color: #fff; position: absolute; bottom: 0; left: 0; height: 28px; line-height: 28px; width: 100%; z-index: 100; } #uploader .filelist li .success { display: block; position: absolute; left: 0; bottom: 0; height: 40px; width: 100%; z-index: 200; background: url(../../img/success.png) no-repeat right bottom; } #uploader .filelist div.file-panel { position: absolute; height: 0; filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#80000000', endColorstr='#80000000')\0; background: rgba( 0, 0, 0, 0.5 ); width: 100%; top: 0; left: 0; overflow: hidden; z-index: 300; } #uploader .filelist div.file-panel span { width: 24px; height: 24px; display: inline; float: right; text-indent: -9999px; overflow: hidden; background: url(../../img/icons.png) no-repeat; margin: 5px 1px 1px; cursor: pointer; } #uploader .filelist div.file-panel span.rotateLeft { background-position: 0 -24px; } #uploader .filelist div.file-panel span.rotateLeft:hover { background-position: 0 0; } #uploader .filelist div.file-panel span.rotateRight { background-position: -24px -24px; } #uploader .filelist div.file-panel span.rotateRight:hover { background-position: -24px 0; } #uploader .filelist div.file-panel span.cancel { background-position: -48px -24px; } #uploader .filelist div.file-panel span.cancel:hover { background-position: -48px 0; } #uploader .statusBar { height: 63px; border-top: 1px solid #dadada; padding: 0 20px; line-height: 63px; vertical-align: middle; position: relative; } #uploader .statusBar .progress { border: 1px solid #1483d8; width: 198px; background: #fff; height: 18px; position: relative; display: inline-block; text-align: center; line-height: 20px; color: #6dbfff; position: relative; margin: 0 10px 0 0; } #uploader .statusBar .progress span.percentage { width: 0; height: 100%; left: 0; top: 0; background: #1483d8; position: absolute; } #uploader .statusBar .progress span.text { position: relative; z-index: 10; } #uploader .statusBar .info { display: inline-block; font-size: 14px; color: #666666; } #uploader .statusBar .btns { position: absolute; top: 10px; right: 20px; line-height: 40px; } #filePicker2 { display: inline-block; float: left; } #uploader .statusBar .btns .webuploader-pick, #uploader .statusBar .btns .uploadBtn, #uploader .statusBar .btns .uploadBtn.state-uploading, #uploader .statusBar .btns .uploadBtn.state-paused { background: #ffffff; border: 1px solid #cfcfcf; color: #565656; padding: 0 18px; display: inline-block; border-radius: 3px; margin-left: 10px; cursor: pointer; font-size: 14px; float: left; } #uploader .statusBar .btns .webuploader-pick-hover, #uploader .statusBar .btns .uploadBtn:hover, #uploader .statusBar .btns .uploadBtn.state-uploading:hover, #uploader .statusBar .btns .uploadBtn.state-paused:hover { background: #f0f0f0; } #uploader .statusBar .btns .uploadBtn { background: #00b7ee; color: #fff; border-color: transparent; } #uploader .statusBar .btns .uploadBtn:hover { background: #00a2d4; } #uploader .statusBar .btns .uploadBtn.disabled { pointer-events: none; opacity: 0.6; } ================================================ FILE: src/main/resources/static/css/font-awesome.css ================================================ /*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot?v=4.4.0'); src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal; } .fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.75em; vertical-align: -15%; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-fw { width: 1.28571429em; text-align: center; } .fa-ul { padding-left: 0; margin-left: 2.14285714em; list-style-type: none; } .fa-ul > li { position: relative; } .fa-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eeeeee; border-radius: .1em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right { margin-left: .3em; } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .fa.pull-left { margin-right: .3em; } .fa.pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .fa-rotate-90 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; } .fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .fa-stack-1x, .fa-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #ffffff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { content: "\f000"; } .fa-music:before { content: "\f001"; } .fa-search:before { content: "\f002"; } .fa-envelope-o:before { content: "\f003"; } .fa-heart:before { content: "\f004"; } .fa-star:before { content: "\f005"; } .fa-star-o:before { content: "\f006"; } .fa-user:before { content: "\f007"; } .fa-film:before { content: "\f008"; } .fa-th-large:before { content: "\f009"; } .fa-th:before { content: "\f00a"; } .fa-th-list:before { content: "\f00b"; } .fa-check:before { content: "\f00c"; } .fa-remove:before, .fa-close:before, .fa-times:before { content: "\f00d"; } .fa-search-plus:before { content: "\f00e"; } .fa-search-minus:before { content: "\f010"; } .fa-power-off:before { content: "\f011"; } .fa-signal:before { content: "\f012"; } .fa-gear:before, .fa-cog:before { content: "\f013"; } .fa-trash-o:before { content: "\f014"; } .fa-home:before { content: "\f015"; } .fa-file-o:before { content: "\f016"; } .fa-clock-o:before { content: "\f017"; } .fa-road:before { content: "\f018"; } .fa-download:before { content: "\f019"; } .fa-arrow-circle-o-down:before { content: "\f01a"; } .fa-arrow-circle-o-up:before { content: "\f01b"; } .fa-inbox:before { content: "\f01c"; } .fa-play-circle-o:before { content: "\f01d"; } .fa-rotate-right:before, .fa-repeat:before { content: "\f01e"; } .fa-refresh:before { content: "\f021"; } .fa-list-alt:before { content: "\f022"; } .fa-lock:before { content: "\f023"; } .fa-flag:before { content: "\f024"; } .fa-headphones:before { content: "\f025"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-up:before { content: "\f028"; } .fa-qrcode:before { content: "\f029"; } .fa-barcode:before { content: "\f02a"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-print:before { content: "\f02f"; } .fa-camera:before { content: "\f030"; } .fa-font:before { content: "\f031"; } .fa-bold:before { content: "\f032"; } .fa-italic:before { content: "\f033"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-align-left:before { content: "\f036"; } .fa-align-center:before { content: "\f037"; } .fa-align-right:before { content: "\f038"; } .fa-align-justify:before { content: "\f039"; } .fa-list:before { content: "\f03a"; } .fa-dedent:before, .fa-outdent:before { content: "\f03b"; } .fa-indent:before { content: "\f03c"; } .fa-video-camera:before { content: "\f03d"; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { content: "\f03e"; } .fa-pencil:before { content: "\f040"; } .fa-map-marker:before { content: "\f041"; } .fa-adjust:before { content: "\f042"; } .fa-tint:before { content: "\f043"; } .fa-edit:before, .fa-pencil-square-o:before { content: "\f044"; } .fa-share-square-o:before { content: "\f045"; } .fa-check-square-o:before { content: "\f046"; } .fa-arrows:before { content: "\f047"; } .fa-step-backward:before { content: "\f048"; } .fa-fast-backward:before { content: "\f049"; } .fa-backward:before { content: "\f04a"; } .fa-play:before { content: "\f04b"; } .fa-pause:before { content: "\f04c"; } .fa-stop:before { content: "\f04d"; } .fa-forward:before { content: "\f04e"; } .fa-fast-forward:before { content: "\f050"; } .fa-step-forward:before { content: "\f051"; } .fa-eject:before { content: "\f052"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-plus-circle:before { content: "\f055"; } .fa-minus-circle:before { content: "\f056"; } .fa-times-circle:before { content: "\f057"; } .fa-check-circle:before { content: "\f058"; } .fa-question-circle:before { content: "\f059"; } .fa-info-circle:before { content: "\f05a"; } .fa-crosshairs:before { content: "\f05b"; } .fa-times-circle-o:before { content: "\f05c"; } .fa-check-circle-o:before { content: "\f05d"; } .fa-ban:before { content: "\f05e"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrow-down:before { content: "\f063"; } .fa-mail-forward:before, .fa-share:before { content: "\f064"; } .fa-expand:before { content: "\f065"; } .fa-compress:before { content: "\f066"; } .fa-plus:before { content: "\f067"; } .fa-minus:before { content: "\f068"; } .fa-asterisk:before { content: "\f069"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-gift:before { content: "\f06b"; } .fa-leaf:before { content: "\f06c"; } .fa-fire:before { content: "\f06d"; } .fa-eye:before { content: "\f06e"; } .fa-eye-slash:before { content: "\f070"; } .fa-warning:before, .fa-exclamation-triangle:before { content: "\f071"; } .fa-plane:before { content: "\f072"; } .fa-calendar:before { content: "\f073"; } .fa-random:before { content: "\f074"; } .fa-comment:before { content: "\f075"; } .fa-magnet:before { content: "\f076"; } .fa-chevron-up:before { content: "\f077"; } .fa-chevron-down:before { content: "\f078"; } .fa-retweet:before { content: "\f079"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-arrows-v:before { content: "\f07d"; } .fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before, .fa-bar-chart:before { content: "\f080"; } .fa-twitter-square:before { content: "\f081"; } .fa-facebook-square:before { content: "\f082"; } .fa-camera-retro:before { content: "\f083"; } .fa-key:before { content: "\f084"; } .fa-gears:before, .fa-cogs:before { content: "\f085"; } .fa-comments:before { content: "\f086"; } .fa-thumbs-o-up:before { content: "\f087"; } .fa-thumbs-o-down:before { content: "\f088"; } .fa-star-half:before { content: "\f089"; } .fa-heart-o:before { content: "\f08a"; } .fa-sign-out:before { content: "\f08b"; } .fa-linkedin-square:before { content: "\f08c"; } .fa-thumb-tack:before { content: "\f08d"; } .fa-external-link:before { content: "\f08e"; } .fa-sign-in:before { content: "\f090"; } .fa-trophy:before { content: "\f091"; } .fa-github-square:before { content: "\f092"; } .fa-upload:before { content: "\f093"; } .fa-lemon-o:before { content: "\f094"; } .fa-phone:before { content: "\f095"; } .fa-square-o:before { content: "\f096"; } .fa-bookmark-o:before { content: "\f097"; } .fa-phone-square:before { content: "\f098"; } .fa-twitter:before { content: "\f099"; } .fa-facebook-f:before, .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-feed:before, .fa-rss:before { content: "\f09e"; } .fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bell:before { content: "\f0f3"; } .fa-certificate:before { content: "\f0a3"; } .fa-hand-o-right:before { content: "\f0a4"; } .fa-hand-o-left:before { content: "\f0a5"; } .fa-hand-o-up:before { content: "\f0a6"; } .fa-hand-o-down:before { content: "\f0a7"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-globe:before { content: "\f0ac"; } .fa-wrench:before { content: "\f0ad"; } .fa-tasks:before { content: "\f0ae"; } .fa-filter:before { content: "\f0b0"; } .fa-briefcase:before { content: "\f0b1"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-group:before, .fa-users:before { content: "\f0c0"; } .fa-chain:before, .fa-link:before { content: "\f0c1"; } .fa-cloud:before { content: "\f0c2"; } .fa-flask:before { content: "\f0c3"; } .fa-cut:before, .fa-scissors:before { content: "\f0c4"; } .fa-copy:before, .fa-files-o:before { content: "\f0c5"; } .fa-paperclip:before { content: "\f0c6"; } .fa-save:before, .fa-floppy-o:before { content: "\f0c7"; } .fa-square:before { content: "\f0c8"; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { content: "\f0ca"; } .fa-list-ol:before { content: "\f0cb"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-underline:before { content: "\f0cd"; } .fa-table:before { content: "\f0ce"; } .fa-magic:before { content: "\f0d0"; } .fa-truck:before { content: "\f0d1"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-plus:before { content: "\f0d5"; } .fa-money:before { content: "\f0d6"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-up:before { content: "\f0d8"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-columns:before { content: "\f0db"; } .fa-unsorted:before, .fa-sort:before { content: "\f0dc"; } .fa-sort-down:before, .fa-sort-desc:before { content: "\f0dd"; } .fa-sort-up:before, .fa-sort-asc:before { content: "\f0de"; } .fa-envelope:before { content: "\f0e0"; } .fa-linkedin:before { content: "\f0e1"; } .fa-rotate-left:before, .fa-undo:before { content: "\f0e2"; } .fa-legal:before, .fa-gavel:before { content: "\f0e3"; } .fa-dashboard:before, .fa-tachometer:before { content: "\f0e4"; } .fa-comment-o:before { content: "\f0e5"; } .fa-comments-o:before { content: "\f0e6"; } .fa-flash:before, .fa-bolt:before { content: "\f0e7"; } .fa-sitemap:before { content: "\f0e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-paste:before, .fa-clipboard:before { content: "\f0ea"; } .fa-lightbulb-o:before { content: "\f0eb"; } .fa-exchange:before { content: "\f0ec"; } .fa-cloud-download:before { content: "\f0ed"; } .fa-cloud-upload:before { content: "\f0ee"; } .fa-user-md:before { content: "\f0f0"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-suitcase:before { content: "\f0f2"; } .fa-bell-o:before { content: "\f0a2"; } .fa-coffee:before { content: "\f0f4"; } .fa-cutlery:before { content: "\f0f5"; } .fa-file-text-o:before { content: "\f0f6"; } .fa-building-o:before { content: "\f0f7"; } .fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { content: "\f0f9"; } .fa-medkit:before { content: "\f0fa"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-beer:before { content: "\f0fc"; } .fa-h-square:before { content: "\f0fd"; } .fa-plus-square:before { content: "\f0fe"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angle-down:before { content: "\f107"; } .fa-desktop:before { content: "\f108"; } .fa-laptop:before { content: "\f109"; } .fa-tablet:before { content: "\f10a"; } .fa-mobile-phone:before, .fa-mobile:before { content: "\f10b"; } .fa-circle-o:before { content: "\f10c"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-spinner:before { content: "\f110"; } .fa-circle:before { content: "\f111"; } .fa-mail-reply:before, .fa-reply:before { content: "\f112"; } .fa-github-alt:before { content: "\f113"; } .fa-folder-o:before { content: "\f114"; } .fa-folder-open-o:before { content: "\f115"; } .fa-smile-o:before { content: "\f118"; } .fa-frown-o:before { content: "\f119"; } .fa-meh-o:before { content: "\f11a"; } .fa-gamepad:before { content: "\f11b"; } .fa-keyboard-o:before { content: "\f11c"; } .fa-flag-o:before { content: "\f11d"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-terminal:before { content: "\f120"; } .fa-code:before { content: "\f121"; } .fa-mail-reply-all:before, .fa-reply-all:before { content: "\f122"; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { content: "\f123"; } .fa-location-arrow:before { content: "\f124"; } .fa-crop:before { content: "\f125"; } .fa-code-fork:before { content: "\f126"; } .fa-unlink:before, .fa-chain-broken:before { content: "\f127"; } .fa-question:before { content: "\f128"; } .fa-info:before { content: "\f129"; } .fa-exclamation:before { content: "\f12a"; } .fa-superscript:before { content: "\f12b"; } .fa-subscript:before { content: "\f12c"; } .fa-eraser:before { content: "\f12d"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-shield:before { content: "\f132"; } .fa-calendar-o:before { content: "\f133"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-rocket:before { content: "\f135"; } .fa-maxcdn:before { content: "\f136"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-html5:before { content: "\f13b"; } .fa-css3:before { content: "\f13c"; } .fa-anchor:before { content: "\f13d"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { content: "\f143"; } .fa-play-circle:before { content: "\f144"; } .fa-ticket:before { content: "\f145"; } .fa-minus-square:before { content: "\f146"; } .fa-minus-square-o:before { content: "\f147"; } .fa-level-up:before { content: "\f148"; } .fa-level-down:before { content: "\f149"; } .fa-check-square:before { content: "\f14a"; } .fa-pencil-square:before { content: "\f14b"; } .fa-external-link-square:before { content: "\f14c"; } .fa-share-square:before { content: "\f14d"; } .fa-compass:before { content: "\f14e"; } .fa-toggle-down:before, .fa-caret-square-o-down:before { content: "\f150"; } .fa-toggle-up:before, .fa-caret-square-o-up:before { content: "\f151"; } .fa-toggle-right:before, .fa-caret-square-o-right:before { content: "\f152"; } .fa-euro:before, .fa-eur:before { content: "\f153"; } .fa-gbp:before { content: "\f154"; } .fa-dollar:before, .fa-usd:before { content: "\f155"; } .fa-rupee:before, .fa-inr:before { content: "\f156"; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { content: "\f157"; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { content: "\f158"; } .fa-won:before, .fa-krw:before { content: "\f159"; } .fa-bitcoin:before, .fa-btc:before { content: "\f15a"; } .fa-file:before { content: "\f15b"; } .fa-file-text:before { content: "\f15c"; } .fa-sort-alpha-asc:before { content: "\f15d"; } .fa-sort-alpha-desc:before { content: "\f15e"; } .fa-sort-amount-asc:before { content: "\f160"; } .fa-sort-amount-desc:before { content: "\f161"; } .fa-sort-numeric-asc:before { content: "\f162"; } .fa-sort-numeric-desc:before { content: "\f163"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbs-down:before { content: "\f165"; } .fa-youtube-square:before { content: "\f166"; } .fa-youtube:before { content: "\f167"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-youtube-play:before { content: "\f16a"; } .fa-dropbox:before { content: "\f16b"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-instagram:before { content: "\f16d"; } .fa-flickr:before { content: "\f16e"; } .fa-adn:before { content: "\f170"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitbucket-square:before { content: "\f172"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-long-arrow-down:before { content: "\f175"; } .fa-long-arrow-up:before { content: "\f176"; } .fa-long-arrow-left:before { content: "\f177"; } .fa-long-arrow-right:before { content: "\f178"; } .fa-apple:before { content: "\f179"; } .fa-windows:before { content: "\f17a"; } .fa-android:before { content: "\f17b"; } .fa-linux:before { content: "\f17c"; } .fa-dribbble:before { content: "\f17d"; } .fa-skype:before { content: "\f17e"; } .fa-foursquare:before { content: "\f180"; } .fa-trello:before { content: "\f181"; } .fa-female:before { content: "\f182"; } .fa-male:before { content: "\f183"; } .fa-gittip:before, .fa-gratipay:before { content: "\f184"; } .fa-sun-o:before { content: "\f185"; } .fa-moon-o:before { content: "\f186"; } .fa-archive:before { content: "\f187"; } .fa-bug:before { content: "\f188"; } .fa-vk:before { content: "\f189"; } .fa-weibo:before { content: "\f18a"; } .fa-renren:before { content: "\f18b"; } .fa-pagelines:before { content: "\f18c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-arrow-circle-o-right:before { content: "\f18e"; } .fa-arrow-circle-o-left:before { content: "\f190"; } .fa-toggle-left:before, .fa-caret-square-o-left:before { content: "\f191"; } .fa-dot-circle-o:before { content: "\f192"; } .fa-wheelchair:before { content: "\f193"; } .fa-vimeo-square:before { content: "\f194"; } .fa-turkish-lira:before, .fa-try:before { content: "\f195"; } .fa-plus-square-o:before { content: "\f196"; } .fa-space-shuttle:before { content: "\f197"; } .fa-slack:before { content: "\f198"; } .fa-envelope-square:before { content: "\f199"; } .fa-wordpress:before { content: "\f19a"; } .fa-openid:before { content: "\f19b"; } .fa-institution:before, .fa-bank:before, .fa-university:before { content: "\f19c"; } .fa-mortar-board:before, .fa-graduation-cap:before { content: "\f19d"; } .fa-yahoo:before { content: "\f19e"; } .fa-google:before { content: "\f1a0"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-digg:before { content: "\f1a6"; } .fa-pied-piper:before { content: "\f1a7"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-drupal:before { content: "\f1a9"; } .fa-joomla:before { content: "\f1aa"; } .fa-language:before { content: "\f1ab"; } .fa-fax:before { content: "\f1ac"; } .fa-building:before { content: "\f1ad"; } .fa-child:before { content: "\f1ae"; } .fa-paw:before { content: "\f1b0"; } .fa-spoon:before { content: "\f1b1"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-recycle:before { content: "\f1b8"; } .fa-automobile:before, .fa-car:before { content: "\f1b9"; } .fa-cab:before, .fa-taxi:before { content: "\f1ba"; } .fa-tree:before { content: "\f1bb"; } .fa-spotify:before { content: "\f1bc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-soundcloud:before { content: "\f1be"; } .fa-database:before { content: "\f1c0"; } .fa-file-pdf-o:before { content: "\f1c1"; } .fa-file-word-o:before { content: "\f1c2"; } .fa-file-excel-o:before { content: "\f1c3"; } .fa-file-powerpoint-o:before { content: "\f1c4"; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { content: "\f1c5"; } .fa-file-zip-o:before, .fa-file-archive-o:before { content: "\f1c6"; } .fa-file-sound-o:before, .fa-file-audio-o:before { content: "\f1c7"; } .fa-file-movie-o:before, .fa-file-video-o:before { content: "\f1c8"; } .fa-file-code-o:before { content: "\f1c9"; } .fa-vine:before { content: "\f1ca"; } .fa-codepen:before { content: "\f1cb"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { content: "\f1cd"; } .fa-circle-o-notch:before { content: "\f1ce"; } .fa-ra:before, .fa-rebel:before { content: "\f1d0"; } .fa-ge:before, .fa-empire:before { content: "\f1d1"; } .fa-git-square:before { content: "\f1d2"; } .fa-git:before { content: "\f1d3"; } .fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before { content: "\f1d4"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-qq:before { content: "\f1d6"; } .fa-wechat:before, .fa-weixin:before { content: "\f1d7"; } .fa-send:before, .fa-paper-plane:before { content: "\f1d8"; } .fa-send-o:before, .fa-paper-plane-o:before { content: "\f1d9"; } .fa-history:before { content: "\f1da"; } .fa-circle-thin:before { content: "\f1db"; } .fa-header:before { content: "\f1dc"; } .fa-paragraph:before { content: "\f1dd"; } .fa-sliders:before { content: "\f1de"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-bomb:before { content: "\f1e2"; } .fa-soccer-ball-o:before, .fa-futbol-o:before { content: "\f1e3"; } .fa-tty:before { content: "\f1e4"; } .fa-binoculars:before { content: "\f1e5"; } .fa-plug:before { content: "\f1e6"; } .fa-slideshare:before { content: "\f1e7"; } .fa-twitch:before { content: "\f1e8"; } .fa-yelp:before { content: "\f1e9"; } .fa-newspaper-o:before { content: "\f1ea"; } .fa-wifi:before { content: "\f1eb"; } .fa-calculator:before { content: "\f1ec"; } .fa-paypal:before { content: "\f1ed"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bell-slash-o:before { content: "\f1f7"; } .fa-trash:before { content: "\f1f8"; } .fa-copyright:before { content: "\f1f9"; } .fa-at:before { content: "\f1fa"; } .fa-eyedropper:before { content: "\f1fb"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-area-chart:before { content: "\f1fe"; } .fa-pie-chart:before { content: "\f200"; } .fa-line-chart:before { content: "\f201"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-bicycle:before { content: "\f206"; } .fa-bus:before { content: "\f207"; } .fa-ioxhost:before { content: "\f208"; } .fa-angellist:before { content: "\f209"; } .fa-cc:before { content: "\f20a"; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { content: "\f20b"; } .fa-meanpath:before { content: "\f20c"; } .fa-buysellads:before { content: "\f20d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-dashcube:before { content: "\f210"; } .fa-forumbee:before { content: "\f211"; } .fa-leanpub:before { content: "\f212"; } .fa-sellsy:before { content: "\f213"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-simplybuilt:before { content: "\f215"; } .fa-skyatlas:before { content: "\f216"; } .fa-cart-plus:before { content: "\f217"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-diamond:before { content: "\f219"; } .fa-ship:before { content: "\f21a"; } .fa-user-secret:before { content: "\f21b"; } .fa-motorcycle:before { content: "\f21c"; } .fa-street-view:before { content: "\f21d"; } .fa-heartbeat:before { content: "\f21e"; } .fa-venus:before { content: "\f221"; } .fa-mars:before { content: "\f222"; } .fa-mercury:before { content: "\f223"; } .fa-intersex:before, .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-venus-double:before { content: "\f226"; } .fa-mars-double:before { content: "\f227"; } .fa-venus-mars:before { content: "\f228"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-neuter:before { content: "\f22c"; } .fa-genderless:before { content: "\f22d"; } .fa-facebook-official:before { content: "\f230"; } .fa-pinterest-p:before { content: "\f231"; } .fa-whatsapp:before { content: "\f232"; } .fa-server:before { content: "\f233"; } .fa-user-plus:before { content: "\f234"; } .fa-user-times:before { content: "\f235"; } .fa-hotel:before, .fa-bed:before { content: "\f236"; } .fa-viacoin:before { content: "\f237"; } .fa-train:before { content: "\f238"; } .fa-subway:before { content: "\f239"; } .fa-medium:before { content: "\f23a"; } .fa-yc:before, .fa-y-combinator:before { content: "\f23b"; } .fa-optin-monster:before { content: "\f23c"; } .fa-opencart:before { content: "\f23d"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-battery-4:before, .fa-battery-full:before { content: "\f240"; } .fa-battery-3:before, .fa-battery-three-quarters:before { content: "\f241"; } .fa-battery-2:before, .fa-battery-half:before { content: "\f242"; } .fa-battery-1:before, .fa-battery-quarter:before { content: "\f243"; } .fa-battery-0:before, .fa-battery-empty:before { content: "\f244"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-i-cursor:before { content: "\f246"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-sticky-note:before { content: "\f249"; } .fa-sticky-note-o:before { content: "\f24a"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-clone:before { content: "\f24d"; } .fa-balance-scale:before { content: "\f24e"; } .fa-hourglass-o:before { content: "\f250"; } .fa-hourglass-1:before, .fa-hourglass-start:before { content: "\f251"; } .fa-hourglass-2:before, .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-3:before, .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass:before { content: "\f254"; } .fa-hand-grab-o:before, .fa-hand-rock-o:before { content: "\f255"; } .fa-hand-stop-o:before, .fa-hand-paper-o:before { content: "\f256"; } .fa-hand-scissors-o:before { content: "\f257"; } .fa-hand-lizard-o:before { content: "\f258"; } .fa-hand-spock-o:before { content: "\f259"; } .fa-hand-pointer-o:before { content: "\f25a"; } .fa-hand-peace-o:before { content: "\f25b"; } .fa-trademark:before { content: "\f25c"; } .fa-registered:before { content: "\f25d"; } .fa-creative-commons:before { content: "\f25e"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-tripadvisor:before { content: "\f262"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-get-pocket:before { content: "\f265"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-safari:before { content: "\f267"; } .fa-chrome:before { content: "\f268"; } .fa-firefox:before { content: "\f269"; } .fa-opera:before { content: "\f26a"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-tv:before, .fa-television:before { content: "\f26c"; } .fa-contao:before { content: "\f26d"; } .fa-500px:before { content: "\f26e"; } .fa-amazon:before { content: "\f270"; } .fa-calendar-plus-o:before { content: "\f271"; } .fa-calendar-minus-o:before { content: "\f272"; } .fa-calendar-times-o:before { content: "\f273"; } .fa-calendar-check-o:before { content: "\f274"; } .fa-industry:before { content: "\f275"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-map-o:before { content: "\f278"; } .fa-map:before { content: "\f279"; } .fa-commenting:before { content: "\f27a"; } .fa-commenting-o:before { content: "\f27b"; } .fa-houzz:before { content: "\f27c"; } .fa-vimeo:before { content: "\f27d"; } .fa-black-tie:before { content: "\f27e"; } .fa-fonticons:before { content: "\f280"; } ================================================ FILE: src/main/resources/static/css/gg-bootdo.css ================================================ /*this file is used for the bootdo project, it is a unique css file*/ @charset "utf-8"; *{ font-size: 14px; font-family: "microsoft yahei"; padding:0; margin: 0; } a{ text-decoration: none !important; } ul{ list-style: none !important; } .gg-font0{ font-size: 0; } /*表单通用的样式*/ .gg-star{ color: red; font-style: normal; } .gg-form{ margin-top: 15px; padding: 20px; position: relative; } .gg-formGroup{ width: 100%; margin-bottom: 15px; font-size: 0; } .gg-formGroup .gg-formTitle{ width:30%; display: inline-block; text-align: right; padding-right: 2%; white-space: nowrap; } .gg-formGroup .gg-formTitle span{ font-size: 14px; color: #666666; font-family: "microsoft yahei"; line-height: 28px; white-space: nowrap; } .gg-formGroup .gg-formDetail{ width:60%; display: inline-block; } .gg-area{ width: 33.33%; display: inline-block; padding-right: 2%; } .gg-area:last-child{ padding-right: 0; } .gg-btnGroup{ text-align: center; } .gg-border0{ border: 0; } .gg-dashed{ border-bottom: 1px dashed #b3afaf; width: 40% !important; position: relative; } .error-mes{ position: relative; margin-left: 30%; } .gg-faeye{ position: absolute; top: 24%; right: 10%; padding: 10px; color: #666; } /*头像裁剪上传部分*/ .avatar-view { display: block; margin: 12% auto 5%; height: 220px; width: 220px; border: 3px solid #fff; border-radius: 5px; box-shadow: 0 0 5px rgba(0,0,0,.15); cursor: pointer; overflow: hidden; } .avatar-view img { width: 100%; } .avatar-body { padding-right: 15px; padding-left: 15px; } .avatar-upload { overflow: hidden; } .avatar-upload label { display: block; float: left; clear: left; width: 100px; } .avatar-upload input { display: block; margin-left: 110px; } .avater-alert { margin-top: 10px; margin-bottom: 10px; } .avatar-wrapper { height: 364px; width: 100%; margin-top: 15px; box-shadow: inset 0 0 5px rgba(0,0,0,.25); background-color: #fcfcfc; overflow: hidden; } .avatar-wrapper img { display: block; height: auto; max-width: 100%; } .avatar-preview { float: left; margin-top: 15px; margin-right: 15px; border: 1px solid #eee; border-radius: 4px; background-color: #fff; overflow: hidden; } .avatar-preview:hover { border-color: #ccf; box-shadow: 0 0 5px rgba(0,0,0,.15); } .avatar-preview img { width: 100%; } .preview-lg { height: 184px; width: 184px; margin-top: 15px; } .preview-md { height: 100px; width: 100px; } .preview-sm { height: 50px; width: 50px; } @media (min-width: 992px) { .avatar-preview { float: none; } } .avatar-btns { margin-top: 30px; margin-bottom: 15px; } .avatar-btns .btn-group { margin-right: 5px; } .loading { display: none; position: absolute; top: 0; right: 0; bottom: 0; left: 0; background: #fff url("/img/loading.gif") no-repeat center center; opacity: .75; filter: alpha(opacity=75); z-index: 20140628; } .avatar-title{ color:#999; font-size: 12px; text-align: center; } .modal-backdrop{ } .gg-avatarShow{ position: relative; margin-top: -10%; margin-bottom: 12%; } ================================================ FILE: src/main/resources/static/css/layui.css ================================================ /** @Name: layui @author 郑保乐 @Site: www.layui.com */ /** 初始化 **/ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form,pre{margin: 0; padding: 0; -webkit-tap-highlight-color:rgba(0,0,0,0);} a:active,a:hover{outline:0} img{display: inline-block; border: none; vertical-align: middle;} li{list-style:none;} table{border-collapse: collapse; border-spacing: 0;} h1,h2,h3{font-size: 14px; font-weight: 400;} h4, h5, h6{font-size: 100%; font-weight: 400;} button,input,select,textarea{font-size: 100%; } input,button,textarea,select,optgroup,option{font-family: inherit; font-size: inherit; font-style: inherit; font-weight: inherit; outline: 0;} pre{white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;} /** 图标字体 **/ @font-face {font-family: 'layui-icon'; src: url('../font/iconfont.eot?v=213'); src: url('../font/iconfont.eot?v=213#iefix') format('embedded-opentype'), url('../font/iconfont.svg?v=213#iconfont') format('svg'), url('../font/iconfont.woff?v=213') format('woff'), url('../font/iconfont.ttf?v=213') format('truetype'); } .layui-icon{ font-family:"layui-icon" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /** 初始化全局标签 **/ body{line-height: 24px; font: 14px Helvetica Neue,Helvetica,PingFang SC,\5FAE\8F6F\96C5\9ED1,Tahoma,Arial,sans-serif;} hr{height: 1px; margin: 10px 0; border: 0; background-color: #e2e2e2; clear: both;} a{color: #333; text-decoration:none; } a:hover{color: #777;} a cite{font-style: normal; *cursor:pointer;} /** 基础通用 **/ .layui-border-box, .layui-border-box *{box-sizing: border-box;} /* 消除第三方ui可能造成的冲突 */.layui-box, .layui-box *{box-sizing: content-box;} .layui-clear{clear: both; *zoom: 1;} .layui-clear:after{content:'\20'; clear:both; *zoom:1; display:block; height:0;} .layui-inline{position: relative; display: inline-block; *display:inline; *zoom:1; vertical-align: middle;} /* 三角形 */.layui-edge{position: absolute; width: 0; height: 0; border-style: dashed; border-color: transparent; overflow: hidden;} /* 单行溢出省略 */.layui-elip{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} /* 屏蔽选中 */.layui-unselect,.layui-icon, .layui-disabled{-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;} /* 禁用 */.layui-disabled,.layui-disabled:hover{color: #d2d2d2 !important; cursor: not-allowed !important;} /* 纯圆角 */.layui-circle{border-radius: 100%;} .layui-show{display: block !important;} .layui-hide{display: none !important;} /* 基本布局 */ .layui-main{position: relative; width: 1140px; margin: 0 auto;} .layui-header{position: relative; z-index: 1000; height: 60px;} .layui-header a:hover{transition: all .5s; -webkit-transition: all .5s;} .layui-side{position: fixed; top: 0; bottom: 0; z-index: 999; width: 200px; overflow-x: hidden;} .layui-side-scroll{width: 220px; height: 100%; overflow-x: hidden;} .layui-body{position: absolute; left: 200px; right: 0; top: 0; bottom: 0; z-index: 998; width: auto; overflow: hidden; overflow-y: auto; box-sizing: border-box;} /* 后台框架大布局 */.layui-layout-body{overflow: hidden;} .layui-layout-admin .layui-header{background-color: #23262E;} .layui-layout-admin .layui-side{top: 60px; width: 200px; overflow-x: hidden;} .layui-layout-admin .layui-body{top: 60px; bottom: 44px;} .layui-layout-admin .layui-main{width: auto; margin: 0 15px;} .layui-layout-admin .layui-footer{position: fixed; left: 200px; right: 0; bottom: 0; height: 44px; line-height: 44px; padding: 0 15px; background-color: #eee;} .layui-layout-admin .layui-logo{position: absolute; left: 0; top: 0; width: 200px; height: 100%; line-height: 60px; text-align: center; color: #009688; font-size: 16px;} .layui-layout-admin .layui-header .layui-nav{background: none;} .layui-layout-left{position: absolute !important; left: 200px; top: 0;} .layui-layout-right{position: absolute !important; right: 0; top: 0;} /* 响应式类 */ /* 栅格布局 */ .layui-container{position: relative; margin: 0 auto; padding: 0 15px; box-sizing: border-box;} .layui-fluid{position: relative; margin: 0 auto; padding: 0 15px;} .layui-row:before, .layui-row:after{content: ''; display: block; clear: both;} .layui-col-xs1, .layui-col-xs2, .layui-col-xs3, .layui-col-xs4, .layui-col-xs5, .layui-col-xs6, .layui-col-xs7, .layui-col-xs8, .layui-col-xs9, .layui-col-xs10, .layui-col-xs11, .layui-col-xs12 ,.layui-col-sm1, .layui-col-sm2, .layui-col-sm3, .layui-col-sm4, .layui-col-sm5, .layui-col-sm6, .layui-col-sm7, .layui-col-sm8, .layui-col-sm9, .layui-col-sm10, .layui-col-sm11, .layui-col-sm12 ,.layui-col-md1, .layui-col-md2, .layui-col-md3, .layui-col-md4, .layui-col-md5, .layui-col-md6, .layui-col-md7, .layui-col-md8, .layui-col-md9, .layui-col-md10, .layui-col-md11, .layui-col-md12 ,.layui-col-lg1, .layui-col-lg2, .layui-col-lg3, .layui-col-lg4, .layui-col-lg5, .layui-col-lg6, .layui-col-lg7, .layui-col-lg8, .layui-col-lg9, .layui-col-lg10, .layui-col-lg11, .layui-col-lg12 {position: relative; display: block; box-sizing: border-box;} .layui-col-xs1, .layui-col-xs2, .layui-col-xs3, .layui-col-xs4, .layui-col-xs5, .layui-col-xs6, .layui-col-xs7, .layui-col-xs8, .layui-col-xs9, .layui-col-xs10, .layui-col-xs11, .layui-col-xs12{float: left;} .layui-col-xs1{width: 8.33333333%;} .layui-col-xs2{width: 16.66666667%;} .layui-col-xs3{width: 25%;} .layui-col-xs4{width: 33.33333333%;} .layui-col-xs5{width: 41.66666667%;} .layui-col-xs6{width: 50%;} .layui-col-xs7{width: 58.33333333%;} .layui-col-xs8{width: 66.66666667%;} .layui-col-xs9{width: 75%;} .layui-col-xs10{width: 83.33333333%;} .layui-col-xs11{width: 91.66666667%;} .layui-col-xs12{width: 100%;} .layui-col-xs-offset1{margin-left: 8.33333333%;} .layui-col-xs-offset2{margin-left: 16.66666667%;} .layui-col-xs-offset3{margin-left: 25%;} .layui-col-xs-offset4{margin-left: 33.33333333%;} .layui-col-xs-offset5{margin-left: 41.66666667%;} .layui-col-xs-offset6{margin-left: 50%;} .layui-col-xs-offset7{margin-left: 58.33333333%;} .layui-col-xs-offset8{margin-left: 66.66666667%;} .layui-col-xs-offset9{margin-left: 75%;} .layui-col-xs-offset10{margin-left: 83.33333333%;} .layui-col-xs-offset11{margin-left: 91.66666667%;} .layui-col-xs-offset12{margin-left: 100%;} /* 超小屏幕(手机) */@media screen and (max-width: 768px) { .layui-hide-xs{display: none!important;} .layui-show-xs-block{display: block!important;} .layui-show-xs-inline{display: inline!important;} .layui-show-xs-inline-block{display: inline-block!important;} } /* 小型屏幕(平板) */@media screen and (min-width: 768px) { .layui-container{width: 750px;} .layui-hide-sm{display: none!important;} .layui-show-sm-block{display: block!important;} .layui-show-sm-inline{display: inline!important;} .layui-show-sm-inline-block{display: inline-block!important;} .layui-col-sm1, .layui-col-sm2, .layui-col-sm3, .layui-col-sm4, .layui-col-sm5, .layui-col-sm6, .layui-col-sm7, .layui-col-sm8, .layui-col-sm9, .layui-col-sm10, .layui-col-sm11, .layui-col-sm12{float: left;} .layui-col-sm1{width: 8.33333333%;} .layui-col-sm2{width: 16.66666667%;} .layui-col-sm3{width: 25%;} .layui-col-sm4{width: 33.33333333%;} .layui-col-sm5{width: 41.66666667%;} .layui-col-sm6{width: 50%;} .layui-col-sm7{width: 58.33333333%;} .layui-col-sm8{width: 66.66666667%;} .layui-col-sm9{width: 75%;} .layui-col-sm10{width: 83.33333333%;} .layui-col-sm11{width: 91.66666667%;} .layui-col-sm12{width: 100%;} /* 列偏移 */ .layui-col-sm-offset1{margin-left: 8.33333333%;} .layui-col-sm-offset2{margin-left: 16.66666667%;} .layui-col-sm-offset3{margin-left: 25%;} .layui-col-sm-offset4{margin-left: 33.33333333%;} .layui-col-sm-offset5{margin-left: 41.66666667%;} .layui-col-sm-offset6{margin-left: 50%;} .layui-col-sm-offset7{margin-left: 58.33333333%;} .layui-col-sm-offset8{margin-left: 66.66666667%;} .layui-col-sm-offset9{margin-left: 75%;} .layui-col-sm-offset10{margin-left: 83.33333333%;} .layui-col-sm-offset11{margin-left: 91.66666667%;} .layui-col-sm-offset12{margin-left: 100%;} } /* 中型屏幕(桌面) */@media screen and (min-width: 992px) { .layui-container{width: 970px;} .layui-hide-md{display: none!important;} .layui-show-md-block{display: block!important;} .layui-show-md-inline{display: inline!important;} .layui-show-md-inline-block{display: inline-block!important;} .layui-col-md1, .layui-col-md2, .layui-col-md3, .layui-col-md4, .layui-col-md5, .layui-col-md6, .layui-col-md7, .layui-col-md8, .layui-col-md9, .layui-col-md10, .layui-col-md11, .layui-col-md12{float: left;} .layui-col-md1{width: 8.33333333%;} .layui-col-md2{width: 16.66666667%;} .layui-col-md3{width: 25%;} .layui-col-md4{width: 33.33333333%;} .layui-col-md5{width: 41.66666667%;} .layui-col-md6{width: 50%;} .layui-col-md7{width: 58.33333333%;} .layui-col-md8{width: 66.66666667%;} .layui-col-md9{width: 75%;} .layui-col-md10{width: 83.33333333%;} .layui-col-md11{width: 91.66666667%;} .layui-col-md12{width: 100%;} /* 列偏移 */ .layui-col-md-offset1{margin-left: 8.33333333%;} .layui-col-md-offset2{margin-left: 16.66666667%;} .layui-col-md-offset3{margin-left: 25%;} .layui-col-md-offset4{margin-left: 33.33333333%;} .layui-col-md-offset5{margin-left: 41.66666667%;} .layui-col-md-offset6{margin-left: 50%;} .layui-col-md-offset7{margin-left: 58.33333333%;} .layui-col-md-offset8{margin-left: 66.66666667%;} .layui-col-md-offset9{margin-left: 75%;} .layui-col-md-offset10{margin-left: 83.33333333%;} .layui-col-md-offset11{margin-left: 91.66666667%;} .layui-col-md-offset12{margin-left: 100%;} } /* 大型屏幕(桌面) */@media screen and (min-width: 1200px) { .layui-container{width: 1170px;} .layui-hide-lg{display: none!important;} .layui-show-lg-block{display: block!important;} .layui-show-lg-inline{display: inline!important;} .layui-show-lg-inline-block{display: inline-block!important;} .layui-col-lg1, .layui-col-lg2, .layui-col-lg3, .layui-col-lg4, .layui-col-lg5, .layui-col-lg6, .layui-col-lg7, .layui-col-lg8, .layui-col-lg9, .layui-col-lg10, .layui-col-lg11, .layui-col-lg12{float: left;} .layui-col-lg1{width: 8.33333333%;} .layui-col-lg2{width: 16.66666667%;} .layui-col-lg3{width: 25%;} .layui-col-lg4{width: 33.33333333%;} .layui-col-lg5{width: 41.66666667%;} .layui-col-lg6{width: 50%;} .layui-col-lg7{width: 58.33333333%;} .layui-col-lg8{width: 66.66666667%;} .layui-col-lg9{width: 75%;} .layui-col-lg10{width: 83.33333333%;} .layui-col-lg11{width: 91.66666667%;} .layui-col-lg12{width: 100%;} /* 列偏移 */ .layui-col-lg-offset1{margin-left: 8.33333333%;} .layui-col-lg-offset2{margin-left: 16.66666667%;} .layui-col-lg-offset3{margin-left: 25%;} .layui-col-lg-offset4{margin-left: 33.33333333%;} .layui-col-lg-offset5{margin-left: 41.66666667%;} .layui-col-lg-offset6{margin-left: 50%;} .layui-col-lg-offset7{margin-left: 58.33333333%;} .layui-col-lg-offset8{margin-left: 66.66666667%;} .layui-col-lg-offset9{margin-left: 75%;} .layui-col-lg-offset10{margin-left: 83.33333333%;} .layui-col-lg-offset11{margin-left: 91.66666667%;} .layui-col-lg-offset12{margin-left: 100%;} } /* 列间隔 */.layui-col-space1{margin: -0.5px;} .layui-col-space1>*{padding: 0.5px;} .layui-col-space3{margin: -1.5px;} .layui-col-space3>*{padding: 1.5px;} .layui-col-space5{margin: -2.5px;} .layui-col-space5>*{padding: 2.5px;} .layui-col-space8{margin: -3.5px;} .layui-col-space8>*{padding: 3.5px;} .layui-col-space10{margin: -5px;} .layui-col-space10>*{padding: 5px;} .layui-col-space12{margin: -6px;} .layui-col-space12>*{padding: 6px;} .layui-col-space15{margin: -7.5px;} .layui-col-space15>*{padding: 7.5px;} .layui-col-space18{margin: -9px;} .layui-col-space18>*{padding: 9px;} .layui-col-space20{margin: -10px;} .layui-col-space20>*{padding: 10px;} .layui-col-space22{margin: -11px;} .layui-col-space22>*{padding: 11px;} .layui-col-space25{margin: -12.5px;} .layui-col-space25>*{padding: 12.5px;} .layui-col-space30{margin: -15px;} .layui-col-space30>*{padding: 15px;} /** 页面元素 **/ .layui-btn, .layui-input, .layui-textarea, .layui-upload-button, .layui-select{outline: none; -webkit-appearance: none; transition: all .3s; -webkit-transition: all .3s; box-sizing: border-box;} /* 引用 */.layui-elem-quote{margin-bottom: 10px; padding: 15px; line-height: 22px; border-left: 5px solid #009688; border-radius: 0 2px 2px 0; background-color: #f2f2f2;} .layui-quote-nm{border-color: #e2e2e2; border-style: solid; border-width: 1px; border-left-width: 5px; background: none;} /* 字段集合 */.layui-elem-field{margin-bottom: 10px; padding: 0; border: 1px solid #e2e2e2;} .layui-elem-field legend{margin-left: 20px; padding: 0 10px; font-size: 20px; font-weight: 300;} .layui-field-title{margin: 10px 0 20px; border: none; border-top: 1px solid #e2e2e2;} .layui-field-box{padding: 10px 15px;} .layui-field-title .layui-field-box{padding: 10px 0;} /* 进度条 */ .layui-progress{position: relative; height: 6px; border-radius: 20px; background-color: #e2e2e2;} .layui-progress-bar{position: absolute; width: 0; max-width: 100%; height: 6px; border-radius: 20px; text-align: right; background-color: #5FB878; transition: all .3s; -webkit-transition: all .3s;} .layui-progress-big, .layui-progress-big .layui-progress-bar{height: 18px; line-height: 18px;} .layui-progress-text{position: relative; top: -18px; line-height: 18px; font-size: 12px; color: #666} .layui-progress-big .layui-progress-text{position: static; padding: 0 10px; color: #fff;} /* 折叠面板 */ .layui-collapse{border: 1px solid #e2e2e2; border-radius: 2px;} .layui-colla-item{border-top: 1px solid #e2e2e2} .layui-colla-item:first-child{border-top: none;} .layui-colla-title{position: relative; height: 42px; line-height: 42px; padding: 0 15px 0 35px; color: #333; background-color: #f2f2f2; cursor: pointer;} .layui-colla-content{display: none; padding: 10px 15px; line-height: 22px; border-top: 1px solid #e2e2e2; color: #666;} .layui-colla-icon{position: absolute; left: 15px; top: 0; font-size: 14px;} /* 背景颜色 */ .layui-bg-red{background-color: #FF5722 !important; color: #fff!important;} /*赤*/ .layui-bg-orange{background-color: #FFB800!important; color: #fff!important;} /*橙*/ .layui-bg-green{background-color: #009688!important; color: #fff!important;} /*绿*/ .layui-bg-cyan{background-color: #2F4056!important; color: #fff!important;} /*青*/ .layui-bg-blue{background-color: #1E9FFF!important; color: #fff!important;} /*蓝*/ .layui-bg-black{background-color: #393D49!important; color: #fff!important;} /*黑*/ .layui-bg-gray{background-color: #eee!important; color: #666!important;} /*灰*/ /* 文本区域 */ .layui-text{line-height: 22px; font-size: 14px; color: #666;} .layui-text h1, .layui-text h2, .layui-text h3{font-weight: 500; color: #333;} .layui-text h1{font-size: 30px;} .layui-text h2{font-size: 24px;} .layui-text h3{font-size: 18px;} .layui-text a{color: #01AAED;} .layui-text a:hover{text-decoration: underline;} .layui-text ul{padding: 5px 0 5px 15px;} .layui-text ul li{margin-top: 5px; list-style-type: disc;} .layui-text em, .layui-word-aux{color: #999 !important; padding: 0 5px !important;} /* 按钮 */ .layui-btn{display: inline-block; vertical-align: middle; height: 38px; line-height: 38px; padding: 0 18px; background-color: #009688; color: #fff; white-space: nowrap; text-align: center; font-size: 14px; border: none; border-radius: 2px; cursor: pointer; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;} .layui-btn:hover{opacity: 0.8; filter:alpha(opacity=80); color: #fff;} .layui-btn:active{opacity: 1; filter:alpha(opacity=100);} .layui-btn+.layui-btn{margin-left: 10px;} /* 圆角 */.layui-btn-radius{border-radius: 100px;} .layui-btn .layui-icon{margin-right: 3px; font-size: 18px; vertical-align: bottom; vertical-align: middle\0;} /* 原始 */.layui-btn-primary{border: 1px solid #C9C9C9; background-color: #fff; color: #555;} .layui-btn-primary:hover{border-color: #009688; color: #333} /* 百搭 */.layui-btn-normal{background-color: #1E9FFF;} /* 暖色 */.layui-btn-warm{background-color: #FFB800;} /* 警告 */.layui-btn-danger{background-color: #FF5722;} /* 禁用 */.layui-btn-disabled,.layui-btn-disabled:hover,.layui-btn-disabled:active{border: 1px solid #e6e6e6; background-color: #FBFBFB; color: #C9C9C9; cursor: not-allowed; opacity: 1;} /* 大型 */.layui-btn-big{height: 44px; line-height: 44px; padding: 0 25px; font-size: 16px;} /* 小型 */.layui-btn-small{height: 30px; line-height: 30px; padding: 0 10px; font-size: 12px;} .layui-btn-small i{font-size: 16px !important;} /* 迷你 */.layui-btn-mini{height: 22px; line-height: 22px; padding: 0 5px; font-size: 12px;} .layui-btn-mini i{font-size: 14px !important;} /* 按钮组 */.layui-btn-group{display: inline-block; vertical-align: middle; font-size: 0;} .layui-btn-group .layui-btn{margin-left: 0!important; margin-right: 0!important; border-left: 1px solid rgba(255,255,255,.5); border-radius: 0;} .layui-btn-group .layui-btn-primary{border-left: none;} .layui-btn-group .layui-btn-primary:hover{border-color: #C9C9C9; color: #009688;} .layui-btn-group .layui-btn:first-child{border-left: none; border-radius: 2px 0 0 2px;} .layui-btn-group .layui-btn-primary:first-child{border-left: 1px solid #c9c9c9;} .layui-btn-group .layui-btn:last-child{border-radius: 0 2px 2px 0;} .layui-btn-group .layui-btn+.layui-btn{margin-left: 0;} .layui-btn-group+.layui-btn-group{margin-left: 10px;} /** 表单 **/ .layui-input, .layui-textarea, .layui-select{height: 38px; line-height: 1.3; line-height: 38px\9; border: 1px solid #e6e6e6; background-color: #fff; border-radius: 2px;} .layui-input::-webkit-input-placeholder, .layui-textarea::-webkit-input-placeholder, .layui-select::-webkit-input-placeholder{line-height: 1.3;} .layui-input, .layui-textarea{display: block; width: 100%; padding-left: 10px;} .layui-input:hover, .layui-textarea:hover{border-color: #D2D2D2 !important;} .layui-input:focus, .layui-textarea:focus{border-color: #C9C9C9 !important;} .layui-textarea{position: relative; min-height: 100px; height: auto; line-height: 20px; padding: 6px 10px; resize: vertical;} .layui-select{padding: 0 10px;} .layui-form select, .layui-form input[type=checkbox], .layui-form input[type=radio]{display: none;} .layui-form-item{margin-bottom: 15px; clear: both; *zoom: 1;} .layui-form-item:after{content:'\20'; clear: both; *zoom: 1; display: block; height:0;} .layui-form-label{position: relative; float: left; display: block; padding: 9px 15px; width: 80px; font-weight:normal;line-height: 20px; text-align: right;} .layui-form-item .layui-inline{margin-bottom: 5px; margin-right: 10px;} .layui-input-block, .layui-input-inline{position: relative;} .layui-input-block{margin-left: 110px; min-height: 36px;} .layui-input-inline{display: inline-block; vertical-align: middle;} .layui-form-item .layui-input-inline{float: left; width: 190px; margin-right: 10px;} .layui-form-text .layui-input-inline{width: auto;} /* 分割块 */.layui-form-mid{position: relative; float: left; display: block; padding: 8px 0 !important; line-height: 20px; margin-right: 10px;} /* 警告域 */.layui-form-danger:focus ,.layui-form-danger+.layui-form-select .layui-input{border: 1px solid #FF5722 !important;} /* 下拉选择 */.layui-form-select{position: relative;} .layui-form-select .layui-input{padding-right: 30px; cursor: pointer;} .layui-form-select .layui-edge{position: absolute; right: 10px; top: 50%; margin-top: -3px; cursor: pointer; border-width: 6px; border-top-color: #c2c2c2; border-top-style: solid; transition: all .3s; -webkit-transition: all .3s;} .layui-form-select dl{display: none; position: absolute; left: 0; top: 42px; padding: 5px 0; z-index: 999; min-width: 100%; border: 1px solid #d2d2d2; max-height: 300px; overflow-y: auto; background-color: #fff; border-radius: 2px; box-shadow: 0 2px 4px rgba(0,0,0,.12); box-sizing: border-box;} .layui-form-select dl dt, .layui-form-select dl dd{padding: 0 10px; line-height: 36px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;} .layui-form-select dl dt{font-size: 12px; color: #999;} .layui-form-select dl dd{cursor: pointer;} .layui-form-select dl dd:hover{background-color: #f2f2f2;} .layui-form-select .layui-select-group dd{padding-left: 20px;} .layui-form-select dl dd.layui-select-tips{padding-left: 10px !important; color: #999;} .layui-form-select dl dd.layui-this{background-color: #5FB878; color: #fff;} .layui-form-select dl dd.layui-disabled{background-color: #fff;} .layui-form-selected dl{display: block;} .layui-form-selected .layui-edge{margin-top: -9px; -webkit-transform:rotate(180deg); transform: rotate(180deg);} .layui-form-selected .layui-edge{margin-top: -3px\0; } :root .layui-form-selected .layui-edge{margin-top: -9px\0/IE9;} .layui-form-selectup dl{top: auto; bottom: 42px;} .layui-select-none{margin: 5px 0; text-align: center; color: #999;} .layui-select-disabled .layui-disabled{border-color: #eee !important;} .layui-select-disabled .layui-edge{border-top-color: #d2d2d2} /* 复选框 */.layui-form-checkbox{position: relative; display: inline-block; vertical-align: middle; height: 30px; line-height: 28px; margin-right: 10px; padding-right: 30px; border: 1px solid #d2d2d2; background-color: #fff; cursor: pointer; font-size: 0; border-radius: 2px; -webkit-transition: .1s linear; transition: .1s linear; box-sizing: border-box;} .layui-form-checkbox:hover{border: 1px solid #c2c2c2;} .layui-form-checkbox *{display: inline-block; vertical-align: middle;} .layui-form-checkbox span{padding: 0 10px; height: 100%; font-size: 14px; background-color: #d2d2d2; color: #fff; overflow: hidden; white-space: nowrap; text-overflow: ellipsis;} .layui-form-checkbox:hover span{background-color: #c2c2c2;} .layui-form-checkbox i{position: absolute; right: 0; width: 30px; color: #fff; font-size: 20px; text-align: center;} .layui-form-checkbox:hover i{color: #c2c2c2;} .layui-form-checked, .layui-form-checked:hover{border-color: #5FB878;} .layui-form-checked span, .layui-form-checked:hover span{background-color: #5FB878;} .layui-form-checked i, .layui-form-checked:hover i{color: #5FB878;} .layui-form-item .layui-form-checkbox{margin-top: 4px;} /* 复选框-原始风格 */.layui-form-checkbox[lay-skin="primary"]{height: auto!important; line-height: normal!important; border: none!important; margin-right: 0; padding-right: 0; background: none;} .layui-form-checkbox[lay-skin="primary"] span{float: right; padding-right: 15px; line-height: 18px; background: none; color: #666;} .layui-form-checkbox[lay-skin="primary"] i{position: relative; top: 0; width: 16px; height: 16px; line-height: 16px; border: 1px solid #d2d2d2; font-size: 12px; border-radius: 2px; background-color: #fff; -webkit-transition: .1s linear; transition: .1s linear;} .layui-form-checkbox[lay-skin="primary"]:hover i{border-color: #5FB878; color: #fff;} .layui-form-checked[lay-skin="primary"] i{border-color: #5FB878; background-color: #5FB878; color: #fff;} .layui-checkbox-disbaled[lay-skin="primary"] span{background: none!important;} .layui-checkbox-disbaled[lay-skin="primary"]:hover i{border-color: #d2d2d2;} .layui-form-item .layui-form-checkbox[lay-skin="primary"]{margin-top: 10px;} /* 复选框-开关风格 */.layui-form-switch{position: relative; display: inline-block; vertical-align: middle; height: 22px; line-height: 22px; width: 42px; padding: 0 5px; margin-top: 8px; border: 1px solid #d2d2d2; border-radius: 20px; cursor: pointer; background-color: #fff; -webkit-transition: .1s linear; transition: .1s linear;} .layui-form-switch i{position: absolute; left: 5px; top: 3px; width: 16px; height: 16px; border-radius: 20px; background-color: #d2d2d2; -webkit-transition: .1s linear; transition: .1s linear;} .layui-form-switch em{position: absolute; right: 5px; top: 0; width: 25px; padding: 0!important; text-align: center!important; color: #999!important; font-style: normal!important; font-size: 12px;} .layui-form-onswitch{border-color: #5FB878; background-color: #5FB878;} .layui-form-onswitch i{left: 32px; background-color: #fff;} .layui-form-onswitch em{left: 5px; right: auto; color: #fff!important;} .layui-checkbox-disbaled{border-color: #e2e2e2 !important;} .layui-checkbox-disbaled span{background-color: #e2e2e2 !important;} .layui-checkbox-disbaled:hover i{color: #fff !important;} /* 单选框 */ .layui-form-radio{display: inline-block; vertical-align: middle; line-height: 28px; margin: 6px 10px 0 0; padding-right: 10px; cursor: pointer; font-size: 0;} .layui-form-radio *{display: inline-block; vertical-align: middle;} .layui-form-radio i{margin-right: 8px; font-size: 22px; color: #c2c2c2;} .layui-form-radio span{font-size: 14px;} .layui-form-radioed i,.layui-form-radio i:hover{color: #5FB878;} .layui-radio-disbaled i{color: #e2e2e2 !important;} /* 表单方框风格 */.layui-form-pane .layui-form-label{width: 110px; padding: 8px 15px; height: 38px; line-height: 20px; border: 1px solid #e6e6e6; border-radius: 2px 0 0 2px; text-align: center; background-color: #FBFBFB; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; box-sizing: border-box;} .layui-form-pane .layui-input-inline{margin-left: -1px;} .layui-form-pane .layui-input-block{margin-left: 110px; left: -1px;} .layui-form-pane .layui-input{border-radius: 0 2px 2px 0;} .layui-form-pane .layui-form-text .layui-form-label{float: none; width: 100%; border-right: 1px solid #e6e6e6; border-radius: 2px; box-sizing: border-box; text-align: left;} .layui-form-pane .layui-form-text .layui-input-inline{display: block; margin: 0; top: -1px; clear: both;} .layui-form-pane .layui-form-text .layui-input-block{margin: 0; left: 0; top: -1px;} .layui-form-pane .layui-form-text .layui-textarea{min-height: 100px; border-radius: 0 0 2px 2px;} .layui-form-pane .layui-form-checkbox{margin: 4px 0 4px 10px;} .layui-form-pane .layui-form-switch, .layui-form-pane .layui-form-radio{margin-top: 6px; margin-left: 10px; } .layui-form-pane .layui-form-item[pane]{position: relative; border: 1px solid #e6e6e6;} .layui-form-pane .layui-form-item[pane] .layui-form-label{position: absolute; left: 0; top: 0; height: 100%; border-width: 0px; border-right-width: 1px;} .layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left: 110px;} /** 表单响应式 **/ @media screen and (max-width: 450px) { .layui-form-item .layui-form-label{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} .layui-form-item .layui-inline{display: block; margin-right: 0; margin-bottom: 20px; clear: both;} .layui-form-item .layui-inline:after{content:'\20'; clear:both; display:block; height:0;} .layui-form-item .layui-input-inline{display: block; float: none; left: -3px; width: auto; margin: 0 0 10px 112px; } .layui-form-item .layui-input-inline+.layui-form-mid{margin-left: 110px; top: -5px; padding: 0;} .layui-form-item .layui-form-checkbox{margin-right: 5px; margin-bottom: 5px;} } /** 富文本编辑器 **/ .layui-layedit{border: 1px solid #d2d2d2; border-radius: 2px;} .layui-layedit-tool{padding: 3px 5px; border-bottom: 1px solid #e2e2e2; font-size: 0;} .layedit-tool-fixed{position: fixed; top: 0; border-top: 1px solid #e2e2e2;} .layui-layedit-tool .layedit-tool-mid, .layui-layedit-tool .layui-icon{display: inline-block; vertical-align: middle; text-align: center; font-size: 14px;} .layui-layedit-tool .layui-icon{position: relative; width: 32px; height: 30px; line-height: 30px; margin: 3px 5px; border-radius: 2px; color: #777; cursor: pointer; border-radius: 2px;} .layui-layedit-tool .layui-icon:hover{color: #393D49;} .layui-layedit-tool .layui-icon:active{color: #000;} .layui-layedit-tool .layedit-tool-active{background-color: #e2e2e2; color: #000;} .layui-layedit-tool .layui-disabled, .layui-layedit-tool .layui-disabled:hover{color: #d2d2d2; cursor: not-allowed;} .layui-layedit-tool .layedit-tool-mid{width: 1px; height: 18px; margin: 0 10px; background-color: #d2d2d2;} .layedit-tool-html{width: 50px !important; font-size: 30px !important;} .layedit-tool-b, .layedit-tool-code, .layedit-tool-help{font-size: 16px !important;} .layedit-tool-d, .layedit-tool-unlink, .layedit-tool-face, .layedit-tool-image{font-size: 18px !important;} .layedit-tool-image input{position: absolute; font-size: 0; left: 0; top: 0; width: 100%; height: 100%; opacity: 0.01; filter: Alpha(opacity=1); cursor: pointer;} .layui-layedit-iframe iframe{display: block; width: 100%;} #LAY_layedit_code{overflow: hidden;} /** 分页 **/ .layui-laypage{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; margin: 10px 0; font-size: 0;} .layui-laypage>a:first-child, .layui-laypage>a:first-child em{border-radius: 2px 0 0 2px;} .layui-laypage>a:last-child, .layui-laypage>a:last-child em{border-radius: 0 2px 2px 0;} .layui-laypage>*:first-child{margin-left: 0!important;} .layui-laypage>*:last-child{margin-right: 0!important;} .layui-laypage a, .layui-laypage span, .layui-laypage input, .layui-laypage button, .layui-laypage select{border: 1px solid #e2e2e2;} .layui-laypage a, .layui-laypage span{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; padding: 0 15px; height: 28px; line-height: 28px; margin: 0 -1px 5px 0; background-color: #fff; color: #333; font-size: 12px;} .layui-laypage a:hover{color: #009688;} .layui-laypage em{font-style: normal;} .layui-laypage .layui-laypage-spr{color:#999; font-weight: 700;} .layui-laypage a{ text-decoration: none;} .layui-laypage .layui-laypage-curr{position: relative;} .layui-laypage .layui-laypage-curr em{position: relative; color: #fff;} .layui-laypage .layui-laypage-curr .layui-laypage-em{position: absolute; left: -1px; top: -1px; padding: 1px; width: 100%; height: 100%; background-color: #009688; } .layui-laypage-em{border-radius: 2px;} .layui-laypage-prev em, .layui-laypage-next em{font-family: Sim sun; font-size: 16px;} .layui-laypage .layui-laypage-count, .layui-laypage .layui-laypage-limits, .layui-laypage .layui-laypage-skip{margin-left: 10px; margin-right: 10px; padding: 0; border: none;} .layui-laypage .layui-laypage-limits{vertical-align: top;} .layui-laypage select{height: 22px; padding: 3px; border-radius: 2px; cursor: pointer;} .layui-laypage .layui-laypage-skip{height: 30px; line-height: 30px; color: #999;} .layui-laypage input, .layui-laypage button{height: 30px; line-height: 30px; border:1px solid #e2e2e2; border-radius: 2px; vertical-align: top; background-color: #fff; box-sizing: border-box;} .layui-laypage input{display: inline-block; width: 40px; margin: 0 10px; padding: 0 3px; text-align: center;} .layui-laypage input:focus, .layui-laypage select:focus{border-color: #009688!important;} .layui-laypage button{margin-left: 10px; padding: 0 10px; cursor: pointer;} /** 流加载 **/ .layui-flow-more{margin: 10px 0; text-align: center; color: #999; font-size: 14px;} .layui-flow-more a{ height: 32px; line-height: 32px; } .layui-flow-more a *{display: inline-block; vertical-align: top;} .layui-flow-more a cite{padding: 0 20px; border-radius: 3px; background-color: #eee; color: #333; font-style: normal;} .layui-flow-more a cite:hover{opacity: 0.8;} .layui-flow-more a i{font-size: 30px; color: #737383;} /** 表格 **/ .layui-table{width: 100%; margin: 10px 0; background-color: #fff;} .layui-table tr{transition: all .3s; -webkit-transition: all .3s;} .layui-table thead tr, .layui-table-header, .layui-table-fixed-l tr, .layui-table-tool, .layui-table-patch, .layui-table-mend{background-color: #f2f2f2;} .layui-table th{text-align: left; font-weight: 400;} .layui-table th, .layui-table td, .layui-table[lay-skin="line"], .layui-table[lay-skin="row"], .layui-table-view, .layui-table-header, .layui-table-tool{border: 1px solid #e2e2e2} .layui-table th, .layui-table td{position: relative; padding: 9px 15px; min-height: 20px; line-height: 20px; font-size: 14px;} .layui-table[lay-even] tr:nth-child(even){background-color: #f8f8f8;} .layui-table tbody tr:hover, .layui-table-hover{background-color: #f2f2f2!important;} .layui-table-click{background-color: #FFEEE8!important;} .layui-table[lay-skin="line"] th, .layui-table[lay-skin="line"] td{border-width: 0; border-bottom-width: 1px;} .layui-table[lay-skin="row"] th, .layui-table[lay-skin="row"] td{border-width: 0;border-right-width: 1px;} .layui-table[lay-skin="nob"] th, .layui-table[lay-skin="nob"] td{border: none;} .layui-table img{max-width:100px;} /* 大表格 */.layui-table[lay-size="lg"] th, .layui-table[lay-size="lg"] td{padding-top: 15px; padding-right: 30px; padding-bottom: 15px; padding-left: 30px;} .layui-table-view .layui-table[lay-size="lg"] .layui-table-cell{height: 40px; line-height: 40px;} /* 小表格 */.layui-table[lay-size="sm"] th, .layui-table[lay-size="sm"] td{padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px; font-size: 12px;} .layui-table-view .layui-table[lay-size="sm"] .layui-table-cell{height: 20px; line-height: 20px;} /* 数据表格 */ .layui-table[lay-data]{display: none;} .layui-table-view{position: relative; margin: 10px 0; overflow: hidden;} .layui-table-view .layui-table{position: relative; width: auto; margin: 0;} .layui-table-view .layui-table[lay-skin="line"]{border-width: 0; border-right-width: 1px;} .layui-table-view .layui-table[lay-skin="row"]{border-width: 0; border-bottom-width: 1px;} .layui-table-view .layui-table th, .layui-table-view .layui-table td{padding: 5px 0; border-top: none; border-left: none;} .layui-table-view .layui-table td{cursor: default;} .layui-table-view .layui-form-checkbox[lay-skin="primary"] i{width: 18px; height: 18px;} .layui-table-header{border-width: 0; border-bottom-width: 1px; overflow: hidden;} .layui-table-header .layui-table{margin-bottom: -1px;} .layui-table-sort{width: 20px; height: 20px; margin-left: 5px; cursor: pointer!important;} .layui-table-sort .layui-edge{left: 5px; border-width: 5px;} .layui-table-sort .layui-table-sort-asc{top: 4px; border-top: none; border-bottom-style: solid; border-bottom-color: #b2b2b2;} .layui-table-sort .layui-table-sort-asc:hover{border-bottom-color: #666;} .layui-table-sort .layui-table-sort-desc{bottom: 4px; border-bottom: none; border-top-style: solid; border-top-color: #b2b2b2;} .layui-table-sort .layui-table-sort-desc:hover{border-top-color: #666;} .layui-table-sort[lay-sort="asc"] .layui-table-sort-asc{border-bottom-color: #000;} .layui-table-sort[lay-sort="desc"] .layui-table-sort-desc{border-top-color: #000;} .layui-table-cell{height: 28px; line-height: 28px; padding: 0 15px; position: relative; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; box-sizing: border-box;} .layui-table-cell .layui-form-checkbox{top: -1px;} .layui-table-cell .layui-table-link{color: #01AAED;} .laytable-cell-space{width: 15px; padding: 0; text-align: center;} .layui-table-body{position: relative; overflow: auto; margin-right: -1px; margin-bottom: -1px;} .layui-table-body .layui-none{line-height: 40px; text-align: center; color: #999;} .layui-table-fixed{position: absolute; left: 0; top: 0;} .layui-table-fixed .layui-table-body{overflow: hidden;} .layui-table-fixed-r{left: auto; right: -1px; border-left: 1px solid #e2e2e2; box-shadow: -1px 0 8px rgba(0,0,0,.1);} .layui-table-fixed-r .layui-table-header{position: relative; overflow: visible;} .layui-table-mend{position: absolute; right: -49px; top: 0; height: 100%; width: 50px;} .layui-table-tool{position: relative; width: 100%; padding: 7px 10px 0 0; border-width: 0; border-top-width: 1px; height: 41px; margin-bottom: -1px; font-size: 12px; white-space: nowrap;} .layui-table-tool:hover{overflow-x: auto;} .layui-table-page{height: 26px;} .layui-table-tool .layui-laypage{margin: 0;} .layui-table-tool .layui-laypage span, .layui-table-tool .layui-laypage a{height: 26px; line-height: 26px; border: none; background: none; padding: 0 12px} .layui-table-tool .layui-laypage .layui-laypage-count, .layui-table-tool .layui-laypage .layui-laypage-limits, .layui-table-tool .layui-laypage .layui-laypage-skip{margin-left: 0; padding: 0;} .layui-table-tool .layui-laypage .layui-laypage-total{padding: 0 10px;} .layui-table-tool .layui-laypage .layui-laypage-spr{padding: 0;} .layui-table-tool .layui-laypage input, .layui-table-tool .layui-laypage button{height: 26px; line-height: 26px; } .layui-table-tool .layui-laypage input{width: 40px;} .layui-table-tool .layui-laypage button{padding: 0 10px;} .layui-table-view select[lay-ignore]{display: inline-block;} .layui-table-tool select{height: 18px;} .layui-table-patch .layui-table-cell{padding: 0; width: 30px;} .layui-table-edit{position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 0 15px 1px; border: none;} .layui-table-edit:focus{background-color: #F0F9F2;} body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-shadow: 0 1px 6px rgba(0,0,0,.1);} .layui-table-tips-main{margin: -44px 0 0 -1px; max-height: 150px; padding: 8px 15px; font-size: 14px; overflow-y: scroll; background-color: #fff; color: #333; border: 1px solid #e2e2e2} .layui-table-tips-c{position: absolute; right: -3px; top: -12px; width: 18px; height: 18px; padding: 3px; text-align: center; font-weight: 700; border-radius: 100%; font-size: 14px; cursor: pointer; background-color: #666;} .layui-table-tips-c:hover{background-color: #999;} /** 文件上传 **/ .layui-upload-file{display: none!important; opacity: .01; filter: Alpha(opacity=1);} .layui-upload-list{margin: 10px 0;} .layui-upload-choose{padding: 0 10px; color: #999;} .layui-upload-drag{position: relative; display: inline-block; padding: 30px; border: 1px dashed #e2e2e2; background-color: #fff; text-align: center; cursor: pointer; color: #999;} .layui-upload-drag .layui-icon{font-size: 50px; color: #009688;} .layui-upload-drag[lay-over]{border-color: #009688} .layui-upload-form{display: inline-block;} .layui-upload-iframe{position: absolute; width: 0; height: 0; border: 0; visibility: hidden} .layui-upload-wrap{position: relative; display: inline-block; vertical-align: middle;} .layui-upload-wrap .layui-upload-file{display: block!important; position: absolute; left: 0; top: 0; z-index: 10; font-size: 100px; width: 100%; height: 100%; opacity: .01; filter: Alpha(opacity=1); cursor: pointer;} /** 代码修饰器 **/ .layui-code{position: relative; margin: 10px 0; padding: 15px; line-height: 20px; border: 1px solid #ddd; border-left-width: 6px; background-color: #F2F2F2; color: #333; font-family: Courier New; font-size: 12px;} /** 树组件 **/ .layui-tree{line-height: 26px;} .layui-tree li{text-overflow: ellipsis; overflow:hidden; white-space: nowrap;} .layui-tree li a, .layui-tree li .layui-tree-spread{display: inline-block; vertical-align: top; height: 26px; *display: inline; *zoom:1; cursor: pointer;} .layui-tree li a{font-size: 0;} .layui-tree li a i{font-size: 16px;} .layui-tree li a cite{padding: 0 6px; font-size: 14px; font-style: normal;} .layui-tree li i{padding-left: 6px; color: #333; -moz-user-select: none;} .layui-tree li .layui-tree-check{font-size: 13px;} .layui-tree li .layui-tree-check:hover{color: #009E94;} .layui-tree li ul{display: none; margin-left: 20px;} .layui-tree li .layui-tree-enter{line-height: 24px; border: 1px dotted #000;} .layui-tree-drag{display: none; position: absolute; left: -666px; top: -666px; background-color: #f2f2f2; padding: 5px 10px; border: 1px dotted #000; white-space: nowrap} .layui-tree-drag i{padding-right: 5px;} /** 导航菜单 **/ .layui-nav{position: relative; padding: 0 20px; background-color: #393D49; color: #fff; border-radius: 2px; font-size: 0; box-sizing: border-box;} .layui-nav *{font-size: 14px;} .layui-nav .layui-nav-item{position: relative; display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; line-height: 60px;} .layui-nav .layui-nav-item a{display: block; padding: 0 20px; color: #fff; color: rgba(255,255,255,.7); transition: all .3s; -webkit-transition: all .3s;} .layui-nav-bar, .layui-nav .layui-this:after, .layui-nav-tree .layui-nav-itemed:after{position: absolute; left: 0; top: 0; width: 0; height: 5px; background-color: #5FB878; transition: all .2s; -webkit-transition: all .2s;} .layui-nav-bar{z-index: 1000;} .layui-nav .layui-this a ,.layui-nav .layui-nav-item a:hover{color: #fff;} .layui-nav .layui-this:after{content: ''; top: auto; bottom: 0; width: 100%;} .layui-nav-img{width: 30px; height: 30px; margin-right: 10px; border-radius: 50%;} .layui-nav .layui-nav-more{content:''; width: 0; height: 0; border-style: dashed; border-color: transparent; overflow: hidden; cursor: pointer; transition: all .2s; -webkit-transition: all .2s;} .layui-nav .layui-nav-more{position: absolute; top: 28px; right: 3px; border-width: 6px; border-top-style: solid; border-top-color: #fff; border-top-color: rgba(255,255,255,.7);} .layui-nav .layui-nav-mored, .layui-nav-itemed .layui-nav-more{top: 22px; border-style: dashed; border-color: transparent; border-bottom-style: solid; border-bottom-color: #fff;} .layui-nav-child{display: none; position: absolute; left: 0; top: 65px; min-width: 100%; line-height: 36px; padding: 5px 0; box-shadow: 0 2px 4px rgba(0,0,0,.12); border: 1px solid #d2d2d2; background-color: #fff; z-index: 100; border-radius: 2px; white-space: nowrap;} .layui-nav .layui-nav-child a{color: #333;} .layui-nav .layui-nav-child a:hover{background-color: #f2f2f2; color: #000;} .layui-nav-child dd{position: relative;} .layui-nav-child dd.layui-this{background-color: #5FB878; color: #fff;} .layui-nav .layui-nav-child dd.layui-this a{background-color: #5FB878; color: #fff;} .layui-nav-child dd.layui-this:after{display: none;} /* 垂直导航菜单 */.layui-nav-tree{width: 200px; padding: 0;} .layui-nav-tree .layui-nav-item{display: block; width: 100%; line-height: 45px;} .layui-nav-tree .layui-nav-item a{height: 45px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} .layui-nav-tree .layui-nav-item a:hover{background-color: #4E5465;} .layui-nav-tree .layui-nav-bar{width: 5px; height: 0;} .layui-nav-tree .layui-this, .layui-nav-tree .layui-this>a, .layui-nav-tree .layui-this>a:hover, .layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a{background-color: #009688; color: #fff;} .layui-nav-tree .layui-this:after{display: none;} .layui-nav-tree .layui-nav-title a, .layui-nav-tree .layui-nav-title a:hover, .layui-nav-itemed>a{color: #fff !important;} .layui-nav-tree .layui-nav-bar{background-color: #009688;} .layui-nav-tree .layui-nav-child{position: relative; z-index: 0; top: 0; border: none; box-shadow: none;} .layui-nav-tree .layui-nav-child a{height: 40px; line-height: 40px;} .layui-nav-tree .layui-nav-child a{color: #fff; color: rgba(255,255,255,.7);} .layui-nav-tree .layui-nav-child a:hover, .layui-nav-tree .layui-nav-child{background: none; color: #fff;} .layui-nav-tree .layui-nav-more{top: 20px; right: 10px;} .layui-nav-itemed .layui-nav-more{top: 14px;} .layui-nav-itemed .layui-nav-child{display: block; padding: 0; background-color: rgba(0,0,0,.3) !important;} /* 侧边 */.layui-nav-side{position: fixed; top: 0; bottom: 0; left: 0; overflow-x: hidden; z-index: 999;} /* 导航主题色 */.layui-bg-blue .layui-nav-bar, .layui-bg-blue .layui-this:after, .layui-bg-blue .layui-nav-itemed:after{background-color: #93D1FF;} .layui-bg-blue .layui-nav-child dd.layui-this{background-color: #1E9FFF;} .layui-nav-tree.layui-bg-blue .layui-nav-title a, .layui-nav-tree.layui-bg-blue .layui-nav-title a:hover, .layui-bg-blue .layui-nav-itemed>a{background-color: #007DDB !important;} /** 面包屑 **/ .layui-breadcrumb{visibility: hidden; font-size: 0;} .layui-breadcrumb a{padding-right: 8px; line-height: 22px; font-size: 14px; color: #333 !important;} .layui-breadcrumb a:hover{color: #01AAED !important;} .layui-breadcrumb a span, .layui-breadcrumb a cite{ color: #666; cursor: text; font-style: normal;} .layui-breadcrumb a span{padding-left: 8px; font-family: Sim sun;} /** Tab选项卡 **/ .layui-tab{margin: 10px 0; text-align: left !important;} .layui-tab[overflow]>.layui-tab-title{overflow: hidden;} .layui-tab-title{position: relative; left: 0; height: 40px; white-space: nowrap; font-size: 0; border-bottom: 1px solid #e2e2e2; transition: all .2s; -webkit-transition: all .2s;} .layui-tab-title li{display: inline-block; *display: inline; *zoom: 1; vertical-align: middle; font-size: 14px; transition: all .2s; -webkit-transition: all .2s;} .layui-tab-title li{position: relative; line-height: 40px; min-width: 65px; padding: 0 15px; text-align: center; cursor: pointer;} .layui-tab-title li a{display: block;} .layui-tab-title .layui-this{color: #000;} .layui-tab-title .layui-this:after{position: absolute; left:0; top: 0; content: ''; width:100%; height: 41px; border: 1px solid #e2e2e2; border-bottom-color: #fff; border-radius: 2px 2px 0 0; box-sizing: border-box; pointer-events: none;} .layui-tab-bar{position: absolute; right: 0; top: 0; z-index: 10; width: 30px; height: 39px; line-height: 39px; border: 1px solid #e2e2e2; border-radius: 2px; text-align: center; background-color: #fff; cursor: pointer;} .layui-tab-bar .layui-icon{position: relative; display: inline-block; top: 3px; transition: all .3s; -webkit-transition: all .3s;} .layui-tab-item{display: none;} .layui-tab-more{padding-right: 30px; height: auto !important; white-space: normal !important;} .layui-tab-more li.layui-this:after{border-bottom-color: #e2e2e2; border-radius: 2px;} .layui-tab-more .layui-tab-bar .layui-icon{top: -2px; top: 3px\0; -webkit-transform: rotate(180deg); transform: rotate(180deg);} :root .layui-tab-more .layui-tab-bar .layui-icon{top: -2px\0/IE9;} .layui-tab-content{padding: 10px;} /* Tab关闭 */.layui-tab-title li .layui-tab-close{position: relative; display: inline-block; width: 18px; height: 18px; line-height: 20px; margin-left: 8px; top: 1px; text-align: center; font-size: 14px; color: #c2c2c2; transition: all .2s; -webkit-transition: all .2s;} .layui-tab-title li .layui-tab-close:hover{border-radius: 2px; background-color: #FF5722; color: #fff;} /* Tab简洁风格 */.layui-tab-brief > .layui-tab-title .layui-this{color: #009688;} .layui-tab-brief > .layui-tab-title .layui-this:after ,.layui-tab-brief > .layui-tab-more li.layui-this:after{border: none; border-radius: 0; border-bottom: 2px solid #5FB878;} .layui-tab-brief[overflow] > .layui-tab-title .layui-this:after{top: -1px;} /* Tab卡片风格 */.layui-tab-card{border: 1px solid #e2e2e2; border-radius: 2px; box-shadow: 0 2px 5px 0 rgba(0,0,0,.1);} .layui-tab-card > .layui-tab-title{ background-color: #f2f2f2;} .layui-tab-card > .layui-tab-title li{margin-right: -1px; margin-left: -1px;} .layui-tab-card > .layui-tab-title .layui-this{background-color: #fff; } .layui-tab-card > .layui-tab-title .layui-this:after{border-top: none; border-width: 1px; border-bottom-color: #fff;} .layui-tab-card > .layui-tab-title .layui-tab-bar{height: 40px; line-height: 40px; border-radius: 0; border-top: none; border-right: none;} .layui-tab-card > .layui-tab-more .layui-this{background: none; color: #5FB878;} .layui-tab-card > .layui-tab-more .layui-this:after{border: none;} /* 时间线 */ .layui-timeline{padding-left: 5px;} .layui-timeline-item{position: relative; padding-bottom: 20px;} .layui-timeline-axis{position: absolute; left: -5px; top: 0; z-index: 10; width: 20px; height: 20px; line-height: 20px; background-color: #fff; color: #5FB878; border-radius: 50%; text-align: center; cursor: pointer;} .layui-timeline-axis:hover{color: #FF5722;} .layui-timeline-item:before{content: ''; position: absolute; left: 5px; top: 0; z-index: 0; width: 1px; height: 100%; background-color: #e2e2e2;} .layui-timeline-item:last-child:before{display: none;} .layui-timeline-item:first-child:before{display: block;} .layui-timeline-content{padding-left: 25px;;} .layui-timeline-title{position: relative; margin-bottom: 10px;} /* 小徽章 */ .layui-badge, .layui-badge-dot, .layui-badge-rim{position:relative; display: inline-block; font-size: 12px; background-color: #FF5722; color: #fff;} .layui-badge{min-width: 8px; height: 18px; line-height: 18px; padding: 0 5px; text-align: center; border-radius: 9px;} .layui-badge-dot{width: 8px; height: 8px; border-radius: 50%;} .layui-badge-rim{height: 18px; line-height: 18px; padding: 0 5px; border: 1px solid #e2e2e2; border-radius: 3px; background-color: #fff; color: #666;} .layui-btn .layui-badge, .layui-btn .layui-badge-dot{margin-left: 5px;} .layui-nav .layui-badge, .layui-nav .layui-badge-dot{position: absolute; top: 50%; margin: -10px 6px 0;} .layui-tab-title .layui-badge, .layui-tab-title .layui-badge-dot{left: 5px; top: -2px;} /* carousel 轮播 */ .layui-carousel{position: relative; left: 0; top: 0; background-color: #f2f2f2;} .layui-carousel>*[carousel-item]{position: relative; width: 100%; height: 100%; overflow: hidden;} .layui-carousel>*[carousel-item]:before{position: absolute; content: '\e63d'; left: 50%; top: 50%; width: 100px; line-height: 20px; margin: -10px 0 0 -50px; text-align: center; color: #999; font-family:"layui-icon" !important; font-size: 20px; font-style:normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;} .layui-carousel>*[carousel-item] > *{display: none; position: absolute; left: 0; top: 0; width: 100%; height: 100%; background-color: #f2f2f2; transition-duration: .3s; -webkit-transition-duration: .3s;} .layui-carousel-updown > *{-webkit-transition: .3s ease-in-out up; transition: .3s ease-in-out up;} .layui-carousel-arrow{display: none\0; opacity: 0; position: absolute; left: 10px; top: 50%; margin-top: -18px; width: 36px; height: 36px; line-height: 36px; text-align: center; font-size: 20px; border: none 0; border-radius: 50%; background-color: rgba(0,0,0,.2); color: #fff; -webkit-transition-duration: .3s; transition-duration: .3s; cursor: pointer;} .layui-carousel-arrow[lay-type="add"]{left: auto!important; right: 10px;} .layui-carousel[lay-arrow="always"] .layui-carousel-arrow{opacity: 1; left: 20px;} .layui-carousel[lay-arrow="always"] .layui-carousel-arrow[lay-type="add"]{right: 20px;} .layui-carousel[lay-arrow="none"] .layui-carousel-arrow{display: none;} .layui-carousel-arrow:hover, .layui-carousel-ind ul:hover{background-color: rgba(0,0,0,.35);} .layui-carousel:hover .layui-carousel-arrow{display: block\0; opacity: 1; left: 20px;} .layui-carousel:hover .layui-carousel-arrow[lay-type="add"]{right: 20px;} .layui-carousel-ind{position: relative; top: -35px; width: 100%; line-height: 0!important; text-align: center; font-size: 0;} .layui-carousel[lay-indicator="outside"]{margin-bottom: 30px;} .layui-carousel[lay-indicator="outside"] .layui-carousel-ind{top: 10px;} .layui-carousel[lay-indicator="outside"] .layui-carousel-ind ul{background-color: rgba(0,0,0,.5);} .layui-carousel[lay-indicator="none"] .layui-carousel-ind{display: none;} .layui-carousel-ind ul{display: inline-block; padding: 5px; background-color: rgba(0,0,0,.2); border-radius: 10px; -webkit-transition-duration: .3s; transition-duration: .3s;} .layui-carousel-ind li{display: inline-block; width: 10px; height: 10px; margin: 0 3px; font-size: 14px; background-color: #e2e2e2; background-color: rgba(255,255,255,.5); border-radius: 50%; cursor: pointer; -webkit-transition-duration: .3s; transition-duration: .3s;} .layui-carousel-ind li:hover{background-color: rgba(255,255,255,.7);} .layui-carousel-ind li.layui-this{background-color: #fff;} .layui-carousel>*[carousel-item]>.layui-this, .layui-carousel>*[carousel-item]>.layui-carousel-prev, .layui-carousel>*[carousel-item]>.layui-carousel-next{display: block} .layui-carousel>*[carousel-item]>.layui-this{left: 0;} .layui-carousel>*[carousel-item]>.layui-carousel-prev{left: -100%;} .layui-carousel>*[carousel-item]>.layui-carousel-next{left: 100%;} .layui-carousel>*[carousel-item]>.layui-carousel-prev.layui-carousel-right, .layui-carousel>*[carousel-item]>.layui-carousel-next.layui-carousel-left{left: 0;} .layui-carousel>*[carousel-item]>.layui-this.layui-carousel-left{left: -100%;} .layui-carousel>*[carousel-item]>.layui-this.layui-carousel-right{left: 100%;} /* 上下切换 */.layui-carousel[lay-anim="updown"] .layui-carousel-arrow{left: 50%!important; top: 20px; margin: 0 0 0 -18px;} .layui-carousel[lay-anim="updown"] .layui-carousel-arrow[lay-type="add"]{top: auto!important; bottom: 20px;} .layui-carousel[lay-anim="updown"] .layui-carousel-ind{position: absolute; top: 50%; right: 20px; width: auto; height: auto;} .layui-carousel[lay-anim="updown"] .layui-carousel-ind ul{padding: 3px 5px;} .layui-carousel[lay-anim="updown"] .layui-carousel-ind li{display: block; margin: 6px 0;} .layui-carousel[lay-anim="updown"]>*[carousel-item]>*{left: 0!important;} .layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this{top: 0;} .layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-prev{top: -100%;} .layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-next{top: 100%;} .layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-prev.layui-carousel-right, .layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-carousel-next.layui-carousel-left{top: 0;} .layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this.layui-carousel-left{top: -100%;} .layui-carousel[lay-anim="updown"]>*[carousel-item]>.layui-this.layui-carousel-right{top: 100%;} /* 渐显切换 */.layui-carousel[lay-anim="fade"]>*[carousel-item]>*{left: 0!important;} .layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-prev, .layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-next{opacity: 0;} .layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-prev.layui-carousel-right, .layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-carousel-next.layui-carousel-left{opacity: 1;} .layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-this.layui-carousel-left, .layui-carousel[lay-anim="fade"]>*[carousel-item]>.layui-this.layui-carousel-right{opacity: 0} /** fixbar **/ .layui-fixbar{position: fixed; right: 15px; bottom: 15px; z-index: 9999;} .layui-fixbar li{width: 50px; height: 50px; line-height: 50px; margin-bottom: 1px; text-align:center; cursor: pointer; font-size:30px; background-color: #9F9F9F; color:#fff; border-radius: 2px; opacity: 0.95;} .layui-fixbar li:hover{opacity: 0.85;} .layui-fixbar li:active{opacity: 1;} .layui-fixbar .layui-fixbar-top{display: none; font-size: 40px;} /** 表情面板 **/ body .layui-util-face{border: none; background: none;} body .layui-util-face .layui-layer-content{padding:0; background-color:#fff; color:#666; box-shadow:none} .layui-util-face .layui-layer-TipsG{display:none;} .layui-util-face ul{position:relative; width:372px; padding:10px; border:1px solid #D9D9D9; background-color:#fff; box-shadow: 0 0 20px rgba(0,0,0,.2);} .layui-util-face ul li{cursor: pointer; float: left; border: 1px solid #e8e8e8; height: 22px; width: 26px; overflow: hidden; margin: -1px 0 0 -1px; padding: 4px 2px; text-align: center;} .layui-util-face ul li:hover{position: relative; z-index: 2; border: 1px solid #eb7350; background: #fff9ec;} /** 动画 **/ .layui-anim{-webkit-animation-duration: 0.3s; animation-duration: 0.3s; -webkit-animation-fill-mode: both; animation-fill-mode: both;} .layui-anim.layui-icon{display: inline-block;} .layui-anim-loop{-webkit-animation-iteration-count: infinite; animation-iteration-count: infinite;} @-webkit-keyframes layui-rotate{ /* 循环旋转 */ from {-webkit-transform: rotate(0deg);} to {-webkit-transform: rotate(360deg);} } @keyframes layui-rotate{ from {transform: rotate(0deg);} to {transform: rotate(360deg);} } .layui-anim-rotate{-webkit-animation-name: layui-rotate; animation-name: layui-rotate; -webkit-animation-duration: 1s; animation-duration: 1s; -webkit-animation-timing-function: linear; animation-timing-function: linear;} @-webkit-keyframes layui-up{ /* 从最底部往上滑入 */ from {-webkit-transform: translate3d(0, 100%, 0); opacity: 0.3;} to {-webkit-transform: translate3d(0, 0, 0); opacity: 1;} } @keyframes layui-up{ from {transform: translate3d(0, 100%, 0); opacity: 0.3;} to {transform: translate3d(0, 0, 0); opacity: 1;} } .layui-anim-up{-webkit-animation-name: layui-up; animation-name: layui-up;} @-webkit-keyframes layui-upbit{ /* 微微往上滑入 */ from {-webkit-transform: translate3d(0, 30px, 0); opacity: 0.3;} to {-webkit-transform: translate3d(0, 0, 0); opacity: 1;} } @keyframes layui-upbit{ from {transform: translate3d(0, 30px, 0); opacity: 0.3;} to {transform: translate3d(0, 0, 0); opacity: 1;} } .layui-anim-upbit{-webkit-animation-name: layui-upbit; animation-name: layui-upbit;} @-webkit-keyframes layui-scale { /* 放大 */ 0% {opacity: 0.3; -webkit-transform: scale(.5);} 100% {opacity: 1; -webkit-transform: scale(1);} } @keyframes layui-scale { 0% {opacity: 0.3; -ms-transform: scale(.5); transform: scale(.5);} 100% {opacity: 1; -ms-transform: scale(1); transform: scale(1);} } .layui-anim-scale{-webkit-animation-name: layui-scale; animation-name: layui-scale} @-webkit-keyframes layui-scale-spring { /* 弹簧式放大 */ 0% {opacity: 0.5; -webkit-transform: scale(.5);} 80% {opacity: 0.8; -webkit-transform: scale(1.1);} 100% {opacity: 1; -webkit-transform: scale(1);} } @keyframes layui-scale-spring { 0% {opacity: 0.5; transform: scale(.5);} 80% {opacity: 0.8; transform: scale(1.1);} 100% {opacity: 1; transform: scale(1);} } .layui-anim-scaleSpring{-webkit-animation-name: layui-scale-spring; animation-name: layui-scale-spring} @-webkit-keyframes layui-fadein { /* 渐现 */ 0% {opacity: 0;} 100% {opacity: 1;} } @keyframes layui-fadein { 0% {opacity: 0;} 100% {opacity: 1;} } .layui-anim-fadein{-webkit-animation-name: layui-fadein; animation-name: layui-fadein} @-webkit-keyframes layui-fadeout { /* 渐隐 */ 0% {opacity: 1;} 100% {opacity: 0;} } @keyframes layui-fadeout { 0% {opacity: 1;} 100% {opacity: 0;} } .layui-anim-fadeout{-webkit-animation-name: layui-fadeout; animation-name: layui-fadeout} ================================================ FILE: src/main/resources/static/css/layui.mobile.css ================================================ /** @Name: layui mobile @author 郑保乐 @Site: http://www.layui.com/mobile/ */ /* reset */ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form,legend{margin:0; padding:0; -webkit-tap-highlight-color:rgba(0,0,0,0)} html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif; -ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;} a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0);} a{text-decoration: none; background:transparent} a:active,a:hover{outline:0} table{border-collapse:collapse;border-spacing:0} li{list-style:none;} b,strong{font-weight:700;} h1, h2, h3, h4, h5, h6{font-weight:500;} address,cite,dfn,em,var{font-style:normal;} dfn{font-style:italic} sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} img{border:0; vertical-align: bottom} button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0; outline: 0;} button,select{text-transform:none} select{-webkit-appearance: none; border:none;} input{line-height:normal; } input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0} input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto} input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box} input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none} label,input{vertical-align: middle;} /** 图标字体 **/ @font-face {font-family: 'layui-icon'; src: url('../font/iconfont.eot?v=1.0.7'); src: url('../font/iconfont.eot?v=1.0.7#iefix') format('embedded-opentype'), url('../font/iconfont.woff?v=1.0.7') format('woff'), url('../font/iconfont.ttf?v=1.0.7') format('truetype'), url('../font/iconfont.svg?v=1.0.7#iconfont') format('svg'); } .layui-icon{ font-family:"layui-icon" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /** 基础通用 **/ /* 消除第三方ui可能造成的冲突 */.layui-box, .layui-box *{-webkit-box-sizing: content-box !important; -moz-box-sizing: content-box !important; box-sizing: content-box !important;} .layui-border-box, .layui-border-box *{-webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; box-sizing: border-box !important;} .layui-inline{position: relative; display: inline-block; *display:inline; *zoom:1; vertical-align: middle;} /* 三角形 */.layui-edge{position: absolute; width: 0; height: 0; border-style: dashed; border-color: transparent; overflow: hidden;} /* 单行溢出省略 */.layui-elip{text-overflow: ellipsis; overflow: hidden; white-space: nowrap;} /* 屏蔽选中 */.layui-unselect{-moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;} .layui-disabled,.layui-disabled:active{background-color: #d2d2d2 !important; color: #fff !important; cursor: not-allowed !important;} /* 纯圆角 */.layui-circle{border-radius: 100%;} .layui-show{display: block !important;} .layui-hide{display: none !important;} .layui-upload-iframe{position: absolute; width: 0px; height: 0px; border: 0px; visibility: hidden;} .layui-upload-enter{border: 1px solid #009E94; background-color: #009E94; color: #fff; -webkit-transform: scale(1.1); transform: scale(1.1);} /* 弹出动画 */ @-webkit-keyframes layui-m-anim-scale { /* 默认 */ 0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)} 100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)} } @keyframes layui-m-anim-scale { /* 由小到大 */ 0% {opacity: 0; -webkit-transform: scale(.5); transform: scale(.5)} 100% {opacity: 1; -webkit-transform: scale(1); transform: scale(1)} } .layui-m-anim-scale{animation-name: layui-m-anim-scale; -webkit-animation-name: layui-m-anim-scale;} @-webkit-keyframes layui-m-anim-up{ /* 从下往上 */ 0%{opacity: 0; -webkit-transform: translateY(800px); transform: translateY(800px)} 100%{opacity: 1; -webkit-transform: translateY(0); transform: translateY(0)} } @keyframes layui-m-anim-up{ 0%{opacity: 0; -webkit-transform: translateY(800px); transform: translateY(800px)} 100%{opacity: 1; -webkit-transform: translateY(0); transform: translateY(0)} } .layui-m-anim-up{-webkit-animation-name: layui-m-anim-up; animation-name: layui-m-anim-up} @-webkit-keyframes layui-m-anim-left{ /* 从右往左 */ 0%{-webkit-transform: translateX(100%); transform: translateX(100%)} 100%{-webkit-transform: translateX(0); transform: translateX(0)} } @keyframes layui-m-anim-left{ 0%{-webkit-transform: translateX(100%); transform: translateX(100%)} 100%{-webkit-transform: translateX(0); transform: translateX(0)} } .layui-m-anim-left{-webkit-animation-name: layui-m-anim-left; animation-name: layui-m-anim-left} @-webkit-keyframes layui-m-anim-right{ /* 从左往右 */ 0%{-webkit-transform: translateX(-100%); transform: translateX(-100%)} 100%{-webkit-transform: translateX(0); transform: translateX(0)} } @keyframes layui-m-anim-right{ 0%{-webkit-transform: translateX(-100%); transform: translateX(-100%)} 100%{-webkit-transform: translateX(0); transform: translateX(0)} } .layui-m-anim-right{-webkit-animation-name: layui-m-anim-right; animation-name: layui-m-anim-right} @-webkit-keyframes layui-m-anim-lout{ /* 往左收缩 */ 0%{-webkit-transform: translateX(0); transform: translateX(0)} 100%{-webkit-transform: translateX(-100%); transform: translateX(-100%)} } @keyframes layui-m-anim-lout{ 0%{-webkit-transform: translateX(0); transform: translateX(0)} 100%{-webkit-transform: translateX(-100%); transform: translateX(-100%)} } .layui-m-anim-lout{-webkit-animation-name: layui-m-anim-lout; animation-name: layui-m-anim-lout} @-webkit-keyframes layui-m-anim-rout{ /* 往右收缩 */ 0%{-webkit-transform: translateX(0); transform: translateX(0)} 100%{-webkit-transform: translateX(100%); transform: translateX(100%)} } @keyframes layui-m-anim-rout{ 0%{-webkit-transform: translateX(0); transform: translateX(0)} 100%{-webkit-transform: translateX(100%); transform: translateX(100%)} } .layui-m-anim-rout{-webkit-animation-name: layui-m-anim-rout; animation-name: layui-m-anim-rout} /** layer mobile */ .layui-m-layer{position:relative; z-index: 19891014;} .layui-m-layer *{-webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box;} .layui-m-layershade, .layui-m-layermain{position:fixed; left:0; top:0; width:100%; height:100%;} .layui-m-layershade{background-color:rgba(0,0,0, .7); pointer-events:auto;} .layui-m-layermain{display:table; font-family: Helvetica, arial, sans-serif; pointer-events: none;} .layui-m-layermain .layui-m-layersection{display:table-cell; vertical-align:middle; text-align:center;} .layui-m-layerchild{position:relative; display:inline-block; text-align:left; background-color:#fff; font-size:14px; border-radius: 5px; box-shadow: 0 0 8px rgba(0, 0, 0, 0.1); pointer-events:auto; -webkit-overflow-scrolling: touch;} .layui-m-layerchild{-webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-duration: .2s; animation-duration: .2s;} .layui-m-layer0 .layui-m-layerchild{width: 90%; max-width: 640px;} .layui-m-layer1 .layui-m-layerchild{border:none; border-radius:0;} .layui-m-layer2 .layui-m-layerchild{width:auto; max-width:260px; min-width:40px; border:none; background: none; box-shadow: none; color:#fff;} .layui-m-layerchild h3{padding: 0 10px; height: 60px; line-height: 60px; font-size:16px; font-weight: 400; border-radius: 5px 5px 0 0; text-align: center;} .layui-m-layerchild h3, .layui-m-layerbtn span{ text-overflow:ellipsis; overflow:hidden; white-space:nowrap;} .layui-m-layercont{padding: 50px 30px; line-height: 22px; text-align:center;} .layui-m-layer1 .layui-m-layercont{padding:0; text-align:left;} .layui-m-layer2 .layui-m-layercont{text-align:center; padding: 0; line-height: 0;} .layui-m-layer2 .layui-m-layercont i{width:25px; height:25px; margin-left:8px; display:inline-block; background-color:#fff; border-radius:100%;} .layui-m-layer2 .layui-m-layercont p{margin-top: 20px;} /* loading */ @-webkit-keyframes layui-m-anim-loading{ 0%,80%,100%{transform:scale(0); -webkit-transform:scale(0)} 40%{transform:scale(1); -webkit-transform:scale(1)} } @keyframes layui-m-anim-loading{ 0%,80%,100%{transform:scale(0); -webkit-transform:scale(0)} 40%{transform:scale(1); -webkit-transform:scale(1)} } .layui-m-layer2 .layui-m-layercont i{-webkit-animation: layui-m-anim-loading 1.4s infinite ease-in-out; animation: layui-m-anim-loading 1.4s infinite ease-in-out; -webkit-animation-fill-mode: both; animation-fill-mode: both;} .layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0; -webkit-animation-delay: -.32s; animation-delay: -.32s;} .layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay: -.16s; animation-delay: -.16s;} .layui-m-layer2 .layui-m-layercont>div{line-height:22px; padding-top:7px; margin-bottom:20px; font-size: 14px;} .layui-m-layerbtn{display: box; display: -moz-box; display: -webkit-box; width: 100%; position:relative; height: 50px; line-height: 50px; font-size: 0; text-align:center; border-top:1px solid #D0D0D0; background-color: #F2F2F2; border-radius: 0 0 5px 5px;} .layui-m-layerbtn span{position:relative; display: block; -moz-box-flex: 1; box-flex: 1; -webkit-box-flex: 1; text-align:center; font-size:14px; border-radius: 0 0 5px 5px; cursor:pointer;} .layui-m-layerbtn span[yes]{color: #40AFFE;} .layui-m-layerbtn span[no]{border-right: 1px solid #D0D0D0; border-radius: 0 0 0 5px;} .layui-m-layerbtn span:active{background-color: #F6F6F6;} .layui-m-layerend{position:absolute; right:7px; top:10px; width:30px; height:30px; border: 0; font-weight:400; background: transparent; cursor: pointer; -webkit-appearance: none; font-size:30px;} .layui-m-layerend::before, .layui-m-layerend::after{position:absolute; left:5px; top:15px; content:''; width:18px; height:1px; background-color:#999; transform:rotate(45deg); -webkit-transform:rotate(45deg); border-radius: 3px;} .layui-m-layerend::after{transform:rotate(-45deg); -webkit-transform:rotate(-45deg);} /* 底部对话框风格 */ body .layui-m-layer .layui-m-layer-footer{position: fixed; width: 95%; max-width: 100%; margin: 0 auto; left:0; right: 0; bottom: 10px; background: none;} .layui-m-layer-footer .layui-m-layercont{padding: 20px; border-radius: 5px 5px 0 0; background-color: rgba(255,255,255,.8);} .layui-m-layer-footer .layui-m-layerbtn{display: block; height: auto; background: none; border-top: none;} .layui-m-layer-footer .layui-m-layerbtn span{background-color: rgba(255,255,255,.8);} .layui-m-layer-footer .layui-m-layerbtn span[no]{color: #FD482C; border-top: 1px solid #c2c2c2; border-radius: 0 0 5px 5px;} .layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top: 10px; border-radius: 5px;} /* 通用提示 */ body .layui-m-layer .layui-m-layer-msg{width: auto; max-width: 90%; margin: 0 auto; bottom: -150px; background-color: rgba(0,0,0,.7); color: #fff;} .layui-m-layer-msg .layui-m-layercont{padding: 10px 20px;} ================================================ FILE: src/main/resources/static/css/login.css ================================================ html{ height: 100%; font-family: PingFangSC-Light,'helvetica neue','hiragino sans gb',arial,'microsoft yahei ui','microsoft yahei',simsun,sans-serif; font-size: 14px; } body.signin { background: #18c8f6; height: auto; background:url("../img/backg02.jpg") no-repeat center fixed; -webkit-background-size: cover; -moz-background-size: cover; -o-background-size: cover; background-size: cover; color: rgba(255,255,255,.95); } .logopanel h1{ font-size: 40px; } .signin-info h3{ font-size: 24px; } .signinpanel { width: 912px; margin: 7% auto 0 auto; } .btn-login{ border: 1px solid #00a3ff; background-color: #00A3FF; color: #fff; border-radius: 2px; } .btn-login:hover{ color: #fff; background-color: #0097ee; border: 1px solid #0097ee; } .signinpanel .logopanel { float: none; width: auto; padding: 0; background: none; } .signinpanel .signin-info ul { list-style: none; padding: 0; margin: 20px 0; font-size: 20px; } .signinpanel .form-control { display: block; margin-top: 15px; } .signinpanel .uname { background: #fff url(../img/user.png) no-repeat 95% center;color:#333; } .signinpanel .pword { background: #fff url(../img/locked.png) no-repeat 95% center;color:#333; } .signinpanel .btn { margin-top: 15px; } .signinpanel form { background: #fff; border: 1px solid rgba(255,255,255,.3); -moz-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); -webkit-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; padding: 30px; color:#666; } .signinpanel form >h3{ color: #333333; font-size: 24px; font-family: "microsoft yahei"; font-weight: 400; } .signup-footer{border-top: solid 1px rgba(255,255,255,.3);margin:20px 0;padding-top: 15px;} .outside-login{ border-top: #dcdee3 1px solid; padding: 7% 0 0; text-align: center; position: relative; margin: 9% 0% 0; border-radius: 0 0 1% 1%; } .outside-login-tit{ position: absolute; top: -8px; left: 50%; margin: 0 0 0 -50px; text-align: center; width: 100px; height: 14px; line-height: 1; color: #999; } .outside-login-tit span{ position: relative; z-index: 2; } .outside-login-tit:before { top: 0; left: 0; background-color: #fff; } .outside-login-tit:after { top: 7px; left: 0; background-color: #fff; } .outside-login-tit:after, .outside-login-tit:before { content: ''; display: block; width: 100%; height: 7px; position: absolute; z-index: 1; } .outside-login-con { font-size: 0; padding-top: 10px; } .outside-login-list { width: 116%; margin-left: -8%; } .outside-login-btn { display: inline-block; vertical-align: middle; text-align: center; width: 33.3333%; } .outside-login-list .actived { display: inline-block; } .outside-login-btn em { display: block; width: 50px; height: 50px; line-height: 50px; border-radius: 50%; margin: 0 auto 5px; white-space: normal; font-size: 20px; color: #fff; } .outside-login-btn:first-child, .outside-login-btn:last-child { width: 30.3333%; } .outside-login-btn span { font-size: 14px; color: #333; } .oschina em{ background-color: #4ec34d; } .git em{ background-color: #211b1b; } .my em{ background-color: #ff4700 } @media screen and (max-width: 768px) { .signinpanel, .signuppanel { margin: 0 auto; width: 413px!important; padding: 20px; } .signinpanel form { margin-top: 20px; } .signup-footer { margin-bottom: 10px; } .signuppanel .form-control { margin-bottom: 10px; } .signup-footer .pull-left, .signup-footer .pull-right { float: none !important; text-align: center; } .signinpanel .signin-info ul { display: none; } } @media screen and (max-width: 320px) { .signinpanel, .signuppanel { margin:0 20px; width:auto; } } ================================================ FILE: src/main/resources/static/css/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css ================================================ .checkbox { padding-left: 20px; } .checkbox label { display: inline-block; vertical-align: middle; position: relative; padding-left: 5px; } .checkbox label::before { content: ""; display: inline-block; position: absolute; width: 17px; height: 17px; left: 0; margin-left: -20px; border: 1px solid #cccccc; border-radius: 3px; background-color: #fff; -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out; transition: border 0.15s ease-in-out, color 0.15s ease-in-out; } .checkbox label::after { display: inline-block; position: absolute; width: 16px; height: 16px; left: 0; top: 0; margin-left: -20px; padding-left: 3px; padding-top: 1px; font-size: 11px; color: #555555; } .checkbox input[type="checkbox"], .checkbox input[type="radio"] { opacity: 0; z-index: 1; } .checkbox input[type="checkbox"]:focus + label::before, .checkbox input[type="radio"]:focus + label::before { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .checkbox input[type="checkbox"]:checked + label::after, .checkbox input[type="radio"]:checked + label::after { font-family: "FontAwesome"; content: "\f00c"; } .checkbox input[type="checkbox"]:disabled + label, .checkbox input[type="radio"]:disabled + label { opacity: 0.65; } .checkbox input[type="checkbox"]:disabled + label::before, .checkbox input[type="radio"]:disabled + label::before { background-color: #eeeeee; cursor: not-allowed; } .checkbox.checkbox-circle label::before { border-radius: 50%; } .checkbox.checkbox-inline { margin-top: 0; } .checkbox-primary input[type="checkbox"]:checked + label::before, .checkbox-primary input[type="radio"]:checked + label::before { background-color: #337ab7; border-color: #337ab7; } .checkbox-primary input[type="checkbox"]:checked + label::after, .checkbox-primary input[type="radio"]:checked + label::after { color: #fff; } .checkbox-danger input[type="checkbox"]:checked + label::before, .checkbox-danger input[type="radio"]:checked + label::before { background-color: #d9534f; border-color: #d9534f; } .checkbox-danger input[type="checkbox"]:checked + label::after, .checkbox-danger input[type="radio"]:checked + label::after { color: #fff; } .checkbox-info input[type="checkbox"]:checked + label::before, .checkbox-info input[type="radio"]:checked + label::before { background-color: #5bc0de; border-color: #5bc0de; } .checkbox-info input[type="checkbox"]:checked + label::after, .checkbox-info input[type="radio"]:checked + label::after { color: #fff; } .checkbox-warning input[type="checkbox"]:checked + label::before, .checkbox-warning input[type="radio"]:checked + label::before { background-color: #f0ad4e; border-color: #f0ad4e; } .checkbox-warning input[type="checkbox"]:checked + label::after, .checkbox-warning input[type="radio"]:checked + label::after { color: #fff; } .checkbox-success input[type="checkbox"]:checked + label::before, .checkbox-success input[type="radio"]:checked + label::before { background-color: #5cb85c; border-color: #5cb85c; } .checkbox-success input[type="checkbox"]:checked + label::after, .checkbox-success input[type="radio"]:checked + label::after { color: #fff; } .radio { padding-left: 20px; } .radio label { display: inline-block; vertical-align: middle; position: relative; padding-left: 5px; } .radio label::before { content: ""; display: inline-block; position: absolute; width: 17px; height: 17px; left: 0; margin-left: -20px; border: 1px solid #cccccc; border-radius: 50%; background-color: #fff; -webkit-transition: border 0.15s ease-in-out; -o-transition: border 0.15s ease-in-out; transition: border 0.15s ease-in-out; } .radio label::after { display: inline-block; position: absolute; content: " "; width: 11px; height: 11px; left: 3px; top: 3px; margin-left: -20px; border-radius: 50%; background-color: #555555; -webkit-transform: scale(0, 0); -ms-transform: scale(0, 0); -o-transform: scale(0, 0); transform: scale(0, 0); -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33); } .radio input[type="radio"] { opacity: 0; z-index: 1; } .radio input[type="radio"]:focus + label::before { outline: thin dotted; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .radio input[type="radio"]:checked + label::after { -webkit-transform: scale(1, 1); -ms-transform: scale(1, 1); -o-transform: scale(1, 1); transform: scale(1, 1); } .radio input[type="radio"]:disabled + label { opacity: 0.65; } .radio input[type="radio"]:disabled + label::before { cursor: not-allowed; } .radio.radio-inline { margin-top: 0; } .radio-primary input[type="radio"] + label::after { background-color: #337ab7; } .radio-primary input[type="radio"]:checked + label::before { border-color: #337ab7; } .radio-primary input[type="radio"]:checked + label::after { background-color: #337ab7; } .radio-danger input[type="radio"] + label::after { background-color: #d9534f; } .radio-danger input[type="radio"]:checked + label::before { border-color: #d9534f; } .radio-danger input[type="radio"]:checked + label::after { background-color: #d9534f; } .radio-info input[type="radio"] + label::after { background-color: #5bc0de; } .radio-info input[type="radio"]:checked + label::before { border-color: #5bc0de; } .radio-info input[type="radio"]:checked + label::after { background-color: #5bc0de; } .radio-warning input[type="radio"] + label::after { background-color: #f0ad4e; } .radio-warning input[type="radio"]:checked + label::before { border-color: #f0ad4e; } .radio-warning input[type="radio"]:checked + label::after { background-color: #f0ad4e; } .radio-success input[type="radio"] + label::after { background-color: #5cb85c; } .radio-success input[type="radio"]:checked + label::before { border-color: #5cb85c; } .radio-success input[type="radio"]:checked + label::after { background-color: #5cb85c; } input[type="checkbox"].styled:checked + label:after, input[type="radio"].styled:checked + label:after { font-family: 'FontAwesome'; content: "\f00c"; } input[type="checkbox"] .styled:checked + label::before, input[type="radio"] .styled:checked + label::before { color: #fff; } input[type="checkbox"] .styled:checked + label::after, input[type="radio"] .styled:checked + label::after { color: #fff; } ================================================ FILE: src/main/resources/static/css/plugins/blueimp/css/blueimp-gallery-indicator.css ================================================ @charset "UTF-8"; /* * blueimp Gallery Indicator CSS 1.1.0 * https://github.com/blueimp/Gallery * * Copyright 2013, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ .blueimp-gallery > .indicator { position: absolute; top: auto; right: 15px; bottom: 15px; left: 15px; margin: 0 40px; padding: 0; list-style: none; text-align: center; line-height: 10px; display: none; } .blueimp-gallery > .indicator > li { display: inline-block; width: 9px; height: 9px; margin: 6px 3px 0 3px; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; border: 1px solid transparent; background: #ccc; background: rgba(255, 255, 255, 0.25) center no-repeat; border-radius: 5px; box-shadow: 0 0 2px #000; opacity: 0.5; cursor: pointer; } .blueimp-gallery > .indicator > li:hover, .blueimp-gallery > .indicator > .active { background-color: #fff; border-color: #fff; opacity: 1; } .blueimp-gallery-controls > .indicator { display: block; /* Fix z-index issues (controls behind slide element) on Android: */ -webkit-transform: translateZ(0); -moz-transform: translateZ(0); -ms-transform: translateZ(0); -o-transform: translateZ(0); transform: translateZ(0); } .blueimp-gallery-single > .indicator { display: none; } .blueimp-gallery > .indicator { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } /* IE7 fixes */ *+html .blueimp-gallery > .indicator > li { display: inline; } ================================================ FILE: src/main/resources/static/css/plugins/blueimp/css/blueimp-gallery-video.css ================================================ @charset "UTF-8"; /* * blueimp Gallery Video Factory CSS 1.3.0 * https://github.com/blueimp/Gallery * * Copyright 2013, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ .blueimp-gallery > .slides > .slide > .video-content > img { position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; width: auto; height: auto; max-width: 100%; max-height: 100%; /* Prevent artifacts in Mozilla Firefox: */ -moz-backface-visibility: hidden; } .blueimp-gallery > .slides > .slide > .video-content > video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .blueimp-gallery > .slides > .slide > .video-content > iframe { position: absolute; top: 100%; left: 0; width: 100%; height: 100%; border: none; } .blueimp-gallery > .slides > .slide > .video-playing > iframe { top: 0; } .blueimp-gallery > .slides > .slide > .video-content > a { position: absolute; top: 50%; right: 0; left: 0; margin: -64px auto 0; width: 128px; height: 128px; background: url(../img/video-play.png) center no-repeat; opacity: 0.8; cursor: pointer; } .blueimp-gallery > .slides > .slide > .video-content > a:hover { opacity: 1; } .blueimp-gallery > .slides > .slide > .video-playing > a, .blueimp-gallery > .slides > .slide > .video-playing > img { display: none; } .blueimp-gallery > .slides > .slide > .video-content > video { display: none; } .blueimp-gallery > .slides > .slide > .video-playing > video { display: block; } .blueimp-gallery > .slides > .slide > .video-loading > a { background: url(../img/loading.gif) center no-repeat; background-size: 64px 64px; } /* Replace PNGs with SVGs for capable browsers (excluding IE<9) */ body:last-child .blueimp-gallery > .slides > .slide > .video-content:not(.video-loading) > a { background-image: url(../img/video-play.svg); } /* IE7 fixes */ *+html .blueimp-gallery > .slides > .slide > .video-content { height: 100%; } *+html .blueimp-gallery > .slides > .slide > .video-content > a { left: 50%; margin-left: -64px; } ================================================ FILE: src/main/resources/static/css/plugins/blueimp/css/blueimp-gallery.css ================================================ @charset "UTF-8"; /* * blueimp Gallery CSS 2.11.1 * https://github.com/blueimp/Gallery * * Copyright 2013, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ .blueimp-gallery, .blueimp-gallery > .slides > .slide > .slide-content { position: absolute; top: 0; right: 0; bottom: 0; left: 0; /* Prevent artifacts in Mozilla Firefox: */ -moz-backface-visibility: hidden; } .blueimp-gallery > .slides > .slide > .slide-content { margin: auto; width: auto; height: auto; max-width: 100%; max-height: 100%; opacity: 1; } .blueimp-gallery { position: fixed; z-index: 999999; overflow: hidden; background: #000; background: rgba(0, 0, 0, 0.9); opacity: 0; display: none; direction: ltr; -ms-touch-action: none; touch-action: none; } .blueimp-gallery-carousel { position: relative; z-index: auto; margin: 1em auto; /* Set the carousel width/height ratio to 16/9: */ padding-bottom: 56.25%; box-shadow: 0 0 10px #000; -ms-touch-action: pan-y; touch-action: pan-y; } .blueimp-gallery-display { display: block; opacity: 1; } .blueimp-gallery > .slides { position: relative; height: 100%; overflow: hidden; } .blueimp-gallery-carousel > .slides { position: absolute; } .blueimp-gallery > .slides > .slide { position: relative; float: left; height: 100%; text-align: center; -webkit-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); -moz-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); -ms-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); -o-transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); transition-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1.000); } .blueimp-gallery, .blueimp-gallery > .slides > .slide > .slide-content { -webkit-transition: opacity 0.5s linear; -moz-transition: opacity 0.5s linear; -ms-transition: opacity 0.5s linear; -o-transition: opacity 0.5s linear; transition: opacity 0.5s linear; } .blueimp-gallery > .slides > .slide-loading { background: url(../img/loading.gif) center no-repeat; background-size: 64px 64px; } .blueimp-gallery > .slides > .slide-loading > .slide-content { opacity: 0; } .blueimp-gallery > .slides > .slide-error { background: url(../img/error.png) center no-repeat; } .blueimp-gallery > .slides > .slide-error > .slide-content { display: none; } .blueimp-gallery > .prev, .blueimp-gallery > .next { position: absolute; top: 50%; left: 15px; width: 40px; height: 40px; margin-top: -23px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 60px; font-weight: 100; line-height: 30px; color: #fff; text-decoration: none; text-shadow: 0 0 2px #000; text-align: center; background: #222; background: rgba(0, 0, 0, 0.5); -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; border: 3px solid #fff; -webkit-border-radius: 23px; -moz-border-radius: 23px; border-radius: 23px; opacity: 0.5; cursor: pointer; display: none; } .blueimp-gallery > .next { left: auto; right: 15px; } .blueimp-gallery > .close, .blueimp-gallery > .title { position: absolute; top: 15px; left: 15px; margin: 0 40px 0 0; font-size: 20px; line-height: 30px; color: #fff; text-shadow: 0 0 2px #000; opacity: 0.8; display: none; } .blueimp-gallery > .close { padding: 15px; right: 15px; left: auto; margin: -15px; font-size: 30px; text-decoration: none; cursor: pointer; } .blueimp-gallery > .play-pause { position: absolute; right: 15px; bottom: 15px; width: 15px; height: 15px; background: url(../img/play-pause.png) 0 0 no-repeat; cursor: pointer; opacity: 0.5; display: none; } .blueimp-gallery-playing > .play-pause { background-position: -15px 0; } .blueimp-gallery > .prev:hover, .blueimp-gallery > .next:hover, .blueimp-gallery > .close:hover, .blueimp-gallery > .title:hover, .blueimp-gallery > .play-pause:hover { color: #fff; opacity: 1; } .blueimp-gallery-controls > .prev, .blueimp-gallery-controls > .next, .blueimp-gallery-controls > .close, .blueimp-gallery-controls > .title, .blueimp-gallery-controls > .play-pause { display: block; /* Fix z-index issues (controls behind slide element) on Android: */ -webkit-transform: translateZ(0); -moz-transform: translateZ(0); -ms-transform: translateZ(0); -o-transform: translateZ(0); transform: translateZ(0); } .blueimp-gallery-single > .prev, .blueimp-gallery-left > .prev, .blueimp-gallery-single > .next, .blueimp-gallery-right > .next, .blueimp-gallery-single > .play-pause { display: none; } .blueimp-gallery > .slides > .slide > .slide-content, .blueimp-gallery > .prev, .blueimp-gallery > .next, .blueimp-gallery > .close, .blueimp-gallery > .play-pause { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } /* Replace PNGs with SVGs for capable browsers (excluding IE<9) */ body:last-child .blueimp-gallery > .slides > .slide-error { background-image: url(../img/error.svg); } body:last-child .blueimp-gallery > .play-pause { width: 20px; height: 20px; background-size: 40px 20px; background-image: url(../img/play-pause.svg); } body:last-child .blueimp-gallery-playing > .play-pause { background-position: -20px 0; } /* IE7 fixes */ *+html .blueimp-gallery > .slides > .slide { min-height: 300px; } *+html .blueimp-gallery > .slides > .slide > .slide-content { position: relative; } ================================================ FILE: src/main/resources/static/css/plugins/blueimp/css/demo.css ================================================ /* * blueimp Gallery Demo CSS 2.0.0 * https://github.com/blueimp/Gallery * * Copyright 2013, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ body { max-width: 750px; margin: 0 auto; padding: 1em; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, sans-serif; font-size: 1em; line-height: 1.4em; background: #222; color: #fff; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } a { color: orange; text-decoration: none; } img { border: 0; vertical-align: middle; } h1 { line-height: 1em; } h2, .links { text-align: center; } @media (min-width: 481px) { .navigation { list-style: none; padding: 0; } .navigation li { display: inline-block; } .navigation li:not(:first-child):before { content: '| '; } } ================================================ FILE: src/main/resources/static/css/plugins/chosen/chosen.css ================================================ /*! Chosen, a Select Box Enhancer for jQuery and Prototype by Patrick Filler for Harvest, http://getharvest.com Version 1.1.0 Full source at https://github.com/harvesthq/chosen Copyright (c) 2011 Harvest http://getharvest.com MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md This file is generated by `grunt build`, do not edit it by hand. */ /* @group Base */ .chosen-container { position: relative; display: inline-block; vertical-align: middle; font-size: 13px; zoom: 1; *display: inline; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .chosen-container .chosen-drop { position: absolute; top: 100%; left: -9999px; z-index: 1010; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; width: 100%; border: 1px solid #aaa; border-top: 0; background: #fff; box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); } .chosen-container.chosen-with-drop .chosen-drop { left: 0; } .chosen-container a { cursor: pointer; } /* @end */ /* @group Single Chosen */ .chosen-container-single .chosen-single { position: relative; display: block; overflow: hidden; padding: 0 0 0 8px; height: 23px; border: 1px solid #aaa; border-radius: 5px; background-color: #fff; background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); background-clip: padding-box; box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1); color: #444; text-decoration: none; white-space: nowrap; line-height: 24px; } .chosen-container-single .chosen-default { color: #999; } .chosen-container-single .chosen-single span { display: block; overflow: hidden; margin-right: 26px; text-overflow: ellipsis; white-space: nowrap; } .chosen-container-single .chosen-single-with-deselect span { margin-right: 38px; } .chosen-container-single .chosen-single abbr { position: absolute; top: 6px; right: 26px; display: block; width: 12px; height: 12px; background: url('chosen-sprite.png') -42px 1px no-repeat; font-size: 1px; } .chosen-container-single .chosen-single abbr:hover { background-position: -42px -10px; } .chosen-container-single.chosen-disabled .chosen-single abbr:hover { background-position: -42px -10px; } .chosen-container-single .chosen-single div { position: absolute; top: 0; right: 0; display: block; width: 18px; height: 100%; } .chosen-container-single .chosen-single div b { display: block; width: 100%; height: 100%; background: url('chosen-sprite.png') no-repeat 0px 7px; } .chosen-container-single .chosen-search { position: relative; z-index: 1010; margin: 0; padding: 3px 4px; white-space: nowrap; } .chosen-container-single .chosen-search input[type="text"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; margin: 1px 0; padding: 4px 20px 4px 5px; width: 100%; height: auto; outline: 0; border: 1px solid #aaa; background: white url('chosen-sprite.png') no-repeat 100% -20px; background: url('chosen-sprite.png') no-repeat 100% -20px; font-size: 1em; font-family: sans-serif; line-height: normal; border-radius: 0; } .chosen-container-single .chosen-drop { margin-top: -1px; border-radius: 0 0 4px 4px; background-clip: padding-box; } .chosen-container-single.chosen-container-single-nosearch .chosen-search { position: absolute; left: -9999px; } /* @end */ /* @group Results */ .chosen-container .chosen-results { position: relative; overflow-x: hidden; overflow-y: auto; margin: 0 4px 4px 0; padding: 0 0 0 4px; max-height: 240px; -webkit-overflow-scrolling: touch; } .chosen-container .chosen-results li { display: none; margin: 0; padding: 5px 6px; list-style: none; line-height: 15px; -webkit-touch-callout: none; } .chosen-container .chosen-results li.active-result { display: list-item; cursor: pointer; } .chosen-container .chosen-results li.disabled-result { display: list-item; color: #ccc; cursor: default; } .chosen-container .chosen-results li.highlighted { background-color: #3875d7; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); color: #fff; } .chosen-container .chosen-results li.no-results { display: list-item; background: #f4f4f4; } .chosen-container .chosen-results li.group-result { display: list-item; font-weight: bold; cursor: default; } .chosen-container .chosen-results li.group-option { padding-left: 15px; } .chosen-container .chosen-results li em { font-style: normal; text-decoration: underline; } /* @end */ /* @group Multi Chosen */ .chosen-container-multi .chosen-choices { -moz-box-sizing: border-box; background-color: #FFFFFF; border: 1px solid #CBD5DD; border-radius: 2px; cursor: text; height: auto !important; margin: 0; min-height: 30px; overflow: hidden; padding: 2px; position: relative; width: 100%; } .chosen-container-multi .chosen-choices li { float: left; list-style: none; } .chosen-container-multi .chosen-choices li.search-field { margin: 0; padding: 0; white-space: nowrap; } .chosen-container-multi .chosen-choices li.search-field input[type="text"] { margin: 1px 0; padding: 5px; height: 25px; outline: 0; border: 0 !important; background: transparent !important; box-shadow: none; color: #666; font-size: 100%; font-family: sans-serif; line-height: normal; border-radius: 0; } .chosen-container-multi .chosen-choices li.search-field .default { color: #999; } .chosen-container-multi .chosen-choices li.search-choice { position: relative; margin: 3px 0 3px 5px; padding: 3px 20px 3px 5px; border: 1px solid #aaa; border-radius: 3px; background-color: #e4e4e4; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-clip: padding-box; box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); color: #333; line-height: 13px; cursor: default; } .chosen-container-multi .chosen-choices li.search-choice .search-choice-close { position: absolute; top: 4px; right: 3px; display: block; width: 12px; height: 12px; background: url('chosen-sprite.png') -42px 1px no-repeat; font-size: 1px; } .chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { background-position: -42px -10px; } .chosen-container-multi .chosen-choices li.search-choice-disabled { padding-right: 5px; border: 1px solid #ccc; background-color: #e4e4e4; background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); color: #666; } .chosen-container-multi .chosen-choices li.search-choice-focus { background: #d4d4d4; } .chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { background-position: -42px -10px; } .chosen-container-multi .chosen-results { margin: 0; padding: 0; } .chosen-container-multi .chosen-drop .result-selected { display: list-item; color: #ccc; cursor: default; } /* @end */ /* @group Active */ .chosen-container-active .chosen-single { border: 1px solid #5897fb; box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); } .chosen-container-active.chosen-with-drop .chosen-single { border: 1px solid #aaa; -moz-border-radius-bottomright: 0; border-bottom-right-radius: 0; -moz-border-radius-bottomleft: 0; border-bottom-left-radius: 0; } .chosen-container-active.chosen-with-drop .chosen-single div { border-left: none; background: transparent; } .chosen-container-active.chosen-with-drop .chosen-single div b { background-position: -18px 7px; } .chosen-container-active .chosen-choices { border: 1px solid #5897fb; box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); } .chosen-container-active .chosen-choices li.search-field input[type="text"] { color: #111 !important; } /* @end */ /* @group Disabled Support */ .chosen-disabled { opacity: 0.5 !important; cursor: default; } .chosen-disabled .chosen-single { cursor: default; } .chosen-disabled .chosen-choices .search-choice .search-choice-close { cursor: default; } /* @end */ /* @group Right to Left */ .chosen-rtl { text-align: right; } .chosen-rtl .chosen-single { overflow: visible; padding: 0 8px 0 0; } .chosen-rtl .chosen-single span { margin-right: 0; margin-left: 26px; direction: rtl; } .chosen-rtl .chosen-single-with-deselect span { margin-left: 38px; } .chosen-rtl .chosen-single div { right: auto; left: 3px; } .chosen-rtl .chosen-single abbr { right: auto; left: 26px; } .chosen-rtl .chosen-choices li { float: right; } .chosen-rtl .chosen-choices li.search-field input[type="text"] { direction: rtl; } .chosen-rtl .chosen-choices li.search-choice { margin: 3px 5px 3px 0; padding: 3px 5px 3px 19px; } .chosen-rtl .chosen-choices li.search-choice .search-choice-close { right: auto; left: 4px; } .chosen-rtl.chosen-container-single-nosearch .chosen-search, .chosen-rtl .chosen-drop { left: 9999px; } .chosen-rtl.chosen-container-single .chosen-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; } .chosen-rtl .chosen-results li.group-option { padding-right: 15px; padding-left: 0; } .chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { border-right: none; } .chosen-rtl .chosen-search input[type="text"] { padding: 4px 5px 4px 20px; background: white url('chosen-sprite.png') no-repeat -30px -20px; background: url('chosen-sprite.png') no-repeat -30px -20px; direction: rtl; } .chosen-rtl.chosen-container-single .chosen-single div b { background-position: 6px 2px; } .chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { background-position: -12px 2px; } /* @end */ /* @group Retina compatibility */ @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) { .chosen-rtl .chosen-search input[type="text"], .chosen-container-single .chosen-single abbr, .chosen-container-single .chosen-single div b, .chosen-container-single .chosen-search input[type="text"], .chosen-container-multi .chosen-choices .search-choice .search-choice-close, .chosen-container .chosen-results-scroll-down span, .chosen-container .chosen-results-scroll-up span { background-image: url('chosen-sprite@2x.png') !important; background-size: 52px 37px !important; background-repeat: no-repeat !important; } } /* @end */ ================================================ FILE: src/main/resources/static/css/plugins/clockpicker/clockpicker.css ================================================ /*! * ClockPicker v{package.version} for Bootstrap (http://weareoutman.github.io/clockpicker/) * Copyright 2014 Wang Shenwei. * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE) */ .clockpicker .input-group-addon { cursor: pointer; } .clockpicker-moving { cursor: move; } .clockpicker-align-left.popover > .arrow { left: 25px; } .clockpicker-align-top.popover > .arrow { top: 17px; } .clockpicker-align-right.popover > .arrow { left: auto; right: 25px; } .clockpicker-align-bottom.popover > .arrow { top: auto; bottom: 6px; } .clockpicker-popover .popover-title { background-color: #fff; color: #999; font-size: 24px; font-weight: bold; line-height: 30px; text-align: center; } .clockpicker-popover .popover-title span { cursor: pointer; } .clockpicker-popover .popover-content { background-color: #f8f8f8; padding: 12px; } .popover-content:last-child { border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } .clockpicker-plate { background-color: #fff; border: 1px solid #ccc; border-radius: 50%; width: 200px; height: 200px; overflow: visible; position: relative; /* Disable text selection highlighting. Thanks to Hermanya */ -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .clockpicker-canvas, .clockpicker-dial { width: 200px; height: 200px; position: absolute; left: -1px; top: -1px; } .clockpicker-minutes { visibility: hidden; } .clockpicker-tick { border-radius: 50%; color: #666; line-height: 26px; text-align: center; width: 26px; height: 26px; position: absolute; cursor: pointer; } .clockpicker-tick.active, .clockpicker-tick:hover { background-color: rgb(192, 229, 247); background-color: rgba(0, 149, 221, .25); } .clockpicker-button { background-image: none; background-color: #fff; border-width: 1px 0 0; border-top-left-radius: 0; border-top-right-radius: 0; margin: 0; padding: 10px 0; } .clockpicker-button:hover { background-image: none; background-color: #ebebeb; } .clockpicker-button:focus { outline: none!important; } .clockpicker-dial { -webkit-transition: -webkit-transform 350ms, opacity 350ms; -moz-transition: -moz-transform 350ms, opacity 350ms; -ms-transition: -ms-transform 350ms, opacity 350ms; -o-transition: -o-transform 350ms, opacity 350ms; transition: transform 350ms, opacity 350ms; } .clockpicker-dial-out { opacity: 0; } .clockpicker-hours.clockpicker-dial-out { -webkit-transform: scale(1.2, 1.2); -moz-transform: scale(1.2, 1.2); -ms-transform: scale(1.2, 1.2); -o-transform: scale(1.2, 1.2); transform: scale(1.2, 1.2); } .clockpicker-minutes.clockpicker-dial-out { -webkit-transform: scale(.8, .8); -moz-transform: scale(.8, .8); -ms-transform: scale(.8, .8); -o-transform: scale(.8, .8); transform: scale(.8, .8); } .clockpicker-canvas { -webkit-transition: opacity 175ms; -moz-transition: opacity 175ms; -ms-transition: opacity 175ms; -o-transition: opacity 175ms; transition: opacity 175ms; } .clockpicker-canvas-out { opacity: 0.25; } .clockpicker-canvas-bearing, .clockpicker-canvas-fg { stroke: none; fill: rgb(0, 149, 221); } .clockpicker-canvas-bg { stroke: none; fill: rgb(192, 229, 247); } .clockpicker-canvas-bg-trans { fill: rgba(0, 149, 221, .25); } .clockpicker-canvas line { stroke: rgb(0, 149, 221); stroke-width: 1; stroke-linecap: round; /*shape-rendering: crispEdges;*/ } .clockpicker-button.am-button { margin: 1px; padding: 5px; border: 1px solid rgba(0, 0, 0, .2); border-radius: 4px; } .clockpicker-button.pm-button { margin: 1px 1px 1px 136px; padding: 5px; border: 1px solid rgba(0, 0, 0, .2); border-radius: 4px; } ================================================ FILE: src/main/resources/static/css/plugins/codemirror/ambiance.css ================================================ /* ambiance theme for codemirror */ /* Color scheme */ .cm-s-ambiance .cm-keyword { color: #cda869; } .cm-s-ambiance .cm-atom { color: #CF7EA9; } .cm-s-ambiance .cm-number { color: #78CF8A; } .cm-s-ambiance .cm-def { color: #aac6e3; } .cm-s-ambiance .cm-variable { color: #ffb795; } .cm-s-ambiance .cm-variable-2 { color: #eed1b3; } .cm-s-ambiance .cm-variable-3 { color: #faded3; } .cm-s-ambiance .cm-property { color: #eed1b3; } .cm-s-ambiance .cm-operator {color: #fa8d6a;} .cm-s-ambiance .cm-comment { color: #555; font-style:italic; } .cm-s-ambiance .cm-string { color: #8f9d6a; } .cm-s-ambiance .cm-string-2 { color: #9d937c; } .cm-s-ambiance .cm-meta { color: #D2A8A1; } .cm-s-ambiance .cm-qualifier { color: yellow; } .cm-s-ambiance .cm-builtin { color: #9999cc; } .cm-s-ambiance .cm-bracket { color: #24C2C7; } .cm-s-ambiance .cm-tag { color: #fee4ff } .cm-s-ambiance .cm-attribute { color: #9B859D; } .cm-s-ambiance .cm-header {color: blue;} .cm-s-ambiance .cm-quote { color: #24C2C7; } .cm-s-ambiance .cm-hr { color: pink; } .cm-s-ambiance .cm-link { color: #F4C20B; } .cm-s-ambiance .cm-special { color: #FF9D00; } .cm-s-ambiance .cm-error { color: #AF2018; } .cm-s-ambiance .CodeMirror-matchingbracket { color: #0f0; } .cm-s-ambiance .CodeMirror-nonmatchingbracket { color: #f22; } .cm-s-ambiance .CodeMirror-selected { background: rgba(255, 255, 255, 0.15); } .cm-s-ambiance.CodeMirror-focused .CodeMirror-selected { background: rgba(255, 255, 255, 0.10); } /* Editor styling */ .cm-s-ambiance.CodeMirror { line-height: 1.40em; color: #E6E1DC; background-color: #202020; -webkit-box-shadow: inset 0 0 10px black; -moz-box-shadow: inset 0 0 10px black; box-shadow: inset 0 0 10px black; } .cm-s-ambiance .CodeMirror-gutters { background: #3D3D3D; border-right: 1px solid #4D4D4D; box-shadow: 0 10px 20px black; } .cm-s-ambiance .CodeMirror-linenumber { text-shadow: 0px 1px 1px #4d4d4d; color: #111; padding: 0 5px; } .cm-s-ambiance .CodeMirror-guttermarker { color: #aaa; } .cm-s-ambiance .CodeMirror-guttermarker-subtle { color: #111; } .cm-s-ambiance .CodeMirror-lines .CodeMirror-cursor { border-left: 1px solid #7991E8; } .cm-s-ambiance .CodeMirror-activeline-background { background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.031); } .cm-s-ambiance.CodeMirror, .cm-s-ambiance .CodeMirror-gutters { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC"); } ================================================ FILE: src/main/resources/static/css/plugins/codemirror/codemirror.css ================================================ /* BASICS */ .CodeMirror { /* Set height, width, borders, and global font properties here */ font-family: monospace; height: 300px; } .CodeMirror-scroll { /* Set scrolling behaviour here */ overflow: auto; } /* PADDING */ .CodeMirror-lines { padding: 4px 0; /* Vertical padding around content */ } .CodeMirror pre { padding: 0 4px; /* Horizontal padding of content */ } .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { background-color: white; /* The little square between H and V scrollbars */ } /* GUTTER */ .CodeMirror-gutters { border-right: 1px solid #ddd; background-color: #f7f7f7; white-space: nowrap; } .CodeMirror-linenumbers {} .CodeMirror-linenumber { padding: 0 3px 0 5px; min-width: 20px; text-align: right; color: #999; -moz-box-sizing: content-box; box-sizing: content-box; } .CodeMirror-guttermarker { color: black; } .CodeMirror-guttermarker-subtle { color: #999; } /* CURSOR */ .CodeMirror div.CodeMirror-cursor { border-left: 1px solid black; } /* Shown when moving in bi-directional text */ .CodeMirror div.CodeMirror-secondarycursor { border-left: 1px solid silver; } .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor { width: auto; border: 0; background: #7e7; } .CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursors { z-index: 1; } .cm-animate-fat-cursor { width: auto; border: 0; -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite; } @-moz-keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } @-webkit-keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } @keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } /* Can style cursor different in overwrite (non-insert) mode */ div.CodeMirror-overwrite div.CodeMirror-cursor {} .cm-tab { display: inline-block; text-decoration: inherit; } .CodeMirror-ruler { border-left: 1px solid #ccc; position: absolute; } /* DEFAULT THEME */ .cm-s-default .cm-keyword {color: #708;} .cm-s-default .cm-atom {color: #219;} .cm-s-default .cm-number {color: #164;} .cm-s-default .cm-def {color: #00f;} .cm-s-default .cm-variable, .cm-s-default .cm-punctuation, .cm-s-default .cm-property, .cm-s-default .cm-operator {} .cm-s-default .cm-variable-2 {color: #05a;} .cm-s-default .cm-variable-3 {color: #085;} .cm-s-default .cm-comment {color: #a50;} .cm-s-default .cm-string {color: #a11;} .cm-s-default .cm-string-2 {color: #f50;} .cm-s-default .cm-meta {color: #555;} .cm-s-default .cm-qualifier {color: #555;} .cm-s-default .cm-builtin {color: #30a;} .cm-s-default .cm-bracket {color: #997;} .cm-s-default .cm-tag {color: #170;} .cm-s-default .cm-attribute {color: #00c;} .cm-s-default .cm-header {color: blue;} .cm-s-default .cm-quote {color: #090;} .cm-s-default .cm-hr {color: #999;} .cm-s-default .cm-link {color: #00c;} .cm-negative {color: #d44;} .cm-positive {color: #292;} .cm-header, .cm-strong {font-weight: bold;} .cm-em {font-style: italic;} .cm-link {text-decoration: underline;} .cm-s-default .cm-error {color: #f00;} .cm-invalidchar {color: #f00;} /* Default styles for common addons */ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } .CodeMirror-activeline-background {background: #e8f2ff;} /* STOP */ /* The rest of this file contains styles related to the mechanics of the editor. You probably shouldn't touch them. */ .CodeMirror { line-height: 1; position: relative; overflow: hidden; background: white; color: black; } .CodeMirror-scroll { /* 30px is the magic margin used to hide the element's real scrollbars */ /* See overflow: hidden in .CodeMirror */ margin-bottom: -30px; margin-right: -30px; padding-bottom: 30px; height: 100%; outline: none; /* Prevent dragging from highlighting the element */ position: relative; -moz-box-sizing: content-box; box-sizing: content-box; } .CodeMirror-sizer { position: relative; border-right: 30px solid transparent; -moz-box-sizing: content-box; box-sizing: content-box; } /* The fake, visible scrollbars. Used to force redraw during scrolling before actuall scrolling happens, thus preventing shaking and flickering artifacts. */ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { position: absolute; z-index: 6; display: none; } .CodeMirror-vscrollbar { right: 0; top: 0; overflow-x: hidden; overflow-y: scroll; } .CodeMirror-hscrollbar { bottom: 0; left: 0; overflow-y: hidden; overflow-x: scroll; } .CodeMirror-scrollbar-filler { right: 0; bottom: 0; } .CodeMirror-gutter-filler { left: 0; bottom: 0; } .CodeMirror-gutters { position: absolute; left: 0; top: 0; padding-bottom: 30px; z-index: 3; } .CodeMirror-gutter { white-space: normal; height: 100%; -moz-box-sizing: content-box; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; /* Hack to make IE7 behave */ *zoom:1; *display:inline; } .CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } .CodeMirror-lines { cursor: text; min-height: 1px; /* prevents collapsing before first draw */ } .CodeMirror pre { /* Reset some styles that the rest of the page might have set */ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; background: transparent; font-family: inherit; font-size: inherit; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-linebackground { position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: 0; } .CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } .CodeMirror-widget {} .CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; } .CodeMirror-measure { position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden; } .CodeMirror-measure pre { position: static; } .CodeMirror div.CodeMirror-cursor { position: absolute; border-right: none; width: 0; } div.CodeMirror-cursors { visibility: hidden; position: relative; z-index: 3; } .CodeMirror-focused div.CodeMirror-cursors { visibility: visible; } .CodeMirror-selected { background: #d9d9d9; } .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } .CodeMirror-crosshair { cursor: crosshair; } .cm-searching { background: #ffa; background: rgba(255, 255, 0, .4); } /* IE7 hack to prevent it from returning funny offsetTops on the spans */ .CodeMirror span { *vertical-align: text-bottom; } /* Used to force a border model for a node */ .cm-force-border { padding-right: .1px; } @media print { /* Hide the cursor when printing */ .CodeMirror div.CodeMirror-cursors { visibility: hidden; } } /* Help users use markselection to safely style text background */ span.CodeMirror-selectedtext { background: none; } ================================================ FILE: src/main/resources/static/css/plugins/cropper/cropper.css ================================================ /*! * Cropper v0.9.2 * https://github.com/fengyuanchen/cropper * * Copyright (c) 2014-2015 Fengyuan Chen and contributors * Released under the MIT license * * Date: 2015-04-18T04:35:01.500Z */ .cropper-container { position: relative; overflow: hidden; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-tap-highlight-color: transparent; -webkit-touch-callout: none; } .cropper-container img { display: block; width: 100%; min-width: 0 !important; max-width: none !important; height: 100%; min-height: 0 !important; max-height: none !important; image-orientation: 0deg !important; } .cropper-canvas, .cropper-drag-box, .cropper-crop-box, .cropper-modal { position: absolute; top: 0; right: 0; bottom: 0; left: 0; } .cropper-drag-box { background-color: #fff; filter: alpha(opacity=0); opacity: 0; } .cropper-modal { background-color: #000; filter: alpha(opacity=50); opacity: .5; } .cropper-view-box { display: block; width: 100%; height: 100%; overflow: hidden; outline: 1px solid #69f; outline-color: rgba(102, 153, 255, .75); } .cropper-dashed { position: absolute; display: block; filter: alpha(opacity=50); border: 0 dashed #fff; opacity: .5; } .cropper-dashed.dashed-h { top: 33.33333333%; left: 0; width: 100%; height: 33.33333333%; border-top-width: 1px; border-bottom-width: 1px; } .cropper-dashed.dashed-v { top: 0; left: 33.33333333%; width: 33.33333333%; height: 100%; border-right-width: 1px; border-left-width: 1px; } .cropper-face, .cropper-line, .cropper-point { position: absolute; display: block; width: 100%; height: 100%; filter: alpha(opacity=10); opacity: .1; } .cropper-face { top: 0; left: 0; cursor: move; background-color: #fff; } .cropper-line { background-color: #69f; } .cropper-line.line-e { top: 0; right: -3px; width: 5px; cursor: e-resize; } .cropper-line.line-n { top: -3px; left: 0; height: 5px; cursor: n-resize; } .cropper-line.line-w { top: 0; left: -3px; width: 5px; cursor: w-resize; } .cropper-line.line-s { bottom: -3px; left: 0; height: 5px; cursor: s-resize; } .cropper-point { width: 5px; height: 5px; background-color: #69f; filter: alpha(opacity=75); opacity: .75; } .cropper-point.point-e { top: 50%; right: -3px; margin-top: -3px; cursor: e-resize; } .cropper-point.point-n { top: -3px; left: 50%; margin-left: -3px; cursor: n-resize; } .cropper-point.point-w { top: 50%; left: -3px; margin-top: -3px; cursor: w-resize; } .cropper-point.point-s { bottom: -3px; left: 50%; margin-left: -3px; cursor: s-resize; } .cropper-point.point-ne { top: -3px; right: -3px; cursor: ne-resize; } .cropper-point.point-nw { top: -3px; left: -3px; cursor: nw-resize; } .cropper-point.point-sw { bottom: -3px; left: -3px; cursor: sw-resize; } .cropper-point.point-se { right: -3px; bottom: -3px; width: 20px; height: 20px; cursor: se-resize; filter: alpha(opacity=100); opacity: 1; } .cropper-point.point-se:before { position: absolute; right: -50%; bottom: -50%; display: block; width: 200%; height: 200%; content: " "; background-color: #69f; filter: alpha(opacity=0); opacity: 0; } @media (min-width: 768px) { .cropper-point.point-se { width: 15px; height: 15px; } } @media (min-width: 992px) { .cropper-point.point-se { width: 10px; height: 10px; } } @media (min-width: 1200px) { .cropper-point.point-se { width: 5px; height: 5px; filter: alpha(opacity=75); opacity: .75; } } .cropper-bg { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC"); } .cropper-invisible { filter: alpha(opacity=0); opacity: 0; } .cropper-hide { position: fixed; top: 0; left: 0; z-index: -1; width: auto!important; min-width: 0!important; max-width: none!important; height: auto!important; min-height: 0!important; max-height: none!important; filter: alpha(opacity=0); opacity: 0; } .cropper-hidden { display: none !important; } .cropper-move { cursor: move; } .cropper-crop { cursor: crosshair; } .cropper-disabled .cropper-drag-box, .cropper-disabled .cropper-face, .cropper-disabled .cropper-line, .cropper-disabled .cropper-point { cursor: not-allowed; } ================================================ FILE: src/main/resources/static/css/plugins/dataTables/dataTables.bootstrap.css ================================================ div.dataTables_length label { float: left; text-align: left; font-weight: normal; } div.dataTables_length select { width: 75px; } div.dataTables_filter label { float: right; font-weight: normal; } div.dataTables_filter input { width: 16em; } div.dataTables_info { padding-top: 8px; } div.dataTables_paginate { float: right; margin: 0; } div.dataTables_paginate ul.pagination { margin: 2px 0; white-space: nowrap; } table.dataTable, table.dataTable td, table.dataTable th { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } table.dataTable { clear: both; margin-top: 6px !important; margin-bottom: 6px !important; max-width: none !important; } table.dataTable thead .sorting, table.dataTable thead .sorting_asc, table.dataTable thead .sorting_desc, table.dataTable thead .sorting_asc_disabled, table.dataTable thead .sorting_desc_disabled { cursor: pointer; } table.dataTable thead .sorting { } table.dataTable thead .sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; } table.dataTable thead .sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; } table.dataTable thead .sorting_asc_disabled { } table.dataTable thead .sorting_desc_disabled { } table.dataTable th:active { outline: none; } /* Scrolling */ div.dataTables_scrollHead table { margin-bottom: 0 !important; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } div.dataTables_scrollHead table thead tr:last-child th:first-child, div.dataTables_scrollHead table thead tr:last-child td:first-child { border-bottom-left-radius: 0 !important; border-bottom-right-radius: 0 !important; } div.dataTables_scrollBody table { margin-top: 0 !important; margin-bottom: 0 !important; border-top: none; } div.dataTables_scrollBody tbody tr:first-child th, div.dataTables_scrollBody tbody tr:first-child td { border-top: none; } div.dataTables_scrollFoot table { margin-top: 0 !important; border-top: none; } /* * TableTools styles */ .table tbody tr.active td, .table tbody tr.active th { color: white; background-color: #08C; } .table tbody tr.active:hover td, .table tbody tr.active:hover th { background-color: #0075b0 !important; } .table tbody tr.active a { color: white; } .table-striped tbody tr.active:nth-child(odd) td, .table-striped tbody tr.active:nth-child(odd) th { background-color: #017ebc; } table.DTTT_selectable tbody tr { cursor: pointer; } div.DTTT .btn { font-size: 12px; color: #333 !important; } div.DTTT .btn:hover { text-decoration: none !important; } ul.DTTT_dropdown.dropdown-menu { z-index: 2003; } ul.DTTT_dropdown.dropdown-menu a { color: #333 !important; /* needed only when demo_page.css is included */ } ul.DTTT_dropdown.dropdown-menu li { position: relative; } ul.DTTT_dropdown.dropdown-menu li:hover a { color: white !important; background-color: #0088cc; } div.DTTT_collection_background { z-index: 2002; } /* TableTools information display */ div.DTTT_print_info.modal { height: 150px; margin-top: -75px; text-align: center; } div.DTTT_print_info h6 { margin: 1em; font-size: 28px; font-weight: normal; line-height: 28px; } div.DTTT_print_info p { font-size: 14px; line-height: 20px; } /* * FixedColumns styles */ div.DTFC_LeftHeadWrapper table, div.DTFC_LeftFootWrapper table, div.DTFC_RightHeadWrapper table, div.DTFC_RightFootWrapper table, table.DTFC_Cloned tr.even { background-color: white; } div.DTFC_RightHeadWrapper table, div.DTFC_LeftHeadWrapper table { margin-bottom: 0 !important; border-top-right-radius: 0 !important; border-bottom-left-radius: 0 !important; border-bottom-right-radius: 0 !important; } div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child, div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child, div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child, div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child { border-bottom-left-radius: 0 !important; border-bottom-right-radius: 0 !important; } div.DTFC_RightBodyWrapper table, div.DTFC_LeftBodyWrapper table { margin-bottom: 0 !important; border-top: none; } div.DTFC_RightBodyWrapper tbody tr:first-child th, div.DTFC_RightBodyWrapper tbody tr:first-child td, div.DTFC_LeftBodyWrapper tbody tr:first-child th, div.DTFC_LeftBodyWrapper tbody tr:first-child td { border-top: none; } div.DTFC_RightFootWrapper table, div.DTFC_LeftFootWrapper table { border-top: none; } ================================================ FILE: src/main/resources/static/css/plugins/datapicker/datepicker3.css ================================================ /*! * Datepicker for Bootstrap * * Copyright 2012 Stefan Petre * Improvements by Andrew Rowls * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * */ .datepicker { padding: 4px; border-radius: 4px; direction: ltr; /*.dow { border-top: 1px solid #ddd !important; }*/ } .datepicker-inline { width: 220px; } .datepicker.datepicker-rtl { direction: rtl; } .datepicker.datepicker-rtl table tr td span { float: right; } .datepicker-dropdown { top: 0; left: 0; } .datepicker-dropdown:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-top: 0; border-bottom-color: rgba(0, 0, 0, 0.2); position: absolute; } .datepicker-dropdown:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #fff; border-top: 0; position: absolute; } .datepicker-dropdown.datepicker-orient-left:before { left: 6px; } .datepicker-dropdown.datepicker-orient-left:after { left: 7px; } .datepicker-dropdown.datepicker-orient-right:before { right: 6px; } .datepicker-dropdown.datepicker-orient-right:after { right: 7px; } .datepicker-dropdown.datepicker-orient-top:before { top: -7px; } .datepicker-dropdown.datepicker-orient-top:after { top: -6px; } .datepicker-dropdown.datepicker-orient-bottom:before { bottom: -7px; border-bottom: 0; border-top: 7px solid #999; } .datepicker-dropdown.datepicker-orient-bottom:after { bottom: -6px; border-bottom: 0; border-top: 6px solid #fff; } .datepicker > div { display: none; } .datepicker.days div.datepicker-days { display: block; } .datepicker.months div.datepicker-months { display: block; } .datepicker.years div.datepicker-years { display: block; } .datepicker table { margin: 0; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .datepicker table tr td, .datepicker table tr th { text-align: center; width: 30px; height: 30px; border-radius: 4px; border: none; } .table-striped .datepicker table tr td, .table-striped .datepicker table tr th { background-color: transparent; } .datepicker table tr td.day:hover, .datepicker table tr td.day.focused { background: #eeeeee; cursor: pointer; } .datepicker table tr td.old, .datepicker table tr td.new { color: #999999; } .datepicker table tr td.disabled, .datepicker table tr td.disabled:hover { background: none; color: #999999; cursor: default; } .datepicker table tr td.today, .datepicker table tr td.today:hover, .datepicker table tr td.today.disabled, .datepicker table tr td.today.disabled:hover { color: #000000; background-color: #ffdb99; border-color: #ffb733; } .datepicker table tr td.today:hover, .datepicker table tr td.today:hover:hover, .datepicker table tr td.today.disabled:hover, .datepicker table tr td.today.disabled:hover:hover, .datepicker table tr td.today:focus, .datepicker table tr td.today:hover:focus, .datepicker table tr td.today.disabled:focus, .datepicker table tr td.today.disabled:hover:focus, .datepicker table tr td.today:active, .datepicker table tr td.today:hover:active, .datepicker table tr td.today.disabled:active, .datepicker table tr td.today.disabled:hover:active, .datepicker table tr td.today.active, .datepicker table tr td.today:hover.active, .datepicker table tr td.today.disabled.active, .datepicker table tr td.today.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td.today, .open .dropdown-toggle.datepicker table tr td.today:hover, .open .dropdown-toggle.datepicker table tr td.today.disabled, .open .dropdown-toggle.datepicker table tr td.today.disabled:hover { color: #000000; background-color: #ffcd70; border-color: #f59e00; } .datepicker table tr td.today:active, .datepicker table tr td.today:hover:active, .datepicker table tr td.today.disabled:active, .datepicker table tr td.today.disabled:hover:active, .datepicker table tr td.today.active, .datepicker table tr td.today:hover.active, .datepicker table tr td.today.disabled.active, .datepicker table tr td.today.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td.today, .open .dropdown-toggle.datepicker table tr td.today:hover, .open .dropdown-toggle.datepicker table tr td.today.disabled, .open .dropdown-toggle.datepicker table tr td.today.disabled:hover { background-image: none; } .datepicker table tr td.today.disabled, .datepicker table tr td.today:hover.disabled, .datepicker table tr td.today.disabled.disabled, .datepicker table tr td.today.disabled:hover.disabled, .datepicker table tr td.today[disabled], .datepicker table tr td.today:hover[disabled], .datepicker table tr td.today.disabled[disabled], .datepicker table tr td.today.disabled:hover[disabled], fieldset[disabled] .datepicker table tr td.today, fieldset[disabled] .datepicker table tr td.today:hover, fieldset[disabled] .datepicker table tr td.today.disabled, fieldset[disabled] .datepicker table tr td.today.disabled:hover, .datepicker table tr td.today.disabled:hover, .datepicker table tr td.today:hover.disabled:hover, .datepicker table tr td.today.disabled.disabled:hover, .datepicker table tr td.today.disabled:hover.disabled:hover, .datepicker table tr td.today[disabled]:hover, .datepicker table tr td.today:hover[disabled]:hover, .datepicker table tr td.today.disabled[disabled]:hover, .datepicker table tr td.today.disabled:hover[disabled]:hover, fieldset[disabled] .datepicker table tr td.today:hover, fieldset[disabled] .datepicker table tr td.today:hover:hover, fieldset[disabled] .datepicker table tr td.today.disabled:hover, fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover, .datepicker table tr td.today.disabled:focus, .datepicker table tr td.today:hover.disabled:focus, .datepicker table tr td.today.disabled.disabled:focus, .datepicker table tr td.today.disabled:hover.disabled:focus, .datepicker table tr td.today[disabled]:focus, .datepicker table tr td.today:hover[disabled]:focus, .datepicker table tr td.today.disabled[disabled]:focus, .datepicker table tr td.today.disabled:hover[disabled]:focus, fieldset[disabled] .datepicker table tr td.today:focus, fieldset[disabled] .datepicker table tr td.today:hover:focus, fieldset[disabled] .datepicker table tr td.today.disabled:focus, fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus, .datepicker table tr td.today.disabled:active, .datepicker table tr td.today:hover.disabled:active, .datepicker table tr td.today.disabled.disabled:active, .datepicker table tr td.today.disabled:hover.disabled:active, .datepicker table tr td.today[disabled]:active, .datepicker table tr td.today:hover[disabled]:active, .datepicker table tr td.today.disabled[disabled]:active, .datepicker table tr td.today.disabled:hover[disabled]:active, fieldset[disabled] .datepicker table tr td.today:active, fieldset[disabled] .datepicker table tr td.today:hover:active, fieldset[disabled] .datepicker table tr td.today.disabled:active, fieldset[disabled] .datepicker table tr td.today.disabled:hover:active, .datepicker table tr td.today.disabled.active, .datepicker table tr td.today:hover.disabled.active, .datepicker table tr td.today.disabled.disabled.active, .datepicker table tr td.today.disabled:hover.disabled.active, .datepicker table tr td.today[disabled].active, .datepicker table tr td.today:hover[disabled].active, .datepicker table tr td.today.disabled[disabled].active, .datepicker table tr td.today.disabled:hover[disabled].active, fieldset[disabled] .datepicker table tr td.today.active, fieldset[disabled] .datepicker table tr td.today:hover.active, fieldset[disabled] .datepicker table tr td.today.disabled.active, fieldset[disabled] .datepicker table tr td.today.disabled:hover.active { background-color: #ffdb99; border-color: #ffb733; } .datepicker table tr td.today:hover:hover { color: #000; } .datepicker table tr td.today.active:hover { color: #fff; } .datepicker table tr td.range, .datepicker table tr td.range:hover, .datepicker table tr td.range.disabled, .datepicker table tr td.range.disabled:hover { background: #eeeeee; border-radius: 0; } .datepicker table tr td.range.today, .datepicker table tr td.range.today:hover, .datepicker table tr td.range.today.disabled, .datepicker table tr td.range.today.disabled:hover { color: #000000; background-color: #f7ca77; border-color: #f1a417; border-radius: 0; } .datepicker table tr td.range.today:hover, .datepicker table tr td.range.today:hover:hover, .datepicker table tr td.range.today.disabled:hover, .datepicker table tr td.range.today.disabled:hover:hover, .datepicker table tr td.range.today:focus, .datepicker table tr td.range.today:hover:focus, .datepicker table tr td.range.today.disabled:focus, .datepicker table tr td.range.today.disabled:hover:focus, .datepicker table tr td.range.today:active, .datepicker table tr td.range.today:hover:active, .datepicker table tr td.range.today.disabled:active, .datepicker table tr td.range.today.disabled:hover:active, .datepicker table tr td.range.today.active, .datepicker table tr td.range.today:hover.active, .datepicker table tr td.range.today.disabled.active, .datepicker table tr td.range.today.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td.range.today, .open .dropdown-toggle.datepicker table tr td.range.today:hover, .open .dropdown-toggle.datepicker table tr td.range.today.disabled, .open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover { color: #000000; background-color: #f4bb51; border-color: #bf800c; } .datepicker table tr td.range.today:active, .datepicker table tr td.range.today:hover:active, .datepicker table tr td.range.today.disabled:active, .datepicker table tr td.range.today.disabled:hover:active, .datepicker table tr td.range.today.active, .datepicker table tr td.range.today:hover.active, .datepicker table tr td.range.today.disabled.active, .datepicker table tr td.range.today.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td.range.today, .open .dropdown-toggle.datepicker table tr td.range.today:hover, .open .dropdown-toggle.datepicker table tr td.range.today.disabled, .open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover { background-image: none; } .datepicker table tr td.range.today.disabled, .datepicker table tr td.range.today:hover.disabled, .datepicker table tr td.range.today.disabled.disabled, .datepicker table tr td.range.today.disabled:hover.disabled, .datepicker table tr td.range.today[disabled], .datepicker table tr td.range.today:hover[disabled], .datepicker table tr td.range.today.disabled[disabled], .datepicker table tr td.range.today.disabled:hover[disabled], fieldset[disabled] .datepicker table tr td.range.today, fieldset[disabled] .datepicker table tr td.range.today:hover, fieldset[disabled] .datepicker table tr td.range.today.disabled, fieldset[disabled] .datepicker table tr td.range.today.disabled:hover, .datepicker table tr td.range.today.disabled:hover, .datepicker table tr td.range.today:hover.disabled:hover, .datepicker table tr td.range.today.disabled.disabled:hover, .datepicker table tr td.range.today.disabled:hover.disabled:hover, .datepicker table tr td.range.today[disabled]:hover, .datepicker table tr td.range.today:hover[disabled]:hover, .datepicker table tr td.range.today.disabled[disabled]:hover, .datepicker table tr td.range.today.disabled:hover[disabled]:hover, fieldset[disabled] .datepicker table tr td.range.today:hover, fieldset[disabled] .datepicker table tr td.range.today:hover:hover, fieldset[disabled] .datepicker table tr td.range.today.disabled:hover, fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover, .datepicker table tr td.range.today.disabled:focus, .datepicker table tr td.range.today:hover.disabled:focus, .datepicker table tr td.range.today.disabled.disabled:focus, .datepicker table tr td.range.today.disabled:hover.disabled:focus, .datepicker table tr td.range.today[disabled]:focus, .datepicker table tr td.range.today:hover[disabled]:focus, .datepicker table tr td.range.today.disabled[disabled]:focus, .datepicker table tr td.range.today.disabled:hover[disabled]:focus, fieldset[disabled] .datepicker table tr td.range.today:focus, fieldset[disabled] .datepicker table tr td.range.today:hover:focus, fieldset[disabled] .datepicker table tr td.range.today.disabled:focus, fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus, .datepicker table tr td.range.today.disabled:active, .datepicker table tr td.range.today:hover.disabled:active, .datepicker table tr td.range.today.disabled.disabled:active, .datepicker table tr td.range.today.disabled:hover.disabled:active, .datepicker table tr td.range.today[disabled]:active, .datepicker table tr td.range.today:hover[disabled]:active, .datepicker table tr td.range.today.disabled[disabled]:active, .datepicker table tr td.range.today.disabled:hover[disabled]:active, fieldset[disabled] .datepicker table tr td.range.today:active, fieldset[disabled] .datepicker table tr td.range.today:hover:active, fieldset[disabled] .datepicker table tr td.range.today.disabled:active, fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active, .datepicker table tr td.range.today.disabled.active, .datepicker table tr td.range.today:hover.disabled.active, .datepicker table tr td.range.today.disabled.disabled.active, .datepicker table tr td.range.today.disabled:hover.disabled.active, .datepicker table tr td.range.today[disabled].active, .datepicker table tr td.range.today:hover[disabled].active, .datepicker table tr td.range.today.disabled[disabled].active, .datepicker table tr td.range.today.disabled:hover[disabled].active, fieldset[disabled] .datepicker table tr td.range.today.active, fieldset[disabled] .datepicker table tr td.range.today:hover.active, fieldset[disabled] .datepicker table tr td.range.today.disabled.active, fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active { background-color: #f7ca77; border-color: #f1a417; } .datepicker table tr td.selected, .datepicker table tr td.selected:hover, .datepicker table tr td.selected.disabled, .datepicker table tr td.selected.disabled:hover { color: #ffffff; background-color: #999999; border-color: #555555; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker table tr td.selected:hover, .datepicker table tr td.selected:hover:hover, .datepicker table tr td.selected.disabled:hover, .datepicker table tr td.selected.disabled:hover:hover, .datepicker table tr td.selected:focus, .datepicker table tr td.selected:hover:focus, .datepicker table tr td.selected.disabled:focus, .datepicker table tr td.selected.disabled:hover:focus, .datepicker table tr td.selected:active, .datepicker table tr td.selected:hover:active, .datepicker table tr td.selected.disabled:active, .datepicker table tr td.selected.disabled:hover:active, .datepicker table tr td.selected.active, .datepicker table tr td.selected:hover.active, .datepicker table tr td.selected.disabled.active, .datepicker table tr td.selected.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td.selected, .open .dropdown-toggle.datepicker table tr td.selected:hover, .open .dropdown-toggle.datepicker table tr td.selected.disabled, .open .dropdown-toggle.datepicker table tr td.selected.disabled:hover { color: #ffffff; background-color: #858585; border-color: #373737; } .datepicker table tr td.selected:active, .datepicker table tr td.selected:hover:active, .datepicker table tr td.selected.disabled:active, .datepicker table tr td.selected.disabled:hover:active, .datepicker table tr td.selected.active, .datepicker table tr td.selected:hover.active, .datepicker table tr td.selected.disabled.active, .datepicker table tr td.selected.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td.selected, .open .dropdown-toggle.datepicker table tr td.selected:hover, .open .dropdown-toggle.datepicker table tr td.selected.disabled, .open .dropdown-toggle.datepicker table tr td.selected.disabled:hover { background-image: none; } .datepicker table tr td.selected.disabled, .datepicker table tr td.selected:hover.disabled, .datepicker table tr td.selected.disabled.disabled, .datepicker table tr td.selected.disabled:hover.disabled, .datepicker table tr td.selected[disabled], .datepicker table tr td.selected:hover[disabled], .datepicker table tr td.selected.disabled[disabled], .datepicker table tr td.selected.disabled:hover[disabled], fieldset[disabled] .datepicker table tr td.selected, fieldset[disabled] .datepicker table tr td.selected:hover, fieldset[disabled] .datepicker table tr td.selected.disabled, fieldset[disabled] .datepicker table tr td.selected.disabled:hover, .datepicker table tr td.selected.disabled:hover, .datepicker table tr td.selected:hover.disabled:hover, .datepicker table tr td.selected.disabled.disabled:hover, .datepicker table tr td.selected.disabled:hover.disabled:hover, .datepicker table tr td.selected[disabled]:hover, .datepicker table tr td.selected:hover[disabled]:hover, .datepicker table tr td.selected.disabled[disabled]:hover, .datepicker table tr td.selected.disabled:hover[disabled]:hover, fieldset[disabled] .datepicker table tr td.selected:hover, fieldset[disabled] .datepicker table tr td.selected:hover:hover, fieldset[disabled] .datepicker table tr td.selected.disabled:hover, fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover, .datepicker table tr td.selected.disabled:focus, .datepicker table tr td.selected:hover.disabled:focus, .datepicker table tr td.selected.disabled.disabled:focus, .datepicker table tr td.selected.disabled:hover.disabled:focus, .datepicker table tr td.selected[disabled]:focus, .datepicker table tr td.selected:hover[disabled]:focus, .datepicker table tr td.selected.disabled[disabled]:focus, .datepicker table tr td.selected.disabled:hover[disabled]:focus, fieldset[disabled] .datepicker table tr td.selected:focus, fieldset[disabled] .datepicker table tr td.selected:hover:focus, fieldset[disabled] .datepicker table tr td.selected.disabled:focus, fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus, .datepicker table tr td.selected.disabled:active, .datepicker table tr td.selected:hover.disabled:active, .datepicker table tr td.selected.disabled.disabled:active, .datepicker table tr td.selected.disabled:hover.disabled:active, .datepicker table tr td.selected[disabled]:active, .datepicker table tr td.selected:hover[disabled]:active, .datepicker table tr td.selected.disabled[disabled]:active, .datepicker table tr td.selected.disabled:hover[disabled]:active, fieldset[disabled] .datepicker table tr td.selected:active, fieldset[disabled] .datepicker table tr td.selected:hover:active, fieldset[disabled] .datepicker table tr td.selected.disabled:active, fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active, .datepicker table tr td.selected.disabled.active, .datepicker table tr td.selected:hover.disabled.active, .datepicker table tr td.selected.disabled.disabled.active, .datepicker table tr td.selected.disabled:hover.disabled.active, .datepicker table tr td.selected[disabled].active, .datepicker table tr td.selected:hover[disabled].active, .datepicker table tr td.selected.disabled[disabled].active, .datepicker table tr td.selected.disabled:hover[disabled].active, fieldset[disabled] .datepicker table tr td.selected.active, fieldset[disabled] .datepicker table tr td.selected:hover.active, fieldset[disabled] .datepicker table tr td.selected.disabled.active, fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active { background-color: #999999; border-color: #555555; } .datepicker table tr td.active, .datepicker table tr td.active:hover, .datepicker table tr td.active.disabled, .datepicker table tr td.active.disabled:hover { color: #ffffff; background-color: #428bca; border-color: #357ebd; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker table tr td.active:hover, .datepicker table tr td.active:hover:hover, .datepicker table tr td.active.disabled:hover, .datepicker table tr td.active.disabled:hover:hover, .datepicker table tr td.active:focus, .datepicker table tr td.active:hover:focus, .datepicker table tr td.active.disabled:focus, .datepicker table tr td.active.disabled:hover:focus, .datepicker table tr td.active:active, .datepicker table tr td.active:hover:active, .datepicker table tr td.active.disabled:active, .datepicker table tr td.active.disabled:hover:active, .datepicker table tr td.active.active, .datepicker table tr td.active:hover.active, .datepicker table tr td.active.disabled.active, .datepicker table tr td.active.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td.active, .open .dropdown-toggle.datepicker table tr td.active:hover, .open .dropdown-toggle.datepicker table tr td.active.disabled, .open .dropdown-toggle.datepicker table tr td.active.disabled:hover { color: #ffffff; background-color: #3276b1; border-color: #285e8e; } .datepicker table tr td.active:active, .datepicker table tr td.active:hover:active, .datepicker table tr td.active.disabled:active, .datepicker table tr td.active.disabled:hover:active, .datepicker table tr td.active.active, .datepicker table tr td.active:hover.active, .datepicker table tr td.active.disabled.active, .datepicker table tr td.active.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td.active, .open .dropdown-toggle.datepicker table tr td.active:hover, .open .dropdown-toggle.datepicker table tr td.active.disabled, .open .dropdown-toggle.datepicker table tr td.active.disabled:hover { background-image: none; } .datepicker table tr td.active.disabled, .datepicker table tr td.active:hover.disabled, .datepicker table tr td.active.disabled.disabled, .datepicker table tr td.active.disabled:hover.disabled, .datepicker table tr td.active[disabled], .datepicker table tr td.active:hover[disabled], .datepicker table tr td.active.disabled[disabled], .datepicker table tr td.active.disabled:hover[disabled], fieldset[disabled] .datepicker table tr td.active, fieldset[disabled] .datepicker table tr td.active:hover, fieldset[disabled] .datepicker table tr td.active.disabled, fieldset[disabled] .datepicker table tr td.active.disabled:hover, .datepicker table tr td.active.disabled:hover, .datepicker table tr td.active:hover.disabled:hover, .datepicker table tr td.active.disabled.disabled:hover, .datepicker table tr td.active.disabled:hover.disabled:hover, .datepicker table tr td.active[disabled]:hover, .datepicker table tr td.active:hover[disabled]:hover, .datepicker table tr td.active.disabled[disabled]:hover, .datepicker table tr td.active.disabled:hover[disabled]:hover, fieldset[disabled] .datepicker table tr td.active:hover, fieldset[disabled] .datepicker table tr td.active:hover:hover, fieldset[disabled] .datepicker table tr td.active.disabled:hover, fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover, .datepicker table tr td.active.disabled:focus, .datepicker table tr td.active:hover.disabled:focus, .datepicker table tr td.active.disabled.disabled:focus, .datepicker table tr td.active.disabled:hover.disabled:focus, .datepicker table tr td.active[disabled]:focus, .datepicker table tr td.active:hover[disabled]:focus, .datepicker table tr td.active.disabled[disabled]:focus, .datepicker table tr td.active.disabled:hover[disabled]:focus, fieldset[disabled] .datepicker table tr td.active:focus, fieldset[disabled] .datepicker table tr td.active:hover:focus, fieldset[disabled] .datepicker table tr td.active.disabled:focus, fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus, .datepicker table tr td.active.disabled:active, .datepicker table tr td.active:hover.disabled:active, .datepicker table tr td.active.disabled.disabled:active, .datepicker table tr td.active.disabled:hover.disabled:active, .datepicker table tr td.active[disabled]:active, .datepicker table tr td.active:hover[disabled]:active, .datepicker table tr td.active.disabled[disabled]:active, .datepicker table tr td.active.disabled:hover[disabled]:active, fieldset[disabled] .datepicker table tr td.active:active, fieldset[disabled] .datepicker table tr td.active:hover:active, fieldset[disabled] .datepicker table tr td.active.disabled:active, fieldset[disabled] .datepicker table tr td.active.disabled:hover:active, .datepicker table tr td.active.disabled.active, .datepicker table tr td.active:hover.disabled.active, .datepicker table tr td.active.disabled.disabled.active, .datepicker table tr td.active.disabled:hover.disabled.active, .datepicker table tr td.active[disabled].active, .datepicker table tr td.active:hover[disabled].active, .datepicker table tr td.active.disabled[disabled].active, .datepicker table tr td.active.disabled:hover[disabled].active, fieldset[disabled] .datepicker table tr td.active.active, fieldset[disabled] .datepicker table tr td.active:hover.active, fieldset[disabled] .datepicker table tr td.active.disabled.active, fieldset[disabled] .datepicker table tr td.active.disabled:hover.active { background-color: #428bca; border-color: #357ebd; } .datepicker table tr td span { display: block; width: 23%; height: 54px; line-height: 54px; float: left; margin: 1%; cursor: pointer; border-radius: 4px; } .datepicker table tr td span:hover { background: #eeeeee; } .datepicker table tr td span.disabled, .datepicker table tr td span.disabled:hover { background: none; color: #999999; cursor: default; } .datepicker table tr td span.active, .datepicker table tr td span.active:hover, .datepicker table tr td span.active.disabled, .datepicker table tr td span.active.disabled:hover { color: #ffffff; background-color: #428bca; border-color: #357ebd; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .datepicker table tr td span.active:hover, .datepicker table tr td span.active:hover:hover, .datepicker table tr td span.active.disabled:hover, .datepicker table tr td span.active.disabled:hover:hover, .datepicker table tr td span.active:focus, .datepicker table tr td span.active:hover:focus, .datepicker table tr td span.active.disabled:focus, .datepicker table tr td span.active.disabled:hover:focus, .datepicker table tr td span.active:active, .datepicker table tr td span.active:hover:active, .datepicker table tr td span.active.disabled:active, .datepicker table tr td span.active.disabled:hover:active, .datepicker table tr td span.active.active, .datepicker table tr td span.active:hover.active, .datepicker table tr td span.active.disabled.active, .datepicker table tr td span.active.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td span.active, .open .dropdown-toggle.datepicker table tr td span.active:hover, .open .dropdown-toggle.datepicker table tr td span.active.disabled, .open .dropdown-toggle.datepicker table tr td span.active.disabled:hover { color: #ffffff; background-color: #3276b1; border-color: #285e8e; } .datepicker table tr td span.active:active, .datepicker table tr td span.active:hover:active, .datepicker table tr td span.active.disabled:active, .datepicker table tr td span.active.disabled:hover:active, .datepicker table tr td span.active.active, .datepicker table tr td span.active:hover.active, .datepicker table tr td span.active.disabled.active, .datepicker table tr td span.active.disabled:hover.active, .open .dropdown-toggle.datepicker table tr td span.active, .open .dropdown-toggle.datepicker table tr td span.active:hover, .open .dropdown-toggle.datepicker table tr td span.active.disabled, .open .dropdown-toggle.datepicker table tr td span.active.disabled:hover { background-image: none; } .datepicker table tr td span.active.disabled, .datepicker table tr td span.active:hover.disabled, .datepicker table tr td span.active.disabled.disabled, .datepicker table tr td span.active.disabled:hover.disabled, .datepicker table tr td span.active[disabled], .datepicker table tr td span.active:hover[disabled], .datepicker table tr td span.active.disabled[disabled], .datepicker table tr td span.active.disabled:hover[disabled], fieldset[disabled] .datepicker table tr td span.active, fieldset[disabled] .datepicker table tr td span.active:hover, fieldset[disabled] .datepicker table tr td span.active.disabled, fieldset[disabled] .datepicker table tr td span.active.disabled:hover, .datepicker table tr td span.active.disabled:hover, .datepicker table tr td span.active:hover.disabled:hover, .datepicker table tr td span.active.disabled.disabled:hover, .datepicker table tr td span.active.disabled:hover.disabled:hover, .datepicker table tr td span.active[disabled]:hover, .datepicker table tr td span.active:hover[disabled]:hover, .datepicker table tr td span.active.disabled[disabled]:hover, .datepicker table tr td span.active.disabled:hover[disabled]:hover, fieldset[disabled] .datepicker table tr td span.active:hover, fieldset[disabled] .datepicker table tr td span.active:hover:hover, fieldset[disabled] .datepicker table tr td span.active.disabled:hover, fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover, .datepicker table tr td span.active.disabled:focus, .datepicker table tr td span.active:hover.disabled:focus, .datepicker table tr td span.active.disabled.disabled:focus, .datepicker table tr td span.active.disabled:hover.disabled:focus, .datepicker table tr td span.active[disabled]:focus, .datepicker table tr td span.active:hover[disabled]:focus, .datepicker table tr td span.active.disabled[disabled]:focus, .datepicker table tr td span.active.disabled:hover[disabled]:focus, fieldset[disabled] .datepicker table tr td span.active:focus, fieldset[disabled] .datepicker table tr td span.active:hover:focus, fieldset[disabled] .datepicker table tr td span.active.disabled:focus, fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus, .datepicker table tr td span.active.disabled:active, .datepicker table tr td span.active:hover.disabled:active, .datepicker table tr td span.active.disabled.disabled:active, .datepicker table tr td span.active.disabled:hover.disabled:active, .datepicker table tr td span.active[disabled]:active, .datepicker table tr td span.active:hover[disabled]:active, .datepicker table tr td span.active.disabled[disabled]:active, .datepicker table tr td span.active.disabled:hover[disabled]:active, fieldset[disabled] .datepicker table tr td span.active:active, fieldset[disabled] .datepicker table tr td span.active:hover:active, fieldset[disabled] .datepicker table tr td span.active.disabled:active, fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active, .datepicker table tr td span.active.disabled.active, .datepicker table tr td span.active:hover.disabled.active, .datepicker table tr td span.active.disabled.disabled.active, .datepicker table tr td span.active.disabled:hover.disabled.active, .datepicker table tr td span.active[disabled].active, .datepicker table tr td span.active:hover[disabled].active, .datepicker table tr td span.active.disabled[disabled].active, .datepicker table tr td span.active.disabled:hover[disabled].active, fieldset[disabled] .datepicker table tr td span.active.active, fieldset[disabled] .datepicker table tr td span.active:hover.active, fieldset[disabled] .datepicker table tr td span.active.disabled.active, fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active { background-color: #428bca; border-color: #357ebd; } .datepicker table tr td span.old, .datepicker table tr td span.new { color: #999999; } .datepicker th.datepicker-switch { width: 145px; } .datepicker thead tr:first-child th, .datepicker tfoot tr th { cursor: pointer; } .datepicker thead tr:first-child th:hover, .datepicker tfoot tr th:hover { background: #eeeeee; } .datepicker .cw { font-size: 10px; width: 12px; padding: 0 2px 0 5px; vertical-align: middle; } .datepicker thead tr:first-child th.cw { cursor: default; background-color: transparent; } .input-group.date .input-group-addon i { cursor: pointer; width: 16px; height: 16px; } .input-daterange input { text-align: center; } .input-daterange input:first-child { border-radius: 3px 0 0 3px; } .input-daterange input:last-child { border-radius: 0 3px 3px 0; } .input-daterange .input-group-addon { width: auto; min-width: 16px; padding: 4px 5px; font-weight: normal; line-height: 1.428571429; text-align: center; text-shadow: 0 1px 0 #fff; vertical-align: middle; background-color: #eeeeee; border-width: 1px 0; margin-left: -5px; margin-right: -5px; } .datepicker.dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; float: left; display: none; min-width: 160px; list-style: none; background-color: #ffffff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 5px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; *border-right-width: 2px; *border-bottom-width: 2px; color: #333333; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 1.428571429; } .datepicker.dropdown-menu th, .datepicker.dropdown-menu td { padding: 4px 5px; } ================================================ FILE: src/main/resources/static/css/plugins/dropzone/basic.css ================================================ /* The MIT License */ .dropzone, .dropzone *, .dropzone-previews, .dropzone-previews * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .dropzone { position: relative; border: 1px solid rgba(0,0,0,0.08); background: rgba(0,0,0,0.02); padding: 1em; } .dropzone.dz-clickable { cursor: pointer; } .dropzone.dz-clickable .dz-message, .dropzone.dz-clickable .dz-message span { cursor: pointer; } .dropzone.dz-clickable * { cursor: default; } .dropzone .dz-message { opacity: 1; -ms-filter: none; filter: none; } .dropzone.dz-drag-hover { border-color: rgba(0,0,0,0.15); background: rgba(0,0,0,0.04); } .dropzone.dz-started .dz-message { display: none; } .dropzone .dz-preview, .dropzone-previews .dz-preview { background: rgba(255,255,255,0.8); position: relative; display: inline-block; margin: 17px; vertical-align: top; border: 1px solid #acacac; padding: 6px 6px 6px 6px; } .dropzone .dz-preview.dz-file-preview [data-dz-thumbnail], .dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] { display: none; } .dropzone .dz-preview .dz-details, .dropzone-previews .dz-preview .dz-details { width: 100px; height: 100px; position: relative; background: #ebebeb; padding: 5px; margin-bottom: 22px; } .dropzone .dz-preview .dz-details .dz-filename, .dropzone-previews .dz-preview .dz-details .dz-filename { overflow: hidden; height: 100%; } .dropzone .dz-preview .dz-details img, .dropzone-previews .dz-preview .dz-details img { position: absolute; top: 0; left: 0; width: 100px; height: 100px; } .dropzone .dz-preview .dz-details .dz-size, .dropzone-previews .dz-preview .dz-details .dz-size { position: absolute; bottom: -28px; left: 3px; height: 28px; line-height: 28px; } .dropzone .dz-preview.dz-error .dz-error-mark, .dropzone-previews .dz-preview.dz-error .dz-error-mark { display: block; } .dropzone .dz-preview.dz-success .dz-success-mark, .dropzone-previews .dz-preview.dz-success .dz-success-mark { display: block; } .dropzone .dz-preview:hover .dz-details img, .dropzone-previews .dz-preview:hover .dz-details img { display: none; } .dropzone .dz-preview .dz-success-mark, .dropzone-previews .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark, .dropzone-previews .dz-preview .dz-error-mark { display: none; position: absolute; width: 40px; height: 40px; font-size: 30px; text-align: center; right: -10px; top: -10px; } .dropzone .dz-preview .dz-success-mark, .dropzone-previews .dz-preview .dz-success-mark { color: #8cc657; } .dropzone .dz-preview .dz-error-mark, .dropzone-previews .dz-preview .dz-error-mark { color: #ee162d; } .dropzone .dz-preview .dz-progress, .dropzone-previews .dz-preview .dz-progress { position: absolute; top: 100px; left: 6px; right: 6px; height: 6px; background: #d7d7d7; display: none; } .dropzone .dz-preview .dz-progress .dz-upload, .dropzone-previews .dz-preview .dz-progress .dz-upload { display: block; position: absolute; top: 0; bottom: 0; left: 0; width: 0%; background-color: #8cc657; } .dropzone .dz-preview.dz-processing .dz-progress, .dropzone-previews .dz-preview.dz-processing .dz-progress { display: block; } .dropzone .dz-preview .dz-error-message, .dropzone-previews .dz-preview .dz-error-message { display: none; position: absolute; top: -5px; left: -20px; background: rgba(245,245,245,0.8); padding: 8px 10px; color: #800; min-width: 140px; max-width: 500px; z-index: 500; } .dropzone .dz-preview:hover.dz-error .dz-error-message, .dropzone-previews .dz-preview:hover.dz-error .dz-error-message { display: block; } ================================================ FILE: src/main/resources/static/css/plugins/dropzone/dropzone.css ================================================ /* The MIT License */ .dropzone, .dropzone *, .dropzone-previews, .dropzone-previews * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .dropzone { position: relative; border: 1px solid rgba(0,0,0,0.08); background: rgba(0,0,0,0.02); padding: 1em; } .dropzone.dz-clickable { cursor: pointer; } .dropzone.dz-clickable .dz-message, .dropzone.dz-clickable .dz-message span { cursor: pointer; } .dropzone.dz-clickable * { cursor: default; } .dropzone .dz-message { opacity: 1; -ms-filter: none; filter: none; } .dropzone.dz-drag-hover { border-color: rgba(0,0,0,0.15); background: rgba(0,0,0,0.04); } .dropzone.dz-started .dz-message { display: none; } .dropzone .dz-preview, .dropzone-previews .dz-preview { background: rgba(255,255,255,0.8); position: relative; display: inline-block; margin: 17px; vertical-align: top; border: 1px solid #acacac; padding: 6px 6px 6px 6px; } .dropzone .dz-preview.dz-file-preview [data-dz-thumbnail], .dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] { display: none; } .dropzone .dz-preview .dz-details, .dropzone-previews .dz-preview .dz-details { width: 100px; height: 100px; position: relative; background: #ebebeb; padding: 5px; margin-bottom: 22px; } .dropzone .dz-preview .dz-details .dz-filename, .dropzone-previews .dz-preview .dz-details .dz-filename { overflow: hidden; height: 100%; } .dropzone .dz-preview .dz-details img, .dropzone-previews .dz-preview .dz-details img { position: absolute; top: 0; left: 0; width: 100px; height: 100px; } .dropzone .dz-preview .dz-details .dz-size, .dropzone-previews .dz-preview .dz-details .dz-size { position: absolute; bottom: -28px; left: 3px; height: 28px; line-height: 28px; } .dropzone .dz-preview.dz-error .dz-error-mark, .dropzone-previews .dz-preview.dz-error .dz-error-mark { display: block; } .dropzone .dz-preview.dz-success .dz-success-mark, .dropzone-previews .dz-preview.dz-success .dz-success-mark { display: block; } .dropzone .dz-preview:hover .dz-details img, .dropzone-previews .dz-preview:hover .dz-details img { display: none; } .dropzone .dz-preview .dz-success-mark, .dropzone-previews .dz-preview .dz-success-mark, .dropzone .dz-preview .dz-error-mark, .dropzone-previews .dz-preview .dz-error-mark { display: none; position: absolute; width: 40px; height: 40px; font-size: 30px; text-align: center; right: -10px; top: -10px; } .dropzone .dz-preview .dz-success-mark, .dropzone-previews .dz-preview .dz-success-mark { color: #8cc657; } .dropzone .dz-preview .dz-error-mark, .dropzone-previews .dz-preview .dz-error-mark { color: #ee162d; } .dropzone .dz-preview .dz-progress, .dropzone-previews .dz-preview .dz-progress { position: absolute; top: 100px; left: 6px; right: 6px; height: 6px; background: #d7d7d7; display: none; } .dropzone .dz-preview .dz-progress .dz-upload, .dropzone-previews .dz-preview .dz-progress .dz-upload { display: block; position: absolute; top: 0; bottom: 0; left: 0; width: 0%; background-color: #8cc657; } .dropzone .dz-preview.dz-processing .dz-progress, .dropzone-previews .dz-preview.dz-processing .dz-progress { display: block; } .dropzone .dz-preview .dz-error-message, .dropzone-previews .dz-preview .dz-error-message { display: none; position: absolute; top: -5px; left: -20px; background: rgba(245,245,245,0.8); padding: 8px 10px; color: #800; min-width: 140px; max-width: 500px; z-index: 500; } .dropzone .dz-preview:hover.dz-error .dz-error-message, .dropzone-previews .dz-preview:hover.dz-error .dz-error-message { display: block; } .dropzone { border: 1px solid rgba(0,0,0,0.03); min-height: 360px; -webkit-border-radius: 3px; border-radius: 3px; background: rgba(0,0,0,0.03); padding: 23px; } .dropzone .dz-default.dz-message { opacity: 1; -ms-filter: none; filter: none; -webkit-transition: opacity 0.3s ease-in-out; -moz-transition: opacity 0.3s ease-in-out; -o-transition: opacity 0.3s ease-in-out; -ms-transition: opacity 0.3s ease-in-out; transition: opacity 0.3s ease-in-out; background-image: url("../images/spritemap.png"); background-repeat: no-repeat; background-position: 0 0; position: absolute; width: 428px; height: 123px; margin-left: -214px; margin-top: -61.5px; top: 50%; left: 50%; } @media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { .dropzone .dz-default.dz-message { background-image: url("../images/spritemap@2x.png"); -webkit-background-size: 428px 406px; -moz-background-size: 428px 406px; background-size: 428px 406px; } } .dropzone .dz-default.dz-message span { display: none; } .dropzone.dz-square .dz-default.dz-message { background-position: 0 -123px; width: 268px; margin-left: -134px; height: 174px; margin-top: -87px; } .dropzone.dz-drag-hover .dz-message { opacity: 0.15; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)"; filter: alpha(opacity=15); } .dropzone.dz-started .dz-message { display: block; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); } .dropzone .dz-preview, .dropzone-previews .dz-preview { -webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16); box-shadow: 1px 1px 4px rgba(0,0,0,0.16); font-size: 14px; } .dropzone .dz-preview.dz-image-preview:hover .dz-details img, .dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img { display: block; opacity: 0.1; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; filter: alpha(opacity=10); } .dropzone .dz-preview.dz-success .dz-success-mark, .dropzone-previews .dz-preview.dz-success .dz-success-mark { opacity: 1; -ms-filter: none; filter: none; } .dropzone .dz-preview.dz-error .dz-error-mark, .dropzone-previews .dz-preview.dz-error .dz-error-mark { opacity: 1; -ms-filter: none; filter: none; } .dropzone .dz-preview.dz-error .dz-progress .dz-upload, .dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload { background: #ee1e2d; } .dropzone .dz-preview .dz-error-mark, .dropzone-previews .dz-preview .dz-error-mark, .dropzone .dz-preview .dz-success-mark, .dropzone-previews .dz-preview .dz-success-mark { display: block; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); -webkit-transition: opacity 0.4s ease-in-out; -moz-transition: opacity 0.4s ease-in-out; -o-transition: opacity 0.4s ease-in-out; -ms-transition: opacity 0.4s ease-in-out; transition: opacity 0.4s ease-in-out; background-image: url("../images/spritemap.png"); background-repeat: no-repeat; } @media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { .dropzone .dz-preview .dz-error-mark, .dropzone-previews .dz-preview .dz-error-mark, .dropzone .dz-preview .dz-success-mark, .dropzone-previews .dz-preview .dz-success-mark { background-image: url("../images/spritemap@2x.png"); -webkit-background-size: 428px 406px; -moz-background-size: 428px 406px; background-size: 428px 406px; } } .dropzone .dz-preview .dz-error-mark span, .dropzone-previews .dz-preview .dz-error-mark span, .dropzone .dz-preview .dz-success-mark span, .dropzone-previews .dz-preview .dz-success-mark span { display: none; } .dropzone .dz-preview .dz-error-mark, .dropzone-previews .dz-preview .dz-error-mark { background-position: -268px -123px; } .dropzone .dz-preview .dz-success-mark, .dropzone-previews .dz-preview .dz-success-mark { background-position: -268px -163px; } .dropzone .dz-preview .dz-progress .dz-upload, .dropzone-previews .dz-preview .dz-progress .dz-upload { -webkit-animation: loading 0.4s linear infinite; -moz-animation: loading 0.4s linear infinite; -o-animation: loading 0.4s linear infinite; -ms-animation: loading 0.4s linear infinite; animation: loading 0.4s linear infinite; -webkit-transition: width 0.3s ease-in-out; -moz-transition: width 0.3s ease-in-out; -o-transition: width 0.3s ease-in-out; -ms-transition: width 0.3s ease-in-out; transition: width 0.3s ease-in-out; -webkit-border-radius: 2px; border-radius: 2px; position: absolute; top: 0; left: 0; width: 0%; height: 100%; background-image: url("../images/spritemap.png"); background-repeat: repeat-x; background-position: 0px -400px; } @media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) { .dropzone .dz-preview .dz-progress .dz-upload, .dropzone-previews .dz-preview .dz-progress .dz-upload { background-image: url("../images/spritemap@2x.png"); -webkit-background-size: 428px 406px; -moz-background-size: 428px 406px; background-size: 428px 406px; } } .dropzone .dz-preview.dz-success .dz-progress, .dropzone-previews .dz-preview.dz-success .dz-progress { display: block; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); -webkit-transition: opacity 0.4s ease-in-out; -moz-transition: opacity 0.4s ease-in-out; -o-transition: opacity 0.4s ease-in-out; -ms-transition: opacity 0.4s ease-in-out; transition: opacity 0.4s ease-in-out; } .dropzone .dz-preview .dz-error-message, .dropzone-previews .dz-preview .dz-error-message { display: block; opacity: 0; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); -webkit-transition: opacity 0.3s ease-in-out; -moz-transition: opacity 0.3s ease-in-out; -o-transition: opacity 0.3s ease-in-out; -ms-transition: opacity 0.3s ease-in-out; transition: opacity 0.3s ease-in-out; } .dropzone .dz-preview:hover.dz-error .dz-error-message, .dropzone-previews .dz-preview:hover.dz-error .dz-error-message { opacity: 1; -ms-filter: none; filter: none; } .dropzone a.dz-remove, .dropzone-previews a.dz-remove { background-image: -webkit-linear-gradient(top, #fafafa, #eee); background-image: -moz-linear-gradient(top, #fafafa, #eee); background-image: -o-linear-gradient(top, #fafafa, #eee); background-image: -ms-linear-gradient(top, #fafafa, #eee); background-image: linear-gradient(to bottom, #fafafa, #eee); -webkit-border-radius: 2px; border-radius: 2px; border: 1px solid #eee; text-decoration: none; display: block; padding: 4px 5px; text-align: center; color: #aaa; margin-top: 26px; } .dropzone a.dz-remove:hover, .dropzone-previews a.dz-remove:hover { color: #666; } @-moz-keyframes loading { 0% { background-position: 0 -400px; } 100% { background-position: -7px -400px; } } @-webkit-keyframes loading { 0% { background-position: 0 -400px; } 100% { background-position: -7px -400px; } } @-o-keyframes loading { 0% { background-position: 0 -400px; } 100% { background-position: -7px -400px; } } @-ms-keyframes loading { 0% { background-position: 0 -400px; } 100% { background-position: -7px -400px; } } @keyframes loading { 0% { background-position: 0 -400px; } 100% { background-position: -7px -400px; } } ================================================ FILE: src/main/resources/static/css/plugins/duallistbox/bootstrap-duallistbox.css ================================================ .bootstrap-duallistbox-container .buttons { width:calc(100% + 1px); margin-bottom: -6px; box-sizing: border-box; } .bootstrap-duallistbox-container label { display: block; } .bootstrap-duallistbox-container .info { display: inline-block; margin-bottom: 5px; } .bootstrap-duallistbox-container .clear1, .bootstrap-duallistbox-container .clear2 { display: none; font-size: 10px; } .bootstrap-duallistbox-container .box1.filtered .clear1, .bootstrap-duallistbox-container .box2.filtered .clear2 { display: inline-block; } .bootstrap-duallistbox-container .move, .bootstrap-duallistbox-container .remove { width: 50%;box-sizing: border-box; } .bootstrap-duallistbox-container .btn-group .btn { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .bootstrap-duallistbox-container select { border-top-left-radius: 0; border-top-right-radius: 0; } .bootstrap-duallistbox-container .moveall, .bootstrap-duallistbox-container .removeall { width: 50%;box-sizing: border-box; } .bootstrap-duallistbox-container.bs2compatible .btn-group > .btn + .btn { margin-left: 0; } .bootstrap-duallistbox-container select { height: 300px; box-sizing: border-box; } .bootstrap-duallistbox-container select:focus{ border-color: #e5e6e7!important; } .bootstrap-duallistbox-container .filter { display: inline-block; width: 100%; height: 31px;margin-bottom:-1px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; } .bootstrap-duallistbox-container .filter.placeholder { color: #aaa; } .bootstrap-duallistbox-container.moveonselect .move, .bootstrap-duallistbox-container.moveonselect .remove { display:none; } .bootstrap-duallistbox-container.moveonselect .moveall, .bootstrap-duallistbox-container.moveonselect .removeall { width: 100%; } ================================================ FILE: src/main/resources/static/css/plugins/footable/footable.core.css ================================================ @font-face { font-family: 'footable'; src: url('fonts/footable.eot'); src: url('fonts/footable.eot?#iefix') format('embedded-opentype'), url('fonts/footable.woff') format('woff'), url('fonts/footable.ttf') format('truetype'), url('fonts/footable.svg#footable') format('svg'); font-weight: normal; font-style: normal; } @media screen and (-webkit-min-device-pixel-ratio: 0) { @font-face { font-family: 'footable'; src: url('fonts/footable.svg#footable') format('svg'); font-weight: normal; font-style: normal; } } .footable { width: 100%; /** SORTING **/ /** PAGINATION **/ } .footable.breakpoint > tbody > tr.footable-detail-show > td { border-bottom: none; } .footable.breakpoint > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e001"; } .footable.breakpoint > tbody > tr:hover:not(.footable-row-detail) { cursor: pointer; } .footable.breakpoint > tbody > tr > td.footable-cell-detail { background: #eee; border-top: none; } .footable.breakpoint > tbody > tr > td > span.footable-toggle { display: inline-block; font-family: 'footable'; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; -webkit-font-smoothing: antialiased; padding-right: 5px; font-size: 14px; color: #888888; } .footable.breakpoint > tbody > tr > td > span.footable-toggle:before { content: "\e000"; } .footable.breakpoint.toggle-circle > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e005"; } .footable.breakpoint.toggle-circle > tbody > tr > td > span.footable-toggle:before { content: "\e004"; } .footable.breakpoint.toggle-circle-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e003"; } .footable.breakpoint.toggle-circle-filled > tbody > tr > td > span.footable-toggle:before { content: "\e002"; } .footable.breakpoint.toggle-square > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e007"; } .footable.breakpoint.toggle-square > tbody > tr > td > span.footable-toggle:before { content: "\e006"; } .footable.breakpoint.toggle-square-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e009"; } .footable.breakpoint.toggle-square-filled > tbody > tr > td > span.footable-toggle:before { content: "\e008"; } .footable.breakpoint.toggle-arrow > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e00f"; } .footable.breakpoint.toggle-arrow > tbody > tr > td > span.footable-toggle:before { content: "\e011"; } .footable.breakpoint.toggle-arrow-small > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e013"; } .footable.breakpoint.toggle-arrow-small > tbody > tr > td > span.footable-toggle:before { content: "\e015"; } .footable.breakpoint.toggle-arrow-circle > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e01b"; } .footable.breakpoint.toggle-arrow-circle > tbody > tr > td > span.footable-toggle:before { content: "\e01d"; } .footable.breakpoint.toggle-arrow-circle-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e00b"; } .footable.breakpoint.toggle-arrow-circle-filled > tbody > tr > td > span.footable-toggle:before { content: "\e00d"; } .footable.breakpoint.toggle-arrow-tiny > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e01f"; } .footable.breakpoint.toggle-arrow-tiny > tbody > tr > td > span.footable-toggle:before { content: "\e021"; } .footable.breakpoint.toggle-arrow-alt > tbody > tr.footable-detail-show > td > span.footable-toggle:before { content: "\e017"; } .footable.breakpoint.toggle-arrow-alt > tbody > tr > td > span.footable-toggle:before { content: "\e019"; } .footable.breakpoint.toggle-medium > tbody > tr > td > span.footable-toggle { font-size: 18px; } .footable.breakpoint.toggle-large > tbody > tr > td > span.footable-toggle { font-size: 24px; } .footable > thead > tr > th { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: -moz-none; -ms-user-select: none; user-select: none; } .footable > thead > tr > th.footable-sortable:hover { cursor: pointer; } .footable > thead > tr > th.footable-sorted > span.footable-sort-indicator:before { content: "\e013"; } .footable > thead > tr > th.footable-sorted-desc > span.footable-sort-indicator:before { content: "\e012"; } .footable > thead > tr > th > span.footable-sort-indicator { display: inline-block; font-family: 'footable'; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; -webkit-font-smoothing: antialiased; padding-left: 5px; } .footable > thead > tr > th > span.footable-sort-indicator:before { content: "\e022"; } .footable > tfoot .pagination { margin: 0; } .footable.no-paging .hide-if-no-paging { display: none; } .footable-row-detail-inner { display: table; } .footable-row-detail-row { display: table-row; line-height: 1.5em; } .footable-row-detail-group { display: block; line-height: 2em; font-size: 1.2em; font-weight: bold; } .footable-row-detail-name { display: table-cell; font-weight: bold; padding-right: 0.5em; } .footable-row-detail-value { display: table-cell; } .footable-odd { background-color: #f7f7f7; } ================================================ FILE: src/main/resources/static/css/plugins/fullcalendar/fullcalendar.css ================================================ /*! * FullCalendar v1.6.4 Stylesheet * Docs & License: http://arshaw.com/fullcalendar/ * (c) 2013 Adam Shaw */ .fc { direction: ltr; text-align: left; } .fc table { border-collapse: collapse; border-spacing: 0; } html .fc, .fc table { font-size: 1em; } .fc td, .fc th { padding: 0; vertical-align: top; } /* Header ------------------------------------------------------------------------*/ .fc-header td { white-space: nowrap; } .fc-header-left { width: 25%; text-align: left; } .fc-header-center { text-align: center; } .fc-header-right { width: 25%; text-align: right; } .fc-header-title { display: inline-block; vertical-align: top; } .fc-header-title h2 { margin-top: 0; white-space: nowrap; } .fc .fc-header-space { padding-left: 10px; } .fc-header .fc-button { margin-bottom: 1em; vertical-align: top; } /* buttons edges butting together */ .fc-header .fc-button { margin-right: -1px; } .fc-header .fc-corner-right, /* non-theme */ .fc-header .ui-corner-right { /* theme */ margin-right: 0; /* back to normal */ } /* button layering (for border precedence) */ .fc-header .fc-state-hover, .fc-header .ui-state-hover { z-index: 2; } .fc-header .fc-state-down { z-index: 3; } .fc-header .fc-state-active, .fc-header .ui-state-active { z-index: 4; } /* Content ------------------------------------------------------------------------*/ .fc-content { clear: both; zoom: 1; /* for IE7, gives accurate coordinates for [un]freezeContentHeight */ } .fc-view { width: 100%; overflow: hidden; } /* Cell Styles ------------------------------------------------------------------------*/ .fc-widget-header, /* , usually */ .fc-widget-content { /* , usually */ border: 1px solid #ddd; } .fc-state-highlight { /* today cell */ /* TODO: add .fc-today to */ background: #fcf8e3; } .fc-cell-overlay { /* semi-transparent rectangle while dragging */ background: #bce8f1; opacity: .3; filter: alpha(opacity=30); /* for IE */ } /* Buttons ------------------------------------------------------------------------*/ .fc-button { position: relative; display: inline-block; padding: 0 .6em; overflow: hidden; height: 1.9em; line-height: 1.9em; white-space: nowrap; cursor: pointer; } .fc-state-default { /* non-theme */ border: 1px solid; } .fc-state-default.fc-corner-left { /* non-theme */ border-top-left-radius: 4px; border-bottom-left-radius: 4px; } .fc-state-default.fc-corner-right { /* non-theme */ border-top-right-radius: 4px; border-bottom-right-radius: 4px; } /* Our default prev/next buttons use HTML entities like ‹ › « » and we'll try to make them look good cross-browser. */ .fc-text-arrow { margin: 0 .1em; font-size: 2em; font-family: "Courier New", Courier, monospace; vertical-align: baseline; /* for IE7 */ } .fc-button-prev .fc-text-arrow, .fc-button-next .fc-text-arrow { /* for ‹ › */ font-weight: bold; } /* icon (for jquery ui) */ .fc-button .fc-icon-wrap { position: relative; float: left; top: 50%; } .fc-button .ui-icon { position: relative; float: left; margin-top: -50%; *margin-top: 0; *top: -50%; } /* button states borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/) */ .fc-state-default { background-color: #f5f5f5; background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); background-repeat: repeat-x; border-color: #e6e6e6 #e6e6e6 #bfbfbf; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); color: #333; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); } .fc-state-hover, .fc-state-down, .fc-state-active, .fc-state-disabled { color: #333333; background-color: #e6e6e6; } .fc-state-hover { color: #333333; text-decoration: none; background-position: 0 -15px; -webkit-transition: background-position 0.1s linear; -moz-transition: background-position 0.1s linear; -o-transition: background-position 0.1s linear; transition: background-position 0.1s linear; } .fc-state-down, .fc-state-active { background-color: #cccccc; background-image: none; outline: 0; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); } .fc-state-disabled { cursor: default; background-image: none; opacity: 0.65; filter: alpha(opacity=65); box-shadow: none; } /* Global Event Styles ------------------------------------------------------------------------*/ .fc-event-container > * { z-index: 8; } .fc-event-container > .ui-draggable-dragging, .fc-event-container > .ui-resizable-resizing { z-index: 9; } .fc-event { border: 1px solid #3a87ad; /* default BORDER color */ background-color: #3a87ad; /* default BACKGROUND color */ color: #fff; /* default TEXT color */ font-size: .85em; cursor: default; } a.fc-event { text-decoration: none; } a.fc-event, .fc-event-draggable { cursor: pointer; } .fc-rtl .fc-event { text-align: right; } .fc-event-inner { width: 100%; height: 100%; overflow: hidden; } .fc-event-time, .fc-event-title { padding: 0 1px; } .fc .ui-resizable-handle { display: block; position: absolute; z-index: 99999; overflow: hidden; /* hacky spaces (IE6/7) */ font-size: 300%; /* */ line-height: 50%; /* */ } /* Horizontal Events ------------------------------------------------------------------------*/ .fc-event-hori { border-width: 1px 0; margin-bottom: 1px; } .fc-ltr .fc-event-hori.fc-event-start, .fc-rtl .fc-event-hori.fc-event-end { border-left-width: 1px; border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .fc-ltr .fc-event-hori.fc-event-end, .fc-rtl .fc-event-hori.fc-event-start { border-right-width: 1px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; } /* resizable */ .fc-event-hori .ui-resizable-e { top: 0 !important; /* importants override pre jquery ui 1.7 styles */ right: -3px !important; width: 7px !important; height: 100% !important; cursor: e-resize; } .fc-event-hori .ui-resizable-w { top: 0 !important; left: -3px !important; width: 7px !important; height: 100% !important; cursor: w-resize; } .fc-event-hori .ui-resizable-handle { _padding-bottom: 14px; /* IE6 had 0 height */ } /* Reusable Separate-border Table ------------------------------------------------------------*/ table.fc-border-separate { border-collapse: separate; } .fc-border-separate th, .fc-border-separate td { border-width: 1px 0 0 1px; } .fc-border-separate th.fc-last, .fc-border-separate td.fc-last { border-right-width: 1px; } .fc-border-separate tr.fc-last th, .fc-border-separate tr.fc-last td { border-bottom-width: 1px; } .fc-border-separate tbody tr.fc-first td, .fc-border-separate tbody tr.fc-first th { border-top-width: 0; } /* Month View, Basic Week View, Basic Day View ------------------------------------------------------------------------*/ .fc-grid th { text-align: center; } .fc .fc-week-number { width: 22px; text-align: center; } .fc .fc-week-number div { padding: 0 2px; } .fc-grid .fc-day-number { float: right; padding: 0 2px; } .fc-grid .fc-other-month .fc-day-number { opacity: 0.3; filter: alpha(opacity=30); /* for IE */ /* opacity with small font can sometimes look too faded might want to set the 'color' property instead making day-numbers bold also fixes the problem */ } .fc-grid .fc-day-content { clear: both; padding: 2px 2px 1px; /* distance between events and day edges */ } /* event styles */ .fc-grid .fc-event-time { font-weight: bold; } /* right-to-left */ .fc-rtl .fc-grid .fc-day-number { float: left; } .fc-rtl .fc-grid .fc-event-time { float: right; } /* Agenda Week View, Agenda Day View ------------------------------------------------------------------------*/ .fc-agenda table { border-collapse: separate; } .fc-agenda-days th { text-align: center; } .fc-agenda .fc-agenda-axis { width: 50px; padding: 0 4px; vertical-align: middle; text-align: right; white-space: nowrap; font-weight: normal; } .fc-agenda .fc-week-number { font-weight: bold; } .fc-agenda .fc-day-content { padding: 2px 2px 1px; } /* make axis border take precedence */ .fc-agenda-days .fc-agenda-axis { border-right-width: 1px; } .fc-agenda-days .fc-col0 { border-left-width: 0; } /* all-day area */ .fc-agenda-allday th { border-width: 0 1px; } .fc-agenda-allday .fc-day-content { min-height: 34px; /* TODO: doesnt work well in quirksmode */ _height: 34px; } /* divider (between all-day and slots) */ .fc-agenda-divider-inner { height: 2px; overflow: hidden; } .fc-widget-header .fc-agenda-divider-inner { background: #eee; } /* slot rows */ .fc-agenda-slots th { border-width: 1px 1px 0; } .fc-agenda-slots td { border-width: 1px 0 0; background: none; } .fc-agenda-slots td div { height: 20px; } .fc-agenda-slots tr.fc-slot0 th, .fc-agenda-slots tr.fc-slot0 td { border-top-width: 0; } .fc-agenda-slots tr.fc-minor th, .fc-agenda-slots tr.fc-minor td { border-top-style: dotted; } .fc-agenda-slots tr.fc-minor th.ui-widget-header { *border-top-style: solid; /* doesn't work with background in IE6/7 */ } /* Vertical Events ------------------------------------------------------------------------*/ .fc-event-vert { border-width: 0 1px; } .fc-event-vert.fc-event-start { border-top-width: 1px; border-top-left-radius: 3px; border-top-right-radius: 3px; } .fc-event-vert.fc-event-end { border-bottom-width: 1px; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; } .fc-event-vert .fc-event-time { white-space: nowrap; font-size: 10px; } .fc-event-vert .fc-event-inner { position: relative; z-index: 2; } .fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */ position: absolute; z-index: 1; top: 0; left: 0; width: 100%; height: 100%; background: #fff; opacity: .25; filter: alpha(opacity=25); } .fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */ .fc-select-helper .fc-event-bg { display: none\9; /* for IE6/7/8. nested opacity filters while dragging don't work */ } /* resizable */ .fc-event-vert .ui-resizable-s { bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */ width: 100% !important; height: 8px !important; overflow: hidden !important; line-height: 8px !important; font-size: 11px !important; font-family: monospace; text-align: center; cursor: s-resize; } .fc-agenda .ui-resizable-resizing { /* TODO: better selector */ _overflow: hidden; } ================================================ FILE: src/main/resources/static/css/plugins/fullcalendar/fullcalendar.print.css ================================================ /*! * FullCalendar v1.6.4 Print Stylesheet * Docs & License: http://arshaw.com/fullcalendar/ * (c) 2013 Adam Shaw */ /* * Include this stylesheet on your page to get a more printer-friendly calendar. * When including this stylesheet, use the media='print' attribute of the tag. * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css. */ /* Events -----------------------------------------------------*/ .fc-event { background: #fff !important; color: #000 !important; } /* for vertical events */ .fc-event-bg { display: none !important; } .fc-event .ui-resizable-handle { display: none !important; } ================================================ FILE: src/main/resources/static/css/plugins/iCheck/custom.css ================================================ /* iCheck plugin Square skin, green ----------------------------------- */ .icheckbox_square-green, .iradio_square-green { display: inline-block; *display: inline; vertical-align: middle; margin: 0; padding: 0; width: 22px; height: 22px; background: url(green.png) no-repeat; border: none; cursor: pointer; } .icheckbox_square-green { background-position: 0 0; } .icheckbox_square-green.hover { background-position: -24px 0; } .icheckbox_square-green.checked { background-position: -48px 0; } .icheckbox_square-green.disabled { background-position: -72px 0; cursor: default; } .icheckbox_square-green.checked.disabled { background-position: -96px 0; } .iradio_square-green { background-position: -120px 0; } .iradio_square-green.hover { background-position: -144px 0; } .iradio_square-green.checked { background-position: -168px 0; } .iradio_square-green.disabled { background-position: -192px 0; cursor: default; } .iradio_square-green.checked.disabled { background-position: -216px 0; } /* HiDPI support */ @media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { .icheckbox_square-green, .iradio_square-green { background-image: url(green@2x.png); -webkit-background-size: 240px 24px; background-size: 240px 24px; } } ================================================ FILE: src/main/resources/static/css/plugins/ionRangeSlider/ion.rangeSlider.css ================================================ /* Ion.RangeSlider // css version 1.8.5 // by Denis Ineshin | ionden.com // ===================================================================================================================*/ /* ===================================================================================================================== // RangeSlider */ .irs { position: relative; display: block; } .irs-line { position: relative; display: block; overflow: hidden; } .irs-line-left, .irs-line-mid, .irs-line-right { position: absolute; display: block; top: 0; } .irs-line-left { left: 0; width: 10%; } .irs-line-mid { left: 10%; width: 80%; } .irs-line-right { right: 0; width: 10%; } .irs-diapason { position: absolute; display: block; left: 0; width: 100%; } .irs-slider { position: absolute; display: block; cursor: default; z-index: 1; } .irs-slider.single { left: 10px; } .irs-slider.single:before { position: absolute; display: block; content: ""; top: -30%; left: -30%; width: 160%; height: 160%; background: rgba(0,0,0,0.0); } .irs-slider.from { left: 100px; } .irs-slider.from:before { position: absolute; display: block; content: ""; top: -30%; left: -30%; width: 130%; height: 160%; background: rgba(0,0,0,0.0); } .irs-slider.to { left: 300px; } .irs-slider.to:before { position: absolute; display: block; content: ""; top: -30%; left: 0; width: 130%; height: 160%; background: rgba(0,0,0,0.0); } .irs-slider.last { z-index: 2; } .irs-min { position: absolute; display: block; left: 0; cursor: default; } .irs-max { position: absolute; display: block; right: 0; cursor: default; } .irs-from, .irs-to, .irs-single { position: absolute; display: block; top: 0; left: 0; cursor: default; white-space: nowrap; } .irs-grid { position: absolute; display: none; bottom: 0; left: 0; width: 100%; height: 20px; } .irs-with-grid .irs-grid { display: block; } .irs-grid-pol { position: absolute; top: 0; left: 0; width: 1px; height: 8px; background: #000; } .irs-grid-pol.small { height: 4px; } .irs-grid-text { position: absolute; bottom: 0; left: 0; width: 100px; white-space: nowrap; text-align: center; font-size: 9px; line-height: 9px; color: #000; } .irs-disable-mask { position: absolute; display: block; top: 0; left: 0; width: 100%; height: 100%; cursor: default; background: rgba(0,0,0,0.0); z-index: 2; } .irs-disabled { opacity: 0.4; } ================================================ FILE: src/main/resources/static/css/plugins/ionRangeSlider/ion.rangeSlider.skinFlat.css ================================================ /* Ion.RangeSlider, Flat UI Skin // css version 1.8.5 // by Denis Ineshin | ionden.com // ===================================================================================================================*/ /* ===================================================================================================================== // Skin details */ .irs-line-mid, .irs-line-left, .irs-line-right, .irs-diapason, .irs-slider { background: url(../images/sprite-skin-flat.png) repeat-x; } .irs { height: 40px; } .irs-with-grid { height: 60px; } .irs-line { height: 12px; top: 25px; } .irs-line-left { height: 12px; background-position: 0 -30px; } .irs-line-mid { height: 12px; background-position: 0 0; } .irs-line-right { height: 12px; background-position: 100% -30px; } .irs-diapason { height: 12px; top: 25px; background-position: 0 -60px; } .irs-slider { width: 16px; height: 18px; top: 22px; background-position: 0 -90px; } #irs-active-slider, .irs-slider:hover { background-position: 0 -120px; } .irs-min, .irs-max { color: #999; font-size: 10px; line-height: 1.333; text-shadow: none; top: 0; padding: 1px 3px; background: #e1e4e9; border-radius: 4px; } .irs-from, .irs-to, .irs-single { color: #fff; font-size: 10px; line-height: 1.333; text-shadow: none; padding: 1px 5px; background: #ed5565; border-radius: 4px; } .irs-from:after, .irs-to:after, .irs-single:after { position: absolute; display: block; content: ""; bottom: -6px; left: 50%; width: 0; height: 0; margin-left: -3px; overflow: hidden; border: 3px solid transparent; border-top-color: #ed5565; } .irs-grid-pol { background: #e1e4e9; } .irs-grid-text { color: #999; } .irs-disabled { } ================================================ FILE: src/main/resources/static/css/plugins/jqTreeGrid/jquery.treegrid.css ================================================ .treegrid-indent {width:16px; height: 16px; display: inline-block; position: relative;} .treegrid-expander {width:16px; height: 16px; display: inline-block; position: relative; cursor: pointer;} .treegrid-expander-expanded{background-image: url(../img/collapse.png); } .treegrid-expander-collapsed{background-image: url(../img/expand.png);} ================================================ FILE: src/main/resources/static/css/plugins/jqgrid/ui.jqgrid.css ================================================ /*Grid*/ .ui-jqgrid { position: relative; border: 1px solid #ddd; overflow: hidden; } .ui-jqgrid .ui-jqgrid-view { position: relative; left:0; top: 0; padding: 0; } .ui-jqgrid .ui-common-table {} /* Caption*/ .ui-jqgrid .ui-jqgrid-titlebar { font-weight: normal; min-height:37px; padding: 4px 8px; position: relative; margin-right: 2px; border-bottom: 1px solid #ddd; //default } .ui-jqgrid .ui-jqgrid-caption { text-align: left; } .ui-jqgrid .ui-jqgrid-title { padding-top: 5px; vertical-align: middle; } .ui-jqgrid .ui-jqgrid-titlebar-close { color: inherit; position: absolute; top: 50%; margin: -10px 7px 0 0; padding: 1px; cursor:pointer; } .ui-jqgrid .ui-jqgrid-titlebar-close span { display: block; margin: 1px; } .ui-jqgrid .ui-jqgrid-titlebar-close:hover { } /* Header*/ .ui-jqgrid .ui-jqgrid-hdiv { position: relative; margin: 0; padding: 0; overflow: hidden; } .ui-jqgrid .ui-jqgrid-hbox { float: left; padding-right: 20px; } .ui-jqgrid .ui-jqgrid-htable { margin-bottom: 0; table-layout: fixed; border-top:none; } .ui-jqgrid .ui-jqgrid-htable thead th { overflow : hidden; border-bottom : none; padding-right: 2px; } .ui-jqgrid .ui-jqgrid-htable thead th div { overflow: hidden; position:relative; } .ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column { overflow: hidden; white-space: nowrap; } .ui-th-column-header, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header { overflow: hidden; white-space: nowrap; } .ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {} .ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {text-align: center; } .ui-first-th-ltr { } .ui-first-th-rtl { } .ui-jqgrid tr.jqg-first-row-header th { height:auto; border-top:none; padding-bottom: 0; padding-top: 0; border-bottom: none; padding-right: 2px; text-align: center; } .ui-jqgrid tr.jqg-second-row-header th, .ui-jqgrid tr.jqg-third--row-header th { border-top:none; text-align: center; } .ui-jqgrid .ui-th-div-ie { white-space: nowrap; zoom :1; height:17px; } .ui-jqgrid .ui-jqgrid-resize { height:20px !important; position: relative; cursor :e-resize; display: inline; overflow: hidden; } .ui-jqgrid .ui-grid-ico-sort { margin-left:5px; overflow:hidden; position:absolute; right: 3px; font-size:12px; } .ui-jqgrid .ui-icon-asc { margin-top:-3px; } .ui-jqgrid .ui-icon-desc { margin-top:4px; } .ui-jqgrid .ui-i-asc { margin-top:0; } .ui-jqgrid .ui-i-desc { margin-top:0; margin-right:13px; } .ui-jqgrid .ui-single-sort-asc { margin-top:0; } .ui-jqgrid .ui-single-sort-desc {} .ui-jqgrid .ui-jqgrid-sortable { cursor:pointer; } .ui-jqgrid tr.ui-search-toolbar th { } .ui-jqgrid .ui-search-table td.ui-search-clear { } .ui-jqgrid tr.ui-search-toolbar td > input { } .ui-jqgrid tr.ui-search-toolbar select {} /* Body */ .ui-jqgrid .table-bordered, .ui-jqgrid .table-bordered td, .ui-jqgrid .table-bordered th.ui-th-ltr { border-left:0px none !important; } .ui-jqgrid .table-bordered th.ui-th-rtl { border-right:0px none !important; } .ui-jqgrid .table-bordered tr.ui-row-rtl td { border-right:0px none !important; border-left: 1px solid #ddd !important; } div.tablediv > .table-bordered { border-left : 1px solid #ddd !important; } .ui-jqgrid .ui-jqgrid-bdiv table.table-bordered td { border-top: 0px none; } .ui-jqgrid .ui-jqgrid-bdiv { position: relative; margin: 0; padding:0; overflow-x:hidden; text-align:left; } .ui-jqgrid .ui-jqgrid-btable { table-layout: fixed; border-left:none ; border-top:none; margin-bottom: 0px } .ui-jqgrid tr.jqgrow { outline-style: none; } .ui-jqgrid tr.jqgroup { outline-style: none; } .ui-jqgrid tr.jqgrow td { overflow: hidden; white-space: pre; padding-right: 2px; } .ui-jqgrid tr.jqgfirstrow td { height:auto; border-top:none; padding-bottom: 0; padding-top: 0; border-bottom: none; padding-right: 2px; } .ui-jqgrid tr.jqgroup td { } .ui-jqgrid tr.jqfoot td {} .ui-jqgrid tr.ui-row-ltr td {} .ui-jqgrid tr.ui-row-rtl td {} .ui-jqgrid td.jqgrid-rownum { } .ui-jqgrid .ui-jqgrid-resize-mark { width:2px; left:0; background-color:#777; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; display:none; border:0 none; z-index: 99999; } /* Footer */ .ui-jqgrid .ui-jqgrid-sdiv { position: relative; margin: 0; padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important; } .ui-jqgrid .ui-jqgrid-ftable { table-layout:fixed; margin-bottom:0; } .ui-jqgrid tr.footrow td { font-weight: bold; overflow: hidden; white-space:nowrap; padding-right: 2px; border-bottom: 0px none; } .ui-jqgrid tr.footrow-ltr td { text-align:left; } .ui-jqgrid tr.footrow-rtl td { text-align:right; } /* Pager*/ .ui-jqgrid .ui-jqgrid-pager, .ui-jqgrid .ui-jqgrid-toppager { border-left-width: 0px; border-top: 1px solid #ddd; padding : 4px 0px; position: relative; height: auto; white-space: nowrap; overflow: hidden; } .ui-jqgrid .ui-jqgrid-toppager { border-top-width :0; border-bottom : 1px solid #ddd; } .ui-jqgrid .ui-jqgrid-toppager .ui-pager-control, .ui-jqgrid .ui-jqgrid-pager .ui-pager-control { position: relative; border-left: 0; border-bottom: 0; border-top: 0; height: 30px; } .ui-jqgrid .ui-pg-table { position: relative; padding: 1px 0; width:auto; margin: 0; } .ui-jqgrid .ui-pg-table td { font-weight:normal; vertical-align:middle; padding:0px 6px; } .ui-jqgrid .ui-pg-button { height:auto; } .ui-jqgrid .ui-pg-button span { display: block; margin: 2px; float:left; } .ui-jqgrid .ui-pg-button:hover { } .ui-jqgrid .ui-disabled:hover {} .ui-jqgrid .ui-pg-input, .ui-jqgrid .ui-jqgrid-toppager .ui-pg-input { display: inline; height:auto; width: auto; font-size:.9em; margin:0; line-height: inherit; padding: 0px 5px } .ui-jqgrid .ui-pg-selbox, .ui-jqgrid .ui-jqgrid-toppager .ui-pg-selbox { font-size:.9em; line-height:inherit; display:block; height:22px; margin: 0; padding: 3px 0px 3px 3px; border:none; } .ui-jqgrid .ui-separator { height: 18px; border : none; border-left: 2px solid #ccc ; //default } .ui-separator-li { height: 2px; border : none; border-top: 2px solid #ccc ; //default margin: 0; padding: 0; width:100% } .ui-jqgrid .ui-jqgrid-pager .ui-pg-div, .ui-jqgrid .ui-jqgrid-toppager .ui-pg-div { float:left; position:relative; } .ui-jqgrid .ui-jqgrid-pager .ui-pg-button, .ui-jqgrid .ui-jqgrid-toppager .ui-pg-button { cursor:pointer; } .ui-jqgrid .ui-jqgrid-pager .ui-pg-div span, .ui-jqgrid .ui-jqgrid-toppager .ui-pg-div span { float:left; } .ui-jqgrid td input, .ui-jqgrid td select, .ui-jqgrid td textarea { margin: 0; } .ui-jqgrid td textarea { width:auto; height:auto; } .ui-jqgrid .ui-jqgrid-pager .ui-pager-table, .ui-jqgrid .ui-jqgrid-toppager .ui-pager-table { width:100%; table-layout:fixed; height:100%; } .ui-jqgrid .ui-jqgrid-pager .ui-paging-info, .ui-jqgrid .ui-jqgrid-toppager .ui-paging-info { font-weight: normal; height:auto; margin-top:3px; margin-right:4px; display: inline; } .ui-jqgrid .ui-jqgrid-pager .ui-paging-pager, .ui-jqgrid .ui-jqgrid-toppager .ui-paging-pager { table-layout:auto; height:100%; } .ui-jqgrid .ui-jqgrid-pager .navtable, .ui-jqgrid .ui-jqgrid-toppager .navtable { float:left; table-layout:auto; height:100%; } /*Subgrid*/ .ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span { display: block; } .ui-jqgrid .ui-subgrid { margin:0; padding:0; width:100%; } .ui-jqgrid .ui-subgrid table { table-layout: fixed; } .ui-jqgrid .ui-subgrid tr.ui-subtblcell td {} .ui-jqgrid .ui-subgrid td.subgrid-data { border-top: 0 none !important; } .ui-jqgrid .ui-subgrid td.subgrid-cell { vertical-align: middle } .ui-jqgrid a.ui-sghref { text-decoration: none; color : #010101; //default } .ui-jqgrid .ui-th-subgrid {height:20px;} .tablediv > .row { margin: 0 0} /* loading */ .ui-jqgrid .loading { position: absolute; top: 45%; left: 45%; width: auto; z-index:101; padding: 6px; margin: 5px; text-align: center; display: none; border: 1px solid #ddd; //default font-size: 14px; background-color: #d9edf7; } .ui-jqgrid .jqgrid-overlay { display:none; z-index:100; } /* IE * html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');} */ * .jqgrid-overlay iframe { position:absolute; top:0; left:0; z-index:-1; } /* IE width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/ /* end loading div */ /* Toolbar */ .ui-jqgrid .ui-userdata { padding: 4px 0px; overflow: hidden; min-height: 32px; } .ui-jqgrid .ui-userdata-top { border-left-width: 0px; //default border-bottom: 1px solid #ddd; } .ui-jqgrid .ui-userdata-bottom { border-left-width: 0px; //default border-top: 1px solid #ddd; } /*Modal Window */ .ui-jqdialog { } .ui-jqdialog { display: none; width: 500px; position: absolute; //padding: 5px; overflow:visible; } .ui-jqdialog .ui-jqdialog-titlebar { padding: .1em .1em; min-height: 35px; } .ui-jqdialog .ui-jqdialog-title { margin: .3em 0 .2em; font-weight: bold; padding-left :6px; padding-right:6px; } .ui-jqdialog .ui-jqdialog-titlebar-close { position: absolute; top: 0%; margin: 3px 5px 0 0; padding: 8px; cursor:pointer; } .ui-jqdialog .ui-jqdialog-titlebar-close span { } .ui-jqdialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:focus { padding: 8px; } .ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { border: 0; padding: .3em .2em; background: none; height:auto; } .ui-jqdialog .ui-jqconfirm { padding: .4em 1em; border-width:3px; position:absolute; bottom:10px; right:10px; overflow:visible; display:none; height:120px; width:220px; text-align:center; background-color: #fff; border-radius: 4px; -webkit-border-radius: 4px; -moz-border-radius: 4px; } .ui-jqdialog>.ui-resizable-se { } .ui-jqgrid>.ui-resizable-se { } /* end Modal window*/ /* Form edit */ .ui-jqdialog-content .FormGrid { margin: 0 8px 0 8px; overflow:auto; position:relative; } .ui-jqdialog-content .EditTable { width: 100%; margin-bottom:0; } .ui-jqdialog-content .DelTable { width: 100%; margin-bottom:0; } .EditTable td input, .EditTable td select, .EditTable td textarea { width: 98%; display: inline-block; } .EditTable td textarea { width:auto; height:auto; } .EditTable .FormData td { height:37px !important; } .ui-jqdialog-content td.EditButton { text-align: right; padding: 5px 5px 5px 0; } .ui-jqdialog-content td.navButton { text-align: center; border-left: 0 none; border-top: 0 none; border-right: 0 none; padding-bottom:5px; padding-top:5px; } .ui-jqdialog-content input.FormElement { padding: .5em .3em; margin-bottom: 5px } .ui-jqdialog-content select.FormElement { padding:.3em; margin-bottom: 3px; } .ui-jqdialog-content .data-line { padding-top:.1em; border: 0 none; } .ui-jqdialog-content .CaptionTD { vertical-align: middle; border: 0 none; padding: 2px; white-space: nowrap; } .ui-jqdialog-content .DataTD { padding: 2px; border: 0 none; vertical-align: top; } .ui-jqdialog-content .form-view-data { white-space:pre } .fm-button { } .fm-button-icon-left { margin-left: 4px; margin-right: 4px; } .fm-button-icon-right { margin-left: 4px; margin-right: 4px; } .fm-button-icon-left { } .fm-button-icon-right { } #nData, #pData { margin-left: 4px; margin-right: 4px; } #sData span, #cData span { margin-left: 5px; } /* End Eorm edit */ /*.ui-jqgrid .edit-cell {}*/ .ui-jqgrid .selected-row, div.ui-jqgrid .selected-row td { font-style : normal; } /* inline edit actions button*/ .ui-inline-del, .ui-inline-cancel { margin-left: 14px; } .ui-jqgrid .inline-edit-cell {} /* Tree Grid */ .ui-jqgrid .tree-wrap { float: left; position: relative; height: 18px; white-space: nowrap; overflow: hidden; } .ui-jqgrid .tree-minus { position: absolute; height: 18px; width: 18px; overflow: hidden; } .ui-jqgrid .tree-plus { position: absolute; height: 18px; width: 18px; overflow: hidden; } .ui-jqgrid .tree-leaf { position: absolute; height: 18px; width: 18px; overflow: hidden; } .ui-jqgrid .treeclick { cursor: pointer; } /* moda dialog */ * iframe.jqm { position:absolute; top:0; left:0; z-index:-1; } /* width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/ .ui-jqgrid-dnd tr td { border-right-width: 1px; border-right-color: inherit; border-right-style: solid; height:20px } /* RTL Support */ .ui-jqgrid .ui-jqgrid-caption-rtl { text-align: right; } .ui-jqgrid .ui-jqgrid-hbox-rtl { float: right; padding-left: 20px; } .ui-jqgrid .ui-jqgrid-resize-ltr { float: right; margin: -2px -2px -2px 0; height:100%; } .ui-jqgrid .ui-jqgrid-resize-rtl { float: left; margin: -2px -2px -2px -0px; } .ui-jqgrid .ui-sort-rtl { } .ui-jqgrid .tree-wrap-ltr { float: left; } .ui-jqgrid .tree-wrap-rtl { float: right; } .ui-jqgrid .ui-ellipsis { -moz-text-overflow:ellipsis; text-overflow:ellipsis; } /* Toolbar Search Menu. Nav menu */ .ui-search-menu, .ui-nav-menu { position: absolute; padding: 2px 5px; z-index:99999; } .ui-search-menu.ui-menu .ui-menu-item, .ui-nav-menu.ui-menu .ui-menu-item { list-style-image: none; padding-right: 0; padding-left: 0; } .ui-search-menu.ui-menu .ui-menu-item a, .ui-nav-menu.ui-menu .ui-menu-item a { display: block; } .ui-search-menu.ui-menu .ui-menu-item a.g-menu-item:hover, .ui-nav-menu.ui-menu .ui-menu-item a.g-menu-item:hover { margin: -1px; font-weight: normal; } .ui-jqgrid .ui-search-table { padding: 0; border: 0 none; height:20px; width:100%; } .ui-jqgrid .ui-search-table .ui-search-oper { width:20px; } a.g-menu-item, a.soptclass, a.clearsearchclass { cursor: pointer; } .ui-jqgrid .ui-jqgrid-view input, .ui-jqgrid .ui-jqgrid-view select, .ui-jqgrid .ui-jqgrid-view textarea, .ui-jqgrid .ui-jqgrid-view button { //font-size: 11px } .ui-jqgrid .ui-scroll-popup { width: 100px; } .ui-search-table select, .ui-search-table input { padding: 4px 3px; } .ui-disabled { opacity: .35; filter:Alpha(Opacity=35); /* support: IE8 */ background-image: none; } .ui-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); opacity: .3; filter: Alpha(Opacity=30); /* support: IE8 */ } .ui-jqgrid-pager .ui-pg-table .ui-pg-button:hover, .ui-jqgrid-toppager .ui-pg-table .ui-pg-button:hover { background-color: #ddd; } .ui-jqgrid-corner { border-radius: 5px } .ui-resizable-handle { //position: absolute; display: block; left :97%; } .ui-jqdialog .ui-resizable-se { width: 12px; height: 12px; right: -5px; bottom: -5px; background-position: 16px 16px; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-top-corner { border-top-left-radius: 5px; border-top-right-radius: 5px; } .ui-bottom-corner { border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; } .ui-search-table { margin-bottom: 0; } .ui-search-table .columns, .ui-search-table .operators { padding-right: 5px; } .opsel { float :left; width : 100px; margin-right : 5px; } .add-group, .add-rule, .delete-group { width: 14%; margin-right : 5px; } .delete-rule { width : 15px; } ul.ui-search-menu, ul.ui-nav-menu { list-style-type: none; } ul.ui-search-menu li a, ul.ui-nav-menu li a, .soptclass, .clearsearchclass { text-decoration: none; color : #010101; } ul.ui-search-menu li a:hover, ul.ui-nav-menu li a:hover, a.soptclass:hover, a.clearsearchclass:hover { background-color: #ddd; padding: 1px 1px; text-decoration: none; } ul.ui-search-menu li, ul.ui-nav-menu li { padding : 5px 5px; } .ui-menu-item hr { margin-bottom: 0px; margin-top:0px; } .searchFilter .ui-search-table td, .searchFilter .ui-search-table th { border-top: 0px none !important; } .searchFilter .queryresult { margin-bottom: 5px; } .searchFilter .queryresult tr td{ border-top: 0px none; } .ui-search-label { padding-left: 5px; } .frozen-div, .frozen-bdiv { background-color: #fff; } /* .ui-jqgrid .ui-jqgrid-caption, .ui-jqgrid .ui-jqgrid-pager, .ui-jqgrid .ui-jqgrid-toppager, .ui-jqgrid .ui-jqgrid-htable thead th, .ui-jqgrid .ui-userdata-top, .ui-jqgrid .ui-userdata-bottom, .ui-jqgrid .ui-jqgrid-hdiv, .ui-jqdialog .ui-jqdialog-titlebar { background-image: none, linear-gradient(to bottom, #fff 0px, #e0e0e0 100%); background-repeat: repeat-x; border-color: #ccc; text-shadow: 0 1px 0 #fff; } */ ================================================ FILE: src/main/resources/static/css/plugins/multiselect/bootstrap-multiselect.css ================================================ .multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px 3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.radio,.multiselect-container>li>a>label.checkbox{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0} ================================================ FILE: src/main/resources/static/css/plugins/nouslider/jquery.nouislider.css ================================================ /* Functional styling; * These styles are required for noUiSlider to function. * You don't need to change these rules to apply your design. */ .noUi-target, .noUi-target * { -webkit-touch-callout: none; -webkit-user-select: none; -ms-touch-action: none; -ms-user-select: none; -moz-user-select: none; -moz-box-sizing: border-box; box-sizing: border-box; } .noUi-base { width: 100%; height: 100%; position: relative; } .noUi-origin { position: absolute; right: 0; top: 0; left: 0; bottom: 0; } .noUi-handle { position: relative; z-index: 1; } .noUi-stacking .noUi-handle { /* This class is applied to the lower origin when its values is > 50%. */ z-index: 10; } .noUi-stacking + .noUi-origin { /* Fix stacking order in IE7, which incorrectly creates a new context for the origins. */ *z-index: -1; } .noUi-state-tap .noUi-origin { -webkit-transition: left 0.3s, top 0.3s; transition: left 0.3s, top 0.3s; } .noUi-state-drag * { cursor: inherit !important; } /* Slider size and handle placement; */ .noUi-horizontal { height: 18px; } .noUi-horizontal .noUi-handle { width: 34px; height: 28px; left: -17px; top: -6px; } .noUi-horizontal.noUi-extended { padding: 0 15px; } .noUi-horizontal.noUi-extended .noUi-origin { right: -15px; } .noUi-vertical { width: 18px; } .noUi-vertical .noUi-handle { width: 28px; height: 34px; left: -6px; top: -17px; } .noUi-vertical.noUi-extended { padding: 15px 0; } .noUi-vertical.noUi-extended .noUi-origin { bottom: -15px; } /* Styling; */ .noUi-background { background: #FAFAFA; box-shadow: inset 0 1px 1px #f0f0f0; } .noUi-connect { background: #3FB8AF; box-shadow: inset 0 0 3px rgba(51,51,51,0.45); -webkit-transition: background 450ms; transition: background 450ms; } .noUi-origin { border-radius: 2px; } .noUi-target { border-radius: 4px; border: 1px solid #D3D3D3; box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB; } .noUi-target.noUi-connect { box-shadow: inset 0 0 3px rgba(51,51,51,0.45), 0 3px 6px -5px #BBB; } /* Handles and cursors; */ .noUi-dragable { cursor: w-resize; } .noUi-vertical .noUi-dragable { cursor: n-resize; } .noUi-handle { border: 1px solid #D9D9D9; border-radius: 3px; background: #FFF; cursor: default; box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #EBEBEB, 0 3px 6px -3px #BBB; } .noUi-active { box-shadow: inset 0 0 1px #FFF, inset 0 1px 7px #DDD, 0 3px 6px -3px #BBB; } /* Handle stripes; */ .noUi-handle:before, .noUi-handle:after { content: ""; display: block; position: absolute; height: 14px; width: 1px; background: #E8E7E6; left: 14px; top: 6px; } .noUi-handle:after { left: 17px; } .noUi-vertical .noUi-handle:before, .noUi-vertical .noUi-handle:after { width: 14px; height: 1px; left: 6px; top: 14px; } .noUi-vertical .noUi-handle:after { top: 17px; } /* Disabled state; */ [disabled].noUi-connect, [disabled] .noUi-connect { background: #B8B8B8; } [disabled] .noUi-handle { cursor: not-allowed; } ================================================ FILE: src/main/resources/static/css/plugins/plyr/plyr.css ================================================ @-webkit-keyframes progress{to{background-position:40px 0}}@keyframes progress{to{background-position:40px 0}}.sr-only{position:absolute!important;clip:rect(1px,1px,1px,1px);padding:0!important;border:0!important;height:1px!important;width:1px!important;overflow:hidden}.player{position:relative;max-width:100%;min-width:290px}.player,.player *,.player ::after,.player ::before{box-sizing:border-box}.player-video-wrapper{position:relative}.player audio,.player video{width:100%;height:auto;vertical-align:middle}.player-video-embed{padding-bottom:56.25%;height:0}.player-video-embed iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0}.player-captions{display:none;position:absolute;bottom:0;left:0;width:100%;padding:20px 20px 30px;color:#fff;font-size:20px;text-align:center;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.player-captions span{border-radius:2px;padding:3px 10px;background:rgba(0,0,0,.9)}.player-captions span:empty{display:none}@media (min-width:768px){.player-captions{font-size:24px}}.player.captions-active .player-captions{display:block}.player.fullscreen-active .player-captions{font-size:32px}.player-controls{zoom:1;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;position:relative;padding:10px;background:#fff;line-height:1;text-align:center;box-shadow:0 1px 1px rgba(52,63,74,.2)}.player-controls:after,.player-controls:before{content:"";display:table}.player-controls:after{clear:both}.player-controls-right{display:block;margin:10px auto 0}@media (min-width:560px){.player-controls-left{float:left}.player-controls-right{float:right;margin-top:0}}.player-controls button{display:inline-block;vertical-align:middle;margin:0 2px;padding:5px 10px;overflow:hidden;border:0;background:0 0;border-radius:3px;cursor:pointer;color:#6b7d86;transition:background .3s ease,color .3s ease,opacity .3s ease}.player-controls button svg{width:18px;height:18px;display:block;fill:currentColor;transition:fill .3s ease}.player-controls button.tab-focus,.player-controls button:hover{background:#3498db;color:#fff}.player-controls button:focus{outline:0}.player-controls .icon-captions-on,.player-controls .icon-exit-fullscreen,.player-controls .icon-muted{display:none}.player-controls .player-time{display:inline-block;vertical-align:middle;margin-left:10px;color:#6b7d86;font-weight:600;font-size:14px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}.player-controls .player-time+.player-time{display:none}@media (min-width:560px){.player-controls .player-time+.player-time{display:inline-block}}.player-controls .player-time+.player-time::before{content:'\2044';margin-right:10px}.player-tooltip{position:absolute;z-index:2;bottom:100%;margin-bottom:10px;padding:10px 15px;opacity:0;background:#fff;border:1px solid #d6dadd;border-radius:3px;color:#6b7d86;font-size:14px;line-height:1.5;font-weight:600;-webkit-transform:translate(-50%,30px) scale(0);transform:translate(-50%,30px) scale(0);-webkit-transform-origin:50% 100%;transform-origin:50% 100%;transition:-webkit-transform .2s .1s ease,opacity .2s .1s ease;transition:transform .2s .1s ease,opacity .2s .1s ease}.player-tooltip::after{content:'';position:absolute;z-index:1;top:100%;left:50%;display:block;width:10px;height:10px;background:#fff;-webkit-transform:translate(-50%,-50%) rotate(45deg) translateY(1px);transform:translate(-50%,-50%) rotate(45deg) translateY(1px);border:1px solid #d6dadd;border-width:0 1px 1px 0}.player button.tab-focus:focus .player-tooltip,.player button:hover .player-tooltip{opacity:1;-webkit-transform:translate(-50%,0) scale(1);transform:translate(-50%,0) scale(1)}.player button:hover .player-tooltip{z-index:3}.player-progress{position:absolute;bottom:100%;left:0;right:0;width:100%;height:10px;background:rgba(86,93,100,.2)}.player-progress-buffer[value],.player-progress-played[value],.player-progress-seek[type=range]{position:absolute;left:0;top:0;width:100%;height:10px;margin:0;padding:0;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;border:none;background:0 0}.player-progress-buffer[value]::-webkit-progress-bar,.player-progress-played[value]::-webkit-progress-bar{background:0 0}.player-progress-buffer[value]::-webkit-progress-value,.player-progress-played[value]::-webkit-progress-value{background:currentColor}.player-progress-buffer[value]::-moz-progress-bar,.player-progress-played[value]::-moz-progress-bar{background:currentColor}.player-progress-played[value]{z-index:2;color:#3498db}.player-progress-buffer[value]{color:rgba(86,93,100,.25)}.player-progress-seek[type=range]{z-index:4;cursor:pointer;outline:0}.player-progress-seek[type=range]::-webkit-slider-runnable-track{background:0 0;border:0}.player-progress-seek[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:0 0;border:0;width:20px;height:10px}.player-progress-seek[type=range]::-moz-range-track{background:0 0;border:0}.player-progress-seek[type=range]::-moz-range-thumb{-moz-appearance:none;background:0 0;border:0;width:20px;height:10px}.player-progress-seek[type=range]::-ms-track{color:transparent;background:0 0;border:0}.player-progress-seek[type=range]::-ms-fill-lower,.player-progress-seek[type=range]::-ms-fill-upper{background:0 0;border:0}.player-progress-seek[type=range]::-ms-thumb{background:0 0;border:0;width:20px;height:10px}.player-progress-seek[type=range]:focus{outline:0}.player-progress-seek[type=range]::-moz-focus-outer{border:0}.player.loading .player-progress-buffer{-webkit-animation:progress 1s linear infinite;animation:progress 1s linear infinite;background-size:40px 40px;background-repeat:repeat-x;background-color:rgba(86,93,100,.25);background-image:linear-gradient(-45deg,rgba(0,0,0,.15) 25%,transparent 25%,transparent 50%,rgba(0,0,0,.15) 50%,rgba(0,0,0,.15) 75%,transparent 75%,transparent);color:transparent}.player-controls [data-player=pause],.player.playing .player-controls [data-player=play]{display:none}.player.playing .player-controls [data-player=pause]{display:inline-block}.player-volume[type=range]{display:inline-block;vertical-align:middle;-webkit-appearance:none;-moz-appearance:none;width:100px;margin:0 10px 0 0;padding:0;cursor:pointer;background:0 0;border:none}.player-volume[type=range]::-webkit-slider-runnable-track{height:6px;background:#e6e6e6;border:0;border-radius:3px}.player-volume[type=range]::-webkit-slider-thumb{-webkit-appearance:none;margin-top:-3px;height:12px;width:12px;background:#6b7d86;border:0;border-radius:6px;transition:background .3s ease;cursor:ew-resize}.player-volume[type=range]::-moz-range-track{height:6px;background:#e6e6e6;border:0;border-radius:3px}.player-volume[type=range]::-moz-range-thumb{height:12px;width:12px;background:#6b7d86;border:0;border-radius:6px;transition:background .3s ease;cursor:ew-resize}.player-volume[type=range]::-ms-track{height:6px;background:0 0;border-color:transparent;border-width:3px 0;color:transparent}.player-volume[type=range]::-ms-fill-lower,.player-volume[type=range]::-ms-fill-upper{height:6px;background:#e6e6e6;border:0;border-radius:3px}.player-volume[type=range]::-ms-thumb{height:12px;width:12px;background:#6b7d86;border:0;border-radius:6px;transition:background .3s ease;cursor:ew-resize}.player-volume[type=range]:focus{outline:0}.player-volume[type=range]:focus::-webkit-slider-thumb{background:#3498db}.player-volume[type=range]:focus::-moz-range-thumb{background:#3498db}.player-volume[type=range]:focus::-ms-thumb{background:#3498db}.player-audio.ios .player-controls-right,.player.ios .player-volume,.player.ios [data-player=mute]{display:none}.player-audio.ios .player-controls-left{float:none}.player-audio .player-controls{padding-top:20px}.player-audio .player-progress{bottom:auto;top:0;background:#d6dadd}.player-fullscreen,.player.fullscreen-active{position:fixed;top:0;left:0;right:0;bottom:0;height:100%;width:100%;z-index:10000000;background:#000}.player-fullscreen video,.player.fullscreen-active video{height:100%}.player-fullscreen .player-video-wrapper,.player.fullscreen-active .player-video-wrapper{height:100%;width:100%}.player-fullscreen .player-controls,.player.fullscreen-active .player-controls{position:absolute;bottom:0;left:0;right:0}.player-fullscreen.fullscreen-hide-controls.playing .player-controls,.player.fullscreen-active.fullscreen-hide-controls.playing .player-controls{-webkit-transform:translateY(100%) translateY(5px);transform:translateY(100%) translateY(5px);transition:-webkit-transform .3s .2s ease;transition:transform .3s .2s ease}.player-fullscreen.fullscreen-hide-controls.playing.player-hover .player-controls,.player.fullscreen-active.fullscreen-hide-controls.playing.player-hover .player-controls{-webkit-transform:translateY(0);transform:translateY(0)}.player-fullscreen.fullscreen-hide-controls.playing .player-captions,.player.fullscreen-active.fullscreen-hide-controls.playing .player-captions{bottom:5px;transition:bottom .3s .2s ease}.player-fullscreen .player-captions,.player-fullscreen.fullscreen-hide-controls.playing.player-hover .player-captions,.player.fullscreen-active .player-captions,.player.fullscreen-active.fullscreen-hide-controls.playing.player-hover .player-captions{top:auto;bottom:90px}@media (min-width:560px){.player-fullscreen .player-captions,.player-fullscreen.fullscreen-hide-controls.playing.player-hover .player-captions,.player.fullscreen-active .player-captions,.player.fullscreen-active.fullscreen-hide-controls.playing.player-hover .player-captions{bottom:60px}}.player.captions-active .player-controls .icon-captions-on,.player.fullscreen-active .icon-exit-fullscreen,.player.muted .player-controls .icon-muted{display:block}.player [data-player=captions],.player [data-player=fullscreen],.player.captions-active .player-controls .icon-captions-on+svg,.player.fullscreen-active .icon-exit-fullscreen+svg,.player.muted .player-controls .icon-muted+svg{display:none}.player.captions-enabled [data-player=captions],.player.fullscreen-enabled [data-player=fullscreen]{display:inline-block} ================================================ FILE: src/main/resources/static/css/plugins/simditor/simditor.css ================================================ .simditor { position: relative; border: 1px solid #c9d8db; } .simditor .simditor-wrapper { position: relative; background: #ffffff; overflow: hidden; } .simditor .simditor-wrapper .simditor-placeholder { display: none; position: absolute; left: 0; z-index: 0; padding: 22px 15px; font-size: 16px; font-family: arial, sans-serif; line-height: 1.5; color: #999999; background: transparent; } .simditor .simditor-wrapper.toolbar-floating .simditor-toolbar { position: fixed; top: 0; z-index: 10; box-shadow: 0 0 6px rgba(0, 0, 0, 0.1); } .simditor .simditor-wrapper .simditor-image-loading { width: 100%; height: 100%; background: rgba(0, 0, 0, 0.4); position: absolute; top: 0; left: 0; z-index: 2; } .simditor .simditor-wrapper .simditor-image-loading span { width: 30px; height: 30px; background: #ffffff url(../../../img/loading-upload.gif) no-repeat center center; border-radius: 30px; position: absolute; top: 50%; left: 50%; margin: -15px 0 0 -15px; box-shadow: 0 0 8px rgba(0, 0, 0, 0.4); } .simditor .simditor-wrapper .simditor-image-loading.uploading span { background: #ffffff; color: #333333; font-size: 14px; line-height: 30px; text-align: center; } .simditor .simditor-body { padding: 22px 15px 40px; min-height: 300px; outline: none; cursor: text; position: relative; z-index: 1; background: transparent; } .simditor .simditor-body a.selected { background: #b3d4fd; } .simditor .simditor-body a.simditor-mention { cursor: pointer; } .simditor .simditor-body .simditor-table { position: relative; } .simditor .simditor-body .simditor-table.resizing { cursor: col-resize; } .simditor .simditor-body .simditor-table .simditor-resize-handle { position: absolute; left: 0; top: 0; width: 10px; height: 100%; cursor: col-resize; } .simditor .simditor-body pre { /*min-height: 28px;*/ box-sizing: border-box; -moz-box-sizing: border-box; word-wrap: break-word !important; white-space: pre-wrap !important; } .simditor .simditor-body img { cursor: pointer; } .simditor .simditor-body img.selected { box-shadow: 0 0 0 4px #cccccc; } .simditor .simditor-paste-area, .simditor .simditor-clean-paste-area { background: transparent; border: none; outline: none; resize: none; padding: 0; margin: 0; } .simditor .simditor-toolbar { border-bottom: 1px solid #eeeeee; background: #ffffff; width: 100%; } .simditor .simditor-toolbar > ul { margin: 0; padding: 0 0 0 6px; list-style: none; } .simditor .simditor-toolbar > ul:after { content: ""; display: table; clear: both; } .simditor .simditor-toolbar > ul > li { position: relative; float: left; } .simditor .simditor-toolbar > ul > li > span.separator { display: block; float: left; background: #cfcfcf; width: 1px; height: 18px; margin: 11px 15px; } .simditor .simditor-toolbar > ul > li > .toolbar-item { display: block; float: left; width: 50px; height: 40px; outline: none; color: #333333; font-size: 15px; line-height: 40px; text-align: center; text-decoration: none; } .simditor .simditor-toolbar > ul > li > .toolbar-item span { opacity: 0.6; } .simditor .simditor-toolbar > ul > li > .toolbar-item span.fa { display: inline; line-height: normal; } .simditor .simditor-toolbar > ul > li > .toolbar-item:hover span { opacity: 1; } .simditor .simditor-toolbar > ul > li > .toolbar-item.active { background: #eeeeee; } .simditor .simditor-toolbar > ul > li > .toolbar-item.active span { opacity: 1; } .simditor .simditor-toolbar > ul > li > .toolbar-item.disabled { cursor: default; } .simditor .simditor-toolbar > ul > li > .toolbar-item.disabled span { opacity: 0.3; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title span:before { content: "T"; font-size: 19px; font-weight: bold; font-family: 'Times New Roman'; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h1 span:before { content: 'H1'; font-size: 18px; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h2 span:before { content: 'H2'; font-size: 18px; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h3 span:before { content: 'H3'; font-size: 18px; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color { font-size: 14px; position: relative; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color span:before { position: relative; top: -2px; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color:after { content: ''; display: block; width: 14px; height: 4px; background: #cccccc; position: absolute; top: 26px; left: 50%; margin: 0 0 0 -7px; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color:hover:after { background: #999999; } .simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color.disabled:after { background: #dfdfdf; } .simditor .simditor-toolbar > ul > li.menu-on .toolbar-item { position: relative; z-index: 21; background: #ffffff; box-shadow: 0 -3px 3px rgba(0, 0, 0, 0.2); } .simditor .simditor-toolbar > ul > li.menu-on .toolbar-item span { opacity: 1; } .simditor .simditor-toolbar > ul > li.menu-on .toolbar-item.toolbar-item-color:after { background: #999999; } .simditor .simditor-toolbar > ul > li.menu-on .toolbar-menu { display: block; } .simditor .simditor-toolbar .toolbar-menu { display: none; position: absolute; top: 40px; left: 0; z-index: 20; background: #ffffff; text-align: left; box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); } .simditor .simditor-toolbar .toolbar-menu ul { min-width: 160px; list-style: none; margin: 0; padding: 10px 1px; } .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item { display: block; font-size: 16px; line-height: 2em; padding: 0 10px; text-decoration: none; color: #666666; } .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item:hover { background: #f6f6f6; } .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h1 { font-size: 24px; color: #333333; } .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h2 { font-size: 22px; color: #333333; } .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h3 { font-size: 20px; color: #333333; } .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h4 { font-size: 18px; color: #333333; } .simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h5 { font-size: 16px; color: #333333; } .simditor .simditor-toolbar .toolbar-menu ul > li .separator { display: block; border-top: 1px solid #cccccc; height: 0; line-height: 0; font-size: 0; margin: 6px 0; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color { width: 96px; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list { height: 40px; margin: 10px 6px 6px 10px; padding: 0; min-width: 0; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li { float: left; margin: 0 4px 4px 0; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color { display: block; width: 16px; height: 16px; background: #dfdfdf; border-radius: 2px; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color:hover { opacity: 0.8; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color.font-color-default { background: #333333; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-1 { background: #E33737; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-2 { background: #e28b41; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-3 { background: #c8a732; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-4 { background: #209361; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-5 { background: #418caf; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-6 { background: #aa8773; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-7 { background: #999999; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table { background: #ffffff; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table { border: none; border-collapse: collapse; border-spacing: 0; table-layout: fixed; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td { height: 16px; padding: 0; border: 2px solid #ffffff; background: #f3f3f3; cursor: pointer; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td:before { width: 16px; display: block; content: ""; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td.selected { background: #cfcfcf; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table { display: none; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table ul { min-width: 240px; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image { position: relative; overflow: hidden; } .simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image input[type=file] { position: absolute; right: 0px; top: 0px; opacity: 0; font-size: 100px; cursor: pointer; } .simditor .simditor-popover { display: none; padding: 5px 8px 0; background: #ffffff; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4); border-radius: 2px; position: absolute; z-index: 2; } .simditor .simditor-popover .settings-field { margin: 0 0 5px 0; font-size: 12px; height: 25px; line-height: 25px; } .simditor .simditor-popover .settings-field label { margin: 0 8px 0 0; float: left; } .simditor .simditor-popover .settings-field input[type=text] { float: left; width: 200px; box-sizing: border-box; font-size: 12px; } .simditor .simditor-popover .settings-field input[type=text].image-size { width: 87px; } .simditor .simditor-popover .settings-field .times { float: left; width: 26px; font-size: 12px; text-align: center; } .simditor .simditor-popover.link-popover .btn-unlink, .simditor .simditor-popover.image-popover .btn-upload, .simditor .simditor-popover.image-popover .btn-restore { float: left; margin: 0 0 0 8px; color: #333333; font-size: 14px; outline: 0; } .simditor .simditor-popover.link-popover .btn-unlink span, .simditor .simditor-popover.image-popover .btn-upload span, .simditor .simditor-popover.image-popover .btn-restore span { opacity: 0.6; } .simditor .simditor-popover.link-popover .btn-unlink:hover span, .simditor .simditor-popover.image-popover .btn-upload:hover span, .simditor .simditor-popover.image-popover .btn-restore:hover span { opacity: 1; } .simditor .simditor-popover.image-popover .btn-upload { position: relative; display: inline-block; overflow: hidden; } .simditor .simditor-popover.image-popover .btn-upload input[type=file] { position: absolute; right: 0px; top: 0px; opacity: 0; height: 100%; width: 28px; } .simditor.simditor-mobile .simditor-toolbar > ul > li > .toolbar-item { width: 46px; } .simditor.simditor-mobile .simditor-wrapper.toolbar-floating .simditor-toolbar { position: absolute; top: 0; z-index: 10; box-shadow: 0 0 6px rgba(0, 0, 0, 0.1); } .simditor .simditor-body, .editor-style { font-size: 16px; font-family: arial, sans-serif; line-height: 1.6; color: #333; outline: none; word-wrap: break-word; } .simditor .simditor-body > :first-child, .editor-style > :first-child { margin-top: 0 !important; } .simditor .simditor-body a, .editor-style a { color: #4298BA; text-decoration: none; word-break: break-all; } .simditor .simditor-body a:visited, .editor-style a:visited { color: #4298BA; } .simditor .simditor-body a:hover, .editor-style a:hover { color: #0F769F; } .simditor .simditor-body a:active, .editor-style a:active { color: #9E792E; } .simditor .simditor-body a:hover, .simditor .simditor-body a:active, .editor-style a:hover, .editor-style a:active { outline: 0; } .simditor .simditor-body h1, .simditor .simditor-body h2, .simditor .simditor-body h3, .simditor .simditor-body h4, .simditor .simditor-body h5, .simditor .simditor-body h6, .editor-style h1, .editor-style h2, .editor-style h3, .editor-style h4, .editor-style h5, .editor-style h6 { font-weight: normal; margin: 40px 0 20px; color: #000000; } .simditor .simditor-body h1, .editor-style h1 { font-size: 24px; } .simditor .simditor-body h2, .editor-style h2 { font-size: 22px; } .simditor .simditor-body h3, .editor-style h3 { font-size: 20px; } .simditor .simditor-body h4, .editor-style h4 { font-size: 18px; } .simditor .simditor-body h5, .editor-style h5 { font-size: 16px; } .simditor .simditor-body h6, .editor-style h6 { font-size: 16px; } .simditor .simditor-body p, .simditor .simditor-body div, .editor-style p, .editor-style div { word-wrap: break-word; margin: 0 0 15px 0; color: #333; word-wrap: break-word; } .simditor .simditor-body b, .simditor .simditor-body strong, .editor-style b, .editor-style strong { font-weight: bold; } .simditor .simditor-body i, .simditor .simditor-body em, .editor-style i, .editor-style em { font-style: italic; } .simditor .simditor-body u, .editor-style u { text-decoration: underline; } .simditor .simditor-body strike, .simditor .simditor-body del, .editor-style strike, .editor-style del { text-decoration: line-through; } .simditor .simditor-body ul, .simditor .simditor-body ol, .editor-style ul, .editor-style ol { list-style: disc outside none; margin: 15px 0; padding: 0 0 0 40px; line-height: 1.6; } .simditor .simditor-body ul ul, .simditor .simditor-body ul ol, .simditor .simditor-body ol ul, .simditor .simditor-body ol ol, .editor-style ul ul, .editor-style ul ol, .editor-style ol ul, .editor-style ol ol { padding-left: 30px; } .simditor .simditor-body ul ul, .simditor .simditor-body ol ul, .editor-style ul ul, .editor-style ol ul { list-style: circle outside none; } .simditor .simditor-body ul ul ul, .simditor .simditor-body ol ul ul, .editor-style ul ul ul, .editor-style ol ul ul { list-style: square outside none; } .simditor .simditor-body ol, .editor-style ol { list-style: decimal; } .simditor .simditor-body blockquote, .editor-style blockquote { border-left: 6px solid #ddd; padding: 5px 0 5px 10px; margin: 15px 0 15px 15px; } .simditor .simditor-body blockquote > :first-child, .editor-style blockquote > :first-child { margin-top: 0; } .simditor .simditor-body pre, .editor-style pre { padding: 10px 5px 10px 10px; margin: 15px 0; display: block; line-height: 18px; background: #F0F0F0; border-radius: 3px; font-size: 13px; font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace; overflow-x: auto; white-space: nowrap; } .simditor .simditor-body code, .editor-style code { display: inline-block; padding: 0 4px; margin: 0 5px; background: #eeeeee; border-radius: 3px; font-size: 13px; font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace; } .simditor .simditor-body hr, .editor-style hr { display: block; height: 0px; border: 0; border-top: 1px solid #ccc; margin: 15px 0; padding: 0; } .simditor .simditor-body table, .editor-style table { width: 100%; table-layout: fixed; border-collapse: collapse; border-spacing: 0; margin: 15px 0; } .simditor .simditor-body table thead, .editor-style table thead { background-color: #f9f9f9; } .simditor .simditor-body table td, .editor-style table td { min-width: 40px; height: 30px; border: 1px solid #ccc; vertical-align: top; padding: 2px 4px; box-sizing: border-box; } .simditor .simditor-body table td.active, .editor-style table td.active { background-color: #ffffee; } .simditor .simditor-body img, .editor-style img { margin: 0 5px; vertical-align: middle; } .simditor .simditor-body *[data-indent="0"], .editor-style *[data-indent="0"] { margin-left: 0px; } .simditor .simditor-body *[data-indent="1"], .editor-style *[data-indent="1"] { margin-left: 40px; } .simditor .simditor-body *[data-indent="2"], .editor-style *[data-indent="2"] { margin-left: 80px; } .simditor .simditor-body *[data-indent="3"], .editor-style *[data-indent="3"] { margin-left: 120px; } .simditor .simditor-body *[data-indent="4"], .editor-style *[data-indent="4"] { margin-left: 160px; } .simditor .simditor-body *[data-indent="5"], .editor-style *[data-indent="5"] { margin-left: 200px; } .simditor .simditor-body *[data-indent="6"], .editor-style *[data-indent="6"] { margin-left: 240px; } .simditor .simditor-body *[data-indent="7"], .editor-style *[data-indent="7"] { margin-left: 280px; } .simditor .simditor-body *[data-indent="8"], .editor-style *[data-indent="8"] { margin-left: 320px; } .simditor .simditor-body *[data-indent="9"], .editor-style *[data-indent="9"] { margin-left: 360px; } .simditor .simditor-body *[data-indent="10"], .editor-style *[data-indent="10"] { margin-left: 400px; } ================================================ FILE: src/main/resources/static/css/plugins/steps/jquery.steps.css ================================================ /* Common */ .wizard, .tabcontrol { display: block; width: 100%; overflow: hidden; } .wizard a, .tabcontrol a { outline: 0; } .wizard ul, .tabcontrol ul { list-style: none !important; padding: 0; margin: 0; } .wizard ul > li, .tabcontrol ul > li { display: block; padding: 0; } /* Accessibility */ .wizard > .steps .current-info, .tabcontrol > .steps .current-info { position: absolute; left: -999em; } .wizard > .content > .title, .tabcontrol > .content > .title { position: absolute; left: -999em; } /* Wizard */ .wizard > .steps { position: relative; display: block; width: 100%; } .wizard.vertical > .steps { display: inline; float: left; width: 30%; } .wizard > .steps > ul > li { width: 25%; } .wizard > .steps > ul > li, .wizard > .actions > ul > li { float: left; } .wizard.vertical > .steps > ul > li { float: none; width: 100%; } .wizard > .steps a, .wizard > .steps a:hover, .wizard > .steps a:active { display: block; width: auto; margin: 0 0.5em 0.5em; padding: 8px; text-decoration: none; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .wizard > .steps .disabled a, .wizard > .steps .disabled a:hover, .wizard > .steps .disabled a:active { background: #eee; color: #aaa; cursor: default; } .wizard > .steps .current a, .wizard > .steps .current a:hover, .wizard > .steps .current a:active { background: #1AB394; color: #fff; cursor: default; } .wizard > .steps .done a, .wizard > .steps .done a:hover, .wizard > .steps .done a:active { background: #6fd1bd; color: #fff; } .wizard > .steps .error a, .wizard > .steps .error a:hover, .wizard > .steps .error a:active { background: #ED5565 ; color: #fff; } .wizard > .content { background: #eee; display: block; margin: 5px 5px 10px 5px; min-height: 120px; overflow: hidden; position: relative; width: auto; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .wizard-big.wizard > .content { min-height: 320px; } .wizard.vertical > .content { display: inline; float: left; margin: 0 2.5% 0.5em 2.5%; width: 65%; } .wizard > .content > .body { float: left; position: absolute; width: 95%; height: 95%; padding: 2.5%; } .wizard > .content > .body ul { list-style: disc !important; } .wizard > .content > .body ul > li { display: list-item; } .wizard > .content > .body > iframe { border: 0 none; width: 100%; height: 100%; } .wizard > .content > .body input { display: block; border: 1px solid #ccc; } .wizard > .content > .body input[type="checkbox"] { display: inline-block; } .wizard > .content > .body input.error { background: rgb(251, 227, 228); border: 1px solid #fbc2c4; color: #8a1f11; } .wizard > .content > .body label { display: inline-block; margin-bottom: 0.5em; } .wizard > .content > .body label.error { color: #8a1f11; display: inline-block; margin-left: 1.5em; } .wizard > .actions { position: relative; display: block; text-align: right; width: 100%; } .wizard.vertical > .actions { display: inline; float: right; margin: 0 2.5%; width: 95%; } .wizard > .actions > ul { display: inline-block; text-align: right; } .wizard > .actions > ul > li { margin: 0 0.5em; } .wizard.vertical > .actions > ul > li { margin: 0 0 0 1em; } .wizard > .actions a, .wizard > .actions a:hover, .wizard > .actions a:active { background: #1AB394; color: #fff; display: block; padding: 0.5em 1em; text-decoration: none; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .wizard > .actions .disabled a, .wizard > .actions .disabled a:hover, .wizard > .actions .disabled a:active { background: #eee; color: #aaa; } .wizard > .loading { } .wizard > .loading .spinner { } /* Tabcontrol */ .tabcontrol > .steps { position: relative; display: block; width: 100%; } .tabcontrol > .steps > ul { position: relative; margin: 6px 0 0 0; top: 1px; z-index: 1; } .tabcontrol > .steps > ul > li { float: left; margin: 5px 2px 0 0; padding: 1px; -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; } .tabcontrol > .steps > ul > li:hover { background: #edecec; border: 1px solid #bbb; padding: 0; } .tabcontrol > .steps > ul > li.current { background: #fff; border: 1px solid #bbb; border-bottom: 0 none; padding: 0 0 1px 0; margin-top: 0; } .tabcontrol > .steps > ul > li > a { color: #5f5f5f; display: inline-block; border: 0 none; margin: 0; padding: 10px 30px; text-decoration: none; } .tabcontrol > .steps > ul > li > a:hover { text-decoration: none; } .tabcontrol > .steps > ul > li.current > a { padding: 15px 30px 10px 30px; } .tabcontrol > .content { position: relative; display: inline-block; width: 100%; height: 35em; overflow: hidden; border-top: 1px solid #bbb; padding-top: 20px; } .tabcontrol > .content > .body { float: left; position: absolute; width: 95%; height: 95%; padding: 2.5%; } .tabcontrol > .content > .body ul { list-style: disc !important; } .tabcontrol > .content > .body ul > li { display: list-item; } ================================================ FILE: src/main/resources/static/css/plugins/summernote/summernote-0.8.8.css ================================================ @font-face{font-family:"summernote";font-style:normal;font-weight:normal;src:url("./font/summernote.eot?0d0d5fac99cc8774d89eb08b1a8323c4");src:url("./font/summernote.eot?#iefix") format("embedded-opentype"),url("./font/summernote.woff?0d0d5fac99cc8774d89eb08b1a8323c4") format("woff"),url("./font/summernote.ttf?0d0d5fac99cc8774d89eb08b1a8323c4") format("truetype")}[class^="note-icon-"]:before,[class*=" note-icon-"]:before{display:inline-block;font:normal normal normal 14px summernote;font-size:inherit;-webkit-font-smoothing:antialiased;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;speak:none;-moz-osx-font-smoothing:grayscale}.note-icon-align-center:before,.note-icon-align-indent:before,.note-icon-align-justify:before,.note-icon-align-left:before,.note-icon-align-outdent:before,.note-icon-align-right:before,.note-icon-align:before,.note-icon-arrow-circle-down:before,.note-icon-arrow-circle-left:before,.note-icon-arrow-circle-right:before,.note-icon-arrow-circle-up:before,.note-icon-arrows-alt:before,.note-icon-arrows-h:before,.note-icon-arrows-v:before,.note-icon-bold:before,.note-icon-caret:before,.note-icon-chain-broken:before,.note-icon-circle:before,.note-icon-close:before,.note-icon-code:before,.note-icon-col-after:before,.note-icon-col-before:before,.note-icon-col-remove:before,.note-icon-eraser:before,.note-icon-font:before,.note-icon-frame:before,.note-icon-italic:before,.note-icon-link:before,.note-icon-magic:before,.note-icon-menu-check:before,.note-icon-minus:before,.note-icon-orderedlist:before,.note-icon-pencil:before,.note-icon-picture:before,.note-icon-question:before,.note-icon-redo:before,.note-icon-row-above:before,.note-icon-row-below:before,.note-icon-row-remove:before,.note-icon-special-character:before,.note-icon-square:before,.note-icon-strikethrough:before,.note-icon-subscript:before,.note-icon-summernote:before,.note-icon-superscript:before,.note-icon-table:before,.note-icon-text-height:before,.note-icon-trash:before,.note-icon-underline:before,.note-icon-undo:before,.note-icon-unorderedlist:before,.note-icon-video:before{display:inline-block;font-family:"summernote";font-style:normal;font-weight:normal;text-decoration:inherit}.note-icon-align-center:before{content:"\f101"}.note-icon-align-indent:before{content:"\f102"}.note-icon-align-justify:before{content:"\f103"}.note-icon-align-left:before{content:"\f104"}.note-icon-align-outdent:before{content:"\f105"}.note-icon-align-right:before{content:"\f106"}.note-icon-align:before{content:"\f107"}.note-icon-arrow-circle-down:before{content:"\f108"}.note-icon-arrow-circle-left:before{content:"\f109"}.note-icon-arrow-circle-right:before{content:"\f10a"}.note-icon-arrow-circle-up:before{content:"\f10b"}.note-icon-arrows-alt:before{content:"\f10c"}.note-icon-arrows-h:before{content:"\f10d"}.note-icon-arrows-v:before{content:"\f10e"}.note-icon-bold:before{content:"\f10f"}.note-icon-caret:before{content:"\f110"}.note-icon-chain-broken:before{content:"\f111"}.note-icon-circle:before{content:"\f112"}.note-icon-close:before{content:"\f113"}.note-icon-code:before{content:"\f114"}.note-icon-col-after:before{content:"\f115"}.note-icon-col-before:before{content:"\f116"}.note-icon-col-remove:before{content:"\f117"}.note-icon-eraser:before{content:"\f118"}.note-icon-font:before{content:"\f119"}.note-icon-frame:before{content:"\f11a"}.note-icon-italic:before{content:"\f11b"}.note-icon-link:before{content:"\f11c"}.note-icon-magic:before{content:"\f11d"}.note-icon-menu-check:before{content:"\f11e"}.note-icon-minus:before{content:"\f11f"}.note-icon-orderedlist:before{content:"\f120"}.note-icon-pencil:before{content:"\f121"}.note-icon-picture:before{content:"\f122"}.note-icon-question:before{content:"\f123"}.note-icon-redo:before{content:"\f124"}.note-icon-row-above:before{content:"\f125"}.note-icon-row-below:before{content:"\f126"}.note-icon-row-remove:before{content:"\f127"}.note-icon-special-character:before{content:"\f128"}.note-icon-square:before{content:"\f129"}.note-icon-strikethrough:before{content:"\f12a"}.note-icon-subscript:before{content:"\f12b"}.note-icon-summernote:before{content:"\f12c"}.note-icon-superscript:before{content:"\f12d"}.note-icon-table:before{content:"\f12e"}.note-icon-text-height:before{content:"\f12f"}.note-icon-trash:before{content:"\f130"}.note-icon-underline:before{content:"\f131"}.note-icon-undo:before{content:"\f132"}.note-icon-unorderedlist:before{content:"\f133"}.note-icon-video:before{content:"\f134"}.note-editor{position:relative}.note-editor .note-dropzone{position:absolute;z-index:100;display:none;color:#87cefa;background-color:white;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:bold;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:0}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area img.note-float-left{margin-right:10px}.note-editor .note-editing-area img.note-float-right{margin-left:10px}.note-editor.note-frame{border:1px solid #a9a9a9}.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable{padding:10px;overflow:auto;color:#000;background-color:#fff}.note-editor.note-frame .note-editing-area .note-editable[contenteditable="false"]{background-color:#e5e5e5}.note-editor.note-frame .note-editing-area .note-codable{display:none;width:100%;padding:10px;margin-bottom:0;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;color:#ccc;background-color:#222;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;resize:none}.note-editor.note-frame.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100%!important}.note-editor.note-frame.fullscreen .note-editable{background-color:white}.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-statusbar{background-color:#f5f5f5;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.note-editor.note-frame .note-statusbar .note-resizebar{width:100%;height:8px;padding-top:1px;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #a9a9a9}.note-editor.note-frame .note-placeholder{padding:10px}.note-popover.popover{max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}.note-popover.popover .arrow{left:20px!important}.note-popover .popover-content,.panel-heading.note-toolbar{padding:0 0 5px 5px;margin:0}.note-popover .popover-content>.btn-group,.panel-heading.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover-content .btn-group .note-table,.panel-heading.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute!important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative!important;z-index:1;width:5em;height:5em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute!important;z-index:2;width:1em;height:1em;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat}.note-popover .popover-content .note-style h1,.panel-heading.note-toolbar .note-style h1,.note-popover .popover-content .note-style h2,.panel-heading.note-toolbar .note-style h2,.note-popover .popover-content .note-style h3,.panel-heading.note-toolbar .note-style h3,.note-popover .popover-content .note-style h4,.panel-heading.note-toolbar .note-style h4,.note-popover .popover-content .note-style h5,.panel-heading.note-toolbar .note-style h5,.note-popover .popover-content .note-style h6,.panel-heading.note-toolbar .note-style h6,.note-popover .popover-content .note-style blockquote,.panel-heading.note-toolbar .note-style blockquote{margin:0}.note-popover .popover-content .note-color .dropdown-toggle,.panel-heading.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .dropdown-menu,.panel-heading.note-toolbar .note-color .dropdown-menu{min-width:337px}.note-popover .popover-content .note-color .dropdown-menu .note-palette,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette{display:inline-block;width:160px;margin:0}.note-popover .popover-content .note-color .dropdown-menu .note-palette:first-child,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette:first-child{margin:0 5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-palette-title,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #eee}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset{width:100%;padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-row,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-row{height:20px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset:hover,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset:hover{background:#eee}.note-popover .popover-content .note-para .dropdown-menu,.panel-heading.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover-content .note-para .dropdown-menu>div:first-child,.panel-heading.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover-content .dropdown-menu,.panel-heading.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover-content .dropdown-menu.right,.panel-heading.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .dropdown-menu.right::before,.panel-heading.note-toolbar .dropdown-menu.right::before{right:9px;left:auto!important}.note-popover .popover-content .dropdown-menu.right::after,.panel-heading.note-toolbar .dropdown-menu.right::after{right:10px;left:auto!important}.note-popover .popover-content .dropdown-menu.note-check li a i,.panel-heading.note-toolbar .dropdown-menu.note-check li a i{color:deepskyblue;visibility:hidden}.note-popover .popover-content .dropdown-menu.note-check li a.checked i,.panel-heading.note-toolbar .dropdown-menu.note-check li a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.panel-heading.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.panel-heading.note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.panel-heading.note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:1px solid #fff}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.panel-heading.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #000}.note-dialog>div{display:none}.note-dialog .form-group{margin-right:0;margin-left:0}.note-dialog .note-modal-form{margin:0}.note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:lightgray;text-align:center;border:4px dashed lightgray}@-moz-document url-prefix(){.note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid black}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:black;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle{width:7px;height:7px;border:1px solid black}.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid black}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;background-color:white;border:1px solid black}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:0;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:white;background-color:black;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;padding:3px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:white;text-decoration:none;white-space:nowrap;cursor:pointer;background-color:#428bca;outline:0} ================================================ FILE: src/main/resources/static/css/plugins/summernote/summernote-bs3.css ================================================ .note-editor { /*! normalize.css v2.1.3 | MIT License | git.io/normalize */ } .note-editor article, .note-editor aside, .note-editor details, .note-editor figcaption, .note-editor figure, .note-editor footer, .note-editor header, .note-editor hgroup, .note-editor main, .note-editor nav, .note-editor section, .note-editor summary { display: block; } .note-editor audio, .note-editor canvas, .note-editor video { display: inline-block; } .note-editor audio:not([controls]) { display: none; height: 0; } .note-editor [hidden], .note-editor template { display: none; } .note-editor html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } .note-editor body { margin: 0; } .note-editor a { background: transparent; } .note-editor a:focus { outline: thin dotted; } .note-editor a:active, .note-editor a:hover { outline: 0; } .note-editor h1 { font-size: 2em; margin: 0.67em 0; } .note-editor abbr[title] { border-bottom: 1px dotted; } .note-editor b, .note-editor strong { font-weight: bold; } .note-editor dfn { font-style: italic; } .note-editor hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } .note-editor mark { background: #ff0; color: #000; } .note-editor code, .note-editor kbd, .note-editor pre, .note-editor samp { font-family: monospace, serif; font-size: 1em; } .note-editor pre { white-space: pre-wrap; } .note-editor q { quotes: "\201C" "\201D" "\2018" "\2019"; } .note-editor small { font-size: 80%; } .note-editor sub, .note-editor sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } .note-editor sup { top: -0.5em; } .note-editor sub { bottom: -0.25em; } .note-editor img { border: 0; } .note-editor svg:not(:root) { overflow: hidden; } .note-editor figure { margin: 0; } .note-editor fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } .note-editor legend { border: 0; padding: 0; } .note-editor button, .note-editor input, .note-editor select, .note-editor textarea { font-family: inherit; font-size: 100%; margin: 0; } .note-editor button, .note-editor input { line-height: normal; } .note-editor button, .note-editor select { text-transform: none; } .note-editor button, .note-editor html input[type="button"], .note-editor input[type="reset"], .note-editor input[type="submit"] { -webkit-appearance: button; cursor: pointer; } .note-editor button[disabled], .note-editor html input[disabled] { cursor: default; } .note-editor input[type="checkbox"], .note-editor input[type="radio"] { box-sizing: border-box; padding: 0; } .note-editor input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; } .note-editor input[type="search"]::-webkit-search-cancel-button, .note-editor input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } .note-editor button::-moz-focus-inner, .note-editor input::-moz-focus-inner { border: 0; padding: 0; } .note-editor textarea { overflow: auto; vertical-align: top; } .note-editor table { border-collapse: collapse; border-spacing: 0; } @media print { .note-editor * { text-shadow: none !important; color: #000 !important; background: transparent !important; box-shadow: none !important; } .note-editor a, .note-editor a:visited { text-decoration: underline; } .note-editor a[href]:after { content: " (" attr(href) ")"; } .note-editor abbr[title]:after { content: " (" attr(title) ")"; } .note-editor .ir a:after, .note-editor a[href^="javascript:"]:after, .note-editor a[href^="#"]:after { content: ""; } .note-editor pre, .note-editor blockquote { border: 1px solid #999; page-break-inside: avoid; } .note-editor thead { display: table-header-group; } .note-editor tr, .note-editor img { page-break-inside: avoid; } .note-editor img { max-width: 100% !important; } @page { margin: 2cm .5cm; } .note-editor p, .note-editor h2, .note-editor h3 { orphans: 3; widows: 3; } .note-editor h2, .note-editor h3 { page-break-after: avoid; } .note-editor .navbar { display: none; } .note-editor .table td, .note-editor .table th { background-color: #fff !important; } .note-editor .btn > .caret, .note-editor .dropup > .btn > .caret { border-top-color: #000 !important; } .note-editor .label { border: 1px solid #000; } .note-editor .table { border-collapse: collapse !important; } .note-editor .table-bordered th, .note-editor .table-bordered td { border: 1px solid #ddd !important; } } .note-editor *, .note-editor *:before, .note-editor *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .note-editor html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .note-editor body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.428571429; color: #333333; background-color: #ffffff; } .note-editor input, .note-editor button, .note-editor select, .note-editor textarea { font-family: inherit; font-size: inherit; line-height: inherit; } .note-editor a { color: #428bca; text-decoration: none; } .note-editor a:hover, .note-editor a:focus { color: #2a6496; text-decoration: underline; } .note-editor a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .note-editor img { vertical-align: middle; } .note-editor .img-responsive { display: block; max-width: 100%; height: auto; } .note-editor .img-rounded { border-radius: 6px; } .note-editor .img-thumbnail { padding: 4px; line-height: 1.428571429; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .note-editor .img-circle { border-radius: 50%; } .note-editor hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eeeeee; } .note-editor .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .note-editor p { margin: 0 0 10px; } .note-editor .lead { margin-bottom: 20px; font-size: 16px; font-weight: 200; line-height: 1.4; } @media (min-width: 768px) { .note-editor .lead { font-size: 21px; } } .note-editor small, .note-editor .small { font-size: 85%; } .note-editor cite { font-style: normal; } .note-editor .text-muted { color: #999999; } .note-editor .text-primary { color: #428bca; } .note-editor .text-primary:hover { color: #3071a9; } .note-editor .text-warning { color: #c09853; } .note-editor .text-warning:hover { color: #a47e3c; } .note-editor .text-danger { color: #b94a48; } .note-editor .text-danger:hover { color: #953b39; } .note-editor .text-success { color: #468847; } .note-editor .text-success:hover { color: #356635; } .note-editor .text-info { color: #3a87ad; } .note-editor .text-info:hover { color: #2d6987; } .note-editor .text-left { text-align: left; } .note-editor .text-right { text-align: right; } .note-editor .text-center { text-align: center; } .note-editor h1, .note-editor h2, .note-editor h3, .note-editor h4, .note-editor h5, .note-editor h6, .note-editor .h1, .note-editor .h2, .note-editor .h3, .note-editor .h4, .note-editor .h5, .note-editor .h6 { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: inherit; } .note-editor h1 small, .note-editor h2 small, .note-editor h3 small, .note-editor h4 small, .note-editor h5 small, .note-editor h6 small, .note-editor .h1 small, .note-editor .h2 small, .note-editor .h3 small, .note-editor .h4 small, .note-editor .h5 small, .note-editor .h6 small, .note-editor h1 .small, .note-editor h2 .small, .note-editor h3 .small, .note-editor h4 .small, .note-editor h5 .small, .note-editor h6 .small, .note-editor .h1 .small, .note-editor .h2 .small, .note-editor .h3 .small, .note-editor .h4 .small, .note-editor .h5 .small, .note-editor .h6 .small { font-weight: normal; line-height: 1; color: #999999; } .note-editor h1, .note-editor h2, .note-editor h3 { margin-top: 20px; margin-bottom: 10px; } .note-editor h1 small, .note-editor h2 small, .note-editor h3 small, .note-editor h1 .small, .note-editor h2 .small, .note-editor h3 .small { font-size: 65%; } .note-editor h4, .note-editor h5, .note-editor h6 { margin-top: 10px; margin-bottom: 10px; } .note-editor h4 small, .note-editor h5 small, .note-editor h6 small, .note-editor h4 .small, .note-editor h5 .small, .note-editor h6 .small { font-size: 75%; } .note-editor h1, .note-editor .h1 { font-size: 36px; } .note-editor h2, .note-editor .h2 { font-size: 30px; } .note-editor h3, .note-editor .h3 { font-size: 24px; } .note-editor h4, .note-editor .h4 { font-size: 18px; } .note-editor h5, .note-editor .h5 { font-size: 14px; } .note-editor h6, .note-editor .h6 { font-size: 12px; } .note-editor .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eeeeee; } .note-editor ul, .note-editor ol { margin-top: 0; margin-bottom: 10px; } .note-editor ul ul, .note-editor ol ul, .note-editor ul ol, .note-editor ol ol { margin-bottom: 0; } .note-editor .list-unstyled { padding-left: 0; list-style: none; } .note-editor .list-inline { padding-left: 0; list-style: none; } .note-editor .list-inline > li { display: inline-block; padding-left: 5px; padding-right: 5px; } .note-editor dl { margin-bottom: 20px; } .note-editor dt, .note-editor dd { line-height: 1.428571429; } .note-editor dt { font-weight: bold; } .note-editor dd { margin-left: 0; } @media (min-width: 768px) { .note-editor .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .note-editor .dl-horizontal dd { margin-left: 180px; } .note-editor .dl-horizontal dd:before, .note-editor .dl-horizontal dd:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .dl-horizontal dd:after { clear: both; } .note-editor .dl-horizontal dd:before, .note-editor .dl-horizontal dd:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .dl-horizontal dd:after { clear: both; } } .note-editor abbr[title], .note-editor abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #999999; } .note-editor abbr.initialism { font-size: 90%; text-transform: uppercase; } .note-editor blockquote { padding: 10px 20px; margin: 0 0 20px; border-left: 5px solid #eeeeee; } .note-editor blockquote p { font-size: 17.5px; font-weight: 300; line-height: 1.25; } .note-editor blockquote p:last-child { margin-bottom: 0; } .note-editor blockquote small { display: block; line-height: 1.428571429; color: #999999; } .note-editor blockquote small:before { content: '\2014 \00A0'; } .note-editor blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #eeeeee; border-left: 0; } .note-editor blockquote.pull-right p, .note-editor blockquote.pull-right small, .note-editor blockquote.pull-right .small { text-align: right; } .note-editor blockquote.pull-right small:before, .note-editor blockquote.pull-right .small:before { content: ''; } .note-editor blockquote.pull-right small:after, .note-editor blockquote.pull-right .small:after { content: '\00A0 \2014'; } .note-editor blockquote:before, .note-editor blockquote:after { content: ""; } .note-editor address { margin-bottom: 20px; font-style: normal; line-height: 1.428571429; } .note-editor code, .note-editor kdb, .note-editor pre, .note-editor samp { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; } .note-editor code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; white-space: nowrap; border-radius: 4px; } .note-editor pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.428571429; word-break: break-all; word-wrap: break-word; color: #333333; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } .note-editor pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .note-editor .pre-scrollable { max-height: 340px; overflow-y: scroll; } .note-editor .container { margin-right: auto; margin-left: auto; padding-left: 15px; padding-right: 15px; } .note-editor .container:before, .note-editor .container:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .container:after { clear: both; } .note-editor .container:before, .note-editor .container:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .container:after { clear: both; } .note-editor .row { margin-left: -15px; margin-right: -15px; } .note-editor .row:before, .note-editor .row:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .row:after { clear: both; } .note-editor .row:before, .note-editor .row:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .row:after { clear: both; } .note-editor .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 15px; padding-right: 15px; } .note-editor .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11 { float: left; } .note-editor .col-xs-12 { width: 100%; } .note-editor .col-xs-11 { width: 91.66666666666666%; } .note-editor .col-xs-10 { width: 83.33333333333334%; } .note-editor .col-xs-9 { width: 75%; } .note-editor .col-xs-8 { width: 66.66666666666666%; } .note-editor .col-xs-7 { width: 58.333333333333336%; } .note-editor .col-xs-6 { width: 50%; } .note-editor .col-xs-5 { width: 41.66666666666667%; } .note-editor .col-xs-4 { width: 33.33333333333333%; } .note-editor .col-xs-3 { width: 25%; } .note-editor .col-xs-2 { width: 16.666666666666664%; } .note-editor .col-xs-1 { width: 8.333333333333332%; } .note-editor .col-xs-pull-12 { right: 100%; } .note-editor .col-xs-pull-11 { right: 91.66666666666666%; } .note-editor .col-xs-pull-10 { right: 83.33333333333334%; } .note-editor .col-xs-pull-9 { right: 75%; } .note-editor .col-xs-pull-8 { right: 66.66666666666666%; } .note-editor .col-xs-pull-7 { right: 58.333333333333336%; } .note-editor .col-xs-pull-6 { right: 50%; } .note-editor .col-xs-pull-5 { right: 41.66666666666667%; } .note-editor .col-xs-pull-4 { right: 33.33333333333333%; } .note-editor .col-xs-pull-3 { right: 25%; } .note-editor .col-xs-pull-2 { right: 16.666666666666664%; } .note-editor .col-xs-pull-1 { right: 8.333333333333332%; } .note-editor .col-xs-push-12 { left: 100%; } .note-editor .col-xs-push-11 { left: 91.66666666666666%; } .note-editor .col-xs-push-10 { left: 83.33333333333334%; } .note-editor .col-xs-push-9 { left: 75%; } .note-editor .col-xs-push-8 { left: 66.66666666666666%; } .note-editor .col-xs-push-7 { left: 58.333333333333336%; } .note-editor .col-xs-push-6 { left: 50%; } .note-editor .col-xs-push-5 { left: 41.66666666666667%; } .note-editor .col-xs-push-4 { left: 33.33333333333333%; } .note-editor .col-xs-push-3 { left: 25%; } .note-editor .col-xs-push-2 { left: 16.666666666666664%; } .note-editor .col-xs-push-1 { left: 8.333333333333332%; } .note-editor .col-xs-offset-12 { margin-left: 100%; } .note-editor .col-xs-offset-11 { margin-left: 91.66666666666666%; } .note-editor .col-xs-offset-10 { margin-left: 83.33333333333334%; } .note-editor .col-xs-offset-9 { margin-left: 75%; } .note-editor .col-xs-offset-8 { margin-left: 66.66666666666666%; } .note-editor .col-xs-offset-7 { margin-left: 58.333333333333336%; } .note-editor .col-xs-offset-6 { margin-left: 50%; } .note-editor .col-xs-offset-5 { margin-left: 41.66666666666667%; } .note-editor .col-xs-offset-4 { margin-left: 33.33333333333333%; } .note-editor .col-xs-offset-3 { margin-left: 25%; } .note-editor .col-xs-offset-2 { margin-left: 16.666666666666664%; } .note-editor .col-xs-offset-1 { margin-left: 8.333333333333332%; } @media (min-width: 768px) { .note-editor .container { width: 750px; } .note-editor .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11 { float: left; } .note-editor .col-sm-12 { width: 100%; } .note-editor .col-sm-11 { width: 91.66666666666666%; } .note-editor .col-sm-10 { width: 83.33333333333334%; } .note-editor .col-sm-9 { width: 75%; } .note-editor .col-sm-8 { width: 66.66666666666666%; } .note-editor .col-sm-7 { width: 58.333333333333336%; } .note-editor .col-sm-6 { width: 50%; } .note-editor .col-sm-5 { width: 41.66666666666667%; } .note-editor .col-sm-4 { width: 33.33333333333333%; } .note-editor .col-sm-3 { width: 25%; } .note-editor .col-sm-2 { width: 16.666666666666664%; } .note-editor .col-sm-1 { width: 8.333333333333332%; } .note-editor .col-sm-pull-12 { right: 100%; } .note-editor .col-sm-pull-11 { right: 91.66666666666666%; } .note-editor .col-sm-pull-10 { right: 83.33333333333334%; } .note-editor .col-sm-pull-9 { right: 75%; } .note-editor .col-sm-pull-8 { right: 66.66666666666666%; } .note-editor .col-sm-pull-7 { right: 58.333333333333336%; } .note-editor .col-sm-pull-6 { right: 50%; } .note-editor .col-sm-pull-5 { right: 41.66666666666667%; } .note-editor .col-sm-pull-4 { right: 33.33333333333333%; } .note-editor .col-sm-pull-3 { right: 25%; } .note-editor .col-sm-pull-2 { right: 16.666666666666664%; } .note-editor .col-sm-pull-1 { right: 8.333333333333332%; } .note-editor .col-sm-push-12 { left: 100%; } .note-editor .col-sm-push-11 { left: 91.66666666666666%; } .note-editor .col-sm-push-10 { left: 83.33333333333334%; } .note-editor .col-sm-push-9 { left: 75%; } .note-editor .col-sm-push-8 { left: 66.66666666666666%; } .note-editor .col-sm-push-7 { left: 58.333333333333336%; } .note-editor .col-sm-push-6 { left: 50%; } .note-editor .col-sm-push-5 { left: 41.66666666666667%; } .note-editor .col-sm-push-4 { left: 33.33333333333333%; } .note-editor .col-sm-push-3 { left: 25%; } .note-editor .col-sm-push-2 { left: 16.666666666666664%; } .note-editor .col-sm-push-1 { left: 8.333333333333332%; } .note-editor .col-sm-offset-12 { margin-left: 100%; } .note-editor .col-sm-offset-11 { margin-left: 91.66666666666666%; } .note-editor .col-sm-offset-10 { margin-left: 83.33333333333334%; } .note-editor .col-sm-offset-9 { margin-left: 75%; } .note-editor .col-sm-offset-8 { margin-left: 66.66666666666666%; } .note-editor .col-sm-offset-7 { margin-left: 58.333333333333336%; } .note-editor .col-sm-offset-6 { margin-left: 50%; } .note-editor .col-sm-offset-5 { margin-left: 41.66666666666667%; } .note-editor .col-sm-offset-4 { margin-left: 33.33333333333333%; } .note-editor .col-sm-offset-3 { margin-left: 25%; } .note-editor .col-sm-offset-2 { margin-left: 16.666666666666664%; } .note-editor .col-sm-offset-1 { margin-left: 8.333333333333332%; } } @media (min-width: 992px) { .note-editor .container { width: 970px; } .note-editor .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11 { float: left; } .note-editor .col-md-12 { width: 100%; } .note-editor .col-md-11 { width: 91.66666666666666%; } .note-editor .col-md-10 { width: 83.33333333333334%; } .note-editor .col-md-9 { width: 75%; } .note-editor .col-md-8 { width: 66.66666666666666%; } .note-editor .col-md-7 { width: 58.333333333333336%; } .note-editor .col-md-6 { width: 50%; } .note-editor .col-md-5 { width: 41.66666666666667%; } .note-editor .col-md-4 { width: 33.33333333333333%; } .note-editor .col-md-3 { width: 25%; } .note-editor .col-md-2 { width: 16.666666666666664%; } .note-editor .col-md-1 { width: 8.333333333333332%; } .note-editor .col-md-pull-12 { right: 100%; } .note-editor .col-md-pull-11 { right: 91.66666666666666%; } .note-editor .col-md-pull-10 { right: 83.33333333333334%; } .note-editor .col-md-pull-9 { right: 75%; } .note-editor .col-md-pull-8 { right: 66.66666666666666%; } .note-editor .col-md-pull-7 { right: 58.333333333333336%; } .note-editor .col-md-pull-6 { right: 50%; } .note-editor .col-md-pull-5 { right: 41.66666666666667%; } .note-editor .col-md-pull-4 { right: 33.33333333333333%; } .note-editor .col-md-pull-3 { right: 25%; } .note-editor .col-md-pull-2 { right: 16.666666666666664%; } .note-editor .col-md-pull-1 { right: 8.333333333333332%; } .note-editor .col-md-push-12 { left: 100%; } .note-editor .col-md-push-11 { left: 91.66666666666666%; } .note-editor .col-md-push-10 { left: 83.33333333333334%; } .note-editor .col-md-push-9 { left: 75%; } .note-editor .col-md-push-8 { left: 66.66666666666666%; } .note-editor .col-md-push-7 { left: 58.333333333333336%; } .note-editor .col-md-push-6 { left: 50%; } .note-editor .col-md-push-5 { left: 41.66666666666667%; } .note-editor .col-md-push-4 { left: 33.33333333333333%; } .note-editor .col-md-push-3 { left: 25%; } .note-editor .col-md-push-2 { left: 16.666666666666664%; } .note-editor .col-md-push-1 { left: 8.333333333333332%; } .note-editor .col-md-offset-12 { margin-left: 100%; } .note-editor .col-md-offset-11 { margin-left: 91.66666666666666%; } .note-editor .col-md-offset-10 { margin-left: 83.33333333333334%; } .note-editor .col-md-offset-9 { margin-left: 75%; } .note-editor .col-md-offset-8 { margin-left: 66.66666666666666%; } .note-editor .col-md-offset-7 { margin-left: 58.333333333333336%; } .note-editor .col-md-offset-6 { margin-left: 50%; } .note-editor .col-md-offset-5 { margin-left: 41.66666666666667%; } .note-editor .col-md-offset-4 { margin-left: 33.33333333333333%; } .note-editor .col-md-offset-3 { margin-left: 25%; } .note-editor .col-md-offset-2 { margin-left: 16.666666666666664%; } .note-editor .col-md-offset-1 { margin-left: 8.333333333333332%; } } @media (min-width: 1200px) { .note-editor .container { width: 1170px; } .note-editor .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11 { float: left; } .note-editor .col-lg-12 { width: 100%; } .note-editor .col-lg-11 { width: 91.66666666666666%; } .note-editor .col-lg-10 { width: 83.33333333333334%; } .note-editor .col-lg-9 { width: 75%; } .note-editor .col-lg-8 { width: 66.66666666666666%; } .note-editor .col-lg-7 { width: 58.333333333333336%; } .note-editor .col-lg-6 { width: 50%; } .note-editor .col-lg-5 { width: 41.66666666666667%; } .note-editor .col-lg-4 { width: 33.33333333333333%; } .note-editor .col-lg-3 { width: 25%; } .note-editor .col-lg-2 { width: 16.666666666666664%; } .note-editor .col-lg-1 { width: 8.333333333333332%; } .note-editor .col-lg-pull-12 { right: 100%; } .note-editor .col-lg-pull-11 { right: 91.66666666666666%; } .note-editor .col-lg-pull-10 { right: 83.33333333333334%; } .note-editor .col-lg-pull-9 { right: 75%; } .note-editor .col-lg-pull-8 { right: 66.66666666666666%; } .note-editor .col-lg-pull-7 { right: 58.333333333333336%; } .note-editor .col-lg-pull-6 { right: 50%; } .note-editor .col-lg-pull-5 { right: 41.66666666666667%; } .note-editor .col-lg-pull-4 { right: 33.33333333333333%; } .note-editor .col-lg-pull-3 { right: 25%; } .note-editor .col-lg-pull-2 { right: 16.666666666666664%; } .note-editor .col-lg-pull-1 { right: 8.333333333333332%; } .note-editor .col-lg-push-12 { left: 100%; } .note-editor .col-lg-push-11 { left: 91.66666666666666%; } .note-editor .col-lg-push-10 { left: 83.33333333333334%; } .note-editor .col-lg-push-9 { left: 75%; } .note-editor .col-lg-push-8 { left: 66.66666666666666%; } .note-editor .col-lg-push-7 { left: 58.333333333333336%; } .note-editor .col-lg-push-6 { left: 50%; } .note-editor .col-lg-push-5 { left: 41.66666666666667%; } .note-editor .col-lg-push-4 { left: 33.33333333333333%; } .note-editor .col-lg-push-3 { left: 25%; } .note-editor .col-lg-push-2 { left: 16.666666666666664%; } .note-editor .col-lg-push-1 { left: 8.333333333333332%; } .note-editor .col-lg-offset-12 { margin-left: 100%; } .note-editor .col-lg-offset-11 { margin-left: 91.66666666666666%; } .note-editor .col-lg-offset-10 { margin-left: 83.33333333333334%; } .note-editor .col-lg-offset-9 { margin-left: 75%; } .note-editor .col-lg-offset-8 { margin-left: 66.66666666666666%; } .note-editor .col-lg-offset-7 { margin-left: 58.333333333333336%; } .note-editor .col-lg-offset-6 { margin-left: 50%; } .note-editor .col-lg-offset-5 { margin-left: 41.66666666666667%; } .note-editor .col-lg-offset-4 { margin-left: 33.33333333333333%; } .note-editor .col-lg-offset-3 { margin-left: 25%; } .note-editor .col-lg-offset-2 { margin-left: 16.666666666666664%; } .note-editor .col-lg-offset-1 { margin-left: 8.333333333333332%; } } .note-editor table { max-width: 100%; background-color: transparent; } .note-editor th { text-align: left; } .note-editor .table { width: 100%; margin-bottom: 20px; } .note-editor .table > thead > tr > th, .note-editor .table > tbody > tr > th, .note-editor .table > tfoot > tr > th, .note-editor .table > thead > tr > td, .note-editor .table > tbody > tr > td, .note-editor .table > tfoot > tr > td { padding: 8px; line-height: 1.428571429; vertical-align: top; border-top: 1px solid #dddddd; } .note-editor .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #dddddd; } .note-editor .table > caption + thead > tr:first-child > th, .note-editor .table > colgroup + thead > tr:first-child > th, .note-editor .table > thead:first-child > tr:first-child > th, .note-editor .table > caption + thead > tr:first-child > td, .note-editor .table > colgroup + thead > tr:first-child > td, .note-editor .table > thead:first-child > tr:first-child > td { border-top: 0; } .note-editor .table > tbody + tbody { border-top: 2px solid #dddddd; } .note-editor .table .table { background-color: #ffffff; } .note-editor .table-condensed > thead > tr > th, .note-editor .table-condensed > tbody > tr > th, .note-editor .table-condensed > tfoot > tr > th, .note-editor .table-condensed > thead > tr > td, .note-editor .table-condensed > tbody > tr > td, .note-editor .table-condensed > tfoot > tr > td { padding: 5px; } .note-editor .table-bordered { border: 1px solid #dddddd; } .note-editor .table-bordered > thead > tr > th, .note-editor .table-bordered > tbody > tr > th, .note-editor .table-bordered > tfoot > tr > th, .note-editor .table-bordered > thead > tr > td, .note-editor .table-bordered > tbody > tr > td, .note-editor .table-bordered > tfoot > tr > td { border: 1px solid #dddddd; } .note-editor .table-bordered > thead > tr > th, .note-editor .table-bordered > thead > tr > td { border-bottom-width: 2px; } .note-editor .table-striped > tbody > tr:nth-child(odd) > td, .note-editor .table-striped > tbody > tr:nth-child(odd) > th { background-color: #f9f9f9; } .note-editor .table-hover > tbody > tr:hover > td, .note-editor .table-hover > tbody > tr:hover > th { background-color: #f5f5f5; } .note-editor table col[class*="col-"] { float: none; display: table-column; } .note-editor table td[class*="col-"], .note-editor table th[class*="col-"] { float: none; display: table-cell; } .note-editor .table > thead > tr > td.active, .note-editor .table > tbody > tr > td.active, .note-editor .table > tfoot > tr > td.active, .note-editor .table > thead > tr > th.active, .note-editor .table > tbody > tr > th.active, .note-editor .table > tfoot > tr > th.active, .note-editor .table > thead > tr.active > td, .note-editor .table > tbody > tr.active > td, .note-editor .table > tfoot > tr.active > td, .note-editor .table > thead > tr.active > th, .note-editor .table > tbody > tr.active > th, .note-editor .table > tfoot > tr.active > th { background-color: #f5f5f5; } .note-editor .table > thead > tr > td.success, .note-editor .table > tbody > tr > td.success, .note-editor .table > tfoot > tr > td.success, .note-editor .table > thead > tr > th.success, .note-editor .table > tbody > tr > th.success, .note-editor .table > tfoot > tr > th.success, .note-editor .table > thead > tr.success > td, .note-editor .table > tbody > tr.success > td, .note-editor .table > tfoot > tr.success > td, .note-editor .table > thead > tr.success > th, .note-editor .table > tbody > tr.success > th, .note-editor .table > tfoot > tr.success > th { background-color: #dff0d8; border-color: #d6e9c6; } .note-editor .table-hover > tbody > tr > td.success:hover, .note-editor .table-hover > tbody > tr > th.success:hover, .note-editor .table-hover > tbody > tr.success:hover > td, .note-editor .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; border-color: #c9e2b3; } .note-editor .table > thead > tr > td.danger, .note-editor .table > tbody > tr > td.danger, .note-editor .table > tfoot > tr > td.danger, .note-editor .table > thead > tr > th.danger, .note-editor .table > tbody > tr > th.danger, .note-editor .table > tfoot > tr > th.danger, .note-editor .table > thead > tr.danger > td, .note-editor .table > tbody > tr.danger > td, .note-editor .table > tfoot > tr.danger > td, .note-editor .table > thead > tr.danger > th, .note-editor .table > tbody > tr.danger > th, .note-editor .table > tfoot > tr.danger > th { background-color: #f2dede; border-color: #ebccd1; } .note-editor .table-hover > tbody > tr > td.danger:hover, .note-editor .table-hover > tbody > tr > th.danger:hover, .note-editor .table-hover > tbody > tr.danger:hover > td, .note-editor .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; border-color: #e4b9c0; } .note-editor .table > thead > tr > td.warning, .note-editor .table > tbody > tr > td.warning, .note-editor .table > tfoot > tr > td.warning, .note-editor .table > thead > tr > th.warning, .note-editor .table > tbody > tr > th.warning, .note-editor .table > tfoot > tr > th.warning, .note-editor .table > thead > tr.warning > td, .note-editor .table > tbody > tr.warning > td, .note-editor .table > tfoot > tr.warning > td, .note-editor .table > thead > tr.warning > th, .note-editor .table > tbody > tr.warning > th, .note-editor .table > tfoot > tr.warning > th { background-color: #fcf8e3; border-color: #faebcc; } .note-editor .table-hover > tbody > tr > td.warning:hover, .note-editor .table-hover > tbody > tr > th.warning:hover, .note-editor .table-hover > tbody > tr.warning:hover > td, .note-editor .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; border-color: #f7e1b5; } @media (max-width: 767px) { .note-editor .table-responsive { width: 100%; margin-bottom: 15px; overflow-y: hidden; overflow-x: scroll; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #dddddd; -webkit-overflow-scrolling: touch; } .note-editor .table-responsive > .table { margin-bottom: 0; } .note-editor .table-responsive > .table > thead > tr > th, .note-editor .table-responsive > .table > tbody > tr > th, .note-editor .table-responsive > .table > tfoot > tr > th, .note-editor .table-responsive > .table > thead > tr > td, .note-editor .table-responsive > .table > tbody > tr > td, .note-editor .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .note-editor .table-responsive > .table-bordered { border: 0; } .note-editor .table-responsive > .table-bordered > thead > tr > th:first-child, .note-editor .table-responsive > .table-bordered > tbody > tr > th:first-child, .note-editor .table-responsive > .table-bordered > tfoot > tr > th:first-child, .note-editor .table-responsive > .table-bordered > thead > tr > td:first-child, .note-editor .table-responsive > .table-bordered > tbody > tr > td:first-child, .note-editor .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .note-editor .table-responsive > .table-bordered > thead > tr > th:last-child, .note-editor .table-responsive > .table-bordered > tbody > tr > th:last-child, .note-editor .table-responsive > .table-bordered > tfoot > tr > th:last-child, .note-editor .table-responsive > .table-bordered > thead > tr > td:last-child, .note-editor .table-responsive > .table-bordered > tbody > tr > td:last-child, .note-editor .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .note-editor .table-responsive > .table-bordered > tbody > tr:last-child > th, .note-editor .table-responsive > .table-bordered > tfoot > tr:last-child > th, .note-editor .table-responsive > .table-bordered > tbody > tr:last-child > td, .note-editor .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } .note-editor fieldset { padding: 0; margin: 0; border: 0; } .note-editor legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } .note-editor label { display: inline-block; margin-bottom: 5px; font-weight: bold; } .note-editor input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .note-editor input[type="radio"], .note-editor input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } .note-editor input[type="file"] { display: block; } .note-editor select[multiple], .note-editor select[size] { height: auto; } .note-editor select optgroup { font-size: inherit; font-style: inherit; font-family: inherit; } .note-editor input[type="file"]:focus, .note-editor input[type="radio"]:focus, .note-editor input[type="checkbox"]:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .note-editor input[type="number"]::-webkit-outer-spin-button, .note-editor input[type="number"]::-webkit-inner-spin-button { height: auto; } .note-editor output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.428571429; color: #555555; vertical-align: middle; } .note-editor .form-control:-moz-placeholder { color: #999999; } .note-editor .form-control::-moz-placeholder { color: #999999; } .note-editor .form-control:-ms-input-placeholder { color: #999999; } .note-editor .form-control::-webkit-input-placeholder { color: #999999; } .note-editor .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.428571429; color: #555555; vertical-align: middle; background-color: #ffffff; background-image: none; border: 1px solid #cccccc; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } .note-editor .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6); } .note-editor .form-control[disabled], .note-editor .form-control[readonly], fieldset[disabled] .note-editor .form-control { cursor: not-allowed; background-color: #eeeeee; } textarea.note-editor .form-control { height: auto; } .note-editor .form-group { margin-bottom: 15px; } .note-editor .radio, .note-editor .checkbox { display: block; min-height: 20px; margin-top: 10px; margin-bottom: 10px; padding-left: 20px; vertical-align: middle; } .note-editor .radio label, .note-editor .checkbox label { display: inline; margin-bottom: 0; font-weight: normal; cursor: pointer; } .note-editor .radio input[type="radio"], .note-editor .radio-inline input[type="radio"], .note-editor .checkbox input[type="checkbox"], .note-editor .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .note-editor .radio + .radio, .note-editor .checkbox + .checkbox { margin-top: -5px; } .note-editor .radio-inline, .note-editor .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer; } .note-editor .radio-inline + .radio-inline, .note-editor .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } .note-editor input[type="radio"][disabled], .note-editor input[type="checkbox"][disabled], .note-editor .radio[disabled], .note-editor .radio-inline[disabled], .note-editor .checkbox[disabled], .note-editor .checkbox-inline[disabled], fieldset[disabled] .note-editor input[type="radio"], fieldset[disabled] .note-editor input[type="checkbox"], fieldset[disabled] .note-editor .radio, fieldset[disabled] .note-editor .radio-inline, fieldset[disabled] .note-editor .checkbox, fieldset[disabled] .note-editor .checkbox-inline { cursor: not-allowed; } .note-editor .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.note-editor .input-sm { height: 30px; line-height: 30px; } textarea.note-editor .input-sm { height: auto; } .note-editor .input-lg { height: 45px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.note-editor .input-lg { height: 45px; line-height: 45px; } textarea.note-editor .input-lg { height: auto; } .note-editor .has-warning .help-block, .note-editor .has-warning .control-label { color: #c09853; } .note-editor .has-warning .form-control { border-color: #c09853; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .note-editor .has-warning .form-control:focus { border-color: #a47e3c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; } .note-editor .has-warning .input-group-addon { color: #c09853; border-color: #c09853; background-color: #fcf8e3; } .note-editor .has-error .help-block, .note-editor .has-error .control-label { color: #b94a48; } .note-editor .has-error .form-control { border-color: #b94a48; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .note-editor .has-error .form-control:focus { border-color: #953b39; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; } .note-editor .has-error .input-group-addon { color: #b94a48; border-color: #b94a48; background-color: #f2dede; } .note-editor .has-success .help-block, .note-editor .has-success .control-label { color: #468847; } .note-editor .has-success .form-control { border-color: #468847; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .note-editor .has-success .form-control:focus { border-color: #356635; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; } .note-editor .has-success .input-group-addon { color: #468847; border-color: #468847; background-color: #dff0d8; } .note-editor .form-control-static { margin-bottom: 0; } .note-editor .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .note-editor .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .note-editor .form-inline .form-control { display: inline-block; } .note-editor .form-inline .radio, .note-editor .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; padding-left: 0; } .note-editor .form-inline .radio input[type="radio"], .note-editor .form-inline .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } .note-editor .form-horizontal .control-label, .note-editor .form-horizontal .radio, .note-editor .form-horizontal .checkbox, .note-editor .form-horizontal .radio-inline, .note-editor .form-horizontal .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: 7px; } .note-editor .form-horizontal .form-group { margin-left: -15px; margin-right: -15px; } .note-editor .form-horizontal .form-group:before, .note-editor .form-horizontal .form-group:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .form-horizontal .form-group:after { clear: both; } .note-editor .form-horizontal .form-group:before, .note-editor .form-horizontal .form-group:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .form-horizontal .form-group:after { clear: both; } .note-editor .form-horizontal .form-control-static { padding-top: 7px; } @media (min-width: 768px) { .note-editor .form-horizontal .control-label { text-align: right; } } .note-editor .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 6px 12px; font-size: 14px; line-height: 1.428571429; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; } .note-editor .btn:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .note-editor .btn:hover, .note-editor .btn:focus { color: #333333; text-decoration: none; } .note-editor .btn:active, .note-editor .btn.active { outline: 0; background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .note-editor .btn.disabled, .note-editor .btn[disabled], fieldset[disabled] .note-editor .btn { cursor: not-allowed; pointer-events: none; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .note-editor .btn-default { color: #333333; background-color: #ffffff; border-color: #cccccc; } .note-editor .btn-default:hover, .note-editor .btn-default:focus, .note-editor .btn-default:active, .note-editor .btn-default.active, .open .dropdown-toggle.note-editor .btn-default { color: #333333; background-color: #ebebeb; border-color: #adadad; } .note-editor .btn-default:active, .note-editor .btn-default.active, .open .dropdown-toggle.note-editor .btn-default { background-image: none; } .note-editor .btn-default.disabled, .note-editor .btn-default[disabled], fieldset[disabled] .note-editor .btn-default, .note-editor .btn-default.disabled:hover, .note-editor .btn-default[disabled]:hover, fieldset[disabled] .note-editor .btn-default:hover, .note-editor .btn-default.disabled:focus, .note-editor .btn-default[disabled]:focus, fieldset[disabled] .note-editor .btn-default:focus, .note-editor .btn-default.disabled:active, .note-editor .btn-default[disabled]:active, fieldset[disabled] .note-editor .btn-default:active, .note-editor .btn-default.disabled.active, .note-editor .btn-default[disabled].active, fieldset[disabled] .note-editor .btn-default.active { background-color: #ffffff; border-color: #cccccc; } .note-editor .btn-primary { color: #ffffff; background-color: #428bca; border-color: #357ebd; } .note-editor .btn-primary:hover, .note-editor .btn-primary:focus, .note-editor .btn-primary:active, .note-editor .btn-primary.active, .open .dropdown-toggle.note-editor .btn-primary { color: #ffffff; background-color: #3276b1; border-color: #285e8e; } .note-editor .btn-primary:active, .note-editor .btn-primary.active, .open .dropdown-toggle.note-editor .btn-primary { background-image: none; } .note-editor .btn-primary.disabled, .note-editor .btn-primary[disabled], fieldset[disabled] .note-editor .btn-primary, .note-editor .btn-primary.disabled:hover, .note-editor .btn-primary[disabled]:hover, fieldset[disabled] .note-editor .btn-primary:hover, .note-editor .btn-primary.disabled:focus, .note-editor .btn-primary[disabled]:focus, fieldset[disabled] .note-editor .btn-primary:focus, .note-editor .btn-primary.disabled:active, .note-editor .btn-primary[disabled]:active, fieldset[disabled] .note-editor .btn-primary:active, .note-editor .btn-primary.disabled.active, .note-editor .btn-primary[disabled].active, fieldset[disabled] .note-editor .btn-primary.active { background-color: #428bca; border-color: #357ebd; } .note-editor .btn-warning { color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .note-editor .btn-warning:hover, .note-editor .btn-warning:focus, .note-editor .btn-warning:active, .note-editor .btn-warning.active, .open .dropdown-toggle.note-editor .btn-warning { color: #ffffff; background-color: #ed9c28; border-color: #d58512; } .note-editor .btn-warning:active, .note-editor .btn-warning.active, .open .dropdown-toggle.note-editor .btn-warning { background-image: none; } .note-editor .btn-warning.disabled, .note-editor .btn-warning[disabled], fieldset[disabled] .note-editor .btn-warning, .note-editor .btn-warning.disabled:hover, .note-editor .btn-warning[disabled]:hover, fieldset[disabled] .note-editor .btn-warning:hover, .note-editor .btn-warning.disabled:focus, .note-editor .btn-warning[disabled]:focus, fieldset[disabled] .note-editor .btn-warning:focus, .note-editor .btn-warning.disabled:active, .note-editor .btn-warning[disabled]:active, fieldset[disabled] .note-editor .btn-warning:active, .note-editor .btn-warning.disabled.active, .note-editor .btn-warning[disabled].active, fieldset[disabled] .note-editor .btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .note-editor .btn-danger { color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .note-editor .btn-danger:hover, .note-editor .btn-danger:focus, .note-editor .btn-danger:active, .note-editor .btn-danger.active, .open .dropdown-toggle.note-editor .btn-danger { color: #ffffff; background-color: #d2322d; border-color: #ac2925; } .note-editor .btn-danger:active, .note-editor .btn-danger.active, .open .dropdown-toggle.note-editor .btn-danger { background-image: none; } .note-editor .btn-danger.disabled, .note-editor .btn-danger[disabled], fieldset[disabled] .note-editor .btn-danger, .note-editor .btn-danger.disabled:hover, .note-editor .btn-danger[disabled]:hover, fieldset[disabled] .note-editor .btn-danger:hover, .note-editor .btn-danger.disabled:focus, .note-editor .btn-danger[disabled]:focus, fieldset[disabled] .note-editor .btn-danger:focus, .note-editor .btn-danger.disabled:active, .note-editor .btn-danger[disabled]:active, fieldset[disabled] .note-editor .btn-danger:active, .note-editor .btn-danger.disabled.active, .note-editor .btn-danger[disabled].active, fieldset[disabled] .note-editor .btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .note-editor .btn-success { color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .note-editor .btn-success:hover, .note-editor .btn-success:focus, .note-editor .btn-success:active, .note-editor .btn-success.active, .open .dropdown-toggle.note-editor .btn-success { color: #ffffff; background-color: #47a447; border-color: #398439; } .note-editor .btn-success:active, .note-editor .btn-success.active, .open .dropdown-toggle.note-editor .btn-success { background-image: none; } .note-editor .btn-success.disabled, .note-editor .btn-success[disabled], fieldset[disabled] .note-editor .btn-success, .note-editor .btn-success.disabled:hover, .note-editor .btn-success[disabled]:hover, fieldset[disabled] .note-editor .btn-success:hover, .note-editor .btn-success.disabled:focus, .note-editor .btn-success[disabled]:focus, fieldset[disabled] .note-editor .btn-success:focus, .note-editor .btn-success.disabled:active, .note-editor .btn-success[disabled]:active, fieldset[disabled] .note-editor .btn-success:active, .note-editor .btn-success.disabled.active, .note-editor .btn-success[disabled].active, fieldset[disabled] .note-editor .btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .note-editor .btn-info { color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .note-editor .btn-info:hover, .note-editor .btn-info:focus, .note-editor .btn-info:active, .note-editor .btn-info.active, .open .dropdown-toggle.note-editor .btn-info { color: #ffffff; background-color: #39b3d7; border-color: #269abc; } .note-editor .btn-info:active, .note-editor .btn-info.active, .open .dropdown-toggle.note-editor .btn-info { background-image: none; } .note-editor .btn-info.disabled, .note-editor .btn-info[disabled], fieldset[disabled] .note-editor .btn-info, .note-editor .btn-info.disabled:hover, .note-editor .btn-info[disabled]:hover, fieldset[disabled] .note-editor .btn-info:hover, .note-editor .btn-info.disabled:focus, .note-editor .btn-info[disabled]:focus, fieldset[disabled] .note-editor .btn-info:focus, .note-editor .btn-info.disabled:active, .note-editor .btn-info[disabled]:active, fieldset[disabled] .note-editor .btn-info:active, .note-editor .btn-info.disabled.active, .note-editor .btn-info[disabled].active, fieldset[disabled] .note-editor .btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .note-editor .btn-link { color: #428bca; font-weight: normal; cursor: pointer; border-radius: 0; } .note-editor .btn-link, .note-editor .btn-link:active, .note-editor .btn-link[disabled], fieldset[disabled] .note-editor .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .note-editor .btn-link, .note-editor .btn-link:hover, .note-editor .btn-link:focus, .note-editor .btn-link:active { border-color: transparent; } .note-editor .btn-link:hover, .note-editor .btn-link:focus { color: #2a6496; text-decoration: underline; background-color: transparent; } .note-editor .btn-link[disabled]:hover, fieldset[disabled] .note-editor .btn-link:hover, .note-editor .btn-link[disabled]:focus, fieldset[disabled] .note-editor .btn-link:focus { color: #999999; text-decoration: none; } .note-editor .btn-lg { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .note-editor .btn-sm, .note-editor .btn-xs { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .note-editor .btn-xs { padding: 1px 5px; } .note-editor .btn-block { display: block; width: 100%; padding-left: 0; padding-right: 0; } .note-editor .btn-block + .btn-block { margin-top: 5px; } .note-editor input[type="submit"].btn-block, .note-editor input[type="reset"].btn-block, .note-editor input[type="button"].btn-block { width: 100%; } .note-editor .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .note-editor .fade.in { opacity: 1; } .note-editor .collapse { display: none; } .note-editor .collapse.in { display: block; } .note-editor .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; transition: height 0.35s ease; } @font-face { font-family: 'Glyphicons Halflings'; src: url('../../../fonts/glyphicons-halflings-regular.eot'); src: url('../../../fonts/glyphicons-halflings-regular.eot?') format('embedded-opentype'), url('../../../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../../../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../../../fonts/glyphicons-halflings-regular.svg') format('svg'); } .note-editor .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; } .note-editor .glyphicon:empty { width: 1em; } .note-editor .glyphicon-asterisk:before { content: "\2a"; } .note-editor .glyphicon-plus:before { content: "\2b"; } .note-editor .glyphicon-euro:before { content: "\20ac"; } .note-editor .glyphicon-minus:before { content: "\2212"; } .note-editor .glyphicon-cloud:before { content: "\2601"; } .note-editor .glyphicon-envelope:before { content: "\2709"; } .note-editor .glyphicon-pencil:before { content: "\270f"; } .note-editor .glyphicon-glass:before { content: "\e001"; } .note-editor .glyphicon-music:before { content: "\e002"; } .note-editor .glyphicon-search:before { content: "\e003"; } .note-editor .glyphicon-heart:before { content: "\e005"; } .note-editor .glyphicon-star:before { content: "\e006"; } .note-editor .glyphicon-star-empty:before { content: "\e007"; } .note-editor .glyphicon-user:before { content: "\e008"; } .note-editor .glyphicon-film:before { content: "\e009"; } .note-editor .glyphicon-th-large:before { content: "\e010"; } .note-editor .glyphicon-th:before { content: "\e011"; } .note-editor .glyphicon-th-list:before { content: "\e012"; } .note-editor .glyphicon-ok:before { content: "\e013"; } .note-editor .glyphicon-remove:before { content: "\e014"; } .note-editor .glyphicon-zoom-in:before { content: "\e015"; } .note-editor .glyphicon-zoom-out:before { content: "\e016"; } .note-editor .glyphicon-off:before { content: "\e017"; } .note-editor .glyphicon-signal:before { content: "\e018"; } .note-editor .glyphicon-cog:before { content: "\e019"; } .note-editor .glyphicon-trash:before { content: "\e020"; } .note-editor .glyphicon-home:before { content: "\e021"; } .note-editor .glyphicon-file:before { content: "\e022"; } .note-editor .glyphicon-time:before { content: "\e023"; } .note-editor .glyphicon-road:before { content: "\e024"; } .note-editor .glyphicon-download-alt:before { content: "\e025"; } .note-editor .glyphicon-download:before { content: "\e026"; } .note-editor .glyphicon-upload:before { content: "\e027"; } .note-editor .glyphicon-inbox:before { content: "\e028"; } .note-editor .glyphicon-play-circle:before { content: "\e029"; } .note-editor .glyphicon-repeat:before { content: "\e030"; } .note-editor .glyphicon-refresh:before { content: "\e031"; } .note-editor .glyphicon-list-alt:before { content: "\e032"; } .note-editor .glyphicon-lock:before { content: "\e033"; } .note-editor .glyphicon-flag:before { content: "\e034"; } .note-editor .glyphicon-headphones:before { content: "\e035"; } .note-editor .glyphicon-volume-off:before { content: "\e036"; } .note-editor .glyphicon-volume-down:before { content: "\e037"; } .note-editor .glyphicon-volume-up:before { content: "\e038"; } .note-editor .glyphicon-qrcode:before { content: "\e039"; } .note-editor .glyphicon-barcode:before { content: "\e040"; } .note-editor .glyphicon-tag:before { content: "\e041"; } .note-editor .glyphicon-tags:before { content: "\e042"; } .note-editor .glyphicon-book:before { content: "\e043"; } .note-editor .glyphicon-bookmark:before { content: "\e044"; } .note-editor .glyphicon-print:before { content: "\e045"; } .note-editor .glyphicon-camera:before { content: "\e046"; } .note-editor .glyphicon-font:before { content: "\e047"; } .note-editor .glyphicon-bold:before { content: "\e048"; } .note-editor .glyphicon-italic:before { content: "\e049"; } .note-editor .glyphicon-text-height:before { content: "\e050"; } .note-editor .glyphicon-text-width:before { content: "\e051"; } .note-editor .glyphicon-align-left:before { content: "\e052"; } .note-editor .glyphicon-align-center:before { content: "\e053"; } .note-editor .glyphicon-align-right:before { content: "\e054"; } .note-editor .glyphicon-align-justify:before { content: "\e055"; } .note-editor .glyphicon-list:before { content: "\e056"; } .note-editor .glyphicon-indent-left:before { content: "\e057"; } .note-editor .glyphicon-indent-right:before { content: "\e058"; } .note-editor .glyphicon-facetime-video:before { content: "\e059"; } .note-editor .glyphicon-picture:before { content: "\e060"; } .note-editor .glyphicon-map-marker:before { content: "\e062"; } .note-editor .glyphicon-adjust:before { content: "\e063"; } .note-editor .glyphicon-tint:before { content: "\e064"; } .note-editor .glyphicon-edit:before { content: "\e065"; } .note-editor .glyphicon-share:before { content: "\e066"; } .note-editor .glyphicon-check:before { content: "\e067"; } .note-editor .glyphicon-move:before { content: "\e068"; } .note-editor .glyphicon-step-backward:before { content: "\e069"; } .note-editor .glyphicon-fast-backward:before { content: "\e070"; } .note-editor .glyphicon-backward:before { content: "\e071"; } .note-editor .glyphicon-play:before { content: "\e072"; } .note-editor .glyphicon-pause:before { content: "\e073"; } .note-editor .glyphicon-stop:before { content: "\e074"; } .note-editor .glyphicon-forward:before { content: "\e075"; } .note-editor .glyphicon-fast-forward:before { content: "\e076"; } .note-editor .glyphicon-step-forward:before { content: "\e077"; } .note-editor .glyphicon-eject:before { content: "\e078"; } .note-editor .glyphicon-chevron-left:before { content: "\e079"; } .note-editor .glyphicon-chevron-right:before { content: "\e080"; } .note-editor .glyphicon-plus-sign:before { content: "\e081"; } .note-editor .glyphicon-minus-sign:before { content: "\e082"; } .note-editor .glyphicon-remove-sign:before { content: "\e083"; } .note-editor .glyphicon-ok-sign:before { content: "\e084"; } .note-editor .glyphicon-question-sign:before { content: "\e085"; } .note-editor .glyphicon-info-sign:before { content: "\e086"; } .note-editor .glyphicon-screenshot:before { content: "\e087"; } .note-editor .glyphicon-remove-circle:before { content: "\e088"; } .note-editor .glyphicon-ok-circle:before { content: "\e089"; } .note-editor .glyphicon-ban-circle:before { content: "\e090"; } .note-editor .glyphicon-arrow-left:before { content: "\e091"; } .note-editor .glyphicon-arrow-right:before { content: "\e092"; } .note-editor .glyphicon-arrow-up:before { content: "\e093"; } .note-editor .glyphicon-arrow-down:before { content: "\e094"; } .note-editor .glyphicon-share-alt:before { content: "\e095"; } .note-editor .glyphicon-resize-full:before { content: "\e096"; } .note-editor .glyphicon-resize-small:before { content: "\e097"; } .note-editor .glyphicon-exclamation-sign:before { content: "\e101"; } .note-editor .glyphicon-gift:before { content: "\e102"; } .note-editor .glyphicon-leaf:before { content: "\e103"; } .note-editor .glyphicon-fire:before { content: "\e104"; } .note-editor .glyphicon-eye-open:before { content: "\e105"; } .note-editor .glyphicon-eye-close:before { content: "\e106"; } .note-editor .glyphicon-warning-sign:before { content: "\e107"; } .note-editor .glyphicon-plane:before { content: "\e108"; } .note-editor .glyphicon-calendar:before { content: "\e109"; } .note-editor .glyphicon-random:before { content: "\e110"; } .note-editor .glyphicon-comment:before { content: "\e111"; } .note-editor .glyphicon-magnet:before { content: "\e112"; } .note-editor .glyphicon-chevron-up:before { content: "\e113"; } .note-editor .glyphicon-chevron-down:before { content: "\e114"; } .note-editor .glyphicon-retweet:before { content: "\e115"; } .note-editor .glyphicon-shopping-cart:before { content: "\e116"; } .note-editor .glyphicon-folder-close:before { content: "\e117"; } .note-editor .glyphicon-folder-open:before { content: "\e118"; } .note-editor .glyphicon-resize-vertical:before { content: "\e119"; } .note-editor .glyphicon-resize-horizontal:before { content: "\e120"; } .note-editor .glyphicon-hdd:before { content: "\e121"; } .note-editor .glyphicon-bullhorn:before { content: "\e122"; } .note-editor .glyphicon-bell:before { content: "\e123"; } .note-editor .glyphicon-certificate:before { content: "\e124"; } .note-editor .glyphicon-thumbs-up:before { content: "\e125"; } .note-editor .glyphicon-thumbs-down:before { content: "\e126"; } .note-editor .glyphicon-hand-right:before { content: "\e127"; } .note-editor .glyphicon-hand-left:before { content: "\e128"; } .note-editor .glyphicon-hand-up:before { content: "\e129"; } .note-editor .glyphicon-hand-down:before { content: "\e130"; } .note-editor .glyphicon-circle-arrow-right:before { content: "\e131"; } .note-editor .glyphicon-circle-arrow-left:before { content: "\e132"; } .note-editor .glyphicon-circle-arrow-up:before { content: "\e133"; } .note-editor .glyphicon-circle-arrow-down:before { content: "\e134"; } .note-editor .glyphicon-globe:before { content: "\e135"; } .note-editor .glyphicon-wrench:before { content: "\e136"; } .note-editor .glyphicon-tasks:before { content: "\e137"; } .note-editor .glyphicon-filter:before { content: "\e138"; } .note-editor .glyphicon-briefcase:before { content: "\e139"; } .note-editor .glyphicon-fullscreen:before { content: "\e140"; } .note-editor .glyphicon-dashboard:before { content: "\e141"; } .note-editor .glyphicon-paperclip:before { content: "\e142"; } .note-editor .glyphicon-heart-empty:before { content: "\e143"; } .note-editor .glyphicon-link:before { content: "\e144"; } .note-editor .glyphicon-phone:before { content: "\e145"; } .note-editor .glyphicon-pushpin:before { content: "\e146"; } .note-editor .glyphicon-usd:before { content: "\e148"; } .note-editor .glyphicon-gbp:before { content: "\e149"; } .note-editor .glyphicon-sort:before { content: "\e150"; } .note-editor .glyphicon-sort-by-alphabet:before { content: "\e151"; } .note-editor .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .note-editor .glyphicon-sort-by-order:before { content: "\e153"; } .note-editor .glyphicon-sort-by-order-alt:before { content: "\e154"; } .note-editor .glyphicon-sort-by-attributes:before { content: "\e155"; } .note-editor .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .note-editor .glyphicon-unchecked:before { content: "\e157"; } .note-editor .glyphicon-expand:before { content: "\e158"; } .note-editor .glyphicon-collapse-down:before { content: "\e159"; } .note-editor .glyphicon-collapse-up:before { content: "\e160"; } .note-editor .glyphicon-log-in:before { content: "\e161"; } .note-editor .glyphicon-flash:before { content: "\e162"; } .note-editor .glyphicon-log-out:before { content: "\e163"; } .note-editor .glyphicon-new-window:before { content: "\e164"; } .note-editor .glyphicon-record:before { content: "\e165"; } .note-editor .glyphicon-save:before { content: "\e166"; } .note-editor .glyphicon-open:before { content: "\e167"; } .note-editor .glyphicon-saved:before { content: "\e168"; } .note-editor .glyphicon-import:before { content: "\e169"; } .note-editor .glyphicon-export:before { content: "\e170"; } .note-editor .glyphicon-send:before { content: "\e171"; } .note-editor .glyphicon-floppy-disk:before { content: "\e172"; } .note-editor .glyphicon-floppy-saved:before { content: "\e173"; } .note-editor .glyphicon-floppy-remove:before { content: "\e174"; } .note-editor .glyphicon-floppy-save:before { content: "\e175"; } .note-editor .glyphicon-floppy-open:before { content: "\e176"; } .note-editor .glyphicon-credit-card:before { content: "\e177"; } .note-editor .glyphicon-transfer:before { content: "\e178"; } .note-editor .glyphicon-cutlery:before { content: "\e179"; } .note-editor .glyphicon-header:before { content: "\e180"; } .note-editor .glyphicon-compressed:before { content: "\e181"; } .note-editor .glyphicon-earphone:before { content: "\e182"; } .note-editor .glyphicon-phone-alt:before { content: "\e183"; } .note-editor .glyphicon-tower:before { content: "\e184"; } .note-editor .glyphicon-stats:before { content: "\e185"; } .note-editor .glyphicon-sd-video:before { content: "\e186"; } .note-editor .glyphicon-hd-video:before { content: "\e187"; } .note-editor .glyphicon-subtitles:before { content: "\e188"; } .note-editor .glyphicon-sound-stereo:before { content: "\e189"; } .note-editor .glyphicon-sound-dolby:before { content: "\e190"; } .note-editor .glyphicon-sound-5-1:before { content: "\e191"; } .note-editor .glyphicon-sound-6-1:before { content: "\e192"; } .note-editor .glyphicon-sound-7-1:before { content: "\e193"; } .note-editor .glyphicon-copyright-mark:before { content: "\e194"; } .note-editor .glyphicon-registration-mark:before { content: "\e195"; } .note-editor .glyphicon-cloud-download:before { content: "\e197"; } .note-editor .glyphicon-cloud-upload:before { content: "\e198"; } .note-editor .glyphicon-tree-conifer:before { content: "\e199"; } .note-editor .glyphicon-tree-deciduous:before { content: "\e200"; } .note-editor .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid #000000; border-right: 4px solid transparent; border-left: 4px solid transparent; border-bottom: 0 dotted; } .note-editor .dropdown { position: relative; } .note-editor .dropdown-toggle:focus { outline: 0; } .note-editor .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; list-style: none; font-size: 14px; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .note-editor .dropdown-menu.pull-right { right: 0; left: auto; } .note-editor .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .note-editor .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.428571429; color: #333333; white-space: nowrap; } .note-editor .dropdown-menu > li > a:hover, .note-editor .dropdown-menu > li > a:focus { text-decoration: none; color: #262626; background-color: #f5f5f5; } .note-editor .dropdown-menu > .active > a, .note-editor .dropdown-menu > .active > a:hover, .note-editor .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; outline: 0; background-color: #428bca; } .note-editor .dropdown-menu > .disabled > a, .note-editor .dropdown-menu > .disabled > a:hover, .note-editor .dropdown-menu > .disabled > a:focus { color: #999999; } .note-editor .dropdown-menu > .disabled > a:hover, .note-editor .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); cursor: not-allowed; } .note-editor .open > .dropdown-menu { display: block; left:0!important; right:auto!important; } .note-editor .open > a { outline: 0; } .note-editor .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.428571429; color: #999999; } .note-editor .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: 990; } .note-editor .pull-right > .dropdown-menu { right: 0; left: auto; } .note-editor .dropup .caret, .note-editor .navbar-fixed-bottom .dropdown .caret { border-top: 0 dotted; border-bottom: 4px solid #000000; content: ""; } .note-editor .dropup .dropdown-menu, .note-editor .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } @media (min-width: 768px) { .note-editor .navbar-right .dropdown-menu { right: 0; left: auto; } } .btn-default .note-editor .caret { border-top-color: #333333; } .btn-primary .note-editor .caret, .btn-success .note-editor .caret, .btn-warning .note-editor .caret, .btn-danger .note-editor .caret, .btn-info .note-editor .caret { border-top-color: #fff; } .note-editor .dropup .btn-default .caret { border-bottom-color: #333333; } .note-editor .dropup .btn-primary .caret, .note-editor .dropup .btn-success .caret, .note-editor .dropup .btn-warning .caret, .note-editor .dropup .btn-danger .caret, .note-editor .dropup .btn-info .caret { border-bottom-color: #fff; } .note-editor .btn-group, .note-editor .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .note-editor .btn-group > .btn, .note-editor .btn-group-vertical > .btn { position: relative; float: left; } .note-editor .btn-group > .btn:hover, .note-editor .btn-group-vertical > .btn:hover, .note-editor .btn-group > .btn:focus, .note-editor .btn-group-vertical > .btn:focus, .note-editor .btn-group > .btn:active, .note-editor .btn-group-vertical > .btn:active, .note-editor .btn-group > .btn.active, .note-editor .btn-group-vertical > .btn.active { z-index: 2; } .note-editor .btn-group > .btn:focus, .note-editor .btn-group-vertical > .btn:focus { outline: none; } .note-editor .btn-group .btn + .btn, .note-editor .btn-group .btn + .btn-group, .note-editor .btn-group .btn-group + .btn, .note-editor .btn-group .btn-group + .btn-group { margin-left: -1px; } .note-editor .btn-toolbar:before, .note-editor .btn-toolbar:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .btn-toolbar:after { clear: both; } .note-editor .btn-toolbar:before, .note-editor .btn-toolbar:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .btn-toolbar:after { clear: both; } .note-editor .btn-toolbar .btn-group { float: left; } .note-editor .btn-toolbar > .btn + .btn, .note-editor .btn-toolbar > .btn-group + .btn, .note-editor .btn-toolbar > .btn + .btn-group, .note-editor .btn-toolbar > .btn-group + .btn-group { margin-left: 5px; } .note-editor .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .note-editor .btn-group > .btn:first-child { margin-left: 0; } .note-editor .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0; border-top-right-radius: 0; } .note-editor .btn-group > .btn:last-child:not(:first-child), .note-editor .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .note-editor .btn-group > .btn-group { float: left; } .note-editor .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .note-editor .btn-group > .btn-group:first-child > .btn:last-child, .note-editor .btn-group > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-top-right-radius: 0; } .note-editor .btn-group > .btn-group:last-child > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .note-editor .btn-group .dropdown-toggle:active, .note-editor .btn-group.open .dropdown-toggle { outline: 0; } .note-editor .btn-group-xs > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; padding: 1px 5px; } .note-editor .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .note-editor .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .note-editor .btn-group > .btn + .dropdown-toggle { padding-left: 5px; padding-right: 5px; } .note-editor .btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; } .note-editor .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .note-editor .btn .caret { margin-left: 0; } .note-editor .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .note-editor .dropup .btn-lg .caret { border-width: 0 5px 5px; } .note-editor .btn-group-vertical > .btn, .note-editor .btn-group-vertical > .btn-group { display: block; float: none; width: 100%; max-width: 100%; } .note-editor .btn-group-vertical > .btn-group:before, .note-editor .btn-group-vertical > .btn-group:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .btn-group-vertical > .btn-group:after { clear: both; } .note-editor .btn-group-vertical > .btn-group:before, .note-editor .btn-group-vertical > .btn-group:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .btn-group-vertical > .btn-group:after { clear: both; } .note-editor .btn-group-vertical > .btn-group > .btn { float: none; } .note-editor .btn-group-vertical > .btn + .btn, .note-editor .btn-group-vertical > .btn + .btn-group, .note-editor .btn-group-vertical > .btn-group + .btn, .note-editor .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .note-editor .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .note-editor .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .note-editor .btn-group-vertical > .btn:last-child:not(:first-child) { border-bottom-left-radius: 4px; border-top-right-radius: 0; border-top-left-radius: 0; } .note-editor .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .note-editor .btn-group-vertical > .btn-group:first-child > .btn:last-child, .note-editor .btn-group-vertical > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .note-editor .btn-group-vertical > .btn-group:last-child > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .note-editor .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .note-editor .btn-group-justified .btn { float: none; display: table-cell; width: 1%; } .note-editor [data-toggle="buttons"] > .btn > input[type="radio"], .note-editor [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } .note-editor .input-group { position: relative; display: table; border-collapse: separate; } .note-editor .input-group.col { float: none; padding-left: 0; padding-right: 0; } .note-editor .input-group .form-control { width: 100%; margin-bottom: 0; } .note-editor .input-group-lg > .form-control, .note-editor .input-group-lg > .input-group-addon, .note-editor .input-group-lg > .input-group-btn > .btn { height: 45px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.note-editor .input-group-lg > .form-control, select.note-editor .input-group-lg > .input-group-addon, select.note-editor .input-group-lg > .input-group-btn > .btn { height: 45px; line-height: 45px; } textarea.note-editor .input-group-lg > .form-control, textarea.note-editor .input-group-lg > .input-group-addon, textarea.note-editor .input-group-lg > .input-group-btn > .btn { height: auto; } .note-editor .input-group-sm > .form-control, .note-editor .input-group-sm > .input-group-addon, .note-editor .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.note-editor .input-group-sm > .form-control, select.note-editor .input-group-sm > .input-group-addon, select.note-editor .input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.note-editor .input-group-sm > .form-control, textarea.note-editor .input-group-sm > .input-group-addon, textarea.note-editor .input-group-sm > .input-group-btn > .btn { height: auto; } .note-editor .input-group-addon, .note-editor .input-group-btn, .note-editor .input-group .form-control { display: table-cell; } .note-editor .input-group-addon:not(:first-child):not(:last-child), .note-editor .input-group-btn:not(:first-child):not(:last-child), .note-editor .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .note-editor .input-group-addon, .note-editor .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .note-editor .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #555555; text-align: center; background-color: #eeeeee; border: 1px solid #cccccc; border-radius: 4px; } .note-editor .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .note-editor .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .note-editor .input-group-addon input[type="radio"], .note-editor .input-group-addon input[type="checkbox"] { margin-top: 0; } .note-editor .input-group .form-control:first-child, .note-editor .input-group-addon:first-child, .note-editor .input-group-btn:first-child > .btn, .note-editor .input-group-btn:first-child > .dropdown-toggle, .note-editor .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0; border-top-right-radius: 0; } .note-editor .input-group-addon:first-child { border-right: 0; } .note-editor .input-group .form-control:last-child, .note-editor .input-group-addon:last-child, .note-editor .input-group-btn:last-child > .btn, .note-editor .input-group-btn:last-child > .dropdown-toggle, .note-editor .input-group-btn:first-child > .btn:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .note-editor .input-group-addon:last-child { border-left: 0; } .note-editor .input-group-btn { position: relative; white-space: nowrap; } .note-editor .input-group-btn:first-child > .btn { margin-right: -1px; } .note-editor .input-group-btn:last-child > .btn { margin-left: -1px; } .note-editor .input-group-btn > .btn { position: relative; } .note-editor .input-group-btn > .btn + .btn { margin-left: -4px; } .note-editor .input-group-btn > .btn:hover, .note-editor .input-group-btn > .btn:active { z-index: 2; } .note-editor .nav { margin-bottom: 0; padding-left: 0; list-style: none; } .note-editor .nav:before, .note-editor .nav:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .nav:after { clear: both; } .note-editor .nav:before, .note-editor .nav:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .nav:after { clear: both; } .note-editor .nav > li { position: relative; display: block; } .note-editor .nav > li > a { position: relative; display: block; padding: 10px 15px; } .note-editor .nav > li > a:hover, .note-editor .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .note-editor .nav > li.disabled > a { color: #999999; } .note-editor .nav > li.disabled > a:hover, .note-editor .nav > li.disabled > a:focus { color: #999999; text-decoration: none; background-color: transparent; cursor: not-allowed; } .note-editor .nav .open > a, .note-editor .nav .open > a:hover, .note-editor .nav .open > a:focus { background-color: #eeeeee; border-color: #428bca; } .note-editor .nav .open > a .caret, .note-editor .nav .open > a:hover .caret, .note-editor .nav .open > a:focus .caret { border-top-color: #2a6496; border-bottom-color: #2a6496; } .note-editor .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .note-editor .nav > li > a > img { max-width: none; } .note-editor .nav-tabs { border-bottom: 1px solid #dddddd; } .note-editor .nav-tabs > li { float: left; margin-bottom: -1px; } .note-editor .nav-tabs > li > a { margin-right: 2px; line-height: 1.428571429; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .note-editor .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #dddddd; } .note-editor .nav-tabs > li.active > a, .note-editor .nav-tabs > li.active > a:hover, .note-editor .nav-tabs > li.active > a:focus { color: #555555; background-color: #ffffff; border: 1px solid #dddddd; border-bottom-color: transparent; cursor: default; } .note-editor .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .note-editor .nav-tabs.nav-justified > li { float: none; } .note-editor .nav-tabs.nav-justified > li > a { text-align: center; margin-bottom: 5px; } @media (min-width: 768px) { .note-editor .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .note-editor .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .note-editor .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .note-editor .nav-tabs.nav-justified > .active > a, .note-editor .nav-tabs.nav-justified > .active > a:hover, .note-editor .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .note-editor .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .note-editor .nav-tabs.nav-justified > .active > a, .note-editor .nav-tabs.nav-justified > .active > a:hover, .note-editor .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #ffffff; } } .note-editor .nav-pills > li { float: left; } .note-editor .nav-pills > li > a { border-radius: 4px; } .note-editor .nav-pills > li + li { margin-left: 2px; } .note-editor .nav-pills > li.active > a, .note-editor .nav-pills > li.active > a:hover, .note-editor .nav-pills > li.active > a:focus { color: #ffffff; background-color: #428bca; } .note-editor .nav-pills > li.active > a .caret, .note-editor .nav-pills > li.active > a:hover .caret, .note-editor .nav-pills > li.active > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .note-editor .nav-stacked > li { float: none; } .note-editor .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .note-editor .nav-justified { width: 100%; } .note-editor .nav-justified > li { float: none; } .note-editor .nav-justified > li > a { text-align: center; margin-bottom: 5px; } @media (min-width: 768px) { .note-editor .nav-justified > li { display: table-cell; width: 1%; } .note-editor .nav-justified > li > a { margin-bottom: 0; } } .note-editor .nav-tabs-justified { border-bottom: 0; } .note-editor .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .note-editor .nav-tabs-justified > .active > a, .note-editor .nav-tabs-justified > .active > a:hover, .note-editor .nav-tabs-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .note-editor .nav-tabs-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .note-editor .nav-tabs-justified > .active > a, .note-editor .nav-tabs-justified > .active > a:hover, .note-editor .nav-tabs-justified > .active > a:focus { border-bottom-color: #ffffff; } } .note-editor .tab-content > .tab-pane { display: none; } .note-editor .tab-content > .active { display: block; } .note-editor .nav .caret { border-top-color: #428bca; border-bottom-color: #428bca; } .note-editor .nav a:hover .caret { border-top-color: #2a6496; border-bottom-color: #2a6496; } .note-editor .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .note-editor .navbar { position: relative; z-index: 1000; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } .note-editor .navbar:before, .note-editor .navbar:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .navbar:after { clear: both; } .note-editor .navbar:before, .note-editor .navbar:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .navbar:after { clear: both; } @media (min-width: 768px) { .note-editor .navbar { border-radius: 4px; } } .note-editor .navbar-header:before, .note-editor .navbar-header:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .navbar-header:after { clear: both; } .note-editor .navbar-header:before, .note-editor .navbar-header:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .navbar-header:after { clear: both; } @media (min-width: 768px) { .note-editor .navbar-header { float: left; } } .note-editor .navbar-collapse { max-height: 340px; overflow-x: visible; padding-right: 15px; padding-left: 15px; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .note-editor .navbar-collapse:before, .note-editor .navbar-collapse:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .navbar-collapse:after { clear: both; } .note-editor .navbar-collapse:before, .note-editor .navbar-collapse:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .navbar-collapse:after { clear: both; } .note-editor .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .note-editor .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .note-editor .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .note-editor .navbar-collapse.in { overflow-y: visible; } .note-editor .navbar-collapse .navbar-nav.navbar-left:first-child { margin-left: -15px; } .note-editor .navbar-collapse .navbar-nav.navbar-right:last-child { margin-right: -15px; } .note-editor .navbar-collapse .navbar-text:last-child { margin-right: 0; } } .note-editor .container > .navbar-header, .note-editor .container > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .note-editor .container > .navbar-header, .note-editor .container > .navbar-collapse { margin-right: 0; margin-left: 0; } } .note-editor .navbar-static-top { border-width: 0 0 1px; } @media (min-width: 768px) { .note-editor .navbar-static-top { border-radius: 0; } } .note-editor .navbar-fixed-top, .note-editor .navbar-fixed-bottom { position: fixed; right: 0; left: 0; border-width: 0 0 1px; } @media (min-width: 768px) { .note-editor .navbar-fixed-top, .note-editor .navbar-fixed-bottom { border-radius: 0; } } .note-editor .navbar-fixed-top { z-index: 1030; top: 0; } .note-editor .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; } .note-editor .navbar-brand { float: left; padding: 15px 15px; font-size: 18px; line-height: 20px; } .note-editor .navbar-brand:hover, .note-editor .navbar-brand:focus { text-decoration: none; } @media (min-width: 768px) { .navbar > .container .note-editor .navbar-brand { margin-left: -15px; } } .note-editor .navbar-toggle { position: relative; float: right; margin-right: 15px; padding: 9px 10px; margin-top: 8px; margin-bottom: 8px; background-color: transparent; border: 1px solid transparent; border-radius: 4px; } .note-editor .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .note-editor .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .note-editor .navbar-toggle { display: none; } } .note-editor .navbar-nav { margin: 7.5px -15px; } .note-editor .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .note-editor .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .note-editor .navbar-nav .open .dropdown-menu > li > a, .note-editor .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .note-editor .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .note-editor .navbar-nav .open .dropdown-menu > li > a:hover, .note-editor .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .note-editor .navbar-nav { float: left; margin: 0; } .note-editor .navbar-nav > li { float: left; } .note-editor .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } @media (min-width: 768px) { .note-editor .navbar-left { float: left !important; } .note-editor .navbar-right { float: right !important; } } .note-editor .navbar-form { margin-left: -15px; margin-right: -15px; padding: 10px 15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: 8px; margin-bottom: 8px; } @media (min-width: 768px) { .note-editor .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .note-editor .navbar-form .form-control { display: inline-block; } .note-editor .navbar-form .radio, .note-editor .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; padding-left: 0; } .note-editor .navbar-form .radio input[type="radio"], .note-editor .navbar-form .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } @media (max-width: 767px) { .note-editor .navbar-form .form-group { margin-bottom: 5px; } } @media (min-width: 768px) { .note-editor .navbar-form { width: auto; border: 0; margin-left: 0; margin-right: 0; padding-top: 0; padding-bottom: 0; -webkit-box-shadow: none; box-shadow: none; } } .note-editor .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .note-editor .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .note-editor .navbar-nav.pull-right > li > .dropdown-menu, .note-editor .navbar-nav > li > .dropdown-menu.pull-right { left: auto; right: 0; } .note-editor .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .note-editor .navbar-text { float: left; margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .note-editor .navbar-text { margin-left: 15px; margin-right: 15px; } } .note-editor .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .note-editor .navbar-default .navbar-brand { color: #777777; } .note-editor .navbar-default .navbar-brand:hover, .note-editor .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .note-editor .navbar-default .navbar-text { color: #777777; } .note-editor .navbar-default .navbar-nav > li > a { color: #777777; } .note-editor .navbar-default .navbar-nav > li > a:hover, .note-editor .navbar-default .navbar-nav > li > a:focus { color: #333333; background-color: transparent; } .note-editor .navbar-default .navbar-nav > .active > a, .note-editor .navbar-default .navbar-nav > .active > a:hover, .note-editor .navbar-default .navbar-nav > .active > a:focus { color: #555555; background-color: #e7e7e7; } .note-editor .navbar-default .navbar-nav > .disabled > a, .note-editor .navbar-default .navbar-nav > .disabled > a:hover, .note-editor .navbar-default .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .note-editor .navbar-default .navbar-toggle { border-color: #dddddd; } .note-editor .navbar-default .navbar-toggle:hover, .note-editor .navbar-default .navbar-toggle:focus { background-color: #dddddd; } .note-editor .navbar-default .navbar-toggle .icon-bar { background-color: #cccccc; } .note-editor .navbar-default .navbar-collapse, .note-editor .navbar-default .navbar-form { border-color: #e7e7e7; } .note-editor .navbar-default .navbar-nav > .dropdown > a:hover .caret, .note-editor .navbar-default .navbar-nav > .dropdown > a:focus .caret { border-top-color: #333333; border-bottom-color: #333333; } .note-editor .navbar-default .navbar-nav > .open > a, .note-editor .navbar-default .navbar-nav > .open > a:hover, .note-editor .navbar-default .navbar-nav > .open > a:focus { background-color: #e7e7e7; color: #555555; } .note-editor .navbar-default .navbar-nav > .open > a .caret, .note-editor .navbar-default .navbar-nav > .open > a:hover .caret, .note-editor .navbar-default .navbar-nav > .open > a:focus .caret { border-top-color: #555555; border-bottom-color: #555555; } .note-editor .navbar-default .navbar-nav > .dropdown > a .caret { border-top-color: #777777; border-bottom-color: #777777; } @media (max-width: 767px) { .note-editor .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777777; } .note-editor .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .note-editor .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333333; background-color: transparent; } .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555555; background-color: #e7e7e7; } .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .note-editor .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .note-editor .navbar-default .navbar-link { color: #777777; } .note-editor .navbar-default .navbar-link:hover { color: #333333; } .note-editor .navbar-inverse { background-color: #222222; border-color: #080808; } .note-editor .navbar-inverse .navbar-brand { color: #999999; } .note-editor .navbar-inverse .navbar-brand:hover, .note-editor .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .note-editor .navbar-inverse .navbar-text { color: #999999; } .note-editor .navbar-inverse .navbar-nav > li > a { color: #999999; } .note-editor .navbar-inverse .navbar-nav > li > a:hover, .note-editor .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .note-editor .navbar-inverse .navbar-nav > .active > a, .note-editor .navbar-inverse .navbar-nav > .active > a:hover, .note-editor .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: #080808; } .note-editor .navbar-inverse .navbar-nav > .disabled > a, .note-editor .navbar-inverse .navbar-nav > .disabled > a:hover, .note-editor .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444444; background-color: transparent; } .note-editor .navbar-inverse .navbar-toggle { border-color: #333333; } .note-editor .navbar-inverse .navbar-toggle:hover, .note-editor .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .note-editor .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .note-editor .navbar-inverse .navbar-collapse, .note-editor .navbar-inverse .navbar-form { border-color: #101010; } .note-editor .navbar-inverse .navbar-nav > .open > a, .note-editor .navbar-inverse .navbar-nav > .open > a:hover, .note-editor .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; color: #ffffff; } .note-editor .navbar-inverse .navbar-nav > .dropdown > a:hover .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .note-editor .navbar-inverse .navbar-nav > .dropdown > a .caret { border-top-color: #999999; border-bottom-color: #999999; } .note-editor .navbar-inverse .navbar-nav > .open > a .caret, .note-editor .navbar-inverse .navbar-nav > .open > a:hover .caret, .note-editor .navbar-inverse .navbar-nav > .open > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } @media (max-width: 767px) { .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #999999; } .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #080808; } .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .note-editor .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444444; background-color: transparent; } } .note-editor .navbar-inverse .navbar-link { color: #999999; } .note-editor .navbar-inverse .navbar-link:hover { color: #ffffff; } .note-editor .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .note-editor .breadcrumb > li { display: inline-block; } .note-editor .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; color: #cccccc; } .note-editor .breadcrumb > .active { color: #999999; } .note-editor .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .note-editor .pagination > li { display: inline; } .note-editor .pagination > li > a, .note-editor .pagination > li > span { position: relative; float: left; padding: 6px 12px; line-height: 1.428571429; text-decoration: none; background-color: #ffffff; border: 1px solid #dddddd; margin-left: -1px; } .note-editor .pagination > li:first-child > a, .note-editor .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .note-editor .pagination > li:last-child > a, .note-editor .pagination > li:last-child > span { border-bottom-right-radius: 4px; border-top-right-radius: 4px; } .note-editor .pagination > li > a:hover, .note-editor .pagination > li > span:hover, .note-editor .pagination > li > a:focus, .note-editor .pagination > li > span:focus { background-color: #eeeeee; } .note-editor .pagination > .active > a, .note-editor .pagination > .active > span, .note-editor .pagination > .active > a:hover, .note-editor .pagination > .active > span:hover, .note-editor .pagination > .active > a:focus, .note-editor .pagination > .active > span:focus { z-index: 2; color: #ffffff; background-color: #428bca; border-color: #428bca; cursor: default; } .note-editor .pagination > .disabled > span, .note-editor .pagination > .disabled > span:hover, .note-editor .pagination > .disabled > span:focus, .note-editor .pagination > .disabled > a, .note-editor .pagination > .disabled > a:hover, .note-editor .pagination > .disabled > a:focus { color: #999999; background-color: #ffffff; border-color: #dddddd; cursor: not-allowed; } .note-editor .pagination-lg > li > a, .note-editor .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; } .note-editor .pagination-lg > li:first-child > a, .note-editor .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .note-editor .pagination-lg > li:last-child > a, .note-editor .pagination-lg > li:last-child > span { border-bottom-right-radius: 6px; border-top-right-radius: 6px; } .note-editor .pagination-sm > li > a, .note-editor .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; } .note-editor .pagination-sm > li:first-child > a, .note-editor .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .note-editor .pagination-sm > li:last-child > a, .note-editor .pagination-sm > li:last-child > span { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .note-editor .pager { padding-left: 0; margin: 20px 0; list-style: none; text-align: center; } .note-editor .pager:before, .note-editor .pager:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .pager:after { clear: both; } .note-editor .pager:before, .note-editor .pager:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .pager:after { clear: both; } .note-editor .pager li { display: inline; } .note-editor .pager li > a, .note-editor .pager li > span { display: inline-block; padding: 5px 14px; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 15px; } .note-editor .pager li > a:hover, .note-editor .pager li > a:focus { text-decoration: none; background-color: #eeeeee; } .note-editor .pager .next > a, .note-editor .pager .next > span { float: right; } .note-editor .pager .previous > a, .note-editor .pager .previous > span { float: left; } .note-editor .pager .disabled > a, .note-editor .pager .disabled > a:hover, .note-editor .pager .disabled > a:focus, .note-editor .pager .disabled > span { color: #999999; background-color: #ffffff; cursor: not-allowed; } .note-editor .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } .note-editor .label[href]:hover, .note-editor .label[href]:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .note-editor .label:empty { display: none; } .note-editor .label-default { background-color: #999999; } .note-editor .label-default[href]:hover, .note-editor .label-default[href]:focus { background-color: #808080; } .note-editor .label-primary { background-color: #428bca; } .note-editor .label-primary[href]:hover, .note-editor .label-primary[href]:focus { background-color: #3071a9; } .note-editor .label-success { background-color: #5cb85c; } .note-editor .label-success[href]:hover, .note-editor .label-success[href]:focus { background-color: #449d44; } .note-editor .label-info { background-color: #5bc0de; } .note-editor .label-info[href]:hover, .note-editor .label-info[href]:focus { background-color: #31b0d5; } .note-editor .label-warning { background-color: #f0ad4e; } .note-editor .label-warning[href]:hover, .note-editor .label-warning[href]:focus { background-color: #ec971f; } .note-editor .label-danger { background-color: #d9534f; } .note-editor .label-danger[href]:hover, .note-editor .label-danger[href]:focus { background-color: #c9302c; } .note-editor .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; color: #ffffff; line-height: 1; vertical-align: baseline; white-space: nowrap; text-align: center; background-color: #999999; border-radius: 10px; } .note-editor .badge:empty { display: none; } .note-editor a.badge:hover, .note-editor a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .note-editor .btn .badge { position: relative; top: -1px; } .note-editor a.list-group-item.active > .badge, .note-editor .nav-pills > .active > a > .badge { color: #428bca; background-color: #ffffff; } .note-editor .nav-pills > li > a > .badge { margin-left: 3px; } .note-editor .jumbotron { padding: 30px; margin-bottom: 30px; font-size: 21px; font-weight: 200; line-height: 2.1428571435; color: inherit; background-color: #eeeeee; } .note-editor .jumbotron h1 { line-height: 1; color: inherit; } .note-editor .jumbotron p { line-height: 1.4; } .container .note-editor .jumbotron { border-radius: 6px; } @media screen and (min-width: 768px) { .note-editor .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .note-editor .jumbotron { padding-left: 60px; padding-right: 60px; } .note-editor .jumbotron h1 { font-size: 63px; } } .note-editor .thumbnail { padding: 4px; line-height: 1.428571429; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; display: block; margin-bottom: 20px; } .note-editor .thumbnail > img { display: block; max-width: 100%; height: auto; } .note-editor a.thumbnail:hover, .note-editor a.thumbnail:focus, .note-editor a.thumbnail.active { border-color: #428bca; } .note-editor .thumbnail > img { margin-left: auto; margin-right: auto; } .note-editor .thumbnail .caption { padding: 9px; color: #333333; } .note-editor .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .note-editor .alert h4 { margin-top: 0; color: inherit; } .note-editor .alert .alert-link { font-weight: bold; } .note-editor .alert > p, .note-editor .alert > ul { margin-bottom: 0; } .note-editor .alert > p + p { margin-top: 5px; } .note-editor .alert-dismissable { padding-right: 35px; } .note-editor .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit; } .note-editor .alert-success { background-color: #dff0d8; border-color: #d6e9c6; color: #468847; } .note-editor .alert-success hr { border-top-color: #c9e2b3; } .note-editor .alert-success .alert-link { color: #356635; } .note-editor .alert-info { background-color: #d9edf7; border-color: #bce8f1; color: #3a87ad; } .note-editor .alert-info hr { border-top-color: #a6e1ec; } .note-editor .alert-info .alert-link { color: #2d6987; } .note-editor .alert-warning { background-color: #fcf8e3; border-color: #faebcc; color: #c09853; } .note-editor .alert-warning hr { border-top-color: #f7e1b5; } .note-editor .alert-warning .alert-link { color: #a47e3c; } .note-editor .alert-danger { background-color: #f2dede; border-color: #ebccd1; color: #b94a48; } .note-editor .alert-danger hr { border-top-color: #e4b9c0; } .note-editor .alert-danger .alert-link { color: #953b39; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-moz-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .note-editor .progress { overflow: hidden; height: 20px; margin-bottom: 20px; background-color: #f5f5f5; border-radius: 4px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .note-editor .progress-bar { float: left; width: 0%; height: 100%; font-size: 12px; line-height: 20px; color: #ffffff; text-align: center; background-color: #428bca; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; transition: width 0.6s ease; } .note-editor .progress-striped .progress-bar { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-size: 40px 40px; } .note-editor .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .note-editor .progress-bar-success { background-color: #5cb85c; } .progress-striped .note-editor .progress-bar-success { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .note-editor .progress-bar-info { background-color: #5bc0de; } .progress-striped .note-editor .progress-bar-info { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .note-editor .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .note-editor .progress-bar-warning { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .note-editor .progress-bar-danger { background-color: #d9534f; } .progress-striped .note-editor .progress-bar-danger { background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .note-editor .media, .note-editor .media-body { overflow: hidden; zoom: 1; } .note-editor .media, .note-editor .media .media { margin-top: 15px; } .note-editor .media:first-child { margin-top: 0; } .note-editor .media-object { display: block; } .note-editor .media-heading { margin: 0 0 5px; } .note-editor .media > .pull-left { margin-right: 10px; } .note-editor .media > .pull-right { margin-left: 10px; } .note-editor .media-list { padding-left: 0; list-style: none; } .note-editor .list-group { margin-bottom: 20px; padding-left: 0; } .note-editor .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #ffffff; border: 1px solid #dddddd; } .note-editor .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .note-editor .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .note-editor .list-group-item > .badge { float: right; } .note-editor .list-group-item > .badge + .badge { margin-right: 5px; } .note-editor a.list-group-item { color: #555555; } .note-editor a.list-group-item .list-group-item-heading { color: #333333; } .note-editor a.list-group-item:hover, .note-editor a.list-group-item:focus { text-decoration: none; background-color: #f5f5f5; } .note-editor a.list-group-item.active, .note-editor a.list-group-item.active:hover, .note-editor a.list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #428bca; border-color: #428bca; } .note-editor a.list-group-item.active .list-group-item-heading, .note-editor a.list-group-item.active:hover .list-group-item-heading, .note-editor a.list-group-item.active:focus .list-group-item-heading { color: inherit; } .note-editor a.list-group-item.active .list-group-item-text, .note-editor a.list-group-item.active:hover .list-group-item-text, .note-editor a.list-group-item.active:focus .list-group-item-text { color: #e1edf7; } .note-editor .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .note-editor .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .note-editor .panel { margin-bottom: 20px; background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .note-editor .panel-body { padding: 15px; } .note-editor .panel-body:before, .note-editor .panel-body:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .panel-body:after { clear: both; } .note-editor .panel-body:before, .note-editor .panel-body:after { content: " "; /* 1 */ display: table; /* 2 */ } .note-editor .panel-body:after { clear: both; } .note-editor .panel > .list-group { margin-bottom: 0; } .note-editor .panel > .list-group .list-group-item { border-width: 1px 0; } .note-editor .panel > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .note-editor .panel > .list-group .list-group-item:last-child { border-bottom: 0; } .note-editor .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .note-editor .panel > .table, .note-editor .panel > .table-responsive { margin-bottom: 0; } .note-editor .panel > .panel-body + .table, .note-editor .panel > .panel-body + .table-responsive { border-top: 1px solid #dddddd; } .note-editor .panel > .table-bordered, .note-editor .panel > .table-responsive > .table-bordered { border: 0; } .note-editor .panel > .table-bordered > thead > tr > th:first-child, .note-editor .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .note-editor .panel > .table-bordered > tbody > tr > th:first-child, .note-editor .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .note-editor .panel > .table-bordered > tfoot > tr > th:first-child, .note-editor .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .note-editor .panel > .table-bordered > thead > tr > td:first-child, .note-editor .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .note-editor .panel > .table-bordered > tbody > tr > td:first-child, .note-editor .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .note-editor .panel > .table-bordered > tfoot > tr > td:first-child, .note-editor .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .note-editor .panel > .table-bordered > thead > tr > th:last-child, .note-editor .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .note-editor .panel > .table-bordered > tbody > tr > th:last-child, .note-editor .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .note-editor .panel > .table-bordered > tfoot > tr > th:last-child, .note-editor .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .note-editor .panel > .table-bordered > thead > tr > td:last-child, .note-editor .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .note-editor .panel > .table-bordered > tbody > tr > td:last-child, .note-editor .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .note-editor .panel > .table-bordered > tfoot > tr > td:last-child, .note-editor .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .note-editor .panel > .table-bordered > thead > tr:last-child > th, .note-editor .panel > .table-responsive > .table-bordered > thead > tr:last-child > th, .note-editor .panel > .table-bordered > tbody > tr:last-child > th, .note-editor .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .note-editor .panel > .table-bordered > tfoot > tr:last-child > th, .note-editor .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, .note-editor .panel > .table-bordered > thead > tr:last-child > td, .note-editor .panel > .table-responsive > .table-bordered > thead > tr:last-child > td, .note-editor .panel > .table-bordered > tbody > tr:last-child > td, .note-editor .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .note-editor .panel > .table-bordered > tfoot > tr:last-child > td, .note-editor .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } .note-editor .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .note-editor .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; } .note-editor .panel-title > a { color: inherit; } .note-editor .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .note-editor .panel-group .panel { margin-bottom: 0; border-radius: 4px; overflow: hidden; } .note-editor .panel-group .panel + .panel { margin-top: 5px; } .note-editor .panel-group .panel-heading { border-bottom: 0; } .note-editor .panel-group .panel-heading + .panel-collapse .panel-body { border-top: 1px solid #dddddd; } .note-editor .panel-group .panel-footer { border-top: 0; } .note-editor .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #dddddd; } .note-editor .panel-default { border-color: #dddddd; } .note-editor .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #dddddd; } .note-editor .panel-default > .panel-heading + .panel-collapse .panel-body { border-top-color: #dddddd; } .note-editor .panel-default > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #dddddd; } .note-editor .panel-primary { border-color: #428bca; } .note-editor .panel-primary > .panel-heading { color: #ffffff; background-color: #428bca; border-color: #428bca; } .note-editor .panel-primary > .panel-heading + .panel-collapse .panel-body { border-top-color: #428bca; } .note-editor .panel-primary > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #428bca; } .note-editor .panel-success { border-color: #d6e9c6; } .note-editor .panel-success > .panel-heading { color: #468847; background-color: #dff0d8; border-color: #d6e9c6; } .note-editor .panel-success > .panel-heading + .panel-collapse .panel-body { border-top-color: #d6e9c6; } .note-editor .panel-success > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #d6e9c6; } .note-editor .panel-warning { border-color: #faebcc; } .note-editor .panel-warning > .panel-heading { color: #c09853; background-color: #fcf8e3; border-color: #faebcc; } .note-editor .panel-warning > .panel-heading + .panel-collapse .panel-body { border-top-color: #faebcc; } .note-editor .panel-warning > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #faebcc; } .note-editor .panel-danger { border-color: #ebccd1; } .note-editor .panel-danger > .panel-heading { color: #b94a48; background-color: #f2dede; border-color: #ebccd1; } .note-editor .panel-danger > .panel-heading + .panel-collapse .panel-body { border-top-color: #ebccd1; } .note-editor .panel-danger > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #ebccd1; } .note-editor .panel-info { border-color: #bce8f1; } .note-editor .panel-info > .panel-heading { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1; } .note-editor .panel-info > .panel-heading + .panel-collapse .panel-body { border-top-color: #bce8f1; } .note-editor .panel-info > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #bce8f1; } .note-editor .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .note-editor .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .note-editor .well-lg { padding: 24px; border-radius: 6px; } .note-editor .well-sm { padding: 9px; border-radius: 3px; } .note-editor .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .note-editor .close:hover, .note-editor .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.note-editor .close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } .modal { display: none; overflow: auto; overflow-y: scroll; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .modal-dialog { margin-left: auto; margin-right: auto; width: auto; padding: 10px; z-index: 1050; } .modal-content { position: relative; background-color: #ffffff; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; outline: none; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1030; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; min-height: 16.428571429px; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.428571429; } .modal-body { position: relative; padding: 20px; } .modal-footer { margin-top: 15px; padding: 19px 20px 20px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer:before, .modal-footer:after { content: " "; /* 1 */ display: table; /* 2 */ } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { content: " "; /* 1 */ display: table; /* 2 */ } .modal-footer:after { clear: both; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } @media screen and (min-width: 768px) { .modal-dialog { width: 600px; padding-top: 30px; padding-bottom: 30px; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } } .tooltip { position: absolute; z-index: 1030; display: block; visibility: visible; font-size: 12px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { margin-top: -3px; padding: 5px 0; } .tooltip.right { margin-left: 3px; padding: 0 5px; } .tooltip.bottom { margin-top: 3px; padding: 5px 0; } .tooltip.left { margin-left: -3px; padding: 0 5px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: #000000; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.top-left .tooltip-arrow { bottom: 0; left: 5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.top-right .tooltip-arrow { bottom: 0; right: 5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; background-color: #ffffff; background-clip: padding-box; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); white-space: normal; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { margin: 0; padding: 8px 14px; font-size: 14px; font-weight: normal; line-height: 18px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover .arrow, .popover .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover .arrow { border-width: 11px; } .popover .arrow:after { border-width: 10px; content: ""; } .popover.top .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; } .popover.top .arrow:after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #ffffff; } .popover.right .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); } .popover.right .arrow:after { content: " "; left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #ffffff; } .popover.bottom .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; } .popover.bottom .arrow:after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #ffffff; } .popover.left .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left .arrow:after { content: " "; right: 1px; border-right-width: 0; border-left-color: #ffffff; bottom: -10px; } .carousel { position: relative; } .carousel-inner { position: relative; overflow: hidden; width: 100%; } .carousel-inner > .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; left: 0; bottom: 0; width: 15%; opacity: 0.5; filter: alpha(opacity=50); font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-control.left { background-image: -webkit-gradient(linear, 0% top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { left: auto; right: 0; background-image: -webkit-gradient(linear, 0% top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0; list-style: none; text-align: center; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid #ffffff; border-radius: 10px; cursor: pointer; } .carousel-indicators .active { margin: 0; width: 12px; height: 12px; background-color: #ffffff; } .carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicons-chevron-left, .carousel-control .glyphicons-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after { content: " "; /* 1 */ display: table; /* 2 */ } .clearfix:after { clear: both; } .center-block { display: block; margin-left: auto; margin-right: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; visibility: hidden !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, tr.visible-xs, th.visible-xs, td.visible-xs { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-xs.visible-sm { display: block !important; } tr.visible-xs.visible-sm { display: table-row !important; } th.visible-xs.visible-sm, td.visible-xs.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-xs.visible-md { display: block !important; } tr.visible-xs.visible-md { display: table-row !important; } th.visible-xs.visible-md, td.visible-xs.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-xs.visible-lg { display: block !important; } tr.visible-xs.visible-lg { display: table-row !important; } th.visible-xs.visible-lg, td.visible-xs.visible-lg { display: table-cell !important; } } .visible-sm, tr.visible-sm, th.visible-sm, td.visible-sm { display: none !important; } @media (max-width: 767px) { .visible-sm.visible-xs { display: block !important; } tr.visible-sm.visible-xs { display: table-row !important; } th.visible-sm.visible-xs, td.visible-sm.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-sm.visible-md { display: block !important; } tr.visible-sm.visible-md { display: table-row !important; } th.visible-sm.visible-md, td.visible-sm.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-sm.visible-lg { display: block !important; } tr.visible-sm.visible-lg { display: table-row !important; } th.visible-sm.visible-lg, td.visible-sm.visible-lg { display: table-cell !important; } } .visible-md, tr.visible-md, th.visible-md, td.visible-md { display: none !important; } @media (max-width: 767px) { .visible-md.visible-xs { display: block !important; } tr.visible-md.visible-xs { display: table-row !important; } th.visible-md.visible-xs, td.visible-md.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-md.visible-sm { display: block !important; } tr.visible-md.visible-sm { display: table-row !important; } th.visible-md.visible-sm, td.visible-md.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-md.visible-lg { display: block !important; } tr.visible-md.visible-lg { display: table-row !important; } th.visible-md.visible-lg, td.visible-md.visible-lg { display: table-cell !important; } } .visible-lg, tr.visible-lg, th.visible-lg, td.visible-lg { display: none !important; } @media (max-width: 767px) { .visible-lg.visible-xs { display: block !important; } tr.visible-lg.visible-xs { display: table-row !important; } th.visible-lg.visible-xs, td.visible-lg.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-lg.visible-sm { display: block !important; } tr.visible-lg.visible-sm { display: table-row !important; } th.visible-lg.visible-sm, td.visible-lg.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-lg.visible-md { display: block !important; } tr.visible-lg.visible-md { display: table-row !important; } th.visible-lg.visible-md, td.visible-lg.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } .hidden-xs { display: block !important; } tr.hidden-xs { display: table-row !important; } th.hidden-xs, td.hidden-xs { display: table-cell !important; } @media (max-width: 767px) { .hidden-xs, tr.hidden-xs, th.hidden-xs, td.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-xs.hidden-sm, tr.hidden-xs.hidden-sm, th.hidden-xs.hidden-sm, td.hidden-xs.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-xs.hidden-md, tr.hidden-xs.hidden-md, th.hidden-xs.hidden-md, td.hidden-xs.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-xs.hidden-lg, tr.hidden-xs.hidden-lg, th.hidden-xs.hidden-lg, td.hidden-xs.hidden-lg { display: none !important; } } .hidden-sm { display: block !important; } tr.hidden-sm { display: table-row !important; } th.hidden-sm, td.hidden-sm { display: table-cell !important; } @media (max-width: 767px) { .hidden-sm.hidden-xs, tr.hidden-sm.hidden-xs, th.hidden-sm.hidden-xs, td.hidden-sm.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm, tr.hidden-sm, th.hidden-sm, td.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-sm.hidden-md, tr.hidden-sm.hidden-md, th.hidden-sm.hidden-md, td.hidden-sm.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-sm.hidden-lg, tr.hidden-sm.hidden-lg, th.hidden-sm.hidden-lg, td.hidden-sm.hidden-lg { display: none !important; } } .hidden-md { display: block !important; } tr.hidden-md { display: table-row !important; } th.hidden-md, td.hidden-md { display: table-cell !important; } @media (max-width: 767px) { .hidden-md.hidden-xs, tr.hidden-md.hidden-xs, th.hidden-md.hidden-xs, td.hidden-md.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-md.hidden-sm, tr.hidden-md.hidden-sm, th.hidden-md.hidden-sm, td.hidden-md.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md, tr.hidden-md, th.hidden-md, td.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-md.hidden-lg, tr.hidden-md.hidden-lg, th.hidden-md.hidden-lg, td.hidden-md.hidden-lg { display: none !important; } } .hidden-lg { display: block !important; } tr.hidden-lg { display: table-row !important; } th.hidden-lg, td.hidden-lg { display: table-cell !important; } @media (max-width: 767px) { .hidden-lg.hidden-xs, tr.hidden-lg.hidden-xs, th.hidden-lg.hidden-xs, td.hidden-lg.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-lg.hidden-sm, tr.hidden-lg.hidden-sm, th.hidden-lg.hidden-sm, td.hidden-lg.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-lg.hidden-md, tr.hidden-lg.hidden-md, th.hidden-lg.hidden-md, td.hidden-lg.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg, tr.hidden-lg, th.hidden-lg, td.hidden-lg { display: none !important; } } .visible-print, tr.visible-print, th.visible-print, td.visible-print { display: none !important; } @media print { .visible-print { display: block !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } .hidden-print, tr.hidden-print, th.hidden-print, td.hidden-print { display: none !important; } } ================================================ FILE: src/main/resources/static/css/plugins/summernote/summernote.css ================================================ .note-editor { height: 300px; } .note-editor .note-dropzone { position: absolute; z-index: 1; display: none; color: #87cefa; background-color: white; border: 2px dashed #87cefa; opacity: .95; pointer-event: none } .note-editor .note-dropzone .note-dropzone-message { display: table-cell; font-size: 28px; font-weight: bold; text-align: center; vertical-align: middle } .note-editor .note-dropzone.hover { color: #098ddf; border: 2px dashed #098ddf } .note-editor.dragover .note-dropzone { display: table } .note-editor.fullscreen { position: fixed; top: 0; left: 0; z-index: 1050; width: 100% } .note-editor.fullscreen .note-editable { background-color: white } .note-editor.fullscreen .note-resizebar { display: none } .note-editor.codeview .note-editable { display: none } .note-editor.codeview .note-codable { display: block } .note-editor .note-toolbar { padding-bottom: 5px; padding-left: 10px; padding-top: 5px; margin: 0; background-color: #f5f5f5; border-bottom: 1px solid #E7EAEC } .note-editor .note-toolbar > .btn-group { margin-top: 5px; margin-right: 5px; margin-left: 0 } .note-editor .note-toolbar .note-table .dropdown-menu { min-width: 0; padding: 5px } .note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker { font-size: 18px } .note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-mousecatcher { position: absolute !important; z-index: 3; width: 10em; height: 10em; cursor: pointer } .note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-unhighlighted { position: relative !important; z-index: 1; width: 5em; height: 5em; background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat } .note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-highlighted { position: absolute !important; z-index: 2; width: 1em; height: 1em; background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat } .note-editor .note-toolbar .note-style h1, .note-editor .note-toolbar .note-style h2, .note-editor .note-toolbar .note-style h3, .note-editor .note-toolbar .note-style h4, .note-editor .note-toolbar .note-style h5, .note-editor .note-toolbar .note-style h6, .note-editor .note-toolbar .note-style blockquote { margin: 0 } .note-editor .note-toolbar .note-color .dropdown-toggle { width: 20px; padding-left: 5px } .note-editor .note-toolbar .note-color .dropdown-menu { min-width: 290px } .note-editor .note-toolbar .note-color .dropdown-menu .btn-group { margin: 0 } .note-editor .note-toolbar .note-color .dropdown-menu .btn-group:first-child { margin: 0 5px } .note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title { margin: 2px 7px; font-size: 12px; text-align: center; border-bottom: 1px solid #eee } .note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset { padding: 0 3px; margin: 5px; font-size: 12px; cursor: pointer; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px } .note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover { background: #eee } .note-editor .note-toolbar .note-para .dropdown-menu { min-width: 216px; padding: 5px } .note-editor .note-toolbar .note-para .dropdown-menu > div:first-child { margin-right: 5px } .note-editor .note-statusbar { background-color: #f5f5f5 } .note-editor .note-statusbar .note-resizebar { width: 100%; height: 8px; cursor: s-resize; border-top: 1px solid #a9a9a9 } .note-editor .note-statusbar .note-resizebar .note-icon-bar { width: 20px; margin: 1px auto; border-top: 1px solid #a9a9a9 } .note-editor .note-popover .popover { max-width: none } .note-editor .note-popover .popover .popover-content { padding: 5px } .note-editor .note-popover .popover .popover-content a { display: inline-block; max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle } .note-editor .note-popover .popover .popover-content .btn-group + .btn-group { margin-left: 5px } .note-editor .note-popover .popover .arrow { left: 20px } .note-editor .note-handle .note-control-selection { position: absolute; display: none; border: 1px solid black } .note-editor .note-handle .note-control-selection > div { position: absolute } .note-editor .note-handle .note-control-selection .note-control-selection-bg { width: 100%; height: 100%; background-color: black; -webkit-opacity: .3; -khtml-opacity: .3; -moz-opacity: .3; opacity: .3; -ms-filter: alpha(opacity=30); filter: alpha(opacity=30) } .note-editor .note-handle .note-control-selection .note-control-handle { width: 7px; height: 7px; border: 1px solid black } .note-editor .note-handle .note-control-selection .note-control-holder { width: 7px; height: 7px; border: 1px solid black } .note-editor .note-handle .note-control-selection .note-control-sizing { width: 7px; height: 7px; background-color: white; border: 1px solid black } .note-editor .note-handle .note-control-selection .note-control-nw { top: -5px; left: -5px; border-right: 0; border-bottom: 0 } .note-editor .note-handle .note-control-selection .note-control-ne { top: -5px; right: -5px; border-bottom: 0; border-left: none } .note-editor .note-handle .note-control-selection .note-control-sw { bottom: -5px; left: -5px; border-top: 0; border-right: 0 } .note-editor .note-handle .note-control-selection .note-control-se { right: -5px; bottom: -5px; cursor: se-resize } .note-editor .note-handle .note-control-selection .note-control-selection-info { right: 0; bottom: 0; padding: 5px; margin: 5px; font-size: 12px; color: white; background-color: black; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-opacity: .7; -khtml-opacity: .7; -moz-opacity: .7; opacity: .7; -ms-filter: alpha(opacity=70); filter: alpha(opacity=70) } .note-editor .note-dialog > div { display: none } .note-editor .note-dialog .note-image-dialog .note-dropzone { min-height: 100px; margin-bottom: 10px; font-size: 30px; line-height: 4; color: lightgray; text-align: center; border: 4px dashed lightgray } .note-editor .note-dialog .note-help-dialog { font-size: 12px; color: #ccc; background: transparent; background-color: #222 !important; border: 0; -webkit-opacity: .9; -khtml-opacity: .9; -moz-opacity: .9; opacity: .9; -ms-filter: alpha(opacity=90); filter: alpha(opacity=90) } .note-editor .note-dialog .note-help-dialog .modal-content { background: transparent; border: 1px solid white; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none } .note-editor .note-dialog .note-help-dialog a { font-size: 12px; color: white } .note-editor .note-dialog .note-help-dialog .title { padding-bottom: 5px; font-size: 14px; font-weight: bold; color: white; border-bottom: white 1px solid } .note-editor .note-dialog .note-help-dialog .modal-close { font-size: 14px; color: #dd0; cursor: pointer } .note-editor .note-dialog .note-help-dialog .note-shortcut-layout { width: 100% } .note-editor .note-dialog .note-help-dialog .note-shortcut-layout td { vertical-align: top } .note-editor .note-dialog .note-help-dialog .note-shortcut { margin-top: 8px } .note-editor .note-dialog .note-help-dialog .note-shortcut th { font-size: 13px; color: #dd0; text-align: left } .note-editor .note-dialog .note-help-dialog .note-shortcut td:first-child { min-width: 110px; padding-right: 10px; font-family: "Courier New"; color: #dd0; text-align: right } .note-editor .note-editable { padding: 20px; overflow: auto; outline: 0 } .note-editor .note-editable[contenteditable="false"] { background-color: #e5e5e5 } .note-editor .note-codable { display: none; width: 100%; padding: 10px; margin-bottom: 0; font-family: Menlo, Monaco, monospace, sans-serif; font-size: 14px; color: #ccc; background-color: #222; border: 0; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; box-shadow: none; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; resize: none } .note-editor .dropdown-menu { min-width: 90px } .note-editor .dropdown-menu.right { right: 0; left: auto } .note-editor .dropdown-menu.right::before { right: 9px; left: auto !important } .note-editor .dropdown-menu.right::after { right: 10px; left: auto !important } .note-editor .dropdown-menu li a i { color: deepskyblue; visibility: hidden } .note-editor .dropdown-menu li a.checked i { visibility: visible } .note-editor .note-fontsize-10 { font-size: 10px } .note-editor .note-color-palette { line-height: 1 } .note-editor .note-color-palette div .note-color-btn { width: 17px; height: 17px; padding: 0; margin: 0; border: 1px solid #fff } .note-editor .note-color-palette div .note-color-btn:hover { border: 1px solid #000 } ================================================ FILE: src/main/resources/static/css/plugins/sweetalert/sweetalert.css ================================================ body.stop-scrolling { height: 100%; overflow: hidden; } .sweet-overlay { background-color: black; /* IE8 */ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; /* IE8 */ background-color: rgba(0, 0, 0, 0.4); position: fixed; left: 0; right: 0; top: 0; bottom: 0; display: none; z-index: 10000; } .sweet-alert { background-color: white; font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; width: 478px; padding: 17px; border-radius: 5px; text-align: center; position: fixed; left: 50%; top: 50%; margin-left: -256px; margin-top: -200px; overflow: hidden; display: none; z-index: 99999; } @media all and (max-width: 540px) { .sweet-alert { width: auto; margin-left: 0; margin-right: 0; left: 15px; right: 15px; } } .sweet-alert h2 { color: #575757; font-size: 30px; text-align: center; font-weight: 600; text-transform: none; position: relative; margin: 25px 0; padding: 0; line-height: 40px; display: block; } .sweet-alert p { color: #797979; font-size: 16px; text-align: center; font-weight: 300; position: relative; text-align: inherit; float: none; margin: 0; padding: 0; line-height: normal; } .sweet-alert fieldset { border: none; position: relative; } .sweet-alert .sa-error-container { background-color: #f1f1f1; margin-left: -17px; margin-right: -17px; overflow: hidden; padding: 0 10px; max-height: 0; webkit-transition: padding 0.15s, max-height 0.15s; transition: padding 0.15s, max-height 0.15s; } .sweet-alert .sa-error-container.show { padding: 10px 0; max-height: 100px; webkit-transition: padding 0.2s, max-height 0.2s; transition: padding 0.25s, max-height 0.25s; } .sweet-alert .sa-error-container .icon { display: inline-block; width: 24px; height: 24px; border-radius: 50%; background-color: #ea7d7d; color: white; line-height: 24px; text-align: center; margin-right: 3px; } .sweet-alert .sa-error-container p { display: inline-block; } .sweet-alert .sa-input-error { position: absolute; top: 29px; right: 26px; width: 20px; height: 20px; opacity: 0; -webkit-transform: scale(0.5); transform: scale(0.5); -webkit-transform-origin: 50% 50%; transform-origin: 50% 50%; -webkit-transition: all 0.1s; transition: all 0.1s; } .sweet-alert .sa-input-error::before, .sweet-alert .sa-input-error::after { content: ""; width: 20px; height: 6px; background-color: #f06e57; border-radius: 3px; position: absolute; top: 50%; margin-top: -4px; left: 50%; margin-left: -9px; } .sweet-alert .sa-input-error::before { -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sweet-alert .sa-input-error::after { -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sweet-alert .sa-input-error.show { opacity: 1; -webkit-transform: scale(1); transform: scale(1); } .sweet-alert input { width: 100%; box-sizing: border-box; border-radius: 3px; border: 1px solid #d7d7d7; height: 43px; margin-top: 10px; margin-bottom: 17px; font-size: 18px; box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.06); padding: 0 12px; display: none; -webkit-transition: all 0.3s; transition: all 0.3s; } .sweet-alert input:focus { outline: none; box-shadow: 0px 0px 3px #c4e6f5; border: 1px solid #b4dbed; } .sweet-alert input:focus::-moz-placeholder { transition: opacity 0.3s 0.03s ease; opacity: 0.5; } .sweet-alert input:focus:-ms-input-placeholder { transition: opacity 0.3s 0.03s ease; opacity: 0.5; } .sweet-alert input:focus::-webkit-input-placeholder { transition: opacity 0.3s 0.03s ease; opacity: 0.5; } .sweet-alert input::-moz-placeholder { color: #bdbdbd; } .sweet-alert input:-ms-input-placeholder { color: #bdbdbd; } .sweet-alert input::-webkit-input-placeholder { color: #bdbdbd; } .sweet-alert.show-input input { display: block; } .sweet-alert button { background-color: #AEDEF4; color: white; border: none; box-shadow: none; font-size: 17px; font-weight: 500; -webkit-border-radius: 4px; border-radius: 5px; padding: 10px 32px; margin: 26px 5px 0 5px; cursor: pointer; } .sweet-alert button:focus { outline: none; box-shadow: 0 0 2px rgba(128, 179, 235, 0.5), inset 0 0 0 1px rgba(0, 0, 0, 0.05); } .sweet-alert button:hover { background-color: #a1d9f2; } .sweet-alert button:active { background-color: #81ccee; } .sweet-alert button.cancel { background-color: #D0D0D0; } .sweet-alert button.cancel:hover { background-color: #c8c8c8; } .sweet-alert button.cancel:active { background-color: #b6b6b6; } .sweet-alert button.cancel:focus { box-shadow: rgba(197, 205, 211, 0.8) 0px 0px 2px, rgba(0, 0, 0, 0.0470588) 0px 0px 0px 1px inset !important; } .sweet-alert button::-moz-focus-inner { border: 0; } .sweet-alert[data-has-cancel-button=false] button { box-shadow: none !important; } .sweet-alert[data-has-confirm-button=false][data-has-cancel-button=false] { padding-bottom: 40px; } .sweet-alert .sa-icon { width: 80px; height: 80px; border: 4px solid gray; -webkit-border-radius: 40px; border-radius: 40px; border-radius: 50%; margin: 20px auto; padding: 0; position: relative; box-sizing: content-box; } .sweet-alert .sa-icon.sa-error { border-color: #F27474; } .sweet-alert .sa-icon.sa-error .sa-x-mark { position: relative; display: block; } .sweet-alert .sa-icon.sa-error .sa-line { position: absolute; height: 5px; width: 47px; background-color: #F27474; display: block; top: 37px; border-radius: 2px; } .sweet-alert .sa-icon.sa-error .sa-line.sa-left { -webkit-transform: rotate(45deg); transform: rotate(45deg); left: 17px; } .sweet-alert .sa-icon.sa-error .sa-line.sa-right { -webkit-transform: rotate(-45deg); transform: rotate(-45deg); right: 16px; } .sweet-alert .sa-icon.sa-warning { border-color: #F8BB86; } .sweet-alert .sa-icon.sa-warning .sa-body { position: absolute; width: 5px; height: 47px; left: 50%; top: 10px; -webkit-border-radius: 2px; border-radius: 2px; margin-left: -2px; background-color: #F8BB86; } .sweet-alert .sa-icon.sa-warning .sa-dot { position: absolute; width: 7px; height: 7px; -webkit-border-radius: 50%; border-radius: 50%; margin-left: -3px; left: 50%; bottom: 10px; background-color: #F8BB86; } .sweet-alert .sa-icon.sa-info { border-color: #C9DAE1; } .sweet-alert .sa-icon.sa-info::before { content: ""; position: absolute; width: 5px; height: 29px; left: 50%; bottom: 17px; border-radius: 2px; margin-left: -2px; background-color: #C9DAE1; } .sweet-alert .sa-icon.sa-info::after { content: ""; position: absolute; width: 7px; height: 7px; border-radius: 50%; margin-left: -3px; top: 19px; background-color: #C9DAE1; } .sweet-alert .sa-icon.sa-success { border-color: #A5DC86; } .sweet-alert .sa-icon.sa-success::before, .sweet-alert .sa-icon.sa-success::after { content: ''; -webkit-border-radius: 40px; border-radius: 40px; border-radius: 50%; position: absolute; width: 60px; height: 120px; background: white; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sweet-alert .sa-icon.sa-success::before { -webkit-border-radius: 120px 0 0 120px; border-radius: 120px 0 0 120px; top: -7px; left: -33px; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); -webkit-transform-origin: 60px 60px; transform-origin: 60px 60px; } .sweet-alert .sa-icon.sa-success::after { -webkit-border-radius: 0 120px 120px 0; border-radius: 0 120px 120px 0; top: -11px; left: 30px; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); -webkit-transform-origin: 0px 60px; transform-origin: 0px 60px; } .sweet-alert .sa-icon.sa-success .sa-placeholder { width: 80px; height: 80px; border: 4px solid rgba(165, 220, 134, 0.2); -webkit-border-radius: 40px; border-radius: 40px; border-radius: 50%; box-sizing: content-box; position: absolute; left: -4px; top: -4px; z-index: 2; } .sweet-alert .sa-icon.sa-success .sa-fix { width: 5px; height: 90px; background-color: white; position: absolute; left: 28px; top: 8px; z-index: 1; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sweet-alert .sa-icon.sa-success .sa-line { height: 5px; background-color: #A5DC86; display: block; border-radius: 2px; position: absolute; z-index: 2; } .sweet-alert .sa-icon.sa-success .sa-line.sa-tip { width: 25px; left: 14px; top: 46px; -webkit-transform: rotate(45deg); transform: rotate(45deg); } .sweet-alert .sa-icon.sa-success .sa-line.sa-long { width: 47px; right: 8px; top: 38px; -webkit-transform: rotate(-45deg); transform: rotate(-45deg); } .sweet-alert .sa-icon.sa-custom { background-size: contain; border-radius: 0; border: none; background-position: center center; background-repeat: no-repeat; } /* * Animations */ @-webkit-keyframes showSweetAlert { 0% { transform: scale(0.7); -webkit-transform: scale(0.7); } 45% { transform: scale(1.05); -webkit-transform: scale(1.05); } 80% { transform: scale(0.95); -webkit-transform: scale(0.95); } 100% { transform: scale(1); -webkit-transform: scale(1); } } @keyframes showSweetAlert { 0% { transform: scale(0.7); -webkit-transform: scale(0.7); } 45% { transform: scale(1.05); -webkit-transform: scale(1.05); } 80% { transform: scale(0.95); -webkit-transform: scale(0.95); } 100% { transform: scale(1); -webkit-transform: scale(1); } } @-webkit-keyframes hideSweetAlert { 0% { transform: scale(1); -webkit-transform: scale(1); } 100% { transform: scale(0.5); -webkit-transform: scale(0.5); } } @keyframes hideSweetAlert { 0% { transform: scale(1); -webkit-transform: scale(1); } 100% { transform: scale(0.5); -webkit-transform: scale(0.5); } } @-webkit-keyframes slideFromTop { 0% { top: 0%; } 100% { top: 50%; } } @keyframes slideFromTop { 0% { top: 0%; } 100% { top: 50%; } } @-webkit-keyframes slideToTop { 0% { top: 50%; } 100% { top: 0%; } } @keyframes slideToTop { 0% { top: 50%; } 100% { top: 0%; } } @-webkit-keyframes slideFromBottom { 0% { top: 70%; } 100% { top: 50%; } } @keyframes slideFromBottom { 0% { top: 70%; } 100% { top: 50%; } } @-webkit-keyframes slideToBottom { 0% { top: 50%; } 100% { top: 70%; } } @keyframes slideToBottom { 0% { top: 50%; } 100% { top: 70%; } } .showSweetAlert[data-animation=pop] { -webkit-animation: showSweetAlert 0.3s; animation: showSweetAlert 0.3s; } .showSweetAlert[data-animation=none] { -webkit-animation: none; animation: none; } .showSweetAlert[data-animation=slide-from-top] { -webkit-animation: slideFromTop 0.3s; animation: slideFromTop 0.3s; } .showSweetAlert[data-animation=slide-from-bottom] { -webkit-animation: slideFromBottom 0.3s; animation: slideFromBottom 0.3s; } .hideSweetAlert[data-animation=pop] { -webkit-animation: hideSweetAlert 0.2s; animation: hideSweetAlert 0.2s; } .hideSweetAlert[data-animation=none] { -webkit-animation: none; animation: none; } .hideSweetAlert[data-animation=slide-from-top] { -webkit-animation: slideToTop 0.4s; animation: slideToTop 0.4s; } .hideSweetAlert[data-animation=slide-from-bottom] { -webkit-animation: slideToBottom 0.3s; animation: slideToBottom 0.3s; } @-webkit-keyframes animateSuccessTip { 0% { width: 0; left: 1px; top: 19px; } 54% { width: 0; left: 1px; top: 19px; } 70% { width: 50px; left: -8px; top: 37px; } 84% { width: 17px; left: 21px; top: 48px; } 100% { width: 25px; left: 14px; top: 45px; } } @keyframes animateSuccessTip { 0% { width: 0; left: 1px; top: 19px; } 54% { width: 0; left: 1px; top: 19px; } 70% { width: 50px; left: -8px; top: 37px; } 84% { width: 17px; left: 21px; top: 48px; } 100% { width: 25px; left: 14px; top: 45px; } } @-webkit-keyframes animateSuccessLong { 0% { width: 0; right: 46px; top: 54px; } 65% { width: 0; right: 46px; top: 54px; } 84% { width: 55px; right: 0px; top: 35px; } 100% { width: 47px; right: 8px; top: 38px; } } @keyframes animateSuccessLong { 0% { width: 0; right: 46px; top: 54px; } 65% { width: 0; right: 46px; top: 54px; } 84% { width: 55px; right: 0px; top: 35px; } 100% { width: 47px; right: 8px; top: 38px; } } @-webkit-keyframes rotatePlaceholder { 0% { transform: rotate(-45deg); -webkit-transform: rotate(-45deg); } 5% { transform: rotate(-45deg); -webkit-transform: rotate(-45deg); } 12% { transform: rotate(-405deg); -webkit-transform: rotate(-405deg); } 100% { transform: rotate(-405deg); -webkit-transform: rotate(-405deg); } } @keyframes rotatePlaceholder { 0% { transform: rotate(-45deg); -webkit-transform: rotate(-45deg); } 5% { transform: rotate(-45deg); -webkit-transform: rotate(-45deg); } 12% { transform: rotate(-405deg); -webkit-transform: rotate(-405deg); } 100% { transform: rotate(-405deg); -webkit-transform: rotate(-405deg); } } .animateSuccessTip { -webkit-animation: animateSuccessTip 0.75s; animation: animateSuccessTip 0.75s; } .animateSuccessLong { -webkit-animation: animateSuccessLong 0.75s; animation: animateSuccessLong 0.75s; } .sa-icon.sa-success.animate::after { -webkit-animation: rotatePlaceholder 4.25s ease-in; animation: rotatePlaceholder 4.25s ease-in; } @-webkit-keyframes animateErrorIcon { 0% { transform: rotateX(100deg); -webkit-transform: rotateX(100deg); opacity: 0; } 100% { transform: rotateX(0deg); -webkit-transform: rotateX(0deg); opacity: 1; } } @keyframes animateErrorIcon { 0% { transform: rotateX(100deg); -webkit-transform: rotateX(100deg); opacity: 0; } 100% { transform: rotateX(0deg); -webkit-transform: rotateX(0deg); opacity: 1; } } .animateErrorIcon { -webkit-animation: animateErrorIcon 0.5s; animation: animateErrorIcon 0.5s; } @-webkit-keyframes animateXMark { 0% { transform: scale(0.4); -webkit-transform: scale(0.4); margin-top: 26px; opacity: 0; } 50% { transform: scale(0.4); -webkit-transform: scale(0.4); margin-top: 26px; opacity: 0; } 80% { transform: scale(1.15); -webkit-transform: scale(1.15); margin-top: -6px; } 100% { transform: scale(1); -webkit-transform: scale(1); margin-top: 0; opacity: 1; } } @keyframes animateXMark { 0% { transform: scale(0.4); -webkit-transform: scale(0.4); margin-top: 26px; opacity: 0; } 50% { transform: scale(0.4); -webkit-transform: scale(0.4); margin-top: 26px; opacity: 0; } 80% { transform: scale(1.15); -webkit-transform: scale(1.15); margin-top: -6px; } 100% { transform: scale(1); -webkit-transform: scale(1); margin-top: 0; opacity: 1; } } .animateXMark { -webkit-animation: animateXMark 0.5s; animation: animateXMark 0.5s; } @-webkit-keyframes pulseWarning { 0% { border-color: #F8D486; } 100% { border-color: #F8BB86; } } @keyframes pulseWarning { 0% { border-color: #F8D486; } 100% { border-color: #F8BB86; } } .pulseWarning { -webkit-animation: pulseWarning 0.75s infinite alternate; animation: pulseWarning 0.75s infinite alternate; } @-webkit-keyframes pulseWarningIns { 0% { background-color: #F8D486; } 100% { background-color: #F8BB86; } } @keyframes pulseWarningIns { 0% { background-color: #F8D486; } 100% { background-color: #F8BB86; } } .pulseWarningIns { -webkit-animation: pulseWarningIns 0.75s infinite alternate; animation: pulseWarningIns 0.75s infinite alternate; } /* Internet Explorer 9 has some special quirks that are fixed here */ /* The icons are not animated. */ /* This file is automatically merged into sweet-alert.min.js through Gulp */ /* Error icon */ .sweet-alert .sa-icon.sa-error .sa-line.sa-left { -ms-transform: rotate(45deg) \9; } .sweet-alert .sa-icon.sa-error .sa-line.sa-right { -ms-transform: rotate(-45deg) \9; } /* Success icon */ .sweet-alert .sa-icon.sa-success { border-color: transparent\9; } .sweet-alert .sa-icon.sa-success .sa-line.sa-tip { -ms-transform: rotate(45deg) \9; } .sweet-alert .sa-icon.sa-success .sa-line.sa-long { -ms-transform: rotate(-45deg) \9; } ================================================ FILE: src/main/resources/static/css/plugins/switchery/switchery.css ================================================ /* * * Main stylesheet for Switchery. * http://abpetkov.github.io/switchery/ * */ .switchery { background-color: #fff; border: 1px solid #dfdfdf; border-radius: 20px; cursor: pointer; display: inline-block; height: 30px; position: relative; vertical-align: middle; width: 50px; -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } .switchery > small { background: #fff; border-radius: 100%; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4); height: 30px; position: absolute; top: 0; width: 30px; } ================================================ FILE: src/main/resources/static/css/plugins/treeview/bootstrap-treeview.css ================================================ /* ========================================================= * bootstrap-treeview.css v1.0.0 * ========================================================= * Copyright 2013 Jonathan Miles * Project URL : http://www.jondmiles.com/bootstrap-treeview * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================= */ .list-group-item { cursor: pointer; } /*.list-group-item:hover { background-color: #f5f5f5; }*/ span.indent { margin-left: 10px; margin-right: 10px; } span.icon { margin-right: 5px; } ================================================ FILE: src/main/resources/static/css/plugins/webuploader/webuploader.css ================================================ .webuploader-container { position: relative; } .webuploader-element-invisible { position: absolute !important; clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ clip: rect(1px,1px,1px,1px); } .webuploader-pick { position: relative; display: inline-block; cursor: pointer; background: #00b7ee; padding: 10px 15px; color: #fff; text-align: center; border-radius: 3px; overflow: hidden; } .webuploader-pick-hover { background: #00a2d4; } .webuploader-pick-disable { opacity: 0.6; pointer-events:none; } ================================================ FILE: src/main/resources/static/css/plugins/zTree/awesome.css ================================================ /*------------------------------------- zTree Style using fontawesome instead of images version: 1.1 author: Mike King email: mikkelking @ hotmail . com website: http://code.google.com/p/jquerytree/ -------------------------------------*/ /* Definitions ----------------------*/ /* End of Definitions ---------------*/ /* Imports -------------------------*/ /* End of Imports ------------------*/ .ztree * { padding: 0; margin: 0; font-size: 14px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif; background-color: #ffffff; } .ztree { margin: 0; padding: 5px; color: #333333; background-color: #ffffff; } .ztree li { padding: 3px; margin: 0; list-style: none; line-height: 17px; text-align: left; white-space: nowrap; outline: 0; } .ztree li ul { margin: 0px; padding: 0 0 0 18px; } .ztree li a { padding-right: 3px; margin: 0; cursor: pointer; height: 17px; color: #333333; background-color: transparent; text-decoration: none; vertical-align: top; display: inline-block; } .ztree li a input.rename { height: 14px; width: 80px; padding: 0; margin: 0; color: #ffffff; background-color: #333333; font-size: 12px; border: 1px #585956 solid; *border: 0px; } .ztree li a:hover { background-color: #beebff; } .ztree li a.curSelectedNode { padding-top: 0px; background-color: #666666; color: #f0f6e4; height: 17px; opacity: 0.8; } .ztree li a.curSelectedNode_Edit { padding-top: 0px; background-color: transparent; color: #333333; height: 17px; border: 1px #666 solid; opacity: 0.8; } .ztree li a.tmpTargetNode_inner { padding-top: 0px; background-color: #aaa; color: #333333; height: 17px; border: 1px #666 solid; opacity: 0.8; filter: alpha(opacity=80); } .ztree li span { line-height: 17px; margin-left: 5px; margin-right: 2px; background-color: transparent; } .ztree li span.button { line-height: 0; margin: 0; padding: 0; width: 15px; height: 15px; display: inline-block; vertical-align: top; border: 0px solid; cursor: pointer; outline: none; background-color: transparent; background-repeat: no-repeat; background-attachment: scroll; } .ztree li span.button::before { color: #333333; font-family: FontAwesome; padding-top: 10px; } .ztree li span.button.chk { margin: 0px; cursor: auto; width: 15px; display: inline-block; padding-top: 10px; padding-left: 2px; } .ztree li span.button.chk.checkbox_false_full::before { content: "\f096"; } .ztree li span.button.chk.checkbox_false_full_focus::before { content: "\f096"; color: #333333; } .ztree li span.button.chk.checkbox_false_part::before { content: "\f096"; color: #aaaaaa; } .ztree li span.button.chk.checkbox_false_part_focus::before { content: "\f096"; color: #cad96c; } .ztree li span.button.chk.checkbox_false_disable::before { content: "\f096"; color: #808080; } .ztree li span.button.chk.checkbox_true_full::before { content: "\f046"; } .ztree li span.button.chk.checkbox_true_full_focus::before { content: "\f046"; } .ztree li span.button.chk.checkbox_true_part::before { content: "\f14a"; } .ztree li span.button.chk.checkbox_true_part_focus::before { content: "\f14a"; color: #333333; } .ztree li span.button.chk.checkbox_true_full_focus::before { content: "\f046"; color: #333333; } .ztree li span.button.chk.checkbox_true_part::before { content: "\f046"; color: #aaaaaa; } .ztree li span.button.chk.checkbox_true_part_focus::before { content: "\f046"; color: #cad96c; } .ztree li span.button.chk.checkbox_true_disable::before { content: "\f046"; color: #808080; } .ztree li span.button.chk.radio_false_full::before { content: "\f10c"; } .ztree li span.button.chk.radio_false_full_focus::before { content: "\f10c"; color: #333333; } .ztree li span.button.chk.radio_false_part::before { content: "\f10c"; color: #aaaaaa; } .ztree li span.button.chk.radio_false_part_focus::before { content: "\f10c"; color: #333333; } .ztree li span.button.chk.radio_false_disable::before { content: "\f1db"; color: #808080; } .ztree li span.button.chk.radio_true_full::before { content: "\f192"; } .ztree li span.button.chk.radio_true_full_focus::before { content: "\f192"; color: #333333; } .ztree li span.button.chk.radio_true_part::before { content: "\f192"; color: #aaaaaa; } .ztree li span.button.chk.radio_true_part_focus::before { content: "\f192"; color: #aaaaaa; } .ztree li span.button.chk.radio_true_disable::before { content: "\f1db"; color: #808080; } .ztree li span.button.switch { width: 15px; height: 17px; } .ztree li span.button.root_open::before { content: "\f078"; padding-top: 10px; padding-left: 2px; display: inline-block; } .ztree li span.button.root_close::before { content: "\f115"; padding-top: 10px; padding-left: 2px; display: inline-block; } .ztree li span.button.roots_open::before { content: "\f078"; padding-top: 10px; padding-left: 2px; display: inline-block; } .ztree li span.button.roots_close::before { content: "\f054"; padding-top: 10px; padding-left: 2px; display: inline-block; } .ztree li span.button.center_open::before { content: "\f078"; padding-top: 10px; padding-left: 2px; display: inline-block; } .ztree li span.button.center_close::before { content: "\f054"; padding-top: 10px; padding-left: 2px; display: inline-block; } .ztree li span.button.bottom_open::before { content: "\f078"; padding-top: 10px; padding-left: 2px; display: inline-block; } .ztree li span.button.bottom_close::before { content: "\f054"; padding-top: 10px; padding-left: 2px; display: inline-block; } .ztree li span.button.root_docu { background: none; } .ztree li span.button.roots_docu::before { content: "\f022"; padding-left: 2px; display: inline-block; color: #333333; } .ztree li span.button.center_docu::before { padding-top: 10px; padding-left: 2px; display: inline-block; color: #333333; } .ztree li span.button.bottom_docu::before { padding-top: 10px; padding-left: 2px; display: inline-block; color: #333333; } .ztree li span.button.noline_docu { background: none; } .ztree li span.button.ico_open::before { content: "\f115"; font-family: FontAwesome; padding-top: 10px; padding-left: 2px; display: inline-block; color: #333333; } .ztree li span.button.ico_close::before { content: "\f114"; font-family: FontAwesome; padding-top: 10px; padding-left: 2px; display: inline-block; color: #333333; } .ztree li span.button.ico_docu::before { content: "\f022"; font-family: FontAwesome; padding-top: 10px; padding-left: 2px; display: inline-block; color: #333333; } .ztree li span.button.edit { margin-left: 4px; margin-right: -1px; vertical-align: top; *vertical-align: middle; padding-top: 10px; } .ztree li span.button.edit::before { content: "\f044"; font-family: FontAwesome; } .ztree li span.button.remove { margin-left: 4px; margin-right: -1px; vertical-align: top; *vertical-align: middle; padding-top: 10px; } .ztree li span.button.remove::before { content: "\f1f8"; font-family: FontAwesome; } .ztree li span.button.add { margin-left: 4px; margin-right: -1px; vertical-align: top; *vertical-align: middle; padding-top: 10px; } .ztree li span.button.add::before { content: "\f067"; font-family: FontAwesome; } .ztree li span.button.ico_loading { margin-right: 2px; background: url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align: top; *vertical-align: middle; } ul.tmpTargetzTree { background-color: #FFE6B0; opacity: 0.8; filter: alpha(opacity=80); } span.tmpzTreeMove_arrow { width: 16px; height: 17px; display: inline-block; padding: 0; margin: 2px 0 0 1px; border: 0 none; position: absolute; background-color: transparent; background-attachment: scroll; } span.tmpzTreeMove_arrow::before { content: "\f04b"; font-family: FontAwesome; color: #333333; } ul.ztree.zTreeDragUL { margin: 0; padding: 0; position: absolute; width: auto; height: auto; overflow: hidden; background-color: #cfcfcf; border: 1px #333333 dotted; opacity: 0.8; filter: alpha(opacity=80); } .ztreeMask { z-index: 10000; background-color: #cfcfcf; opacity: 0.0; filter: alpha(opacity=0); position: absolute; } ================================================ FILE: src/main/resources/static/css/plugins/zTree/metroStyle/metroStyle.css ================================================ /*------------------------------------- zTree Style version: 3.4 author: Hunter.z email: hunter.z@263.net website: http://code.google.com/p/jquerytree/ -------------------------------------*/ .ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif} .ztree {margin:0; padding:5px; color:#333} .ztree li{padding:0; margin:0; list-style:none; line-height:17px; text-align:left; white-space:nowrap; outline:0} .ztree li ul{ margin:0; padding:0 0 0 18px} .ztree li ul.line{ background:url(./img/line_conn.png) 0 0 repeat-y;} .ztree li a {padding-right:3px; margin:0; cursor:pointer; height:21px; color:#333; background-color: transparent; text-decoration:none; vertical-align:top; display: inline-block} .ztree li a:hover {text-decoration:underline} .ztree li a.curSelectedNode {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; opacity:0.8;} .ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; border:1px #666 solid; opacity:0.8;} .ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#aaa; color:white; height:21px; border:1px #666 solid; opacity:0.8; filter:alpha(opacity=80)} .ztree li a.tmpTargetNode_prev {} .ztree li a.tmpTargetNode_next {} .ztree li a input.rename {height:14px; width:80px; padding:0; margin:0; font-size:12px; border:1px #585956 solid; *border:0px} .ztree li span {line-height:21px; margin-right:2px} .ztree li span.button {line-height:0; margin:0; padding: 0; width:21px; height:21px; display: inline-block; vertical-align:middle; border:0 none; cursor: pointer;outline:none; background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; background-image:url("./img/32px.png"); *background-image:url("./img/metro.gif")} .ztree li span.button.chk {width:13px; height:13px; margin:0 2px; cursor: auto} .ztree li span.button.chk.checkbox_false_full {background-position: -228px -4px;} .ztree li span.button.chk.checkbox_false_full_focus {background-position: -5px -26px;} .ztree li span.button.chk.checkbox_false_part {background-position: -5px -48px;} .ztree li span.button.chk.checkbox_false_part_focus {background-position: -5px -68px;} .ztree li span.button.chk.checkbox_false_disable {background-position: -5px -89px;} .ztree li span.button.chk.checkbox_true_full {background-position: -26px -5px;} .ztree li span.button.chk.checkbox_true_full_focus {background-position: -26px -26px;} .ztree li span.button.chk.checkbox_true_part {background-position: -26px -48px;} .ztree li span.button.chk.checkbox_true_part_focus {background-position: -26px -68px;} .ztree li span.button.chk.checkbox_true_disable {background-position: -26px -89px;} .ztree li span.button.chk.radio_false_full {background-position: -47px -5px;} .ztree li span.button.chk.radio_false_full_focus {background-position: -47px -26px;} .ztree li span.button.chk.radio_false_part {background-position: -47px -47px;} .ztree li span.button.chk.radio_false_part_focus {background-position: -47px -68px;} .ztree li span.button.chk.radio_false_disable {background-position: -47px -89px;} .ztree li span.button.chk.radio_true_full {background-position: -68px -5px;} .ztree li span.button.chk.radio_true_full_focus {background-position: -68px -26px;} .ztree li span.button.chk.radio_true_part {background-position: -68px -47px;} .ztree li span.button.chk.radio_true_part_focus {background-position: -68px -68px;} .ztree li span.button.chk.radio_true_disable {background-position: -68px -89px;} .ztree li span.button.switch {width:21px; height:21px} .ztree li span.button.root_open{background-position:-36px -4px} .ztree li span.button.root_close{background-position:-103px -39px} .ztree li span.button.roots_open{background-position: -36px -4px;} .ztree li span.button.roots_close{background-position: -103px -39px;} .ztree li span.button.center_open{background-position: -105px -21px;} .ztree li span.button.center_close{background-position: -126px -21px;} .ztree li span.button.bottom_open{background-position: -105px -42px;} .ztree li span.button.bottom_close{background-position: -126px -42px;} .ztree li span.button.noline_open{background-position: -105px -84px;} .ztree li span.button.noline_close{background-position: -126px -84px;} .ztree li span.button.root_docu{ background:none;} .ztree li span.button.roots_docu{background-position: -84px 0;} .ztree li span.button.center_docu{background-position: -84px -21px;} .ztree li span.button.bottom_docu{background-position: -84px -42px;} .ztree li span.button.noline_docu{ background:none;} .ztree li span.button.ico_open{margin-right:2px; background-position: -147px -21px; vertical-align:top; *vertical-align:middle} .ztree li span.button.ico_close{margin-right:2px; margin-right:2px; background-position: -147px 0; vertical-align:top; *vertical-align:middle} .ztree li span.button.ico_docu{margin-right:2px; background-position: -147px -42px; vertical-align:top; *vertical-align:middle} .ztree li span.button.edit {margin-left:2px; margin-right: -1px; background-position: -189px -21px; vertical-align:top; *vertical-align:middle} .ztree li span.button.edit:hover { background-position: -168px -21px; } .ztree li span.button.remove {margin-left:2px; margin-right: -1px; background-position: -189px -42px; vertical-align:top; *vertical-align:middle} .ztree li span.button.remove:hover { background-position: -168px -42px; } .ztree li span.button.add {margin-left:2px; margin-right: -1px; background-position: -189px 0; vertical-align:top; *vertical-align:middle} .ztree li span.button.add:hover { background-position: -168px 0; } .ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle} ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)} span.tmpzTreeMove_arrow {width:16px; height:21px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute; background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; background-position:-168px -84px; background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")} ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)} .ztreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute} ================================================ FILE: src/main/resources/static/css/style.css ================================================ /* * * H+ - 后台主题UI框架 * version 4.0 * 修改记录 * .checkbox-inline input[type=checkbox] 去掉margin-top:-4px * .checkbox-inline 添加font-size: 14px;默认是13px * .onoffswitch-inner:before, ; /* height: 16px; 两处 * * .file-control { * color: inherit; * font-size: 14px; * add nopadding class * * * */ 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: none; } .nav>li>a { color: #a7b1c2; font-weight: 600; padding: 14px 20px 14px 25px; } .nav li>a { display: block; /*white-space: nowrap;*/ } .nav.navbar-right>li>a { color: #999c9e; } .nav>li.active>a { color: #ffffff; } .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; } .nav>li>a i { margin-right: 6px; } .navbar { border: 0; } .navbar-default { background-color: transparent; border-color: #2f4050; position: relative; } .navbar-top-links li { display: inline-block; } .navbar-top-links li:last-child { margin-right: 30px; } 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-header { padding: 33px 25px; background: url("patterns/header-profile.png") no-repeat; } .pace-done .nav-header { -webkit-transition: all 0.5s; transition: all 0.5s; } .nav>li.active { border-left: 4px solid #19aa8d; background: #293846; } .nav.nav-second-level>li.active { border: none; } .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: 14px 5px 5px 20px; 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; } .nav-second-level li a { padding: 7px 15px 7px 10px; padding-left: 52px; } .nav-third-level li a { padding-left: 62px; } .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; } .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; } .pace-done .navbar-static-side, .pace-done .nav-header, .pace-done li.active, .pace-done #page-wrapper, .pace-done .footer { -webkit-transition: all 0.5s; transition: all 0.5s; } .navbar-fixed-top { background: #fff; -webkit-transition-duration: 0.5s; transition-duration: 0.5s; z-index: 2030; } .navbar-fixed-top, .navbar-static-top { background: #f3f3f4; } .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: 0px; } 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 0 0 0; } body.fixed-sidebar .navbar-static-side, body.canvas-menu .navbar-static-side { position: fixed; width: 220px; 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>.nav-second-level, .canvas-menu.mini-navbar .nav li:hover>.nav-second-level*/ /*{*/ /*position: absolute;*/ /*left: 70px;*/ /*top: 40px;*/ /*background-color: #2f4050;*/ /*padding: 10px 10px 0 10px;*/ /*font-size: 12px;*/ /*display: block;*/ /*min-width: 140px;*/ /*border-radius: 2px;*/ /*}*/ /*伸缩菜单*/ .fixed-sidebar.mini-navbar .nav li:hover>a> span.nav-label { top: 0px; padding: 10px 10px 10px 10px; text-align: center; background-color: #243747; border-bottom: dashed 1px #fff; } .fixed-sidebar.mini-navbar .nav li:hover>.nav-second-level { top: 40px; font-size: 12px; /*padding: 10px 10px 0 10px;*/ 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; } /*伸缩菜单结束*/ 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: 0px; } 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: none; } .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: 0px; } .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 0px 40px 0px; } .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: #FFFFFF; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { background-color: #18a689; border-color: #18a689; color: #FFFFFF; } .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: #FFFFFF; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { background-color: #1a7bb9; border-color: #1a7bb9; color: #FFFFFF; } .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: #FFFFFF; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { background-color: #21b9bb; border-color: #21b9bb; color: #FFFFFF; } .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: #c2c2c2; border-color: #c2c2c2; color: #FFFFFF; } .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { background-color: #bababa; border-color: #bababa; color: #FFFFFF; } .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: #cccccc; border-color: #cccccc; } .btn-warning { background-color: #f8ac59; border-color: #f8ac59; color: #FFFFFF; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { background-color: #f7a54a; border-color: #f7a54a; color: #FFFFFF; } .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: #FFFFFF; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { background-color: #ec4758; border-color: #ec4758; color: #FFFFFF; } .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, .form-control:focus, .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 0px 0px 0px #16987e, 0px 5px 0px 0px #16987e, 0px 10px 5px #999999; } button.btn-primary.dim:active { box-shadow: inset 0px 0px 0px #16987e, 0px 2px 0px 0px #16987e, 0px 5px 3px #999999; } button.btn-default.dim { box-shadow: inset 0px 0px 0px #b3b3b3, 0px 5px 0px 0px #b3b3b3, 0px 10px 5px #999999; } button.btn-default.dim:active { box-shadow: inset 0px 0px 0px #b3b3b3, 0px 2px 0px 0px #b3b3b3, 0px 5px 3px #999999; } button.btn-warning.dim { box-shadow: inset 0px 0px 0px #f79d3c, 0px 5px 0px 0px #f79d3c, 0px 10px 5px #999999; } button.btn-warning.dim:active { box-shadow: inset 0px 0px 0px #f79d3c, 0px 2px 0px 0px #f79d3c, 0px 5px 3px #999999; } button.btn-info.dim { box-shadow: inset 0px 0px 0px #1eacae, 0px 5px 0px 0px #1eacae, 0px 10px 5px #999999; } button.btn-info.dim:active { box-shadow: inset 0px 0px 0px #1eacae, 0px 2px 0px 0px #1eacae, 0px 5px 3px #999999; } button.btn-success.dim { box-shadow: inset 0px 0px 0px #1872ab, 0px 5px 0px 0px #1872ab, 0px 10px 5px #999999; } button.btn-success.dim:active { box-shadow: inset 0px 0px 0px #1872ab, 0px 2px 0px 0px #1872ab, 0px 5px 3px #999999; } button.btn-danger.dim { box-shadow: inset 0px 0px 0px #ea394c, 0px 5px 0px 0px #ea394c, 0px 10px 5px #999999; } button.btn-danger.dim:active { box-shadow: inset 0px 0px 0px #ea394c, 0px 2px 0px 0px #ea394c, 0px 5px 3px #999999; } 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: #FFFFFF; } .label-success, .badge-success { background-color: #1c84c6; color: #FFFFFF; } .label-warning, .badge-warning { background-color: #f8ac59; color: #FFFFFF; } .label-warning-light, .badge-warning-light { background-color: #f8ac59; color: #ffffff; } .label-danger, .badge-danger { background-color: #ed5565; color: #FFFFFF; } .label-info, .badge-info { background-color: #23c6c8; color: #FFFFFF; } .label-inverse, .badge-inverse { background-color: #262626; color: #FFFFFF; } .label-white, .badge-white { background-color: #FFFFFF; color: #5E5E5E; } .label-white, .badge-disable { background-color: #2A2E36; color: #8B91A0; } /* TOOGLE SWICH */ .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 0.3s ease-in 0s; transition: margin 0.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: #FFFFFF; } .onoffswitch-inner:after { content: "OFF"; padding-right: 10px; background-color: #FFFFFF; color: #999999; text-align: right; } .onoffswitch-switch { width: 20px; margin: 0px; background: #FFFFFF; border: 2px solid #1ab394; border-radius: 2px; position: absolute; top: 0; bottom: 0; right: 44px; -webkit-transition: all 0.3s ease-in 0s; transition: all 0.3s ease-in 0s; } .onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner { margin-left: 0; } .onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch { right: 0px; } /* CHOSEN PLUGIN */ .chosen-container-single .chosen-single { background: #ffffff; box-shadow: none; -moz-box-sizing: border-box; background-color: #FFFFFF; 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: #333333; cursor: default; line-height: 13px; margin: 3px 0 3px 5px; padding: 3px 20px 3px 5px; position: relative; } /* PAGINATIN */ .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: #DDDDDD; color: inherit; cursor: default; z-index: 2; } .pagination>li>a, .pagination>li>span { background-color: #FFFFFF; border: 1px solid #DDDDDD; color: inherit; float: left; line-height: 1.42857; margin-left: -1px; padding: 4px 10px; position: relative; text-decoration: none; } /* TOOLTIPS */ .tooltip-inner { background-color: #2F4050; } .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; } /* EASY PIE CHART*/ .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; } /* FULLCALENDAR */ .fc-state-default { background-color: #ffffff; background-image: none; background-repeat: repeat-x; box-shadow: none; color: #333333; 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 0.6em; position: relative; white-space: nowrap; } .fc-state-active { background-color: #1ab394; border-color: #1ab394; color: #ffffff; } .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; /* background color */ border-color: #1ab394; /* border color */ } .fc-event-time, .fc-event-title { color: #717171; padding: 0 1px; } .ui-calendar .fc-event-time, .ui-calendar .fc-event-title { color: #fff; } /* Chat */ .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: #777777; } .panel .slidedown .glyphicon, .chat .glyphicon { margin-right: 5px; } .chat-panel .panel-body { height: 350px; overflow-y: scroll; } /* LIST GROUP */ a.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus { background-color: #1ab394; border-color: #1ab394; color: #FFFFFF; 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: none; border-bottom: none; } .no-padding .list-group-item:first-child { border-left: none; border-right: none; border-bottom: none; border-top: none; } .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: none; /*border-top: none;*/ padding: 15px 25px; } .elements-list .list-group-item:first-child { border-left: none; border-right: none; 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-bottom: 1px solid #e7eaec;*/ /*border-top: 1px solid #e7eaec;*/ border-radius: 0; } .elements-list li.active { -webkit-transition: none; transition: none; } .element-detail-box { padding: 25px; } /* FLOT CHART */ .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: 0px; top: 0px; 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; } /* DATATABLES */ 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; } /* CIRCLE */ .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; } /* ANIMATION */ .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; } /* PEACE */ .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; } /* WIDGETS */ .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: #ffffff; } .widget-head-color-box { border-radius: 5px 5px 0px 0px; 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: none; 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"; } /* INPUTS */ .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: #FFFFFF none; border: 1px solid #e5e6e7; border-radius: 1px; color: inherit; display: block; padding: 6px 12px; -webkit-transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; width: 100%; font-size: 14px; } .form-control:focus, .single-line:focus { border-color: #1ab394 !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: 1px; 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 */ .ui-sortable .ibox-title { cursor: move; } .ui-sortable-placeholder { border: 1px dashed #cecece !important; visibility: visible !important; background: #e7eaec; } .ibox.ui-sortable-placeholder { margin: 0px 0px 23px !important; } /* Tabs */ .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: none; } .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: none; } .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: #ffffff; } .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: #ffffff; z-index: 1; } /*SWITCHES */ .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 0.3s ease-in 0s; transition: margin 0.3s ease-in 0s; } .onoffswitch-inner:before, .onoffswitch-inner:after { display: block; float: left; width: 50%; /* height: 16px; */ padding: 0; /* line-height: 16px; */ 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: #FFFFFF; } .onoffswitch-inner:after { content: "OFF"; padding-right: 7px; background-color: #FFFFFF; color: #919191; text-align: right; } .onoffswitch-switch { display: block; width: 18px; margin: 0px; background: #FFFFFF; border: 2px solid #1AB394; border-radius: 3px; position: absolute; top: 0; bottom: 0; right: 36px; -webkit-transition: all 0.3s ease-in 0s; transition: all 0.3s ease-in 0s; } .onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner { margin-left: 0; } .onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch { right: 0px; } /* Nestable list */ .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, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff); background-image: linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff); 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 Extras */ .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: 0.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 .dd-handle:hover { /*background: #bbb;*/ } #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 */ .CodeMirror { border: 1px solid #eee; height: auto; } .CodeMirror-scroll { overflow-y: hidden; overflow-x: auto; } /* Google Maps */ .google-map { height: 300px; } /* Validation */ label.error { color: #cc5965; display: inline-block; margin-left: 5px; } .form-control.error { border: 1px dotted #cc5965; } /* ngGrid */ .gridStyle { border: 1px solid #d4d4d4; width: 100%; height: 400px; } .gridStyle2 { border: 1px solid #d4d4d4; width: 500px; height: 300px; } .ngH eaderCell { border-right: none; border-bottom: 1px solid #e7eaec; } .ngCell { border-right: none; } .ngTopPanel { background: #F5F5F6; } .ngRow.even { background: #f9f9f9; } .ngRow.selected { background: #EBF2F1; } .ngRow { border-bottom: 1px solid #e7eaec; } .ngCell { background-color: transparent; } .ngHeaderCell { border-right: none; } /* Toastr custom style */ #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: 0.5em; margin: auto 0.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; } /* Image cropper style */ .img-container, .img-preview { overflow: hidden; text-align: center; width: 100%; } .img-preview-sm { height: 130px; width: 200px; } /* Forum styles */ .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 0px; /* Comment this is you want to show forum info in small devices */ display: none; } .forum-desc { float: none !important; } } /* New Timeline style */ .vertical-container { /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */ width: 90%; max-width: 1170px; margin: 0 auto; } .vertical-container::after { /* clearfix */ 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: 0.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: none; } .sidebar-container ul.nav-tabs { border: none; } .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: none; } .sidebar-container ul.nav-tabs li a { border: none; 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: none; background: #f9f9f9; color: #676a6c; font-weight: bold; } .sidebar-container .nav-tabs>li.active>a:hover, .sidebar-container .nav-tabs>li.active>a:focus { border: none; } .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 { background: url('patterns/shattered.png'); } 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: #ffffff; background-color: #ffffff; 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 */ .gallery>.row>div { margin-bottom: 15px; } .fancybox img { margin-bottom: 5px; /* Only for demo */ width: 24%; } /* Summernote text editor */ .note-editor { height: auto !important; min-height: 100px; border: solid 1px #e5e6e7; } /* MODAL */ .modal-content { background-clip: padding-box; background-color: #FFFFFF; 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; } /* WRAPPERS */ #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 220px; } .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 */ .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: 0px; } /* PANELS */ .page-heading { border-top: 0; padding: 0px 20px 20px; } .panel-heading h1, .panel-heading h2 { margin-bottom: 5px; } /*CONTENTTABS*/ .content-tabs { position: relative; height: 42px; background: #fafafa; line-height: 40px; } .content-tabs .roll-nav, .page-tabs-list { position: absolute; width: 40px; height: 40px; 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: none; } .content-tabs button:hover { background: #fafafa; } nav.page-tabs { margin-left: 40px; width: 100000px; height: 40px; 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.J_tabRight { right: 140px; } .roll-right.btn-group { right: 60px; width: 80px; padding: 0; } .roll-right.btn-group button { width: 80px; } .roll-right.J_tabExit { background: #fff; height: 40px; width: 60px; outline: none; } .dropdown-menu-right { left: auto; } #content-main { height: calc(100% - 140px); overflow: hidden; } .fixed-nav #content-main { height: calc(100% - 80px); overflow: hidden; } /* TABLES */ .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 #DDDDDD; 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; } /* PANELS */ .panel.blank-panel { background: none; 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: none; border-color: #dddddd #dddddd 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: #555555; cursor: default; } .nav.nav-tabs li { background: none; border: none; } .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 0px; } /* GLOBAL */ .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: 0px; padding-top: 15px; } .border-left-right { border-left: 1px solid #e7eaec; border-right: 1px solid #e7eaec; border-top: none; border-bottom: none; } .border-left { border-left: 1px solid #e7eaec; border-right: none; border-top: none; border-bottom: none; } .border-right { border-left: none; border-right: 1px solid #e7eaec; border-top: none; border-bottom: none; } .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 #FFFFFF; border-radius: 50%; } .branding { float: left; color: #FFFFFF; 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 #eeeeee; } .fontawesome-icon-list { margin-top: 22px; } .fontawesome-icon-list .fa-hover a { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; color: #222222; 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: #ffffff; 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: #ffffff; 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: #ffffff; border-color: #e7eaec; -webkit-border-image: none; -o-border-image: none; border-image: none; border-style: solid solid none; border-width: 4px 0px 0; color: inherit; margin-bottom: 0; padding: 14px 15px 7px; min-height: 48px; } .ibox-content { background-color: #ffffff; 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 0px; } 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: none; } .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: #c4c4c4; } .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; } /* BACKGROUNDS */ .gray-bg { background-color: #f3f3f4; } .white-bg { background-color: #ffffff; } .navy-bg { background-color: #1ab394; color: #ffffff; } .blue-bg { background-color: #1c84c6; color: #ffffff; } .lazur-bg { background-color: #23c6c8; color: #ffffff; } .yellow-bg { background-color: #f8ac59; color: #ffffff; } .red-bg { background-color: #ed5565; color: #ffffff; } .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: #ffffff; } .panel-info { border-color: #23c6c8; } .panel-info>.panel-heading { background-color: #23c6c8; border-color: #23c6c8; color: #ffffff; } .panel-warning { border-color: #f8ac59; } .panel-warning>.panel-heading { background-color: #f8ac59; border-color: #f8ac59; color: #ffffff; } .panel-danger { border-color: #ed5565; } .panel-danger>.panel-heading { background-color: #ed5565; border-color: #ed5565; color: #ffffff; } .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: 0px; } .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; } /* COLORS */ .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: #888888; } .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: 0px 0px 3px 0px #919191; } /* For handle diferent bg color in AngularJS version */ .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; } /* For handle diferent bg color in MVC version */ .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 */ .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; } /* MARGINS & PADDINGS */ .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 PAGE */ .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; } /* CONTACTS */ .contact-box { background-color: #ffffff; border: 1px solid #e7eaec; padding: 20px; margin-bottom: 20px; } .contact-box a { color: inherit; } /* INVOICE */ .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 #DDDDDD; text-align: right; width: 15%; } /* ERROR & LOGIN & LOCKSCREEN*/ .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: 0px; } .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; } /* DASBOARD */ .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; } /* Intimeline */ .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; } /* PIN BOARD */ 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 0px; 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; /* Firefox */ /* Safari+Chrome */ /* Opera */ 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 0.15s linear; } /* FILE MANAGER */ .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: #666666; 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: #666666; 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: #ffffff; 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: 0.6em solid transparent; border-right: 0.6em solid #f1f1f1; border-bottom: 0.6em solid #f1f1f1; right: 0em; bottom: 0em; } a.compose-mail { padding: 8px 10px; } .mail-search { max-width: 300px; } /* PROFILE */ .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; } /* MAILBOX */ .mail-box { background-color: #ffffff; border: 1px solid #e7eaec; border-top: 0; padding: 0px; margin-bottom: 20px; } .mail-box-header { background-color: #ffffff; border: 1px solid #e7eaec; border-bottom: 0; padding: 30px 20px 20px 20px; } .mail-box-header h2 { margin-top: 0px; } .mailbox-content .tag-list li a { background: #ffffff; } .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: none; border: none; padding: 10px; } .mail-ontact { width: 23%; } /* PROJECTS */ .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: none; 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 */ .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; } /* Chat view */ .message-input { height: 90px !important; } .chat-avatar { white: 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: 0px; } } .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:nth-child(2n+1) .message-avatar { float: left; margin-right: 10px; } .chat-discussion .chat-message:nth-child(2n) .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:nth-child(2n+1) .message-date { float: right; } .chat-discussion .chat-message:nth-child(2n) .message-date { float: left; } .chat-discussion .chat-message:nth-child(2n+1) .message { text-align: left; margin-left: 55px; } .chat-discussion .chat-message:nth-child(2n) .message { text-align: right; margin-right: 55px; } .message-date { font-size: 10px; color: #888888; } .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 */ .jstree-open>.jstree-anchor>.fa-folder:before { content: "\f07c"; } .jstree-default .jstree-icon.none { width: 0; } /* CLIENTS */ .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: none; } .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 ARTICLE */ .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 */ .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; } /* TEAMS */ .team-members { margin: 10px 0; } .team-members img.img-circle { width: 42px; height: 42px; margin-bottom: 5px; } /* AGILE BOARD */ .sortable-list { padding: 10px 0; } .agile-list { list-style: none; margin: 0; } .agile-list li { background: #FAFAFB; border: 1px solid #e7eaec; margin: 0px 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; } /* DIFF */ 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: 0.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; } /* * Usage: * *
    * */ .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 ); } } /* * Usage: * *
    *
    *
    *
    * */ .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: 0.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); } } /* * Usage: * *
    *
    *
    *
    *
    *
    *
    * */ .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); } } /* * Usage: * *
    *
    *
    *
    * */ .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% { /* Hack to make FF rotate in the right direction */ -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% { /* Hack to make FF rotate in the right direction */ -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); } } /* * Usage: * *
    * */ .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; } } /* * Usage: * *
    *
    *
    *
    * */ .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: 0px; -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); } } /* * Usage: * *
    *
    *
    *
    *
    * */ .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; /* Prevent first frame from flickering when animation starts */ -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); } } /* * Usage: * *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    * */ .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; /* Prevent first frame from flickering when animation starts */ -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); } } /* * Usage: * *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    * */ .sk-spinner-cube-grid { /* * Spinner positions * 1 2 3 * 4 5 6 * 7 8 9 */ } .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: 0.2s; animation-delay: 0.2s; } .sk-spinner-cube-grid .sk-cube:nth-child(2) { -webkit-animation-delay: 0.3s; animation-delay: 0.3s; } .sk-spinner-cube-grid .sk-cube:nth-child(3) { -webkit-animation-delay: 0.4s; animation-delay: 0.4s; } .sk-spinner-cube-grid .sk-cube:nth-child(4) { -webkit-animation-delay: 0.1s; animation-delay: 0.1s; } .sk-spinner-cube-grid .sk-cube:nth-child(5) { -webkit-animation-delay: 0.2s; animation-delay: 0.2s; } .sk-spinner-cube-grid .sk-cube:nth-child(6) { -webkit-animation-delay: 0.3s; animation-delay: 0.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: 0.1s; animation-delay: 0.1s; } .sk-spinner-cube-grid .sk-cube:nth-child(9) { -webkit-animation-delay: 0.2s; animation-delay: 0.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); } } /* * Usage: * *
    * *
    * */ .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); } } /* * Usage: * *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    * */ .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; /* Prevent first frame from flickering when animation starts */ -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 { /* Theme config */ } 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 0.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: none; } 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: 0px; } } 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 0 0 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 0 0 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: 0px; } .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 0 0 0px; 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; } /* * * This is style for skin config * Use only in demo theme * */ .skin-setttings .title { background: #efefef; text-align: center; text-transform: uppercase; font-weight: 600; display: block; padding: 10px 15px; font-size: 12px; } .setings-item { padding: 10px 30px; } .setings-item.nb { border: none; } .setings-item.skin { text-align: center; } .setings-item .switch { float: right; } .skin-name a { text-transform: uppercase; } .setings-item a { color: #fff; } .default-skin, .blue-skin, .ultra-skin, .yellow-skin { text-align: center; } .default-skin { font-weight: 600; background: #1ab394; } .default-skin:hover { background: #199d82; } .blue-skin { font-weight: 600; background: url("patterns/header-profile-skin-1.png") repeat scroll 0 0; } .blue-skin:hover { background: #0d8ddb; } .yellow-skin { font-weight: 600; background: url("patterns/header-profile-skin-3.png") repeat scroll 0 100%; } .yellow-skin:hover { background: #ce8735; } .content-tabs { border-bottom: solid 2px #2f4050; } .page-tabs a { color: #999; } .page-tabs a i { color: #ccc; } .page-tabs a.active { background: #2f4050; color: #a7b1c2; } .page-tabs a.active:hover, .page-tabs a.active i:hover { background: #293846; color: #fff; } /* * * SKIN 1 - H+ - 后台主题UI框架 * NAME - Blue light * */ .skin-1 .minimalize-styl-2 { margin: 14px 5px 5px 30px; } .skin-1 .navbar-top-links li:last-child { margin-right: 30px; } .skin-1.fixed-nav .minimalize-styl-2 { margin: 14px 5px 5px 15px; } .skin-1 .spin-icon { background: #0e9aef !important; } .skin-1 .nav-header { background: #0e9aef; background: url('patterns/header-profile-skin-1.png'); } .skin-1.mini-navbar .nav-second-level { background: #3e495f; } .skin-1 .breadcrumb { background: transparent; } .skin-1 .page-heading { border: none; } .skin-1 .nav>li.active { background: #3a4459; } .skin-1 .nav>li>a { color: #9ea6b9; } .skin-1 .nav>li.active>a { color: #fff; } .skin-1 .navbar-minimalize { background: #0e9aef; border-color: #0e9aef; } body.skin-1 { background: #3e495f; } .skin-1 .navbar-static-top { background: #ffffff; } .skin-1 .dashboard-header { background: transparent; border-bottom: none !important; border-top: none; padding: 20px 30px 10px 30px; } .fixed-nav.skin-1 .navbar-fixed-top { background: #fff; } .skin-1 .wrapper-content { padding: 30px 15px; } .skin-1 #page-wrapper { background: #f4f6fa; } .skin-1 .ibox-title, .skin-1 .ibox-content { border-width: 1px; } .skin-1 .ibox-content:last-child { border-style: solid solid solid solid; } .skin-1 .nav>li.active { border: none; } .skin-1 .nav-header { padding: 35px 25px 25px 25px; } .skin-1 .nav-header a.dropdown-toggle { color: #fff; margin-top: 10px; } .skin-1 .nav-header a.dropdown-toggle .text-muted { color: #fff; opacity: 0.8; } .skin-1 .profile-element { text-align: center; } .skin-1 .img-circle { border-radius: 5px; } .skin-1 .navbar-default .nav>li>a:hover, .skin-1 .navbar-default .nav>li>a:focus { background: #39aef5; color: #fff; } .skin-1 .nav.nav-tabs>li.active>a { color: #555; } .skin-1 .content-tabs { border-bottom: solid 2px #39aef5; } .skin-1 .nav.nav-tabs>li.active { background: transparent; } .skin-1 .page-tabs a.active { background: #39aef5; color: #fff; } .skin-1 .page-tabs a.active:hover, .skin-1 .page-tabs a.active i:hover { background: #0e9aef; color: #fff; } /* * * SKIN 3 - H+ - 后台主题UI框架 * NAME - Yellow/purple * */ .skin-3 .minimalize-styl-2 { margin: 14px 5px 5px 30px; } .skin-3 .navbar-top-links li:last-child { margin-right: 30px; } .skin-3.fixed-nav .minimalize-styl-2 { margin: 14px 5px 5px 15px; } .skin-3 .spin-icon { background: #ecba52 !important; } body.boxed-layout.skin-3 #wrapper { background: #3e2c42; } .skin-3 .nav-header { background: #ecba52; background: url('patterns/header-profile-skin-3.png'); } .skin-3.mini-navbar .nav-second-level { background: #3e2c42; } .skin-3 .breadcrumb { background: transparent; } .skin-3 .page-heading { border: none; } .skin-3 .nav>li.active { background: #38283c; } .fixed-nav.skin-3 .navbar-fixed-top { background: #fff; } .skin-3 .nav>li>a { color: #948b96; } .skin-3 .nav>li.active>a { color: #fff; } .skin-3 .navbar-minimalize { background: #ecba52; border-color: #ecba52; } body.skin-3 { background: #3e2c42; } .skin-3 .navbar-static-top { background: #ffffff; } .skin-3 .dashboard-header { background: transparent; border-bottom: none !important; border-top: none; padding: 20px 30px 10px 30px; } .skin-3 .wrapper-content { padding: 30px 15px; } .skin-3 #page-wrapper { background: #f4f6fa; } .skin-3 .ibox-title, .skin-3 .ibox-content { border-width: 1px; } .skin-3 .ibox-content:last-child { border-style: solid solid solid solid; } .skin-3 .nav>li.active { border: none; } .skin-3 .nav-header { padding: 35px 25px 25px 25px; } .skin-3 .nav-header a.dropdown-toggle { color: #fff; margin-top: 10px; } .skin-3 .nav-header a.dropdown-toggle .text-muted { color: #fff; opacity: 0.8; } .skin-3 .profile-element { text-align: center; } .skin-3 .img-circle { border-radius: 5px; } .skin-3 .navbar-default .nav>li>a:hover, .skin-3 .navbar-default .nav>li>a:focus { background: #38283c; color: #fff; } .skin-3 .nav.nav-tabs>li.active>a { color: #555; } .skin-3 .nav.nav-tabs>li.active { background: transparent; } .skin-3 .content-tabs { border-bottom: solid 2px #3e2c42; } .skin-3 .nav.nav-tabs>li.active { background: transparent; } .skin-3 .page-tabs a.active { background: #3e2c42; color: #fff; } .skin-3 .page-tabs a.active:hover, .skin-3 .page-tabs a.active i:hover { background: #38283c; color: #fff; } @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: 0px; 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; } } /*JQGRID*/ .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: 0px solid; border-right: 0px solid; border-top: 0px solid; } /* Social feed */ .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 { /*padding: 15px;*/ border: 1px solid #e7eaec; background: #fff; margin-bottom: 15px; } .article .social-feed-box { margin-bottom: 0; border-bottom: none; } .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; } .checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio], .radio-inline input[type=radio] { /* margin-top: -4px; */ } /* Only demo */ @media ( max-width : 1000px) { .welcome-message { display: none; } } /* ECHARTS */ .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; } .J_menuTab { -webkit-transition: all .3s ease-out 0s; transition: all .3s ease-out 0s; } ::-webkit-scrollbar-track { background-color: #F5F5F5; } ::-webkit-scrollbar { width: 6px; background-color: #F5F5F5; } ::-webkit-scrollbar-thumb { background-color: #999; } /*GO HOME*/ .gohome { position: fixed; top: 20px; right: 20px; z-index: 100; } .gohome a { height: 38px; width: 38px; display: block; background: #2f4050; padding: 9px 8px; text-align: center; color: #fff; border-radius: 50%; opacity: .5; } .gohome a:hover { opacity: 1; } @media only screen and (-webkit-min-device-pixel-ratio : 2) { #content-main { -webkit-overflow-scrolling: touch; } } .navbar-header { width: 60%; } .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: #333333!important; background-color: #ffffff!important; border-color: #cccccc!important; } ================================================ FILE: src/main/resources/static/editor-app/app-cfg.js ================================================ /* * Activiti Modeler component part of the Activiti project * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ 'use strict'; var ACTIVITI = ACTIVITI || {}; ACTIVITI.CONFIG = { 'contextRoot' : '/activity', }; ================================================ FILE: src/main/resources/static/editor-app/app.js ================================================ /* * Activiti Modeler component part of the Activiti project * Copyright 2005-2014 Alfresco Software, Ltd. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ 'use strict'; var activitiModeler = angular.module('activitiModeler', [ 'ngCookies', 'ngResource', 'ngSanitize', 'ngRoute', 'ngDragDrop', 'mgcrea.ngStrap', 'ngGrid', 'ngAnimate', 'pascalprecht.translate', 'duScroll' ]); var activitiModule = activitiModeler; activitiModeler // Initialize routes .config(['$selectProvider', '$translateProvider', function ($selectProvider, $translateProvider) { // Override caret for bs-select directive angular.extend($selectProvider.defaults, { caretHtml: ' ' }); // Initialize angular-translate $translateProvider.useStaticFilesLoader({ prefix: './editor-app/i18n/', suffix: '.json' }); $translateProvider.preferredLanguage('en'); // remember language $translateProvider.useCookieStorage(); }]) .run(['$rootScope', '$timeout', '$modal', '$translate', '$location', '$window', '$http', '$q', function($rootScope, $timeout, $modal, $translate, $location, $window, $http, $q) { $rootScope.config = ACTIVITI.CONFIG; $rootScope.editorInitialized = false; $rootScope.editorFactory = $q.defer(); $rootScope.forceSelectionRefresh = false; $rootScope.ignoreChanges = false; // by default never ignore changes $rootScope.validationErrors = []; $rootScope.staticIncludeVersion = Date.now(); /** * A 'safer' apply that avoids concurrent updates (which $apply allows). */ $rootScope.safeApply = function(fn) { var phase = this.$root.$$phase; if(phase == '$apply' || phase == '$digest') { if(fn && (typeof(fn) === 'function')) { fn(); } } else { this.$apply(fn); } }; /** * Initialize the event bus: couple all Oryx events with a dispatch of the * event of the event bus. This way, it gets much easier to attach custom logic * to any event. */ /* Helper method to fetch model from server (always needed) */ function fetchModel(modelId) { var modelUrl = KISBPM.URL.getModel(modelId); $http({method: 'GET', url: modelUrl}). success(function (data, status, headers, config) { $rootScope.editor = new ORYX.Editor(data); $rootScope.modelData = angular.fromJson(data); $rootScope.editorFactory.resolve(); }). error(function (data, status, headers, config) { console.log('Error loading model with id ' + modelId + ' ' + data); }); } function initScrollHandling() { var canvasSection = jQuery('#canvasSection'); canvasSection.scroll(function() { // Hides the resizer and quick menu items during scrolling var selectedElements = $rootScope.editor.selection; var subSelectionElements = $rootScope.editor._subSelection; $rootScope.selectedElements = selectedElements; $rootScope.subSelectionElements = subSelectionElements; if (selectedElements && selectedElements.length > 0) { $rootScope.selectedElementBeforeScrolling = selectedElements[0]; } jQuery('.Oryx_button').each(function(i, obj) { $rootScope.orginalOryxButtonStyle = obj.style.display; obj.style.display = 'none'; }); jQuery('.resizer_southeast').each(function(i, obj) { $rootScope.orginalResizerSEStyle = obj.style.display; obj.style.display = 'none'; }); jQuery('.resizer_northwest').each(function(i, obj) { $rootScope.orginalResizerNWStyle = obj.style.display; obj.style.display = 'none'; }); $rootScope.editor.handleEvents({type:ORYX.CONFIG.EVENT_CANVAS_SCROLL}); }); canvasSection.scrollStopped(function(){ // Puts the quick menu items and resizer back when scroll is stopped. $rootScope.editor.setSelection([]); // needed cause it checks for element changes and does nothing if the elements are the same $rootScope.editor.setSelection($rootScope.selectedElements, $rootScope.subSelectionElements); $rootScope.selectedElements = undefined; $rootScope.subSelectionElements = undefined; function handleDisplayProperty(obj) { if (jQuery(obj).position().top > 0) { obj.style.display = 'block'; } else { obj.style.display = 'none'; } } jQuery('.Oryx_button').each(function(i, obj) { handleDisplayProperty(obj); }); jQuery('.resizer_southeast').each(function(i, obj) { handleDisplayProperty(obj); }); jQuery('.resizer_northwest').each(function(i, obj) { handleDisplayProperty(obj); }); }); } /** * Initialize the Oryx Editor when the content has been loaded */ $rootScope.$on('$includeContentLoaded', function (event) { if (!$rootScope.editorInitialized) { ORYX._loadPlugins(); var modelId = EDITOR.UTIL.getParameterByName('modelId'); fetchModel(modelId); $rootScope.window = {}; var updateWindowSize = function() { $rootScope.window.width = $window.innerWidth; $rootScope.window.height = $window.innerHeight; }; // Window resize hook angular.element($window).bind('resize', function() { $rootScope.safeApply(updateWindowSize()); }); $rootScope.$watch('window.forceRefresh', function(newValue) { if(newValue) { $timeout(function() { updateWindowSize(); $rootScope.window.forceRefresh = false; }); } }); updateWindowSize(); // Hook in resizing of main panels when window resizes // TODO: perhaps move to a separate JS-file? jQuery(window).resize(function () { // Calculate the offset based on the bottom of the module header var offset = jQuery("#editor-header").offset(); var propSectionHeight = jQuery('#propertySection').height(); var canvas = jQuery('#canvasSection'); var mainHeader = jQuery('#main-header'); if (offset == undefined || offset === null || propSectionHeight === undefined || propSectionHeight === null || canvas === undefined || canvas === null || mainHeader === null) { return; } if ($rootScope.editor) { var selectedElements = $rootScope.editor.selection; var subSelectionElements = $rootScope.editor._subSelection; $rootScope.selectedElements = selectedElements; $rootScope.subSelectionElements = subSelectionElements; if (selectedElements && selectedElements.length > 0) { $rootScope.selectedElementBeforeScrolling = selectedElements[0]; $rootScope.editor.setSelection([]); // needed cause it checks for element changes and does nothing if the elements are the same $rootScope.editor.setSelection($rootScope.selectedElements, $rootScope.subSelectionElements); $rootScope.selectedElements = undefined; $rootScope.subSelectionElements = undefined; } } var totalAvailable = jQuery(window).height() - offset.top - mainHeader.height() - 21; canvas.height(totalAvailable - propSectionHeight); jQuery('#paletteSection').height(totalAvailable); // Update positions of the resize-markers, according to the canvas var actualCanvas = null; if (canvas && canvas[0].children[1]) { actualCanvas = canvas[0].children[1]; } var canvasTop = canvas.position().top; var canvasLeft = canvas.position().left; var canvasHeight = canvas[0].clientHeight; var canvasWidth = canvas[0].clientWidth; var iconCenterOffset = 8; var widthDiff = 0; var actualWidth = 0; if(actualCanvas) { // In some browsers, the SVG-element clientwidth isn't available, so we revert to the parent actualWidth = actualCanvas.clientWidth || actualCanvas.parentNode.clientWidth; } if(actualWidth < canvas[0].clientWidth) { widthDiff = actualWidth - canvas[0].clientWidth; // In case the canvas is smaller than the actual viewport, the resizers should be moved canvasLeft -= widthDiff / 2; canvasWidth += widthDiff; } var iconWidth = 17; var iconOffset = 20; var north = jQuery('#canvas-grow-N'); north.css('top', canvasTop + iconOffset + 'px'); north.css('left', canvasLeft - 10 + (canvasWidth - iconWidth) / 2 + 'px'); var south = jQuery('#canvas-grow-S'); south.css('top', (canvasTop + canvasHeight - iconOffset - iconCenterOffset) + 'px'); south.css('left', canvasLeft - 10 + (canvasWidth - iconWidth) / 2 + 'px'); var east = jQuery('#canvas-grow-E'); east.css('top', canvasTop - 10 + (canvasHeight - iconWidth) / 2 + 'px'); east.css('left', (canvasLeft + canvasWidth - iconOffset - iconCenterOffset) + 'px'); var west = jQuery('#canvas-grow-W'); west.css('top', canvasTop -10 + (canvasHeight - iconWidth) / 2 + 'px'); west.css('left', canvasLeft + iconOffset + 'px'); north = jQuery('#canvas-shrink-N'); north.css('top', canvasTop + iconOffset + 'px'); north.css('left', canvasLeft + 10 + (canvasWidth - iconWidth) / 2 + 'px'); south = jQuery('#canvas-shrink-S'); south.css('top', (canvasTop + canvasHeight - iconOffset - iconCenterOffset) + 'px'); south.css('left', canvasLeft +10 + (canvasWidth - iconWidth) / 2 + 'px'); east = jQuery('#canvas-shrink-E'); east.css('top', canvasTop + 10 + (canvasHeight - iconWidth) / 2 + 'px'); east.css('left', (canvasLeft + canvasWidth - iconOffset - iconCenterOffset) + 'px'); west = jQuery('#canvas-shrink-W'); west.css('top', canvasTop + 10 + (canvasHeight - iconWidth) / 2 + 'px'); west.css('left', canvasLeft + iconOffset + 'px'); }); jQuery(window).trigger('resize'); jQuery.fn.scrollStopped = function(callback) { jQuery(this).scroll(function(){ var self = this, $this = jQuery(self); if ($this.data('scrollTimeout')) { clearTimeout($this.data('scrollTimeout')); } $this.data('scrollTimeout', setTimeout(callback,50,self)); }); }; // Always needed, cause the DOM element on which the scroll event listeners are attached are changed for every new model initScrollHandling(); $rootScope.editorInitialized = true; } }); /** * Initialize the event bus: couple all Oryx events with a dispatch of the * event of the event bus. This way, it gets much easier to attach custom logic * to any event. */ $rootScope.editorFactory.promise.then(function() { KISBPM.eventBus.editor = $rootScope.editor; var eventMappings = [ { oryxType : ORYX.CONFIG.EVENT_SELECTION_CHANGED, kisBpmType : KISBPM.eventBus.EVENT_TYPE_SELECTION_CHANGE }, { oryxType : ORYX.CONFIG.EVENT_DBLCLICK, kisBpmType : KISBPM.eventBus.EVENT_TYPE_DOUBLE_CLICK }, { oryxType : ORYX.CONFIG.EVENT_MOUSEOUT, kisBpmType : KISBPM.eventBus.EVENT_TYPE_MOUSE_OUT }, { oryxType : ORYX.CONFIG.EVENT_MOUSEOVER, kisBpmType : KISBPM.eventBus.EVENT_TYPE_MOUSE_OVER } ]; eventMappings.forEach(function(eventMapping) { $rootScope.editor.registerOnEvent(eventMapping.oryxType, function(event) { KISBPM.eventBus.dispatch(eventMapping.kisBpmType, event); }); }); $rootScope.editor.registerOnEvent(ORYX.CONFIG.EVENT_SHAPEREMOVED, function (event) { var validateButton = document.getElementById(event.shape.resourceId + "-validate-button"); if (validateButton) { validateButton.style.display = 'none'; } }); // The Oryx canvas is ready (we know since we're in this promise callback) and the // event bus is ready. The editor is now ready for use KISBPM.eventBus.dispatch(KISBPM.eventBus.EVENT_TYPE_EDITOR_READY, {type : KISBPM.eventBus.EVENT_TYPE_EDITOR_READY}); }); // Alerts $rootScope.alerts = { queue: [] }; $rootScope.showAlert = function(alert) { if(alert.queue.length > 0) { alert.current = alert.queue.shift(); // Start timout for message-pruning alert.timeout = $timeout(function() { if (alert.queue.length == 0) { alert.current = undefined; alert.timeout = undefined; } else { $rootScope.showAlert(alert); } }, (alert.current.type == 'error' ? 5000 : 1000)); } else { $rootScope.alerts.current = undefined; } }; $rootScope.addAlert = function(message, type) { var newAlert = {message: message, type: type}; if (!$rootScope.alerts.timeout) { // Timeout for message queue is not running, start one $rootScope.alerts.queue.push(newAlert); $rootScope.showAlert($rootScope.alerts); } else { $rootScope.alerts.queue.push(newAlert); } }; $rootScope.dismissAlert = function() { if (!$rootScope.alerts.timeout) { $rootScope.alerts.current = undefined; } else { $timeout.cancel($rootScope.alerts.timeout); $rootScope.alerts.timeout = undefined; $rootScope.showAlert($rootScope.alerts); } }; $rootScope.addAlertPromise = function(promise, type) { if (promise) { promise.then(function(data) { $rootScope.addAlert(data, type); }); } }; } ]) // Moment-JS date-formatting filter .filter('dateformat', function() { return function(date, format) { if (date) { if (format) { return moment(date).format(format); } else { return moment(date).calendar(); } } return ''; }; }); ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/assignment-display-template.html ================================================ {{'PROPERTY.ASSIGNMENT.ASSIGNEE_DISPLAY' | translate:property.value.assignment }} {{'PROPERTY.ASSIGNMENT.CANDIDATE_USERS_DISPLAY' | translate:property.value.assignment.candidateUsers}} {{'PROPERTY.ASSIGNMENT.CANDIDATE_GROUPS_DISPLAY' | translate:property.value.assignment.candidateGroups}} PROPERTY.ASSIGNMENT.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/assignment-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/assignment-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/boolean-property-template.html ================================================
    ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/condition-expression-display-template.html ================================================ {{property.value|limitTo:20}} {{'PROPERTY.SEQUENCEFLOW.CONDITION.NO-CONDITION-DISPLAY' | translate}} ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/condition-expression-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/execution-listeners-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/feedback-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/fields-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/form-properties-display-template.html ================================================ {{'PROPERTY.FORMPROPERTIES.VALUE' | translate:property.value.formProperties}} PROPERTY.FORMPROPERTIES.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/form-properties-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/form-properties-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/in-parameters-display-template.html ================================================ {{'PROPERTY.INPARAMETERS.VALUE' | translate:property.value.inParameters}} PROPERTY.INPARAMETERS.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/in-parameters-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/in-parameters-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/message-definitions-display-template.html ================================================ {{'PROPERTY.MESSAGEDEFINITIONS.DISPLAY' | translate:property.value}} PROPERTY.MESSAGEDEFINITIONS.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/message-definitions-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/message-definitions-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/message-property-write-template.html ================================================
    ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/multiinstance-property-write-template.html ================================================
    ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/out-parameters-display-template.html ================================================ {{'PROPERTY.OUTPARAMETERS.VALUE' | translate:property.value.outParameters}} PROPERTY.OUTPARAMETERS.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/out-parameters-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/out-parameters-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/sequenceflow-order-display-template.html ================================================ PROPERTY.SEQUENCEFLOW.ORDER.NOT.EMPTY PROPERTY.SEQUENCEFLOW.ORDER.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/sequenceflow-order-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/sequenceflow-order-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/signal-definitions-display-template.html ================================================ {{'PROPERTY.SIGNALDEFINITIONS.DISPLAY' | translate:property.value}} PROPERTY.SIGNALDEFINITIONS.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/signal-definitions-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/signal-definitions-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/signal-property-write-template.html ================================================
    ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/string-property-write-mode-template.html ================================================
    ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/subprocess-reference-display-template.html ================================================ {{property.value.name}} PROPERTY.SUBPROCESSREFERENCE.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/subprocess-reference-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/subprocess-reference-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/task-listeners-display-template.html ================================================ {{'PROPERTY.TASKLISTENERS.VALUE' | translate:property.value.taskListeners}} PROPERTY.TASKLISTENERS.EMPTY ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/task-listeners-popup.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/task-listeners-write-template.html ================================================ ================================================ FILE: src/main/resources/static/editor-app/configuration/properties/text-popup.html ================================================
    ================================================ FILE: src/main/resources/templates/common/dict/edit.html ================================================
    ================================================ FILE: src/main/resources/templates/common/file/file.html ================================================ bootdo - 文件管理器 ================================================ FILE: src/main/resources/templates/common/generator/Controller.java.vm ================================================ package ${package}.controller; import java.util.List; import java.util.Map; import me.zbl.common.utils.PageWrapper; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import ${package}.domain.${className}DO; import ${package}.service.${className}Service; import me.zbl.common.utils.Query; import me.zbl.common.utils.R; /** * ${comments} * * @author 郑保乐 * @email ${email} * @date ${datetime} */ @Controller @RequestMapping("/${pathName}/${classname}") public class ${className}Controller { @Autowired private ${className}Service ${classname}Service; @GetMapping() @RequiresPermissions("${pathName}:${classname}:${classname}") String ${className}(){ return "${pathName}/${classname}/${classname}"; } @ResponseBody @GetMapping("/list") @RequiresPermissions("${pathName}:${classname}:${classname}") public PageWrapper list(@RequestParam Map params){ //查询列表数据 Query query = new Query(params); List<${className}DO> ${classname}List = ${classname}Service.list(query); int total = ${classname}Service.count(query); PageWrapper pageWrapper = new PageWrapper(${classname}List, total); return pageWrapper; } @GetMapping("/add") @RequiresPermissions("${pathName}:${classname}:add") String add(){ return "${pathName}/${classname}/add"; } @GetMapping("/edit/{${pk.attrname}}") @RequiresPermissions("${pathName}:${classname}:edit") String edit(@PathVariable("${pk.attrname}") ${pk.attrType} ${pk.attrname},Model model){ ${className}DO ${classname} = ${classname}Service.get(${pk.attrname}); model.addAttribute("${classname}", ${classname}); return "${pathName}/${classname}/edit"; } /** * 保存 */ @ResponseBody @PostMapping("/save") @RequiresPermissions("${pathName}:${classname}:add") public R save( ${className}DO ${classname}){ if(${classname}Service.save(${classname})>0){ return R.ok(); } return R.error(); } /** * 修改 */ @ResponseBody @RequestMapping("/update") @RequiresPermissions("${pathName}:${classname}:edit") public R update( ${className}DO ${classname}){ ${classname}Service.update(${classname}); return R.ok(); } /** * 删除 */ @PostMapping( "/remove") @ResponseBody @RequiresPermissions("${pathName}:${classname}:remove") public R remove( ${pk.attrType} ${pk.attrname}){ if(${classname}Service.remove(${pk.attrname})>0){ return R.ok(); } return R.error(); } /** * 删除 */ @PostMapping( "/batchRemove") @ResponseBody @RequiresPermissions("${pathName}:${classname}:batchRemove") public R remove(@RequestParam("ids[]") ${pk.attrType}[] ${pk.attrname}s){ ${classname}Service.batchRemove(${pk.attrname}s); return R.ok(); } } ================================================ FILE: src/main/resources/templates/common/generator/Dao.java.vm ================================================ package ${package}.dao; import ${package}.domain.${className}DO; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Mapper; /** * ${comments} * @author 郑保乐 * @email ${email} * @date ${datetime} */ @Mapper public interface ${className}Dao { ${className}DO get(${pk.attrType} ${pk.attrname}); List<${className}DO> list(Map map); int count(Map map); int save(${className}DO ${classname}); int update(${className}DO ${classname}); int remove(${pk.attrType} ${pk.columnName}); int batchRemove(${pk.attrType}[] ${pk.attrname}s); } ================================================ FILE: src/main/resources/templates/common/generator/Mapper.java.vm ================================================ package ${package}.dao; import ${package}.domain.${className}DO; import java.util.List; import java.util.Map; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; /** * ${comments} * * @author 郑保乐 * @email ${email} * @date ${datetime} */ @Mapper public interface ${className}Mapper { @Select("select #foreach($column in $columns) `$column.columnName`#if($velocityCount != $columns.size()), #end #end from ${tableName} where ${pk.columnName} = #{id}") ${className}DO get(${pk.attrType} ${pk.attrname}); @Select("") List<${className}DO> list(Map map); @Select("") int count(Map map); @Insert("insert into ${tableName} (#foreach($column in $columns) #if($column.columnName != $pk.columnName || $pk.extra != 'auto_increment') `$column.columnName`#if($velocityCount != $columns.size()), #end #end #end)" + "values (#foreach($column in $columns) #if($column.columnName != $pk.columnName || $pk.extra != 'auto_increment') #{$column.attrname}#if($velocityCount != $columns.size()), #end #end #end)") int save(${className}DO ${classname}); @Update("") int update(${className}DO ${classname}); @Delete("delete from ${tableName} where ${pk.columnName} =#{${pk.attrname}}") int remove(${pk.attrType} ${pk.columnName}); @Delete("") int batchRemove(${pk.attrType}[] ${pk.attrname}s); } ================================================ FILE: src/main/resources/templates/common/generator/Mapper.xml.vm ================================================ insert into ${tableName} ( #foreach($column in $columns) #if($column.columnName != $pk.columnName || $pk.extra != 'auto_increment') `$column.columnName`#if($velocityCount != $columns.size()), #end #end #end ) values ( #foreach($column in $columns) #if($column.columnName != $pk.columnName || $pk.extra != 'auto_increment') #{$column.attrname}#if($velocityCount != $columns.size()), #end #end #end ) update ${tableName} #foreach($column in $columns) #if($column.columnName != $pk.columnName) `$column.columnName` = #{$column.attrname}#if($velocityCount != $columns.size()), #end #end #end where ${pk.columnName} = #{${pk.attrname}} delete from ${tableName} where ${pk.columnName} = #{value} delete from ${tableName} where ${pk.columnName} in #{${pk.attrname}} ================================================ FILE: src/main/resources/templates/common/generator/Service.java.vm ================================================ package ${package}.service; import ${package}.domain.${className}DO; import java.util.List; import java.util.Map; /** * ${comments} * * @author 郑保乐 * @email ${email} * @date ${datetime} */ public interface ${className}Service { ${className}DO get(${pk.attrType} ${pk.attrname}); List<${className}DO> list(Map map); int count(Map map); int save(${className}DO ${classname}); int update(${className}DO ${classname}); int remove(${pk.attrType} ${pk.attrname}); int batchRemove(${pk.attrType}[] ${pk.attrname}s); } ================================================ FILE: src/main/resources/templates/common/generator/ServiceImpl.java.vm ================================================ package ${package}.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; import ${package}.dao.${className}Dao; import ${package}.domain.${className}DO; import ${package}.service.${className}Service; @Service public class ${className}ServiceImpl implements ${className}Service { @Autowired private ${className}Dao ${classname}Dao; @Override public ${className}DO get(${pk.attrType} ${pk.attrname}){ return ${classname}Dao.get(${pk.attrname}); } @Override public List<${className}DO> list(Map map){ return ${classname}Dao.list(map); } @Override public int count(Map map){ return ${classname}Dao.count(map); } @Override public int save(${className}DO ${classname}){ return ${classname}Dao.save(${classname}); } @Override public int update(${className}DO ${classname}){ return ${classname}Dao.update(${classname}); } @Override public int remove(${pk.attrType} ${pk.attrname}){ return ${classname}Dao.remove(${pk.attrname}); } @Override public int batchRemove(${pk.attrType}[] ${pk.attrname}s){ return ${classname}Dao.batchRemove(${pk.attrname}s); } } ================================================ FILE: src/main/resources/templates/common/generator/add.html.vm ================================================
    #foreach($column in $columns) #if($column.columnName != $pk.columnName)
    #end #end
    ================================================ FILE: src/main/resources/templates/common/generator/add.js.vm ================================================ $().ready(function() { validateRule(); }); $.validator.setDefaults({ submitHandler : function() { save(); } }); function save() { $.ajax({ cache : true, type : "POST", url : "/${pathName}/${classname}/save", data : $('#signupForm').serialize(),// 你的formid async : false, error : function(request) { parent.layer.alert("Connection error"); }, success : function(data) { if (data.code == 0) { parent.layer.msg("操作成功"); parent.reLoad(); var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引 parent.layer.close(index); } else { parent.layer.alert(data.msg) } } }); } function validateRule() { var icon = " "; $("#signupForm").validate({ rules : { name : { required : true } }, messages : { name : { required : icon + "请输入姓名" } } }) } ================================================ FILE: src/main/resources/templates/common/generator/domain.java.vm ================================================ package ${package}.domain; import java.io.Serializable; import java.util.Date; #if(${hasBigDecimal}) import java.math.BigDecimal; #end /** * ${comments} * * @author 郑保乐 * @email ${email} * @date ${datetime} */ public class ${className}DO implements Serializable { private static final long serialVersionUID = 1L; #foreach ($column in $columns) //$column.comments private $column.attrType $column.attrname; #end #foreach ($column in $columns) /** * 设置:${column.comments} */ public void set${column.attrName}($column.attrType $column.attrname) { this.$column.attrname = $column.attrname; } /** * 获取:${column.comments} */ public $column.attrType get${column.attrName}() { return $column.attrname; } #end } ================================================ FILE: src/main/resources/templates/common/generator/edit.html ================================================
    ================================================ FILE: src/main/resources/templates/common/generator/edit.html.vm ================================================
    #foreach($column in $columns) #if($column.columnName != $pk.columnName)
    #end #end
    ================================================ FILE: src/main/resources/templates/common/generator/edit.js.vm ================================================ $().ready(function() { validateRule(); }); $.validator.setDefaults({ submitHandler : function() { update(); } }); function update() { $.ajax({ cache : true, type : "POST", url : "/${pathName}/${classname}/update", data : $('#signupForm').serialize(),// 你的formid async : false, error : function(request) { parent.layer.alert("Connection error"); }, success : function(data) { if (data.code == 0) { parent.layer.msg("操作成功"); parent.reLoad(); var index = parent.layer.getFrameIndex(window.name); // 获取窗口索引 parent.layer.close(index); } else { parent.layer.alert(data.msg) } } }); } function validateRule() { var icon = " "; $("#signupForm").validate({ rules : { name : { required : true } }, messages : { name : { required : icon + "请输入名字" } } }) } ================================================ FILE: src/main/resources/templates/common/generator/list.html ================================================
    ================================================ FILE: src/main/resources/templates/common/generator/list.html.vm ================================================
    ================================================ FILE: src/main/resources/templates/common/generator/list.js.vm ================================================ var prefix = "/${pathName}/${classname}" $(function() { load(); }); function load() { $('#exampleTable') .bootstrapTable( { method : 'get', // 服务器数据的请求方式 get or post url : prefix + "/list", // 服务器数据的加载地址 // showRefresh : true, // showToggle : true, // showColumns : true, iconSize : 'outline', toolbar : '#exampleToolbar', striped : true, // 设置为true会有隔行变色效果 dataType : "json", // 服务器返回的数据类型 pagination : true, // 设置为true会在底部显示分页条 // queryParamsType : "limit", // //设置为limit则会发送符合RESTFull格式的参数 singleSelect : false, // 设置为true将禁止多选 // contentType : "application/x-www-form-urlencoded", // //发送到服务器的数据编码类型 pageSize : 10, // 如果设置了分页,每页数据条数 pageNumber : 1, // 如果设置了分布,首页页码 //search : true, // 是否显示搜索框 showColumns : false, // 是否显示内容下拉框(选择显示的列) sidePagination : "server", // 设置在哪里进行分页,可选值为"client" 或者 "server" queryParams : function(params) { return { //说明:传入后台的参数包括offset开始索引,limit步长,sort排序列,order:desc或者,以及所有列的键值对 limit: params.limit, offset:params.offset // name:$('#searchName').val(), // username:$('#searchName').val() }; }, // //请求服务器数据时,你可以通过重写参数的方式添加一些额外的参数,例如 toolbar 中的参数 如果 // queryParamsType = 'limit' ,返回参数必须包含 // limit, offset, search, sort, order 否则, 需要包含: // pageSize, pageNumber, searchText, sortName, // sortOrder. // 返回false将会终止请求 columns : [ { checkbox : true }, #foreach($column in $columns) { field : '${column.attrname}', title : '${column.comments}' }, #end { title : '操作', field : 'id', align : 'center', formatter : function(value, row, index) { var e = ' '; var d = ' '; var f = ' '; return e + d ; } } ] }); } function reLoad() { $('#exampleTable').bootstrapTable('refresh'); } function add() { layer.open({ type : 2, title : '增加', maxmin : true, shadeClose : false, // 点击遮罩关闭层 area : [ '800px', '520px' ], content : prefix + '/add' // iframe的url }); } function edit(id) { layer.open({ type : 2, title : '编辑', maxmin : true, shadeClose : false, // 点击遮罩关闭层 area : [ '800px', '520px' ], content : prefix + '/edit/' + id // iframe的url }); } function remove(id) { layer.confirm('确定要删除选中的记录?', { btn : [ '确定', '取消' ] }, function() { $.ajax({ url : prefix+"/remove", type : "post", data : { '${pk.attrname}' : id }, success : function(r) { if (r.code==0) { layer.msg(r.msg); reLoad(); }else{ layer.msg(r.msg); } } }); }) } function resetPwd(id) { } function batchRemove() { var rows = $('#exampleTable').bootstrapTable('getSelections'); // 返回所有选择的行,当没有选择的记录时,返回一个空数组 if (rows.length == 0) { layer.msg("请选择要删除的数据"); return; } layer.confirm("确认要删除选中的'" + rows.length + "'条数据吗?", { btn : [ '确定', '取消' ] // 按钮 }, function() { var ids = new Array(); // 遍历所有选择的行数据,取每条数据对应的ID $.each(rows, function(i, row) { ids[i] = row['${pk.attrname}']; }); $.ajax({ type : 'POST', data : { "ids" : ids }, url : prefix + '/batchRemove', success : function(r) { if (r.code == 0) { layer.msg(r.msg); reLoad(); } else { layer.msg(r.msg); } } }); }, function() { }); } ================================================ FILE: src/main/resources/templates/common/generator/menu.sql.vm ================================================ -- 菜单SQL INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) VALUES ('1', '${comments}', 'modules/generator/${pathName}.html', NULL, '1', 'fa fa-file-code-o', '6'); -- 按钮父菜单ID set @parentId = @@identity; -- 菜单对应按钮SQL INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) SELECT @parentId, '查看', null, '${pathName}:list,${pathName}:info', '2', null, '6'; INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) SELECT @parentId, '新增', null, '${pathName}:save', '2', null, '6'; INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) SELECT @parentId, '修改', null, '${pathName}:update', '2', null, '6'; INSERT INTO `sys_menu` (`parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`) SELECT @parentId, '删除', null, '${pathName}:delete', '2', null, '6'; ================================================ FILE: src/main/resources/templates/common/job/add.html ================================================
    ================================================ FILE: src/main/resources/templates/common/job/edit.html ================================================
    ================================================ FILE: src/main/resources/templates/common/job/job.html ================================================
    ================================================ FILE: src/main/resources/templates/common/log/log.html ================================================
    ================================================ FILE: src/main/resources/templates/error/403.html ================================================ 403 页面

    403

    您没有访问权限!

    抱歉,请联系管理员哦~
    ================================================ FILE: src/main/resources/templates/error/404.html ================================================ Bootdo - 404 页面

    404

    页面未找到!

    抱歉,页面好像去火星了~
    ================================================ FILE: src/main/resources/templates/error/500.html ================================================ 500错误

    500

    服务器内部错误

    服务器好像出错了...
    您可以返回主页看看
    主页
    ================================================ FILE: src/main/resources/templates/error/error.html ================================================ 500错误

    500

    服务器内部错误

    服务器好像出错了...
    您可以返回主页看看
    主页
    ================================================ FILE: src/main/resources/templates/include.html ================================================
    ================================================ FILE: src/main/resources/templates/index_v1.html ================================================ 医院药品管理系统
    ================================================ FILE: src/main/resources/templates/login.html ================================================ 医院药品管理系统

    用户登录

    欢迎登录医院药品管理系统

    ================================================ FILE: src/main/resources/templates/main.html ================================================ 欢迎页

    欢迎使用医院药品管理系统

    ================================================ FILE: src/main/resources/templates/oa/notify/add.html ================================================
    ================================================ FILE: src/main/resources/templates/oa/notify/edit.html ================================================
    ================================================ FILE: src/main/resources/templates/oa/notify/notify.html ================================================
    ================================================ FILE: src/main/resources/templates/oa/notify/read.html ================================================
    ================================================ FILE: src/main/resources/templates/oa/notify/selfNotify.html ================================================
    ================================================ FILE: src/main/resources/templates/system/dept/add.html ================================================
    ================================================ FILE: src/main/resources/templates/system/dept/dept.html ================================================
    ================================================ FILE: src/main/resources/templates/system/dept/deptTree.html ================================================
    ================================================ FILE: src/main/resources/templates/system/dept/edit.html ================================================
    ================================================ FILE: src/main/resources/templates/system/menu/add.html ================================================
    ================================================ FILE: src/main/resources/templates/system/menu/edit.html ================================================
    ================================================ FILE: src/main/resources/templates/system/menu/menu.html ================================================
    ================================================ FILE: src/main/resources/templates/system/online/online.html ================================================
    ================================================ FILE: src/main/resources/templates/system/role/add.html ================================================
    ================================================ FILE: src/main/resources/templates/system/role/edit.html ================================================
    ================================================ FILE: src/main/resources/templates/system/role/role.html ================================================
    ================================================ FILE: src/main/resources/templates/system/user/add.html ================================================
    ================================================ FILE: src/main/resources/templates/system/user/edit.html ================================================
    ================================================ FILE: src/main/resources/templates/system/user/include.html ================================================
    ================================================ FILE: src/main/resources/templates/system/user/personal.html ================================================
    * 姓名:
    * 性别:
    * 出生年月:
    * 手机:
    * 邮箱:
    * 居住地:
    * 联系地址:
    * 爱好:
    * 旧密码:
    * 新密码:
    * 确认密码:
    ================================================ FILE: src/main/resources/templates/system/user/reset_pwd.html ================================================
    ================================================ FILE: src/main/resources/templates/system/user/user.html ================================================
    选择部门
    ================================================ FILE: src/main/resources/templates/system/user/userTree.html ================================================
    ================================================ FILE: src/test/java/me/zbl/app/LowerLimitTest.java ================================================ /* * Copyright 2018 JamesZBL * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package me.zbl.app; import me.zbl.app.service.DrugOutService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; /** * @author JamesZBL * @email 1146556298@qq.com * @date 2018-05-12 */ @SpringBootTest @RunWith(SpringRunner.class) public class LowerLimitTest { @Autowired DrugOutService drugOutService; /** * 测试库存下限提醒 */ @Test public void doTest() { drugOutService.checkLowerLimit(); } } ================================================ FILE: src/test/java/me/zbl/testDemo/TestDemo.java ================================================ package me.zbl.testDemo; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.TimeUnit; @RestController() @RunWith(SpringRunner.class) @SpringBootTest public class TestDemo { }