├── src └── main │ ├── webapp │ ├── resource │ │ ├── ueditor-1.4.3 │ │ │ ├── themes │ │ │ │ ├── iframe.css │ │ │ │ └── default │ │ │ │ │ └── images │ │ │ │ │ ├── arrow.png │ │ │ │ │ ├── icons.gif │ │ │ │ │ ├── icons.png │ │ │ │ │ ├── lock.gif │ │ │ │ │ ├── scale.png │ │ │ │ │ ├── word.gif │ │ │ │ │ ├── anchor.gif │ │ │ │ │ ├── charts.png │ │ │ │ │ ├── loading.gif │ │ │ │ │ ├── spacer.gif │ │ │ │ │ ├── upload.png │ │ │ │ │ ├── arrow_down.png │ │ │ │ │ ├── arrow_up.png │ │ │ │ │ ├── button-bg.gif │ │ │ │ │ ├── cursor_h.gif │ │ │ │ │ ├── cursor_h.png │ │ │ │ │ ├── cursor_v.gif │ │ │ │ │ ├── cursor_v.png │ │ │ │ │ ├── filescan.png │ │ │ │ │ ├── icons-all.gif │ │ │ │ │ ├── loaderror.png │ │ │ │ │ ├── pagebreak.gif │ │ │ │ │ ├── sortable.png │ │ │ │ │ ├── sparator_v.png │ │ │ │ │ ├── toolbar_bg.png │ │ │ │ │ ├── videologo.gif │ │ │ │ │ ├── wordpaste.png │ │ │ │ │ ├── cancelbutton.gif │ │ │ │ │ ├── highlighted.gif │ │ │ │ │ ├── dialog-title-bg.png │ │ │ │ │ ├── unhighlighted.gif │ │ │ │ │ ├── neweditor-tab-bg.png │ │ │ │ │ ├── table-cell-align.png │ │ │ │ │ └── tangram-colorpicker.png │ │ │ ├── lang │ │ │ │ ├── en │ │ │ │ │ └── images │ │ │ │ │ │ ├── copy.png │ │ │ │ │ │ ├── button.png │ │ │ │ │ │ ├── music.png │ │ │ │ │ │ ├── upload.png │ │ │ │ │ │ ├── addimage.png │ │ │ │ │ │ ├── background.png │ │ │ │ │ │ ├── deleteenable.png │ │ │ │ │ │ ├── localimage.png │ │ │ │ │ │ ├── deletedisable.png │ │ │ │ │ │ ├── listbackground.png │ │ │ │ │ │ ├── rotateleftdisable.png │ │ │ │ │ │ ├── rotateleftenable.png │ │ │ │ │ │ ├── rotaterightenable.png │ │ │ │ │ │ ├── alldeletebtnupskin.png │ │ │ │ │ │ ├── rotaterightdisable.png │ │ │ │ │ │ └── alldeletebtnhoverskin.png │ │ │ │ └── zh-cn │ │ │ │ │ └── images │ │ │ │ │ ├── copy.png │ │ │ │ │ ├── music.png │ │ │ │ │ ├── upload.png │ │ │ │ │ └── localimage.png │ │ │ ├── dialogs │ │ │ │ ├── table │ │ │ │ │ ├── dragicon.png │ │ │ │ │ ├── edittip.html │ │ │ │ │ └── edittable.css │ │ │ │ ├── emotion │ │ │ │ │ └── images │ │ │ │ │ │ ├── 0.gif │ │ │ │ │ │ ├── bface.gif │ │ │ │ │ │ ├── cface.gif │ │ │ │ │ │ ├── fface.gif │ │ │ │ │ │ ├── tface.gif │ │ │ │ │ │ ├── wface.gif │ │ │ │ │ │ ├── yface.gif │ │ │ │ │ │ ├── jxface2.gif │ │ │ │ │ │ └── neweditor-tab-bg.png │ │ │ │ ├── image │ │ │ │ │ └── images │ │ │ │ │ │ ├── bg.png │ │ │ │ │ │ ├── icons.gif │ │ │ │ │ │ ├── icons.png │ │ │ │ │ │ ├── image.png │ │ │ │ │ │ ├── progress.png │ │ │ │ │ │ ├── success.gif │ │ │ │ │ │ ├── success.png │ │ │ │ │ │ └── alignicon.jpg │ │ │ │ ├── video │ │ │ │ │ └── images │ │ │ │ │ │ ├── bg.png │ │ │ │ │ │ ├── icons.gif │ │ │ │ │ │ ├── icons.png │ │ │ │ │ │ ├── image.png │ │ │ │ │ │ ├── progress.png │ │ │ │ │ │ ├── success.gif │ │ │ │ │ │ ├── success.png │ │ │ │ │ │ ├── file-icons.gif │ │ │ │ │ │ ├── file-icons.png │ │ │ │ │ │ ├── left_focus.jpg │ │ │ │ │ │ ├── none_focus.jpg │ │ │ │ │ │ ├── right_focus.jpg │ │ │ │ │ │ └── center_focus.jpg │ │ │ │ ├── scrawl │ │ │ │ │ └── images │ │ │ │ │ │ ├── brush.png │ │ │ │ │ │ ├── empty.png │ │ │ │ │ │ ├── redo.png │ │ │ │ │ │ ├── redoH.png │ │ │ │ │ │ ├── scale.png │ │ │ │ │ │ ├── size.png │ │ │ │ │ │ ├── undo.png │ │ │ │ │ │ ├── undoH.png │ │ │ │ │ │ ├── addimg.png │ │ │ │ │ │ ├── delimg.png │ │ │ │ │ │ ├── delimgH.png │ │ │ │ │ │ ├── emptyH.png │ │ │ │ │ │ ├── eraser.png │ │ │ │ │ │ └── scaleH.png │ │ │ │ ├── template │ │ │ │ │ ├── images │ │ │ │ │ │ ├── bg.gif │ │ │ │ │ │ ├── pre0.png │ │ │ │ │ │ ├── pre1.png │ │ │ │ │ │ ├── pre2.png │ │ │ │ │ │ ├── pre3.png │ │ │ │ │ │ └── pre4.png │ │ │ │ │ ├── template.html │ │ │ │ │ └── template.css │ │ │ │ ├── attachment │ │ │ │ │ ├── images │ │ │ │ │ │ ├── bg.png │ │ │ │ │ │ ├── icons.gif │ │ │ │ │ │ ├── icons.png │ │ │ │ │ │ ├── image.png │ │ │ │ │ │ ├── progress.png │ │ │ │ │ │ ├── success.gif │ │ │ │ │ │ ├── success.png │ │ │ │ │ │ ├── alignicon.gif │ │ │ │ │ │ ├── alignicon.png │ │ │ │ │ │ ├── file-icons.gif │ │ │ │ │ │ └── file-icons.png │ │ │ │ │ └── fileTypeImages │ │ │ │ │ │ ├── icon_chm.gif │ │ │ │ │ │ ├── icon_doc.gif │ │ │ │ │ │ ├── icon_exe.gif │ │ │ │ │ │ ├── icon_jpg.gif │ │ │ │ │ │ ├── icon_mp3.gif │ │ │ │ │ │ ├── icon_mv.gif │ │ │ │ │ │ ├── icon_pdf.gif │ │ │ │ │ │ ├── icon_ppt.gif │ │ │ │ │ │ ├── icon_psd.gif │ │ │ │ │ │ ├── icon_rar.gif │ │ │ │ │ │ ├── icon_txt.gif │ │ │ │ │ │ ├── icon_xls.gif │ │ │ │ │ │ └── icon_default.png │ │ │ │ ├── background │ │ │ │ │ └── images │ │ │ │ │ │ ├── bg.png │ │ │ │ │ │ └── success.png │ │ │ │ ├── charts │ │ │ │ │ ├── images │ │ │ │ │ │ ├── charts0.png │ │ │ │ │ │ ├── charts1.png │ │ │ │ │ │ ├── charts2.png │ │ │ │ │ │ ├── charts3.png │ │ │ │ │ │ ├── charts4.png │ │ │ │ │ │ └── charts5.png │ │ │ │ │ └── chart.config.js │ │ │ │ ├── wordimage │ │ │ │ │ ├── imageUploader.swf │ │ │ │ │ └── fClipboard_ueditor.swf │ │ │ │ ├── help │ │ │ │ │ ├── help.css │ │ │ │ │ └── help.js │ │ │ │ ├── spechars │ │ │ │ │ └── spechars.html │ │ │ │ ├── music │ │ │ │ │ ├── music.html │ │ │ │ │ └── music.css │ │ │ │ ├── preview │ │ │ │ │ └── preview.html │ │ │ │ └── anchor │ │ │ │ │ └── anchor.html │ │ │ ├── third-party │ │ │ │ ├── video-js │ │ │ │ │ ├── font │ │ │ │ │ │ ├── vjs.eot │ │ │ │ │ │ ├── vjs.ttf │ │ │ │ │ │ └── vjs.woff │ │ │ │ │ └── video-js.swf │ │ │ │ ├── webuploader │ │ │ │ │ ├── Uploader.swf │ │ │ │ │ └── webuploader.css │ │ │ │ ├── zeroclipboard │ │ │ │ │ └── ZeroClipboard.swf │ │ │ │ └── highcharts │ │ │ │ │ └── modules │ │ │ │ │ ├── heatmap.js │ │ │ │ │ ├── no-data-to-display.js │ │ │ │ │ └── heatmap.src.js │ │ │ └── READ ME.txt │ │ ├── img │ │ │ ├── logo.png │ │ │ ├── arrow2.gif │ │ │ ├── avatar.png │ │ │ ├── bullet.png │ │ │ ├── favicon.ico │ │ │ ├── meta_bg.gif │ │ │ ├── search.png │ │ │ ├── title.gif │ │ │ ├── upload.png │ │ │ ├── right_bg.gif │ │ │ ├── search_ie.png │ │ │ ├── type │ │ │ │ ├── code.png │ │ │ │ ├── text.png │ │ │ │ ├── archive.png │ │ │ │ └── document.png │ │ │ ├── background.gif │ │ │ ├── left_arrow.png │ │ │ ├── return_top1.gif │ │ │ ├── return_top2.gif │ │ │ ├── right_arrow.png │ │ │ └── background_header.gif │ │ ├── font │ │ │ ├── icomoon-zblog.eot │ │ │ ├── icomoon-zblog.ttf │ │ │ └── icomoon-zblog.woff │ │ ├── zdialog │ │ │ ├── image │ │ │ │ ├── ico.png │ │ │ │ └── alert_btn.png │ │ │ ├── alert.js │ │ │ └── alert.css │ │ ├── webuploader-0.1.5 │ │ │ ├── Uploader.swf │ │ │ └── webuploader.css │ │ ├── bootstrap-tree │ │ │ └── bootstrap-treeview.min.css │ │ ├── Font-Awesome-3.2.1 │ │ │ └── font │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ └── fontawesome-webfont.woff │ │ ├── bootstrap-3.3.1 │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ └── glyphicons-halflings-regular.woff │ │ │ └── js │ │ │ │ └── npm.js │ │ ├── js │ │ │ ├── ie6.js │ │ │ ├── backend │ │ │ │ ├── admin.upload.js │ │ │ │ ├── admin.link.js │ │ │ │ ├── admin.user.js │ │ │ │ ├── sidebar.js │ │ │ │ ├── admin.comment.js │ │ │ │ ├── admin.category.js │ │ │ │ └── zblog.admin.js │ │ │ └── jscript.js │ │ ├── error │ │ │ ├── 404.html │ │ │ ├── 500.html │ │ │ └── unauthenticated.html │ │ └── epiceditor-0.2.3 │ │ │ └── themes │ │ │ └── editor │ │ │ ├── epic-light.css │ │ │ └── epic-dark.css │ ├── META-INF │ │ └── MANIFEST.MF │ ├── robots.txt │ ├── index.jsp │ └── WEB-INF │ │ ├── jsp │ │ ├── common │ │ │ ├── recent.html │ │ │ ├── archive.html │ │ │ ├── tagcloud.html │ │ │ ├── link.html │ │ │ ├── header.html │ │ │ ├── footer.jsp │ │ │ └── head.jsp │ │ ├── backend │ │ │ └── common │ │ │ │ ├── pagination.jsp │ │ │ │ ├── bootstrap.jsp │ │ │ │ └── navbar.jsp │ │ └── sitemap.jsp │ │ └── tld │ │ └── function.tld │ ├── java │ └── com │ │ └── zblog │ │ ├── core │ │ ├── dal │ │ │ ├── mapper │ │ │ │ ├── LinkMapper.java │ │ │ │ ├── UserMapper.java │ │ │ │ ├── OptionMapper.java │ │ │ │ ├── TagMapper.java │ │ │ │ ├── UploadMapper.java │ │ │ │ ├── CommentMapper.java │ │ │ │ ├── BaseMapper.java │ │ │ │ ├── CategoryMapper.java │ │ │ │ └── PostMapper.java │ │ │ ├── constants │ │ │ │ ├── CategoryConstants.java │ │ │ │ ├── CommentConstants.java │ │ │ │ ├── UserConstants.java │ │ │ │ ├── OptionConstants.java │ │ │ │ └── PostConstants.java │ │ │ └── entity │ │ │ │ ├── Tag.java │ │ │ │ ├── Upload.java │ │ │ │ ├── Category.java │ │ │ │ ├── Link.java │ │ │ │ ├── Option.java │ │ │ │ ├── BaseEntity.java │ │ │ │ └── User.java │ │ ├── plugin │ │ │ ├── TreeItem.java │ │ │ ├── ApplicationContextUtil.java │ │ │ └── TreeUtils.java │ │ ├── tag │ │ │ ├── FirstTag.java │ │ │ ├── LastTag.java │ │ │ ├── PrevTag.java │ │ │ ├── NextTag.java │ │ │ └── AbstartTagSupport.java │ │ ├── lucene │ │ │ ├── LuceneException.java │ │ │ ├── DocConverter.java │ │ │ └── LuceneUtils.java │ │ ├── util │ │ │ ├── UrlUtil.java │ │ │ ├── CollectionUtils.java │ │ │ ├── IpUtils.java │ │ │ ├── IdGenerator.java │ │ │ ├── CommRegular.java │ │ │ ├── PostTagHelper.java │ │ │ ├── Threads.java │ │ │ ├── StringUtils.java │ │ │ ├── JdbcUtils.java │ │ │ └── DateUtils.java │ │ ├── Constants.java │ │ ├── WebConstants.java │ │ ├── feed │ │ │ ├── ArticleAdapter.java │ │ │ └── Channel.java │ │ └── security │ │ │ └── Hex.java │ │ ├── service │ │ ├── freemarker │ │ │ ├── ftl │ │ │ │ ├── recent.html │ │ │ │ ├── link.html │ │ │ │ ├── archive.html │ │ │ │ ├── tagcloud.html │ │ │ │ └── post.html │ │ │ └── FreeMarkerException.java │ │ ├── shiro │ │ │ ├── StatelessToken.java │ │ │ └── StatelessDefaultSubjectFactory.java │ │ ├── vo │ │ │ ├── UploadVO.java │ │ │ ├── PageVO.java │ │ │ ├── MailVO.java │ │ │ ├── PostVO.java │ │ │ ├── CommentVO.java │ │ │ ├── OSInfo.java │ │ │ └── Global.java │ │ ├── LinkService.java │ │ ├── UserService.java │ │ ├── TagService.java │ │ ├── BaseService.java │ │ ├── OptionsService.java │ │ ├── UploadService.java │ │ └── email │ │ │ └── MailSenderService.java │ │ ├── web │ │ ├── backend │ │ │ └── form │ │ │ │ ├── validator │ │ │ │ ├── CategoryFormValidator.java │ │ │ │ ├── MailFormValidator.java │ │ │ │ ├── LinkFormValidator.java │ │ │ │ ├── LoginFormValidator.java │ │ │ │ ├── OptionFormValidator.java │ │ │ │ └── PostFormValidator.java │ │ │ │ ├── MailOption.java │ │ │ │ ├── PostOption.java │ │ │ │ ├── LoginForm.java │ │ │ │ └── GeneralOption.java │ │ ├── support │ │ │ ├── WebContextFactory.java │ │ │ ├── ServletRequestReaderArgumentsResolver.java │ │ │ └── WebContext.java │ │ ├── listener │ │ │ └── InitApplicationListener.java │ │ ├── front │ │ │ ├── controller │ │ │ │ ├── TagController.java │ │ │ │ ├── CategoryController.java │ │ │ │ └── PageController.java │ │ │ └── validator │ │ │ │ └── CommentValidator.java │ │ └── filter │ │ │ └── XssHttpServletRequestWrapper.java │ │ └── biz │ │ ├── VisitStatManager.java │ │ └── EhCacheManager.java │ └── resources │ ├── jdbc.properties │ ├── dic │ └── stopword.dic │ ├── IKAnalyzer.cfg.xml │ ├── mybatis │ ├── OptionMapper.xml │ ├── LinkMapper.xml │ ├── TagMapper.xml │ ├── UploadMapper.xml │ └── UserMapper.xml │ ├── config │ ├── spring-service.xml │ └── mybatis.xml │ └── log4j.properties ├── .gitignore └── README.md /src/main/webapp/resource/ueditor-1.4.3/themes/iframe.css: -------------------------------------------------------------------------------- 1 | /*可以在这里添加你自己的css*/ 2 | -------------------------------------------------------------------------------- /src/main/webapp/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /src/main/webapp/resource/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/logo.png -------------------------------------------------------------------------------- /src/main/webapp/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /backend/ 3 | Disallow: /resource/ 4 | Disallow: /xmlrpc/ 5 | -------------------------------------------------------------------------------- /src/main/webapp/resource/img/arrow2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/arrow2.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/img/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/avatar.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/bullet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/bullet.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/favicon.ico -------------------------------------------------------------------------------- /src/main/webapp/resource/img/meta_bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/meta_bg.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/img/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/search.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/title.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/title.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/img/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/upload.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/right_bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/right_bg.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/img/search_ie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/search_ie.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/type/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/type/code.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/type/text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/type/text.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/background.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/background.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/img/left_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/left_arrow.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/return_top1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/return_top1.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/img/return_top2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/return_top2.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/img/right_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/right_arrow.png -------------------------------------------------------------------------------- /src/main/webapp/resource/img/type/archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/type/archive.png -------------------------------------------------------------------------------- /src/main/webapp/resource/font/icomoon-zblog.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/font/icomoon-zblog.eot -------------------------------------------------------------------------------- /src/main/webapp/resource/font/icomoon-zblog.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/font/icomoon-zblog.ttf -------------------------------------------------------------------------------- /src/main/webapp/resource/img/type/document.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/type/document.png -------------------------------------------------------------------------------- /src/main/webapp/resource/zdialog/image/ico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/zdialog/image/ico.png -------------------------------------------------------------------------------- /src/main/webapp/resource/font/icomoon-zblog.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/font/icomoon-zblog.woff -------------------------------------------------------------------------------- /src/main/webapp/resource/img/background_header.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/img/background_header.gif -------------------------------------------------------------------------------- /src/main/webapp/index.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | -------------------------------------------------------------------------------- /src/main/webapp/resource/zdialog/image/alert_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/zdialog/image/alert_btn.png -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/recent.html: -------------------------------------------------------------------------------- 1 |
2 |

近期文章

3 | 5 |
-------------------------------------------------------------------------------- /src/main/webapp/resource/webuploader-0.1.5/Uploader.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/webuploader-0.1.5/Uploader.swf -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/archive.html: -------------------------------------------------------------------------------- 1 |
2 |

文章归档

3 | 5 |
-------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/mapper/LinkMapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.mapper; 2 | 3 | public interface LinkMapper extends BaseMapper{ 4 | 5 | } 6 | -------------------------------------------------------------------------------- /src/main/webapp/resource/bootstrap-tree/bootstrap-treeview.min.css: -------------------------------------------------------------------------------- 1 | .list-group-item{cursor:pointer}span.indent{margin-left:10px;margin-right:10px}span.icon{margin-right:5px} -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/copy.png -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/tagcloud.html: -------------------------------------------------------------------------------- 1 |
2 |

标签

3 |
4 |
5 |
-------------------------------------------------------------------------------- /src/main/webapp/resource/Font-Awesome-3.2.1/font/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/Font-Awesome-3.2.1/font/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/table/dragicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/table/dragicon.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/button.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/music.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/upload.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/zh-cn/images/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/zh-cn/images/copy.png -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/link.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/0.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/bg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/bg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/addimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/addimage.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/zh-cn/images/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/zh-cn/images/music.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/zh-cn/images/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/zh-cn/images/upload.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/icons.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/icons.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/image.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/brush.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/brush.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/empty.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/redo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/redo.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/redoH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/redoH.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/scale.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/size.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/size.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/undo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/undo.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/undoH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/undoH.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/bg.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/icons.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/icons.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/image.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/background.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/deleteenable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/deleteenable.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/localimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/localimage.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/arrow.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/icons.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/icons.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/lock.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/lock.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/scale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/scale.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/word.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/word.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/Font-Awesome-3.2.1/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/Font-Awesome-3.2.1/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/webapp/resource/Font-Awesome-3.2.1/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/Font-Awesome-3.2.1/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/bg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/background/images/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/background/images/bg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts0.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts1.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts2.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts3.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts4.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/images/charts5.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/bface.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/bface.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/cface.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/cface.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/fface.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/fface.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/tface.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/tface.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/wface.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/wface.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/yface.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/yface.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/progress.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/success.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/success.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/success.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/addimg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/addimg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/delimg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/delimg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/delimgH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/delimgH.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/emptyH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/emptyH.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/eraser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/eraser.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/scaleH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/scrawl/images/scaleH.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre0.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre1.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre2.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre3.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/template/images/pre4.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/progress.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/success.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/success.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/success.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/deletedisable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/deletedisable.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/listbackground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/listbackground.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/zh-cn/images/localimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/zh-cn/images/localimage.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/anchor.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/anchor.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/charts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/charts.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/loading.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/spacer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/spacer.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/upload.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/video-js/font/vjs.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/third-party/video-js/font/vjs.eot -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/video-js/font/vjs.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/third-party/video-js/font/vjs.ttf -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/video-js/video-js.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/third-party/video-js/video-js.swf -------------------------------------------------------------------------------- /src/main/webapp/resource/Font-Awesome-3.2.1/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/Font-Awesome-3.2.1/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/icons.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/icons.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/image.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/jxface2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/jxface2.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/alignicon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/image/images/alignicon.jpg -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/file-icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/file-icons.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/file-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/file-icons.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/left_focus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/left_focus.jpg -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/none_focus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/none_focus.jpg -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/right_focus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/right_focus.jpg -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/wordimage/imageUploader.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/wordimage/imageUploader.swf -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/rotateleftdisable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/rotateleftdisable.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/rotateleftenable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/rotateleftenable.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/rotaterightenable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/rotaterightenable.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/arrow_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/arrow_down.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/arrow_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/arrow_up.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/button-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/button-bg.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cursor_h.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cursor_h.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cursor_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cursor_h.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cursor_v.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cursor_v.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cursor_v.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cursor_v.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/filescan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/filescan.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/icons-all.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/icons-all.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/loaderror.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/loaderror.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/pagebreak.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/pagebreak.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/sortable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/sortable.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/sparator_v.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/sparator_v.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/toolbar_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/toolbar_bg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/videologo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/videologo.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/wordpaste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/wordpaste.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/video-js/font/vjs.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/third-party/video-js/font/vjs.woff -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/webuploader/Uploader.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/third-party/webuploader/Uploader.swf -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/progress.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/success.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/success.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/success.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/background/images/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/background/images/success.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/center_focus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/video/images/center_focus.jpg -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/alldeletebtnupskin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/alldeletebtnupskin.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/rotaterightdisable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/rotaterightdisable.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cancelbutton.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/cancelbutton.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/highlighted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/highlighted.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/webapp/resource/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/webapp/resource/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/bootstrap-3.3.1/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/alignicon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/alignicon.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/alignicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/alignicon.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/file-icons.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/file-icons.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/file-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/images/file-icons.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/wordimage/fClipboard_ueditor.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/wordimage/fClipboard_ueditor.swf -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/lang/en/images/alldeletebtnhoverskin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/lang/en/images/alldeletebtnhoverskin.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/dialog-title-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/dialog-title-bg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/unhighlighted.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/unhighlighted.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/neweditor-tab-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/emotion/images/neweditor-tab-bg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/neweditor-tab-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/neweditor-tab-bg.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/table-cell-align.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/table-cell-align.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/zeroclipboard/ZeroClipboard.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/third-party/zeroclipboard/ZeroClipboard.swf -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # maven ignore 2 | target/ 3 | /src/test/ 4 | *.DS_Store 5 | /src/main/webapp/post 6 | /src/main/webapp/log 7 | 8 | # eclipse ignore 9 | .settings/ 10 | .project 11 | .classpath 12 | .tern-project -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_chm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_chm.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_doc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_doc.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_exe.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_exe.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_jpg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_jpg.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_mp3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_mp3.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_mv.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_mv.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_pdf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_pdf.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_ppt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_ppt.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_psd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_psd.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_rar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_rar.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_txt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_txt.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_xls.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_xls.gif -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/themes/default/images/tangram-colorpicker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/themes/default/images/tangram-colorpicker.png -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhouit/Zblog/HEAD/src/main/webapp/resource/ueditor-1.4.3/dialogs/attachment/fileTypeImages/icon_default.png -------------------------------------------------------------------------------- /src/main/webapp/resource/js/ie6.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | $("#post_mask").css("height",$(document).height()); 3 | /* ie6 a设置display:block不能自动宽度*/ 4 | var width=$(".post_content:eq(0)").width()-2; 5 | $(".title a").css("width",width); 6 | }); -------------------------------------------------------------------------------- /src/main/webapp/resource/error/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 404 5 | 6 | 7 | 8 | 404 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/main/webapp/resource/error/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 500 5 | 6 | 7 | 8 | 500 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/freemarker/ftl/recent.html: -------------------------------------------------------------------------------- 1 |
2 |

近期文章

3 | 8 |
-------------------------------------------------------------------------------- /src/main/resources/jdbc.properties: -------------------------------------------------------------------------------- 1 | # Properties file for JDBC configuration 2 | # 3 | # Place this file in the root CLASSPATH 4 | jdbc.driverClassName=com.mysql.jdbc.Driver 5 | jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/zblog?characterEncoding\=UTF-8 6 | jdbc.username=root 7 | jdbc.password=12345 8 | -------------------------------------------------------------------------------- /src/main/webapp/resource/epiceditor-0.2.3/themes/editor/epic-light.css: -------------------------------------------------------------------------------- 1 | html { padding:10px; } 2 | 3 | body { 4 | border:0; 5 | background:#fcfcfc; 6 | font-family:monospace; 7 | font-size:14px; 8 | padding:10px; 9 | line-height:1.35em; 10 | margin:0; 11 | padding:0; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/freemarker/ftl/link.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/constants/CategoryConstants.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.constants; 2 | 3 | public class CategoryConstants{ 4 | private CategoryConstants(){ 5 | } 6 | 7 | /** 8 | * 顶级默认分类名称 9 | */ 10 | public static final String ROOT = "Root"; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/webapp/resource/error/unauthenticated.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | unauthenticated 5 | 6 | 7 | 8 | 未授权,请登录!!! 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/main/webapp/resource/epiceditor-0.2.3/themes/editor/epic-dark.css: -------------------------------------------------------------------------------- 1 | html { padding:10px; } 2 | 3 | body { 4 | border:0; 5 | background:rgb(41,41,41); 6 | font-family:monospace; 7 | font-size:14px; 8 | padding:10px; 9 | color:#ddd; 10 | line-height:1.35em; 11 | margin:0; 12 | padding:0; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/plugin/TreeItem.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.plugin; 2 | 3 | import java.util.Collection; 4 | 5 | public interface TreeItem { 6 | 7 | public String getId(); 8 | 9 | public String getParent(); 10 | 11 | public Collection getChildren(); 12 | 13 | public void addChild(T child); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/freemarker/ftl/archive.html: -------------------------------------------------------------------------------- 1 |
2 |

文章归档

3 | 8 |
-------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.mapper; 2 | 3 | import org.apache.ibatis.annotations.Param; 4 | 5 | import com.zblog.core.dal.entity.User; 6 | 7 | public interface UserMapper extends BaseMapper{ 8 | 9 | User loadByNameAndPass(@Param("username")String username,@Param("password")String password); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/freemarker/ftl/tagcloud.html: -------------------------------------------------------------------------------- 1 |
2 |

标签

3 |
4 | <#list tags as tag> 5 | ${tag.name} 7 | 8 |
9 |
-------------------------------------------------------------------------------- /src/main/resources/dic/stopword.dic: -------------------------------------------------------------------------------- 1 | a 2 | an 3 | and 4 | are 5 | as 6 | at 7 | be 8 | but 9 | by 10 | for 11 | if 12 | in 13 | into 14 | is 15 | it 16 | my 17 | no 18 | not 19 | of 20 | on 21 | or 22 | such 23 | that 24 | the 25 | their 26 | then 27 | there 28 | these 29 | they 30 | this 31 | to 32 | was 33 | will 34 | with 35 | 和 36 | 与 37 | 的 38 | 地 -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/mapper/OptionMapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.mapper; 2 | 3 | public interface OptionMapper extends BaseMapper{ 4 | 5 | String getOptionValue(String name); 6 | 7 | /** 8 | * 以select .. for update,注意此方法须在事务中执行 9 | * 10 | * @param name 11 | * @return 12 | */ 13 | String getOptionValueForUpdate(String name); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/resources/IKAnalyzer.cfg.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | IK Analyzer 扩展配置 5 | 8 | 9 | dic/stopword.dic; 10 | 11 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/mapper/TagMapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.mapper; 2 | 3 | import java.util.List; 4 | 5 | import com.zblog.core.dal.entity.Tag; 6 | 7 | public interface TagMapper extends BaseMapper{ 8 | 9 | public int insertBatch(List list); 10 | 11 | public int deleteByPostid(String postid); 12 | 13 | public List getTagsByPost(String postid); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/header.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/resource/js/backend/admin.upload.js: -------------------------------------------------------------------------------- 1 | zblog.register("zblog.upload"); 2 | 3 | zblog.upload.remove=function(uploadid){ 4 | $.ajax({ 5 | type:"DELETE", 6 | url:zblog.getDomainLink("uploads/"+uploadid), 7 | dataType:"json", 8 | success:function(data){ 9 | if(data&&data.success){ 10 | window.location.reload(); 11 | }else{ 12 | alert(data.msg); 13 | } 14 | } 15 | }); 16 | } -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/constants/CommentConstants.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.constants; 2 | 3 | public class CommentConstants{ 4 | private CommentConstants(){ 5 | } 6 | 7 | /* 评论状态 */ 8 | public static final String TYPE_WAIT = "wait"; 9 | public static final String TYPE_APPROVE = "approve"; 10 | public static final String TYPE_REJECT = "reject"; 11 | public static final String TYPE_TRASH = "trash"; 12 | } 13 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/footer.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 9 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/tag/FirstTag.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.tag; 2 | 3 | import javax.servlet.jsp.JspException; 4 | import javax.servlet.jsp.tagext.TagSupport; 5 | 6 | public class FirstTag extends AbstartTagSupport{ 7 | private static final long serialVersionUID = 1L; 8 | 9 | @Override 10 | public int doStartTag() throws JspException{ 11 | setPageAttribute(1); 12 | return TagSupport.EVAL_BODY_INCLUDE; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/help/help.css: -------------------------------------------------------------------------------- 1 | .wrapper{width: 370px;margin: 10px auto;zoom: 1;} 2 | .tabbody{height: 360px;} 3 | .tabbody .panel{width:100%;height: 360px;position: absolute;background: #fff;} 4 | .tabbody .panel h1{font-size:26px;margin: 5px 0 0 5px;} 5 | .tabbody .panel p{font-size:12px;margin: 5px 0 0 5px;} 6 | .tabbody table{width:90%;line-height: 20px;margin: 5px 0 0 5px;;} 7 | .tabbody table thead{font-weight: bold;line-height: 25px;} -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/entity/Tag.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.entity; 2 | 3 | public class Tag extends BaseEntity{ 4 | private String name; 5 | private String postid; 6 | 7 | public String getName(){ 8 | return name; 9 | } 10 | 11 | public void setName(String name){ 12 | this.name = name; 13 | } 14 | 15 | public String getPostid(){ 16 | return postid; 17 | } 18 | 19 | public void setPostid(String postid){ 20 | this.postid = postid; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/freemarker/FreeMarkerException.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service.freemarker; 2 | 3 | /** 4 | *

5 | * freemarker静态化异常 6 | *

7 | * 8 | * @author zhou 9 | * 10 | */ 11 | public class FreeMarkerException extends Exception{ 12 | private static final long serialVersionUID = 1L; 13 | 14 | public FreeMarkerException(String msg){ 15 | super(msg); 16 | } 17 | 18 | public FreeMarkerException(String msg, Throwable t){ 19 | super(msg, t); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/webapp/resource/js/backend/admin.link.js: -------------------------------------------------------------------------------- 1 | zblog.register("zblog.link"); 2 | 3 | zblog.link.remove=function(linkid){ 4 | $.ajax({ 5 | type:"DELETE", 6 | url:zblog.getDomainLink("links/"+linkid), 7 | dataType:"json", 8 | success:function(data){ 9 | if(data&&data.success){ 10 | window.location.reload(); 11 | }else{ 12 | alert(data.msg); 13 | } 14 | } 15 | }); 16 | } 17 | 18 | zblog.link.edit=function(linkid){ 19 | window.location.href=zblog.getDomainLink("links/edit?lid="+linkid); 20 | } -------------------------------------------------------------------------------- /src/main/webapp/resource/js/backend/admin.user.js: -------------------------------------------------------------------------------- 1 | zblog.register("zblog.user"); 2 | 3 | zblog.user.remove=function(userid){ 4 | $.ajax({ 5 | type:"DELETE", 6 | url:zblog.getDomainLink("users/"+userid), 7 | dataType:"json", 8 | success:function(data){ 9 | if(data&&data.success){ 10 | window.location.reload(); 11 | }else{ 12 | alert(data.msg); 13 | } 14 | } 15 | }); 16 | } 17 | 18 | zblog.user.edit=function(userid){ 19 | window.location.href=zblog.getDomainLink("users/edit?uid="+userid); 20 | } -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/validator/CategoryFormValidator.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form.validator; 2 | 3 | import com.zblog.core.dal.entity.Category; 4 | import com.zblog.core.plugin.JMap; 5 | import com.zblog.core.util.StringUtils; 6 | 7 | public class CategoryFormValidator{ 8 | 9 | public static JMap validateInsert(Category category){ 10 | JMap form = JMap.create(); 11 | if(StringUtils.isBlank(category.getName())){ 12 | form.put("msg", "分类名称不能为空"); 13 | } 14 | 15 | return form; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/lucene/LuceneException.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.lucene; 2 | import org.springframework.dao.DataAccessException; 3 | 4 | /** 5 | * Lucene索引操作异常,此处继承spring的dao异常 6 | * 7 | * @author zhou 8 | * 9 | */ 10 | public class LuceneException extends DataAccessException{ 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | public LuceneException(String msg){ 15 | super(msg); 16 | } 17 | 18 | public LuceneException(String msg, Throwable t){ 19 | super(msg, t); 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /src/main/webapp/resource/bootstrap-3.3.1/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/support/WebContextFactory.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.support; 2 | 3 | public class WebContextFactory{ 4 | 5 | private static final ThreadLocal WEB_CONTEXT_HOLDER = new ThreadLocal(); 6 | 7 | private WebContextFactory(){ 8 | } 9 | 10 | public static WebContext get(){ 11 | return WEB_CONTEXT_HOLDER.get(); 12 | } 13 | 14 | public static void set(WebContext context){ 15 | WEB_CONTEXT_HOLDER.set(context); 16 | } 17 | 18 | public static void remove(){ 19 | WEB_CONTEXT_HOLDER.set(null); 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/highcharts/modules/heatmap.js: -------------------------------------------------------------------------------- 1 | (function(b){var k=b.seriesTypes,l=b.each;k.heatmap=b.extendClass(k.map,{colorKey:"z",useMapGeometry:!1,pointArrayMap:["y","z"],translate:function(){var c=this,b=c.options,i=Number.MAX_VALUE,j=Number.MIN_VALUE;c.generatePoints();l(c.data,function(a){var e=a.x,f=a.y,d=a.z,g=(b.colsize||1)/2,h=(b.rowsize||1)/2;a.path=["M",e-g,f-h,"L",e+g,f-h,"L",e+g,f+h,"L",e-g,f+h,"Z"];a.shapeType="path";a.shapeArgs={d:c.translatePath(a.path)};typeof d==="number"&&(d>j?j=d:d model = getPagination().getModel(); 14 | 15 | if(model.getPageIndex() > 1){ 16 | setPageAttribute(model.getTotalPage()); 17 | return TagSupport.EVAL_BODY_INCLUDE; 18 | }else{ 19 | return TagSupport.SKIP_BODY; 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/tag/PrevTag.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.tag; 2 | 3 | import javax.servlet.jsp.JspException; 4 | import javax.servlet.jsp.tagext.TagSupport; 5 | 6 | import com.zblog.core.plugin.PageModel; 7 | 8 | public class PrevTag extends AbstartTagSupport{ 9 | private static final long serialVersionUID = 1L; 10 | 11 | @Override 12 | public int doStartTag() throws JspException{ 13 | PageModel model = getPagination().getModel(); 14 | 15 | if(model.getPageIndex() > 1){ 16 | setPageAttribute(model.getPageIndex() - 1); 17 | return TagSupport.EVAL_BODY_INCLUDE; 18 | }else{ 19 | return TagSupport.SKIP_BODY; 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/webapp/resource/zdialog/alert.js: -------------------------------------------------------------------------------- 1 | zdialog={ 2 | _create:function(){ 3 | var _mask=document.createElement("div"); 4 | _mask.setAttribute("class","alert_mask"); 5 | _mask.style.width = $(document).width()+"px"; 6 | _mask.style.height = $(document).height()+"px"; 7 | _mask.style.display = "block"; 8 | document.body.appendChild(_mask); 9 | }, 10 | show:function(id){ 11 | this._create(); 12 | var box=$("#"+id); 13 | box.css("top",($(window).height()-box.height())/2); 14 | box.css("left",($(window).width()-box.width())/2); 15 | box.show(); 16 | }, 17 | hide:function(id){ 18 | $(".alert_mask").remove(); 19 | $("#"+id).hide(); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/tag/NextTag.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.tag; 2 | 3 | import javax.servlet.jsp.JspException; 4 | import javax.servlet.jsp.tagext.TagSupport; 5 | 6 | import com.zblog.core.plugin.PageModel; 7 | 8 | public class NextTag extends AbstartTagSupport{ 9 | private static final long serialVersionUID = 1L; 10 | 11 | @Override 12 | public int doStartTag() throws JspException{ 13 | PageModel model = getPagination().getModel(); 14 | 15 | if(model.getPageIndex() < model.getTotalPage()){ 16 | setPageAttribute(model.getPageIndex() + 1); 17 | return TagSupport.EVAL_BODY_INCLUDE; 18 | }else{ 19 | return TagSupport.SKIP_BODY; 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/webuploader/webuploader.css: -------------------------------------------------------------------------------- 1 | .webuploader-container { 2 | position: relative; 3 | } 4 | .webuploader-element-invisible { 5 | position: absolute !important; 6 | clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ 7 | clip: rect(1px,1px,1px,1px); 8 | } 9 | .webuploader-pick { 10 | position: relative; 11 | display: inline-block; 12 | cursor: pointer; 13 | background: #00b7ee; 14 | padding: 10px 15px; 15 | color: #fff; 16 | text-align: center; 17 | border-radius: 3px; 18 | overflow: hidden; 19 | } 20 | .webuploader-pick-hover { 21 | background: #00a2d4; 22 | } 23 | 24 | .webuploader-pick-disable { 25 | opacity: 0.6; 26 | pointer-events:none; 27 | } 28 | 29 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/listener/InitApplicationListener.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.listener; 2 | 3 | import javax.servlet.ServletContextEvent; 4 | import javax.servlet.ServletContextListener; 5 | 6 | import com.zblog.core.WebConstants; 7 | 8 | public class InitApplicationListener implements ServletContextListener{ 9 | 10 | @Override 11 | public void contextInitialized(ServletContextEvent sce){ 12 | WebConstants.APPLICATION_PATH = sce.getServletContext().getRealPath("/"); 13 | /* 给log4j设置环境变量,必须要在jvm加载log4j.properties前设置 */ 14 | System.setProperty("log4jHome", WebConstants.APPLICATION_PATH); 15 | } 16 | 17 | @Override 18 | public void contextDestroyed(ServletContextEvent sce){ 19 | 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/resources/mybatis/OptionMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 14 | 15 | 16 | replace into options(id, name, value) values (#{id}, #{name}, #{value}) 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/UrlUtil.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import java.io.UnsupportedEncodingException; 4 | import java.net.URLDecoder; 5 | import java.net.URLEncoder; 6 | 7 | import com.zblog.core.Constants; 8 | 9 | public class UrlUtil{ 10 | 11 | public static String encode(String url){ 12 | try{ 13 | return URLEncoder.encode(url, Constants.ENCODING_UTF_8.name()); 14 | }catch(UnsupportedEncodingException e){ 15 | return url; 16 | } 17 | } 18 | 19 | public static String decode(String url){ 20 | try{ 21 | return URLDecoder.decode(url, Constants.ENCODING_UTF_8.name()); 22 | }catch(UnsupportedEncodingException e){ 23 | return url; 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/mapper/UploadMapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import com.zblog.core.dal.entity.Upload; 8 | 9 | public interface UploadMapper extends BaseMapper{ 10 | 11 | List listByPostid(String postid); 12 | 13 | /** 14 | * 更新上传文件记录对应的文章ID 15 | * 16 | * @param postid 17 | * @param imgpaths 18 | * @return 19 | */ 20 | public int updatePostid(@Param("postid") String postid, @Param("imgpaths") List imgpaths); 21 | 22 | /** 23 | * 将所有postid的记录置空,非删除记录 24 | * 25 | * @param postid 26 | */ 27 | public void setNullPostid(String postid); 28 | 29 | public int deleteByPostid(String postid); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/vo/PageVO.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service.vo; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.zblog.core.dal.entity.Post; 7 | import com.zblog.core.plugin.TreeItem; 8 | 9 | /** 10 | * 页面业务对象 11 | * 12 | * @author zhou 13 | * 14 | */ 15 | public class PageVO extends Post implements TreeItem{ 16 | private List children; 17 | 18 | public void setChildren(List children){ 19 | this.children = children; 20 | } 21 | 22 | @Override 23 | public List getChildren(){ 24 | return children; 25 | } 26 | 27 | @Override 28 | public void addChild(PageVO comment){ 29 | if(children == null) 30 | setChildren(new ArrayList()); 31 | 32 | getChildren().add(comment); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/validator/MailFormValidator.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form.validator; 2 | 3 | import com.zblog.core.plugin.JMap; 4 | import com.zblog.core.util.StringUtils; 5 | import com.zblog.web.backend.form.MailOption; 6 | 7 | public class MailFormValidator{ 8 | 9 | public static JMap validate(MailOption form){ 10 | JMap result = JMap.create(); 11 | if(StringUtils.isBlank(form.getHost())){ 12 | result.put("host", "请输入host"); 13 | } 14 | 15 | if(form.getPort() < 10){ 16 | result.put("port", "请输入合法端口号"); 17 | } 18 | 19 | if(StringUtils.isBlank(form.getUsername())){ 20 | result.put("username", "请输入用户名"); 21 | } 22 | 23 | if(StringUtils.isBlank(form.getPassword())){ 24 | result.put("password", "请输入密码"); 25 | } 26 | 27 | return result; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/webapp/resource/js/backend/admin.comment.js: -------------------------------------------------------------------------------- 1 | zblog.register("zblog.comment"); 2 | 3 | zblog.comment.remove=function(commentid){ 4 | $.ajax({ 5 | type:"DELETE", 6 | url:zblog.getDomainLink("comments/"+commentid), 7 | dataType:"json", 8 | success:function(data){ 9 | if(data&&data.success){ 10 | window.location.reload(); 11 | }else{ 12 | alert(data.msg); 13 | } 14 | } 15 | }); 16 | } 17 | 18 | zblog.comment.approve=function(commentid,status){ 19 | $.ajax({ 20 | type:"PUT", 21 | url:zblog.getDomainLink("comments/"+commentid), 22 | dataType:"json", 23 | data:{'status':status}, 24 | success:function(data){ 25 | if(data&&data.success){ 26 | window.location.reload(); 27 | }else{ 28 | alert(data.msg); 29 | } 30 | } 31 | }); 32 | } -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/LinkService.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.zblog.core.dal.entity.Link; 7 | import com.zblog.core.dal.mapper.BaseMapper; 8 | import com.zblog.core.dal.mapper.LinkMapper; 9 | import com.zblog.core.plugin.PageModel; 10 | 11 | @Service 12 | public class LinkService extends BaseService{ 13 | @Autowired 14 | private LinkMapper linkMapper; 15 | 16 | public PageModel list(int pageIndex,int pageSize){ 17 | PageModel pageModel=new PageModel<>(pageIndex, pageSize); 18 | list(pageModel); 19 | 20 | return pageModel; 21 | } 22 | 23 | @Override 24 | protected BaseMapper getMapper(){ 25 | return linkMapper; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/entity/Upload.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.entity; 2 | 3 | /** 4 | * 文章、页面的元数据,如文章包含的图片等待 5 | * 6 | * @author zhou 7 | * 8 | */ 9 | public class Upload extends BaseEntity{ 10 | /* 对应文章id */ 11 | private String postid; 12 | /* 图片名称 */ 13 | private String name; 14 | /* 图片访问路径 */ 15 | private String path; 16 | 17 | public String getPostid(){ 18 | return postid; 19 | } 20 | 21 | public void setPostid(String postid){ 22 | this.postid = postid; 23 | } 24 | 25 | public String getName(){ 26 | return name; 27 | } 28 | 29 | public void setName(String name){ 30 | this.name = name; 31 | } 32 | 33 | public String getPath(){ 34 | return path; 35 | } 36 | 37 | public void setPath(String path){ 38 | this.path = path; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/mapper/CommentMapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import com.zblog.core.plugin.JMap; 8 | import com.zblog.service.vo.CommentVO; 9 | 10 | public interface CommentMapper extends BaseMapper{ 11 | 12 | List listRecent(); 13 | 14 | List listCountByGroupStatus(); 15 | 16 | /** 17 | * 根据postid获取被批准的评论和指定creator的评论 18 | * 19 | * @param postid 20 | * @param creator 21 | * @return 22 | */ 23 | List listByPost(@Param("postid") String postid, @Param("creator") String creator); 24 | 25 | /** 26 | * 更改comment的状态 27 | * 28 | * @param commentid 29 | */ 30 | int setStatus(@Param("commentid") String commentid, @Param("status") String status); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/MailOption.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form; 2 | 3 | public class MailOption{ 4 | private String host; 5 | private int port; 6 | private String username; 7 | private String password; 8 | 9 | public String getHost(){ 10 | return host; 11 | } 12 | 13 | public void setHost(String host){ 14 | this.host = host; 15 | } 16 | 17 | public int getPort(){ 18 | return port; 19 | } 20 | 21 | public void setPort(int port){ 22 | this.port = port; 23 | } 24 | 25 | public String getUsername(){ 26 | return username; 27 | } 28 | 29 | public void setUsername(String username){ 30 | this.username = username; 31 | } 32 | 33 | public String getPassword(){ 34 | return password; 35 | } 36 | 37 | public void setPassword(String password){ 38 | this.password = password; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/mapper/BaseMapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.mapper; 2 | 3 | import java.util.List; 4 | 5 | import com.zblog.core.plugin.PageModel; 6 | 7 | public interface BaseMapper{ 8 | 9 | /** 10 | * 新增记录 11 | * 12 | * @param t 13 | */ 14 | public int insert(T t); 15 | 16 | /** 17 | * 根据ID查询记录 18 | * 19 | * @param id 20 | * @return 21 | */ 22 | public T loadById(String id); 23 | 24 | public List list(PageModel model); 25 | 26 | public List list(); 27 | 28 | /** 29 | * 根据ID删除记录 30 | * 31 | * @param id 32 | */ 33 | public int deleteById(String id); 34 | 35 | /** 36 | * 更新记录 37 | * 38 | * @param t 39 | */ 40 | public int update(T t); 41 | 42 | /** 43 | * 获取记录总数 44 | */ 45 | public long count(); 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/vo/MailVO.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service.vo; 2 | 3 | import java.util.List; 4 | 5 | public class MailVO{ 6 | private String from; 7 | private List to; 8 | private String subject; 9 | private String content; 10 | 11 | public String getFrom(){ 12 | return from; 13 | } 14 | 15 | public void setFrom(String from){ 16 | this.from = from; 17 | } 18 | 19 | public List getTo(){ 20 | return to; 21 | } 22 | 23 | public void setTo(List to){ 24 | this.to = to; 25 | } 26 | 27 | public String getSubject(){ 28 | return subject; 29 | } 30 | 31 | public void setSubject(String subject){ 32 | this.subject = subject; 33 | } 34 | 35 | public String getContent(){ 36 | return content; 37 | } 38 | 39 | public void setContent(String content){ 40 | this.content = content; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/backend/common/pagination.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib prefix="page" uri="/WEB-INF/tld/pagination.tld" %> 2 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 3 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/Constants.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core; 2 | 3 | import java.nio.charset.Charset; 4 | import java.nio.charset.StandardCharsets; 5 | import java.util.Locale; 6 | 7 | public final class Constants{ 8 | private Constants(){ 9 | } 10 | 11 | /** 12 | * 程序默认字符集 13 | */ 14 | public static final Charset ENCODING_UTF_8 = StandardCharsets.UTF_8; 15 | /** 16 | * 定义统一Locale.CHINA,程序中所有和Locale相关操作均默认使用此Locale 17 | */ 18 | public static final Locale LOCALE_CHINA = Locale.CHINA; 19 | 20 | public static final String COOKIE_CONTEXT_ID = "c_id"; 21 | public static final String COOKIE_USER_NAME = "un"; 22 | 23 | /** 24 | * csrf表单提交token名称 25 | */ 26 | public static final String CSRF_TOKEN = "CSRFToken"; 27 | /** 28 | * csrf的cookie名称 29 | */ 30 | public static final String COOKIE_CSRF_TOKEN = "x-csrf-token"; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/entity/Category.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.entity; 2 | 3 | public class Category extends BaseEntity{ 4 | private String name; 5 | private int leftv; 6 | private int rightv; 7 | /* 是否显示 */ 8 | private boolean visible = true; 9 | 10 | public String getName(){ 11 | return name; 12 | } 13 | 14 | public void setName(String name){ 15 | this.name = name; 16 | } 17 | 18 | public int getLeftv(){ 19 | return leftv; 20 | } 21 | 22 | public void setLeftv(int leftv){ 23 | this.leftv = leftv; 24 | } 25 | 26 | public int getRightv(){ 27 | return rightv; 28 | } 29 | 30 | public void setRightv(int rightv){ 31 | this.rightv = rightv; 32 | } 33 | 34 | public boolean isVisible(){ 35 | return visible; 36 | } 37 | 38 | public void setVisible(boolean visible){ 39 | this.visible = visible; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/vo/PostVO.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service.vo; 2 | 3 | import java.util.List; 4 | 5 | import com.zblog.core.dal.entity.Category; 6 | import com.zblog.core.dal.entity.Post; 7 | import com.zblog.core.dal.entity.User; 8 | 9 | /** 10 | * 文章业务对象 11 | * 12 | * @author zhou 13 | * 14 | */ 15 | public class PostVO extends Post{ 16 | private User user; 17 | private Category category; 18 | private List tags; 19 | 20 | public User getUser(){ 21 | return user; 22 | } 23 | 24 | public void setUser(User user){ 25 | this.user = user; 26 | } 27 | 28 | public Category getCategory(){ 29 | return category; 30 | } 31 | 32 | public void setCategory(Category category){ 33 | this.category = category; 34 | } 35 | 36 | public List getTags(){ 37 | return tags; 38 | } 39 | 40 | public void setTags(List tags){ 41 | this.tags = tags; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/entity/Link.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.entity; 2 | 3 | public class Link extends BaseEntity{ 4 | private String name; 5 | private String url; 6 | /* 注释 */ 7 | private String notes; 8 | /* 可见性 */ 9 | private boolean visible = true; 10 | 11 | public String getName(){ 12 | return name; 13 | } 14 | 15 | public void setName(String name){ 16 | this.name = name; 17 | } 18 | 19 | public String getUrl(){ 20 | return url; 21 | } 22 | 23 | public void setUrl(String url){ 24 | this.url = url; 25 | } 26 | 27 | public String getNotes(){ 28 | return notes; 29 | } 30 | 31 | public void setNotes(String notes){ 32 | this.notes = notes; 33 | } 34 | 35 | public boolean isVisible(){ 36 | return visible; 37 | } 38 | 39 | public void setVisible(boolean visible){ 40 | this.visible = visible; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/entity/Option.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.entity; 2 | 3 | /** 4 | * 站点选项,id和name为一致 5 | * 6 | * @author zhou 7 | * 8 | */ 9 | public class Option extends BaseEntity{ 10 | private String id; 11 | private String name; 12 | private String value; 13 | 14 | public Option(){ 15 | } 16 | 17 | public Option(String name, String value){ 18 | this.name = name; 19 | this.value = value; 20 | } 21 | 22 | public String getId(){ 23 | return id; 24 | } 25 | 26 | public void setId(String id){ 27 | this.id = id; 28 | } 29 | 30 | public String getName(){ 31 | return name; 32 | } 33 | 34 | public void setName(String name){ 35 | this.name = name; 36 | } 37 | 38 | public String getValue(){ 39 | return value; 40 | } 41 | 42 | public void setValue(String value){ 43 | this.value = value; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/validator/LinkFormValidator.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form.validator; 2 | 3 | import com.zblog.core.dal.entity.Link; 4 | import com.zblog.core.plugin.JMap; 5 | import com.zblog.core.util.CommRegular; 6 | import com.zblog.core.util.StringUtils; 7 | 8 | public class LinkFormValidator{ 9 | 10 | public static JMap validateInsert(Link link){ 11 | JMap form = JMap.create(); 12 | if(StringUtils.isBlank(link.getName())){ 13 | form.put("name", "需填写链接名称"); 14 | }else if(StringUtils.isBlank(link.getUrl()) || !link.getUrl().matches(CommRegular.DOMAIN)){ 15 | form.put("url", "链接格式不正确"); 16 | } 17 | 18 | return form; 19 | } 20 | 21 | public static JMap validateUpdate(Link link){ 22 | JMap form = validateInsert(link); 23 | if(StringUtils.isBlank(link.getId())){ 24 | form.put("msg", "ID不合法"); 25 | } 26 | 27 | return form; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.zblog.core.dal.entity.User; 7 | import com.zblog.core.dal.mapper.BaseMapper; 8 | import com.zblog.core.dal.mapper.UserMapper; 9 | import com.zblog.core.plugin.PageModel; 10 | 11 | @Service 12 | public class UserService extends BaseService{ 13 | @Autowired 14 | private UserMapper userMapper; 15 | 16 | public PageModel list(int pageIndex, int pageSize){ 17 | PageModel page = new PageModel<>(pageIndex, pageSize); 18 | super.list(page); 19 | return page; 20 | } 21 | 22 | public User login(String username,String password){ 23 | return userMapper.loadByNameAndPass(username, password); 24 | } 25 | 26 | @Override 27 | protected BaseMapper getMapper(){ 28 | return userMapper; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/entity/BaseEntity.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.entity; 2 | 3 | import java.util.Date; 4 | 5 | public class BaseEntity{ 6 | private String id; 7 | private Date createTime; 8 | private String creator; 9 | private Date lastUpdate; 10 | 11 | public String getId(){ 12 | return id; 13 | } 14 | 15 | public void setId(String id){ 16 | this.id = id; 17 | } 18 | 19 | public Date getCreateTime(){ 20 | return createTime; 21 | } 22 | 23 | public void setCreateTime(Date createTime){ 24 | this.createTime = createTime; 25 | } 26 | 27 | public String getCreator(){ 28 | return creator; 29 | } 30 | 31 | public void setCreator(String creator){ 32 | this.creator = creator; 33 | } 34 | 35 | public Date getLastUpdate(){ 36 | return lastUpdate; 37 | } 38 | 39 | public void setLastUpdate(Date lastUpdate){ 40 | this.lastUpdate = lastUpdate; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/spechars/spechars.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 |
17 |
18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/CollectionUtils.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import java.util.Collection; 4 | import java.util.Map; 5 | import java.util.Objects; 6 | 7 | public class CollectionUtils{ 8 | 9 | private CollectionUtils(){ 10 | } 11 | 12 | public static boolean isEmpty(Collection collect){ 13 | return collect == null || collect.isEmpty(); 14 | } 15 | 16 | public static boolean isEmpty(Map map){ 17 | return (map == null) || map.isEmpty(); 18 | } 19 | 20 | public static boolean isEmpty(T[] array){ 21 | return array == null || array.length == 0; 22 | } 23 | 24 | public static K getKeyByValue(Map map, V value){ 25 | K result = null; 26 | for(Map.Entry entry : map.entrySet()){ 27 | if(Objects.equals(entry.getValue(), value)){ 28 | result = entry.getKey(); 29 | break; 30 | } 31 | } 32 | 33 | return result; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/tag/AbstartTagSupport.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.tag; 2 | 3 | import javax.servlet.jsp.JspException; 4 | import javax.servlet.jsp.tagext.TagSupport; 5 | 6 | abstract class AbstartTagSupport extends TagSupport{ 7 | private static final long serialVersionUID = 1L; 8 | 9 | protected void setPageAttribute(int pageNumber){ 10 | 11 | pageContext.setAttribute("pageNumber", pageNumber); 12 | pageContext.setAttribute("pageUrl", getPagination().getPageUrl() + pageNumber); 13 | } 14 | 15 | protected void clearPageAttribute(){ 16 | pageContext.removeAttribute("pageNumber"); 17 | pageContext.removeAttribute("pageUrl"); 18 | } 19 | 20 | @Override 21 | public int doEndTag() throws JspException{ 22 | clearPageAttribute(); 23 | return super.doEndTag(); 24 | } 25 | 26 | protected Pagination getPagination(){ 27 | return (Pagination) findAncestorWithClass(this, Pagination.class); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/WebConstants.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core; 2 | 3 | public class WebConstants{ 4 | private WebConstants(){ 5 | } 6 | 7 | /** 8 | * 站点标题前缀 9 | */ 10 | public static final String PRE_TITLE_KEY = "ptitle"; 11 | 12 | public static String APPLICATION_PATH; 13 | public static final String PREFIX = "/WEB-INF/jsp/"; 14 | private static String DOMAIN; 15 | 16 | /** 17 | * 以/backend开头,非/login结尾 18 | */ 19 | static final String BACKEND_URL = "^/backend.*(? list(); 14 | 15 | Category loadByName(String name); 16 | 17 | /** 18 | * 获取指定分类的子分类 19 | * 20 | * @param category 21 | * @return 22 | */ 23 | List loadChildren(Category category); 24 | 25 | void updateInsertLeftv(int rightv); 26 | 27 | void updateInsertRightv(int rightv); 28 | 29 | void delete(@Param("leftv") int leftv, @Param("rightv") int rightv); 30 | 31 | void updateDeleteLeftv(@Param("leftv") int leftv, @Param("length") int length); 32 | 33 | void updateDeleteRightv(@Param("rightv") int rightv, @Param("length") int length); 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/PostOption.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form; 2 | 3 | /** 4 | * 文章设置表单 5 | * 6 | * @author zhou 7 | * 8 | */ 9 | public class PostOption{ 10 | /** 11 | * 博客页面至多显示数 12 | */ 13 | private int maxshow; 14 | /** 15 | * 允许文章评论 16 | */ 17 | private boolean allowComment; 18 | /** 19 | * 默认文章分类 20 | */ 21 | private String defaultCategory; 22 | 23 | public int getMaxshow(){ 24 | return maxshow; 25 | } 26 | 27 | public void setMaxshow(int maxshow){ 28 | this.maxshow = maxshow; 29 | } 30 | 31 | public boolean isAllowComment(){ 32 | return allowComment; 33 | } 34 | 35 | public void setAllowComment(boolean allowComment){ 36 | this.allowComment= allowComment; 37 | } 38 | 39 | public String getDefaultCategory(){ 40 | return defaultCategory; 41 | } 42 | 43 | public void setDefaultCategory(String defaultCategory){ 44 | this.defaultCategory = defaultCategory; 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/constants/OptionConstants.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.constants; 2 | 3 | public final class OptionConstants{ 4 | private OptionConstants(){ 5 | } 6 | 7 | /** 8 | * 站点标题 9 | */ 10 | public static final String TITLE = "title"; 11 | /** 12 | * 站点副标题 13 | */ 14 | public static final String SUBTITLE = "subtitle"; 15 | /** 16 | * 站点描述 17 | */ 18 | public static final String DESCRIPTION = "description"; 19 | /** 20 | * 站点关键字 21 | */ 22 | public static final String KEYWORDS = "keywords"; 23 | 24 | /** 25 | * 前台每个页面最多显示数 26 | */ 27 | public static final String MAXSHOW = "post_maxshow"; 28 | /** 29 | * 文章默认分类ID 30 | */ 31 | public static final String DEFAULT_CATEGORY_ID = "post_defaultCategory"; 32 | /** 33 | * 是否允许文章评论 34 | */ 35 | public static final String ALLOW_COMMENT = "post_allowComment"; 36 | 37 | /** 38 | * 文章ID生产机制 39 | */ 40 | public static final String POSTID = "postid"; 41 | 42 | } 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Zblog 2 | ======= 3 | 4 | a java blog 5 | --------------- 6 | 7 | ### 核心功能 8 | 1. 文章/页面发布、分类、统计阅读次数。 9 | 2. 提供文章形式的RSS聚合。 10 | 3. 提供链接的添加、归类功能。 11 | 4. 附件上传添加管理功能。 12 | 5. 评论的管理,垃圾信息过滤功能。 13 | 6. 文章静态html页面生成。 14 | 7. 会员注册登录,后台管理功能。 15 | 8. lucene实现的站内搜索。 16 | 9. 防xss、csrf攻击。 17 | 10. 支持metaWeblog Api(支持windows live writer等离线博客编写) 18 | 11. WordPress站点xml文件导入功能(支持文章、附件及标签) 19 | 12. 文章标签tag功能、私密文章支持、文章归档 20 | 13. 文章markdown/富文本编辑支持、快速编辑 21 | 14. 响应式布局支持 22 | 23 | #### TODO 24 | * 评论邮件提醒、近期评论 25 | 26 | ### 技术选型 27 | 28 | #### 后端 29 | * Ioc容器 Spring 30 | * Web框架 SpringMVC 31 | * Orm框架 MyBatis 32 | * 安全权限 Shiro 33 | * 搜索工具 Lucene 34 | * 缓存 Ehcache 35 | * 静态化 FreeMarker 36 | * 视图模板 Jsp/Jstl/JspTaglib 37 | * 其它 Jsoup(xss过滤)、fastjson、IKAnalyzer 38 | 39 | #### 前端 40 | * jQuery js框架 41 | * Bootstrap 后台界面 42 | * UEditor/EpicEditor 编辑器 43 | * WebUploader 文件上传 44 | * font-wesome/icomoon.io 字体/图标 45 | 46 | ### 支持浏览器 47 | * 前台 ie6+ 48 | * 后台 chrome/firefox/ie9+ 49 | 50 | ### 作者博客 51 | (http://www.zhouhaocheng.cn) -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/vo/CommentVO.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service.vo; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import com.zblog.core.dal.entity.Comment; 7 | import com.zblog.core.dal.entity.Post; 8 | import com.zblog.core.plugin.TreeItem; 9 | 10 | /** 11 | * 评论业务对象 12 | * 13 | * @author zhou 14 | * 15 | */ 16 | public class CommentVO extends Comment implements TreeItem{ 17 | private Post post; 18 | private List children; 19 | 20 | public Post getPost(){ 21 | return post; 22 | } 23 | 24 | public void setPost(Post post){ 25 | this.post = post; 26 | } 27 | 28 | public void setChildren(List children){ 29 | this.children = children; 30 | } 31 | 32 | @Override 33 | public List getChildren(){ 34 | return children; 35 | } 36 | 37 | @Override 38 | public void addChild(CommentVO comment){ 39 | if(children == null) 40 | setChildren(new ArrayList()); 41 | 42 | getChildren().add(comment); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/constants/PostConstants.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.constants; 2 | 3 | public class PostConstants{ 4 | private PostConstants(){ 5 | } 6 | 7 | /* 文章类型 */ 8 | public static final String TYPE_POST = "post"; 9 | public static final String TYPE_PAGE = "page"; 10 | /* 文章评论状态 */ 11 | public static final String COMMENT_OPEN = "open"; 12 | public static final String COMMENT_CLOSE = "close"; 13 | /* 文章状态,发布、回收站 */ 14 | public static final String POST_PUBLISH = "publish"; 15 | public static final String POST_SECRET = "secret"; 16 | public static final String POST_TRASH = "trash"; 17 | 18 | /* 所有创建者 */ 19 | public static final String POST_CREATOR_ALL = "all"; 20 | 21 | /** 22 | * 默认文章的parent 23 | */ 24 | public static final String DEFAULT_PARENT = "Root"; 25 | 26 | /* 文章摘要长度 (此为post表中excerpt的varchar(350)) */ 27 | public static final int EXCERPT_LENGTH = 350; 28 | 29 | /** 30 | * 初始化postid 31 | */ 32 | public static final int INIT_POST_ID = 5; 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/TagService.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.zblog.core.dal.entity.Tag; 9 | import com.zblog.core.dal.mapper.BaseMapper; 10 | import com.zblog.core.dal.mapper.TagMapper; 11 | 12 | @Service 13 | public class TagService extends BaseService{ 14 | @Autowired 15 | private TagMapper tagMapper; 16 | 17 | public List listTagsByPost(String postid){ 18 | return tagMapper.getTagsByPost(postid); 19 | } 20 | 21 | /** 22 | * 插入文章标签记录 23 | * 24 | * @param tag 25 | * @return 26 | */ 27 | public int insertBatch(List tags){ 28 | return tagMapper.insertBatch(tags); 29 | } 30 | 31 | public int deleteByPostid(String postid){ 32 | return tagMapper.deleteByPostid(postid); 33 | } 34 | 35 | @Override 36 | protected BaseMapper getMapper(){ 37 | return tagMapper; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/table/edittip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 表格删除提示 5 | 6 | 17 | 18 | 19 |
20 |
21 | 22 |
23 |
24 | 25 |
26 |
27 | 32 | 33 | -------------------------------------------------------------------------------- /src/main/resources/mybatis/LinkMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 12 | 13 | 14 | insert into link(id,name,url,notes,visible,creator,createTime) 15 | values(#{id}, #{name}, #{url}, #{notes}, #{visible}, #{creator}, #{createTime}) 16 | 17 | 18 | 19 | update link set name=#{name},url=#{url},notes=#{notes} where id=#{id} 20 | 21 | 22 | 23 | delete from link where id = #{id} 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/support/ServletRequestReaderArgumentsResolver.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.support; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | import org.springframework.core.MethodParameter; 6 | import org.springframework.web.bind.support.WebDataBinderFactory; 7 | import org.springframework.web.context.request.NativeWebRequest; 8 | import org.springframework.web.method.support.HandlerMethodArgumentResolver; 9 | import org.springframework.web.method.support.ModelAndViewContainer; 10 | 11 | public class ServletRequestReaderArgumentsResolver implements HandlerMethodArgumentResolver{ 12 | 13 | @Override 14 | public boolean supportsParameter(MethodParameter parameter){ 15 | return parameter.getParameterType() == ServletRequestReader.class; 16 | } 17 | 18 | @Override 19 | public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, 20 | NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception{ 21 | return new ServletRequestReader(webRequest.getNativeRequest(HttpServletRequest.class)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/template/template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 |
12 |
13 | 14 |
15 |
16 |
17 |
18 | 19 |
20 |
21 |
22 |
23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/BaseService.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service; 2 | 3 | import java.util.List; 4 | 5 | import com.zblog.core.dal.entity.BaseEntity; 6 | import com.zblog.core.dal.mapper.BaseMapper; 7 | import com.zblog.core.plugin.PageModel; 8 | 9 | public abstract class BaseService{ 10 | 11 | public int insert(T t){ 12 | return getMapper().insert(t); 13 | } 14 | 15 | public T loadById(String id){ 16 | return getMapper().loadById(id); 17 | } 18 | 19 | public void list(PageModel model){ 20 | List result = getMapper().list(model); 21 | model.setContent(result); 22 | } 23 | 24 | public List list(){ 25 | return getMapper().list(); 26 | } 27 | 28 | public int update(T t){ 29 | return getMapper().update(t); 30 | } 31 | 32 | public int deleteById(String id){ 33 | return getMapper().deleteById(id); 34 | } 35 | 36 | public long count(){ 37 | return getMapper().count(); 38 | } 39 | 40 | protected abstract BaseMapper getMapper(); 41 | } -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/backend/common/bootstrap.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | ${g.title} Admin 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/lucene/DocConverter.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.lucene; 2 | 3 | import java.util.Arrays; 4 | import java.util.Collection; 5 | 6 | import org.apache.lucene.document.Document; 7 | import org.apache.lucene.index.IndexableField; 8 | 9 | import com.zblog.core.plugin.JMap; 10 | 11 | public class DocConverter{ 12 | 13 | private DocConverter(){ 14 | } 15 | 16 | public static JMap convert(Document obj){ 17 | JMap mc = JMap.create(); 18 | for(IndexableField field : obj.getFields()){ 19 | mc.put(field.name(), field.stringValue()); 20 | } 21 | 22 | return mc; 23 | } 24 | 25 | public static JMap convert(Document obj, String... filters){ 26 | return convert(obj, Arrays.asList(filters)); 27 | } 28 | 29 | public static JMap convert(Document obj, Collection filters){ 30 | JMap mc = JMap.create(); 31 | for(IndexableField field : obj.getFields()){ 32 | if(filters.contains(field.name())) 33 | continue; 34 | mc.put(field.name(), field.stringValue()); 35 | } 36 | 37 | return mc; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/IpUtils.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 5 | class IpUtils{ 6 | 7 | private IpUtils(){ 8 | } 9 | 10 | /** 11 | * 获取客户端真实IP 12 | * 13 | * @param request 14 | */ 15 | public static String getIp(HttpServletRequest request){ 16 | String ip = request.getHeader("x-forwarded-for"); 17 | if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 18 | ip = request.getHeader("Proxy-Client-IP"); 19 | } 20 | if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 21 | ip = request.getHeader("WL-Proxy-Client-IP"); 22 | } 23 | if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 24 | ip = request.getHeader("X-Real-IP"); 25 | } 26 | if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){ 27 | ip = request.getRemoteAddr(); 28 | } 29 | 30 | // 多级反向代理检测 31 | if(ip != null && ip.indexOf(",") > 0){ 32 | ip = ip.trim().split(",")[0]; 33 | } 34 | 35 | return ip; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/music/music.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 插入音乐 6 | 7 | 8 | 9 | 10 |
11 | 15 |
16 | 17 |
18 |
19 |
20 |
21 | 22 | 31 | 32 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/IdGenerator.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import java.util.UUID; 4 | 5 | public class IdGenerator{ 6 | 7 | private IdGenerator(){ 8 | } 9 | 10 | private static String digits(long val, int digits){ 11 | long hi = 1L << (digits * 4); 12 | return NumberUtils.toString(hi | (val & (hi - 1)), NumberUtils.MAX_RADIX).substring(1); 13 | } 14 | 15 | /** 16 | * 以62进制(字母加数字)生成19位UUID,最短的UUID 17 | * 18 | * @return 19 | */ 20 | public static String uuid19(){ 21 | UUID uuid = UUID.randomUUID(); 22 | StringBuilder sb = new StringBuilder(); 23 | sb.append(digits(uuid.getMostSignificantBits() >> 32, 8)); 24 | sb.append(digits(uuid.getMostSignificantBits() >> 16, 4)); 25 | sb.append(digits(uuid.getMostSignificantBits(), 4)); 26 | sb.append(digits(uuid.getLeastSignificantBits() >> 48, 4)); 27 | sb.append(digits(uuid.getLeastSignificantBits(), 12)); 28 | return sb.toString(); 29 | } 30 | 31 | public static String uuid32(){ 32 | UUID uuid = UUID.randomUUID(); 33 | return uuid.toString().replaceAll("-", ""); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/template/template.css: -------------------------------------------------------------------------------- 1 | .wrap{ padding: 5px;font-size: 14px;} 2 | .left{width:425px;float: left;} 3 | .right{width:160px;border: 1px solid #ccc;float: right;padding: 5px;margin-right: 5px;} 4 | .right .pre{height: 332px;overflow-y: auto;} 5 | .right .preitem{border: white 1px solid;margin: 5px 0;padding: 2px 0;} 6 | .right .preitem:hover{background-color: lemonChiffon;cursor: pointer;border: #ccc 1px solid;} 7 | .right .preitem img{display: block;margin: 0 auto;width:100px;} 8 | .clear{clear: both;} 9 | .top{height:26px;line-height: 26px;padding: 5px;} 10 | .bottom{height:320px;width:100%;margin: 0 auto;} 11 | .transparent{ background: url("images/bg.gif") repeat;} 12 | .bottom table tr td{border:1px dashed #ccc;} 13 | #colorPicker{width: 17px;height: 17px;border: 1px solid #CCC;display: inline-block;border-radius: 3px;box-shadow: 2px 2px 5px #D3D6DA;} 14 | .border_style1{padding:2px;border: 1px solid #ccc;border-radius: 5px;box-shadow:2px 2px 5px #d3d6da;} 15 | p{margin: 5px 0} 16 | table{clear:both;margin-bottom:10px;border-collapse:collapse;word-break:break-all;} 17 | li{clear:both} 18 | ol{padding-left:40px; } -------------------------------------------------------------------------------- /src/main/resources/mybatis/TagMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 13 | 14 | 15 | insert into tag(id,name,postid,createTime) values 16 | 17 | (#{item.id}, #{item.name}, #{item.postid}, #{item.createTime}) 18 | 19 | 20 | 21 | 22 | delete from tag where postid=#{postid} 23 | 24 | 25 | 26 | delete from tag where id=#{id} 27 | 28 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/validator/LoginFormValidator.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form.validator; 2 | 3 | import com.zblog.core.plugin.JMap; 4 | import com.zblog.core.util.CommRegular; 5 | import com.zblog.core.util.StringUtils; 6 | import com.zblog.web.backend.form.LoginForm; 7 | 8 | public class LoginFormValidator{ 9 | private static String guard; 10 | 11 | /** 12 | * 设置防止恶意登录token,由spring注入 13 | * 14 | * @param guard 15 | */ 16 | public static void setLoginGuard(String guard){ 17 | LoginFormValidator.guard = guard; 18 | } 19 | 20 | public static JMap validateLogin(LoginForm form){ 21 | JMap result = JMap.create(); 22 | /* 防止用户恶意登录 */ 23 | if(!guard.equals(form.getGuard())){ 24 | result.put("msg", "请不要尝试登录了!"); 25 | }else if(StringUtils.isBlank(form.getUsername()) || !form.getUsername().matches(CommRegular.USERNAME)){ 26 | result.put("msg", "请输入正确的用户名"); 27 | }else if(StringUtils.isBlank(form.getPassword()) || !form.getPassword().matches(CommRegular.PASSWD)){ 28 | result.put("msg", "密码输入有误"); 29 | } 30 | 31 | return result; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/feed/ArticleAdapter.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.feed; 2 | 3 | import java.util.Date; 4 | 5 | import com.zblog.core.feed.Channel.Article; 6 | import com.zblog.service.vo.PostVO; 7 | 8 | public class ArticleAdapter implements Article{ 9 | private PostVO post; 10 | 11 | public ArticleAdapter(PostVO post){ 12 | this.post = post; 13 | } 14 | 15 | @Override 16 | public String getTitle(){ 17 | return post.getTitle(); 18 | } 19 | 20 | @Override 21 | public String getLink(){ 22 | return "/posts/" + post.getId(); 23 | } 24 | 25 | @Override 26 | public String getCategory(){ 27 | return post.getCategory().getName(); 28 | } 29 | 30 | @Override 31 | public String getAuthor(){ 32 | return post.getUser().getNickName(); 33 | } 34 | 35 | @Override 36 | public String getDescription(){ 37 | return post.getExcerpt(); 38 | } 39 | 40 | @Override 41 | public String getContent(){ 42 | return post.getContent(); 43 | } 44 | 45 | @Override 46 | public Date getPubDate(){ 47 | return post.getCreateTime(); 48 | } 49 | 50 | @Override 51 | public String getGuid(){ 52 | return getLink(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/front/controller/TagController.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.front.controller; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.ui.Model; 6 | import org.springframework.web.bind.annotation.PathVariable; 7 | import org.springframework.web.bind.annotation.RequestMapping; 8 | import org.springframework.web.bind.annotation.RequestMethod; 9 | import org.springframework.web.bind.annotation.RequestParam; 10 | 11 | import com.zblog.biz.PostManager; 12 | import com.zblog.core.WebConstants; 13 | 14 | @Controller 15 | @RequestMapping("/tags") 16 | public class TagController{ 17 | @Autowired 18 | private PostManager postManager; 19 | 20 | @RequestMapping(value = "/{tagName}", method = RequestMethod.GET) 21 | public String post(@PathVariable("tagName") String tagName, 22 | @RequestParam(value = "page", defaultValue = "1") int page, Model model){ 23 | model.addAttribute("page", postManager.listByTag(tagName, page, 10)); 24 | 25 | model.addAttribute("tag", tagName); 26 | model.addAttribute(WebConstants.PRE_TITLE_KEY, tagName); 27 | return "index"; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/LoginForm.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form; 2 | 3 | public class LoginForm{ 4 | private String username; 5 | private String password; 6 | private boolean remeber; 7 | /* 防止后台暴力破解的字段 */ 8 | private String guard; 9 | private String redirectURL; 10 | 11 | public String getUsername(){ 12 | return username; 13 | } 14 | 15 | public void setUsername(String username){ 16 | this.username = username; 17 | } 18 | 19 | public String getPassword(){ 20 | return password; 21 | } 22 | 23 | public void setPassword(String password){ 24 | this.password = password; 25 | } 26 | 27 | public boolean isRemeber(){ 28 | return remeber; 29 | } 30 | 31 | public void setRemeber(boolean remeber){ 32 | this.remeber = remeber; 33 | } 34 | 35 | public String getGuard(){ 36 | return guard; 37 | } 38 | 39 | public void setGuard(String guard){ 40 | this.guard = guard; 41 | } 42 | 43 | public String getRedirectURL(){ 44 | return redirectURL; 45 | } 46 | 47 | public void setRedirectURL(String redirectURL){ 48 | this.redirectURL = redirectURL; 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /src/main/webapp/resource/zdialog/alert.css: -------------------------------------------------------------------------------- 1 | .zdialog{left:460px;top:30px;display:none;position: fixed;z-index: 1000;min-height: 110px;background-color: #FFFFFF;border: 5px solid #B2B2B2;padding-bottom: 10px;text-align: left;min-width: 418px;z-index: 1000;} 2 | .zdialog .zheader{color: #666666;background-color: #F6F6F6;border-bottom: 1px solid #E8E8E8;height: 37px;line-height: 37px;} 3 | .zdialog .zheader .title{margin:0px;cursor: move;font-size: 14px;padding-left: 15px;text-shadow: 1px 1px 0 #E8E8E8;line-height: 37px;} 4 | .zheader .toclose{height: 20px;position: absolute;right: 8px;top: 8px;width: 20px;background: url("image/ico.png") no-repeat scroll -20px 0;display: block;overflow: hidden;text-indent: -999em;} 5 | .zdialog .zcontent{color: #666666;padding-bottom: 4px;text-align: center;padding: 16px 30px 4px;} 6 | .zdialog .zfooter{margin-left: 0;padding: 10px 0;text-align: center;} 7 | .zdialog .zfooter input.zbutton{display: inline-block;font-size: 14px;height: 39px;line-height: 37px;text-align: center;text-shadow: 0 1px 0 #FFFFFF;width: 109px;background-image: url("image/alert_btn.png");border-width: 0px;cursor: pointer;} 8 | 9 | .alert_mask{background:#000000;position:absolute;left:0px;top:0px;display:none;z-index:999;filter:alpha(opacity=50);opacity:0.5 !important; } -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/GeneralOption.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form; 2 | 3 | /** 4 | * 默认设置表单 5 | * 6 | * @author zhou 7 | * 8 | */ 9 | public class GeneralOption{ 10 | private String title; 11 | private String subtitle; 12 | private String description; 13 | private String keywords; 14 | private String weburl; 15 | 16 | public String getTitle(){ 17 | return title; 18 | } 19 | 20 | public void setTitle(String title){ 21 | this.title = title; 22 | } 23 | 24 | public String getSubtitle(){ 25 | return subtitle; 26 | } 27 | 28 | public void setSubtitle(String subtitle){ 29 | this.subtitle = subtitle; 30 | } 31 | 32 | public String getDescription(){ 33 | return description; 34 | } 35 | 36 | public void setDescription(String description){ 37 | this.description = description; 38 | } 39 | 40 | public String getKeywords(){ 41 | return keywords; 42 | } 43 | 44 | public void setKeywords(String keywords){ 45 | this.keywords = keywords; 46 | } 47 | 48 | public String getWeburl(){ 49 | return weburl; 50 | } 51 | 52 | public void setWeburl(String weburl){ 53 | this.weburl = weburl; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/CommRegular.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | /** 4 | * 通用正则表达式 5 | * 6 | * @author zhou 7 | * 8 | */ 9 | public class CommRegular{ 10 | /** 11 | * 首位不为数字,字符长度为2-15的用户名 12 | */ 13 | public static final String USERNAME = "^[a-zA-Z\u4e00-\u9fa5][_a-zA-Z0-9\u4e00-\u9fa5]{1,14}$"; 14 | 15 | /** 16 | * 必须要包含数字和大小写字母6-16位密码 17 | *
    18 | *
  • ^开始标记
  • 19 | *
  • (?=.*\\d) 保证字符串包含一个数字
  • 20 | *
  • (?=.*[a-z]) 保证字符串一个小写字母
  • 21 | *
  • (?=.*[A-Z]) 保证字符串包含一个大写字母
  • 22 | *
  • [0-9a-zA-Z]{6,16} 保证字符串长度为6-16
  • 23 | *
  • $结束标记
  • 24 | *
25 | */ 26 | public static final String COMPLEX_PASSWD = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{6,16}$"; 27 | 28 | public static final String PASSWD = "^\\S{6,16}$"; 29 | 30 | /** 31 | * md5正则 32 | */ 33 | public static final String MD5 = "[0-9a-z-A-Z]{32}"; 34 | 35 | /** 36 | * 邮箱正则 37 | */ 38 | public static final String EMAIL = "^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$"; 39 | 40 | /** 41 | * http域名正则,暂不支持ip 42 | */ 43 | public static final String DOMAIN = "^https?://[a-zA-Z0-9\\._-]+(:\\d{2,4})?(/\\w+/?)?$"; 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/OptionsService.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | 6 | import com.zblog.core.dal.entity.Option; 7 | import com.zblog.core.dal.mapper.BaseMapper; 8 | import com.zblog.core.dal.mapper.OptionMapper; 9 | 10 | @Service 11 | public class OptionsService extends BaseService{ 12 | @Autowired 13 | private OptionMapper optionMapper; 14 | 15 | public String getOptionValue(String name){ 16 | return optionMapper.getOptionValue(name); 17 | } 18 | 19 | /** 20 | * 以select .. for update,注意此方法须在事务中执行 21 | * 22 | * @param name 23 | * @return 24 | */ 25 | public String getOptionValueForUpdate(String name){ 26 | return optionMapper.getOptionValueForUpdate(name); 27 | } 28 | 29 | /** 30 | * 此处为MySQL的replace into, 注意这需要主键id一致 31 | * 32 | * @param name 33 | * @param value 34 | */ 35 | public void updateOptionValue(String name, String value){ 36 | Option option = new Option(name, value); 37 | option.setId(name); 38 | optionMapper.update(option); 39 | } 40 | 41 | @Override 42 | protected BaseMapper getMapper(){ 43 | return optionMapper; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/common/head.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | 3 | 4 | 5 | 6 | 7 | ${ptitle}${ptitle!=null?' | ':''}${g.title} 8 | 9 | 10 | 11 | 12 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/freemarker/ftl/post.html: -------------------------------------------------------------------------------- 1 | <#if post.type="post"> 2 | 9 | 10 |
11 |
12 |

${post.title}

13 |
${post.content}
14 |
15 |
16 |
    17 | 22 |
  • 100 人阅读
  • 23 | 26 | <#if post.type="post"> 27 | 28 | 29 |
  • 30 | 发表评论 31 |
  • 32 |
33 |
34 |
35 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/support/WebContext.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.support; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import com.zblog.core.dal.entity.User; 7 | 8 | public class WebContext{ 9 | private String sid; 10 | private int loginId; 11 | private User user; 12 | private HttpServletRequest request; 13 | private HttpServletResponse response; 14 | 15 | public WebContext(HttpServletRequest request, HttpServletResponse response){ 16 | this.request = request; 17 | this.response = response; 18 | } 19 | 20 | public String getSid(){ 21 | return sid; 22 | } 23 | 24 | public void setSid(String sid){ 25 | this.sid = sid; 26 | } 27 | 28 | public int getLoginId(){ 29 | return loginId; 30 | } 31 | 32 | public void setLoginId(int loginId){ 33 | this.loginId = loginId; 34 | } 35 | 36 | public User getUser(){ 37 | return user; 38 | } 39 | 40 | public void setUser(User user){ 41 | this.user = user; 42 | } 43 | 44 | public boolean isLogon(){ 45 | return user != null; 46 | } 47 | 48 | public HttpServletRequest getRequest(){ 49 | return request; 50 | } 51 | 52 | public HttpServletResponse getResponse(){ 53 | return response; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/webapp/resource/js/backend/admin.category.js: -------------------------------------------------------------------------------- 1 | zblog.register("zblog.category"); 2 | $(function(){ 3 | $.ajax({ 4 | type:"GET", 5 | url:zblog.getDomainLink("categorys/index"), 6 | dataType:"json", 7 | success:function(data){ 8 | if(!data) return ; 9 | $('#tree').treeview({data:data,nodeIcon:"glyphicon glyphicon-star-empty"}); 10 | } 11 | }); 12 | }); 13 | 14 | zblog.category.insert=function(){ 15 | var newCategory=$("#newCategory").val(); 16 | if(!newCategory) return ; 17 | 18 | var select = $("#tree .node-selected"); 19 | $.ajax({ 20 | type:"POST", 21 | url:zblog.getDomainLink("categorys"), 22 | dataType:"json", 23 | data:{parent:select.text(),name:newCategory}, 24 | success:function(msg){ 25 | if(msg&&msg.success){ 26 | window.location.reload(); 27 | zdialog.hide('insert-box'); 28 | }else{ 29 | alert(msg.msg); 30 | } 31 | } 32 | }); 33 | } 34 | 35 | zblog.category.remove=function(){ 36 | var select = $("#tree .node-selected").text(); 37 | if(!select) return ; 38 | 39 | $.ajax({ 40 | type:"DELETE", 41 | url:zblog.getDomainLink("categorys/"+select), 42 | dataType:"json", 43 | success:function(msg){ 44 | if(msg&&msg.success){ 45 | window.location.reload(); 46 | }else{ 47 | alert("删除失败"); 48 | } 49 | } 50 | }); 51 | } -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/PostTagHelper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Arrays; 5 | import java.util.Collections; 6 | import java.util.List; 7 | 8 | import com.zblog.core.dal.entity.Post; 9 | import com.zblog.core.dal.entity.Tag; 10 | 11 | /** 12 | * Post标签工具类 13 | * 14 | * @author zhou 15 | * 16 | */ 17 | public class PostTagHelper{ 18 | 19 | private PostTagHelper(){ 20 | } 21 | 22 | /** 23 | * 24 | * @param post 25 | * @param tagsByComma 26 | * 以逗号分隔的字符串 27 | * @param creator 28 | * @return 29 | */ 30 | public static List from(Post post, String tagsByComma, String creator){ 31 | return !StringUtils.isBlank(tagsByComma) ? from(post, Arrays.asList(tagsByComma.split(",")), creator) : Collections 32 | . emptyList(); 33 | } 34 | 35 | public static List from(Post post, List tags, String creator){ 36 | List list = new ArrayList<>(); 37 | if(!CollectionUtils.isEmpty(tags)){ 38 | for(String tag : tags){ 39 | Tag t = new Tag(); 40 | t.setId(IdGenerator.uuid19()); 41 | t.setName(tag.trim()); 42 | t.setCreateTime(post.getLastUpdate()); 43 | t.setPostid(post.getId()); 44 | t.setCreator(creator); 45 | list.add(t); 46 | } 47 | } 48 | 49 | return list; 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/Threads.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 线程工具类 8 | * 9 | * @author zhou 10 | * 11 | */ 12 | public class Threads { 13 | private Threads() { 14 | } 15 | 16 | /** 17 | * 获取当前调用方法调用栈 18 | * 19 | * @return 20 | */ 21 | public static List getCallStack() { 22 | StackTraceElement[] ste = Thread.currentThread().getStackTrace(); 23 | List result = new ArrayList<>(ste.length); 24 | for (int i = 0; i < ste.length; i++) { 25 | result.add(ste[i].getClassName() + "." + ste[i].getMethodName() + "(" + ste[i].getLineNumber() + ")"); 26 | } 27 | 28 | return result; 29 | } 30 | 31 | /** 32 | * 执行obj的wait方法 33 | * 34 | * @param obj 35 | */ 36 | public static void waitQuietly(Object obj) { 37 | try { 38 | obj.wait(); 39 | } catch (InterruptedException e) { 40 | e.printStackTrace(); 41 | } 42 | } 43 | 44 | public static void sleepQuietly(long millis) { 45 | try { 46 | Thread.sleep(millis); 47 | } catch (InterruptedException e) { 48 | e.printStackTrace(); 49 | } 50 | } 51 | 52 | public static Throwable getRootCause(Throwable t) { 53 | Throwable cause = null; 54 | while ((cause = t.getCause()) != null) { 55 | t = cause; 56 | } 57 | return t; 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/lucene/LuceneUtils.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.lucene; 2 | 3 | import java.io.IOException; 4 | 5 | import org.apache.lucene.analysis.TokenStream; 6 | import org.apache.lucene.document.FieldType; 7 | import org.apache.lucene.index.FieldInfo.IndexOptions; 8 | 9 | public class LuceneUtils{ 10 | 11 | private LuceneUtils(){ 12 | } 13 | 14 | public static FieldType directType(){ 15 | FieldType directType = new FieldType(); 16 | directType.setIndexed(true); 17 | directType.setIndexOptions(IndexOptions.DOCS_ONLY); 18 | directType.setStored(true); 19 | 20 | return directType; 21 | } 22 | 23 | public static FieldType searchType(){ 24 | FieldType searchType = new FieldType(); 25 | searchType.setIndexed(true); 26 | searchType.setStored(true); 27 | /* 设置分词 */ 28 | searchType.setTokenized(true); 29 | 30 | return searchType; 31 | } 32 | 33 | public static FieldType storeType(){ 34 | FieldType storeType = new FieldType(); 35 | storeType.setStored(true); 36 | storeType.setIndexed(false); 37 | 38 | return storeType; 39 | } 40 | 41 | public static void closeQuietly(TokenStream stream){ 42 | if(stream == null) 43 | return; 44 | 45 | try{ 46 | stream.close(); 47 | }catch(IOException e){ 48 | e.printStackTrace(); 49 | } 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/filter/XssHttpServletRequestWrapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.filter; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletRequestWrapper; 5 | 6 | import org.springframework.web.util.HtmlUtils; 7 | 8 | /** 9 | * xss过滤包装器 10 | * 11 | * @author zhou 12 | * 13 | */ 14 | class XssHttpServletRequestWrapper extends HttpServletRequestWrapper{ 15 | 16 | public XssHttpServletRequestWrapper(HttpServletRequest request){ 17 | super(request); 18 | } 19 | 20 | @Override 21 | public String getHeader(String name){ 22 | String value = super.getHeader(name); 23 | return value == null ? null : cleanXSS(value); 24 | } 25 | 26 | @Override 27 | public String getParameter(String name){ 28 | String value = super.getParameter(name); 29 | return value == null ? null : cleanXSS(value); 30 | } 31 | 32 | @Override 33 | public String[] getParameterValues(String name){ 34 | String[] values = super.getParameterValues(name); 35 | if(values == null) 36 | return null; 37 | 38 | String[] result = new String[values.length]; 39 | for(int i = 0; i < result.length; i++){ 40 | result[i] = cleanXSS(values[i]); 41 | } 42 | 43 | return result; 44 | } 45 | 46 | private String cleanXSS(String value){ 47 | return HtmlUtils.htmlEscape(value); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/validator/OptionFormValidator.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form.validator; 2 | 3 | import com.zblog.core.plugin.JMap; 4 | import com.zblog.core.util.StringUtils; 5 | import com.zblog.web.backend.form.GeneralOption; 6 | import com.zblog.web.backend.form.PostOption; 7 | 8 | public class OptionFormValidator{ 9 | 10 | public static JMap validateGeneral(GeneralOption option){ 11 | JMap form = JMap.create(); 12 | if(StringUtils.isBlank(option.getTitle())){ 13 | form.put("title", "需填写站点名称名称"); 14 | } 15 | if(StringUtils.isBlank(option.getSubtitle())){ 16 | form.put("subtitle", "需填写副标题"); 17 | } 18 | if(StringUtils.isBlank(option.getDescription())){ 19 | form.put("description", "需填写站点描述"); 20 | } 21 | if(StringUtils.isBlank(option.getKeywords())){ 22 | form.put("keywords", "需填写站点关键字"); 23 | } 24 | if(StringUtils.isBlank(option.getWeburl())){ 25 | form.put("weburl", "需填写网站url"); 26 | } 27 | 28 | return form; 29 | } 30 | 31 | public static JMap validatePost(PostOption option){ 32 | JMap form = JMap.create(); 33 | if(option.getMaxshow() < 1){ 34 | form.put("maxshow", "格式错误"); 35 | } 36 | 37 | if(StringUtils.isBlank(option.getDefaultCategory())){ 38 | form.put("defaultCategory", "默认分类格式错误"); 39 | } 40 | 41 | return form; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/preview/preview.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 |
29 | 30 | 40 | -------------------------------------------------------------------------------- /src/main/resources/config/spring-service.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | ####################################################################### 2 | # Categories and levels 3 | ####################################################################### 4 | 5 | log4j.rootLogger=debug,ConApp,FileApp 6 | log4j.logger.org.apache.ibatis = debug 7 | log4j.logger.org.apache.shiro = warn 8 | log4j.logger.org.mybatis.spring = warn 9 | log4j.logger.org.springframework = warn 10 | log4j.logger.net.sf.ehcache=info 11 | 12 | 13 | ####################################################################### 14 | # Appenders 15 | ####################################################################### 16 | 17 | # ConApp is set to be a ConsoleAppender. 18 | log4j.appender.ConApp=org.apache.log4j.ConsoleAppender 19 | # ConApp uses PatternLayout. 20 | log4j.appender.ConApp.layout=org.apache.log4j.PatternLayout 21 | # Define Pattern 22 | log4j.appender.ConApp.layout.ConversionPattern=%p %d{yyyy-MM-dd HH:mm:ss,SSS} [%t] %c %m%n 23 | 24 | # FileApp 25 | #log4j.appender.FileApp=org.apache.log4j.RollingFileAppender 26 | log4j.appender.FileApp=org.apache.log4j.DailyRollingFileAppender 27 | log4j.appender.FileApp.File=${log4jHome}/log/log_ 28 | log4j.appender.FileApp.DatePattern =yyyy-MM-dd'.log' 29 | log4j.appender.FileApp.layout=org.apache.log4j.PatternLayout 30 | log4j.appender.FileApp.layout.ConversionPattern=%p %d{yyyy/MM/dd HH:mm:ss} %5p %c{1}:%L - %m%n 31 | log4j.appender.FileApp.Append=true -------------------------------------------------------------------------------- /src/main/webapp/resource/js/jscript.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | var menu_show=false; 3 | $("#menu_button").click(function(){ 4 | if(menu_show){ 5 | $("#header").animate({"right":0},500); 6 | $("#content").animate({"right":0},500,function(){ 7 | $("#menu").hide(); 8 | }); 9 | }else{ 10 | $("#menu").css("height",$(document).height()).show(); 11 | $("#header").animate({"right":"70%"},500); 12 | $("#content").animate({"right":"70%"},500); 13 | } 14 | 15 | menu_show = !menu_show; 16 | 17 | return false; 18 | }); 19 | 20 | $(window).bind('resize', function() { 21 | if($(window).width()>770&&menu_show){ 22 | $("#header").css("right", 0); 23 | $("#content").css("right", 0); 24 | $("#menu").css("height","auto").show(); 25 | } 26 | }); 27 | 28 | var ie6=!-[1,]&&!window.XMLHttpRequest; 29 | if(ie6) return ; 30 | 31 | jQuery.easing.easeOutExpo = function (x, t, b, c, d) { 32 | return -c * ((t=t/d-1)*t*t*t - 1) + b; 33 | }; 34 | 35 | var topBtn = $('#return_top'); 36 | topBtn.hide(); 37 | $(window).scroll(function () { 38 | if ($(this).scrollTop() > 100) { 39 | topBtn.fadeIn(); 40 | } else { 41 | topBtn.fadeOut(); 42 | } 43 | }); 44 | 45 | topBtn.click(function () { 46 | $('body,html').animate({scrollTop: 0}, 1000, 'easeOutExpo'); 47 | return false; 48 | }); 49 | }); -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/highcharts/modules/no-data-to-display.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v3.0.6 (2013-10-04) 3 | Plugin for displaying a message when there is no data visible in chart. 4 | 5 | (c) 2010-2013 Highsoft AS 6 | Author: Øystein Moseng 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(c){function f(){return!!this.points.length}function g(){this.hasData()?this.hideNoData():this.showNoData()}var d=c.seriesTypes,e=c.Chart.prototype,h=c.getOptions(),i=c.extend;i(h.lang,{noData:"No data to display"});h.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"},attr:{},style:{fontWeight:"bold",fontSize:"12px",color:"#60606a"}};d.pie.prototype.hasData=f;if(d.gauge)d.gauge.prototype.hasData=f;if(d.waterfall)d.waterfall.prototype.hasData=f;c.Series.prototype.hasData=function(){return this.dataMax!== 11 | void 0&&this.dataMin!==void 0};e.showNoData=function(a){var b=this.options,a=a||b.lang.noData,b=b.noData;if(!this.noDataLabel)this.noDataLabel=this.renderer.label(a,0,0,null,null,null,null,null,"no-data").attr(b.attr).css(b.style).add(),this.noDataLabel.align(i(this.noDataLabel.getBBox(),b.position),!1,"plotBox")};e.hideNoData=function(){if(this.noDataLabel)this.noDataLabel=this.noDataLabel.destroy()};e.hasData=function(){for(var a=this.series,b=a.length;b--;)if(a[b].hasData()&&!a[b].options.isInternal)return!0; 12 | return!1};e.callbacks.push(function(a){c.addEvent(a,"load",g);c.addEvent(a,"redraw",g)})})(Highcharts); 13 | -------------------------------------------------------------------------------- /src/main/webapp/resource/js/backend/zblog.admin.js: -------------------------------------------------------------------------------- 1 | if(typeof com=="undefined"){ 2 | var zblog={}; 3 | } 4 | 5 | //增加命名空间 使用方法:zblog.register('bbb.ccc','admin.zhou'); 6 | zblog.register =function(){ 7 | var result={},temp; 8 | for(var i=0;i0){ 41 | csrfInput.val(csrfValue); 42 | }else{ 43 | $(this).append(""); 44 | } 45 | }); 46 | }); 47 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/backend/form/validator/PostFormValidator.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.backend.form.validator; 2 | 3 | import com.zblog.core.dal.constants.PostConstants; 4 | import com.zblog.core.dal.entity.Post; 5 | import com.zblog.core.plugin.JMap; 6 | import com.zblog.core.util.StringUtils; 7 | 8 | public class PostFormValidator{ 9 | 10 | public static JMap validatePublish(Post post){ 11 | return validatePost(post, true); 12 | } 13 | 14 | public static JMap validateUpdate(Post post){ 15 | JMap form = validatePublish(post); 16 | if(StringUtils.isBlank(post.getId())){ 17 | form.put("msg", "文章ID不合法"); 18 | } 19 | 20 | return form; 21 | } 22 | 23 | public static JMap validateFastUpdate(Post post){ 24 | JMap form = validatePost(post, false); 25 | if(StringUtils.isBlank(post.getId())){ 26 | form.put("msg", "文章ID不合法"); 27 | } 28 | 29 | return form; 30 | } 31 | 32 | private static JMap validatePost(Post post, boolean verifyContent){ 33 | JMap form = JMap.create(); 34 | if(StringUtils.isBlank(post.getTitle())){ 35 | form.put("msg", "文章标题未填写"); 36 | }else if(verifyContent && StringUtils.isBlank(post.getContent())){ 37 | form.put("msg", "请填写文章内容"); 38 | }else if(PostConstants.TYPE_POST.equals(post.getType()) && StringUtils.isBlank(post.getCategoryid())){ 39 | form.put("msg", "请选择文章分类"); 40 | } 41 | 42 | return form; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/third-party/highcharts/modules/heatmap.src.js: -------------------------------------------------------------------------------- 1 | (function (Highcharts) { 2 | var seriesTypes = Highcharts.seriesTypes, 3 | each = Highcharts.each; 4 | 5 | seriesTypes.heatmap = Highcharts.extendClass(seriesTypes.map, { 6 | colorKey: 'z', 7 | useMapGeometry: false, 8 | pointArrayMap: ['y', 'z'], 9 | translate: function () { 10 | var series = this, 11 | options = series.options, 12 | dataMin = Number.MAX_VALUE, 13 | dataMax = Number.MIN_VALUE; 14 | 15 | series.generatePoints(); 16 | 17 | each(series.data, function (point) { 18 | var x = point.x, 19 | y = point.y, 20 | value = point.z, 21 | xPad = (options.colsize || 1) / 2, 22 | yPad = (options.rowsize || 1) / 2; 23 | 24 | point.path = [ 25 | 'M', x - xPad, y - yPad, 26 | 'L', x + xPad, y - yPad, 27 | 'L', x + xPad, y + yPad, 28 | 'L', x - xPad, y + yPad, 29 | 'Z' 30 | ]; 31 | 32 | point.shapeType = 'path'; 33 | point.shapeArgs = { 34 | d: series.translatePath(point.path) 35 | }; 36 | 37 | if (typeof value === 'number') { 38 | if (value > dataMax) { 39 | dataMax = value; 40 | } else if (value < dataMin) { 41 | dataMin = value; 42 | } 43 | } 44 | }); 45 | 46 | series.translateColors(dataMin, dataMax); 47 | }, 48 | 49 | getBox: function () {} 50 | 51 | }); 52 | 53 | }(Highcharts)); 54 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/UploadService.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service; 2 | 3 | import java.util.List; 4 | 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import com.zblog.core.dal.entity.Upload; 9 | import com.zblog.core.dal.mapper.BaseMapper; 10 | import com.zblog.core.dal.mapper.UploadMapper; 11 | import com.zblog.core.plugin.PageModel; 12 | import com.zblog.service.vo.UploadVO; 13 | 14 | @Service 15 | public class UploadService extends BaseService{ 16 | @Autowired 17 | private UploadMapper uploadMapper; 18 | 19 | public PageModel list(int pageIndex, int pageSize){ 20 | PageModel pageModel = new PageModel<>(pageIndex, pageSize); 21 | list(pageModel); 22 | 23 | return pageModel; 24 | } 25 | 26 | public List listByPostid(String postid){ 27 | return uploadMapper.listByPostid(postid); 28 | } 29 | 30 | public void updatePostid(String postid, List imgpaths){ 31 | uploadMapper.updatePostid(postid, imgpaths); 32 | } 33 | 34 | /** 35 | * 将所有postid的记录置空,非删除记录 36 | * 37 | * @param postid 38 | */ 39 | public void setNullPostid(String postid){ 40 | uploadMapper.setNullPostid(postid); 41 | } 42 | 43 | public void deleteByPostid(String postid){ 44 | uploadMapper.deleteByPostid(postid); 45 | } 46 | 47 | @Override 48 | protected BaseMapper getMapper(){ 49 | return uploadMapper; 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/vo/OSInfo.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service.vo; 2 | 3 | import javax.servlet.ServletContext; 4 | 5 | import com.zblog.web.support.WebContextFactory; 6 | 7 | /** 8 | * 系统信息 9 | * 10 | * @author zhou 11 | * 12 | */ 13 | public class OSInfo{ 14 | private String osName; 15 | private String osVersion; 16 | private String javaVersion; 17 | private String serverInfo; 18 | private long totalMemory; 19 | 20 | private OSInfo(){ 21 | } 22 | 23 | public String getOsName(){ 24 | return osName; 25 | } 26 | 27 | public String getOsVersion(){ 28 | return osVersion; 29 | } 30 | 31 | public String getJavaVersion(){ 32 | return javaVersion; 33 | } 34 | 35 | /** 36 | * 获取服务器信息 37 | * 38 | * @return 39 | */ 40 | public String getServerInfo(){ 41 | return serverInfo; 42 | } 43 | 44 | /** 45 | * 获取java进程内存大小,以M为单位 46 | * 47 | * @return 48 | */ 49 | public long getTotalMemory(){ 50 | return totalMemory; 51 | } 52 | 53 | public static OSInfo getCurrentOSInfo(){ 54 | OSInfo instance = new OSInfo(); 55 | instance.osName = System.getProperty("os.name"); 56 | instance.osVersion = System.getProperty("os.version"); 57 | instance.javaVersion = System.getProperty("java.version"); 58 | ServletContext sc = WebContextFactory.get().getRequest().getServletContext(); 59 | instance.serverInfo = sc.getServerInfo(); 60 | instance.totalMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024; 61 | 62 | return instance; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/plugin/ApplicationContextUtil.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.plugin; 2 | 3 | import org.springframework.beans.BeansException; 4 | import org.springframework.context.ApplicationContext; 5 | import org.springframework.context.ApplicationContextAware; 6 | 7 | /** 8 | *

9 | * 获取spring bean的工具类 10 | *

11 | *

12 | * 注:spring-servlet.xml中的bean并不由ApplicationContext管理, 它由DispatcherServlet管理 13 | *

14 | * 15 | * @author zhou 16 | * 17 | */ 18 | public class ApplicationContextUtil implements ApplicationContextAware{ 19 | static ApplicationContext context; 20 | 21 | @Override 22 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException{ 23 | context = applicationContext; 24 | } 25 | 26 | /** 27 | * 根据提供的bean名称得到相应的类 28 | * 29 | * @param name 30 | * bean名称 31 | */ 32 | public static Object getBean(String name){ 33 | return context.getBean(name); 34 | } 35 | 36 | /** 37 | * 根据提供的指定类型的类得到相应的类 38 | * 39 | * @param servName 40 | * bean名称 41 | */ 42 | public static T getBean(Class clazz){ 43 | return context.getBean(clazz); 44 | } 45 | 46 | /** 47 | * 根据提供的bean名称得到对应于指定类型的类 48 | * 49 | * @param name 50 | * bean名称 51 | * @param clazz 52 | * 返回的bean类型,若类型不匹配,将抛出异常 53 | */ 54 | public static T getBean(String name, Class clazz){ 55 | return context.getBean(name, clazz); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/StringUtils.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import java.util.Collection; 4 | 5 | public final class StringUtils{ 6 | 7 | private StringUtils(){ 8 | } 9 | 10 | public static boolean isBlank(String str){ 11 | return str == null || str.trim().length() == 0; 12 | } 13 | 14 | public static String join(Collection collect, String delimiter){ 15 | StringBuilder result = new StringBuilder(); 16 | for(String temp : collect){ 17 | result.append(temp).append(delimiter); 18 | } 19 | 20 | if(!collect.isEmpty()) 21 | result.delete(result.length() - delimiter.length(), result.length()); 22 | 23 | return result.toString(); 24 | } 25 | 26 | public static String trimLeft(String source){ 27 | if(isBlank(source)) 28 | return null; 29 | 30 | int index = 0; 31 | for(; index < source.length(); index++){ 32 | if(source.charAt(index) > 32) 33 | break; 34 | } 35 | 36 | return source.substring(index); 37 | } 38 | 39 | public static String trimRight(String source){ 40 | if(isBlank(source)) 41 | return null; 42 | 43 | int index = source.length() - 1; 44 | for(; index >= 0; index--){ 45 | if(source.charAt(index) > 32) 46 | break; 47 | } 48 | 49 | return source.substring(0, index + 1); 50 | } 51 | 52 | public static String emptyDefault(String ifEmpty, String defaults){ 53 | return isBlank(ifEmpty) ? defaults : ifEmpty; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/front/controller/CategoryController.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.front.controller; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.ui.Model; 6 | import org.springframework.web.bind.annotation.PathVariable; 7 | import org.springframework.web.bind.annotation.RequestMapping; 8 | import org.springframework.web.bind.annotation.RequestMethod; 9 | import org.springframework.web.bind.annotation.RequestParam; 10 | 11 | import com.zblog.biz.PostManager; 12 | import com.zblog.core.WebConstants; 13 | import com.zblog.core.dal.entity.Category; 14 | import com.zblog.service.CategoryService; 15 | 16 | @Controller 17 | @RequestMapping("/categorys") 18 | public class CategoryController{ 19 | @Autowired 20 | private PostManager postManager; 21 | @Autowired 22 | private CategoryService categoryService; 23 | 24 | @RequestMapping(value = "/{categoryName}", method = RequestMethod.GET) 25 | public String post(@PathVariable("categoryName") String categoryName, 26 | @RequestParam(value = "page", defaultValue = "1") int page, Model model){ 27 | Category category = categoryService.loadByName(categoryName); 28 | if(category != null){ 29 | model.addAttribute("page", postManager.listByCategory(category, page, 10)); 30 | } 31 | 32 | model.addAttribute("category", categoryName); 33 | model.addAttribute(WebConstants.PRE_TITLE_KEY, categoryName); 34 | return "index"; 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/biz/VisitStatManager.java: -------------------------------------------------------------------------------- 1 | package com.zblog.biz; 2 | 3 | import java.util.Map; 4 | import java.util.concurrent.ConcurrentHashMap; 5 | import java.util.concurrent.ConcurrentMap; 6 | 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Component; 11 | 12 | import com.zblog.service.PostService; 13 | import com.zblog.service.vo.PostVO; 14 | 15 | /** 16 | * 文章的访问统计 17 | * 18 | * @author zhou 19 | * 20 | */ 21 | @Component 22 | public class VisitStatManager{ 23 | private static final Logger logger = LoggerFactory.getLogger(VisitStatManager.class); 24 | @Autowired 25 | private PostService postService; 26 | private ConcurrentMap visit = new ConcurrentHashMap<>(); 27 | 28 | public void flush(){ 29 | ConcurrentMap copy = visit; 30 | visit = new ConcurrentHashMap(); 31 | if(!copy.isEmpty()){ 32 | logger.debug("flush visit stat to database"); 33 | } 34 | 35 | for(Map.Entry entry : copy.entrySet()){ 36 | postService.addRcount(entry.getKey(), entry.getValue()); 37 | } 38 | copy.clear(); 39 | copy = null; 40 | } 41 | 42 | public void record(String postid){ 43 | Integer count = visit.get(postid); 44 | /* 该数据,并发问题忽略 */ 45 | visit.put(postid, count == null ? 1 : count + 1); 46 | /* 此处更新文章阅读数 */ 47 | PostVO p = postService.loadById(postid); 48 | /* 此处实际为更改缓存中数据 */ 49 | p.setRcount(p.getRcount() + 1); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/vo/Global.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service.vo; 2 | 3 | import java.util.Calendar; 4 | import java.util.Date; 5 | 6 | import com.zblog.core.dal.constants.OptionConstants; 7 | import com.zblog.core.plugin.ApplicationContextUtil; 8 | import com.zblog.service.OptionsService; 9 | 10 | /** 11 | * view中使用的的对象 12 | * 13 | * @author zhou 14 | * 15 | */ 16 | public class Global{ 17 | private String domain; 18 | 19 | public Global(String domain){ 20 | this.domain = domain; 21 | } 22 | 23 | public String getTitle(){ 24 | return getOptionValue(OptionConstants.TITLE); 25 | } 26 | 27 | public String getSubtitle(){ 28 | return getOptionValue(OptionConstants.SUBTITLE); 29 | } 30 | 31 | public String getDescription(){ 32 | return getOptionValue(OptionConstants.DESCRIPTION); 33 | } 34 | 35 | public String getKeywords(){ 36 | return getOptionValue(OptionConstants.KEYWORDS); 37 | } 38 | 39 | public boolean isAllowComment(){ 40 | return Boolean.parseBoolean(getOptionValue(OptionConstants.ALLOW_COMMENT)); 41 | } 42 | 43 | public int getYear(){ 44 | Calendar calendar = Calendar.getInstance(); 45 | calendar.setTime(new Date()); 46 | return calendar.get(Calendar.YEAR); 47 | } 48 | 49 | public String getDomain(){ 50 | return domain; 51 | } 52 | 53 | private static String getOptionValue(String name){ 54 | OptionsService optionsService = ApplicationContextUtil.getBean(OptionsService.class); 55 | return optionsService.getOptionValue(name); 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/front/controller/PageController.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.front.controller; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | 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.PathVariable; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | 11 | import com.zblog.biz.CommentManager; 12 | import com.zblog.biz.PostManager; 13 | import com.zblog.biz.VisitStatManager; 14 | import com.zblog.core.WebConstants; 15 | import com.zblog.core.util.CookieUtil; 16 | import com.zblog.service.vo.PostVO; 17 | 18 | @Controller 19 | @RequestMapping("/pages") 20 | public class PageController{ 21 | @Autowired 22 | private PostManager postManager; 23 | @Autowired 24 | private CommentManager commentManager; 25 | @Autowired 26 | private VisitStatManager visitStatManager; 27 | 28 | @RequestMapping("/{pageid}") 29 | public String page(@PathVariable("pageid") String pageid, HttpServletRequest request, Model model){ 30 | PostVO post = postManager.loadReadById(pageid); 31 | if(post != null){ 32 | visitStatManager.record(pageid); 33 | model.addAttribute(WebConstants.PRE_TITLE_KEY, post.getTitle()); 34 | model.addAttribute("post", post); 35 | model.addAttribute("comments", 36 | commentManager.getAsTree(pageid, new CookieUtil(request, null).getCookie("comment_author"))); 37 | } 38 | 39 | return post != null ? "post" : "404"; 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/web/front/validator/CommentValidator.java: -------------------------------------------------------------------------------- 1 | package com.zblog.web.front.validator; 2 | 3 | import com.zblog.core.dal.entity.Comment; 4 | import com.zblog.core.plugin.JMap; 5 | import com.zblog.core.util.CommRegular; 6 | import com.zblog.core.util.StringUtils; 7 | 8 | public class CommentValidator{ 9 | 10 | public static JMap validate(Comment comment){ 11 | JMap result = JMap.create(); 12 | if(StringUtils.isBlank(comment.getPostid())){ 13 | result.put("msg", "文章id不合法"); 14 | }else if(StringUtils.isBlank(comment.getEmail()) || !comment.getEmail().matches(CommRegular.EMAIL)){ 15 | result.put("msg", "邮箱格式不合法"); 16 | }else if(StringUtils.isBlank(comment.getUrl()) || !comment.getUrl().matches(CommRegular.DOMAIN)){ 17 | result.put("msg", "站点格式不合法 "); 18 | }else if(StringUtils.isBlank(comment.getCreator())){ 19 | result.put("msg", "需填写用户昵称"); 20 | }else if(comment.isApproved()){ 21 | result.put("msg", "非法请求"); 22 | }else if(StringUtils.isBlank(comment.getContent())){ 23 | result.put("msg", "请填写评价内容"); 24 | }else if(!isChinese(comment.getContent())){ 25 | result.put("msg", "评价内容必须包含中文"); 26 | } 27 | 28 | return result; 29 | } 30 | 31 | /** 32 | * 判断是否包含中文,但不能判断是否是中文标点 33 | * 34 | * @param str 35 | * @return 36 | */ 37 | private static boolean isChinese(String str){ 38 | for(int i = 0; i < str.length(); i++){ 39 | char c = str.charAt(i); 40 | if((c >= 0x4e00) && (c <= 0x9fbb)){ 41 | return true; 42 | } 43 | } 44 | 45 | return false; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/feed/Channel.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.feed; 2 | 3 | import java.util.Date; 4 | import java.util.List; 5 | 6 | public class Channel{ 7 | private String domain; 8 | private String logoUrl; 9 | private String title; 10 | private String description; 11 | private List
items; 12 | 13 | public Channel(){ 14 | } 15 | 16 | public Channel(String domain, String logoUrl){ 17 | this.domain = domain; 18 | this.logoUrl = logoUrl; 19 | } 20 | 21 | public String getDomain(){ 22 | return domain; 23 | } 24 | 25 | public void setDomain(String domain){ 26 | this.domain = domain; 27 | } 28 | 29 | public String getLogoUrl(){ 30 | return logoUrl; 31 | } 32 | 33 | public void setLogoUrl(String logoUrl){ 34 | this.logoUrl = logoUrl; 35 | } 36 | 37 | public String getTitle(){ 38 | return title; 39 | } 40 | 41 | public void setTitle(String title){ 42 | this.title = title; 43 | } 44 | 45 | public String getDescription(){ 46 | return description; 47 | } 48 | 49 | public void setDescription(String description){ 50 | this.description = description; 51 | } 52 | 53 | public void setItems(List
items){ 54 | this.items = items; 55 | } 56 | 57 | public List
getItems(){ 58 | return items; 59 | } 60 | 61 | public static interface Article{ 62 | String getTitle(); 63 | 64 | String getLink(); 65 | 66 | String getCategory(); 67 | 68 | String getAuthor(); 69 | 70 | String getDescription(); 71 | 72 | public String getContent(); 73 | 74 | Date getPubDate(); 75 | 76 | String getGuid(); 77 | } 78 | 79 | } 80 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/backend/common/navbar.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | <%@ taglib prefix="z" uri="/WEB-INF/tld/function.tld" %> 3 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/table/edittable.css: -------------------------------------------------------------------------------- 1 | body{ 2 | overflow: hidden; 3 | width: 540px; 4 | } 5 | .wrapper { 6 | margin: 10px auto 0; 7 | font-size: 12px; 8 | overflow: hidden; 9 | width: 520px; 10 | height: 315px; 11 | } 12 | 13 | .clear { 14 | clear: both; 15 | } 16 | 17 | .wrapper .left { 18 | float: left; 19 | margin-left: 10px;; 20 | } 21 | 22 | .wrapper .right { 23 | float: right; 24 | border-left: 2px dotted #EDEDED; 25 | padding-left: 15px; 26 | } 27 | 28 | .section { 29 | margin-bottom: 15px; 30 | width: 240px; 31 | overflow: hidden; 32 | } 33 | 34 | .section h3 { 35 | font-weight: bold; 36 | padding: 5px 0; 37 | margin-bottom: 10px; 38 | border-bottom: 1px solid #EDEDED; 39 | font-size: 12px; 40 | } 41 | 42 | .section ul { 43 | list-style: none; 44 | overflow: hidden; 45 | clear: both; 46 | 47 | } 48 | 49 | .section li { 50 | float: left; 51 | width: 120px;; 52 | } 53 | 54 | .section .tone { 55 | width: 80px;; 56 | } 57 | 58 | .section .preview { 59 | width: 220px; 60 | } 61 | 62 | .section .preview table { 63 | text-align: center; 64 | vertical-align: middle; 65 | color: #666; 66 | } 67 | 68 | .section .preview caption { 69 | font-weight: bold; 70 | } 71 | 72 | .section .preview td { 73 | border-width: 1px; 74 | border-style: solid; 75 | height: 22px; 76 | } 77 | 78 | .section .preview th { 79 | border-style: solid; 80 | border-color: #DDD; 81 | border-width: 2px 1px 1px 1px; 82 | height: 22px; 83 | background-color: #F7F7F7; 84 | } -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.entity; 2 | 3 | import com.zblog.core.dal.constants.UserConstants; 4 | 5 | public class User extends BaseEntity{ 6 | private String nickName; 7 | private String realName; 8 | private String password; 9 | private String email; 10 | /* 用户账号状态 */ 11 | private String status = UserConstants.USER_STATUS_NORMAL; 12 | private String role = UserConstants.USER_ROLE_CONTRIBUTOR; 13 | private String description; 14 | 15 | public String getNickName(){ 16 | return nickName; 17 | } 18 | 19 | public void setNickName(String nickName){ 20 | this.nickName = nickName; 21 | } 22 | 23 | public String getRealName(){ 24 | return realName; 25 | } 26 | 27 | public void setRealName(String realName){ 28 | this.realName = realName; 29 | } 30 | 31 | public String getPassword(){ 32 | return password; 33 | } 34 | 35 | public void setPassword(String password){ 36 | this.password = password; 37 | } 38 | 39 | public String getEmail(){ 40 | return email; 41 | } 42 | 43 | public void setEmail(String email){ 44 | this.email = email; 45 | } 46 | 47 | public String getStatus(){ 48 | return status; 49 | } 50 | 51 | public void setStatus(String status){ 52 | this.status = status; 53 | } 54 | 55 | public String getRole(){ 56 | return role; 57 | } 58 | 59 | public void setRole(String role){ 60 | this.role = role; 61 | } 62 | 63 | public String getDescription(){ 64 | return description; 65 | } 66 | 67 | public void setDescription(String description){ 68 | this.description = description; 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/plugin/TreeUtils.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.plugin; 2 | 3 | import java.util.Iterator; 4 | import java.util.List; 5 | 6 | import com.zblog.core.util.StringUtils; 7 | 8 | public class TreeUtils{ 9 | 10 | private TreeUtils(){ 11 | } 12 | 13 | /** 14 | * 根据指定的list构建森林 15 | * 16 | * @param list 17 | */ 18 | public static > void rebuildTree(List list){ 19 | while(!solve(list)){ 20 | Iterator it = list.iterator(); 21 | while(it.hasNext()){ 22 | T item = it.next(); 23 | if(hasChild(list, item.getId())) 24 | continue; 25 | 26 | if(!StringUtils.isBlank(item.getParent())){ 27 | /* 获取item父节点 */ 28 | for(T temp : list){ 29 | if(item.getParent().equals(temp.getId())){ 30 | it.remove(); 31 | temp.addChild(item); 32 | break; 33 | } 34 | } 35 | } 36 | } 37 | } 38 | } 39 | 40 | /** 41 | * 指定id是否有子节点 42 | * 43 | * @param list 44 | * @param id 45 | * @return 46 | */ 47 | private static > boolean hasChild(List list, String id){ 48 | for(T mc : list){ 49 | if(id.equals(mc.getParent())) 50 | return true; 51 | } 52 | return false; 53 | } 54 | 55 | /** 56 | * 如果在当前所有顶级节点中没有任何一个有子节点,就意味着森林构建成功 57 | * 58 | * @param list 59 | * @return 60 | */ 61 | private static > boolean solve(List list){ 62 | for(T mc : list){ 63 | if(hasChild(list, mc.getId())) 64 | return false; 65 | } 66 | 67 | return true; 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/security/Hex.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.security; 2 | 3 | /** 4 | * 字节数组工具类 5 | * 6 | * @author zhou 7 | * 8 | */ 9 | public class Hex{ 10 | private static final char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 11 | 12 | private Hex(){ 13 | } 14 | 15 | /** 16 | * 字节数组转十六进制 17 | * 18 | * @param bytes 19 | * @return 大写形式十六进制 20 | */ 21 | public static String bytes2Hex(byte[] bytes){ 22 | char[] result = new char[bytes.length << 1]; 23 | for(int i = 0; i < bytes.length; i++){ 24 | result[2 * i] = digits[bytes[i] >>> 4 & 0x0F]; 25 | result[2 * i + 1] = digits[bytes[i] & 0x0F]; 26 | } 27 | 28 | return new String(result); 29 | } 30 | 31 | /** 32 | * 十六进制转字节数组 33 | * 34 | * @param hex 35 | * @return 36 | */ 37 | public static byte[] hex2Bytes(String hex){ 38 | byte[] result = new byte[hex.length() >> 1]; 39 | for(int i = 0; i < hex.length(); i += 2){ 40 | int digit = Character.digit(hex.charAt(i), 16); 41 | result[i >> 1] = (byte) (digit << 4 | Character.digit(hex.charAt(i + 1), 16)); 42 | } 43 | 44 | return result; 45 | } 46 | 47 | public static int bytes2Int(byte[] buf){ 48 | return ((buf[0] & 0xff) << 24) | ((buf[1] & 0xff) << 16) | ((buf[2] & 0xff) << 8) | (buf[3] & 0xff); 49 | } 50 | 51 | public static byte[] int2Bytes(int value){ 52 | byte[] result = new byte[4]; 53 | result[0] = (byte) (value >> 24); 54 | result[1] = (byte) (value >> 16 & 0xFF); 55 | result[2] = (byte) (value >> 8 & 0xFF); 56 | result[3] = (byte) (value & 0xFF); 57 | 58 | return result; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/jsp/sitemap.jsp: -------------------------------------------------------------------------------- 1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 | <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 3 | 4 | 5 | 6 | 站点地图 - ${g.title} 7 | 8 | 9 | 10 | 18 | 19 | 20 |

${g.title} - blog.zhouhaocheng.cn's SiteMap

21 |
22 | 26 |
27 |

最新文章

28 | 33 |
34 |
35 |
36 | 37 | 38 | -------------------------------------------------------------------------------- /src/main/resources/config/mybatis.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 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/help/help.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created with JetBrains PhpStorm. 3 | * User: xuheng 4 | * Date: 12-9-26 5 | * Time: 下午1:06 6 | * To change this template use File | Settings | File Templates. 7 | */ 8 | /** 9 | * tab点击处理事件 10 | * @param tabHeads 11 | * @param tabBodys 12 | * @param obj 13 | */ 14 | function clickHandler( tabHeads,tabBodys,obj ) { 15 | //head样式更改 16 | for ( var k = 0, len = tabHeads.length; k < len; k++ ) { 17 | tabHeads[k].className = ""; 18 | } 19 | obj.className = "focus"; 20 | //body显隐 21 | var tabSrc = obj.getAttribute( "tabSrc" ); 22 | for ( var j = 0, length = tabBodys.length; j < length; j++ ) { 23 | var body = tabBodys[j], 24 | id = body.getAttribute( "id" ); 25 | body.onclick = function(){ 26 | this.style.zoom = 1; 27 | }; 28 | if ( id != tabSrc ) { 29 | body.style.zIndex = 1; 30 | } else { 31 | body.style.zIndex = 200; 32 | } 33 | } 34 | 35 | } 36 | 37 | /** 38 | * TAB切换 39 | * @param tabParentId tab的父节点ID或者对象本身 40 | */ 41 | function switchTab( tabParentId ) { 42 | var tabElements = $G( tabParentId ).children, 43 | tabHeads = tabElements[0].children, 44 | tabBodys = tabElements[1].children; 45 | 46 | for ( var i = 0, length = tabHeads.length; i < length; i++ ) { 47 | var head = tabHeads[i]; 48 | if ( head.className === "focus" )clickHandler(tabHeads,tabBodys, head ); 49 | head.onclick = function () { 50 | clickHandler(tabHeads,tabBodys,this); 51 | } 52 | } 53 | } 54 | switchTab("helptab"); 55 | 56 | document.getElementById('version').innerHTML = parent.UE.version; -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/tld/function.tld: -------------------------------------------------------------------------------- 1 | 2 | 6 | common function 7 | fns 8 | 1.0 9 | common function 10 | /WEB-INF/tld/function.tld 11 | 12 | cookieValue 13 | com.zblog.core.tag.FunctionHelper 14 | 15 | java.lang.String cookieValue(java.lang.String) 16 | 17 | ${z:cookieValue('name')} 18 | 19 | 20 | 21 | getDomainLink 22 | com.zblog.core.tag.FunctionHelper 23 | java.lang.String getDomainLink(java.lang.String) 24 | ${z:getDomainLink('http://github.com/')} 25 | 26 | 27 | 28 | fileExt 29 | com.zblog.core.tag.FunctionHelper 30 | java.lang.String fileExt(java.lang.String) 31 | ${z:fileExt('some.png')} 32 | 33 | 34 | join 35 | com.zblog.core.tag.FunctionHelper 36 | java.lang.String join(java.util.Collection,java.lang.String) 37 | 38 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/charts/chart.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 图表配置文件 3 | * */ 4 | 5 | 6 | //不同类型的配置 7 | var typeConfig = [ 8 | { 9 | chart: { 10 | type: 'line' 11 | }, 12 | plotOptions: { 13 | line: { 14 | dataLabels: { 15 | enabled: false 16 | }, 17 | enableMouseTracking: true 18 | } 19 | } 20 | }, { 21 | chart: { 22 | type: 'line' 23 | }, 24 | plotOptions: { 25 | line: { 26 | dataLabels: { 27 | enabled: true 28 | }, 29 | enableMouseTracking: false 30 | } 31 | } 32 | }, { 33 | chart: { 34 | type: 'area' 35 | } 36 | }, { 37 | chart: { 38 | type: 'bar' 39 | } 40 | }, { 41 | chart: { 42 | type: 'column' 43 | } 44 | }, { 45 | chart: { 46 | plotBackgroundColor: null, 47 | plotBorderWidth: null, 48 | plotShadow: false 49 | }, 50 | plotOptions: { 51 | pie: { 52 | allowPointSelect: true, 53 | cursor: 'pointer', 54 | dataLabels: { 55 | enabled: true, 56 | color: '#000000', 57 | connectorColor: '#000000', 58 | formatter: function() { 59 | return ''+ this.point.name +': '+ ( Math.round( this.point.percentage*100 ) / 100 ) +' %'; 60 | } 61 | } 62 | } 63 | } 64 | } 65 | ]; 66 | -------------------------------------------------------------------------------- /src/main/resources/mybatis/UploadMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 14 | 15 | 18 | 19 | 22 | 23 | 24 | insert into upload(id,name,path,creator,createTime) 25 | values(#{id},#{name},#{path},#{creator},#{createTime}) 26 | 27 | 28 | 29 | update upload set postid=#{postid} where path in 30 | 31 | #{item} 32 | 33 | 34 | 35 | 36 | update upload set postid=null where postid=#{postid} 37 | 38 | 39 | 40 | delete from upload where id = #{id} 41 | 42 | 43 | 44 | delete from upload where postid = #{postid} 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/biz/EhCacheManager.java: -------------------------------------------------------------------------------- 1 | package com.zblog.biz; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.List; 6 | 7 | import net.sf.ehcache.Cache; 8 | import net.sf.ehcache.Ehcache; 9 | import net.sf.ehcache.Statistics; 10 | 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.cache.ehcache.EhCacheCacheManager; 13 | import org.springframework.stereotype.Component; 14 | 15 | import com.zblog.core.plugin.JMap; 16 | 17 | @Component 18 | public class EhCacheManager{ 19 | @Autowired 20 | private EhCacheCacheManager manager; 21 | 22 | /** 23 | * 获取缓存数据分析 24 | * 25 | * @return 26 | */ 27 | public Collection stats(){ 28 | Collection cns = manager.getCacheNames(); 29 | List list = new ArrayList<>(cns.size()); 30 | for(String cacheName : cns){ 31 | JMap temp = JMap.create("name", cacheName); 32 | Ehcache cache = manager.getCacheManager().getEhcache(cacheName); 33 | Statistics gateway = cache.getStatistics(); 34 | /* 毫秒 */ 35 | temp.put("averageGetTime", gateway.getAverageGetTime()); 36 | temp.put("hitCount", gateway.getCacheHits()); 37 | temp.put("missCount", gateway.getCacheMisses()); 38 | temp.put("size", gateway.getObjectCount()); 39 | if(cache.isStatisticsEnabled()){ 40 | temp.put("hitRatio", (float) gateway.getCacheHits() / (gateway.getCacheHits() + gateway.getCacheMisses())); 41 | } 42 | 43 | list.add(temp); 44 | } 45 | 46 | return list; 47 | } 48 | 49 | public void clear(String cacheName){ 50 | Cache cache = manager.getCacheManager().getCache(cacheName); 51 | cache.removeAll(); 52 | cache.clearStatistics(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/dal/mapper/PostMapper.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.dal.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import com.zblog.core.dal.entity.Post; 8 | import com.zblog.core.plugin.JMap; 9 | import com.zblog.core.plugin.PageModel; 10 | import com.zblog.service.vo.PageVO; 11 | import com.zblog.service.vo.PostVO; 12 | 13 | @SuppressWarnings("unchecked") 14 | public interface PostMapper extends BaseMapper{ 15 | 16 | @Override 17 | public PostVO loadById(String postid); 18 | 19 | /** 20 | * 获取制定post的下一篇 21 | * 22 | * @param postid 23 | * @return 24 | */ 25 | Post getPrevPost(String postid); 26 | 27 | /** 28 | * 获取指定post的上一篇 29 | * 30 | * @param postid 31 | * @return 32 | */ 33 | Post getNextPost(String postid); 34 | 35 | /** 36 | * 获取页面(只包含ID和title) 37 | * 38 | * @param onlyParent 39 | * @return 40 | */ 41 | List listPage(boolean onlyParent); 42 | 43 | /** 44 | * 列出文章归档 45 | * 46 | * @return 47 | */ 48 | List listArchive(); 49 | 50 | int addRcount(@Param("postid") String postid, @Param("count") int count); 51 | 52 | int addCcount(@Param("commentid") String commentid, @Param("count") int count); 53 | 54 | /** 55 | * 获取最近发表文章 56 | * 57 | * @return 文章id 58 | */ 59 | List listRecent(@Param("nums") int nums, @Param("creator") String creator); 60 | 61 | List listByMonth(PageModel model); 62 | 63 | List listByCategory(PageModel model); 64 | 65 | List listByTag(PageModel model); 66 | 67 | void updateCategory(@Param("oldCategoryIds") List oldCategoryIds, @Param("newCategoryId") String newCategoryId); 68 | 69 | } 70 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/anchor/anchor.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 13 | 14 | 15 |
16 | 17 |
18 | 19 | 39 | 40 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/JdbcUtils.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import java.sql.Connection; 4 | import java.sql.ResultSet; 5 | import java.sql.SQLException; 6 | import java.sql.Statement; 7 | 8 | public final class JdbcUtils{ 9 | 10 | public static void close(Connection conn){ 11 | if(conn != null){ 12 | try{ 13 | conn.close(); 14 | }catch(SQLException e){ 15 | e.printStackTrace(); 16 | } 17 | } 18 | } 19 | 20 | public static void close(Statement sta){ 21 | if(sta != null){ 22 | try{ 23 | sta.close(); 24 | }catch(SQLException e){ 25 | e.printStackTrace(); 26 | } 27 | } 28 | } 29 | 30 | public static void close(ResultSet rs){ 31 | if(rs != null){ 32 | try{ 33 | rs.close(); 34 | }catch(SQLException e){ 35 | e.printStackTrace(); 36 | } 37 | } 38 | } 39 | 40 | public static void close(ResultSet rs, Statement sta, Connection conn){ 41 | close(rs); 42 | close(sta, conn); 43 | } 44 | 45 | public static void close(Statement sta, Connection conn){ 46 | close(sta); 47 | close(conn); 48 | } 49 | 50 | public static void close(ResultSet set, Statement state){ 51 | close(set); 52 | close(state); 53 | } 54 | 55 | public static void rollback(Connection conn){ 56 | if(conn != null){ 57 | try{ 58 | conn.rollback(); 59 | }catch(SQLException e){ 60 | e.printStackTrace(); 61 | } 62 | } 63 | } 64 | 65 | public static void cancleTransaction(Connection conn){ 66 | if(conn != null){ 67 | try{ 68 | conn.setAutoCommit(true); 69 | }catch(SQLException e){ 70 | e.printStackTrace(); 71 | } 72 | } 73 | } 74 | 75 | } -------------------------------------------------------------------------------- /src/main/java/com/zblog/service/email/MailSenderService.java: -------------------------------------------------------------------------------- 1 | package com.zblog.service.email; 2 | 3 | import javax.mail.MessagingException; 4 | import javax.mail.internet.MimeMessage; 5 | 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | import org.springframework.mail.javamail.JavaMailSenderImpl; 9 | import org.springframework.mail.javamail.MimeMessageHelper; 10 | import org.springframework.stereotype.Service; 11 | 12 | import com.zblog.core.Constants; 13 | import com.zblog.service.vo.MailVO; 14 | import com.zblog.web.backend.form.MailOption; 15 | 16 | /** 17 | * 邮件发送服务 18 | * 19 | * @author zhou 20 | * 21 | */ 22 | @Service 23 | public class MailSenderService{ 24 | private static final Logger logger = LoggerFactory.getLogger(MailSenderService.class); 25 | 26 | private JavaMailSenderImpl sender = new JavaMailSenderImpl(); 27 | private boolean init = false; 28 | 29 | public void setServerInfo(MailOption form){ 30 | sender.setHost(form.getHost()); 31 | sender.setPort(form.getPort()); 32 | sender.setUsername(form.getUsername()); 33 | sender.setPassword(form.getPassword()); 34 | init = true; 35 | } 36 | 37 | /** 38 | * 发送邮件 39 | * 40 | * @param mail 41 | */ 42 | public void sendMail(MailVO mail){ 43 | if(!init) 44 | return; 45 | 46 | MimeMessage message = sender.createMimeMessage(); 47 | try{ 48 | MimeMessageHelper helper = new MimeMessageHelper(message, true, Constants.ENCODING_UTF_8.name()); 49 | helper.setFrom(mail.getFrom()); 50 | helper.setTo(mail.getTo().toArray(new String[]{})); 51 | helper.setSubject(mail.getSubject()); 52 | helper.setText(mail.getContent(), true); 53 | sender.send(message); 54 | }catch(MessagingException e){ 55 | logger.error("send mail error", e); 56 | } 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/main/resources/mybatis/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 10 | 11 | 15 | 16 | 19 | 20 | 23 | 24 | 25 | insert into user(id,nickName,realName,password,email,role,status,description,createTime,creator,lastUpdate) 26 | values(#{id},#{nickName},#{realName},md5(#{password}),#{email},#{role},#{status},#{description},#{createTime},#{creator},#{lastUpdate}) 27 | 28 | 29 | 30 | update user set realName=#{realName},email=#{email},description=#{description} 31 | 32 | ,role=#{role} 33 | 34 | 35 | ,password=md5(#{password}) 36 | 37 | where id=#{id} 38 | 39 | 40 | 41 | delete from user where id = #{id} 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/main/java/com/zblog/core/util/DateUtils.java: -------------------------------------------------------------------------------- 1 | package com.zblog.core.util; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Date; 5 | import java.util.Locale; 6 | 7 | import com.zblog.core.Constants; 8 | 9 | public class DateUtils{ 10 | 11 | private DateUtils(){ 12 | } 13 | 14 | public static String currentDate(String pattern){ 15 | return formatDate(pattern, new Date()); 16 | } 17 | 18 | public static String formatDate(String pattern, Date date){ 19 | SimpleDateFormat format = new SimpleDateFormat(pattern, Constants.LOCALE_CHINA); 20 | return format.format(date); 21 | } 22 | 23 | /** 24 | * 指定locale格式化日期 25 | * 26 | * @param pattern 27 | * @param date 28 | * @param locale 29 | * @return 30 | */ 31 | public static String formatDate(String pattern, Date date, Locale locale){ 32 | SimpleDateFormat format = new SimpleDateFormat(pattern, locale); 33 | return format.format(date); 34 | } 35 | 36 | /** 37 | * 解析日期,注:此处为严格模式解析,即20151809这样的日期会解析错误 38 | * 39 | * @param pattern 40 | * @param date 41 | * @return 42 | */ 43 | public static Date parse(String pattern, String date){ 44 | return parse(pattern, date, Constants.LOCALE_CHINA); 45 | } 46 | 47 | /** 48 | * 解析日期,注:此处为严格模式解析,即20151809这样的日期会解析错误 49 | * 50 | * @param pattern 51 | * @param date 52 | * @param locale 53 | * @return 54 | */ 55 | public static Date parse(String pattern, String date, Locale locale){ 56 | SimpleDateFormat format = new SimpleDateFormat(pattern, locale); 57 | format.setLenient(false); 58 | Date result = null; 59 | try{ 60 | result = format.parse(date); 61 | }catch(Exception e){ 62 | e.printStackTrace(); 63 | } 64 | 65 | return result; 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /src/main/webapp/resource/ueditor-1.4.3/dialogs/music/music.css: -------------------------------------------------------------------------------- 1 | .wrapper{margin: 5px 10px;} 2 | 3 | .searchBar{height:30px;padding:7px 0 3px;text-align:center;} 4 | .searchBtn{font-size:13px;height:24px;} 5 | 6 | .resultBar{width:460px;margin:5px auto;border: 1px solid #CCC;border-radius: 5px;box-shadow: 2px 2px 5px #D3D6DA;overflow: hidden;} 7 | 8 | .listPanel{overflow: hidden;} 9 | .panelon{display:block;} 10 | .paneloff{display:none} 11 | 12 | .page{width:220px;margin:20px auto;overflow: hidden;} 13 | .pageon{float:right;width:24px;line-height:24px;height:24px;margin-right: 5px;background: none;border: none;color: #000;font-weight: bold;text-align:center} 14 | .pageoff{float:right;width:24px;line-height:24px;height:24px;cursor:pointer;background-color: #fff; 15 | border: 1px solid #E7ECF0;color: #2D64B3;margin-right: 5px;text-decoration: none;text-align:center;} 16 | 17 | .m-box{width:460px;} 18 | .m-m{float: left;line-height: 20px;height: 20px;} 19 | .m-h{height:24px;line-height:24px;padding-left: 46px;background-color:#FAFAFA;border-bottom: 1px solid #DAD8D8;font-weight: bold;font-size: 12px;color: #333;} 20 | .m-l{float:left;width:40px; } 21 | .m-t{float:left;width:140px;} 22 | .m-s{float:left;width:110px;} 23 | .m-z{float:left;width:100px;} 24 | .m-try-t{float: left;width: 60px;;} 25 | 26 | .m-try{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/try_music.gif') no-repeat ;} 27 | .m-trying{float:left;width:20px;height:20px;background:url('http://static.tieba.baidu.com/tb/editor/images/stop_music.gif') no-repeat ;} 28 | 29 | .loading{width:95px;height:7px;font-size:7px;margin:60px auto;background:url(http://static.tieba.baidu.com/tb/editor/images/loading.gif) no-repeat} 30 | .empty{width:300px;height:40px;padding:2px;margin:50px auto;line-height:40px; color:#006699;text-align:center;} --------------------------------------------------------------------------------