Skip to content

Commit 58582dc

Browse files
author
shimh-develop
committed
# 文章发表评论功能# 用户默认头像# 整理代码
1 parent 5c0d780 commit 58582dc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+807
-181
lines changed

blog-api/pom.xml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,13 @@
131131
<artifactId>commons-collections</artifactId>
132132
<version>3.2.2</version>
133133
</dependency>
134-
135-
136-
134+
135+
136+
137+
<dependency>
138+
<groupId>org.springframework</groupId>
139+
<artifactId>spring-webmvc-portlet</artifactId>
140+
</dependency>
137141
</dependencies>
138142

139143
<build>

blog-api/src/main/java/com/shimh/BlogApiApplication.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5-
import org.springframework.cache.annotation.EnableCaching;
65

76
@SpringBootApplication
87
public class BlogApiApplication {
98

109
public static void main(String[] args) {
11-
//SpringApplication.run(BlogApiApplication.class, args);
1210
SpringApplication app = new SpringApplication(BlogApiApplication.class);
1311
app.run(args);
1412
}

blog-api/src/main/java/com/shimh/common/cache/RedisManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
public class RedisManager {
1616

1717
/** 默认过期时长,单位:秒 */
18-
public final static long DEFAULT_EXPIRE = 60 * 1 * 1;
18+
public final static long DEFAULT_EXPIRE = 60 * 30 * 1;
1919
/** 不设置过期时长 */
2020
public final static long NOT_EXPIRE = -1;
2121

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package com.shimh.common.controlleradvice;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
5+
6+
import org.apache.shiro.session.Session;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.core.MethodParameter;
9+
import org.springframework.http.MediaType;
10+
import org.springframework.http.server.ServerHttpRequest;
11+
import org.springframework.http.server.ServerHttpResponse;
12+
import org.springframework.http.server.ServletServerHttpRequest;
13+
import org.springframework.http.server.ServletServerHttpResponse;
14+
import org.springframework.web.bind.annotation.ControllerAdvice;
15+
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
16+
17+
import com.shimh.common.cache.RedisManager;
18+
import com.shimh.common.result.Result;
19+
import com.shimh.oauth.OAuthSessionManager;
20+
21+
//@ControllerAdvice
22+
@Deprecated
23+
public class ClearTokenResponseBodyAdvice implements ResponseBodyAdvice{
24+
25+
//@Autowired
26+
private RedisManager redisManager;
27+
28+
29+
@Override
30+
public boolean supports(MethodParameter returnType, Class converterType) {
31+
return returnType.getGenericParameterType().equals(Result.class);
32+
}
33+
34+
35+
@Override
36+
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
37+
Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
38+
39+
HttpServletRequest httpRequest = ((ServletServerHttpRequest) request).getServletRequest();
40+
String token = httpRequest.getHeader(OAuthSessionManager.OAUTH_TOKEN);
41+
42+
HttpServletResponse httpResponse = ((ServletServerHttpResponse) response).getServletResponse();
43+
44+
if(null != token){
45+
Session s = redisManager.get(token, Session.class);
46+
47+
if(null == s || null == s.getId()){
48+
httpResponse.setHeader("SESSION_TIME_OUT", "timeout");
49+
}
50+
}
51+
52+
53+
return body;
54+
}
55+
56+
57+
58+
public RedisManager getRedisManager() {
59+
return redisManager;
60+
}
61+
62+
public void setRedisManager(RedisManager redisManager) {
63+
this.redisManager = redisManager;
64+
}
65+
66+
67+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.shimh.common.interceptor;
2+
3+
import javax.servlet.http.HttpServletRequest;
4+
import javax.servlet.http.HttpServletResponse;
5+
6+
import org.apache.shiro.session.Session;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
9+
10+
import com.shimh.common.cache.RedisManager;
11+
import com.shimh.oauth.OAuthSessionManager;
12+
/**
13+
* Session超时,通知前端删除token
14+
*
15+
* @author shimh
16+
*
17+
* 2018年1月30日
18+
*
19+
*/
20+
public class ClearTokenInteceptor extends HandlerInterceptorAdapter{
21+
22+
private static final String SESSION_TIME_OUT_K = "SESSION_TIME_OUT";
23+
private static final String SESSION_TIME_OUT_V = "timeout";
24+
25+
@Autowired
26+
private RedisManager redisManager;
27+
28+
29+
@Override
30+
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
31+
throws Exception {
32+
33+
String token = request.getHeader(OAuthSessionManager.OAUTH_TOKEN);
34+
35+
if(null != token){
36+
Session s = redisManager.get(token, Session.class);
37+
38+
if(null == s || null == s.getId()){
39+
response.setHeader(SESSION_TIME_OUT_K, SESSION_TIME_OUT_V);
40+
}
41+
}
42+
43+
return super.preHandle(request, response, handler);
44+
}
45+
46+
}

blog-api/src/main/java/com/shimh/config/WebMvcConfig.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,32 @@
77
import org.springframework.context.annotation.Configuration;
88
import org.springframework.http.MediaType;
99
import org.springframework.http.converter.HttpMessageConverter;
10+
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
1011
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
1112

1213
import com.alibaba.fastjson.serializer.SerializerFeature;
1314
import com.alibaba.fastjson.support.config.FastJsonConfig;
1415
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
1516
import com.alibaba.fastjson.support.spring.FastJsonViewResponseBodyAdvice;
17+
import com.shimh.common.interceptor.ClearTokenInteceptor;
1618

1719
@Configuration
1820
public class WebMvcConfig extends WebMvcConfigurerAdapter{
1921

2022

23+
@Override
24+
public void addInterceptors(InterceptorRegistry registry) {
25+
26+
registry.addInterceptor(clearTokenInteceptor()).addPathPatterns("/**");
27+
}
28+
29+
@Bean
30+
public ClearTokenInteceptor clearTokenInteceptor(){
31+
ClearTokenInteceptor clearTokenInteceptor = new ClearTokenInteceptor();
32+
return clearTokenInteceptor;
33+
}
34+
35+
2136
@Override
2237
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
2338

@@ -40,6 +55,7 @@ public void configureMessageConverters(List<HttpMessageConverter<?>> converters)
4055
converters.add(fastConverter);
4156
}
4257

58+
4359
@Bean
4460
public FastJsonViewResponseBodyAdvice FastJsonViewResponseBodyAdvice(){
4561
FastJsonViewResponseBodyAdvice advice = new FastJsonViewResponseBodyAdvice();

blog-api/src/main/java/com/shimh/controller/ArticleController.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class ArticleController {
4646
@GetMapping
4747
@FastJsonView(
4848
exclude = {
49-
@FastJsonFilter(clazz = Article.class, props = {"body","category"}),
49+
@FastJsonFilter(clazz = Article.class, props = {"body","category","comments"}),
5050
@FastJsonFilter(clazz = Tag.class, props = {"id","avatar"})},
5151
include = {@FastJsonFilter(clazz = User.class, props = {"nickname"})})
5252
public Result listArticles(){
@@ -78,7 +78,7 @@ public Result listNewArticles(){
7878
@GetMapping("/{id}")
7979
@FastJsonView(
8080
exclude = {
81-
@FastJsonFilter(clazz = Article.class, props = {"category"}),
81+
@FastJsonFilter(clazz = Article.class, props = {"category","comments"}),
8282
@FastJsonFilter(clazz = ArticleBody.class, props = {"contentHtml"}),
8383
@FastJsonFilter(clazz = Tag.class, props = {"avatar"})},
8484
include = {@FastJsonFilter(clazz = User.class, props = {"nickname","avatar"})})
@@ -101,7 +101,7 @@ public Result getArticleById(@PathVariable("id") Integer id){
101101
@GetMapping("/view/{id}")
102102
@FastJsonView(
103103
exclude = {
104-
@FastJsonFilter(clazz = Article.class, props = {"category"}),
104+
@FastJsonFilter(clazz = Article.class, props = {"category","comments"}),
105105
@FastJsonFilter(clazz = ArticleBody.class, props = {"contentHtml"}),
106106
@FastJsonFilter(clazz = Tag.class, props = {"avatar"})},
107107
include = {@FastJsonFilter(clazz = User.class, props = {"nickname","avatar"})})
@@ -124,7 +124,7 @@ public Result getArticleAndAddViews(@PathVariable("id") Integer id){
124124
@GetMapping("/tag/{id}")
125125
@FastJsonView(
126126
exclude = {
127-
@FastJsonFilter(clazz = Article.class, props = {"body","category"}),
127+
@FastJsonFilter(clazz = Article.class, props = {"body","category","comments"}),
128128
@FastJsonFilter(clazz = Tag.class, props = {"id","avatar"})},
129129
include = {@FastJsonFilter(clazz = User.class, props = {"nickname"})})
130130
public Result listArticlesByTag(@PathVariable Integer id){
@@ -137,7 +137,7 @@ public Result listArticlesByTag(@PathVariable Integer id){
137137
@GetMapping("/category/{id}")
138138
@FastJsonView(
139139
exclude = {
140-
@FastJsonFilter(clazz = Article.class, props = {"body","category"}),
140+
@FastJsonFilter(clazz = Article.class, props = {"body","category","comments"}),
141141
@FastJsonFilter(clazz = Tag.class, props = {"id","avatar"})},
142142
include = {@FastJsonFilter(clazz = User.class, props = {"nickname"})})
143143
public Result listArticlesByCategory(@PathVariable Integer id){
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package com.shimh.controller;
2+
3+
import java.util.List;
4+
5+
import org.apache.shiro.authz.annotation.RequiresAuthentication;
6+
import org.apache.shiro.authz.annotation.RequiresRoles;
7+
import org.springframework.beans.factory.annotation.Autowired;
8+
import org.springframework.validation.annotation.Validated;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.PathVariable;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.RequestBody;
13+
import org.springframework.web.bind.annotation.RequestMapping;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
import com.alibaba.fastjson.support.spring.annotation.FastJsonFilter;
17+
import com.alibaba.fastjson.support.spring.annotation.FastJsonView;
18+
import com.shimh.common.constant.Base;
19+
import com.shimh.common.constant.ResultCode;
20+
import com.shimh.common.result.Result;
21+
import com.shimh.entity.Article;
22+
import com.shimh.entity.Comment;
23+
import com.shimh.entity.Tag;
24+
import com.shimh.entity.User;
25+
import com.shimh.service.CommentService;
26+
/**
27+
* 评论api
28+
*
29+
* @author shimh
30+
*
31+
* 2018年1月25日
32+
*
33+
*/
34+
@RestController
35+
@RequestMapping(value="/comments")
36+
public class CommentController {
37+
38+
39+
@Autowired
40+
private CommentService commentService;
41+
42+
@GetMapping
43+
public Result listComments(){
44+
List<Comment> comments = commentService.findAll();
45+
46+
return Result.success(comments);
47+
}
48+
49+
@GetMapping("/{id}")
50+
public Result getCommentById(@PathVariable("id") Integer id){
51+
52+
Result r = new Result();
53+
54+
if(null == id){
55+
r.setResultCode(ResultCode.PARAM_IS_BLANK);
56+
return r;
57+
}
58+
59+
Comment comment = commentService.getCommentById(id);
60+
61+
r.setResultCode(ResultCode.SUCCESS);
62+
r.setData(comment);
63+
return r;
64+
}
65+
66+
@GetMapping("/article/{id}")
67+
@FastJsonView(
68+
exclude = {
69+
@FastJsonFilter(clazz = Comment.class, props = {"article"})},
70+
include = {@FastJsonFilter(clazz = User.class, props = {"nickname","avatar"})})
71+
public Result listCommentsByArticle(@PathVariable("id") Integer id){
72+
73+
Result r = new Result();
74+
75+
if(null == id){
76+
r.setResultCode(ResultCode.PARAM_IS_BLANK);
77+
return r;
78+
}
79+
80+
List<Comment> comments = commentService.listCommentsByArticle(id);
81+
82+
r.setResultCode(ResultCode.SUCCESS);
83+
r.setData(comments);
84+
return r;
85+
}
86+
87+
88+
@PostMapping("/create")
89+
@RequiresAuthentication
90+
public Result saveComment(@RequestBody Comment comment){
91+
92+
Integer commentId = commentService.saveComment(comment);
93+
94+
Result r = Result.success();
95+
r.simple().put("commentId", commentId);
96+
return r;
97+
}
98+
99+
100+
@GetMapping("/delete/{id}")
101+
@RequiresAuthentication
102+
public Result deleteCommentById(@PathVariable("id")Integer id){
103+
Result r = new Result();
104+
105+
if(null == id){
106+
r.setResultCode(ResultCode.PARAM_IS_BLANK);
107+
return r;
108+
}
109+
110+
commentService.deleteCommentById(id);
111+
112+
r.setResultCode(ResultCode.SUCCESS);
113+
return r;
114+
}
115+
116+
@PostMapping("/create/change")
117+
@FastJsonView(
118+
exclude = {
119+
@FastJsonFilter(clazz = Comment.class, props = {"article"})},
120+
include = {@FastJsonFilter(clazz = User.class, props = {"nickname","avatar"})})
121+
@RequiresAuthentication
122+
public Result saveCommentAndChangeCounts(@RequestBody Comment comment){
123+
124+
Comment savedComment = commentService.saveCommentAndChangeCounts(comment);
125+
126+
Result r = Result.success(savedComment);
127+
return r;
128+
}
129+
130+
131+
@GetMapping("/delete/change/{id}")
132+
@RequiresAuthentication
133+
public Result deleteCommentByIdAndChangeCounts(@PathVariable("id")Integer id){
134+
Result r = new Result();
135+
136+
if(null == id){
137+
r.setResultCode(ResultCode.PARAM_IS_BLANK);
138+
return r;
139+
}
140+
141+
commentService.deleteCommentByIdAndChangeCounts(id);
142+
143+
r.setResultCode(ResultCode.SUCCESS);
144+
return r;
145+
}
146+
147+
}

blog-api/src/main/java/com/shimh/controller/LoginController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.apache.shiro.authc.LockedAccountException;
88
import org.apache.shiro.authc.UnknownAccountException;
99
import org.apache.shiro.authc.UsernamePasswordToken;
10+
import org.apache.shiro.authz.annotation.RequiresRoles;
1011
import org.apache.shiro.subject.Subject;
1112
import org.springframework.beans.factory.annotation.Autowired;
1213
import org.springframework.stereotype.Controller;

0 commit comments

Comments
 (0)