CSS mode
30 | 65 | 70 | 71 |MIME types defined: text/css
, text/x-scss
(demo), text/x-less
(demo).
├── .gitignore ├── LICENSE ├── README.md └── teemo ├── pom.xml ├── sql └── teemo.sql └── src └── main ├── java ├── com │ └── teemo │ │ ├── core │ │ ├── Constants.java │ │ ├── aop │ │ │ └── MenuCacheAspect.java │ │ ├── entity │ │ │ ├── BaseEntity.java │ │ │ └── LogicDeletable.java │ │ ├── exception │ │ │ ├── UserBlockedException.java │ │ │ ├── UserException.java │ │ │ ├── UserNotExistsException.java │ │ │ └── UserPasswordIncorrectnessException.java │ │ ├── security │ │ │ ├── CurrentUserInterceptor.java │ │ │ ├── CustomCredentialsMatcher.java │ │ │ └── ShiroSecurityRealm.java │ │ └── util │ │ │ ├── DPUtil.java │ │ │ └── UserLogUtil.java │ │ ├── dao │ │ ├── DepartmentDao.java │ │ ├── DynamicPropertyDao.java │ │ ├── PermissionDao.java │ │ ├── ResourceDao.java │ │ ├── RoleDao.java │ │ ├── RoleResourcePermissionDao.java │ │ └── UserDao.java │ │ ├── dto │ │ ├── BTQueryParameter.java │ │ ├── Page.java │ │ ├── Result.java │ │ └── ResultData.java │ │ ├── entity │ │ ├── Department.java │ │ ├── DynamicProperty.java │ │ ├── Menu.java │ │ ├── Permission.java │ │ ├── Resource.java │ │ ├── ResourceNode.java │ │ ├── ResourceType.java │ │ ├── Role.java │ │ ├── RoleResourcePermission.java │ │ ├── User.java │ │ ├── UserLastOnline.java │ │ └── UserStatus.java │ │ ├── service │ │ ├── AuthorizationService.java │ │ ├── DepartmentService.java │ │ ├── DynamicPropertyService.java │ │ ├── PermissionService.java │ │ ├── ResourceService.java │ │ ├── RoleResourcePermissionService.java │ │ ├── RoleService.java │ │ └── UserService.java │ │ └── web │ │ └── controller │ │ ├── AuthController.java │ │ ├── DefaultExceptionHandler.java │ │ ├── DepartmentController.java │ │ ├── DynamicPropertyController.java │ │ ├── MainController.java │ │ ├── PermissionController.java │ │ ├── ResourceController.java │ │ ├── RoleController.java │ │ └── UserController.java └── core │ ├── cache │ └── BaseCacheAspect.java │ ├── dao │ ├── BaseDao.java │ └── Dao.java │ ├── exception │ └── SearchException.java │ ├── service │ ├── BaseService.java │ └── Service.java │ ├── support │ ├── Condition.java │ ├── CustomDateEditor.java │ ├── PageRequest.java │ ├── SearchRequest.java │ ├── Sort.java │ ├── page │ │ ├── AbstractPageRequest.java │ │ └── Pageable.java │ ├── repository │ │ ├── CollectionToStringUserType.java │ │ └── EnabledQueryCache.java │ └── search │ │ ├── AbstractSearchFilter.java │ │ ├── AbstractSearchRequest.java │ │ ├── SearchFilter.java │ │ ├── SearchOperator.java │ │ ├── SearchType.java │ │ └── Searchable.java │ ├── util │ ├── EntityUtil.java │ ├── IpUtil.java │ ├── ReflectUtil.java │ ├── SpringUtil.java │ ├── StringPool.java │ └── StringUtil.java │ └── web │ └── controller │ └── BaseController.java ├── resources ├── applicationContext.xml ├── ehcache-hibernate.xml ├── ehcache-teemo.xml ├── jdbc.properties ├── log4j.xml ├── messages.properties ├── spring-cache.xml ├── spring-jdbc.xml ├── spring-mvc.xml └── spring-shiro.xml ├── test └── com │ └── teemo │ └── service │ └── TestUserService.java └── webapp ├── WEB-INF ├── page │ ├── admin │ │ ├── dashboard.jsp │ │ ├── department │ │ │ ├── edit.jsp │ │ │ └── main.jsp │ │ ├── home.jsp │ │ ├── permission │ │ │ ├── edit.jsp │ │ │ └── main.jsp │ │ ├── property │ │ │ ├── edit.jsp │ │ │ └── main.jsp │ │ ├── resource │ │ │ ├── edit.jsp │ │ │ └── main.jsp │ │ ├── role │ │ │ ├── auth.jsp │ │ │ ├── edit.jsp │ │ │ └── main.jsp │ │ └── user │ │ │ ├── auth.jsp │ │ │ ├── edit.jsp │ │ │ ├── main.jsp │ │ │ └── profile.jsp │ ├── core.jsp │ ├── error │ │ ├── 50x.jsp │ │ ├── notfound.jsp │ │ └── unauthorized.jsp │ ├── login.jsp │ └── register.jsp └── web.xml ├── index.jsp └── static ├── css ├── animate.css ├── bootstrap-rtl.css ├── bootstrap.min.css ├── demo │ └── webuploader-demo.css ├── font-awesome.css ├── font-awesome.min.css ├── login.css ├── patterns │ ├── header-profile-skin-1.png │ ├── header-profile-skin-3.png │ ├── header-profile.png │ └── shattered.png ├── plugins │ ├── awesome-bootstrap-checkbox │ │ └── awesome-bootstrap-checkbox.css │ ├── blueimp │ │ ├── css │ │ │ ├── blueimp-gallery-indicator.css │ │ │ ├── blueimp-gallery-video.css │ │ │ ├── blueimp-gallery.css │ │ │ ├── blueimp-gallery.min.css │ │ │ └── demo.css │ │ └── img │ │ │ ├── error.png │ │ │ ├── error.svg │ │ │ ├── loading.gif │ │ │ ├── play-pause.png │ │ │ ├── play-pause.svg │ │ │ ├── video-play.png │ │ │ └── video-play.svg │ ├── bootstrap-table │ │ └── bootstrap-table.min.css │ ├── chosen │ │ ├── chosen-sprite.png │ │ ├── chosen-sprite@2x.png │ │ └── chosen.css │ ├── clockpicker │ │ └── clockpicker.css │ ├── codemirror │ │ ├── ambiance.css │ │ └── codemirror.css │ ├── colorpicker │ │ ├── css │ │ │ └── bootstrap-colorpicker.min.css │ │ └── img │ │ │ └── bootstrap-colorpicker │ │ │ ├── alpha-horizontal.png │ │ │ ├── alpha.png │ │ │ ├── hue-horizontal.png │ │ │ ├── hue.png │ │ │ └── saturation.png │ ├── cropper │ │ └── cropper.min.css │ ├── dataTables │ │ └── dataTables.bootstrap.css │ ├── datapicker │ │ └── datepicker3.css │ ├── dropzone │ │ ├── basic.css │ │ └── dropzone.css │ ├── duallistbox │ │ └── bootstrap-duallistbox.css │ ├── footable │ │ ├── fonts │ │ │ ├── footable.eot │ │ │ ├── footable.svg │ │ │ ├── footable.ttf │ │ │ └── footable.woff │ │ └── footable.core.css │ ├── fullcalendar │ │ ├── fullcalendar.css │ │ └── fullcalendar.print.css │ ├── iCheck │ │ ├── custom.css │ │ ├── green.png │ │ └── green@2x.png │ ├── images │ │ ├── sort_asc.png │ │ ├── sort_desc.png │ │ ├── sprite-skin-flat.png │ │ ├── spritemap.png │ │ └── spritemap@2x.png │ ├── ionRangeSlider │ │ ├── ion.rangeSlider.css │ │ └── ion.rangeSlider.skinFlat.css │ ├── jQueryUI │ │ ├── images │ │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ │ │ ├── ui-bg_flat_75_ffffff_40x100.png │ │ │ ├── ui-icons_222222_256x240.png │ │ │ ├── ui-icons_454545_256x240.png │ │ │ └── ui-icons_888888_256x240.png │ │ └── jquery-ui-1.10.4.custom.min.css │ ├── jasny │ │ └── jasny-bootstrap.min.css │ ├── jqgrid │ │ └── ui.jqgrid.css │ ├── jsTree │ │ ├── 32px.png │ │ ├── style.min.css │ │ └── throbber.gif │ ├── markdown │ │ └── bootstrap-markdown.min.css │ ├── morris │ │ └── morris-0.4.3.min.css │ ├── multiselect │ │ └── bootstrap-multiselect.css │ ├── nouslider │ │ └── jquery.nouislider.css │ ├── plyr │ │ ├── plyr.css │ │ └── sprite.svg │ ├── simditor │ │ └── simditor.css │ ├── steps │ │ └── jquery.steps.css │ ├── summernote │ │ ├── summernote-bs3.css │ │ └── summernote.css │ ├── sweetalert │ │ └── sweetalert.css │ ├── switchery │ │ └── switchery.css │ ├── toastr │ │ └── toastr.min.css │ ├── treeview │ │ └── bootstrap-treeview.css │ └── webuploader │ │ └── webuploader.css └── style.css ├── favicon.ico ├── favicon1.ico ├── fonts ├── FontAwesome.otf ├── fontawesome-webfont.eot ├── fontawesome-webfont.svg ├── fontawesome-webfont.ttf ├── fontawesome-webfont.woff ├── fontawesome-webfont.woff2 ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf ├── glyphicons-halflings-regular.woff └── glyphicons-halflings-regular.woff2 ├── img ├── a1.jpg ├── a2.jpg ├── a3.jpg ├── a4.jpg ├── a5.jpg ├── a6.jpg ├── a7.jpg ├── a8.jpg ├── a9.jpg ├── bg.png ├── browser.png ├── browser.psd ├── iconfont-logo.png ├── icons.png ├── index.jpg ├── index_4.jpg ├── loading-upload.gif ├── locked.png ├── login-background.jpg ├── p1.jpg ├── p2.jpg ├── p3.jpg ├── p_big1.jpg ├── p_big2.jpg ├── p_big3.jpg ├── pay.png ├── profile.jpg ├── profile_big.jpg ├── profile_girl.jpg ├── profile_small.jpg ├── progress.png ├── qr_code.png ├── sprite-skin-flat.png ├── success.png ├── user.png ├── webuploader.png └── wenku_logo.png └── js ├── admin ├── common.js ├── table.js └── validate.js ├── bootstrap.min.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 ├── hplus.js ├── jquery-ui-1.10.4.min.js ├── jquery-ui.custom.min.js ├── jquery.min.js ├── jquery.min.map ├── login.js ├── plugins ├── beautifyhtml │ └── beautifyhtml.js ├── blueimp │ └── jquery.blueimp-gallery.min.js ├── bootstrap-table │ ├── bootstrap-table-mobile.min.js │ ├── bootstrap-table.min.js │ └── locale │ │ ├── bootstrap-table-zh-CN.js │ │ └── bootstrap-table-zh-CN.min.js ├── chartJs │ └── Chart.min.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 ├── colorpicker │ └── bootstrap-colorpicker.min.js ├── cropper │ └── cropper.min.js ├── dataTables │ ├── dataTables.bootstrap.js │ └── jquery.dataTables.js ├── datapicker │ └── bootstrap-datepicker.js ├── diff_match_patch │ └── diff_match_patch.js ├── dropzone │ └── dropzone.js ├── duallistbox │ └── jquery.bootstrap-duallistbox.js ├── easypiechart │ └── jquery.easypiechart.js ├── echarts │ └── echarts-all.js ├── fancybox │ ├── blank.gif │ ├── fancybox_loading.gif │ ├── fancybox_loading@2x.gif │ ├── fancybox_overlay.png │ ├── fancybox_sprite.png │ ├── fancybox_sprite@2x.png │ ├── jquery.fancybox.css │ └── jquery.fancybox.js ├── flot │ ├── curvedLines.js │ ├── jquery.flot.js │ ├── jquery.flot.pie.js │ ├── jquery.flot.resize.js │ ├── jquery.flot.spline.js │ ├── jquery.flot.symbol.js │ └── jquery.flot.tooltip.min.js ├── footable │ └── footable.all.min.js ├── fullcalendar │ ├── fullcalendar.min.js │ └── moment.min.js ├── gritter │ ├── images │ │ ├── gritter-light.png │ │ ├── gritter.png │ │ └── ie-spacer.gif │ ├── jquery.gritter.css │ └── jquery.gritter.min.js ├── iCheck │ └── icheck.min.js ├── ionRangeSlider │ ├── ion.rangeSlider.min.js │ └── jasny │ │ └── jasny-bootstrap.min.js ├── jasny │ └── jasny-bootstrap.min.js ├── jeditable │ └── jquery.jeditable.js ├── jqgrid │ ├── i18n │ │ └── grid.locale-cn.js │ └── jquery.jqGrid.min.js ├── jquery-ui │ └── jquery-ui.min.js ├── jsKnob │ └── jquery.knob.js ├── jsTree │ ├── jstree.js │ └── jstree.min.js ├── jvectormap │ ├── jquery-jvectormap-1.2.2.min.js │ └── jquery-jvectormap-world-mill-en.js ├── layer │ ├── extend │ │ └── layer.ext.js │ ├── laydate │ │ ├── laydate.js │ │ ├── need │ │ │ └── laydate.css │ │ └── skins │ │ │ └── default │ │ │ ├── icon.png │ │ │ └── laydate.css │ ├── layer.min.js │ ├── layim │ │ ├── data │ │ │ ├── chatlog.json │ │ │ ├── friend.json │ │ │ ├── group.json │ │ │ └── groups.json │ │ ├── layim.css │ │ ├── layim.js │ │ └── loading.gif │ └── skin │ │ ├── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── icon_ext.png │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ ├── loading-2.gif │ │ ├── textbg.png │ │ ├── xubox_ico0.png │ │ ├── xubox_loading0.gif │ │ ├── xubox_loading1.gif │ │ ├── xubox_loading2.gif │ │ ├── xubox_loading3.gif │ │ └── xubox_title0.png │ │ ├── layer.css │ │ ├── layer.ext.css │ │ └── moon │ │ ├── default.png │ │ └── style.css ├── markdown │ ├── bootstrap-markdown.js │ ├── bootstrap-markdown.zh.js │ ├── markdown.js │ └── to-markdown.js ├── metisMenu │ └── jquery.metisMenu.js ├── morris │ ├── morris.js │ └── raphael-2.1.0.min.js ├── multiselect │ └── bootstrap-multiselect.js ├── nestable │ └── jquery.nestable.js ├── nouslider │ └── jquery.nouislider.min.js ├── pace │ └── pace.min.js ├── peity │ └── jquery.peity.min.js ├── plyr │ └── plyr.js ├── preetyTextDiff │ └── jquery.pretty-text-diff.min.js ├── prettyfile │ └── bootstrap-prettyfile.js ├── rickshaw │ ├── rickshaw.min.js │ └── vendor │ │ └── d3.v3.js ├── simditor │ ├── hotkeys.js │ ├── hotkeys.min.js │ ├── jquery.min.js │ ├── module.js │ ├── module.min.js │ ├── simditor.js │ ├── simditor.min.js │ ├── uploader.js │ └── uploader.min.js ├── slimscroll │ └── jquery.slimscroll.min.js ├── sparkline │ └── jquery.sparkline.min.js ├── staps │ └── jquery.steps.min.js ├── suggest │ ├── bootstrap-suggest.min.js │ └── data.json ├── summernote │ ├── summernote-zh-CN.js │ └── summernote.min.js ├── sweetalert │ └── sweetalert.min.js ├── switchery │ └── switchery.js ├── toastr │ └── toastr.min.js ├── treeview │ └── bootstrap-treeview.js ├── validate │ ├── additional-methods.min.js │ ├── jquery.validate.min.js │ └── messages_zh.min.js └── webuploader │ ├── README.md │ ├── Uploader.swf │ ├── webuploader.css │ ├── webuploader.custom.js │ ├── webuploader.custom.min.js │ ├── webuploader.fis.js │ ├── webuploader.flashonly.js │ ├── webuploader.flashonly.min.js │ ├── webuploader.html5only.js │ ├── webuploader.html5only.min.js │ ├── webuploader.js │ ├── webuploader.min.js │ ├── webuploader.noimage.js │ ├── webuploader.noimage.min.js │ ├── webuploader.nolog.js │ ├── webuploader.nolog.min.js │ ├── webuploader.withoutimage.js │ └── webuploader.withoutimage.min.js └── welcome.js /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | *.class 3 | 4 | # Mobile Tools for Java (J2ME) 5 | .mtj.tmp/ 6 | 7 | # Package Files # 8 | *.jar 9 | *.war 10 | *.ear 11 | 12 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 13 | hs_err_pid* 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # teemo 2 | Teemo是一个Java EE企业级通用开发框架,提供底层抽象和常用功能,包括基础CRUD、分页、角色权限、用户管理、资源管理、部门管理、数据库监控、自定义菜单等功能,完全开源,没有任何限制,在项目代码趋于稳定之后会切换成分布式项目,欢迎Star和Fork。 3 | 4 | 该项目适合于拥有1-3年开发经验的初级程序员作为学习、参考的项目或者直接拿来作为开发的基础框架。 5 | 6 | # 演示环境 7 | 8 | - Java 1.7.0_02 9 | - Tomcat 7.0.65 10 | - Mysql 5.7.16 11 | 12 | # 账号说明 13 | 14 | - 所有账号的密码都是:123456 15 | - alibaba是超级管理员 16 | 17 | ## 用到的技术 18 | 19 | 1. orm框架:Hibernate 5.0.2 20 | 2. ioc容器:Spring 4.2.2 21 | 3. web框架:Spring MVC 4.2.2 22 | 4. 安全框架:Shiro 1.2.1 23 | 5. 数据库源:Druid 1.0.26 24 | 6. 日志组件:slf4j、log4j 25 | 7. JSON组件:fastjson 26 | 8. 任务调度:quartz 27 | 9. 模板:jsp、freemarker 28 | 10. 缓存组件:ehcache 2.5.3 29 | 30 | ## 前端 31 | 32 | `前端所有组件均可自由选择和切换` 33 | 34 | 1. 主框架:bootstrap 35 | 2. 表格组件:bootstrap table 36 | 3. 校验组件:jquery validate 37 | 4. 弹层组件:layer 38 | 99. 其他:i-checks 39 | 40 | ## 数据库 41 | 42 | 1. MySQL 5.7.16 43 | 44 | ## 文档链接 45 | 46 | 代码文档: 47 | 48 | https://beiyoufx.github.io/teemo-api-doc 49 | 50 | http://beiyoufx.oschina.io/teemo-api-doc/ 51 | 52 | 使用说明和开发指南: 53 | 54 | https://github.com/beiyoufx/teemo/wiki 55 | 56 | http://git.oschina.net/beiyoufx/teemo/wikis/home 57 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/Constants.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016- https://github.com/beiyoufx 3 | * 4 | * Licensed under the GPL-3.0 5 | */ 6 | package com.teemo.core; 7 | 8 | /** 9 | * @author yongjie.teng 10 | * @date 16-10-28 下午3:24 11 | * @email yongjie.teng@foxmail.com 12 | * @package com.teemo.core 13 | */ 14 | public final class Constants { 15 | /** 16 | * 系统属性 17 | * DP_开头的属性全部从DynamicProperty表读取 18 | */ 19 | public static final String DP_SYSTEM_VERSION = "System.Version"; //用户获取当前系统的版本 20 | public static final String DP_STATIC_PATH = "Static.Path"; //系统的静态资源地址 21 | 22 | /** 23 | * 业务属性 24 | */ 25 | public static final String SESSION_USER = "SESSION_USER"; 26 | 27 | /** 28 | * 操作名称 29 | */ 30 | public static final String OP_NAME = "op"; 31 | 32 | /** 33 | * 消息key 34 | */ 35 | public static final String MESSAGE = "message"; 36 | 37 | /** 38 | * 错误key 39 | */ 40 | public static final String ERROR = "error"; 41 | 42 | /** 43 | * 上个页面地址 44 | */ 45 | public static final String BACK_URL = "BackURL"; 46 | public static final String IGNORE_BACK_URL = "ignoreBackURL"; 47 | 48 | /** 49 | * 当前请求的地址 带参数 50 | */ 51 | public static final String CURRENT_URL = "currentURL"; 52 | 53 | /** 54 | * 当前请求的地址 不带参数 55 | */ 56 | public static final String NO_QUERYSTRING_CURRENT_URL = "noQueryStringCurrentURL"; 57 | public static final String CONTEXT_PATH = "ctx"; 58 | 59 | /** 60 | * 当前登录的用户 61 | */ 62 | public static final String CURRENT_USER = "CurrentUser"; 63 | public static final String CURRENT_USERNAME = "username"; 64 | 65 | /** 66 | * 各种正则表达式 67 | */ 68 | public static final String USERNAME_PATTERN = "^[\\u4E00-\\u9FA5\\uf900-\\ufa2d_a-zA-Z][\\u4E00-\\u9FA5\\uf900-\\ufa2d\\w]{1,19}$"; 69 | public static final String MOBILE_PHONE_PATTERN = "^0{0,1}(13[0-9]|15[0-9]|14[0-9]|18[0-9])[0-9]{8}$"; 70 | public static final String EMAIL_PATTERN = "^\\w+([-.]\\w+)*@\\w+([-]\\w+)*\\.(\\w+([-]\\w+)*\\.)*[a-z]{2,3}$"; 71 | } 72 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/entity/BaseEntity.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016- https://github.com/beiyoufx 3 | * 4 | * Licensed under the GPL-3.0 5 | */ 6 | package com.teemo.core.entity; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * @author yongjie.teng 12 | * @version 1.0 13 | * @date 16-10-21 14 | * @email yongjie.teng@foxmail.com 15 | * @package com.teemo.core.entity 16 | * @project teemo 17 | */ 18 | public abstract class BaseEntity implements Serializable { 19 | } 20 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/entity/LogicDeletable.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016- https://github.com/beiyoufx 3 | * 4 | * Licensed under the GPL-3.0 5 | */ 6 | package com.teemo.core.entity; 7 | 8 | /** 9 | * 实现该接口表示实体想要逻辑删除 10 | * @author yongjie.teng 11 | * @version 1.0 12 | * @date 16-10-21 13 | * @email yongjie.teng@foxmail.com 14 | * @package com.teemo.core.entity 15 | * @project teemo 16 | */ 17 | public interface LogicDeletable { 18 | public Boolean getDeleted(); 19 | public void setDeleted(Boolean deleted); 20 | 21 | /** 22 | * 标记实体为已删除 23 | */ 24 | public void markDeleted(); 25 | } 26 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/exception/UserBlockedException.java: -------------------------------------------------------------------------------- 1 | package com.teemo.core.exception; 2 | 3 | /** 4 | * @author yongjie.teng 5 | * @date 16-11-21 下午7:31 6 | * @email yongjie.teng@foxmail.com 7 | * @package com.teemo.core.exception 8 | */ 9 | public class UserBlockedException extends UserException { 10 | public UserBlockedException() { 11 | super("user.blocked", null); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/exception/UserException.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016- https://github.com/beiyoufx 3 | * 4 | * Licensed under the GPL-3.0 5 | */ 6 | package com.teemo.core.exception; 7 | 8 | import core.util.SpringUtil; 9 | import core.util.StringUtil; 10 | 11 | /** 12 | * @author yongjie.teng 13 | * @date 16-11-7 下午5:28 14 | * @email yongjie.teng@foxmail.com 15 | * @package com.teemo.core.exception 16 | */ 17 | public class UserException extends Exception { 18 | private String code; 19 | private String defaultMessage; 20 | 21 | public UserException(String code, String defaultMessage) { 22 | this.code = code; 23 | this.defaultMessage = defaultMessage; 24 | } 25 | 26 | @Override 27 | public String getMessage() { 28 | String message = null; 29 | if (StringUtil.isNotEmpty(this.code)) { 30 | message = SpringUtil.getMessage(code); 31 | } 32 | if (message == null) { 33 | message = this.defaultMessage; 34 | } 35 | return message; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/exception/UserNotExistsException.java: -------------------------------------------------------------------------------- 1 | package com.teemo.core.exception; 2 | 3 | /** 4 | * @author yongjie.teng 5 | * @date 16-11-21 下午7:23 6 | * @email yongjie.teng@foxmail.com 7 | * @package com.teemo.core.exception 8 | */ 9 | public class UserNotExistsException extends UserException { 10 | public UserNotExistsException() { 11 | super("user.not.exists", null); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/exception/UserPasswordIncorrectnessException.java: -------------------------------------------------------------------------------- 1 | package com.teemo.core.exception; 2 | 3 | /** 4 | * @author yongjie.teng 5 | * @date 16-11-21 下午7:30 6 | * @email yongjie.teng@foxmail.com 7 | * @package com.teemo.core.exception 8 | */ 9 | public class UserPasswordIncorrectnessException extends UserException { 10 | public UserPasswordIncorrectnessException() { 11 | super("user.password.incorrectness", null); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/security/CurrentUserInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.teemo.core.security; 2 | 3 | import javax.annotation.Resource; 4 | import javax.servlet.http.HttpServletRequest; 5 | import javax.servlet.http.HttpServletResponse; 6 | 7 | import com.teemo.core.Constants; 8 | import com.teemo.entity.User; 9 | import com.teemo.service.UserService; 10 | import org.apache.shiro.SecurityUtils; 11 | import org.springframework.stereotype.Component; 12 | import org.springframework.web.servlet.ModelAndView; 13 | import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 14 | 15 | /** 16 | * A Spring MVC interceptor that adds the currentUser into the request as a request attribute before the JSP is rendered. This operation is assumed to be fast because the User should be cached in the Hibernate 17 | * second-level cache. 18 | */ 19 | @Component 20 | public class CurrentUserInterceptor extends HandlerInterceptorAdapter { 21 | 22 | @Resource 23 | private UserService userService; 24 | 25 | @Override 26 | public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { 27 | // Add the current user into the request 28 | final Long currentUserId = (Long) SecurityUtils.getSubject().getPrincipal(); 29 | User currentUser = userService.get(currentUserId); 30 | if (currentUser != null) { 31 | httpServletRequest.setAttribute(Constants.CURRENT_USER, currentUser); 32 | } 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/security/CustomCredentialsMatcher.java: -------------------------------------------------------------------------------- 1 | package com.teemo.core.security; 2 | 3 | import org.apache.shiro.authc.AuthenticationInfo; 4 | import org.apache.shiro.authc.AuthenticationToken; 5 | import org.apache.shiro.authc.credential.SimpleCredentialsMatcher; 6 | 7 | /** 8 | * @author yongjie.teng 9 | * @date 16-11-21 下午9:01 10 | * @email yongjie.teng@foxmail.com 11 | * @package com.teemo.core.security 12 | */ 13 | public class CustomCredentialsMatcher extends SimpleCredentialsMatcher { 14 | @Override 15 | public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) { 16 | /** 17 | * 由于在UserService中已经实现了密码校验功能,因此在这里放一个空实现 18 | * 或者你也可以有一个自己的实现 19 | */ 20 | return true; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/util/DPUtil.java: -------------------------------------------------------------------------------- 1 | package com.teemo.core.util; 2 | 3 | import com.teemo.entity.DynamicProperty; 4 | import com.teemo.service.DynamicPropertyService; 5 | import core.util.SpringUtil; 6 | 7 | /** 8 | * @author yongjie.teng 9 | * @date 16-11-8 下午5:38 10 | * @email yongjie.teng@foxmail.com 11 | * @package com.teemo.core.util 12 | */ 13 | public final class DPUtil { 14 | private static DynamicPropertyService dynamicPropertyService; 15 | 16 | public static String getDynamicProperty(String key) { 17 | if (dynamicPropertyService == null) { 18 | dynamicPropertyService = SpringUtil.getBean("dynamicPropertyService"); 19 | } 20 | DynamicProperty dynamicProperty = dynamicPropertyService.getByPropertyKey(key); 21 | if (dynamicProperty != null) { 22 | return dynamicProperty.getDynamicPropertyValue(); 23 | } 24 | return null; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/core/util/UserLogUtil.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016- https://github.com/beiyoufx 3 | * 4 | * Licensed under the GPL-3.0 5 | */ 6 | package com.teemo.core.util; 7 | 8 | import core.util.IpUtil; 9 | import org.slf4j.Logger; 10 | import org.slf4j.LoggerFactory; 11 | 12 | /** 13 | * @author yongjie.teng 14 | * @date 16-11-2 下午3:27 15 | * @email yongjie.teng@foxmail.com 16 | * @package com.teemo.core.util 17 | */ 18 | public class UserLogUtil { 19 | private static final Logger USER_LOGGER = LoggerFactory.getLogger("USER_LOG"); 20 | 21 | /** 22 | *
记录格式 [ip][用户名][操作][错误消息]
23 | * 注意操作如下: 24 | * loginError 登录失败 25 | * loginSuccess 登录成功 26 | * passwordError 密码错误 27 | * changePassword 修改密码 28 | * changeStatus 修改状态 29 | * 30 | * @param username 31 | * @param op 32 | * @param msg 33 | * @param args 34 | */ 35 | public static void log(String username, String op, String msg, Object... args) { 36 | StringBuilder s = new StringBuilder(); 37 | s.append(getBlock(IpUtil.getIp())); 38 | s.append(getBlock(username)); 39 | s.append(getBlock(op)); 40 | s.append(getBlock(msg)); 41 | 42 | USER_LOGGER.info(s.toString(), args); 43 | } 44 | 45 | public static String getBlock(Object msg) { 46 | if (msg == null) { 47 | msg = ""; 48 | } 49 | return "[" + msg.toString() + "]"; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /teemo/src/main/java/com/teemo/dao/DepartmentDao.java: -------------------------------------------------------------------------------- 1 | package com.teemo.dao; 2 | 3 | import com.teemo.entity.Department; 4 | import core.dao.BaseDao; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * @author yongjie.teng 9 | * @date 16-12-15 下午8:01 10 | * @email yongjie.teng@foxmail.com 11 | * @package com.teemo.dao 12 | */ 13 | @Repository 14 | public class DepartmentDao extends BaseDaoMIME types defined: text/css
, text/x-scss
(demo), text/x-less
(demo).
MIME types defined:
42 | application/x-cypher-query
43 |
Mode for HTML with embedded Django template markup.
61 | 62 |MIME types defined: text/x-django
Based on CodeMirror's clike mode. For more information see HPCC Systems web site.
50 |MIME types defined: text/x-ecl
.
Handles AT&T assembler syntax (more specifically this handles
60 | the GNU Assembler (gas) syntax.)
61 | It takes a single optional configuration parameter:
62 | architecture
, which can be one of "ARM"
,
63 | "ARMv6"
or "x86"
.
64 | Including the parameter adds syntax for the registers and special
65 | directives for the supplied architecture.
66 |
67 |
MIME types defined: text/x-gas
MIME types defined: text/x-feature
.
Mode for html embedded scripts like JSP and ASP.NET. Depends on HtmlMixed which in turn depends on
54 | JavaScript, CSS and XML.
Other dependancies include those of the scriping language chosen.
MIME types defined: application/x-aspx
(ASP.NET),
57 | application/x-ejs
(Embedded Javascript), application/x-jsp
(JavaServer Pages)
MIME types defined: message/http
.
MIME types defined: text/x-idl
.
This is a specialization of the JavaScript mode.
61 |MIME types defined: text/n-triples
.
MIME types defined: text/x-octave
.
MIME types defined: text/x-pascal
.
Created by Forbes Lindesay.
64 |MIME types defined: text/x-perl
.
49 | Simple mode that handles Pig Latin language. 50 |
51 | 52 |MIME type defined: text/x-pig
53 | (PIG code)
54 |