├── .editorconfig ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── build.gradle ├── doc ├── chinesereadme.md ├── sql │ ├── AboutPo.sql │ ├── CommentPO.sql │ ├── ContentTagRelation.sql │ ├── Content_update_2017-01-03.sql │ ├── ExecutionTimeLog.sql │ ├── TagPo.sql │ └── newAddDDL.sql └── todo.md ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── prod.bat ├── screencut ├── add_content.png ├── archive.png ├── gif │ ├── add.gif │ └── base.gif ├── index.png ├── register.png └── search.png ├── settings.gradle ├── sh ├── publish.sh ├── serverbuildjarpublish.sh ├── serverbuildjarstop.sh └── stop.sh └── src ├── main ├── docker │ ├── DockerFile │ └── Dockerfile ├── java │ └── com │ │ ├── App.java │ │ ├── generator │ │ ├── ProdTemplateGenerator.java │ │ └── ReplacePair.java │ │ └── rest │ │ ├── Request │ │ ├── AddContentRequest.java │ │ ├── AddTagRequest.java │ │ ├── CommentRequest.java │ │ ├── DeleteTagRequest.java │ │ ├── EditAboutRequest.java │ │ ├── EditContentRequest.java │ │ ├── EditTagRequest.java │ │ ├── LoginRequest.java │ │ ├── MyBatisLogRequest.java │ │ ├── RegisterRequest.java │ │ └── ReplyCommentRequest.java │ │ ├── annotation │ │ ├── AuthEnum.java │ │ ├── ExecutionTime.java │ │ ├── NeedAuth.java │ │ └── SwaggerIgnore.java │ │ ├── aop │ │ └── ExecutionTimeAspect.java │ │ ├── bean │ │ └── User.java │ │ ├── config │ │ ├── BlogProperty.java │ │ ├── Constants.java │ │ ├── MyWebAppConfigurer.java │ │ ├── SwaggerConfig.java │ │ └── dev │ │ │ └── DevDbConfig.java │ │ ├── constant │ │ ├── CookieConstants.java │ │ ├── LuceneFieldConstant.java │ │ ├── MarkDownConstant.java │ │ └── SessionConstants.java │ │ ├── controller │ │ ├── AboutController.java │ │ ├── ArchivesController.java │ │ ├── ArticleController.java │ │ ├── ChangeLanguageController.java │ │ ├── CommentController.java │ │ ├── LoginController.java │ │ ├── LogoutController.java │ │ ├── MyBatisLoggerController.java │ │ ├── PageListController.java │ │ ├── RegisterController.java │ │ ├── SearchController.java │ │ ├── TagController.java │ │ ├── TestController.java │ │ ├── admin │ │ │ ├── AdminController.java │ │ │ ├── ContentAddController.java │ │ │ ├── EditAboutController.java │ │ │ ├── EditController.java │ │ │ ├── ExecutionTimeController.java │ │ │ └── UploadImageController.java │ │ ├── customException │ │ │ ├── RegisterValidateException.java │ │ │ ├── TransactionException.java │ │ │ ├── UserAlreadyExistException.java │ │ │ ├── UserNotAuthRestException.java │ │ │ ├── UserNotExistException.java │ │ │ └── UserSessionTimeOutException.java │ │ ├── errors │ │ │ ├── CustomParameterizedException.java │ │ │ ├── ErrorConstants.java │ │ │ ├── ErrorVM.java │ │ │ ├── ExceptionTranslator.java │ │ │ ├── FieldErrorVM.java │ │ │ └── ParameterizedErrorVM.java │ │ └── response │ │ │ ├── LoginResponse.java │ │ │ ├── MyBatisLogResponse.java │ │ │ └── TextAndValue.java │ │ ├── converter │ │ ├── AriveConverter.java │ │ ├── CommentConvert.java │ │ ├── ContentConverter.java │ │ └── UserConverter.java │ │ ├── domain │ │ ├── AboutPo.java │ │ ├── AboutPo_update_2017-02-15.sql │ │ ├── Archives.java │ │ ├── CommentPO.java │ │ ├── Content.java │ │ ├── ContentTagRelation.java │ │ ├── ContentTime.java │ │ ├── ExecutionTimeLog.java │ │ ├── MyBatisLog.java │ │ ├── MyBatisLog.sql │ │ ├── TagPo.java │ │ └── UserPO.java │ │ ├── dto │ │ └── SearchResult.java │ │ ├── enums │ │ └── StatusEnum.java │ │ ├── event │ │ ├── DatabaseEventListener.java │ │ └── ExecutionTimeLogEvent.java │ │ ├── exception │ │ └── UserNotLoginException.java │ │ ├── intercetors │ │ ├── AccessInterceptor.java │ │ ├── AuthInterceptor.java │ │ └── ExecutionInterceptor.java │ │ ├── local │ │ └── MyLocaleCookieLocaleResolver.java │ │ ├── mapper │ │ ├── AboutPoDao.java │ │ ├── CommentPODao.java │ │ ├── ContentMapper.java │ │ ├── ContentTagRelationDao.java │ │ ├── ContentTimeMapper.java │ │ ├── ExecutionTimeLogDao.java │ │ ├── MyBatisLogDao.java │ │ ├── TagPoDao.java │ │ └── UserPODao.java │ │ ├── response │ │ ├── BaseResponse.java │ │ ├── CodeConstants.java │ │ ├── CodeEnum.java │ │ └── MsgConstants.java │ │ ├── scheduled │ │ ├── DumpMysql.java │ │ ├── ScheduledTask.java │ │ └── upload │ │ │ └── UploadDemo.java │ │ ├── service │ │ ├── AboutService.java │ │ ├── ContentService.java │ │ ├── LoginService.java │ │ ├── MessageSourceService.java │ │ ├── MyBatisLogService.java │ │ ├── SearchService.java │ │ ├── TagPoService.java │ │ └── disposer │ │ │ └── StaticResourceDisposaber.java │ │ ├── storage │ │ ├── FileSystemStorageService.java │ │ ├── StorageExceptioin.java │ │ ├── StorageFileNotFoundException.java │ │ ├── StorageProperties.java │ │ └── StorageService.java │ │ ├── utils │ │ ├── AntiSamyUtils.java │ │ ├── DbUtils.java │ │ ├── GsonUtils.java │ │ ├── HttpHeaderUtil.java │ │ ├── IpUtils.java │ │ ├── MarkDownUtil.java │ │ ├── MarkdownRequest.java │ │ ├── ScriptRunner.java │ │ └── SessionUtils.java │ │ └── vo │ │ ├── ArchiveVo.java │ │ ├── CommentVo.java │ │ ├── ContentForTagVo.java │ │ ├── ContentVo.java │ │ ├── MyBatisLogVo.java │ │ ├── PageContentVo.java │ │ ├── QueryResultVo.java │ │ └── TagVo.java └── resources │ ├── MessagesBundle.properties │ ├── MessagesBundle_en_US.properties │ ├── MessagesBundle_zh_CN.properties │ ├── MessagesBundle_zh_TW.properties │ ├── antisamy-myspace-1.4.4.xml │ ├── application-dev.yml │ ├── application-prod.yml │ ├── application.yml │ ├── ddl.sql │ ├── favicon.ico │ ├── liquibase.properties │ ├── logback-spring.xml │ ├── mapper │ ├── AboutPoDao.xml │ ├── CommentPODao.xml │ ├── ContentMapper.xml │ ├── ContentTagRelationDao.xml │ ├── ContentTimeMapper.xml │ ├── ExecutionTimeLogDao.xml │ ├── MyBatisLogDao.xml │ ├── TagPoDao.xml │ └── UserPODao.xml │ ├── mybatis-config.xml │ ├── public │ └── error │ │ └── 404.html │ ├── static │ ├── css │ │ ├── admin.css │ │ ├── blog.css │ │ ├── bootstrap-markdown.min.css │ │ ├── bootstrap-tagsinput.css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ ├── bootstrap.min.css.map │ │ ├── comment.css │ │ ├── fastselect.css │ │ ├── font-awesome.css │ │ ├── jquery-comments.css │ │ ├── login.css │ │ ├── markdown.css │ │ └── search.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ ├── fontawesome-webfont.woff2 │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── img │ │ ├── add_content.png │ │ ├── anonymous.gif │ │ ├── article-marketing-black.png │ │ ├── article-marketing.png │ │ ├── calendar (1).png │ │ ├── calendar.png │ │ ├── dashboard.png │ │ ├── edit-content.png │ │ ├── email.png │ │ ├── folded-newspaper (1).png │ │ ├── folded-newspaper.png │ │ ├── home.png │ │ ├── logout.png │ │ ├── message-closed-envelope.png │ │ ├── mypic.jpg │ │ ├── price-tag.png │ │ ├── reply.png │ │ ├── rubbish-bin.png │ │ ├── tag.png │ │ └── user.png │ └── js │ │ ├── admin │ │ └── markdown.js │ │ ├── autosize.min.js │ │ ├── bootbox.min.js │ │ ├── bootstrap-tagsinput.js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── bootstrap3-typeahead.js │ │ ├── esprima.js │ │ ├── fastsearch.js │ │ ├── fastselect.js │ │ ├── fastselect.standalone.js │ │ ├── i18n │ │ ├── en_US.js │ │ ├── zh_CN.js │ │ └── zh_TW.js │ │ ├── jquery-3.1.1.min.js │ │ ├── jquery-comments.min.js │ │ ├── jquery-ui.min.js │ │ ├── jquery.validate.min.js │ │ ├── mymarkdown.js │ │ ├── npm.js │ │ ├── showdown.js │ │ ├── showdown.min.js │ │ └── xss.js │ └── templates │ ├── about.ftl │ ├── add.ftl │ ├── admin.ftl │ ├── archive.ftl │ ├── article.ftl │ ├── edit.ftl │ ├── footerjs.ftl │ ├── head_header.ftl │ ├── header.ftl │ ├── header_admin.ftl │ ├── index.ftl │ ├── login.ftl │ ├── markdown.ftl │ ├── markdown_btngroup.ftl │ ├── markdown_modal.ftl │ ├── mybatisLogView.ftl │ ├── searchPage.ftl │ ├── tag.ftl │ ├── tagContent.ftl │ ├── test.ftl │ ├── test_verticle.ftl │ └── uploadForm.ftl └── test └── java ├── basic └── AbstractTest.java └── com ├── MarkDownTest.java ├── MybatisApplicationTest.java ├── PropertyTest.java ├── RestApplicationTest.java └── rest ├── FileTest.java ├── exception └── ExceptionTest.java ├── i18n └── I18NSample.java ├── jsoup └── XssTest.java ├── mapper ├── ContentMapperTest.java ├── ContentTimeMapperTest.java ├── ExecutionTimeLogDaoTest.java └── TagMapperTest.java ├── markdown ├── ExtractLinkTest.java └── MarkDownMatcherTest.java ├── service └── UserPOServiceTest.java ├── utils ├── GuavaTest.java ├── JoinerTest.java ├── RandomStringUtilsTest.java ├── SearchServiceTest.java └── StringUtilsTest.java └── xss └── AntiSamyTest.java /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | indent_style = space 9 | 10 | [*.{java,xml}] 11 | indent_size = 4 12 | trim_trailing_whitespace = true 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | /.gradle/ 3 | /logs/ 4 | /out/ 5 | /.idea/ 6 | /build/ 7 | *.log 8 | *.iml 9 | /node_modules/ 10 | /src/main/resources/prod-templates/ 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: java 2 | jdk: oraclejdk8 3 | install: true 4 | before_install: 5 | - chmod +x gradlew 6 | script: 7 | - ./gradlew build -x test 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | v1.0 2 | ----------------------- 3 | * 使用gradle来部署 4 | * 基本功能都可以工作 5 | 6 | 7 | v1.1 (UNRELEASED) 8 | --------------------------- 9 | * 使用shiro来进行权限管理 10 | * 改善markdown遇到xss的显示 11 | * 改善界面 12 | * 可以在界面上更改语言 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [bootstrap-java-blog](https://brucege.com) 2 | 3 | [](https://travis-ci.org/gejun123456/bootstrap-java-blog) 4 |
8 | * throw new CustomParameterizedException("myCustomError", "hello", "world"); 9 | *10 | * 11 | * Can be translated with: 12 | * 13 | *
14 | * "error.myCustomError" : "The server says {{params[0]}} to {{params[1]}}" 15 | *16 | */ 17 | public class CustomParameterizedException extends RuntimeException { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | private final String message; 22 | private final String[] params; 23 | 24 | public CustomParameterizedException(String message, String... params) { 25 | super(message); 26 | this.message = message; 27 | this.params = params; 28 | } 29 | 30 | public ParameterizedErrorVM getErrorVM() { 31 | return new ParameterizedErrorVM(message, params); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/rest/controller/errors/ErrorConstants.java: -------------------------------------------------------------------------------- 1 | package com.rest.controller.errors; 2 | 3 | public final class ErrorConstants { 4 | 5 | public static final String ERR_CONCURRENCY_FAILURE = "error.concurrencyFailure"; 6 | public static final String ERR_ACCESS_DENIED = "error.accessDenied"; 7 | public static final String ERR_VALIDATION = "error.validation"; 8 | public static final String ERR_METHOD_NOT_SUPPORTED = "error.methodNotSupported"; 9 | public static final String ERR_INTERNAL_SERVER_ERROR = "error.internalServerError"; 10 | public static final String ERR_ALREADYEXIST = "error.userAlreadyExist"; 11 | public static final String ERR_NOTRESTAUTH = "error.notrestauth"; 12 | 13 | public static final String ERR_USERNOTEXIST = "error.userNotExist"; 14 | 15 | private ErrorConstants() { 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/rest/controller/errors/ErrorVM.java: -------------------------------------------------------------------------------- 1 | package com.rest.controller.errors; 2 | 3 | import java.io.Serializable; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | 7 | /** 8 | * View Model for transferring error message with a list of field errors. 9 | */ 10 | public class ErrorVM implements Serializable { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | private final String message; 15 | private final String description; 16 | 17 | private List
Sorry, but the page you were trying to view does not exist.
58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /src/main/resources/static/css/admin.css: -------------------------------------------------------------------------------- 1 | 2 | * { 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | body { 8 | font-family: 'Roboto', sans-serif; 9 | font-size: 1.4em; 10 | } 11 | 12 | div#header { 13 | width: 100%; 14 | height: 50px;; 15 | background-color: #2c3e50; 16 | } 17 | 18 | .logo { 19 | float: left; 20 | margin-top: 4px;; 21 | font-size: 1.8em;; 22 | margin-left: 10px;; 23 | color: #ffffff; 24 | } 25 | 26 | .mypanel { 27 | margin-top: 5px;; 28 | font-size: 1.2em; 29 | color: #ffffff; 30 | margin-right: 20px;; 31 | float: right; 32 | } 33 | 34 | .mypanel button { 35 | padding: 0; 36 | padding-top: 4px; 37 | border: none; 38 | background: none; 39 | font-size: 1.0em;; 40 | vertical-align: top; 41 | /*height:100%;*/ 42 | } 43 | 44 | .mypanel button span { 45 | color: #ffffff;; 46 | font-size: 1.2em;; 47 | /*line-height: 0px;;*/ 48 | /*line-height: 30px;;*/ 49 | /*height: 31px;;*/ 50 | display: inline-block; 51 | vertical-align: top; 52 | margin-right: 10px;; 53 | margin-top: 5px;; 54 | /*padding-top:15px;*/ 55 | } 56 | 57 | /*.mypanel button img{*/ 58 | /*vertical-align: top;*/ 59 | /*}*/ 60 | 61 | .mypanel button:focus { 62 | outline: 0; 63 | } 64 | 65 | div#sidebar { 66 | float: left; 67 | width: 250px; 68 | height: 100%; 69 | background-color: #16a085; 70 | } 71 | 72 | div#sidebar ul li a span{ 73 | display: inline-block; 74 | /*vertical-align: top;*/ 75 | margin-top: 5px; 76 | } 77 | 78 | /*div#sidebar ul{*/ 79 | /**/ 80 | /*}*/ 81 | 82 | ul li { 83 | list-style: none; 84 | } 85 | 86 | ul li a { 87 | display: block; 88 | color: #ffffff;; 89 | font-size: 1.2em; 90 | padding: 10px; 91 | border-bottom: 1px solid; 92 | text-decoration: none; 93 | } 94 | 95 | ul li a img { 96 | vertical-align: top; 97 | } 98 | 99 | ul li a:hover { 100 | background-color: #000000; 101 | } 102 | 103 | #addContent { 104 | margin-left: 260px; 105 | } 106 | 107 | #editAboutLinkContent{ 108 | margin-left: 260px; 109 | } 110 | 111 | #sourceContent { 112 | width: 48%; 113 | float: left; 114 | /*border-right:solid;*/ 115 | } 116 | 117 | #aboutSourceContent{ 118 | width: 48%; 119 | float: left; 120 | } 121 | 122 | #aboutMarkDownContent{ 123 | margin-left: 50%; 124 | height: 80%; 125 | overflow-y: scroll; 126 | border:2px solid #eee; 127 | } 128 | #markdownContent { 129 | margin-left: 50%; 130 | height: 80%; 131 | overflow-y: scroll; 132 | border:2px solid #eee; 133 | } 134 | 135 | #sourceContentValue { 136 | width: 98%;; 137 | min-height: 65%; 138 | overflow-y: scroll; 139 | } 140 | 141 | #editAboutValue{ 142 | width: 98%;; 143 | min-height: 65%; 144 | overflow-y: scroll; 145 | } 146 | 147 | #sourceContentTitle{ 148 | width:98%;; 149 | } 150 | 151 | #addContentHeader { 152 | height: 30px;; 153 | font-size: 20px; 154 | color: #9b59b6; 155 | margin-bottom: 15px; 156 | text-align: center; 157 | } 158 | 159 | #addContentHeader span{ 160 | margin-left: 10px; 161 | } 162 | -------------------------------------------------------------------------------- /src/main/resources/static/css/bootstrap-markdown.min.css: -------------------------------------------------------------------------------- 1 | .md-editor{display:block;border:1px solid #ddd}.md-editor .md-footer,.md-editor>.md-header{display:block;padding:6px 4px;background:#f5f5f5}.md-editor>.md-header{margin:0}.md-editor>.md-preview{background:#fff;border-top:1px dashed #ddd;border-bottom:1px dashed #ddd;min-height:10px;overflow:auto}.md-editor>textarea{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;font-size:14px;outline:0;margin:0;display:block;padding:0;width:100%;border:0;border-top:1px dashed #ddd;border-bottom:1px dashed #ddd;border-radius:0;box-shadow:none;background:#eee}.md-editor>textarea:focus{box-shadow:none;background:#fff}.md-editor.active{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.md-editor .md-controls{float:right;padding:3px}.md-editor .md-controls .md-control{right:5px;color:#bebebe;padding:3px 3px 3px 10px}.md-editor .md-controls .md-control:hover{color:#333}.md-editor.md-fullscreen-mode{width:100%;height:100%;position:fixed;top:0;left:0;z-index:99999;padding:60px 30px 15px;background:#fff!important;border:0!important}.md-editor.md-fullscreen-mode .md-footer{display:none}.md-editor.md-fullscreen-mode .md-input,.md-editor.md-fullscreen-mode .md-preview{margin:0 auto!important;height:100%!important;font-size:20px!important;padding:20px!important;color:#999;line-height:1.6em!important;resize:none!important;box-shadow:none!important;background:#fff!important;border:0!important}.md-editor.md-fullscreen-mode .md-preview{color:#333;overflow:auto}.md-editor.md-fullscreen-mode .md-input:focus,.md-editor.md-fullscreen-mode .md-input:hover{color:#333;background:#fff!important}.md-editor.md-fullscreen-mode .md-header{background:0 0;text-align:center;position:fixed;width:100%;top:20px}.md-editor.md-fullscreen-mode .btn-group{float:none}.md-editor.md-fullscreen-mode .btn{border:0;background:0 0;color:#b3b3b3}.md-editor.md-fullscreen-mode .btn.active,.md-editor.md-fullscreen-mode .btn:active,.md-editor.md-fullscreen-mode .btn:focus,.md-editor.md-fullscreen-mode .btn:hover{box-shadow:none;color:#333}.md-editor.md-fullscreen-mode .md-fullscreen-controls{position:absolute;top:20px;right:20px;text-align:right;z-index:1002;display:block}.md-editor.md-fullscreen-mode .md-fullscreen-controls a{color:#b3b3b3;clear:right;margin:10px;width:30px;height:30px;text-align:center}.md-editor.md-fullscreen-mode .md-fullscreen-controls a:hover{color:#333;text-decoration:none}.md-editor.md-fullscreen-mode .md-editor{height:100%!important;position:relative}.md-editor .md-fullscreen-controls{display:none}.md-nooverflow{overflow:hidden;position:fixed;width:100%} -------------------------------------------------------------------------------- /src/main/resources/static/css/bootstrap-tagsinput.css: -------------------------------------------------------------------------------- 1 | .bootstrap-tagsinput { 2 | background-color: #fff; 3 | border: 1px solid #ccc; 4 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 5 | display: inline-block; 6 | padding: 4px 6px; 7 | color: #555; 8 | vertical-align: middle; 9 | border-radius: 4px; 10 | max-width: 100%; 11 | line-height: 22px; 12 | cursor: text; 13 | } 14 | .bootstrap-tagsinput input { 15 | border: none; 16 | box-shadow: none; 17 | outline: none; 18 | background-color: transparent; 19 | padding: 0 6px; 20 | margin: 0; 21 | width: auto; 22 | max-width: inherit; 23 | } 24 | .bootstrap-tagsinput.form-control input::-moz-placeholder { 25 | color: #777; 26 | opacity: 1; 27 | } 28 | .bootstrap-tagsinput.form-control input:-ms-input-placeholder { 29 | color: #777; 30 | } 31 | .bootstrap-tagsinput.form-control input::-webkit-input-placeholder { 32 | color: #777; 33 | } 34 | .bootstrap-tagsinput input:focus { 35 | border: none; 36 | box-shadow: none; 37 | } 38 | .bootstrap-tagsinput .tag { 39 | margin-right: 2px; 40 | color: white; 41 | } 42 | .bootstrap-tagsinput .tag [data-role="remove"] { 43 | margin-left: 8px; 44 | cursor: pointer; 45 | } 46 | .bootstrap-tagsinput .tag [data-role="remove"]:after { 47 | content: "x"; 48 | padding: 0px 2px; 49 | } 50 | .bootstrap-tagsinput .tag [data-role="remove"]:hover { 51 | box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); 52 | } 53 | .bootstrap-tagsinput .tag [data-role="remove"]:hover:active { 54 | box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); 55 | } 56 | -------------------------------------------------------------------------------- /src/main/resources/static/css/comment.css: -------------------------------------------------------------------------------- 1 | .thumbnail { 2 | padding:0px; 3 | } 4 | .panel { 5 | position:relative; 6 | } 7 | .panel>.panel-heading:after,.panel>.panel-heading:before{ 8 | position:absolute; 9 | top:11px;left:-16px; 10 | right:100%; 11 | width:0; 12 | height:0; 13 | display:block; 14 | content:" "; 15 | border-color:transparent; 16 | border-style:solid solid outset; 17 | pointer-events:none; 18 | } 19 | .panel>.panel-heading:after{ 20 | border-width:7px; 21 | border-right-color:#f7f7f7; 22 | margin-top:1px; 23 | margin-left:2px; 24 | } 25 | .panel>.panel-heading:before{ 26 | border-right-color:#ddd; 27 | border-width:8px; 28 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/login.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 90px; 3 | background-color: #3498db; 4 | } 5 | .panel-login { 6 | border-color: #ccc; 7 | -webkit-box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.2); 8 | -moz-box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.2); 9 | box-shadow: 0px 2px 3px 0px rgba(0,0,0,0.2); 10 | } 11 | .panel-login>.panel-heading { 12 | color: #00415d; 13 | background-color: #fff; 14 | border-color: #fff; 15 | text-align:center; 16 | } 17 | .panel-login>.panel-heading a{ 18 | text-decoration: none; 19 | color: #666; 20 | font-weight: bold; 21 | font-size: 15px; 22 | -webkit-transition: all 0.1s linear; 23 | -moz-transition: all 0.1s linear; 24 | transition: all 0.1s linear; 25 | } 26 | .panel-login>.panel-heading a.active{ 27 | color: #029f5b; 28 | font-size: 18px; 29 | } 30 | .panel-login>.panel-heading hr{ 31 | margin-top: 10px; 32 | margin-bottom: 0px; 33 | clear: both; 34 | border: 0; 35 | height: 1px; 36 | background-image: -webkit-linear-gradient(left,rgba(0, 0, 0, 0),rgba(0, 0, 0, 0.15),rgba(0, 0, 0, 0)); 37 | background-image: -moz-linear-gradient(left,rgba(0,0,0,0),rgba(0,0,0,0.15),rgba(0,0,0,0)); 38 | background-image: -ms-linear-gradient(left,rgba(0,0,0,0),rgba(0,0,0,0.15),rgba(0,0,0,0)); 39 | background-image: -o-linear-gradient(left,rgba(0,0,0,0),rgba(0,0,0,0.15),rgba(0,0,0,0)); 40 | } 41 | .panel-login input[type="text"],.panel-login input[type="email"],.panel-login input[type="password"] { 42 | height: 45px; 43 | border: 1px solid #ddd; 44 | font-size: 16px; 45 | -webkit-transition: all 0.1s linear; 46 | -moz-transition: all 0.1s linear; 47 | transition: all 0.1s linear; 48 | } 49 | .panel-login input:hover, 50 | .panel-login input:focus { 51 | outline:none; 52 | -webkit-box-shadow: none; 53 | -moz-box-shadow: none; 54 | box-shadow: none; 55 | border-color: #ccc; 56 | } 57 | .btn-login { 58 | background-color: #59B2E0; 59 | outline: none; 60 | color: #fff; 61 | font-size: 14px; 62 | height: auto; 63 | font-weight: normal; 64 | padding: 14px 0; 65 | text-transform: uppercase; 66 | border-color: #59B2E6; 67 | } 68 | .btn-login:hover, 69 | .btn-login:focus { 70 | color: #fff; 71 | background-color: #53A3CD; 72 | border-color: #53A3CD; 73 | } 74 | .forgot-password { 75 | text-decoration: underline; 76 | color: #888; 77 | } 78 | .forgot-password:hover, 79 | .forgot-password:focus { 80 | text-decoration: underline; 81 | color: #666; 82 | } 83 | 84 | .btn-register { 85 | background-color: #1CB94E; 86 | outline: none; 87 | color: #fff; 88 | font-size: 14px; 89 | height: auto; 90 | font-weight: normal; 91 | padding: 14px 0; 92 | text-transform: uppercase; 93 | border-color: #1CB94A; 94 | } 95 | .btn-register:hover, 96 | .btn-register:focus { 97 | color: #fff; 98 | background-color: #1CA347; 99 | border-color: #1CA347; 100 | } 101 | -------------------------------------------------------------------------------- /src/main/resources/static/css/search.css: -------------------------------------------------------------------------------- 1 | #search { 2 | float: right; 3 | margin-top: 9px; 4 | width: 250px; 5 | } 6 | 7 | .search { 8 | padding: 5px 0; 9 | width: 230px; 10 | height: 30px; 11 | position: relative; 12 | left: 10px; 13 | float: left; 14 | line-height: 22px; 15 | } 16 | 17 | .search input { 18 | position: absolute; 19 | width: 200px; 20 | float: Left; 21 | margin-left: 0px; 22 | -webkit-transition: all 0.7s ease-in-out; 23 | -moz-transition: all 0.7s ease-in-out; 24 | -o-transition: all 0.7s ease-in-out; 25 | transition: all 0.7s ease-in-out; 26 | height: 30px; 27 | line-height: 18px; 28 | padding: 0 2px 0 2px; 29 | border-radius:1px; 30 | } 31 | 32 | .btn { 33 | height: 30px; 34 | position: absolute; 35 | right: 0; 36 | top: 5px; 37 | border-radius:1px; 38 | } 39 | -------------------------------------------------------------------------------- /src/main/resources/static/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/resources/static/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/img/add_content.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/add_content.png -------------------------------------------------------------------------------- /src/main/resources/static/img/anonymous.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/anonymous.gif -------------------------------------------------------------------------------- /src/main/resources/static/img/article-marketing-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/article-marketing-black.png -------------------------------------------------------------------------------- /src/main/resources/static/img/article-marketing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/article-marketing.png -------------------------------------------------------------------------------- /src/main/resources/static/img/calendar (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/calendar (1).png -------------------------------------------------------------------------------- /src/main/resources/static/img/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/calendar.png -------------------------------------------------------------------------------- /src/main/resources/static/img/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/dashboard.png -------------------------------------------------------------------------------- /src/main/resources/static/img/edit-content.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/edit-content.png -------------------------------------------------------------------------------- /src/main/resources/static/img/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/email.png -------------------------------------------------------------------------------- /src/main/resources/static/img/folded-newspaper (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/folded-newspaper (1).png -------------------------------------------------------------------------------- /src/main/resources/static/img/folded-newspaper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/folded-newspaper.png -------------------------------------------------------------------------------- /src/main/resources/static/img/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/home.png -------------------------------------------------------------------------------- /src/main/resources/static/img/logout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/logout.png -------------------------------------------------------------------------------- /src/main/resources/static/img/message-closed-envelope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/message-closed-envelope.png -------------------------------------------------------------------------------- /src/main/resources/static/img/mypic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/mypic.jpg -------------------------------------------------------------------------------- /src/main/resources/static/img/price-tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/price-tag.png -------------------------------------------------------------------------------- /src/main/resources/static/img/reply.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/reply.png -------------------------------------------------------------------------------- /src/main/resources/static/img/rubbish-bin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/rubbish-bin.png -------------------------------------------------------------------------------- /src/main/resources/static/img/tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/tag.png -------------------------------------------------------------------------------- /src/main/resources/static/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gejun123456/bootstrap-java-blog/3d053ad8f85ed8faa24e4945064ea7c46aa4616c/src/main/resources/static/img/user.png -------------------------------------------------------------------------------- /src/main/resources/static/js/i18n/en_US.js: -------------------------------------------------------------------------------- 1 | var messageStrings = { 2 | userNameExist : 'userName already exist, please reinput', 3 | mobileExist : 'mobile alrady exist, please reinput', 4 | emailExist: 'email already exist, please reinput', 5 | validateFail:"validate fail, please reinput", 6 | systemError:"system error", 7 | userNotExist:"user not exist", 8 | success:"success" 9 | }; 10 | -------------------------------------------------------------------------------- /src/main/resources/static/js/i18n/zh_CN.js: -------------------------------------------------------------------------------- 1 | $.extend($.validator.messages, { 2 | required: "这是必填字段", 3 | remote: "请修正此字段", 4 | email: "请输入有效的电子邮件地址", 5 | url: "请输入有效的网址", 6 | date: "请输入有效的日期", 7 | dateISO: "请输入有效的日期 (YYYY-MM-DD)", 8 | number: "请输入有效的数字", 9 | digits: "只能输入数字", 10 | creditcard: "请输入有效的信用卡号码", 11 | equalTo: "你的输入不相同", 12 | extension: "请输入有效的后缀", 13 | maxlength: $.validator.format("最多可以输入 {0} 个字符"), 14 | minlength: $.validator.format("最少要输入 {0} 个字符"), 15 | rangelength: $.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"), 16 | range: $.validator.format("请输入范围在 {0} 到 {1} 之间的数值"), 17 | max: $.validator.format("请输入不大于 {0} 的数值"), 18 | min: $.validator.format("请输入不小于 {0} 的数值") 19 | }); 20 | 21 | var messageStrings = { 22 | userNameExist: '用户名已经存在,请重新输入', 23 | mobileExist: '手机号已存在,请重新输入', 24 | emailExist: '邮箱已存在,请重新输入', 25 | validateFail: "验证失败,请重新输入", 26 | systemError:"系统错误", 27 | userNotExist:"用户不存在", 28 | success:"成功" 29 | }; 30 | 31 | -------------------------------------------------------------------------------- /src/main/resources/static/js/i18n/zh_TW.js: -------------------------------------------------------------------------------- 1 | $.extend($.validator.messages, { 2 | required: "這是必填字段", 3 | remote: "請修正此字段", 4 | email: "請輸入有效的電子郵件地址", 5 | url: "請輸入有效的網址", 6 | date: "請輸入有效的日期", 7 | dateISO: "請輸入有效的日期 (YYYY-MM-DD)", 8 | number: "請輸入有效的數字", 9 | digits: "只能輸入數字", 10 | creditcard: "請輸入有效的信用卡號碼", 11 | equalTo: "妳的輸入不相同", 12 | extension: "請輸入有效的後綴", 13 | maxlength: $.validator.format("最多可以輸入 {0} 個字符"), 14 | minlength: $.validator.format("最少要輸入 {0} 個字符"), 15 | rangelength: $.validator.format("請輸入長度在 {0} 到 {1} 之間的字符串"), 16 | range: $.validator.format("請輸入範圍在 {0} 到 {1} 之間的數值"), 17 | max: $.validator.format("請輸入不大于 {0} 的數值"), 18 | min: $.validator.format("請輸入不小于 {0} 的數值") 19 | }); 20 | 21 | 22 | var messageStrings = { 23 | userNameExist: '用戶名已經存在,請重新輸入', 24 | mobileExist: '手機號已存在,請重新輸入', 25 | emailExist: '郵箱已存在,請重新輸入', 26 | validateFail: "驗證失敗,請重新輸入", 27 | userNotExist:"user not exist", 28 | success:"成功" 29 | }; 30 | -------------------------------------------------------------------------------- /src/main/resources/static/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/resources/templates/about.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 | <#include "head_header.ftl"> 4 | 5 | 6 | <#include "header.ftl"> 7 |${co.markContent}
24 |
", Whitelist.basic());
16 | System.out.println(clean);
17 |
18 |
19 | String clean2 = Jsoup.clean("hello *you*", Whitelist.basic());
20 | boolean valid = Jsoup.isValid("hello *you*", Whitelist.basic());
21 | System.out.println(valid);
22 | System.out.println(clean2);
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/src/test/java/com/rest/mapper/ContentMapperTest.java:
--------------------------------------------------------------------------------
1 | package com.rest.mapper;
2 |
3 | import basic.AbstractTest;
4 | import com.rest.domain.Content;
5 | import org.junit.Test;
6 | import org.springframework.beans.factory.annotation.Autowired;
7 |
8 | import java.util.Date;
9 |
10 | /**
11 | * Created by bruce.ge on 2017/1/4.
12 | */
13 | public class ContentMapperTest extends AbstractTest {
14 | @Autowired
15 | private ContentMapper contentMapper;
16 |
17 |
18 | @Test
19 | public void testAdd() {
20 | Content content = new Content();
21 | content.setTitle("nima");
22 | content.setSource_content("woca");
23 | content.setHtml_content("wori
"); 24 | content.setUpdatetime(new Date()); 25 | content.setAddtime(new Date()); 26 | content.setIndex_content("hehe bitch"); 27 | content.setUserId(1); 28 | content.setStatus(10); 29 | int i = contentMapper.insert(content); 30 | System.out.println(i); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/test/java/com/rest/mapper/ContentTimeMapperTest.java: -------------------------------------------------------------------------------- 1 | package com.rest.mapper; 2 | 3 | import basic.AbstractTest; 4 | import com.rest.domain.Archives; 5 | import com.rest.domain.ContentTime; 6 | import org.junit.Test; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | 9 | import java.util.List; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Created by bruce.ge on 2016/11/7. 15 | */ 16 | public class ContentTimeMapperTest extends AbstractTest{ 17 | @Autowired 18 | private ContentTimeMapper contentTimeMapper; 19 | @Test 20 | public void insert() throws Exception { 21 | 22 | } 23 | 24 | @Test 25 | public void getDistinctYears() throws Exception { 26 | printToGson(contentTimeMapper.getDistinctYears()); 27 | } 28 | 29 | @Test 30 | public void findByYear() throws Exception { 31 | List