用户中心项目笔记
后端
内容
- 在执行Test测试时候,Test包的结构要和源码Java包的结构一样,你测试的那个类在Java包中位于啥位置,它在Test中就也要位于啥位置,比如,我才是UserServiceImpl
-
IDEA插件GenerateAllSetter,可以帮我们快速set对象对象的各个属性
使用方式,new一个对象,然后光标置对象上打Alt+Enter,选择自己想要生成的
比如我选择Generate all setter with default value,则会生成以下代码
-
对密码进行加密(密码不要直接以明文存储到数据库中)
-
所有的前端校验实际上用户在使用时是可以绕过的,所以校验时,一定要前后端都加校验
-
如果在一个功能中没有用到某个类的太多属性,那就用的那几个属性就行,不必用整个对象
-
一个库:Apache Commons Lang,就是一个Utils,比如在校验各个字符串字段(用户名,密码,校验密码)不能为空字符串,不能为null时候,就不用再自己一个一个写
username != "" && username != null && password != ""
等等,直接用这个库的方法StringUtils.isAnyBlank(username,password,等等)
,它就会校验括号的所有属性每一个是否为null或者"“,只要有一个为null或者为”"就返回true
-
加密:可以使用Spring的工具类DigestUtils
final String SALT = "abcd"; String newPassword = DigestUtils.md5DigestAsHex((SALT+userPassword).getBytes());
SALT:加盐就是在给密码加密的时候更混淆一些
-
后端如果想使用正则表达式校验的话:
//账户不能包含特殊字符 String vaildPattern = "\\pP|\\pS|\\s+"; //正则表达式 Matcher matcher = Pattern.compile(vaildPattern).matcher(userAccount); if(!matcher.find()){ return -1; }
matcher.find():如果匹配返回true
-
API:更倾向于网络请求,就是提供给外面的接口
SDK:一般指工具包,就引入过来就可以直接用的
-
一个插件:Auto filling Java call arguments,可以自动填充方法的参数
使用方法:让光标处于需要填充参数的地方(需要填充参数的方法的小括号中),按Alt+Enter
-
controller 层倾向于对请求参数本身的校验,不涉及业务逻辑本身(最好越少涉及业务逻辑越好)
service 层是对业务逻辑的校验(一个service有可能被多个controller调用,也有可能被 controller 之外的类调用(比如service调service))
-
IDEA自带的测试web接口的小工具,说白了就是测试Controller的
然后点击Add Request,如果是POST请求,点击POST Text Body
-
可以将多处用到的常量抽取出来放到一个公共的接口中,用到常量的地方import即可,比如,各方法经常用到的和用户相关的一些常量放到UserConstant中
直接在接口中定义相应的常量就行
package com.yupi.usercenter.constant; /** * 用户常量类 */ public interface UserConstant { //----------用户登录态键---------- String USER_LOGIN_STATE = "userLoginState"; //----------权限---------- //默认权限(普通用户) int ADMIN_ROLE = 1; //管理员权限 int DEFAULT_ROLE = 0; }
使用时,直接import然后直接写常量名就可以了
-
在后端接口的实现类中如果写了一个接口中没有的方法,直接在该方法的上方写@Override然后让光标处于@Override按Alt+Enter,选择pull method to,就会在其对应的接口中创建出这个方法的申明
注意
- 后端给前端返回用户数据时,一定要脱敏,不要啥数据都返回去,为防止数据库中的字段泄露,要保护用户隐私
- 任何一个对外的接口(比如Controller)都要鉴定权限,也就是鉴定调用这个接口的人是否有权限调用这个接口的权限,为了防止恶意调用(在编写每一个接口的时候都要考 虑到你这个接口会不会被恶意调用)
- 在测试类上面要写上注解@SpringBootTest
前端
内容
-
当前端对接后端时,如果框架中的字段名和后端对应的字段名的名字不一样,则在前端那个字段处按shift+F6,然后填写你要改成的名字,这样,在已有代码中所有用到这个字段的地方都会改掉,如果你只是把这里的字段名改掉了,则其他地方你还得手动修改
-
UMI:一个前端框架,对React的又封装
-
从一个url请求(或者跳转)到另一个url,这两个url的端口不一样,就叫跨域
-
正向代理:替客户端向服务器发送请求,可以解决跨域问题
反向代理:替服务器统一接收请求。
怎么搞代理?
Nginx 服务器
Node.js 服务器
-
ant Disign是封装了React的一个组件库,Ant Design Procomponents 是封装了Ant Design的形成一些常用的页面(比如登录),Ant Design Pro是封装了Ant Design、React、Ant Design Procomponents、其他的库
-
MFSU:前端编译优化
部署
-
在本地启动项目后,在本机可以使用localhost访问,同时也可以用自己电脑的ip访问,与你在同一局域网的用户也可以使用ip访问,但是,跟你不在同一局域网的其他用户就不能访问了(使用ip和localhost都不能访问)
-
多环境:指同一套项目代码在不同的阶段需要根据实际情况来调整配置并且部署到不同的机器上。
为什么需要?
- 每个环境互不影响
- 区分不同的阶段:开发 / 测试 / 生产
- 对项目进行优化:
- 本地日志级别:就在在本地开发时可能有许多日志,但在上线后,可以隐藏部分日志,就是一些日志不需要暴露出去
- 精简依赖,节省项目体积:就是有的依赖是我们开发时用的,部署可能并不需要
- 项目的环境 / 参数可以调整,比如 JVM 参数,在开发时候可能调小点,但在部署生产环境可能得调大点
针对不同环境做不同的事情。
多环境分类:
- 本地环境(自己的电脑)localhost
- 开发环境(远程开发):就是有一台开发服务器,大家连同一台机器,大家在那同一台机器上开发,为了大家开发方便
- 测试环境(测试):有可能是给开发用,给测试用,给产品用,单元测试 / 性能测试 / 功能测试 / 系统集成测试,独立的数据库(即和线上数据库不是同一个数据库)、独立的服务器
- 预发布环境(体验服):和正式环境一致,正式数据库,更严谨,查出更多问题
- 正式环境(线上,公开对外访问的项目):尽量不要改动,保证上线前的代码是 “完美” 运行
- 沙箱环境(实验环境):完全隔离的一个环境,可能为了专门测试某个功能,专门干个啥,干完可能就把这个环境销毁了,就完全是为了做实验
前端多环境实战
-
请求地址
-
开发环境:localhost:8000
-
线上环境:user-backend.code-nav.cn
startFront(env) { if(env === 'prod') { // 不输出注释 // 项目优化 // 修改请求地址 } else { // 保持本地开发逻辑 } }
用了 umi 框架,build 时会自动传入 NODE_ENV == production 参数,start NODE_ENV 参数为 development
-
-
启动方式(即开发环境启动项目时用start,线上环境启动项目时用build)
-
开发环境:npm run start(本地启动,监听端口、自动更新)
-
线上环境:npm run build(用build启动项目后,umi会将项目构建打包得到dist文件夹,该文件夹就是项目构建打包后的文件夹),可以使用 serve 工具启动(在项目构建打包后的文件夹下输入serve),也就是在终端打开dist文件夹,然后输入serve
-
-
让不同环境去请求不同环境的后端地址,即如果前端是开发环境就去请求后端开发环境地址,如果前端是生产环境就去请求后端生产环境地址
const request = extend({ credentials: 'include', // 默认请求是否带上cookie prefix: process.env.NODE_ENV === 'production' ? 'http://user-backend.code-nav.cn' : undefined /* process.env.NODE_ENV这个变量就是记录当前是什么环境,然后这句话就是说,如果当前是production生产环境,就去请求地址 http://user-backend.code-nav.cn,这个地址就是后端生产环境的地址 */ });
-
项目的配置
不同的项目(框架)都有不同的配置文件,umi 的配置文件是 config,可以在配置文件后添加对应的环境名称后缀来区分开发环境和生产环境。
- 开发环境:config.dev.ts
- 生产环境:config.prod.ts
- 公共配置:config.ts 不带后缀(就是不论你是什么环境这个配置都生效,可以把所有环境都需要,都适用的配置放到这个公共配置中)
后端多环境实战
SpringBoot 项目,通过 application.yml 添加不同的后缀来区分配置文件
可以在启动项目时传入环境变量(在target目录下启动项目,也就是在target目录下进入控制台输入以下命令,–spring.profiles.active=prod这句就是指定启动环境为prod):
java -jar .\user-center-backend-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
主要是改:
-
依赖的环境地址
- 数据库地址
- 缓存地址
- 消息队列地址
- 项目端口号
-
服务器配置
其他
-
全局查找字符串快捷鍵:ctrl+shift+r
-
全局查找文件shift+shift
-
重构(就是如果给某个变量改名,想要现有代码中用到该变量的地方都同时改变,先将光标放到这个变量上,然后按shift+F6,然后输入要改成的名字):shift+F6
-
右键点击Local History —> show History可以显示历史代码(比如你改了代码,想看没改之前的可以用这个方法查看)
-
如果想将网页上图片地址放到项目中用到图片的图片url处,复制网站上的图片的地址方法,右键图片,然后选择复制图片地址,直接将地址粘贴至你需要的地方
-
maven在package打包时,默认会运行一遍所有的单元测试,如果在打包时不想让它运行单元测试,可以点击maven可视化界面的闪电图标
-
宝塔Linux就是一个Linux的运维面板,就是我们之前在Linux中装软件什么的都是用命令去做,而宝塔Linux就是做了个可视化界面,我们可以通过该界面去在Linux上装软件
-
docker 是容器,可以将项目的环境(比如 java、nginx)和项目的代码一起打包成镜像(就是将一个项目的代码和项目用的所有东西打包到一起成为一个镜像,当我启动这个项目的时候就不用再一个软件一个软件一个依赖一个依赖的安装了,直接用这个镜像就可以),所有同学都能下载镜像,更容易分发和移植。再启动项目时,不需要敲一大堆命令,而是直接下载镜像、启动镜像就可以了。docker 可以理解为软件安装包。