X Tutup
Skip to content

Commit c519d60

Browse files
author
leijiankun
committed
Update new theme with bootstrap4
1 parent 0f6d25b commit c519d60

File tree

16 files changed

+313
-115
lines changed

16 files changed

+313
-115
lines changed

bower.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
"fontawesome": "4.7.0",
1010
"marked": "0.3.5",
1111
"to-markdown": "1.3.0",
12-
"adminlte": "2.3.6",
1312
"highlightjs": "9.12.0",
14-
"ace-builds": "1.2.9"
13+
"ace-builds": "1.2.9",
14+
"contents": "4.0.2",
15+
"sticky-kit": "1.1.2"
1516
},
1617
"devDependencies": {}
1718
}

src/main/java/com/raysmond/blog/controllers/PostController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ public String show(@PathVariable String permalink, Model model) {
5858
model.addAttribute("post", post);
5959
model.addAttribute("tags", postService.getPostTags(post));
6060

61+
postService.incrementViews(post.getId());
62+
6163
return "posts/post";
6264
}
6365

src/main/java/com/raysmond/blog/forms/PostForm.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import com.raysmond.blog.models.support.PostFormat;
44
import com.raysmond.blog.models.support.PostStatus;
5+
56
import lombok.Data;
7+
68
import org.hibernate.validator.constraints.NotEmpty;
79

810
import javax.validation.constraints.NotNull;
@@ -18,6 +20,9 @@ public class PostForm {
1820
@NotEmpty
1921
private String content;
2022

23+
@NotEmpty
24+
private String summary;
25+
2126
@NotNull
2227
private PostFormat postFormat;
2328

src/main/java/com/raysmond/blog/models/Post.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import com.raysmond.blog.models.support.PostFormat;
44
import com.raysmond.blog.models.support.PostStatus;
55
import com.raysmond.blog.models.support.PostType;
6+
67
import lombok.Getter;
78
import lombok.Setter;
9+
810
import org.hibernate.annotations.Type;
911
import org.springframework.util.StringUtils;
1012

1113
import javax.persistence.*;
14+
1215
import java.text.SimpleDateFormat;
1316
import java.util.HashSet;
1417
import java.util.Set;
@@ -35,6 +38,12 @@ public class Post extends BaseModel {
3538
@Type(type = "text")
3639
private String renderedContent;
3740

41+
@Type(type = "text")
42+
private String summary;
43+
44+
@Type(type = "text")
45+
private String renderedSummary;
46+
3847
@Column(nullable = false)
3948
@Enumerated(EnumType.STRING)
4049
private PostStatus postStatus = PostStatus.PUBLISHED;
@@ -56,9 +65,16 @@ public class Post extends BaseModel {
5665

5766
private String permalink;
5867

68+
private Integer views = 0;
69+
70+
public Integer getViews() {
71+
return views == null ? 0 : views;
72+
}
73+
5974
public String getRenderedContent() {
60-
if (this.postFormat == PostFormat.MARKDOWN)
75+
if (this.postFormat == PostFormat.MARKDOWN) {
6176
return renderedContent;
77+
}
6278

6379
return getContent();
6480
}
@@ -67,5 +83,4 @@ public void setPermalink(String permalink) {
6783
String token = permalink.toLowerCase().replace("\n", " ").replaceAll("[^a-z\\d\\s]", " ");
6884
this.permalink = StringUtils.arrayToDelimitedString(StringUtils.tokenizeToStringArray(token, " "), "-");
6985
}
70-
7186
}

src/main/java/com/raysmond/blog/repositories/PostRepository.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
* @author Raysmond
1818
*/
1919
@Repository
20-
@Transactional
2120
public interface PostRepository extends JpaRepository<Post, Long> {
2221
Post findByPermalinkAndPostStatus(String permalink, PostStatus postStatus);
2322

src/main/java/com/raysmond/blog/services/PostService.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import org.springframework.data.domain.PageRequest;
2121
import org.springframework.data.domain.Pageable;
2222
import org.springframework.data.domain.Sort;
23+
import org.springframework.scheduling.annotation.Async;
2324
import org.springframework.stereotype.Service;
25+
import org.springframework.transaction.annotation.Transactional;
2426

2527
import java.util.ArrayList;
2628
import java.util.HashSet;
@@ -33,6 +35,7 @@
3335
*/
3436
@Service
3537
@Slf4j
38+
@Transactional
3639
public class PostService {
3740
public static final String CACHE_NAME = "cache.post";
3841
public static final String CACHE_NAME_ARCHIVE = CACHE_NAME + ".archive";
@@ -89,6 +92,7 @@ public Post getPublishedPostByPermalink(String permalink) {
8992
public Post createPost(Post post) {
9093
if (post.getPostFormat() == PostFormat.MARKDOWN) {
9194
post.setRenderedContent(Markdown.markdownToHtml(post.getContent()));
95+
post.setRenderedSummary(Markdown.markdownToHtml(post.getSummary()));
9296
}
9397

9498
return postRepository.save(post);
@@ -105,6 +109,7 @@ public Post createPost(Post post) {
105109
public Post updatePost(Post post) {
106110
if (post.getPostFormat() == PostFormat.MARKDOWN) {
107111
post.setRenderedContent(Markdown.markdownToHtml(post.getContent()));
112+
post.setRenderedSummary(Markdown.markdownToHtml(post.getSummary()));
108113
}
109114

110115
return postRepository.save(post);
@@ -217,4 +222,13 @@ public List<Object[]> countPostsByTags() {
217222

218223
return postRepository.countPostsByTags(PostStatus.PUBLISHED);
219224
}
225+
226+
@Async
227+
public void incrementViews(Long postId) {
228+
synchronized(this) {
229+
Post post = postRepository.findOne(postId);
230+
post.setViews(post.getViews() + 1);
231+
postRepository.save(post);
232+
}
233+
}
220234
}

src/main/java/com/raysmond/blog/support/web/PegDownMarkdownService.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.pegdown.ast.RootNode;
55
import org.springframework.beans.factory.annotation.Qualifier;
66
import org.springframework.stereotype.Service;
7+
import org.springframework.util.StringUtils;
78

89
import java.util.Collections;
910

@@ -17,16 +18,19 @@ public class PegDownMarkdownService implements MarkdownService {
1718
private final PegDownProcessor pegdown;
1819

1920
public PegDownMarkdownService() {
20-
pegdown = new PegDownProcessor(Extensions.ALL);
21+
pegdown = new PegDownProcessor(Extensions.ALL ^ Extensions.EXTANCHORLINKS);
2122
}
2223

2324
@Override
2425
public String renderToHtml(String markdownSource) {
26+
if (StringUtils.isEmpty(markdownSource)) {
27+
return null;
28+
}
2529
// synchronizing on pegdown instance since neither the processor nor the underlying parser is thread-safe.
26-
synchronized (pegdown) {
30+
synchronized(pegdown) {
2731
RootNode astRoot = pegdown.parseMarkdown(markdownSource.toCharArray());
2832
ToHtmlSerializer serializer = new ToHtmlSerializer(new LinkRenderer());
29-
// Collections.singletonMap(VerbatimSerializer.DEFAULT, PygmentsVerbatimSerializer.INSTANCE));
33+
// Collections.singletonMap(VerbatimSerializer.DEFAULT, PygmentsVerbatimSerializer.INSTANCE));
3034
return serializer.toHtml(astRoot);
3135
}
3236
}

src/main/resources/static/css/admin/admin.css

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
body {
2-
-webkit-font-smoothing: antialiased;
32
color: #434343;
3+
font-size: 14px;
44
}
55

66
.main-container {
@@ -28,6 +28,10 @@ td.operations a {
2828
height: 430px;
2929
width: 100%;
3030
}
31+
.post-form #summary-editor {
32+
height: 230px;
33+
width: 100%;
34+
}
3135

3236
.settings-form tbody td.setting-label {
3337
width: 250px;
Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,28 @@
11
html {
22
font-size: 14px;
3+
color: #444;
34
}
5+
6+
body {
7+
color: #444;
8+
}
9+
410
@media (min-width: 768px) {
511
html {
6-
font-size: 16px;
12+
font-size: 14px;
713
}
814
}
915

1016
.container {
11-
max-width: 960px;
17+
max-width: 900px;
18+
}
19+
20+
.main {
21+
background: #FBFBFB;
22+
}
23+
24+
.logo a {
25+
color: #444;
1226
}
1327

1428
.pricing-header {
@@ -19,7 +33,58 @@ html {
1933
min-width: 220px;
2034
}
2135

22-
.border-top { border-top: 1px solid #e5e5e5; }
23-
.border-bottom { border-bottom: 1px solid #e5e5e5; }
36+
.border-top {
37+
border-top: 1px solid #e5e5e5;
38+
}
39+
40+
.border-bottom {
41+
border-bottom: 1px solid #e5e5e5;
42+
}
43+
44+
.box-shadow {
45+
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
46+
}
47+
48+
a {
49+
color: #409eff;
50+
}
51+
52+
a:hover {
53+
text-decoration: none;
54+
}
55+
56+
/* topbar */
57+
nav.topbar > a {
58+
color: #444;
59+
}
60+
61+
nav.topbar > a:focus, nav.topbar > a:hover, nav.topbar > a:active {
62+
color: #409eff;
63+
}
64+
65+
/* post */
66+
.blog-post a.post-title > h2 {
67+
color: #444;
68+
}
69+
70+
.post-content h1 > a,
71+
.post-content h2 > a,
72+
.post-content h3 > a,
73+
.post-content h4 > a,
74+
.post-content h5 > a,
75+
.post-content h6 > a {
76+
color: #444;
77+
}
78+
79+
.post-content img {
80+
max-width: 100%;
81+
}
82+
83+
#post-contents ol {
84+
padding-left: 20px;
85+
}
2486

25-
.box-shadow { box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); }
87+
#post-contents ol li a {
88+
color: #444;
89+
font-size: 13px;
90+
}

src/main/resources/templates/admin/posts/edit.jade

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,24 @@ block content
1212
form.post-form(method="post",action="/admin/posts/#{post.getId()}")
1313
.item-row
1414
input(type="hidden", name='_csrf', value='#{_csrf.token}')
15-
.item-row
15+
.form-group
16+
label 标题
1617
input.form-control(type="text", name="title", value='#{postForm.getTitle()}')
17-
.item-row
18+
19+
.form-group
20+
label 正文
1821
textarea.form-control#content(name="content", style="display:none;")
1922
= postForm.getContent()
2023
div#content-editor
2124
#{postForm.getContent()}
25+
26+
.form-group
27+
label 摘要
28+
textarea.form-control#summary(name="summary", style="display:none;")
29+
= postForm.getSummary()
30+
div#summary-editor
31+
#{postForm.getSummary()}
32+
2233
.item-row
2334
hr
2435
.row
@@ -47,18 +58,25 @@ block content
4758
input.form-control(name="postTags", value="#{postForm.getPostTags()}")
4859
.item-row
4960
hr
50-
button.btn.btn-primary.btn-block(type="submit") Save
61+
button.btn.btn-primary.btn-lg(type="submit") Save
62+
hr
5163

5264
script
5365
var editor = ace.edit("content-editor");
54-
editor.setTheme("ace/theme/github")
66+
var summaryEditor = ace.edit("summary-editor");
67+
68+
editor.setTheme("ace/theme/github");
69+
summaryEditor.setTheme("ace/theme/github");
5570

5671
var MarkdownMode = ace.require("ace/mode/markdown").Mode;
5772
editor.getSession().setMode(new MarkdownMode());
58-
5973
editor.getSession().setUseWrapMode(true);
6074

75+
summaryEditor.getSession().setMode(new MarkdownMode());
76+
summaryEditor.getSession().setUseWrapMode(true);
77+
6178
$("form").submit(function(){
6279
$("#content").val(editor.getValue());
80+
$("#summary").val(summaryEditor.getValue());
6381
return true;
6482
});

0 commit comments

Comments
 (0)
X Tutup