- 需求
- 优化点:
- MySQL表
- 常用功能模块
- 实现方案
- index页面
- home页面
需求
实现一个登录功能
实现的功能
-
注册(邮箱注册) -
登录(邮箱+密码) -
重置密码 -
查看操作记录(登录, 注册, 重置密码, 登出. 都算操作) -
登出
在第3版的基础上进行优化:\
优化点:
-
接口设计
1. 发送注册验证码:
路径: POST-/index/login/sendverification
参数 :数据格式json
Email string(邮箱;长度限制20以内的字符串)
picdata:图片验证码(字符串4位)
返回:数据格式json
{
{
Email 注册邮箱 (string)
}
msg 请求成功信息(ok/err:)
}
2. 填写验证码
POST-/index/login/putverification
参数:数据格式json
{
Email 注册邮箱(getverification返回值,不为用户输入)
验证码 int(4位随机数)
}
返回:数据格式json
{
{
Email: 注册邮箱(string)
id :生成账号(int)
}
msg :请求成功信息(ok/err:字符串)
}
3. 注册账号
路径: POST-/index/login
参数:
{
Email :注册邮箱(getverification返回值,不为用户输入)
id :注册账号(getverification返回值,不为用户输入)
name: 名字(长度为10以内的字符串,用户输入)
password :密码(长度20以内的字符串,用户输入)
}
返回:数据格式json
{
msg 请求成功信息(ok/err:)
}
4. 密码登录
路径: POST-/index/signupbykey
参数:数据格式json
Email :登录邮箱(string长度限制20以内的字符串)
password:登陆密码(长度限制20以内的字符串)
picdata:图片验证码(字符串4位)
返回:数据格式json
{
{
id :账号(int)
idcode:身份码(string)
}
msg :请求成功信息(ok/err:字符串)
}
5. 发送登录验证码
路径: POST-/index/signup/sendverification
参数:数据格式json
Email 邮箱
picdata:图片验证码(字符串4位)
返回:数据格式json
{
{
Email:发送验证码邮箱 (string)
}
msg :请求成功信息(ok/err:)
}
6. 填写登录验证码
POST-/index/signup
参数:数据格式json
{
Email 登录邮箱(getverification返回值,不为用户输入)
验证码 int(4位随机数)
}
返回:数据格式json
{
{
id :账号(int)
idcode:身份码(string)
}
msg :请求成功信息(ok/err:字符串)
}
7. 登出
POST-/home/signout
参数:数据格式json
{
id :账号(int)
idcode:身份码(string)
}
返回:数据格式json
{
msg :请求成功信息(ok/err:字符串)
}
8. 查询操作信息
POST-/home/view
参数:数据格式json
{
id :账号(int自带,非用户输入)
idcode:身份码(string自带,非用户输入)
}
返回:数据格式json
{
[]{
id :账号(int)
behave:操作信息
time:操作时间
}
msg :请求成功信息(ok/err:字符串)
}
2. 验证码改密
POST-/index/login/putverification
参数:数据格式json
{
id :账号(int自带,非用户输入)
idcode:身份码(string自带,非用户输入)
picdata :图片验证码(string 4位字符串)
验证码 int(4位随机数)
}
返回:数据格式json
{
msg :请求成功信息(ok/err:字符串)
}
2. 密码改密
POST-/index/login/putverification
参数:数据格式json
{
id :账号(int自带,非用户输入)
idcode:身份码(string自带,非用户输入)
password:旧密码,长度限制20以内的字符串
newpassword:新密码,长度限制20以内的字符串
again:再次确认新密码, 长度限制20以内的字符串
}
返回:数据格式json
{
msg :请求成功信息(ok/err:字符串)
}
-
图片验证功能模块 新建MySQL表
picdata(图片验证表)
名称 | 数据类型 |
---|---|
piclink(唯一) | int |
data | string |
图片验证功能模块
-
当调用图片验证功能模块时,服务端将随机一个图片链接piclink发送给前端,前端将图片渲染给用户, -
用户填写验证码提交给服务端,将携带刚刚的图片链接 -
后端查找MySQL库中对应的连接的data(验证码)与用户传入的验证码是否相同 -
相同则继续用户的操作 -
不同返回验证码错误
MySQL表
-
LoginList(注册列表)
名称 | 数据类型 |
---|---|
id(主键) | int |
name(唯一) | string |
password | string |
Email(唯一) | string |
-
SignInList(登录列表)
名称 | 数据类型 |
---|---|
id (主键) | int |
身份码 | string |
ExpirationTime | int |
解释:身份码为随机字符串,用于对用户操作是进行身份验证,ExpirationTime储存过期时间,如果用户发送请求的时间超过过期时间,则视为用户掉线,需要重新登陆.
-
OperationRecord(操作列表)
名称 | 数据类型 |
---|---|
id | int |
操作 | string |
time | string |
-
VerificationCode(验证码储存库)
名称 | 数据类型 |
---|---|
string | |
Verification | int |
ExpirationTime | int |
time | int |
ExpirationTime储存验证码过期时间,如果用户验证时间超过ExpirationTime则验证无效
每次只查询最后一条匹配的数据(最新生成的验证码数据)
常用功能模块
1. 邮箱验证码功能
-
用户传入邮箱信息 -
生成验证码(随机6位数),与Email一起存入VerificationCode(验证码储存库),同时储存验证码过期时间,次数为默认值0 -
向用户邮箱发送验证码 -
服务端使用用户的提交验证码时的Email去VerificationCode(验证码储存库)获取最后一条匹配的数据(最新生成的验证码数据)的过期时间,和验证码值,如果现在的时间大于过期时间,返回验证码过期,如果小于过期时间,对比传入的数据与数据库中验证码的值Verification(验证码值)是否相同,. -
处理用户请求 -
每30分钟扫描一次数据库,删除超过30的数据
特殊情况:
9. 重新提交:如果验证码生成后,该用户未进行任何验证(time=0),则生成相同的验证码,并告知用户,如果之前有验证失败(time>0),就生成不同的验证码.避免某些用户在5分钟内没法收到验证码的情况.
身份验证功能:
为确保用户的身份与登录状态,我们使用身份验证功能来实现
-
用户请求(自带身份码(随机字符串)与id) -
使用id查找SignInList(登录列表)的对应信息(如果没有,返回未登录并退回登录页面) -
检查身份码与过期时间(如果身份码不正确或者已过期,返回登录过期并退回登录页面) -
核验成功重置过期时间(从核验成功开始30分钟后) -
处理用户的请求 -
每30分钟扫描一次数据库,删除超过30的数据
密码验证功能
-
用户上传邮箱/账号(id)+密码 -
真人验证:图片验证 -
核验密码是否规范 -
密码加密 -
查找LoginList(注册列表)中对应的邮箱/账号(如果没有返回账号/邮箱未注册) -
核验密码是否正确 -
处理用户请求
储存操作信息功能
-
通过请求数据的id与方法确定请求操作的种类,将post操作的内容与id和请求时间一起储存在OperationRecord(操作列表)中
实现方案
index页面
/index
定义一个index页面包含两个按钮login(注册)和sign up(登录) 点击login进入注册页面,点击sign up进入登录页面
login(注册)
index/login (1).邮箱验证
-
填写邮箱点击发送 -
弹出真人验证:图片验证 -
核验邮箱格式正确且未使用 -
调用邮箱验证功能模块
(2)注册:
注册表单:
名称 | 数据类型 |
---|---|
name | string |
password | string |
-
先验证name是否有效与是否被使用(例如:name不能超过10个字符且字符都在ASCII中)
-
核验password是否规范(例如:大于6位小于20位) 确认没问题后
-
将用户数据(注册的Email,name,password)储存到LoginList(注册列表),并自增出一个新的ID
(4)调用储存操作信息功能模块
sign up(登录)
index/signup
-
邮箱/账号+密码登录
账号密码登录表单:
名称 | 数据类型 |
---|---|
Email/id | string /int |
password | string |
-
调用密码验证功能模块 -
生成身份码(随机字符串),与id一起储存在SignInList(登录列表)中,过期时间为当前时间加30分钟,(每次操作后刷新过期时间都是当前时间+30分钟) -
返回用户身份码与id(每次访问都会自动带上) -
进入home页面 (5). 调用储存操作信息功能模块
-
验证码登录
验证码登录表单:
名称 | 数据类型 |
---|---|
string | |
验证码 | int |
-
点击发送验证码 -
弹出真人验证:图片验证 -
核验邮箱格式正确,且已注册 -
调用 邮箱验证码功能模块 -
生成身份码(随机字符串),与id一起储存在SignInList(登录列表)中,过期时间为当前时间加30分钟,(每次操作后刷新过期时间都是当前时间+30分钟) -
返回用户身份码与id(每次访问都会自动带上) -
进入home页面 (5). 调用储存操作信息功能模块
home页面
/home
-
定义三个按钮 sign out(登出),reset password(重置密码),view(查看操作记录)
sign out(登出)
home/signout
-
调用身份验证功能模块 -
通过用户的Email,删除SignInList(登录列表)对应的数据. -
回到index页面 (4) 调用储存操作信息功能模块
reset password(重置密码)
home/resetpassword 两个按钮:旧密码改密|验证码改密
1. 旧密码密码改密
(1).调用身份验证功能模块
旧密码改密表单:
名称 | 数据类型 |
---|---|
password | string |
new password | string |
new password again | string |
(2). 用户填写表单信息,点击提交.
(3). 调用密码验证功能模块
(4). 检验newpassword格式是否正确
(5). 检验password again密码是否相同
(6). 核验成功,服务端修改MySQL中的 LoginList(注册列表)中对应的id下的password
(7). 调用储存操作信息功能模块
2. 验证码改密
(1).调用身份验证功能模块
验证码改密表单:
名称 | 数据类型 |
---|---|
验证码 | int |
(2). 点击发送验证码
(3). 弹出真人验证:图片验证
(4). 通过id获取注册表中用户的邮箱
(5). 调用邮箱验证码功能模块
验证通过:
名称 | 数据类型 |
---|---|
new password | string |
new password again | string |
(6). 检验newpassword格式是否正确
(7). 检验password again密码是否相同
(8). 核验成功,服务端修改MySQL中的 LoginList(注册列表)中对应的id下的password
(9). 调用储存操作信息功能模块
查询操作记录
-
调用储存操作信息功能模块
-
服务端查询OperationRecord(操作列表)中的所有id为用户id的数据,并返回给用户
本文由 mdnice 多平台发布