项目:股票数据分析
客户:个人,机构(独家的一手资料),海量用户
股票:有价证券可以买卖,
基于股票流水分析的系统,股票大盘,板块,A块
大盘:整个大盘地得唤醒
开发流程
需求分析->设计->编码->测试->发布运维
1.环境的搭建
1.1父工程
步骤:
1.创建了一个maven工程
2.打包的方式pom
3.约定若干个依赖资源的版本
4.通过对版本资源的锁定
5.通过对插件版本的锁定
版本的锁定,插件的锁定,管理子工程生命的周期
1.2构建common子工程
步骤:
1.创建了一个子工程common
2.把持久层资源导入,
3.同股票MybatisX逆向工程,选中这些表,自动生成
打包为jar,该工程主要抽取公共的资源
1.持久层相关的依赖资源:mybatis pageHelper mysql等
2.mapper接口 xml
3.实体类entity,domain对象,vo pojo等
4.配置信息等
1.3构建backend工程
该工程主要用于对接前端展示功能
步骤:
1.创建一个子工程backend
2.打包方式为jar
3.引入持久层相关依赖,将common这个工程导入,因为common本身向web提供web接口应用,所以把web场景依赖导入,外部场景依赖无序提供版本,被父工程锁定
4.单元测试,引入插件
5.定义main启动类,和yml文件(端口,数据源,mybatis,pagehelpr)
6.在main启动类打上Mapperscan注解
打包方式为jar,该工程主要用于对接前端展示功能
1.common公共资源,web场景依赖,单元测试,插件(打包)
2.MybatisX逆向工程的使用
3.用户登录验证功能
接口文档
/**
* @author Wxx
* @date 2022/12/14 0:56
* @version 1.0
* @Description: TODO实现用户登录验证功能
*/
@Override
public R login(LoginReqVo vo) {
//1.校验数据的合法性
if (vonull|| Strings.isNullOrEmpty(vo.getUsername())||Strings.isNullOrEmpty(vo.getPassword())) {
return R.error(ResponseCode.DATA_ERROR);
}
//校验验证码和sessionId是否有效
if (Strings.isNullOrEmpty(vo.getCode())||Strings.isNullOrEmpty(vo.getRkey())) {
return R.error(ResponseCode.DATA_ERROR);
}
//根据Rkey从redis获取缓存的验证码
String rCode = (String) redisTemplate.opsForValue().get(StockConstant.CHECK_PREFIX + vo.getRkey());
//判断获取的验证码是否存在.以及是否与输入的验证码相同
if (Strings.isNullOrEmpty(rCode)||!rCode.equalsIgnoreCase(vo.getCode())) {
//验证码有误
return R.error(ResponseCode.CHECK_CODE_ERROR);
}
//2.根据姓名查找用户
SysUser user = sysUserMapper.getUserByUserName(vo.getUsername());
//3.判断是否存在
if(usernull){
return R.error(ResponseCode.ACCOUNT_NOT_EXISTS_ERROR);
}
boolean isSuccess = passwordEncoder.matches(vo.getPassword(), user.getPassword());
//4.验证密码是否相同
if(!isSuccess){
return R.error(ResponseCode.USERNAME_OR_PASSWORD_ERROR);
}
//5.成功,返回相应的格式数据
LoginRespVo respVo = new LoginRespVo();
BeanUtils.copyProperties(user,respVo);
return R.ok(respVo);
}
前端页面输入用户信息,点击登录会将输入的信息封装发送到后台
步骤:1.首先校验数据的合法性(是否存在空,如果存在就不用调用sql语句)
1.1校验用户的信息是否为空
1.2校验验证码是否为空,sessionId是否失效
1.3利用key在缓存中获取其对应的值(验证码),与前端输入传过来的数据进行比较
2.根据姓名在数据库中查找对应的角色信息(姓名唯一),看用户是否存在,如果存在再与输入的密 码进行比对
3.将信息返回给前端(beanUtils直接将对象赋值到新的空白对象中)
将多的数据赋值到少的数据中
有意思的收获:
1.MybatisX逆向工程
2.工具类
Strings.isNullOrEmpty(str):判断str是否是空或者null
lang3下的StringUtils.isBlank(str):判断str是否为null
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
总结:
isWhiteSpace()指定字符是否含有空白字符,空白字符包括:空格,换行符,tab键。
可以看到isBlank是对isEmpty的增强
所以,isBlank的作用为:
StringUtils.isBlank(null) = true
StringUtils.isBlank(“”) = true
StringUtils.isBlank(" “) = true
StringUtils.isBlank(” “) = true
StringUtils.isBlank(”\t \n \f \r") = true //对于制表符、换行符、换页符和回车也判定为空
3.Json
Jsonserialize(using =ToStringSerializer.class)
雪花算法生成的long数字传到前端会精度丢失(最多17位)
解决方法:转化为字符串用注解:Jsonserialize(using =ToStringSerializer.class)
4.beanUtils
依赖包:org.apache.commons.beanutils.BeanUtils
使用beanUtils.copyProperties(复制前的,需要复制到空白的对象)
对象属性多的利用beanUtils.copyProperties方法复制到少的对象中
子集思想
面试题:
1.说一下你们项目的开发流程是怎样的?
需求分析->设计->编码->测试->发布运维
立项
需求分析:
产品经理,专职需求分析师
分析甲方需求+竞品分析
用户需求及合同,需求分析说明书
设计:
产品经理,UI,架构师
2.你的项目组有哪些人员参与?人员配比是怎样的?
项目经理:1+
产品经理:1+
UI设计
架构师
开发人员:前端2-3,后端5-7,开发测试
测试:1+
运维:1+
3.简单介绍下今日指数项目?
4.简单介绍下股票、大盘、板块、A股、K线图相关概念?
5.前段后分离有什么优势?项目中前后端开发中有哪些注意事项?
1.解耦,开发的时候可以并行执行
注意事项:
跨域问题:前后端分离两台服务器,数据交互资源不是来自同一个服务器,不满足同源策略,所以需要设置跨域
6.有没有独立搭建过项目工程?