Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
lakernote
EasyAdmin
提交
47704d77
E
EasyAdmin
项目概览
lakernote
/
EasyAdmin
10 个月 前同步成功
通知
14
Star
3
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
EasyAdmin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
47704d77
编写于
8月 13, 2021
作者:
lakernote
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
(新增)[后端](增加登录验证码校验)
上级
0bbbd172
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
111 addition
and
18 deletion
+111
-18
pom.xml
pom.xml
+7
-0
src/main/java/com/laker/admin/config/WebMvcConfig.java
src/main/java/com/laker/admin/config/WebMvcConfig.java
+5
-1
src/main/java/com/laker/admin/framework/cache/ICache.java
src/main/java/com/laker/admin/framework/cache/ICache.java
+18
-0
src/main/java/com/laker/admin/framework/cache/JvmCache.java
src/main/java/com/laker/admin/framework/cache/JvmCache.java
+33
-0
src/main/java/com/laker/admin/module/sys/controller/IndexController.java
...om/laker/admin/module/sys/controller/IndexController.java
+25
-10
src/main/java/com/laker/admin/module/sys/controller/LoginController.java
...om/laker/admin/module/sys/controller/LoginController.java
+9
-0
src/main/java/com/laker/admin/module/sys/controller/LoginDto.java
.../java/com/laker/admin/module/sys/controller/LoginDto.java
+4
-0
web/admin/admin/css/other/login.css
web/admin/admin/css/other/login.css
+1
-1
web/admin/login.html
web/admin/login.html
+9
-6
未找到文件。
pom.xml
浏览文件 @
47704d77
...
...
@@ -141,6 +141,13 @@
<artifactId>
snakerflow-spring-boot-starter
</artifactId>
<version>
1.0.6
</version>
</dependency>
<!-- 验证码 -->
<dependency>
<groupId>
com.github.whvcse
</groupId>
<artifactId>
easy-captcha
</artifactId>
<version>
1.6.2
</version>
</dependency>
</dependencies>
<build>
...
...
src/main/java/com/laker/admin/config/WebMvcConfig.java
浏览文件 @
47704d77
...
...
@@ -29,7 +29,11 @@ public class WebMvcConfig implements WebMvcConfigurer {
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
// 注册注解拦截器,并排除不需要注解鉴权的接口地址 (与登录拦截器无关)
registry
.
addInterceptor
(
new
SaAnnotationInterceptor
()).
addPathPatterns
(
"/**"
)
.
excludePathPatterns
(
"/admin/**"
,
"/admin/login.html"
,
"/error"
,
"/api/v1/login"
);
.
excludePathPatterns
(
"/admin/**"
,
"/admin/login.html"
,
"/error"
,
"/api/v1/login"
,
"/captcha"
);
}
@Override
...
...
src/main/java/com/laker/admin/framework/cache/ICache.java
0 → 100644
浏览文件 @
47704d77
package
com.laker.admin.framework.cache
;
public
interface
ICache
{
void
put
(
String
key
,
Object
value
);
/**
* @param key
* @param value
* @param timeout 单位:秒 s
*/
void
put
(
String
key
,
Object
value
,
long
timeout
);
void
remove
(
String
key
);
<
T
>
T
get
(
String
key
);
}
src/main/java/com/laker/admin/framework/cache/JvmCache.java
0 → 100644
浏览文件 @
47704d77
package
com.laker.admin.framework.cache
;
import
cn.hutool.cache.CacheUtil
;
import
cn.hutool.cache.impl.LFUCache
;
import
org.springframework.stereotype.Component
;
/**
* @author laker
*/
@Component
public
class
JvmCache
implements
ICache
{
LFUCache
<
String
,
Object
>
CACHE
=
CacheUtil
.
newLFUCache
(
1000
);
@Override
public
void
put
(
String
key
,
Object
value
)
{
CACHE
.
put
(
key
,
value
);
}
@Override
public
void
put
(
String
key
,
Object
value
,
long
timeout
)
{
CACHE
.
put
(
key
,
value
,
timeout
*
1000
);
}
@Override
public
void
remove
(
String
key
)
{
CACHE
.
remove
(
key
);
}
@Override
public
<
T
>
T
get
(
String
key
)
{
return
(
T
)
CACHE
.
get
(
key
);
}
}
src/main/java/com/laker/admin/module/sys/controller/IndexController.java
浏览文件 @
47704d77
package
com.laker.admin.module.sys.controller
;
import
cn.hutool.captcha.CaptchaUtil
;
import
cn.hutool.captcha.LineCaptcha
;
import
cn.hutool.core.lang.Dict
;
import
cn.hutool.core.util.IdUtil
;
import
com.laker.admin.framework.Response
;
import
com.laker.admin.framework.cache.ICache
;
import
com.wf.captcha.SpecCaptcha
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
javax.servlet.http.HttpServletResponse
;
import
java.io.IOException
;
import
org.springframework.web.bind.annotation.ResponseBody
;
/**
* /admin/** 无需check login
...
...
@@ -15,17 +17,30 @@ import java.io.IOException;
@Controller
@Slf4j
public
class
IndexController
{
@Autowired
ICache
iCache
;
@GetMapping
({
"/admin"
,
"/admin/index"
,
"/admin/"
})
public
String
adminIndex
()
{
return
"redirect:/admin/index.html"
;
}
/**
* 详情参考:https://gitee.com/whvse/EasyCaptcha
*
* @return
*/
@GetMapping
(
"/captcha"
)
public
void
captcha
(
HttpServletResponse
response
)
throws
IOException
{
LineCaptcha
captcha
=
CaptchaUtil
.
createLineCaptcha
(
100
,
40
,
4
,
2
);
log
.
info
(
"当前验证码:{}"
,
captcha
.
getCode
());
captcha
.
write
(
response
.
getOutputStream
());
@ResponseBody
public
Response
captcha
()
{
SpecCaptcha
specCaptcha
=
new
SpecCaptcha
(
130
,
48
,
5
);
String
verCode
=
specCaptcha
.
text
().
toLowerCase
();
String
uid
=
IdUtil
.
simpleUUID
();
log
.
info
(
"当前uid:{},验证码:{}"
,
uid
,
verCode
);
// 前后端分离,这时还未有会话信息,用于确定uid和验证码的一一映射关系,防止多人串码
// 把uuid和图片码一起给前端,验证的时候再一起回来
iCache
.
put
(
uid
,
verCode
,
3
*
60
);
return
Response
.
ok
(
Dict
.
create
().
set
(
"uid"
,
uid
).
set
(
"image"
,
specCaptcha
.
toBase64
()));
}
}
\ No newline at end of file
src/main/java/com/laker/admin/module/sys/controller/LoginController.java
浏览文件 @
47704d77
...
...
@@ -2,10 +2,12 @@ package com.laker.admin.module.sys.controller;
import
cn.dev33.satoken.annotation.SaCheckLogin
;
import
cn.dev33.satoken.stp.StpUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.github.xiaoymin.knife4j.annotations.ApiOperationSupport
;
import
com.github.xiaoymin.knife4j.annotations.ApiSupport
;
import
com.laker.admin.framework.Response
;
import
com.laker.admin.framework.cache.ICache
;
import
com.laker.admin.framework.repeatedsubmit.RepeatSubmitLimit
;
import
com.laker.admin.module.sys.entity.SysUser
;
import
com.laker.admin.module.sys.service.ISysUserService
;
...
...
@@ -26,12 +28,19 @@ public class LoginController {
@Autowired
ISysUserService
sysUserService
;
@Autowired
ICache
iCache
;
@PostMapping
(
"/api/v1/login"
)
@ApiOperationSupport
(
order
=
1
)
@ApiOperation
(
value
=
"登录"
)
public
Response
login
(
@RequestBody
LoginDto
loginDto
)
{
log
.
info
(
"login {}"
,
loginDto
);
// 验证码是否正确
String
code
=
iCache
.
get
(
loginDto
.
getUid
());
if
(!
StrUtil
.
equalsIgnoreCase
(
code
,
loginDto
.
getCaptchaCode
()))
{
return
Response
.
error
(
"500"
,
"验证码不正确或已失效"
);
}
// 单机版:在map中创建了会话,token id等映射关系 // 写入cookie
SysUser
sysUser
=
sysUserService
.
getOne
(
Wrappers
.<
SysUser
>
lambdaQuery
()
.
eq
(
SysUser:
:
getUserName
,
loginDto
.
getUsername
())
...
...
src/main/java/com/laker/admin/module/sys/controller/LoginDto.java
浏览文件 @
47704d77
...
...
@@ -2,10 +2,14 @@ package com.laker.admin.module.sys.controller;
import
lombok.Data
;
/**
* @author laker
*/
@Data
public
class
LoginDto
{
private
String
username
;
private
String
password
;
private
String
captchaCode
;
private
String
uid
;
}
web/admin/admin/css/other/login.css
浏览文件 @
47704d77
...
...
@@ -89,5 +89,5 @@ body {
.codeImage
{
float
:
right
;
height
:
42px
;
border
:
#
e6e6e6
1
px
solid
;
border
:
#
781a1a
2
px
solid
;
}
web/admin/login.html
浏览文件 @
47704d77
...
...
@@ -27,7 +27,7 @@
<div
class=
"layui-form-item"
>
<input
placeholder=
"验证码 : "
hover
name=
"captchaCode"
lay-verify=
"title"
class=
"code layui-input layui-input-inline"
/>
<img
id=
"captcha"
src=
"admin/captcha"
class=
"codeImage"
/>
<img
id=
"captcha"
class=
"codeImage"
/>
</div>
<div
class=
"layui-form-item"
>
<input
type=
"checkbox"
name=
""
title=
"记住密码"
lay-skin=
"primary"
checked
>
...
...
@@ -47,13 +47,12 @@
var
button
=
layui
.
button
;
var
popup
=
layui
.
popup
;
let
$
=
layui
.
jquery
;
var
uid
;
captcha
();
// 登 录 提 交
form
.
on
(
'
submit(login)
'
,
function
(
data
)
{
/// 验证
console
.
log
(
data
);
/// 登录
data
.
field
.
uid
=
uid
;
$
.
ajax
({
url
:
EasyAdminContext
.
url
+
'
/api/v1/login
'
,
data
:
JSON
.
stringify
(
data
.
field
),
...
...
@@ -70,7 +69,7 @@
// 动画
button
.
load
({
elem
:
'
.login
'
,
time
:
5
00
,
time
:
2
00
,
done
:
function
()
{
popup
.
success
(
"
登录成功
"
,
function
()
{
...
...
@@ -91,7 +90,11 @@
});
function
captcha
()
{
document
.
getElementById
(
"
captcha
"
).
src
=
EasyAdminContext
.
url
+
"
/captcha
"
+
"
?
"
+
Math
.
random
();
// 获取验证码
$
.
get
(
EasyAdminContext
.
url
+
'
/captcha
'
,
function
(
res
)
{
uid
=
res
.
data
.
uid
;
$
(
'
#captcha
'
).
attr
(
'
src
'
,
res
.
data
.
image
);
},
'
json
'
);
}
$
(
"
#captcha
"
).
click
(
function
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录