用户中心系统开发日志
用户中心项目
目标
做出管理系统
项目流程
需求分析 -> 设计(概要设计,详细设计) -> 技术选型 -> 初始化/引入需要的技术 -> 写demo -> 写代码(实现业务测试) -> 测试(单元测试)->代码提交/代码评审 -> 部署/发布
需求分析
- 登陆注册
- 用户管理(仅管理员可见) 对用户的查询或者修改
- 用户校验(仅社团成员)
技术选型
前端: 三件套 + React + Antd + Umi + AntDesignPro
后端:Java + Spring三件套 + Mybatis + Mybatis-plus + mysql
部署:服务器/容器
计划
项目初始化
- 前端初始化
- 初始化项目
- 引入组件
- 框架介绍 瘦身
- 后端初始化
- 准备环境(MySql)
- 引入框架(整合框架)
- 前端初始化
登录/注册
- 前端
- 后端
- 规整目录
- 实现基本数据库操作
模型User对象与数据库字段的关联,自动生成(Jetbrains插件Mybatis-X实现)
注意:
在maven中配置lombok时,需要在jetbrains安装对应插件并启用注解处理器,并在pom.xml中手动写入指定版本号,否则执行model单元测试会报错1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
<optional>true</optional>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
用户管理
- 前端
- 后端
数据库设计
数据表:可以理解为excel表格
java操作数据库->代替人工
什么是设计数据库表
有哪些表? 表中有哪些字段?字段类型?数据库字段添加索引?表与表之间的关联
*设计:*原则上不能在数据库内硬删除表格对象,而是采用isDelete的”逻辑删除”
用户表:
id (主键) bigint
username (昵称) varchar
userAccount (登陆账号) bigint
avatarUrl(头像) varchar
gender (性别) tinyint
userpassword (密码)varchar
phone (电话) varchar
email (邮箱) varchar
userStatus(账户状态) int(0/1/2)
createTime(创建时间) (数据插入时间) datetime
updateTime(更新时间) (数据更新时间) datetime
isDelete(逻辑删除) tinyint
1 | |
注册逻辑
- 用户在前端输入账号,密码和校验码
- 校验账户,密码,校验密码是否符合要求
- 账户不少于4位
- 密码不少于8位
- 账号不能重复
- 账户不含特殊字符
- 密码与校验密码相同
- 对密码加密(密码千万不要直接存储到数据库)
- 向数据库插入用户数据
- 设计并通过单元测试
登陆设计
登陆接口
接收参数:用户账户 密码
请求类型: POST
> 请求参数过长时不建议用GET
请求体: JSON格式数据
返回值: 当前用户信息(脱敏),
登陆逻辑
- 校验用户账户和密码是否合法
- 非空
- 账户长度<4
- 密码<8
- 账户不含特殊字符
- 校验密码是否输入正确,与数据库中的密文密码去对比
- 记录用户的登陆态(session),将其存到服务器上,(使用后端的SpringBoot框架封装的服务器tomcat去记录)
cookie - 返回用户信息(脱敏)
如何知道是哪个用户登陆了?
- 连接到服务器端后,得到一个session1状态(匿名会话),返回给前端
- 登陆成功后,得到登陆成功的seesion,并且给session设置一些值,返回给前端设置cookie的命令
- 前端接收命令,设置cookie保存到浏览器
- 前端再次请求后端时,在请求头中带上cookie
- 后端拿到前端传来的cookie,找到对应的session
- 后端从session中取出基于该session储存的变量(用户的登录信息,登录名等)
后端控制层-Controller 封装请求
@RestController 适用于编写RESTful风格的API
关于RESTful风格:
缩写:REST (不是”rest”这个单词)
外文名:Representational State Transfer,简称 REST。中文名:表现层状态转移,即资源在网络中以某种表现形式进行状态转移。
提出时间:2000年。
属性:一种软件架构风格。(以Web为平台的。web服务的架构风格,前后端接口时候用到。)
**理解:**URL中只使用名词来定位资源,用HTTP协议里的动词(GET、POST、PUT、DELETE)来实现资源的增删改查操作。
Controller层倾向于对请求参数本身的校验,不涉及业务本身逻辑(越少越好)
Service层是对业务逻辑的校验(有可能涉及Controller之外的类调用)
用户管理接口
- 查询用户
- 鉴权
- 根据用户名查询
- 删除用户
- 鉴权
- 逻辑删除
Java SpringBoot配置项
1 | |
前端用户登陆功能
- 初始化,改脚手架
- 删除多余代码
- 修改模板name,实现post请求的key与后端api一致
- 同步router和proxy 完成代理
前端用户注册功能
- 复制粘贴,修改组件内参数名
- 注册router
- 修改router
- 在
app.tsx中修改登陆重定向逻辑,实现register路由白名单
- 按要求重构组件
- 常规文字修改
- 三个输入框
<ProFormText>组件 - rule传参实现规则匹配
min/max:限制输入大小
whitespace:false约束空格输入
validator:自定义方法实现表单全局查找,获取并按需求校验
1
2
3
4
5
6
7
8({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue('userPassword') === value || value.toString().length<8) {
return Promise.resolve();
}
return Promise.reject(new Error('两次输入的密码不一致!'));
},
}),pattern:正则表达式模板合法匹配
- 向上查找ProComponent封装的
<LoginForm>组件,实现自定义登陆按钮内文字(按需求重构封装组件的思路) - 利用AntD Pro的
history.push()方法实现同域名跳转路由功能
前后端交互
用到umi插件,requestConfig修改配置
代理
正向代理: 替客户端发送请求
反向代理: 替服务器接收请求,负载均衡
如何实现代理?:Nginx/Node.js