├── .gitattributes
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── build.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── screenshots
├── blog.png
├── editor.png
├── home.png
├── logo.png
├── posts.png
└── resume.png
└── src
└── main
├── java
├── META-INF
│ └── MANIFEST.MF
└── me
│ └── zbl
│ └── fullstack
│ ├── FullstackApplication.java
│ ├── annotation
│ └── package-info.java
│ ├── aspect
│ └── package-info.java
│ ├── config
│ ├── AspectConfig.java
│ ├── MyBatisMapperScannerConfig.java
│ ├── MybatisAutoConfiguration.java
│ ├── MybatisProperties.java
│ ├── ValidatorConfig.java
│ └── WebConfAdapter.java
│ ├── consts
│ ├── DataConsts.java
│ ├── SessionConstants.java
│ ├── StatusCode.java
│ ├── UrlConsts.java
│ └── ViewConsts.java
│ ├── controller
│ ├── AdminController.java
│ ├── AdminLoginController.java
│ ├── FrontController.java
│ ├── PostContoller.java
│ ├── ResumeController.java
│ ├── UserController.java
│ └── base
│ │ └── BaseController.java
│ ├── entity
│ ├── AdminUser.java
│ ├── Article.java
│ ├── Resume.java
│ ├── Tag.java
│ ├── TagArticle.java
│ ├── User.java
│ ├── dto
│ │ ├── form
│ │ │ ├── AdminUserPwdModifyForm.java
│ │ │ ├── ArticleSearchForm.java
│ │ │ ├── BlogAddForm.java
│ │ │ ├── BlogModifyForm.java
│ │ │ ├── ResumeModifyForm.java
│ │ │ ├── UserLoginForm.java
│ │ │ └── UserRegisterForm.java
│ │ ├── request
│ │ │ └── TableKeyModel.java
│ │ └── response
│ │ │ ├── GlobalResponse.java
│ │ │ ├── RedirectResponse.java
│ │ │ ├── SimpleResponse.java
│ │ │ └── factory
│ │ │ ├── GeneralJsonFactory.java
│ │ │ └── JsonFactory.java
│ └── vo
│ │ ├── ArticleDataGridView.java
│ │ ├── BlogModifyModel.java
│ │ ├── PostView.java
│ │ ├── ResumeModifyModel.java
│ │ └── TagView.java
│ ├── exception
│ └── GlobalExceptionHandler.java
│ ├── framework
│ ├── mapper
│ │ └── IMyMapper.java
│ └── service
│ │ ├── AbstractService.java
│ │ └── IService.java
│ ├── interceptor
│ └── UserAuthenticationInterceptor.java
│ ├── mapper
│ ├── AdminUserMapper.java
│ ├── ArticleMapper.java
│ ├── ResumeMapper.java
│ ├── TagArticleMapper.java
│ ├── TagMapper.java
│ ├── UserMapper.java
│ └── provider
│ │ └── ArticleSqlProvider.java
│ ├── service
│ ├── api
│ │ ├── IAdminBlogService.java
│ │ ├── IAdminUserService.java
│ │ ├── IPostsService.java
│ │ ├── IResumeService.java
│ │ ├── ITagService.java
│ │ └── IUserService.java
│ ├── base
│ │ └── BaseViewTransableService.java
│ └── impl
│ │ ├── AdminBlogServiceImpl.java
│ │ ├── AdminUserServiceImpl.java
│ │ ├── PostServiceImpl.java
│ │ ├── ResumeServiceImpl.java
│ │ ├── TagServiceImpl.java
│ │ └── UserServiceImpl.java
│ └── utils
│ └── AspectUtil.java
└── resources
├── application-dev.yml
├── application.yml
├── banner.txt
├── data.sql
├── ehcache.xml
├── favicon.ico
├── log4j2.xml
├── mapping
├── AdminUserMapper.xml
├── ArticleMapper.xml
├── TagArticleMapper.xml
├── TagMapper.xml
└── UserMapper.xml
├── mybatis-config.xml
├── mybatisGenerator
├── config.properties
└── generatorConfig.xml
├── schema.sql
├── static
├── css
│ ├── full-slider
│ │ └── full-slider.css
│ ├── public.css
│ └── sb-admin
│ │ ├── sb-admin.css
│ │ └── sb-admin.min.css
├── data
│ ├── flot-data.js
│ └── morris-data.js
├── dist
│ └── admin
│ │ ├── css
│ │ ├── sb-admin-2.css
│ │ └── sb-admin-2.min.css
│ │ └── js
│ │ ├── sb-admin-2.js
│ │ └── sb-admin-2.min.js
├── img
│ ├── 404.png
│ ├── logo.png
│ └── wechat_qr.png
├── js
│ ├── b_admin_user_manage.js
│ ├── b_admin_user_pwd_modify.js
│ ├── b_admin_userlogin.js
│ ├── b_blog_manage.js
│ ├── b_blog_modify.js
│ ├── b_blogadd.js
│ ├── b_resume_modify.js
│ ├── f_footer.js
│ ├── f_register.js
│ ├── f_userlogin.js
│ └── public.js
└── vendor
│ ├── admin
│ ├── bootstrap-social
│ │ ├── bootstrap-social.css
│ │ ├── bootstrap-social.less
│ │ └── bootstrap-social.scss
│ ├── bootstrap
│ │ ├── css
│ │ │ ├── bootstrap.css
│ │ │ └── bootstrap.min.css
│ │ ├── fonts
│ │ │ ├── glyphicons-halflings-regular.eot
│ │ │ ├── glyphicons-halflings-regular.svg
│ │ │ ├── glyphicons-halflings-regular.ttf
│ │ │ ├── glyphicons-halflings-regular.woff
│ │ │ └── glyphicons-halflings-regular.woff2
│ │ └── js
│ │ │ ├── bootstrap.js
│ │ │ └── bootstrap.min.js
│ ├── datatables-plugins
│ │ ├── dataTables.bootstrap.css
│ │ ├── dataTables.bootstrap.js
│ │ ├── dataTables.bootstrap.min.js
│ │ └── index.html
│ ├── datatables-responsive
│ │ ├── dataTables.responsive.css
│ │ ├── dataTables.responsive.js
│ │ └── dataTables.responsive.scss
│ ├── datatables
│ │ ├── css
│ │ │ ├── dataTables.bootstrap.css
│ │ │ ├── dataTables.bootstrap.min.css
│ │ │ ├── dataTables.bootstrap4.css
│ │ │ ├── dataTables.bootstrap4.min.css
│ │ │ ├── dataTables.foundation.css
│ │ │ ├── dataTables.foundation.min.css
│ │ │ ├── dataTables.jqueryui.css
│ │ │ ├── dataTables.jqueryui.min.css
│ │ │ ├── dataTables.material.css
│ │ │ ├── dataTables.material.min.css
│ │ │ ├── dataTables.semanticui.css
│ │ │ ├── dataTables.semanticui.min.css
│ │ │ ├── dataTables.uikit.css
│ │ │ ├── dataTables.uikit.min.css
│ │ │ ├── jquery.dataTables.css
│ │ │ ├── jquery.dataTables.min.css
│ │ │ └── jquery.dataTables_themeroller.css
│ │ ├── images
│ │ │ ├── Sorting icons.psd
│ │ │ ├── favicon.ico
│ │ │ ├── sort_asc.png
│ │ │ ├── sort_asc_disabled.png
│ │ │ ├── sort_both.png
│ │ │ ├── sort_desc.png
│ │ │ └── sort_desc_disabled.png
│ │ └── js
│ │ │ ├── dataTables.bootstrap.js
│ │ │ ├── dataTables.bootstrap.min.js
│ │ │ ├── dataTables.bootstrap4.js
│ │ │ ├── dataTables.bootstrap4.min.js
│ │ │ ├── dataTables.foundation.js
│ │ │ ├── dataTables.foundation.min.js
│ │ │ ├── dataTables.jqueryui.js
│ │ │ ├── dataTables.jqueryui.min.js
│ │ │ ├── dataTables.material.js
│ │ │ ├── dataTables.material.min.js
│ │ │ ├── dataTables.semanticui.js
│ │ │ ├── dataTables.semanticui.min.js
│ │ │ ├── dataTables.uikit.js
│ │ │ ├── dataTables.uikit.min.js
│ │ │ ├── jquery.dataTables.js
│ │ │ ├── jquery.dataTables.min.js
│ │ │ └── jquery.js
│ ├── flot-tooltip
│ │ ├── jquery.flot.tooltip.js
│ │ ├── jquery.flot.tooltip.min.js
│ │ └── jquery.flot.tooltip.source.js
│ ├── flot
│ │ ├── excanvas.js
│ │ ├── excanvas.min.js
│ │ ├── jquery.colorhelpers.js
│ │ ├── jquery.flot.canvas.js
│ │ ├── jquery.flot.categories.js
│ │ ├── jquery.flot.crosshair.js
│ │ ├── jquery.flot.errorbars.js
│ │ ├── jquery.flot.fillbetween.js
│ │ ├── jquery.flot.image.js
│ │ ├── jquery.flot.js
│ │ ├── jquery.flot.navigate.js
│ │ ├── jquery.flot.pie.js
│ │ ├── jquery.flot.resize.js
│ │ ├── jquery.flot.selection.js
│ │ ├── jquery.flot.stack.js
│ │ ├── jquery.flot.symbol.js
│ │ ├── jquery.flot.threshold.js
│ │ ├── jquery.flot.time.js
│ │ └── jquery.js
│ ├── font-awesome
│ │ ├── HELP-US-OUT.txt
│ │ ├── css
│ │ │ ├── font-awesome.css
│ │ │ ├── font-awesome.css.map
│ │ │ └── font-awesome.min.css
│ │ ├── fonts
│ │ │ ├── FontAwesome.otf
│ │ │ ├── fontawesome-webfont.eot
│ │ │ ├── fontawesome-webfont.svg
│ │ │ ├── fontawesome-webfont.ttf
│ │ │ ├── fontawesome-webfont.woff
│ │ │ └── fontawesome-webfont.woff2
│ │ ├── less
│ │ │ ├── animated.less
│ │ │ ├── bordered-pulled.less
│ │ │ ├── core.less
│ │ │ ├── extras.less
│ │ │ ├── fixed-width.less
│ │ │ ├── font-awesome.less
│ │ │ ├── icons.less
│ │ │ ├── larger.less
│ │ │ ├── list.less
│ │ │ ├── mixins.less
│ │ │ ├── path.less
│ │ │ ├── rotated-flipped.less
│ │ │ ├── screen-reader.less
│ │ │ ├── spinning.less
│ │ │ ├── stacked.less
│ │ │ └── variables.less
│ │ └── scss
│ │ │ ├── _animated.scss
│ │ │ ├── _bordered-pulled.scss
│ │ │ ├── _core.scss
│ │ │ ├── _extras.scss
│ │ │ ├── _fixed-width.scss
│ │ │ ├── _icons.scss
│ │ │ ├── _larger.scss
│ │ │ ├── _list.scss
│ │ │ ├── _mixins.scss
│ │ │ ├── _path.scss
│ │ │ ├── _rotated-flipped.scss
│ │ │ ├── _screen-reader.scss
│ │ │ ├── _spinning.scss
│ │ │ ├── _stacked.scss
│ │ │ ├── _variables.scss
│ │ │ └── font-awesome.scss
│ ├── jquery
│ │ ├── jquery.js
│ │ └── jquery.min.js
│ ├── metisMenu
│ │ ├── metisMenu.css
│ │ ├── metisMenu.js
│ │ ├── metisMenu.min.css
│ │ └── metisMenu.min.js
│ ├── morrisjs
│ │ ├── morris.css
│ │ ├── morris.js
│ │ └── morris.min.js
│ └── raphael
│ │ ├── raphael.js
│ │ └── raphael.min.js
│ ├── bootstrap
│ ├── css
│ │ ├── bootstrap-grid.css
│ │ ├── bootstrap-grid.min.css
│ │ ├── bootstrap-reboot.css
│ │ ├── bootstrap-reboot.min.css
│ │ ├── bootstrap.css
│ │ └── bootstrap.min.css
│ └── js
│ │ ├── bootstrap.bundle.js
│ │ ├── bootstrap.bundle.min.js
│ │ ├── bootstrap.js
│ │ └── bootstrap.min.js
│ ├── editor
│ ├── css
│ │ ├── editormd.css
│ │ ├── editormd.logo.css
│ │ ├── editormd.logo.min.css
│ │ ├── editormd.min.css
│ │ ├── editormd.preview.css
│ │ └── editormd.preview.min.css
│ ├── editormd.min.js
│ ├── fonts
│ │ ├── FontAwesome.otf
│ │ ├── editormd-logo.eot
│ │ ├── editormd-logo.svg
│ │ ├── editormd-logo.ttf
│ │ ├── editormd-logo.woff
│ │ ├── fontawesome-webfont.eot
│ │ ├── fontawesome-webfont.svg
│ │ ├── fontawesome-webfont.ttf
│ │ ├── fontawesome-webfont.woff
│ │ └── fontawesome-webfont.woff2
│ ├── images
│ │ ├── loading.gif
│ │ ├── loading@2x.gif
│ │ ├── loading@3x.gif
│ │ └── logos
│ │ │ ├── editormd-favicon-16x16.ico
│ │ │ ├── editormd-favicon-24x24.ico
│ │ │ ├── editormd-favicon-32x32.ico
│ │ │ ├── editormd-favicon-48x48.ico
│ │ │ ├── editormd-favicon-64x64.ico
│ │ │ ├── editormd-logo-114x114.png
│ │ │ ├── editormd-logo-120x120.png
│ │ │ ├── editormd-logo-144x144.png
│ │ │ ├── editormd-logo-16x16.png
│ │ │ ├── editormd-logo-180x180.png
│ │ │ ├── editormd-logo-240x240.png
│ │ │ ├── editormd-logo-24x24.png
│ │ │ ├── editormd-logo-320x320.png
│ │ │ ├── editormd-logo-32x32.png
│ │ │ ├── editormd-logo-48x48.png
│ │ │ ├── editormd-logo-57x57.png
│ │ │ ├── editormd-logo-64x64.png
│ │ │ ├── editormd-logo-72x72.png
│ │ │ ├── editormd-logo-96x96.png
│ │ │ └── vi.png
│ ├── lib
│ │ ├── codemirror
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── addon
│ │ │ │ ├── comment
│ │ │ │ │ ├── comment.js
│ │ │ │ │ └── continuecomment.js
│ │ │ │ ├── dialog
│ │ │ │ │ ├── dialog.css
│ │ │ │ │ └── dialog.js
│ │ │ │ ├── display
│ │ │ │ │ ├── fullscreen.css
│ │ │ │ │ ├── fullscreen.js
│ │ │ │ │ ├── panel.js
│ │ │ │ │ ├── placeholder.js
│ │ │ │ │ └── rulers.js
│ │ │ │ ├── edit
│ │ │ │ │ ├── closebrackets.js
│ │ │ │ │ ├── closetag.js
│ │ │ │ │ ├── continuelist.js
│ │ │ │ │ ├── matchbrackets.js
│ │ │ │ │ ├── matchtags.js
│ │ │ │ │ └── trailingspace.js
│ │ │ │ ├── fold
│ │ │ │ │ ├── brace-fold.js
│ │ │ │ │ ├── comment-fold.js
│ │ │ │ │ ├── foldcode.js
│ │ │ │ │ ├── foldgutter.css
│ │ │ │ │ ├── foldgutter.js
│ │ │ │ │ ├── indent-fold.js
│ │ │ │ │ ├── markdown-fold.js
│ │ │ │ │ └── xml-fold.js
│ │ │ │ ├── hint
│ │ │ │ │ ├── anyword-hint.js
│ │ │ │ │ ├── css-hint.js
│ │ │ │ │ ├── html-hint.js
│ │ │ │ │ ├── javascript-hint.js
│ │ │ │ │ ├── show-hint.css
│ │ │ │ │ ├── show-hint.js
│ │ │ │ │ ├── sql-hint.js
│ │ │ │ │ └── xml-hint.js
│ │ │ │ ├── lint
│ │ │ │ │ ├── coffeescript-lint.js
│ │ │ │ │ ├── css-lint.js
│ │ │ │ │ ├── javascript-lint.js
│ │ │ │ │ ├── json-lint.js
│ │ │ │ │ ├── lint.css
│ │ │ │ │ ├── lint.js
│ │ │ │ │ └── yaml-lint.js
│ │ │ │ ├── merge
│ │ │ │ │ ├── merge.css
│ │ │ │ │ └── merge.js
│ │ │ │ ├── mode
│ │ │ │ │ ├── loadmode.js
│ │ │ │ │ ├── multiplex.js
│ │ │ │ │ ├── multiplex_test.js
│ │ │ │ │ ├── overlay.js
│ │ │ │ │ └── simple.js
│ │ │ │ ├── runmode
│ │ │ │ │ ├── colorize.js
│ │ │ │ │ ├── runmode-standalone.js
│ │ │ │ │ ├── runmode.js
│ │ │ │ │ └── runmode.node.js
│ │ │ │ ├── scroll
│ │ │ │ │ ├── annotatescrollbar.js
│ │ │ │ │ ├── scrollpastend.js
│ │ │ │ │ ├── simplescrollbars.css
│ │ │ │ │ └── simplescrollbars.js
│ │ │ │ ├── search
│ │ │ │ │ ├── match-highlighter.js
│ │ │ │ │ ├── matchesonscrollbar.css
│ │ │ │ │ ├── matchesonscrollbar.js
│ │ │ │ │ ├── search.js
│ │ │ │ │ └── searchcursor.js
│ │ │ │ ├── selection
│ │ │ │ │ ├── active-line.js
│ │ │ │ │ ├── mark-selection.js
│ │ │ │ │ └── selection-pointer.js
│ │ │ │ ├── tern
│ │ │ │ │ ├── tern.css
│ │ │ │ │ ├── tern.js
│ │ │ │ │ └── worker.js
│ │ │ │ └── wrap
│ │ │ │ │ └── hardwrap.js
│ │ │ ├── addons.min.js
│ │ │ ├── bower.json
│ │ │ ├── codemirror.min.css
│ │ │ ├── codemirror.min.js
│ │ │ ├── lib
│ │ │ │ ├── codemirror.css
│ │ │ │ └── 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
│ │ │ │ ├── forth
│ │ │ │ │ ├── forth.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
│ │ │ │ ├── stylus
│ │ │ │ │ ├── index.html
│ │ │ │ │ └── stylus.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
│ │ │ ├── modes.min.js
│ │ │ ├── package.json
│ │ │ └── theme
│ │ │ │ ├── 3024-day.css
│ │ │ │ ├── 3024-night.css
│ │ │ │ ├── ambiance-mobile.css
│ │ │ │ ├── ambiance.css
│ │ │ │ ├── base16-dark.css
│ │ │ │ ├── base16-light.css
│ │ │ │ ├── blackboard.css
│ │ │ │ ├── cobalt.css
│ │ │ │ ├── colorforth.css
│ │ │ │ ├── eclipse.css
│ │ │ │ ├── elegant.css
│ │ │ │ ├── erlang-dark.css
│ │ │ │ ├── lesser-dark.css
│ │ │ │ ├── mbo.css
│ │ │ │ ├── mdn-like.css
│ │ │ │ ├── midnight.css
│ │ │ │ ├── monokai.css
│ │ │ │ ├── neat.css
│ │ │ │ ├── neo.css
│ │ │ │ ├── night.css
│ │ │ │ ├── paraiso-dark.css
│ │ │ │ ├── paraiso-light.css
│ │ │ │ ├── pastel-on-dark.css
│ │ │ │ ├── rubyblue.css
│ │ │ │ ├── solarized.css
│ │ │ │ ├── the-matrix.css
│ │ │ │ ├── tomorrow-night-bright.css
│ │ │ │ ├── tomorrow-night-eighties.css
│ │ │ │ ├── twilight.css
│ │ │ │ ├── vibrant-ink.css
│ │ │ │ ├── xq-dark.css
│ │ │ │ ├── xq-light.css
│ │ │ │ └── zenburn.css
│ │ ├── flowchart.min.js
│ │ ├── jquery.flowchart.min.js
│ │ ├── marked.min.js
│ │ ├── prettify.min.js
│ │ ├── raphael.min.js
│ │ ├── sequence-diagram.min.js
│ │ └── underscore.min.js
│ ├── plugins
│ │ ├── code-block-dialog
│ │ │ └── code-block-dialog.js
│ │ ├── emoji-dialog
│ │ │ ├── emoji-dialog.js
│ │ │ └── emoji.json
│ │ ├── goto-line-dialog
│ │ │ └── goto-line-dialog.js
│ │ ├── help-dialog
│ │ │ ├── help-dialog.js
│ │ │ └── help.md
│ │ ├── html-entities-dialog
│ │ │ ├── html-entities-dialog.js
│ │ │ └── html-entities.json
│ │ ├── image-dialog
│ │ │ └── image-dialog.js
│ │ ├── link-dialog
│ │ │ └── link-dialog.js
│ │ ├── plugin-template.js
│ │ ├── preformatted-text-dialog
│ │ │ └── preformatted-text-dialog.js
│ │ ├── reference-link-dialog
│ │ │ └── reference-link-dialog.js
│ │ ├── table-dialog
│ │ │ └── table-dialog.js
│ │ └── test-plugin
│ │ │ └── test-plugin.js
│ └── scss
│ │ ├── editormd.codemirror.scss
│ │ ├── editormd.dialog.scss
│ │ ├── editormd.form.scss
│ │ ├── editormd.grid.scss
│ │ ├── editormd.logo.scss
│ │ ├── editormd.menu.scss
│ │ ├── editormd.preview.scss
│ │ ├── editormd.preview.themes.scss
│ │ ├── editormd.scss
│ │ ├── editormd.tab.scss
│ │ ├── editormd.themes.scss
│ │ ├── font-awesome.scss
│ │ ├── github-markdown.scss
│ │ ├── lib
│ │ ├── prefixes.scss
│ │ └── variables.scss
│ │ └── prettify.scss
│ ├── jquery-easing
│ ├── jquery.easing.compatibility.js
│ ├── jquery.easing.js
│ └── jquery.easing.min.js
│ ├── jquery
│ ├── jquery.js
│ └── jquery.min.js
│ ├── landing-page
│ └── landing-page.min.css
│ └── layui
│ ├── css
│ ├── layui.css
│ ├── layui.mobile.css
│ └── modules
│ │ ├── code.css
│ │ ├── laydate
│ │ └── default
│ │ │ └── laydate.css
│ │ └── layer
│ │ └── default
│ │ ├── icon-ext.png
│ │ ├── icon.png
│ │ ├── layer.css
│ │ ├── loading-0.gif
│ │ ├── loading-1.gif
│ │ └── loading-2.gif
│ ├── font
│ ├── iconfont.eot
│ ├── iconfont.svg
│ ├── iconfont.ttf
│ └── iconfont.woff
│ ├── images
│ └── face
│ │ ├── 0.gif
│ │ ├── 1.gif
│ │ ├── 10.gif
│ │ ├── 11.gif
│ │ ├── 12.gif
│ │ ├── 13.gif
│ │ ├── 14.gif
│ │ ├── 15.gif
│ │ ├── 16.gif
│ │ ├── 17.gif
│ │ ├── 18.gif
│ │ ├── 19.gif
│ │ ├── 2.gif
│ │ ├── 20.gif
│ │ ├── 21.gif
│ │ ├── 22.gif
│ │ ├── 23.gif
│ │ ├── 24.gif
│ │ ├── 25.gif
│ │ ├── 26.gif
│ │ ├── 27.gif
│ │ ├── 28.gif
│ │ ├── 29.gif
│ │ ├── 3.gif
│ │ ├── 30.gif
│ │ ├── 31.gif
│ │ ├── 32.gif
│ │ ├── 33.gif
│ │ ├── 34.gif
│ │ ├── 35.gif
│ │ ├── 36.gif
│ │ ├── 37.gif
│ │ ├── 38.gif
│ │ ├── 39.gif
│ │ ├── 4.gif
│ │ ├── 40.gif
│ │ ├── 41.gif
│ │ ├── 42.gif
│ │ ├── 43.gif
│ │ ├── 44.gif
│ │ ├── 45.gif
│ │ ├── 46.gif
│ │ ├── 47.gif
│ │ ├── 48.gif
│ │ ├── 49.gif
│ │ ├── 5.gif
│ │ ├── 50.gif
│ │ ├── 51.gif
│ │ ├── 52.gif
│ │ ├── 53.gif
│ │ ├── 54.gif
│ │ ├── 55.gif
│ │ ├── 56.gif
│ │ ├── 57.gif
│ │ ├── 58.gif
│ │ ├── 59.gif
│ │ ├── 6.gif
│ │ ├── 60.gif
│ │ ├── 61.gif
│ │ ├── 62.gif
│ │ ├── 63.gif
│ │ ├── 64.gif
│ │ ├── 65.gif
│ │ ├── 66.gif
│ │ ├── 67.gif
│ │ ├── 68.gif
│ │ ├── 69.gif
│ │ ├── 7.gif
│ │ ├── 70.gif
│ │ ├── 71.gif
│ │ ├── 8.gif
│ │ └── 9.gif
│ ├── lay
│ └── modules
│ │ ├── carousel.js
│ │ ├── code.js
│ │ ├── element.js
│ │ ├── flow.js
│ │ ├── form.js
│ │ ├── jquery.js
│ │ ├── laydate.js
│ │ ├── layedit.js
│ │ ├── layer.js
│ │ ├── laypage.js
│ │ ├── laytpl.js
│ │ ├── mobile.js
│ │ ├── table.js
│ │ ├── tree.js
│ │ ├── upload.js
│ │ └── util.js
│ ├── layui.all.js
│ └── layui.js
└── templates
├── admin
├── admin_user_manage.ftl
├── admin_user_pwd_modify.ftl
├── blog_manage.ftl
├── blog_modify.ftl
├── blogadd.ftl
├── index.ftl
├── public
│ ├── nav.ftl
│ ├── public_css.ftl
│ └── public_js.ftl
├── resume_modify.ftl
└── userlogin.ftl
├── article.ftl
├── error.ftl
├── index.ftl
├── posts.ftl
├── public
├── footer.ftl
├── front_css.ftl
├── front_custom_css.ftl
├── front_js.ftl
└── nav.ftl
├── register.ftl
├── resume.ftl
└── userlogin.ftl
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.js linguist-language=Java
2 | *.css linguist-language=Java
3 | *.ftl linguist-language=Java
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ### PRODUCE ###
2 | Dockerfile
3 | *-prod.yml
4 |
5 | ### STS ###
6 | .apt_generated
7 | .classpath
8 | .factorypath
9 | .project
10 | .settings
11 | .springBeans
12 |
13 | ### IntelliJ IDEA ###
14 | .idea
15 | *.iws
16 | *.iml
17 | *.ipr
18 |
19 | ### NetBeans ###
20 | nbproject/private/
21 | build/
22 | nbbuild/
23 | nbdist/
24 | .nb-gradle/
25 | # Compiled class file
26 | *.class
27 |
28 | # Log file #
29 | *.log
30 |
31 | # BlueJ files
32 | *.ctxt
33 |
34 | # Mobile Tools for Java (J2ME)
35 | .mtj.tmp/
36 |
37 | # Package Files #
38 | *.jar
39 | *.war
40 | *.ear
41 | *.zip
42 | *.tar.gz
43 | *.rar
44 |
45 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
46 | hs_err_pid*
47 |
48 | ### GRADLE ###
49 | !gradle/wrapper/gradle-wrapper.jar
50 | .gradle
51 | /build/
52 | /gradlew
53 | /gradlew.bat
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: java
2 | jdk:
3 | - oraclejdk8
4 | notifications:
5 | email: true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Oct 18 21:32:58 CST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.5.1-all.zip
7 |
--------------------------------------------------------------------------------
/screenshots/blog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/screenshots/blog.png
--------------------------------------------------------------------------------
/screenshots/editor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/screenshots/editor.png
--------------------------------------------------------------------------------
/screenshots/home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/screenshots/home.png
--------------------------------------------------------------------------------
/screenshots/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/screenshots/logo.png
--------------------------------------------------------------------------------
/screenshots/posts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/screenshots/posts.png
--------------------------------------------------------------------------------
/screenshots/resume.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/screenshots/resume.png
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/annotation/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 自定义注解
3 | *
4 | * Created by James on 17-12-3.
5 | */
6 | package me.zbl.fullstack.annotation;
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/aspect/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 切面
3 | * Created by James on 17-12-2.
4 | */
5 | package me.zbl.fullstack.aspect;
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/config/AspectConfig.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.config;
2 |
3 | import org.springframework.context.annotation.Configuration;
4 | import org.springframework.context.annotation.EnableAspectJAutoProxy;
5 |
6 | /**
7 | * Spring AOP 的配置
8 | *
9 | * @author James
10 | */
11 | @Configuration
12 | @EnableAspectJAutoProxy(proxyTargetClass = true)
13 | public class AspectConfig {
14 |
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/config/MyBatisMapperScannerConfig.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.config;
2 |
3 | import java.util.Properties;
4 |
5 | import me.zbl.fullstack.framework.mapper.IMyMapper;
6 | import org.springframework.boot.autoconfigure.AutoConfigureAfter;
7 | import org.springframework.context.annotation.Bean;
8 | import org.springframework.context.annotation.Configuration;
9 |
10 | import tk.mybatis.spring.mapper.MapperScannerConfigurer;
11 |
12 | /**
13 | * MyBatis扫描接口,使用的tk.mybatis.spring.mapper.MapperScannerConfigurer
14 | * 如果你不使用通用Mapper,可以改为org.xxx...
15 | * 由于MapperScannerConfigurer执行的比较早,所以必须有下面的注解 @AutoConfigureAfter
16 | *
17 | * @author James
18 | */
19 | @Configuration
20 | @AutoConfigureAfter(MybatisAutoConfiguration.class)
21 | public class MyBatisMapperScannerConfig {
22 |
23 | @Bean
24 | public MapperScannerConfigurer mapperScannerConfigurer() {
25 | MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
26 | mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
27 | mapperScannerConfigurer.setBasePackage("me.zbl.fullstack.mapper");
28 | Properties properties = new Properties();
29 | // 这里要特别注意,不要把MyMapper放到 basePackage 中,也就是不能同其他Mapper一样被扫描到。
30 | properties.setProperty("mappers", IMyMapper.class.getName());
31 | properties.setProperty("notEmpty", "false");
32 | properties.setProperty("IDENTITY", "MYSQL");
33 | mapperScannerConfigurer.setProperties(properties);
34 | return mapperScannerConfigurer;
35 | }
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/config/ValidatorConfig.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.config;
2 |
3 | import org.hibernate.validator.HibernateValidator;
4 | import org.springframework.context.annotation.Bean;
5 | import org.springframework.context.annotation.Configuration;
6 | import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
7 |
8 | /**
9 | * 配置 Hibernate Validator
10 | *
11 | * @author James
12 | */
13 | @Configuration
14 | public class ValidatorConfig {
15 |
16 | @Bean(name = "validator")
17 | public LocalValidatorFactoryBean getValidator() {
18 | LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
19 | bean.setProviderClass(HibernateValidator.class);
20 | return bean;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/consts/DataConsts.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.consts;
2 |
3 | /**
4 | * 关于数据的常量类
5 | *
6 | * @author James
7 | */
8 | public class DataConsts {
9 |
10 | public static final int USERNAME_MAX_LENGTH = 20;
11 | public static final int PASSWORD_MAX_LENGTH = 15;
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/consts/SessionConstants.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.consts;
2 |
3 | /**
4 | * 关于 Sesion 的全局常量
5 | *
6 | * @author James
7 | */
8 | public class SessionConstants {
9 |
10 | public static final String SESSION_CURRENT_USER = "session_current_user";
11 | public static final String SESSION_ADMIN_CURRENT_USER = "session_current_admin_user";
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/consts/StatusCode.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.consts;
2 |
3 | /**
4 | * 响应状态常量类
5 | *
6 | * @author James
7 | */
8 | public class StatusCode {
9 |
10 | /**
11 | * 是否异常
12 | */
13 | public static final boolean WITH_ERROR = true;
14 | public static final boolean NO_ERROR = false;
15 | /**
16 | * 认证成功
17 | */
18 | public static final int AUTH_PASS = 101;
19 | /**
20 | * 认证失败
21 | */
22 | public static final int AUTH_FAIL = 102;
23 | /**
24 | * 接收成功
25 | */
26 | public static final int RESPONSE_OK = 201;
27 | /**
28 | * 重定向
29 | */
30 | public static final int REDIRECT = 302;
31 | /**
32 | * 查询失败
33 | */
34 | public static final int QUERY_ERROR = 501;
35 | /**
36 | * 服务器异常
37 | */
38 | public static final int SERVER_EXCEPTION = 502;
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/consts/UrlConsts.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.consts;
2 |
3 | /**
4 | * URL 常量
5 | *
6 | * @author James
7 | */
8 | public class UrlConsts {
9 |
10 | static final String IMG_LOCAL_PATH = "";
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/consts/ViewConsts.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.consts;
2 |
3 | /**
4 | * 视图中用到的模型名常量
5 | *
6 | * @author James
7 | */
8 | public class ViewConsts {
9 |
10 | public static final String VIEW_TITLE = "title";
11 | public static final String VIEW_MSG = "msg";
12 | public static final String VIEW_USERINFO = "userinfo";
13 | public static final String VIEW_POSTLIST = "postlist";
14 | public static final String VIEW_TAGLIST = "taglist";
15 | public static final String VIEW_ARTICLE = "article";
16 |
17 | public static final String VIEW_ARTICLE_MD = "article_md";
18 | }
19 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/controller/FrontController.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.controller;
2 |
3 | import me.zbl.fullstack.controller.base.BaseController;
4 | import me.zbl.fullstack.service.api.IAdminBlogService;
5 | import org.springframework.beans.factory.annotation.Autowired;
6 | import org.springframework.stereotype.Controller;
7 | import org.springframework.ui.Model;
8 | import org.springframework.web.bind.annotation.GetMapping;
9 | import org.springframework.web.bind.annotation.PostMapping;
10 |
11 | import javax.servlet.http.HttpServletRequest;
12 |
13 | /**
14 | * 前台页面控制器
15 | *
16 | * @author James
17 | */
18 | @Controller
19 | public class FrontController extends BaseController {
20 |
21 | @Autowired
22 | private IAdminBlogService mBlogService;
23 |
24 | /**
25 | * 错误页
26 | */
27 | @GetMapping("/error")
28 | public String pErrorPage(HttpServletRequest request, Model model) {
29 | return "error";
30 | }
31 |
32 | /**
33 | * 前台首页
34 | * GET
35 | */
36 | @GetMapping("/index")
37 | public String pFrontIndex(HttpServletRequest request, Model model) {
38 | return "index";
39 | }
40 |
41 | /**
42 | * 前台首页
43 | * POST
44 | */
45 | @PostMapping("/index")
46 | public String pFrontIndexPost(HttpServletRequest request, Model model) {
47 | return "index";
48 | }
49 |
50 | /**
51 | * 前台用户登录页
52 | */
53 | @GetMapping("/userlogin")
54 | public String pFrontUserLogin(HttpServletRequest request, Model model) {
55 | return "userlogin";
56 | }
57 |
58 | /**
59 | * 前台用户注册
60 | */
61 | @GetMapping("/userregister")
62 | public String pFrontUserRegister(HttpServletRequest request, Model model) {
63 | return "register";
64 | }
65 |
66 | }
67 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/Tag.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity;
2 |
3 | import java.util.Date;
4 | import javax.persistence.*;
5 |
6 | /**
7 | * 文章标签类
8 | *
9 | * @author James
10 | */
11 | public class Tag {
12 |
13 | @Id
14 | @GeneratedValue(strategy = GenerationType.IDENTITY)
15 | private Integer id;
16 |
17 | private String name;
18 |
19 | @Column(name = "gmt_create")
20 | private Date gmtCreate;
21 |
22 | @Column(name = "gmt_modified")
23 | private Date gmtModified;
24 |
25 | /**
26 | * @return id
27 | */
28 | public Integer getId() {
29 | return id;
30 | }
31 |
32 | /**
33 | * @param id
34 | */
35 | public void setId(Integer id) {
36 | this.id = id;
37 | }
38 |
39 | /**
40 | * @return name
41 | */
42 | public String getName() {
43 | return name;
44 | }
45 |
46 | /**
47 | * @param name
48 | */
49 | public void setName(String name) {
50 | this.name = name == null ? null : name.trim();
51 | }
52 |
53 | /**
54 | * @return gmt_create
55 | */
56 | public Date getGmtCreate() {
57 | return gmtCreate;
58 | }
59 |
60 | /**
61 | * @param gmtCreate
62 | */
63 | public void setGmtCreate(Date gmtCreate) {
64 | this.gmtCreate = gmtCreate;
65 | }
66 |
67 | /**
68 | * @return gmt_modified
69 | */
70 | public Date getGmtModified() {
71 | return gmtModified;
72 | }
73 |
74 | /**
75 | * @param gmtModified
76 | */
77 | public void setGmtModified(Date gmtModified) {
78 | this.gmtModified = gmtModified;
79 | }
80 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/form/AdminUserPwdModifyForm.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.form;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import me.zbl.fullstack.consts.DataConsts;
8 | import org.hibernate.validator.constraints.Length;
9 | import org.hibernate.validator.constraints.NotEmpty;
10 |
11 | /**
12 | * 后台用户密码修改
13 | *
14 | * @author James
15 | * @date 18-1-25
16 | */
17 | @Getter
18 | @Setter
19 | @NoArgsConstructor
20 | @AllArgsConstructor
21 | public class AdminUserPwdModifyForm {
22 |
23 | @NotEmpty
24 | @Length(max = DataConsts.PASSWORD_MAX_LENGTH)
25 | private String oriPwd;
26 | @NotEmpty
27 | @Length(max = DataConsts.PASSWORD_MAX_LENGTH)
28 | private String newPwd;
29 | @NotEmpty
30 | @Length(max = DataConsts.PASSWORD_MAX_LENGTH)
31 | private String confirmPwd;
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/form/ArticleSearchForm.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.form;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import org.hibernate.validator.constraints.NotEmpty;
8 |
9 | /**
10 | * 查找文章表单
11 | *
12 | * @author James
13 | */
14 | @Getter
15 | @Setter
16 | @NoArgsConstructor
17 | @AllArgsConstructor
18 | public class ArticleSearchForm {
19 |
20 | /**
21 | * 文章标题
22 | */
23 | @NotEmpty
24 | private String name;
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/form/BlogAddForm.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.form;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import org.hibernate.validator.constraints.NotEmpty;
8 |
9 | /**
10 | * 发布博客表单
11 | *
12 | * @author James
13 | */
14 | @Setter
15 | @Getter
16 | @NoArgsConstructor
17 | @AllArgsConstructor
18 | public class BlogAddForm {
19 |
20 | /**
21 | * 文章标题
22 | */
23 | @NotEmpty
24 | private String title;
25 |
26 | /**
27 | * markdown 内容
28 | */
29 | private String mdMaterial;
30 |
31 | /**
32 | * markdown 转 html 后的内容
33 | */
34 | private String htmlMaterial;
35 |
36 | /**
37 | * 文章内容描述
38 | */
39 | private String description;
40 |
41 | /**
42 | * 原始 tags
43 | */
44 | private String rawTags;
45 | }
46 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/form/BlogModifyForm.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.form;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import org.hibernate.validator.constraints.NotEmpty;
8 |
9 | /**
10 | * 修改博客表单
11 | *
12 | * @author James
13 | */
14 | @Setter
15 | @Getter
16 | @NoArgsConstructor
17 | @AllArgsConstructor
18 | public class BlogModifyForm {
19 |
20 | /**
21 | * 所修改博客的 id
22 | */
23 | @NotEmpty
24 | private Integer id;
25 |
26 | /**
27 | * 文章标题
28 | */
29 | @NotEmpty
30 | private String title;
31 | /**
32 | * markdown 内容
33 | */
34 | private String mdMaterial;
35 | /**
36 | * markdown 转 html 后的内容
37 | */
38 | private String htmlMaterial;
39 | /**
40 | * 文章内容描述
41 | */
42 | private String description;
43 |
44 | /**
45 | * 原始 tags
46 | */
47 | private String rawTags;
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/form/ResumeModifyForm.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.form;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import org.hibernate.validator.constraints.NotEmpty;
8 |
9 | /**
10 | * 修改简历表单
11 | *
12 | * @author James
13 | */
14 | @Setter
15 | @Getter
16 | @NoArgsConstructor
17 | @AllArgsConstructor
18 | public class ResumeModifyForm {
19 |
20 | /**
21 | * 所修改博客的 id
22 | */
23 | @NotEmpty
24 | private Integer id;
25 |
26 | /**
27 | * 文章标题
28 | */
29 | @NotEmpty
30 | private String title;
31 | /**
32 | * markdown 内容
33 | */
34 | private String mdMaterial;
35 | /**
36 | * markdown 转 html 后的内容
37 | */
38 | private String htmlMaterial;
39 | /**
40 | * 文章内容描述
41 | */
42 | private String description;
43 |
44 | /**
45 | * 原始 tags
46 | */
47 | private String rawTags;
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/form/UserLoginForm.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.form;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import org.hibernate.validator.constraints.NotEmpty;
8 |
9 | /**
10 | * 用户登录表单
11 | *
12 | * @author James
13 | */
14 | @Getter
15 | @Setter
16 | @NoArgsConstructor
17 | @AllArgsConstructor
18 | public class UserLoginForm {
19 |
20 | /**
21 | * 用户名
22 | */
23 | @NotEmpty(message = "用户名不能为空")
24 | private String username;
25 |
26 | /**
27 | * 密码
28 | */
29 | @NotEmpty(message = "密码不能为空")
30 | private String password;
31 |
32 | /**
33 | * 记住登录
34 | */
35 | private String rememberme;
36 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/form/UserRegisterForm.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.form;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import me.zbl.fullstack.consts.DataConsts;
8 | import org.hibernate.validator.constraints.Length;
9 | import org.hibernate.validator.constraints.NotEmpty;
10 |
11 | /**
12 | * 用户注册表单
13 | *
14 | * @author James
15 | */
16 | @Getter
17 | @Setter
18 | @NoArgsConstructor
19 | @AllArgsConstructor
20 | public class UserRegisterForm {
21 |
22 | /**
23 | * 用户名
24 | */
25 | @Length(max = DataConsts.USERNAME_MAX_LENGTH)
26 | @NotEmpty(message = "用户名不能为空")
27 | private String username;
28 |
29 | /**
30 | * 密码
31 | */
32 | @Length(max = DataConsts.PASSWORD_MAX_LENGTH)
33 | @NotEmpty(message = "密码不能为空")
34 | private String password;
35 |
36 | /**
37 | * 确认密码
38 | */
39 | @Length(max = DataConsts.PASSWORD_MAX_LENGTH)
40 | @NotEmpty(message = "请再次确认密码")
41 | private String confirmpassword;
42 | }
43 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/request/TableKeyModel.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.request;
2 |
3 | import lombok.Getter;
4 | import lombok.NoArgsConstructor;
5 | import lombok.Setter;
6 | import lombok.ToString;
7 |
8 | import java.util.List;
9 |
10 | /**
11 | * 批量操作对主键的封装
12 | *
13 | * @author James
14 | */
15 | @Getter
16 | @Setter
17 | @NoArgsConstructor
18 | @ToString
19 | public class TableKeyModel {
20 |
21 | private List ids;
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/response/GlobalResponse.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.response;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 |
6 | /**
7 | * 统一 Json 范围实体类
8 | *
9 | * @author James
10 | */
11 | @Getter
12 | @Setter
13 | public class GlobalResponse {
14 |
15 | protected int resultCode;
16 | protected boolean hasError;
17 |
18 | private GlobalResponse() {
19 |
20 | }
21 |
22 | public GlobalResponse(int resultCode, boolean hasError) {
23 | this.resultCode = resultCode;
24 | this.hasError = hasError;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/response/RedirectResponse.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.response;
2 |
3 | import lombok.Getter;
4 | import lombok.Setter;
5 |
6 | /**
7 | * 登录返回 Json
8 | *
9 | * @author James
10 | */
11 | @Setter
12 | @Getter
13 | public class RedirectResponse extends GlobalResponse {
14 |
15 | private String redirectURL;
16 |
17 | public RedirectResponse(int resultCode, boolean hasError, String redirectURL) {
18 | super(resultCode, hasError);
19 | setRedirectURL(redirectURL);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/response/SimpleResponse.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.response;
2 |
3 | /**
4 | * 简单 Json 响应类
5 | *
6 | * @author James
7 | */
8 | public class SimpleResponse extends GlobalResponse {
9 |
10 | public SimpleResponse(int resultCode, boolean hasError) {
11 | super(resultCode, hasError);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/response/factory/GeneralJsonFactory.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.response.factory;
2 |
3 | import me.zbl.fullstack.entity.dto.response.RedirectResponse;
4 | import me.zbl.fullstack.entity.dto.response.SimpleResponse;
5 | import org.springframework.stereotype.Component;
6 |
7 | import static me.zbl.fullstack.consts.StatusCode.*;
8 |
9 | /**
10 | * 通用 Json 工厂类
11 | *
12 | * @author James
13 | */
14 | @Component(value = "generalJsonFactory")
15 | public class GeneralJsonFactory implements JsonFactory {
16 |
17 | /**
18 | * 通用正常响应
19 | */
20 | @Override
21 | public SimpleResponse createSimpleResponse() {
22 | return new SimpleResponse(RESPONSE_OK, NO_ERROR);
23 | }
24 |
25 | @Override
26 | public SimpleResponse createtSimpleErrorResponse() {
27 | return new SimpleResponse(RESPONSE_OK, WITH_ERROR);
28 | }
29 |
30 | /**
31 | * 带参数的统一响应
32 | * param resultCode 状态码
33 | *
34 | * @param hasError 是否需异常
35 | */
36 | @Override
37 | public SimpleResponse createSimpleResponse(int resultCode, boolean hasError) {
38 | return new SimpleResponse(resultCode, hasError);
39 | }
40 |
41 | @Override
42 | public RedirectResponse createRedirectResponse(int resultCode, boolean hasError, String redirectURL) {
43 | return new RedirectResponse(resultCode, hasError, redirectURL);
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/dto/response/factory/JsonFactory.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.dto.response.factory;
2 |
3 | import me.zbl.fullstack.entity.dto.response.RedirectResponse;
4 | import me.zbl.fullstack.entity.dto.response.SimpleResponse;
5 |
6 |
7 | /**
8 | * Json 实体工厂类接口
9 | *
10 | * @author James
11 | */
12 | public interface JsonFactory {
13 |
14 | /**
15 | * 获取简单响应实体
16 | *
17 | * @return 响应实体
18 | */
19 | SimpleResponse createSimpleResponse();
20 |
21 | /**
22 | * 获取简单错误实体
23 | *
24 | * @return 响应实体
25 | */
26 | SimpleResponse createtSimpleErrorResponse();
27 |
28 | /**
29 | * 获取简单响应实体
30 | *
31 | * @param resultCode 结果状态码
32 | * @param hasError 是否含有错误
33 | *
34 | * @return 响应实体
35 | */
36 | SimpleResponse createSimpleResponse(int resultCode, boolean hasError);
37 |
38 | /**
39 | * 获取重定向响应实体
40 | *
41 | * @param resultCode 结果状态码
42 | * @param hasError 是否含有错误
43 | * @param redirectURL 重定向 url
44 | *
45 | * @return
46 | */
47 | RedirectResponse createRedirectResponse(int resultCode, boolean hasError, String redirectURL);
48 | }
49 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/vo/ArticleDataGridView.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.vo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import me.zbl.fullstack.entity.Article;
8 |
9 | import java.util.Date;
10 |
11 | /**
12 | * 博客批量管理列表视图
13 | *
14 | * @author James
15 | */
16 | @Getter
17 | @Setter
18 | @NoArgsConstructor
19 | @AllArgsConstructor
20 | public class ArticleDataGridView {
21 |
22 | private Integer id;
23 |
24 | private String title;
25 |
26 | private Date gmtCreate;
27 |
28 | private Date gmtModified;
29 |
30 | private String introduction;
31 |
32 | public ArticleDataGridView(Article article) {
33 | this.id = article.getId();
34 | this.title = article.getTitle();
35 | this.gmtModified = article.getGmtModified();
36 | this.gmtCreate = article.getGmtCreate();
37 | this.introduction = article.getIntroduction();
38 | }
39 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/vo/BlogModifyModel.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.vo;
2 |
3 | import lombok.Getter;
4 | import lombok.NoArgsConstructor;
5 | import lombok.Setter;
6 | import me.zbl.fullstack.entity.Article;
7 | import org.hibernate.validator.constraints.NotEmpty;
8 |
9 | /**
10 | * 修改博客表单
11 | *
12 | *
13 | * @author James
14 | * @date 17-12-4
15 | */
16 | @Setter
17 | @Getter
18 | @NoArgsConstructor
19 | public class BlogModifyModel {
20 |
21 | @NotEmpty
22 | private Integer id;
23 |
24 | @NotEmpty
25 | private String title;
26 |
27 | private String mdMaterial;
28 |
29 | private String description;
30 |
31 | public BlogModifyModel(Article article) {
32 | this.id = article.getId();
33 | this.title = article.getTitle();
34 | this.mdMaterial = article.getMdMaterial();
35 | this.description = article.getIntroduction();
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/vo/PostView.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.vo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.Setter;
6 | import me.zbl.fullstack.entity.Article;
7 | import org.apache.commons.lang3.time.DateFormatUtils;
8 |
9 | /**
10 | * 博客列表视图
11 | *
12 | * @author James
13 | */
14 | @Getter
15 | @Setter
16 | @AllArgsConstructor
17 | public class PostView {
18 |
19 | private Integer id;
20 | private String title;
21 | private String description;
22 | private String dateTime;
23 | private String htmlMaterial;
24 |
25 | /**
26 | * 拷贝构造方法
27 | *
28 | * @param article 文章
29 | */
30 | public PostView(Article article) {
31 | id = article.getId();
32 | title = article.getTitle();
33 | description = article.getIntroduction();
34 | dateTime = DateFormatUtils.format(article.getGmtCreate(), "yyyy-MM-dd HH:mm");
35 | htmlMaterial = article.getHtmlMaterial();
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/vo/ResumeModifyModel.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.vo;
2 |
3 | import lombok.Getter;
4 | import lombok.NoArgsConstructor;
5 | import lombok.Setter;
6 | import me.zbl.fullstack.entity.Article;
7 | import me.zbl.fullstack.entity.Resume;
8 | import org.hibernate.validator.constraints.NotEmpty;
9 |
10 | /**
11 | * 简历修改表单
12 | *
13 | *
14 | * @author James
15 | * @date 17-12-4
16 | */
17 | @Setter
18 | @Getter
19 | @NoArgsConstructor
20 | public class ResumeModifyModel {
21 |
22 | @NotEmpty
23 | private Integer id;
24 |
25 | @NotEmpty
26 | private String title;
27 |
28 | private String mdMaterial;
29 |
30 | private String description;
31 |
32 | public ResumeModifyModel(Resume article) {
33 | this.id = article.getId();
34 | this.title = article.getTitle();
35 | this.mdMaterial = article.getMdMaterial();
36 | this.description = article.getIntroduction();
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/entity/vo/TagView.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.entity.vo;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Getter;
5 | import lombok.NoArgsConstructor;
6 | import lombok.Setter;
7 | import me.zbl.fullstack.entity.Tag;
8 |
9 | /**
10 | * 文章标签视图
11 | *
12 | * @author James
13 | */
14 | @Getter
15 | @Setter
16 | @NoArgsConstructor
17 | @AllArgsConstructor
18 | public class TagView {
19 |
20 | private Integer tagId;
21 | private String tagName;
22 | private Integer articleCount;
23 |
24 | public TagView(Tag tag) {
25 | this.tagId = tag.getId();
26 | this.tagName = tag.getName();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/exception/GlobalExceptionHandler.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.exception;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 | import org.springframework.http.HttpStatus;
6 | import org.springframework.ui.Model;
7 | import org.springframework.web.bind.annotation.ControllerAdvice;
8 | import org.springframework.web.bind.annotation.ExceptionHandler;
9 | import org.springframework.web.bind.annotation.ResponseStatus;
10 |
11 | /**
12 | * 全局常量处理器
13 | *
14 | * @author James
15 | */
16 | @ControllerAdvice
17 | public class GlobalExceptionHandler {
18 |
19 | private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionHandler.class);
20 |
21 | @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
22 | @ExceptionHandler(Exception.class)
23 | public String handleException(Exception e, Model model) {
24 | model.addAttribute("msg", e.getLocalizedMessage());
25 | e.printStackTrace();
26 | return "redirect:error";
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/framework/mapper/IMyMapper.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.framework.mapper;
2 |
3 | import tk.mybatis.mapper.common.ConditionMapper;
4 | import tk.mybatis.mapper.common.ExampleMapper;
5 | import tk.mybatis.mapper.common.Mapper;
6 | import tk.mybatis.mapper.common.MySqlMapper;
7 | import tk.mybatis.mapper.common.ids.DeleteByIdsMapper;
8 | import tk.mybatis.mapper.common.ids.SelectByIdsMapper;
9 |
10 | /**
11 | * Mapper 基础接口
12 | * 其他 Mapper 接口需集成本接口
13 | *
14 | * @param 实体类型
15 | * @author James
16 | * 此接口不能被扫描到,否则出错
17 | */
18 | public interface IMyMapper extends
19 | Mapper,
20 | MySqlMapper,
21 | DeleteByIdsMapper,
22 | ConditionMapper,
23 | ExampleMapper,
24 | SelectByIdsMapper {
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/interceptor/UserAuthenticationInterceptor.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.interceptor;
2 |
3 | import me.zbl.fullstack.consts.SessionConstants;
4 | import me.zbl.fullstack.entity.AdminUser;
5 | import org.springframework.stereotype.Component;
6 | import org.springframework.web.servlet.HandlerInterceptor;
7 | import org.springframework.web.servlet.ModelAndView;
8 |
9 | import javax.servlet.http.HttpServletRequest;
10 | import javax.servlet.http.HttpServletResponse;
11 |
12 | /**
13 | * 用户权限验证的拦截器
14 | *
15 | * @author James
16 | */
17 | @Component
18 | public class UserAuthenticationInterceptor implements HandlerInterceptor {
19 |
20 | @Override
21 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
22 | Object obj = request.getSession().getAttribute(SessionConstants.SESSION_ADMIN_CURRENT_USER);
23 | if (null == obj || !(obj instanceof AdminUser)) {
24 | response.sendRedirect(request.getContextPath() + "/adminlogin");
25 | return false;
26 | }
27 | return true;
28 | }
29 |
30 |
31 | @Override
32 | public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
33 |
34 | }
35 |
36 | @Override
37 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
38 |
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/mapper/AdminUserMapper.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.mapper;
2 |
3 | import me.zbl.fullstack.entity.AdminUser;
4 | import me.zbl.fullstack.framework.mapper.IMyMapper;
5 |
6 | /**
7 | * @author James
8 | */
9 | public interface AdminUserMapper extends IMyMapper {
10 |
11 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/mapper/ArticleMapper.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.mapper;
2 |
3 | import me.zbl.fullstack.entity.Article;
4 | import me.zbl.fullstack.entity.dto.form.ArticleSearchForm;
5 | import me.zbl.fullstack.framework.mapper.IMyMapper;
6 | import me.zbl.fullstack.mapper.provider.ArticleSqlProvider;
7 | import org.apache.ibatis.annotations.Select;
8 | import org.apache.ibatis.annotations.SelectProvider;
9 |
10 | import java.util.List;
11 |
12 | /**
13 | * @author James
14 | */
15 | public interface ArticleMapper extends IMyMapper {
16 |
17 | String COLUMN_LIST = "article.id,title,introduction,article.gmt_create AS gmtCreate,article.gmt_modified AS gmtModified";
18 |
19 | @Select({
20 | "SELECT",
21 | COLUMN_LIST,
22 | "FROM",
23 | "article",
24 | "ORDER BY article.gmt_create DESC"
25 | })
26 | List getPostViewAllArticles();
27 |
28 | /**
29 | * 通过 tag id 查找文章
30 | *
31 | * @param id tag id
32 | *
33 | * @return 符合条件的文章
34 | */
35 | @Select({
36 | "SELECT",
37 | COLUMN_LIST,
38 | "FROM article",
39 | "INNER JOIN tag_article",
40 | "ON tag_article.article_id = article.id",
41 | "AND tag_article.tag_id=#{id}",
42 | "ORDER BY article.gmt_create DESC"
43 | })
44 | List getArticleListByTagId(Integer id);
45 |
46 | /**
47 | * 通过条件查找文章
48 | *
49 | * @param form 条件表单
50 | *
51 | * @return 符合条件的文章
52 | */
53 | @SelectProvider(type = ArticleSqlProvider.class, method = "getArticleByCondition")
54 | List getArticleListByCondition(ArticleSearchForm form);
55 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/mapper/ResumeMapper.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.mapper;
2 |
3 | import me.zbl.fullstack.entity.Resume;
4 | import me.zbl.fullstack.framework.mapper.IMyMapper;
5 |
6 | /**
7 | * 简历
8 | *
9 | * @author James
10 | */
11 | public interface ResumeMapper extends IMyMapper {
12 |
13 | String COLUMN_LIST = "resume.id,title,introduction,resume.gmt_create AS gmtCreate,resume.gmt_modified AS gmtModified";
14 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/mapper/TagArticleMapper.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.mapper;
2 |
3 | import me.zbl.fullstack.entity.TagArticle;
4 | import me.zbl.fullstack.framework.mapper.IMyMapper;
5 |
6 | /**
7 | * @author James
8 | */
9 | public interface TagArticleMapper extends IMyMapper {
10 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/mapper/TagMapper.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.mapper;
2 |
3 | import me.zbl.fullstack.entity.Article;
4 | import me.zbl.fullstack.entity.Tag;
5 | import me.zbl.fullstack.entity.vo.TagView;
6 | import me.zbl.fullstack.framework.mapper.IMyMapper;
7 | import org.apache.ibatis.annotations.Select;
8 |
9 | import java.util.List;
10 |
11 | /**
12 | * @author James
13 | */
14 | public interface TagMapper extends IMyMapper {
15 |
16 | String COLUMN_LIST = "article.id,article.title,article.introduction,article.gmt_create AS gmtCreate,article.gmt_modified AS gmtModified";
17 |
18 | /**
19 | * 根据 tag 的 id 获取文章
20 | *
21 | * @param id tag id
22 | *
23 | * @return 文章集合
24 | */
25 | @Select({
26 | "SELECT",
27 | COLUMN_LIST,
28 | "FROM article,tag,tag_article",
29 | "WHERE article.id = tag_article.article_id AND tag.id = tag_article.tag_id",
30 | "AND tag.id = #{id}"
31 | })
32 | List selectArticleByTagId(Integer id);
33 |
34 | /**
35 | * 获取所有 TagView
36 | * TagView 包括 tag 的名字/id 以及该 tag 对应的文章总数
37 | *
38 | * @return 文章集合
39 | */
40 | @Select({
41 | "SELECT tag.id AS tagId,",
42 | "tag.name AS tagName,",
43 | "COUNT(tag_article.article_id) AS articleCount",
44 | "FROM tag_article",
45 | "LEFT JOIN tag",
46 | "ON tag.id = tag_article.tag_id",
47 | "GROUP BY tag_article.tag_id"
48 | })
49 | List selectAllTagView();
50 |
51 | @Select({
52 | "SELECT id,",
53 | "`name` FROM tag WHERE `name` = #{tagName}"
54 | })
55 | Tag selectTagByName(String tagName);
56 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/mapper/UserMapper.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.mapper;
2 |
3 | import me.zbl.fullstack.entity.User;
4 | import me.zbl.fullstack.framework.mapper.IMyMapper;
5 |
6 | /**
7 | * @author James
8 | */
9 | public interface UserMapper extends IMyMapper {
10 | }
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/mapper/provider/ArticleSqlProvider.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.mapper.provider;
2 |
3 | import me.zbl.fullstack.entity.dto.form.ArticleSearchForm;
4 | import org.apache.ibatis.jdbc.SQL;
5 |
6 | /**
7 | * Article 动态 SQL 提供者
8 | *
9 | * @author James
10 | */
11 | public class ArticleSqlProvider {
12 |
13 | public String getArticleByCondition(ArticleSearchForm form) {
14 | return new SQL() {{
15 | SELECT("article.id,title,introduction,article.gmt_create AS gmtCreate,article.gmt_modified AS gmtModified");
16 | FROM("article");
17 | if (form.getName() != null) {
18 | WHERE("article.title LIKE CONCAT ('%','" + form.getName() + "','%')");
19 | }
20 | }}.toString();
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/service/api/IAdminBlogService.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.service.api;
2 |
3 | import me.zbl.fullstack.entity.Article;
4 | import me.zbl.fullstack.entity.vo.ArticleDataGridView;
5 | import me.zbl.fullstack.entity.dto.request.TableKeyModel;
6 | import me.zbl.fullstack.entity.dto.form.BlogAddForm;
7 | import me.zbl.fullstack.entity.dto.form.BlogModifyForm;
8 |
9 | import java.util.List;
10 |
11 | /**
12 | * 后台博客发布接口
13 | *
14 | * @author James
15 | */
16 | public interface IAdminBlogService {
17 |
18 | /**
19 | * 添加 文章
20 | *
21 | * @param form 表单
22 | */
23 | void blogAdd(BlogAddForm form);
24 |
25 | /**
26 | * 根据 id 获取文章
27 | *
28 | * @param id id
29 | *
30 | * @return 文章实体
31 | */
32 | Article blogSelectByPrimaryKey(Integer id);
33 |
34 | /**
35 | * 获取所有文章列表
36 | *
37 | * @return 文章列表视图实体集合
38 | */
39 | List getArticleList();
40 |
41 | /**
42 | * 根据 id 删除文章
43 | *
44 | * @param model 数据模型
45 | */
46 | void blogDelete(TableKeyModel model);
47 |
48 | /**
49 | * 修改已发布文章
50 | *
51 | * @param form 表单
52 | */
53 | void blogModify(BlogModifyForm form);
54 | }
55 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/service/api/IPostsService.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.service.api;
2 |
3 | import me.zbl.fullstack.entity.vo.PostView;
4 | import me.zbl.fullstack.entity.dto.form.ArticleSearchForm;
5 |
6 | import java.util.Date;
7 | import java.util.List;
8 |
9 | /**
10 | * 博客服务接口
11 | *
12 | * @author James
13 | */
14 | public interface IPostsService {
15 |
16 | /**
17 | * 获取所有博客
18 | *
19 | * @return 博客视图实体集合
20 | */
21 | List getPostList();
22 |
23 | /**
24 | * 根据日期条件获取博客
25 | *
26 | * @param start 起始时间
27 | * @param end 结束时间
28 | *
29 | * @return 博客视图集合
30 | */
31 | List getPostListByDate(Date start, Date end);
32 |
33 | /**
34 | * 根据 Tag ID 查找文章
35 | *
36 | * @param tagId tag ID
37 | *
38 | * @return 文章
39 | */
40 | List getPostListByTagId(Integer tagId);
41 |
42 | /**
43 | * 根据 具体条件筛选文章
44 | *
45 | * @param form 条件表单
46 | *
47 | * @return 文章
48 | */
49 | List getPostListByArticleCondition(ArticleSearchForm form);
50 | }
51 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/service/api/IResumeService.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2018 JamesZBL
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | *
16 | */
17 | package me.zbl.fullstack.service.api;
18 |
19 | import me.zbl.fullstack.entity.Resume;
20 | import me.zbl.fullstack.entity.dto.form.ResumeModifyForm;
21 |
22 | /**
23 | * 简历业务接口
24 | *
25 | * @author JamesZBL
26 | * @date 2018-03-28
27 | */
28 | public interface IResumeService {
29 |
30 | /**
31 | * 查询简历
32 | */
33 | Resume getResume();
34 |
35 | /**
36 | * 更新简历
37 | *
38 | * @param form 表单
39 | */
40 | void updateResume(ResumeModifyForm form, Resume resume);
41 | }
42 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/service/api/ITagService.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.service.api;
2 |
3 | import me.zbl.fullstack.entity.vo.TagView;
4 |
5 | import java.util.List;
6 |
7 | /**
8 | * 文章标签相关业务接口
9 | *
10 | * @author James
11 | */
12 | public interface ITagService {
13 |
14 | /**
15 | * 获取所有 Tag 视图
16 | *
17 | * @return Tag 视图
18 | */
19 | List getAllTagView();
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/service/api/IUserService.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.service.api;
2 |
3 |
4 | import me.zbl.fullstack.entity.User;
5 | import me.zbl.fullstack.entity.dto.form.UserLoginForm;
6 | import me.zbl.fullstack.entity.dto.form.UserRegisterForm;
7 |
8 | import javax.servlet.http.HttpServletRequest;
9 |
10 | /**
11 | * 用户信息操作接口
12 | *
13 | * @author James
14 | */
15 | public interface IUserService {
16 |
17 | /**
18 | * 进行登录验证
19 | *
20 | * @param loginForm 登录表单
21 | *
22 | * @return 如果验证通过返回 User 实体
23 | */
24 | User loginAuthentication(UserLoginForm loginForm);
25 |
26 | /**
27 | * 进行用户注册中的用户名重复校验
28 | *
29 | * @param registerForm 注册表单
30 | *
31 | * @return 该用户民是否存在
32 | */
33 | boolean registerUsernameCheckExist(UserRegisterForm registerForm);
34 |
35 | /**
36 | * 保存用户
37 | *
38 | * @param user 用户
39 | */
40 | void insertUser(User user);
41 |
42 | /**
43 | * 将用户信息加入会话
44 | *
45 | * @param request 用户请求
46 | * @param user 当前用户的信息
47 | */
48 | void joinSession(HttpServletRequest request, User user);
49 |
50 | /**
51 | * 从会话中销毁用户信息
52 | *
53 | * @param request 用户请求
54 | */
55 | void destroySession(HttpServletRequest request);
56 | }
57 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/service/base/BaseViewTransableService.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.service.base;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * 通用包含视图转换功能的业务抽象类
7 | *
8 | * @param 数据查询结果实体类
9 | * @param 视图类
10 | *
11 | * @author James
12 | */
13 | public abstract class BaseViewTransableService {
14 |
15 | /**
16 | * 将数据实体类对象转换为视图类对象
17 | *
18 | * @param entityList 数据实体类对象集合
19 | *
20 | * @return 视图模型类对象集合
21 | */
22 | protected abstract List transEntityToView(List entityList);
23 | }
24 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/service/impl/ResumeServiceImpl.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright 2018 JamesZBL
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | *
16 | */
17 | package me.zbl.fullstack.service.impl;
18 |
19 | import me.zbl.fullstack.entity.Resume;
20 | import me.zbl.fullstack.entity.dto.form.ResumeModifyForm;
21 | import me.zbl.fullstack.mapper.ResumeMapper;
22 | import me.zbl.fullstack.service.api.IResumeService;
23 | import org.springframework.beans.factory.annotation.Autowired;
24 | import org.springframework.stereotype.Service;
25 |
26 | /**
27 | * @author JamesZBL
28 | * @date 2018-03-28
29 | */
30 | @Service
31 | public class ResumeServiceImpl implements IResumeService {
32 |
33 | @Autowired
34 | private ResumeMapper mResumeMapper;
35 |
36 |
37 | @Override
38 | public Resume getResume() {
39 | return mResumeMapper.selectAll().get(0);
40 | }
41 |
42 | @Override
43 | public void updateResume(ResumeModifyForm form, Resume resume) {
44 | resume.setId(1);
45 | resume.setHtmlMaterial(form.getHtmlMaterial());
46 | resume.setMdMaterial(form.getMdMaterial());
47 | mResumeMapper.updateByPrimaryKeySelective(resume);
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/service/impl/TagServiceImpl.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.service.impl;
2 |
3 | import me.zbl.fullstack.entity.Tag;
4 | import me.zbl.fullstack.entity.vo.TagView;
5 | import me.zbl.fullstack.mapper.TagMapper;
6 | import me.zbl.fullstack.service.api.ITagService;
7 | import me.zbl.fullstack.service.base.BaseViewTransableService;
8 | import org.springframework.beans.factory.annotation.Autowired;
9 | import org.springframework.stereotype.Service;
10 |
11 | import java.util.ArrayList;
12 | import java.util.List;
13 |
14 | /**
15 | * 文章标签相关业务实现类
16 | *
17 | * @author James
18 | */
19 | @Service
20 | public class TagServiceImpl extends BaseViewTransableService implements ITagService {
21 |
22 | @Autowired
23 | TagMapper mTagMapper;
24 |
25 | @Override
26 | protected List transEntityToView(List entityList) {
27 | List tagViews = new ArrayList<>();
28 | for (Tag tag : entityList) {
29 | TagView tagView = new TagView(tag);
30 | tagViews.add(tagView);
31 | }
32 | return tagViews;
33 | }
34 |
35 | @Override
36 | public List getAllTagView() {
37 | return mTagMapper.selectAllTagView();
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/me/zbl/fullstack/utils/AspectUtil.java:
--------------------------------------------------------------------------------
1 | package me.zbl.fullstack.utils;
2 |
3 | import org.aspectj.lang.ProceedingJoinPoint;
4 | import org.aspectj.lang.Signature;
5 | import org.aspectj.lang.reflect.MethodSignature;
6 |
7 | import java.lang.annotation.Annotation;
8 | import java.lang.reflect.Method;
9 |
10 | /**
11 | * 切面操作工具
12 | *
13 | * @author James
14 | */
15 | public class AspectUtil {
16 |
17 | /**
18 | * 获取连接点的制定类型的注解
19 | *
20 | * @param joinPoint 连接点
21 | * @param clazz 注解类
22 | *
23 | * @return 注解
24 | */
25 | public static Annotation getAnnotation(ProceedingJoinPoint joinPoint, Class clazz) {
26 | try {
27 | // 拦截的对象
28 | Object object = joinPoint.getTarget();
29 | Signature signature = joinPoint.getSignature();
30 | // 拦截方法名
31 | String methodName = signature.getName();
32 | Class[] parameterTypes = ((MethodSignature) signature).getMethod().getParameterTypes();
33 |
34 | try {
35 | // 反射目标方法
36 | Method method = object.getClass().getDeclaredMethod(methodName, parameterTypes);
37 | // 获取注解
38 | return method.getDeclaredAnnotation(clazz);
39 | } catch (NoSuchMethodException e) {
40 | e.printStackTrace();
41 | }
42 | } catch (Throwable throwable) {
43 | throwable.printStackTrace();
44 | }
45 | return null;
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | profiles:
3 | active: dev
4 | # active: prod
--------------------------------------------------------------------------------
/src/main/resources/banner.txt:
--------------------------------------------------------------------------------
1 | ______________________________________________________________
2 | _____ __
3 | / ' / / / ) /
4 | ---/__-------------/---/--------\------_/_----__----__---/-__-
5 | / / / / / === \ / / ) / ' /(
6 | _/________(___(__/___/_______(____/___(_ __(___(_(___ _/___\__
7 |
8 |
--------------------------------------------------------------------------------
/src/main/resources/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/favicon.ico
--------------------------------------------------------------------------------
/src/main/resources/mapping/AdminUserMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/src/main/resources/mapping/ArticleMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/main/resources/mapping/TagArticleMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/main/resources/mapping/TagMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/main/resources/mapping/UserMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/src/main/resources/mybatis-config.xml:
--------------------------------------------------------------------------------
1 |
2 |
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 |
--------------------------------------------------------------------------------
/src/main/resources/mybatisGenerator/config.properties:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/mybatisGenerator/config.properties
--------------------------------------------------------------------------------
/src/main/resources/static/css/full-slider/full-slider.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * Start Bootstrap - Full Slider (https://startbootstrap.com/template-overviews/full-slider)
3 | * Copyright 2013-2017 Start Bootstrap
4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-full-slider/blob/master/LICENSE)
5 | */
6 |
7 | .carousel-item {
8 | height: 100vh;
9 | min-height: 300px;
10 | background: no-repeat center center scroll;
11 | -webkit-background-size: cover;
12 | -moz-background-size: cover;
13 | -o-background-size: cover;
14 | background-size: cover;
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/resources/static/css/public.css:
--------------------------------------------------------------------------------
1 | /*******************************************************/
2 | /*******************************************************/
3 |
4 | /****************** 全局自定义样式 ********************/
5 |
6 | /**** 自定义样式统一以 cus_ 开头,避免和框架中的类名混淆 ****/
7 | /*******************************************************/
8 | /*******************************************************/
9 |
10 | /* 内容 用于有常驻顶部 nav.ftl 的页面*/
11 | .cus_content {
12 | margin-top: 56px;
13 | }
14 |
15 | .cus_fixed_bottom {
16 | position: fixed;
17 | bottom: 0;
18 | }
19 |
20 | footer.footer {
21 | padding-top: 4rem;
22 | padding-bottom: 4rem;
23 | }
24 |
25 | textarea {
26 | resize: vertical;
27 | }
28 |
29 | .img_shadow{
30 | box-shadow: 0px 0px 7px #333333;
31 | }
32 |
33 | .txt_shadow{
34 | text-shadow:0px 0px 7px #2f2f2f;
35 | }
--------------------------------------------------------------------------------
/src/main/resources/static/dist/admin/js/sb-admin-2.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2)
3 | * Copyright 2013-2016 Start Bootstrap
4 | * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE)
5 | */
6 | $(function(){$("#side-menu").metisMenu()}),$(function(){$(window).bind("load resize",function(){var i=50,n=this.window.innerWidth>0?this.window.innerWidth:this.screen.width;n<768?($("div.navbar-collapse").addClass("collapse"),i=100):$("div.navbar-collapse").removeClass("collapse");var e=(this.window.innerHeight>0?this.window.innerHeight:this.screen.height)-1;e-=i,e<1&&(e=1),e>i&&$("#page-wrapper").css("min-height",e+"px")});for(var i=window.location,n=$("ul.nav a").filter(function(){return this.href==i}).addClass("active").parent();;){if(!n.is("li"))break;n=n.parent().addClass("in").parent()}});
--------------------------------------------------------------------------------
/src/main/resources/static/img/404.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/img/404.png
--------------------------------------------------------------------------------
/src/main/resources/static/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/img/logo.png
--------------------------------------------------------------------------------
/src/main/resources/static/img/wechat_qr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/img/wechat_qr.png
--------------------------------------------------------------------------------
/src/main/resources/static/js/b_admin_user_pwd_modify.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 | $("#id_btn_submit").bind("click", function () {
3 | $.ajax({
4 | type: "POST",
5 | dataType: "json",
6 | url: "/admin/admin_user_pwd_modify.f",
7 | data: $('#id_form').serialize(),
8 | success: function (result) {
9 | if (!(result.hasError)) {
10 | msg("修改成功");
11 | // 返回博客批量管理页
12 | c_location("/admin/blogmanage");
13 | } else {
14 | msg("修改失败");
15 | }
16 | },
17 | error: function () {
18 | msg("失败");
19 | }
20 | });
21 | });
22 | });
--------------------------------------------------------------------------------
/src/main/resources/static/js/b_admin_userlogin.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 | $("#id_user_login_submit").bind("click", function () {
3 | var loginForm = document.forms[0];
4 | loginForm.action = "/adminlogin/login.f";
5 | loginForm.method = "post";
6 | loginForm.submit();
7 | });
8 | });
--------------------------------------------------------------------------------
/src/main/resources/static/js/b_blog_modify.js:
--------------------------------------------------------------------------------
1 | /* 博客修改 */
2 | // Markdown 编辑器
3 | var testEditor;
4 |
5 | $(function () {
6 | testEditor = editormd("test-editormd", {
7 | width: "100%",
8 | height: 640,
9 | syncScrolling: "single",
10 | path: "/vendor/editor/lib/",
11 | saveHTMLToTextarea: true
12 | });
13 |
14 | $("#id_btn_blog_submit").bind("click", function () {
15 | /* markdown 格式文本 */
16 | $("#id_input_md").val(testEditor.getMarkdown());
17 | /* html 格式内容 */
18 | $("#id_input_html").val($(".markdown-body").prop('outerHTML'));
19 | /* 展示文章描述填写的模态框 */
20 | showDetailModal();
21 | });
22 |
23 | $('#id_btn_release_in_modal').bind('click', function () {
24 | saveDetailText();
25 | submitBlogAddForm();
26 | });
27 | });
28 |
29 | /**
30 | * 展示文章详情填写的模态框
31 | */
32 | function showDetailModal() {
33 | $('#id_modal_article_detail').modal({
34 | // backdrop: false
35 | });
36 | }
37 |
38 | /**
39 | * 将模态框中填写的内容保存到表单中
40 | */
41 | function saveDetailText() {
42 | // 内容描述
43 | $('#id_input_article_description').val($('#id_input_article_description_in_modal').val());
44 | // Tags
45 | $('#id_input_article_tags').val($('#id_input_article_tags_in_modal').val());
46 | }
47 |
48 | /**
49 | * 提交文章表单
50 | */
51 | function submitBlogAddForm() {
52 | // 提交表单
53 | var form = document.forms[0];
54 | form.action = "/admin/blog_modify.f";
55 | form.method = "post";
56 | form.submit();
57 | }
--------------------------------------------------------------------------------
/src/main/resources/static/js/b_blogadd.js:
--------------------------------------------------------------------------------
1 | /* 博客发布 */
2 | // Markdown 编辑器
3 | var testEditor;
4 |
5 | $(function () {
6 | testEditor = editormd("test-editormd", {
7 | width: "100%",
8 | height: 640,
9 | syncScrolling: "single",
10 | path: "../vendor/editor/lib/",
11 | saveHTMLToTextarea: true
12 | });
13 |
14 | /*
15 | // or
16 | testEditor = editormd({
17 | id : "test-editormd",
18 | width : "90%",
19 | height : 640,
20 | path : "../lib/"
21 | });
22 | */
23 |
24 | $("#id_btn_blog_submit").bind("click", function () {
25 | /* markdown 格式文本 */
26 | $("#id_input_md").val(testEditor.getMarkdown());
27 | /* html 格式内容 */
28 | $("#id_input_html").val($(".markdown-body").prop('outerHTML'));
29 | /* 展示文章描述填写的模态框 */
30 | showDetailModal();
31 | });
32 |
33 | $('#id_btn_release_in_modal').bind('click', function () {
34 | saveDetailText();
35 | submitBlogAddForm();
36 | });
37 | });
38 |
39 | /**
40 | * 展示文章详情填写的模态框
41 | */
42 | function showDetailModal() {
43 | $('#id_modal_article_detail').modal({
44 | // backdrop: false
45 | });
46 | }
47 |
48 | /**
49 | * 将模态框中填写的内容保存到表单中
50 | */
51 | function saveDetailText() {
52 | // 内容描述
53 | $('#id_input_article_description').val($('#id_input_article_description_in_modal').val());
54 | // Tags
55 | $('#id_input_article_tags').val($('#id_input_article_tags_in_modal').val());
56 | }
57 |
58 | /**
59 | * 提交文章表单
60 | */
61 | function submitBlogAddForm() {
62 | // 提交表单
63 | var form = document.forms[0];
64 | form.action = "/admin/blogadd.f";
65 | form.method = "post";
66 | form.submit();
67 | }
--------------------------------------------------------------------------------
/src/main/resources/static/js/f_footer.js:
--------------------------------------------------------------------------------
1 | $('#id_a_wechat').hover(function () {
2 | $('#id_img_wechat_qrcode').fadeIn("fast");
3 | },function () {
4 | $('#id_img_wechat_qrcode').fadeOut("fast");
5 |
6 | });
--------------------------------------------------------------------------------
/src/main/resources/static/js/f_register.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | $("#id_user_register_submit").bind("click", function () {
4 | var registerForm = document.forms[0];
5 | registerForm.action = "userregister.f";
6 | registerForm.method = "post";
7 | registerForm.submit();
8 | });
9 | });
--------------------------------------------------------------------------------
/src/main/resources/static/js/f_userlogin.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 | $("#id_user_login_submit").bind("click", function () {
3 | var loginForm = document.forms[0];
4 | loginForm.action = "userlogin.f";
5 | loginForm.method = "post";
6 | loginForm.submit();
7 | });
8 | });
--------------------------------------------------------------------------------
/src/main/resources/static/js/public.js:
--------------------------------------------------------------------------------
1 | ;!function () {
2 | var layer = layui.layer,
3 | form = layui.form;
4 | }();
5 |
6 | /**
7 | * 向指定 url 发送 get 请求
8 | * @param href
9 | */
10 | function c_location(href) {
11 | window.location = href;
12 | }
13 |
14 |
15 | /**
16 | * Layer 确认框
17 | * 点击 “确认” 后执行回调函数,点击 “取消” 不做任何操作
18 | *
19 | * @param msg 确认消息
20 | * @param callback 回调函数
21 | */
22 | function c_confirm(msg, callback) {
23 | layer.confirm(msg, {icon: 3, title: '提示'}, function (index) {
24 | callback();
25 | layer.close(index);
26 | });
27 | }
28 |
29 | /**
30 | * 弹出提示消息遮罩层
31 | *
32 | * @param msg 消息内容
33 | */
34 | function msg(msg) {
35 | layer.msg(msg);
36 | }
37 |
38 | /**
39 | * 时间戳转日期字符串
40 | */
41 | function formatDateTime(val, row, index) {
42 | var date = new Date(val);
43 | var y = date.getFullYear();
44 | var m = date.getMonth() + 1;
45 | m = m < 10 ? ('0' + m) : m;
46 | var d = date.getDate();
47 | d = d < 10 ? ('0' + d) : d;
48 | var h = date.getHours();
49 | h = h < 10 ? ('0' + h) : h;
50 | var minute = date.getMinutes();
51 | var second = date.getSeconds();
52 | minute = minute < 10 ? ('0' + minute) : minute;
53 | second = second < 10 ? ('0' + second) : second;
54 | return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
55 | }
56 |
57 | /**
58 | * 截取指定长度的字符串
59 | * 在末尾添加 “...”
60 | */
61 | function formatStrLength(val, row, index) {
62 | val = val.substring(0,20);
63 | val += "...";
64 | return val;
65 | }
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/bootstrap/fonts/glyphicons-halflings-regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/bootstrap/fonts/glyphicons-halflings-regular.eot
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/bootstrap/fonts/glyphicons-halflings-regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/bootstrap/fonts/glyphicons-halflings-regular.ttf
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/bootstrap/fonts/glyphicons-halflings-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/bootstrap/fonts/glyphicons-halflings-regular.woff
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/bootstrap/fonts/glyphicons-halflings-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/bootstrap/fonts/glyphicons-halflings-regular.woff2
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/datatables/images/Sorting icons.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/datatables/images/Sorting icons.psd
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/datatables/images/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/datatables/images/favicon.ico
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/datatables/images/sort_asc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/datatables/images/sort_asc.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/datatables/images/sort_asc_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/datatables/images/sort_asc_disabled.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/datatables/images/sort_both.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/datatables/images/sort_both.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/datatables/images/sort_desc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/datatables/images/sort_desc.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/datatables/images/sort_desc_disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/datatables/images/sort_desc_disabled.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/HELP-US-OUT.txt:
--------------------------------------------------------------------------------
1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project,
2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome,
3 | comprehensive icon sets or copy and paste your own.
4 |
5 | Please. Check it out.
6 |
7 | -Dave Gandy
8 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/font-awesome/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/font-awesome/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/font-awesome/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/font-awesome/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/admin/font-awesome/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/animated.less:
--------------------------------------------------------------------------------
1 | // Animated Icons
2 | // --------------------------
3 |
4 | .@{fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | .@{fa-css-prefix}-pulse {
10 | -webkit-animation: fa-spin 1s infinite steps(8);
11 | animation: fa-spin 1s infinite steps(8);
12 | }
13 |
14 | @-webkit-keyframes fa-spin {
15 | 0% {
16 | -webkit-transform: rotate(0deg);
17 | transform: rotate(0deg);
18 | }
19 | 100% {
20 | -webkit-transform: rotate(359deg);
21 | transform: rotate(359deg);
22 | }
23 | }
24 |
25 | @keyframes fa-spin {
26 | 0% {
27 | -webkit-transform: rotate(0deg);
28 | transform: rotate(0deg);
29 | }
30 | 100% {
31 | -webkit-transform: rotate(359deg);
32 | transform: rotate(359deg);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/bordered-pulled.less:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em @fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .@{fa-css-prefix}-pull-left { float: left; }
11 | .@{fa-css-prefix}-pull-right { float: right; }
12 |
13 | .@{fa-css-prefix} {
14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
18 | /* Deprecated as of 4.4.0 */
19 | .pull-right { float: right; }
20 | .pull-left { float: left; }
21 |
22 | .@{fa-css-prefix} {
23 | &.pull-left { margin-right: .3em; }
24 | &.pull-right { margin-left: .3em; }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/core.less:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .@{fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/extras.less:
--------------------------------------------------------------------------------
1 | // Extras
2 | // --------------------------
3 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/fixed-width.less:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .@{fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/font-awesome.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables.less";
7 | @import "mixins.less";
8 | @import "path.less";
9 | @import "core.less";
10 | @import "larger.less";
11 | @import "fixed-width.less";
12 | @import "list.less";
13 | @import "bordered-pulled.less";
14 | @import "animated.less";
15 | @import "rotated-flipped.less";
16 | @import "stacked.less";
17 | @import "icons.less";
18 | @import "screen-reader.less";
19 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/larger.less:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .@{fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .@{fa-css-prefix}-2x { font-size: 2em; }
11 | .@{fa-css-prefix}-3x { font-size: 3em; }
12 | .@{fa-css-prefix}-4x { font-size: 4em; }
13 | .@{fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/list.less:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: @fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .@{fa-css-prefix}-li {
11 | position: absolute;
12 | left: -@fa-li-width;
13 | width: @fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.@{fa-css-prefix}-lg {
17 | left: (-@fa-li-width + (4em / 14));
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/path.less:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
13 | font-weight: normal;
14 | font-style: normal;
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/rotated-flipped.less:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
7 |
8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .@{fa-css-prefix}-rotate-90,
15 | :root .@{fa-css-prefix}-rotate-180,
16 | :root .@{fa-css-prefix}-rotate-270,
17 | :root .@{fa-css-prefix}-flip-horizontal,
18 | :root .@{fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/screen-reader.less:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { .sr-only(); }
5 | .sr-only-focusable { .sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/spinning.less:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .@{fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | @-webkit-keyframes fa-spin {
10 | 0% {
11 | -webkit-transform: rotate(0deg);
12 | transform: rotate(0deg);
13 | }
14 | 100% {
15 | -webkit-transform: rotate(359deg);
16 | transform: rotate(359deg);
17 | }
18 | }
19 |
20 | @keyframes fa-spin {
21 | 0% {
22 | -webkit-transform: rotate(0deg);
23 | transform: rotate(0deg);
24 | }
25 | 100% {
26 | -webkit-transform: rotate(359deg);
27 | transform: rotate(359deg);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/less/stacked.less:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .@{fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; }
21 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_animated.scss:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | .#{$fa-css-prefix}-pulse {
10 | -webkit-animation: fa-spin 1s infinite steps(8);
11 | animation: fa-spin 1s infinite steps(8);
12 | }
13 |
14 | @-webkit-keyframes fa-spin {
15 | 0% {
16 | -webkit-transform: rotate(0deg);
17 | transform: rotate(0deg);
18 | }
19 | 100% {
20 | -webkit-transform: rotate(359deg);
21 | transform: rotate(359deg);
22 | }
23 | }
24 |
25 | @keyframes fa-spin {
26 | 0% {
27 | -webkit-transform: rotate(0deg);
28 | transform: rotate(0deg);
29 | }
30 | 100% {
31 | -webkit-transform: rotate(359deg);
32 | transform: rotate(359deg);
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_bordered-pulled.scss:
--------------------------------------------------------------------------------
1 | // Bordered & Pulled
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-border {
5 | padding: .2em .25em .15em;
6 | border: solid .08em $fa-border-color;
7 | border-radius: .1em;
8 | }
9 |
10 | .#{$fa-css-prefix}-pull-left { float: left; }
11 | .#{$fa-css-prefix}-pull-right { float: right; }
12 |
13 | .#{$fa-css-prefix} {
14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; }
15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; }
16 | }
17 |
18 | /* Deprecated as of 4.4.0 */
19 | .pull-right { float: right; }
20 | .pull-left { float: left; }
21 |
22 | .#{$fa-css-prefix} {
23 | &.pull-left { margin-right: .3em; }
24 | &.pull-right { margin-left: .3em; }
25 | }
26 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_core.scss:
--------------------------------------------------------------------------------
1 | // Base Class Definition
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix} {
5 | display: inline-block;
6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration
7 | font-size: inherit; // can't have font-size inherit on line above, so need to override
8 | text-rendering: auto; // optimizelegibility throws things off #1094
9 | -webkit-font-smoothing: antialiased;
10 | -moz-osx-font-smoothing: grayscale;
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_extras.scss:
--------------------------------------------------------------------------------
1 | /* EXTRAS
2 | * -------------------------- */
3 |
4 | /* Stacked and layered icon */
5 |
6 | /* Animated rotating icon */
7 | .#{$fa-css-prefix}-spin {
8 | -webkit-animation: spin 2s infinite linear;
9 | -moz-animation: spin 2s infinite linear;
10 | -o-animation: spin 2s infinite linear;
11 | animation: spin 2s infinite linear;
12 | }
13 |
14 | @-moz-keyframes spin {
15 | 0% { -moz-transform: rotate(0deg); }
16 | 100% { -moz-transform: rotate(359deg); }
17 | }
18 | @-webkit-keyframes spin {
19 | 0% { -webkit-transform: rotate(0deg); }
20 | 100% { -webkit-transform: rotate(359deg); }
21 | }
22 | @-o-keyframes spin {
23 | 0% { -o-transform: rotate(0deg); }
24 | 100% { -o-transform: rotate(359deg); }
25 | }
26 | @-ms-keyframes spin {
27 | 0% { -ms-transform: rotate(0deg); }
28 | 100% { -ms-transform: rotate(359deg); }
29 | }
30 | @keyframes spin {
31 | 0% { transform: rotate(0deg); }
32 | 100% { transform: rotate(359deg); }
33 | }
34 |
35 |
36 | // Icon rotations & flipping
37 | // -------------------------
38 |
39 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
40 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
41 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
42 |
43 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
44 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
45 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_fixed-width.scss:
--------------------------------------------------------------------------------
1 | // Fixed Width Icons
2 | // -------------------------
3 | .#{$fa-css-prefix}-fw {
4 | width: (18em / 14);
5 | text-align: center;
6 | }
7 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_larger.scss:
--------------------------------------------------------------------------------
1 | // Icon Sizes
2 | // -------------------------
3 |
4 | /* makes the font 33% larger relative to the icon container */
5 | .#{$fa-css-prefix}-lg {
6 | font-size: (4em / 3);
7 | line-height: (3em / 4);
8 | vertical-align: -15%;
9 | }
10 | .#{$fa-css-prefix}-2x { font-size: 2em; }
11 | .#{$fa-css-prefix}-3x { font-size: 3em; }
12 | .#{$fa-css-prefix}-4x { font-size: 4em; }
13 | .#{$fa-css-prefix}-5x { font-size: 5em; }
14 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_list.scss:
--------------------------------------------------------------------------------
1 | // List Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-ul {
5 | padding-left: 0;
6 | margin-left: $fa-li-width;
7 | list-style-type: none;
8 | > li { position: relative; }
9 | }
10 | .#{$fa-css-prefix}-li {
11 | position: absolute;
12 | left: -$fa-li-width;
13 | width: $fa-li-width;
14 | top: (2em / 14);
15 | text-align: center;
16 | &.#{$fa-css-prefix}-lg {
17 | left: -$fa-li-width + (4em / 14);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_path.scss:
--------------------------------------------------------------------------------
1 | /* FONT PATH
2 | * -------------------------- */
3 |
4 | @font-face {
5 | font-family: 'FontAwesome';
6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
13 | font-weight: normal;
14 | font-style: normal;
15 | }
16 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_rotated-flipped.scss:
--------------------------------------------------------------------------------
1 | // Rotated & Flipped Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
7 |
8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
10 |
11 | // Hook for IE8-9
12 | // -------------------------
13 |
14 | :root .#{$fa-css-prefix}-rotate-90,
15 | :root .#{$fa-css-prefix}-rotate-180,
16 | :root .#{$fa-css-prefix}-rotate-270,
17 | :root .#{$fa-css-prefix}-flip-horizontal,
18 | :root .#{$fa-css-prefix}-flip-vertical {
19 | filter: none;
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_screen-reader.scss:
--------------------------------------------------------------------------------
1 | // Screen Readers
2 | // -------------------------
3 |
4 | .sr-only { @include sr-only(); }
5 | .sr-only-focusable { @include sr-only-focusable(); }
6 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_spinning.scss:
--------------------------------------------------------------------------------
1 | // Spinning Icons
2 | // --------------------------
3 |
4 | .#{$fa-css-prefix}-spin {
5 | -webkit-animation: fa-spin 2s infinite linear;
6 | animation: fa-spin 2s infinite linear;
7 | }
8 |
9 | @-webkit-keyframes fa-spin {
10 | 0% {
11 | -webkit-transform: rotate(0deg);
12 | transform: rotate(0deg);
13 | }
14 | 100% {
15 | -webkit-transform: rotate(359deg);
16 | transform: rotate(359deg);
17 | }
18 | }
19 |
20 | @keyframes fa-spin {
21 | 0% {
22 | -webkit-transform: rotate(0deg);
23 | transform: rotate(0deg);
24 | }
25 | 100% {
26 | -webkit-transform: rotate(359deg);
27 | transform: rotate(359deg);
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/_stacked.scss:
--------------------------------------------------------------------------------
1 | // Stacked Icons
2 | // -------------------------
3 |
4 | .#{$fa-css-prefix}-stack {
5 | position: relative;
6 | display: inline-block;
7 | width: 2em;
8 | height: 2em;
9 | line-height: 2em;
10 | vertical-align: middle;
11 | }
12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
13 | position: absolute;
14 | left: 0;
15 | width: 100%;
16 | text-align: center;
17 | }
18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; }
19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; }
20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; }
21 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/font-awesome/scss/font-awesome.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Font Awesome 4.6.3 by @davegandy - http://fontawesome.io - @fontawesome
3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
4 | */
5 |
6 | @import "variables";
7 | @import "mixins";
8 | @import "path";
9 | @import "core";
10 | @import "larger";
11 | @import "fixed-width";
12 | @import "list";
13 | @import "bordered-pulled";
14 | @import "animated";
15 | @import "rotated-flipped";
16 | @import "stacked";
17 | @import "icons";
18 | @import "screen-reader";
19 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/metisMenu/metisMenu.css:
--------------------------------------------------------------------------------
1 | /*
2 | * metismenu - v1.1.3
3 | * Easy menu jQuery plugin for Twitter Bootstrap 3
4 | * https://github.com/onokumus/metisMenu
5 | *
6 | * Made by Osman Nuri Okumus
7 | * Under MIT License
8 | */
9 | .arrow {
10 | float: right;
11 | line-height: 1.42857;
12 | }
13 |
14 | .glyphicon.arrow:before {
15 | content: "\e079";
16 | }
17 |
18 | .active > a > .glyphicon.arrow:before {
19 | content: "\e114";
20 | }
21 |
22 |
23 | /*
24 | * Require Font-Awesome
25 | * http://fortawesome.github.io/Font-Awesome/
26 | */
27 |
28 |
29 | .fa.arrow:before {
30 | content: "\f104";
31 | }
32 |
33 | .active > a > .fa.arrow:before {
34 | content: "\f107";
35 | }
36 |
37 | .plus-times {
38 | float: right;
39 | }
40 |
41 | .fa.plus-times:before {
42 | content: "\f067";
43 | }
44 |
45 | .active > a > .fa.plus-times {
46 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
47 | -webkit-transform: rotate(45deg);
48 | -moz-transform: rotate(45deg);
49 | -ms-transform: rotate(45deg);
50 | -o-transform: rotate(45deg);
51 | transform: rotate(45deg);
52 | }
53 |
54 | .plus-minus {
55 | float: right;
56 | }
57 |
58 | .fa.plus-minus:before {
59 | content: "\f067";
60 | }
61 |
62 | .active > a > .fa.plus-minus:before {
63 | content: "\f068";
64 | }
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/metisMenu/metisMenu.min.css:
--------------------------------------------------------------------------------
1 | /*
2 | * metismenu - v1.1.3
3 | * Easy menu jQuery plugin for Twitter Bootstrap 3
4 | * https://github.com/onokumus/metisMenu
5 | *
6 | * Made by Osman Nuri Okumus
7 | * Under MIT License
8 | */
9 |
10 | .arrow{float:right;line-height:1.42857}.glyphicon.arrow:before{content:"\e079"}.active>a>.glyphicon.arrow:before{content:"\e114"}.fa.arrow:before{content:"\f104"}.active>a>.fa.arrow:before{content:"\f107"}.plus-times{float:right}.fa.plus-times:before{content:"\f067"}.active>a>.fa.plus-times{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}.plus-minus{float:right}.fa.plus-minus:before{content:"\f067"}.active>a>.fa.plus-minus:before{content:"\f068"}
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/admin/morrisjs/morris.css:
--------------------------------------------------------------------------------
1 | .morris-hover{position:absolute;z-index:1000}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255,255,255,0.8);border:solid 2px rgba(230,230,230,0.8);font-family:sans-serif;font-size:12px;text-align:center}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0}
2 | .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0}
3 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/css/editormd.logo.min.css:
--------------------------------------------------------------------------------
1 | /*! Editor.md v1.5.0 | editormd.logo.min.css | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2015-06-09 */
2 | /*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */@font-face{font-family:editormd-logo;src:url(../fonts/editormd-logo.eot?-5y8q6h);src:url(.../fonts/editormd-logo.eot?#iefix-5y8q6h)format("embedded-opentype"),url(../fonts/editormd-logo.woff?-5y8q6h)format("woff"),url(../fonts/editormd-logo.ttf?-5y8q6h)format("truetype"),url(../fonts/editormd-logo.svg?-5y8q6h#icomoon)format("svg");font-weight:400;font-style:normal}.editormd-logo,.editormd-logo-1x,.editormd-logo-2x,.editormd-logo-3x,.editormd-logo-4x,.editormd-logo-5x,.editormd-logo-6x,.editormd-logo-7x,.editormd-logo-8x{font-family:editormd-logo;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;font-size:inherit;line-height:1;display:inline-block;text-rendering:auto;vertical-align:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.editormd-logo-1x:before,.editormd-logo-2x:before,.editormd-logo-3x:before,.editormd-logo-4x:before,.editormd-logo-5x:before,.editormd-logo-6x:before,.editormd-logo-7x:before,.editormd-logo-8x:before,.editormd-logo:before{content:"\e1987"}.editormd-logo-1x{font-size:1em}.editormd-logo-lg{font-size:1.2em}.editormd-logo-2x{font-size:2em}.editormd-logo-3x{font-size:3em}.editormd-logo-4x{font-size:4em}.editormd-logo-5x{font-size:5em}.editormd-logo-6x{font-size:6em}.editormd-logo-7x{font-size:7em}.editormd-logo-8x{font-size:8em}.editormd-logo-color{color:#2196F3}
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/fonts/FontAwesome.otf
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/editormd-logo.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/fonts/editormd-logo.eot
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/editormd-logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/editormd-logo.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/fonts/editormd-logo.ttf
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/editormd-logo.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/fonts/editormd-logo.woff
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/fonts/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/fonts/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/fonts/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/fonts/fontawesome-webfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/fonts/fontawesome-webfont.woff2
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/loading.gif
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/loading@2x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/loading@2x.gif
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/loading@3x.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/loading@3x.gif
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-16x16.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-16x16.ico
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-24x24.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-24x24.ico
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-32x32.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-32x32.ico
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-48x48.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-48x48.ico
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-64x64.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-favicon-64x64.ico
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-114x114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-114x114.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-120x120.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-120x120.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-144x144.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-16x16.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-180x180.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-180x180.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-240x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-240x240.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-24x24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-24x24.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-320x320.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-320x320.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-32x32.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-48x48.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-57x57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-57x57.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-64x64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-64x64.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-72x72.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-72x72.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/editormd-logo-96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/editormd-logo-96x96.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/images/logos/vi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JamesZBL/FS-Blog/94a8ba71ef0cba75b7f1526b924b9d452d583015/src/main/resources/static/vendor/editor/images/logos/vi.png
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (C) 2014 by Marijn Haverbeke and others
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in
11 | all copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 | THE SOFTWARE.
20 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/README.md:
--------------------------------------------------------------------------------
1 | # CodeMirror
2 | [](https://travis-ci.org/codemirror/CodeMirror)
3 | [](https://www.npmjs.org/package/codemirror)
4 | [Funding status: ](https://marijnhaverbeke.nl/fund/)
5 |
6 | CodeMirror is a JavaScript component that provides a code editor in
7 | the browser. When a mode is available for the language you are coding
8 | in, it will color your code, and optionally help with indentation.
9 |
10 | The project page is http://codemirror.net
11 | The manual is at http://codemirror.net/doc/manual.html
12 | The contributing guidelines are in [CONTRIBUTING.md](https://github.com/codemirror/CodeMirror/blob/master/CONTRIBUTING.md)
13 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/dialog/dialog.css:
--------------------------------------------------------------------------------
1 | .CodeMirror-dialog {
2 | position: absolute;
3 | left: 0; right: 0;
4 | background: white;
5 | z-index: 15;
6 | padding: .1em .8em;
7 | overflow: hidden;
8 | color: #333;
9 | }
10 |
11 | .CodeMirror-dialog-top {
12 | border-bottom: 1px solid #eee;
13 | top: 0;
14 | }
15 |
16 | .CodeMirror-dialog-bottom {
17 | border-top: 1px solid #eee;
18 | bottom: 0;
19 | }
20 |
21 | .CodeMirror-dialog input {
22 | border: none;
23 | outline: none;
24 | background: transparent;
25 | width: 20em;
26 | color: inherit;
27 | font-family: monospace;
28 | }
29 |
30 | .CodeMirror-dialog button {
31 | font-size: 70%;
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/display/fullscreen.css:
--------------------------------------------------------------------------------
1 | .CodeMirror-fullscreen {
2 | position: fixed;
3 | top: 0; left: 0; right: 0; bottom: 0;
4 | height: auto;
5 | z-index: 9;
6 | }
7 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/display/fullscreen.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | (function(mod) {
5 | if (typeof exports == "object" && typeof module == "object") // CommonJS
6 | mod(require("../../lib/codemirror"));
7 | else if (typeof define == "function" && define.amd) // AMD
8 | define(["../../lib/codemirror"], mod);
9 | else // Plain browser env
10 | mod(CodeMirror);
11 | })(function(CodeMirror) {
12 | "use strict";
13 |
14 | CodeMirror.defineOption("fullScreen", false, function(cm, val, old) {
15 | if (old == CodeMirror.Init) old = false;
16 | if (!old == !val) return;
17 | if (val) setFullscreen(cm);
18 | else setNormal(cm);
19 | });
20 |
21 | function setFullscreen(cm) {
22 | var wrap = cm.getWrapperElement();
23 | cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset,
24 | width: wrap.style.width, height: wrap.style.height};
25 | wrap.style.width = "";
26 | wrap.style.height = "auto";
27 | wrap.className += " CodeMirror-fullscreen";
28 | document.documentElement.style.overflow = "hidden";
29 | cm.refresh();
30 | }
31 |
32 | function setNormal(cm) {
33 | var wrap = cm.getWrapperElement();
34 | wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, "");
35 | document.documentElement.style.overflow = "";
36 | var info = cm.state.fullScreenRestore;
37 | wrap.style.width = info.width; wrap.style.height = info.height;
38 | window.scrollTo(info.scrollLeft, info.scrollTop);
39 | cm.refresh();
40 | }
41 | });
42 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/edit/trailingspace.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | (function(mod) {
5 | if (typeof exports == "object" && typeof module == "object") // CommonJS
6 | mod(require("../../lib/codemirror"));
7 | else if (typeof define == "function" && define.amd) // AMD
8 | define(["../../lib/codemirror"], mod);
9 | else // Plain browser env
10 | mod(CodeMirror);
11 | })(function(CodeMirror) {
12 | CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) {
13 | if (prev == CodeMirror.Init) prev = false;
14 | if (prev && !val)
15 | cm.removeOverlay("trailingspace");
16 | else if (!prev && val)
17 | cm.addOverlay({
18 | token: function(stream) {
19 | for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {}
20 | if (i > stream.pos) { stream.pos = i; return null; }
21 | stream.pos = l;
22 | return "trailingspace";
23 | },
24 | name: "trailingspace"
25 | });
26 | });
27 | });
28 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/fold/foldgutter.css:
--------------------------------------------------------------------------------
1 | .CodeMirror-foldmarker {
2 | color: blue;
3 | text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px;
4 | font-family: arial;
5 | line-height: .3;
6 | cursor: pointer;
7 | }
8 | .CodeMirror-foldgutter {
9 | width: .7em;
10 | }
11 | .CodeMirror-foldgutter-open,
12 | .CodeMirror-foldgutter-folded {
13 | cursor: pointer;
14 | }
15 | .CodeMirror-foldgutter-open:after {
16 | content: "\25BE";
17 | }
18 | .CodeMirror-foldgutter-folded:after {
19 | content: "\25B8";
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/hint/show-hint.css:
--------------------------------------------------------------------------------
1 | .CodeMirror-hints {
2 | position: absolute;
3 | z-index: 10;
4 | overflow: hidden;
5 | list-style: none;
6 |
7 | margin: 0;
8 | padding: 2px;
9 |
10 | -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
11 | -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
12 | box-shadow: 2px 3px 5px rgba(0,0,0,.2);
13 | border-radius: 3px;
14 | border: 1px solid silver;
15 |
16 | background: white;
17 | font-size: 90%;
18 | font-family: monospace;
19 |
20 | max-height: 20em;
21 | overflow-y: auto;
22 | }
23 |
24 | .CodeMirror-hint {
25 | margin: 0;
26 | padding: 0 4px;
27 | border-radius: 2px;
28 | max-width: 19em;
29 | overflow: hidden;
30 | white-space: pre;
31 | color: black;
32 | cursor: pointer;
33 | }
34 |
35 | li.CodeMirror-hint-active {
36 | background: #08f;
37 | color: white;
38 | }
39 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/lint/coffeescript-lint.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | // Depends on coffeelint.js from http://www.coffeelint.org/js/coffeelint.js
5 |
6 | // declare global: coffeelint
7 |
8 | (function(mod) {
9 | if (typeof exports == "object" && typeof module == "object") // CommonJS
10 | mod(require("../../lib/codemirror"));
11 | else if (typeof define == "function" && define.amd) // AMD
12 | define(["../../lib/codemirror"], mod);
13 | else // Plain browser env
14 | mod(CodeMirror);
15 | })(function(CodeMirror) {
16 | "use strict";
17 |
18 | CodeMirror.registerHelper("lint", "coffeescript", function(text) {
19 | var found = [];
20 | var parseError = function(err) {
21 | var loc = err.lineNumber;
22 | found.push({from: CodeMirror.Pos(loc-1, 0),
23 | to: CodeMirror.Pos(loc, 0),
24 | severity: err.level,
25 | message: err.message});
26 | };
27 | try {
28 | var res = coffeelint.lint(text);
29 | for(var i = 0; i < res.length; i++) {
30 | parseError(res[i]);
31 | }
32 | } catch(e) {
33 | found.push({from: CodeMirror.Pos(e.location.first_line, 0),
34 | to: CodeMirror.Pos(e.location.last_line, e.location.last_column),
35 | severity: 'error',
36 | message: e.message});
37 | }
38 | return found;
39 | });
40 |
41 | });
42 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/lint/css-lint.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | // Depends on csslint.js from https://github.com/stubbornella/csslint
5 |
6 | // declare global: CSSLint
7 |
8 | (function(mod) {
9 | if (typeof exports == "object" && typeof module == "object") // CommonJS
10 | mod(require("../../lib/codemirror"));
11 | else if (typeof define == "function" && define.amd) // AMD
12 | define(["../../lib/codemirror"], mod);
13 | else // Plain browser env
14 | mod(CodeMirror);
15 | })(function(CodeMirror) {
16 | "use strict";
17 |
18 | CodeMirror.registerHelper("lint", "css", function(text) {
19 | var found = [];
20 | if (!window.CSSLint) return found;
21 | var results = CSSLint.verify(text), messages = results.messages, message = null;
22 | for ( var i = 0; i < messages.length; i++) {
23 | message = messages[i];
24 | var startLine = message.line -1, endLine = message.line -1, startCol = message.col -1, endCol = message.col;
25 | found.push({
26 | from: CodeMirror.Pos(startLine, startCol),
27 | to: CodeMirror.Pos(endLine, endCol),
28 | message: message.message,
29 | severity : message.type
30 | });
31 | }
32 | return found;
33 | });
34 |
35 | });
36 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/lint/json-lint.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | // Depends on jsonlint.js from https://github.com/zaach/jsonlint
5 |
6 | // declare global: jsonlint
7 |
8 | (function(mod) {
9 | if (typeof exports == "object" && typeof module == "object") // CommonJS
10 | mod(require("../../lib/codemirror"));
11 | else if (typeof define == "function" && define.amd) // AMD
12 | define(["../../lib/codemirror"], mod);
13 | else // Plain browser env
14 | mod(CodeMirror);
15 | })(function(CodeMirror) {
16 | "use strict";
17 |
18 | CodeMirror.registerHelper("lint", "json", function(text) {
19 | var found = [];
20 | jsonlint.parseError = function(str, hash) {
21 | var loc = hash.loc;
22 | found.push({from: CodeMirror.Pos(loc.first_line - 1, loc.first_column),
23 | to: CodeMirror.Pos(loc.last_line - 1, loc.last_column),
24 | message: str});
25 | };
26 | try { jsonlint.parse(text); }
27 | catch(e) {}
28 | return found;
29 | });
30 |
31 | });
32 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/lint/yaml-lint.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | (function(mod) {
5 | if (typeof exports == "object" && typeof module == "object") // CommonJS
6 | mod(require("../../lib/codemirror"));
7 | else if (typeof define == "function" && define.amd) // AMD
8 | define(["../../lib/codemirror"], mod);
9 | else // Plain browser env
10 | mod(CodeMirror);
11 | })(function(CodeMirror) {
12 | "use strict";
13 |
14 | // Depends on js-yaml.js from https://github.com/nodeca/js-yaml
15 |
16 | // declare global: jsyaml
17 |
18 | CodeMirror.registerHelper("lint", "yaml", function(text) {
19 | var found = [];
20 | try { jsyaml.load(text); }
21 | catch(e) {
22 | var loc = e.mark;
23 | found.push({ from: CodeMirror.Pos(loc.line, loc.column), to: CodeMirror.Pos(loc.line, loc.column), message: e.message });
24 | }
25 | return found;
26 | });
27 |
28 | });
29 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/mode/multiplex_test.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | (function() {
5 | CodeMirror.defineMode("markdown_with_stex", function(){
6 | var inner = CodeMirror.getMode({}, "stex");
7 | var outer = CodeMirror.getMode({}, "markdown");
8 |
9 | var innerOptions = {
10 | open: '$',
11 | close: '$',
12 | mode: inner,
13 | delimStyle: 'delim',
14 | innerStyle: 'inner'
15 | };
16 |
17 | return CodeMirror.multiplexingMode(outer, innerOptions);
18 | });
19 |
20 | var mode = CodeMirror.getMode({}, "markdown_with_stex");
21 |
22 | function MT(name) {
23 | test.mode(
24 | name,
25 | mode,
26 | Array.prototype.slice.call(arguments, 1),
27 | 'multiplexing');
28 | }
29 |
30 | MT(
31 | "stexInsideMarkdown",
32 | "[strong **Equation:**] [delim $][inner&tag \\pi][delim $]");
33 | })();
34 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/runmode/colorize.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | (function(mod) {
5 | if (typeof exports == "object" && typeof module == "object") // CommonJS
6 | mod(require("../../lib/codemirror"), require("./runmode"));
7 | else if (typeof define == "function" && define.amd) // AMD
8 | define(["../../lib/codemirror", "./runmode"], mod);
9 | else // Plain browser env
10 | mod(CodeMirror);
11 | })(function(CodeMirror) {
12 | "use strict";
13 |
14 | var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/;
15 |
16 | function textContent(node, out) {
17 | if (node.nodeType == 3) return out.push(node.nodeValue);
18 | for (var ch = node.firstChild; ch; ch = ch.nextSibling) {
19 | textContent(ch, out);
20 | if (isBlock.test(node.nodeType)) out.push("\n");
21 | }
22 | }
23 |
24 | CodeMirror.colorize = function(collection, defaultMode) {
25 | if (!collection) collection = document.body.getElementsByTagName("pre");
26 |
27 | for (var i = 0; i < collection.length; ++i) {
28 | var node = collection[i];
29 | var mode = node.getAttribute("data-lang") || defaultMode;
30 | if (!mode) continue;
31 |
32 | var text = [];
33 | textContent(node, text);
34 | node.innerHTML = "";
35 | CodeMirror.runMode(text.join(""), mode, node);
36 |
37 | node.className += " cm-s-default";
38 | }
39 | };
40 | });
41 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/scroll/scrollpastend.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | (function(mod) {
5 | if (typeof exports == "object" && typeof module == "object") // CommonJS
6 | mod(require("../../lib/codemirror"));
7 | else if (typeof define == "function" && define.amd) // AMD
8 | define(["../../lib/codemirror"], mod);
9 | else // Plain browser env
10 | mod(CodeMirror);
11 | })(function(CodeMirror) {
12 | "use strict";
13 |
14 | CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) {
15 | if (old && old != CodeMirror.Init) {
16 | cm.off("change", onChange);
17 | cm.off("refresh", updateBottomMargin);
18 | cm.display.lineSpace.parentNode.style.paddingBottom = "";
19 | cm.state.scrollPastEndPadding = null;
20 | }
21 | if (val) {
22 | cm.on("change", onChange);
23 | cm.on("refresh", updateBottomMargin);
24 | updateBottomMargin(cm);
25 | }
26 | });
27 |
28 | function onChange(cm, change) {
29 | if (CodeMirror.changeEnd(change).line == cm.lastLine())
30 | updateBottomMargin(cm);
31 | }
32 |
33 | function updateBottomMargin(cm) {
34 | var padding = "";
35 | if (cm.lineCount() > 1) {
36 | var totalH = cm.display.scroller.clientHeight - 30,
37 | lastLineH = cm.getLineHandle(cm.lastLine()).height;
38 | padding = (totalH - lastLineH) + "px";
39 | }
40 | if (cm.state.scrollPastEndPadding != padding) {
41 | cm.state.scrollPastEndPadding = padding;
42 | cm.display.lineSpace.parentNode.style.paddingBottom = padding;
43 | cm.setSize();
44 | }
45 | }
46 | });
47 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/scroll/simplescrollbars.css:
--------------------------------------------------------------------------------
1 | .CodeMirror-simplescroll-horizontal div, .CodeMirror-simplescroll-vertical div {
2 | position: absolute;
3 | background: #ccc;
4 | -moz-box-sizing: border-box;
5 | box-sizing: border-box;
6 | border: 1px solid #bbb;
7 | border-radius: 2px;
8 | }
9 |
10 | .CodeMirror-simplescroll-horizontal, .CodeMirror-simplescroll-vertical {
11 | position: absolute;
12 | z-index: 6;
13 | background: #eee;
14 | }
15 |
16 | .CodeMirror-simplescroll-horizontal {
17 | bottom: 0; left: 0;
18 | height: 8px;
19 | }
20 | .CodeMirror-simplescroll-horizontal div {
21 | bottom: 0;
22 | height: 100%;
23 | }
24 |
25 | .CodeMirror-simplescroll-vertical {
26 | right: 0; top: 0;
27 | width: 8px;
28 | }
29 | .CodeMirror-simplescroll-vertical div {
30 | right: 0;
31 | width: 100%;
32 | }
33 |
34 |
35 | .CodeMirror-overlayscroll .CodeMirror-scrollbar-filler, .CodeMirror-overlayscroll .CodeMirror-gutter-filler {
36 | display: none;
37 | }
38 |
39 | .CodeMirror-overlayscroll-horizontal div, .CodeMirror-overlayscroll-vertical div {
40 | position: absolute;
41 | background: #bcd;
42 | border-radius: 3px;
43 | }
44 |
45 | .CodeMirror-overlayscroll-horizontal, .CodeMirror-overlayscroll-vertical {
46 | position: absolute;
47 | z-index: 6;
48 | }
49 |
50 | .CodeMirror-overlayscroll-horizontal {
51 | bottom: 0; left: 0;
52 | height: 6px;
53 | }
54 | .CodeMirror-overlayscroll-horizontal div {
55 | bottom: 0;
56 | height: 100%;
57 | }
58 |
59 | .CodeMirror-overlayscroll-vertical {
60 | right: 0; top: 0;
61 | width: 6px;
62 | }
63 | .CodeMirror-overlayscroll-vertical div {
64 | right: 0;
65 | width: 100%;
66 | }
67 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/search/matchesonscrollbar.css:
--------------------------------------------------------------------------------
1 | .CodeMirror-search-match {
2 | background: gold;
3 | border-top: 1px solid orange;
4 | border-bottom: 1px solid orange;
5 | -moz-box-sizing: border-box;
6 | box-sizing: border-box;
7 | opacity: .5;
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/addon/tern/worker.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | // declare global: tern, server
5 |
6 | var server;
7 |
8 | this.onmessage = function(e) {
9 | var data = e.data;
10 | switch (data.type) {
11 | case "init": return startServer(data.defs, data.plugins, data.scripts);
12 | case "add": return server.addFile(data.name, data.text);
13 | case "del": return server.delFile(data.name);
14 | case "req": return server.request(data.body, function(err, reqData) {
15 | postMessage({id: data.id, body: reqData, err: err && String(err)});
16 | });
17 | case "getFile":
18 | var c = pending[data.id];
19 | delete pending[data.id];
20 | return c(data.err, data.text);
21 | default: throw new Error("Unknown message type: " + data.type);
22 | }
23 | };
24 |
25 | var nextId = 0, pending = {};
26 | function getFile(file, c) {
27 | postMessage({type: "getFile", name: file, id: ++nextId});
28 | pending[nextId] = c;
29 | }
30 |
31 | function startServer(defs, plugins, scripts) {
32 | if (scripts) importScripts.apply(null, scripts);
33 |
34 | server = new tern.Server({
35 | getFile: getFile,
36 | async: true,
37 | defs: defs,
38 | plugins: plugins
39 | });
40 | }
41 |
42 | var console = {
43 | log: function(v) { postMessage({type: "debug", message: v}); }
44 | };
45 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "codemirror",
3 | "version":"5.0.0",
4 | "main": ["lib/codemirror.js", "lib/codemirror.css"],
5 | "ignore": [
6 | "**/.*",
7 | "node_modules",
8 | "components",
9 | "bin",
10 | "demo",
11 | "doc",
12 | "test",
13 | "index.html",
14 | "package.json"
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/mode/diff/diff.js:
--------------------------------------------------------------------------------
1 | // CodeMirror, copyright (c) by Marijn Haverbeke and others
2 | // Distributed under an MIT license: http://codemirror.net/LICENSE
3 |
4 | (function(mod) {
5 | if (typeof exports == "object" && typeof module == "object") // CommonJS
6 | mod(require("../../lib/codemirror"));
7 | else if (typeof define == "function" && define.amd) // AMD
8 | define(["../../lib/codemirror"], mod);
9 | else // Plain browser env
10 | mod(CodeMirror);
11 | })(function(CodeMirror) {
12 | "use strict";
13 |
14 | CodeMirror.defineMode("diff", function() {
15 |
16 | var TOKEN_NAMES = {
17 | '+': 'positive',
18 | '-': 'negative',
19 | '@': 'meta'
20 | };
21 |
22 | return {
23 | token: function(stream) {
24 | var tw_pos = stream.string.search(/[\t ]+?$/);
25 |
26 | if (!stream.sol() || tw_pos === 0) {
27 | stream.skipToEnd();
28 | return ("error " + (
29 | TOKEN_NAMES[stream.string.charAt(0)] || '')).replace(/ $/, '');
30 | }
31 |
32 | var token_name = TOKEN_NAMES[stream.peek()] || stream.skipToEnd();
33 |
34 | if (tw_pos === -1) {
35 | stream.skipToEnd();
36 | } else {
37 | stream.pos = tw_pos;
38 | }
39 |
40 | return token_name;
41 | }
42 | };
43 | });
44 |
45 | CodeMirror.defineMIME("text/x-diff", "diff");
46 |
47 | });
48 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/mode/ecl/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | CodeMirror: ECL mode
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
24 |
25 |
26 | ECL mode
27 |
45 |
48 |
49 | Based on CodeMirror's clike mode. For more information see HPCC Systems web site.
50 | MIME types defined: text/x-ecl
.
51 |
52 |
53 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/mode/gherkin/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | CodeMirror: Gherkin mode
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
24 |
25 |
26 | Gherkin mode
27 |
42 |
45 |
46 | MIME types defined: text/x-feature
.
47 |
48 |
49 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/mode/http/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | CodeMirror: HTTP mode
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
24 |
25 |
26 | HTTP mode
27 |
28 |
29 |
39 |
40 |
43 |
44 | MIME types defined: message/http
.
45 |
46 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/mode/ntriples/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | CodeMirror: NTriples mode
4 |
5 |
6 |
7 |
8 |
9 |
10 |
15 |
28 |
29 |
30 | NTriples mode
31 |
40 |
41 |
44 | MIME types defined: text/n-triples
.
45 |
46 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/mode/pascal/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | CodeMirror: Pascal mode
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
24 |
25 |
26 | Pascal mode
27 |
28 |
29 |
52 |
53 |
59 |
60 | MIME types defined: text/x-pascal
.
61 |
62 |
--------------------------------------------------------------------------------
/src/main/resources/static/vendor/editor/lib/codemirror/mode/pig/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | CodeMirror: Pig Latin mode
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
24 |
25 |
26 | Pig Latin mode
27 |
39 |
40 |
47 |
48 |
49 | Simple mode that handles Pig Latin language.
50 |
51 |
52 | MIME type defined: text/x-pig
53 | (PIG code)
54 |