title: “基于AntDesignPro+SpringBoot的Hadoop网盘”
date: “2022-08-16”
categories:
“project”
基于AntDesignPro+SpringBoot的hadoop网盘
作者:米芾同学
目标:完整了解做项目的思路,接触一些企业级的开发技术,以后都能轻松做出管理系统!
项目源码
用户中心前端项目源码:https://github.com/mifuRD/SpringBoot-AntDesignPro-/tree/AntDesignPro
用户中心后端项目源码:https://github.com/mifuRD/SpringBoot-AntDesignPro-/tree/SpringBoot
HDFS网盘前端项目源码:https://github.com/mifuRD/SpringBoot-AntDesignPro-/tree/Vue
企业做项目流程
需求分析 => 设计(概要设计、详细设计)=> 技术选型 => 初始化 / 引入需要的技术 => 写 Demo => 写代码(实现业务逻辑) => 测试(单元测试、系统测试)=> 代码提交 / 代码评审 => 部署 => 发布上线
需求分析
- 登录 / 注册
- 用户管理(仅管理员可见)对用户的查询或者修改
- 用户校验(仅星球用户可见)
技术选型
前端:三件套 + React + 组件库 Ant Design + Umi + Ant Design Pro(现成的管理系统)
后端:
- java
- spring(依赖注入框架,帮助你管理 Java 对象,集成一些其他的内容)
- springmvc(web 框架,提供接口访问、restful接口等能力)
- mybatis(Java 操作数据库的框架,持久层框架,对 jdbc 的封装)
- mybatis-plus(对 mybatis 的增强,不用写 sql 也能实现增删改查)
- springboot(快速启动 / 快速集成项目。不用自己管理 spring 配置,不用自己整合各种框架)
- junit 单元测试库
- mysql 数据库
部署:服务器 / 容器(平台)
3 种初始化 Java 项目的方式
- GitHub 搜现成的代码
- SpringBoot 官方的模板生成器(https://start.spring.io/)
- 直接在 IDEA 开发工具中生成 ✔
如果要引入 java 的包,可以去 maven 中心仓库寻找(http://mvnrepository.com/)
数据库设计
什么是数据库?存数据的
数据库里有什么?数据表(理解为 excel 表格)
java 操作数据库?程序代替人工
什么是设计数据库表?
有哪些表(模型)?表中有哪些字段?字段的类型?数据库字段添加索引?表与表之间的关联?
举例:性别是否需要加索引?
用户表设计
id(主键)bigint
username 昵称 varchar
userAccount 登录账号
avatarUrl 头像 varchar
gender 性别 tinyint
userPassword 密码 varchar
phone 电话 varchar
email 邮箱 varchar
userStatus 用户状态 int 0 - 正常
createTime 创建时间(数据插入时间)datetime
updateTime 更新时间(数据更新时间)datetime
isDelete 是否删除 0 1(逻辑删除)tinyint
userRole 用户角色 0 - 普通用户 1 - 管理员
自动生成器的使用
MyBatisX 插件,自动根据数据库生成:
- domain:实体对象
- mapper:操作数据库的对象
- mapper.xml:定义了 mapper 对象和数据库的关联,可以在里面自己写 SQL
- service:包含常用的增删改查
- serviceImpl:具体实现 service
从而提高开发效率!
注册逻辑设计
- 用户在前端输入账户和密码、以及校验码(todo)
- 校验用户的账户、密码、校验密码,是否符合要求
- 非空
- 账户长度 不小于 4 位
- 密码就 不小于 8 位吧
- 账户不能重复
- 账户不包含特殊字符
- 密码和校验密码相同
- 对密码进行加密(密码千万不要直接以明文存储到数据库中,非常不安全)
- 向数据库插入用户数据
登录功能
接口设计
接受参数:用户账户、密码
请求类型:POST
请求体:JSON 格式的数据
请求参数很长时不建议用 get
返回值:用户信息( 脱敏 )
登录逻辑
校验用户账户和密码是否合法
- 非空
- 账户长度不小于 4 位
- 密码就不小于 8 位
- 账户不包含特殊字符
校验密码是否输入正确,要和数据库中的密文密码去对比
用户信息脱敏,隐藏敏感信息,防止数据库中的字段泄露
我们要记录用户的登录态(session),将其存到服务器上(用后端 SpringBoot 框架封装的服务器 tomcat 去记录)
cookie
返回脱敏后的用户信息
实现
控制层 Controller 封装请求
application.yml 指定接口全局路径前缀:
servlet:
context-path: /api
控制器注解:
@RestController 适用于编写 restful 风格的 api,返回值默认为 json 类型
校验写在哪里?
- controller 层倾向于对请求参数本身的校验,不涉及业务逻辑本身(越少越好)
- service 层是对业务逻辑的校验(有可能被 controller 之外的类调用)
如何知道是哪个用户登录了?
javaweb 这一块的知识
连接服务器端后,得到一个 session 状态(匿名会话),返回给前端
登录成功后,得到了登录成功的 session,并且给该sessio n设置一些值(比如用户信息),返回给前端一个设置 cookie 的 ”命令“
session => cookie
前端接收到后端的命令后,设置 cookie,保存到浏览器内
前端再次请求后端的时候(相同的域名),在请求头中带上cookie去请求
后端拿到前端传来的 cookie,找到对应的 session
后端从 session 中可以取出基于该 session 存储的变量(用户的登录信息、登录名)
用户管理
接口设计关键:必须鉴权!!!(这里我们前后端都需要去做)
- 查询用户(允许根据用户名查询)
- 删除用户
写代码流程
- 先做设计
- 代码实现
- 持续优化!!!(复用代码、提取公共逻辑 / 常量)
前后端交互
前端需要向后端发送请求才能获取数据 / 执行操作。
怎么发请求:前端使用 ajax 来请求后端
前端请求库及封装关系
axios 封装了 ajax
request 是 ant design 项目又封装了一次
追踪 request 源码:用到了 umi 的插件、requestConfig 配置文件
代理
正向代理:替客户端向服务器发送请求,可以解决跨域问题
反向代理:替服务器统一接收请求。
怎么实现代理?
- Nginx 服务器
- Node.js 服务器
原本请求:http://localhost:8000/api/user/login
代理到请求:http://localhost:8080/api/user/login
前端框架介绍
Ant Design Pro(Umi 框架)权限管理
- app.tsx:项目全局入口文件,定义了整个项目中使用的公共数据(比如用户信息)
- access.ts 控制用户的访问权限
获取初始状态流程:首次访问页面(刷新页面),进入 app.tsx,执行 getInitialState 方法,该方法的返回值就是全局可用的状态值。
ProComponents 高级表单
- 通过 columns 定义表格有哪些列
- columns 属性
- dataIndex 对应返回数据对象的属性
- title 表格列名
- copyable 是否允许复制
- ellipsis 是否允许缩略
- valueType:用于声明这一列的类型(dateTime、select)
框架关系
Ant Design 组件库 => 基于 React 实现
Ant Design Procomponents => 基于 Ant Design 实现
Ant Design Pro 后台管理系统 => 基于 Ant Design + React + Ant Design Procomponents + 其他的库实现
其他知识
MFSU:前端编译优化
后端优化
处理之前的一堆返回值为-1和null的家伙,再把之前的todo完成
通用返回对象
目的:给对象补充一些信息,告诉前端这个请求在业务层面上是成功还是失败
200、404、500、502、503
{
"name": "yupi"
}
↓
// 成功
{
"code": 0 // 业务状态码
"data": {
"name": "yupi"
},
"message": "ok"
}
// 错误
{
"code": 50001 // 业务状态码
"data": null
"message": "用户操作异常、xxx"
}
自定义错误码,返回类支持返回正常和错误
封装全局异常处理器
实现
定义业务异常类
- 相对于 java 的异常类,支持更多字段
- 自定义构造函数,更灵活 / 快捷的设置字段
编写全局异常处理器(利用 Spring AOP,在调用方法前后进行额外的处理)
作用
- 捕获代码中所有的异常,内部消化,让前端得到更详细的业务报错 / 信息
- 同时屏蔽掉项目框架本身的异常(不暴露服务器内部状态)
- 集中处理,比如记录日志
前端优化
后端做了很多的优化,并且把返回的结果重新封装了,我们前端需要大改,但是这样做比较麻烦,试着写了全局响应处理器,踩了很多的坑,浪费了很多时间,而且有点刻意优化了,发现有些业务逻辑是不需要这样去返回的。
todo:这个我们后期还要再去处理!!!
全局响应处理
应用场景:我们需要对接口的 通用响应 进行统一处理,比如从 response 中取出 data;或者根据 code 去集中处理错误,比如用户未登录、没权限之类的。
优势:不用在每个接口请求中都去写相同的逻辑
实现:参考你用的请求封装工具的官方文档,比如 umi-request(https://github.com/umijs/umi-request#interceptor、https://blog.csdn.net/huantai3334/article/details/116780020)。如果你用 axios,参考 axios 的文档。
创建新的文件,在该文件中配置一个全局请求类。在发送请求时,使用我们自己的定义的全局请求类。
用户校验
仅适用于用户可信的情况
先让用户自己填:2 - 5 位编号,全凭自觉。
后台补充对编号的校验:长度校验、唯一性校验
前端补充输入框,适配后端。
后期拉取星球数据,定期清理违规用户
赶小学期进度
整合上个星期写的Hadoop网盘,整合后端
但是这里又发现有一些小问题,就是之前的项目springboot的版本稍低,和本项目最新的springboot版本,有些地方有冲突!导致项目整合后跑不起来,这里发现了主要是swagger的问题,去参考了一篇文章解决 高版本SpringBoot整合Swagger 启动报错Failed to start bean ‘documentationPluginsBootstrapper‘ 问题_摸鱼佬的博客-CSDN博客,成功解决!
todo:这里我们项目全局响应处理器和之前简写的hdfs网盘后端有了一点小插曲,虽然不是很影响,但是感觉这种方式比较笨拙,方式不不统一,这个需要后期再去改善、解耦合,不过现在希望的是hdfs部分返回的数据和用户中心是不一样的,不然对接前端才写的那个全局响应处理器太过于麻烦了,我看后面再想个什么办法去解决。好像现在又碰到了一个问题,前端那个全局响应处理器会和我们这个hdfs网盘后端传过来的数据应该会有冲突,感觉整合前端好像不是很方便
整合前端
偷个懒吧,不然感觉又要踩坑,把后端偷的懒和这个后面一起完善吧!这里我就弄个页面跳转吧,启动两个项目就行,把之前那个请求接口改一下,然后hdfs这个跨域问题就在后端解决。
todo:项目优化点
- 功能扩充
- 管理员创建用户、修改用户信息、删除用户
- 上传头像
- 按照更多的条件去查询用户
- 更改权限
- 修改 Bug(目前发现的是前后端优化完成后,输入错误信息会自动跳转到框架自定义的错误日志,需要重新刷新,现在先赶小学期的进度,不去优化了)
- 项目登录改为分布式 session(单点登录 - redis)
- 通用性
- set-cookie domain 域名更通用,比如改为 *.xxx.com
- 把用户管理系统 => 用户中心(之后所有的服务都请求这个后端)
- 后台添加全局请求拦截器(统一去判断用户权限、统一记录请求日志)
- 为了赶进度处理的很多东西,想办法完善
- 改善之后就是拿本项目做一个SpringBoot的万用模板吧,这样能快速初始化(目标等后面开始做了再写)