Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
yubinCloud
fairy-wiki
提交
ee7c9152
F
fairy-wiki
项目概览
yubinCloud
/
fairy-wiki
通知
4
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
fairy-wiki
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
ee7c9152
编写于
4月 28, 2021
作者:
yubinCloud
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
11-3 通过每次点赞后在 redis 中存放一个 ip + docID 从而限制24小时内只能对一个文档点赞一次
上级
b12c806b
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
77 addition
and
0 deletion
+77
-0
src/main/java/io/github/yubincloud/fairywiki/aspect/LogAspect.java
...java/io/github/yubincloud/fairywiki/aspect/LogAspect.java
+3
-0
src/main/java/io/github/yubincloud/fairywiki/exception/BusinessExceptionCode.java
...yubincloud/fairywiki/exception/BusinessExceptionCode.java
+1
-0
src/main/java/io/github/yubincloud/fairywiki/service/DocService.java
...va/io/github/yubincloud/fairywiki/service/DocService.java
+22
-0
src/main/java/io/github/yubincloud/fairywiki/utils/RedisUtil.java
.../java/io/github/yubincloud/fairywiki/utils/RedisUtil.java
+34
-0
src/main/java/io/github/yubincloud/fairywiki/utils/RequestContext.java
.../io/github/yubincloud/fairywiki/utils/RequestContext.java
+17
-0
未找到文件。
src/main/java/io/github/yubincloud/fairywiki/aspect/LogAspect.java
浏览文件 @
ee7c9152
...
...
@@ -2,6 +2,7 @@ package io.github.yubincloud.fairywiki.aspect;
import
com.alibaba.fastjson.JSONObject
;
import
com.alibaba.fastjson.support.spring.PropertyPreFilters
;
import
io.github.yubincloud.fairywiki.utils.RequestContext
;
import
org.aspectj.lang.JoinPoint
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.Signature
;
...
...
@@ -46,6 +47,8 @@ public class LogAspect {
LOG
.
info
(
"类名方法: {}.{}"
,
signature
.
getDeclaringTypeName
(),
name
);
LOG
.
info
(
"远程地址: {}"
,
request
.
getRemoteAddr
());
RequestContext
.
setRemoteAddr
(
getRemoteIp
(
request
));
// 打印请求参数
Object
[]
args
=
joinPoint
.
getArgs
();
// LOG.info("请求参数: {}", JSONObject.toJSONString(args));
...
...
src/main/java/io/github/yubincloud/fairywiki/exception/BusinessExceptionCode.java
浏览文件 @
ee7c9152
...
...
@@ -7,6 +7,7 @@ public enum BusinessExceptionCode {
USER_LOGIN_NAME_EXIST
(
"登录名已存在"
),
LOGIN_USER_ERROR
(
"用户名不存在或密码错误"
),
VOTE_REPEAT
(
"您已点赞过,请于 24 小时后再次操作"
),
;
private
String
desc
;
...
...
src/main/java/io/github/yubincloud/fairywiki/service/DocService.java
浏览文件 @
ee7c9152
...
...
@@ -9,10 +9,14 @@ import io.github.yubincloud.fairywiki.dto.req.DocQueryReqDto;
import
io.github.yubincloud.fairywiki.dto.req.DocSaveReqDto
;
import
io.github.yubincloud.fairywiki.dto.resp.DocQueryRespDto
;
import
io.github.yubincloud.fairywiki.dto.resp.PageRespDto
;
import
io.github.yubincloud.fairywiki.exception.BusinessException
;
import
io.github.yubincloud.fairywiki.exception.BusinessExceptionCode
;
import
io.github.yubincloud.fairywiki.mapper.ContentMapper
;
import
io.github.yubincloud.fairywiki.mapper.DocMapper
;
import
io.github.yubincloud.fairywiki.mapper.DocMapperCustom
;
import
io.github.yubincloud.fairywiki.utils.CopyUtil
;
import
io.github.yubincloud.fairywiki.utils.RedisUtil
;
import
io.github.yubincloud.fairywiki.utils.RequestContext
;
import
io.github.yubincloud.fairywiki.utils.SnowFlake
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
...
...
@@ -39,6 +43,9 @@ public class DocService {
@Resource
private
SnowFlake
snowFlake
;
@Resource
private
RedisUtil
redisUtil
;
/**
* 获取全部 Doc
*/
...
...
@@ -129,6 +136,21 @@ public class DocService {
* @param docId 文档的 id
*/
public
void
vote
(
Long
docId
)
{
String
ip
=
RequestContext
.
getRemoteAddr
();
String
ipKey
=
constructIpKeyInRedis
(
docId
,
ip
);
if
(
redisUtil
.
validateRepeatedKey
(
ipKey
,
3600
*
24
))
{
docMapperCustom
.
increaseVoteCount
(
docId
);
}
else
{
throw
new
BusinessException
(
BusinessExceptionCode
.
VOTE_REPEAT
);
}
docMapperCustom
.
increaseVoteCount
(
docId
);
}
/**
* 构造 IP + docID 作为存放于 redis 中的 key,24小时内不能重复
* @return 构造生成的 key
*/
private
String
constructIpKeyInRedis
(
Long
docId
,
String
ip
)
{
return
"ODC_VOTE_"
+
docId
+
"_"
+
ip
;
}
}
src/main/java/io/github/yubincloud/fairywiki/utils/RedisUtil.java
0 → 100644
浏览文件 @
ee7c9152
package
io.github.yubincloud.fairywiki.utils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.concurrent.TimeUnit
;
@Component
public
class
RedisUtil
{
private
static
final
Logger
LOG
=
LoggerFactory
.
getLogger
(
RedisUtil
.
class
);
@Resource
private
RedisTemplate
<
String
,
String
>
redisTemplate
;
/**
* 检测 Redis 中的 key 是否重复,若不重复则存入该 key
* @param second 过期时间(秒)
* @return 重复则返回 false,若新增 key 则返回 true
*/
public
boolean
validateRepeatedKey
(
String
key
,
long
second
)
{
if
(
redisTemplate
.
hasKey
(
key
))
{
LOG
.
info
(
"key已存在:{}"
,
key
);
return
false
;
}
else
{
LOG
.
info
(
"key 不存在,放入 key:{},过期时间:{}秒"
,
key
,
second
);
redisTemplate
.
opsForValue
().
set
(
key
,
key
,
second
,
TimeUnit
.
SECONDS
);
return
true
;
}
}
}
src/main/java/io/github/yubincloud/fairywiki/utils/RequestContext.java
0 → 100644
浏览文件 @
ee7c9152
package
io.github.yubincloud.fairywiki.utils
;
import
java.io.Serializable
;
public
class
RequestContext
implements
Serializable
{
private
static
final
ThreadLocal
<
String
>
remoteAddr
=
new
ThreadLocal
<>();
public
static
String
getRemoteAddr
()
{
return
remoteAddr
.
get
();
}
public
static
void
setRemoteAddr
(
String
remoteAddr
)
{
RequestContext
.
remoteAddr
.
set
(
remoteAddr
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录