用户信息管理
1 otp短信获取
根据一定规则生成OTP验证码
将OPT验证码同对应用户手机号关联,使用httpsession得方式绑定手机号与optCode .之后可以使用Redis实现
将OTP验证码通过短信通道发送给用户,省略
2 otp用户注册---------error
-
- controller从前端获取到telphone,otpCode,name,age,password
- 比较otpCode和存在session中的otpCode是否一致,如不一致,就抛异常
- 注册;
- j将前端获取到的telphone,otpCode,name,age,password存在controller-service用户领域模型usermodel中
- 调用service中 register(usermodel)函数
- register(usermodel)函数:
- usermodel判空处理,抛异常
- 将usermodel转到成数据库对象DO
- 通过Mapper将数据库对象DO插入到数据库
注意:在使用insertSelective向数据库插入数据时,需要设置id为主键,并且设置id自增
3 用户手机登录
controller层
1 拿到telphone与password参数
2 用户登录服务 ,校验用户登录是否合法,调用userService.login()得到userModel 对象
UserModel userModel = userService.login(telphone,password);
3 将登录凭证加入到用户登录成功的session中
userService.login():
1 usermapper通过手机号获取userdo对象
2 userpasswordmapper通过userdo对象信息获取userpassworddo对象
3 将userdo对象与userpassworddo对象转换成Usermodel对象
4 比较前端获取的密码与Usermodel对象中所存密码是否一致
5 将Usermodel对象返回
优化错误验证信息:
引入hibernate-validator依赖
新建validator包其中包含:ValidationResult类与ValidatorImpl类:
ValidationResult类:验证结果类
//校验结果是否正确参数
//存放错误信息map
获取错误结果的msg方法
ValidatorImpl类:定义对传进来的bean(要验证异常的对象)进行验证规则定义
实现校验方法并返回校验结果 validate()
使用:
1 创建ValidatorImpl对象
2 调用validate()函数得到错误信息
3 如果错误信息不为空,就抛异常
======================================================================================
商品信息管理
数据准备:
1先创建用户领域模型 ItemModel 包含 id;商品名称 title;商品价格price; 商品库存stock;商品描述 description;商品销量sales;商品描述图片urlimgUrl;
2 数据库中添加创造item表和iten_stock表
3 在mybatis_generator.xml中修改要自动生成的表信息
4 运行mybatis_generator.XML生成dao,dataibject,mapping文件
逻辑实现:----->待完善
ItemService:
1 创建商品----->待完善
2 商品列表浏览----->待完善
3 商品详情浏览----->待完善
报错:
(1)
Unknown system variable 'query_cache_size'
修改mysql-connector-java依赖:8.0.11版
mysql
mysql-connector-java
8.0.11
(2)
The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. Yo
修改:connectionURL="jdbc:mysql://127.0.0.1:3306/miaoshop?serverTimezone=GMT%2B8"
商品列表:(排序规则:销量倒序排序)
1:mapper:通过商品销量倒叙返回商品列表
2:编写services
通过mapper获取到商品列表并且通过list内的stream函数的api转换成领域模型列表
3:ctroller通过services调用函数获取领域模型列表list
=======================================================》》解析
List<String> widgetIds = widgets.stream().map(Widget::getWidgetId).collect(Collectors.toList());
解释下一这行代码:
- widgets:一个实体类的集合,类型为List
- Widget:实体类
- getWidgetId:实体类中的get方法,为获取Widget的id
本来想要获得wiget的id集合,按照我的思路肯定是遍历widges,依次取得widgetIds,但是此行代码更加简洁,高效
stream()优点
- 无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
- 为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
- 惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
- 可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
stream().map()方法的使用示例:
- List list= Arrays.asList("a", "b", "c", "d");
- List collect =list.stream().map(String::toUpperCase).collect(Collectors.toList());
- System.out.println(collect); //[A, B, C, D]
- List num = Arrays.asList(1,2,3,4,5);
- List collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
- System.out.println(collect1); //[2, 4, 6, 8, 10]
《《《==================================================================
4结果
商品详情页:省略
5用户交易
1交易模型orderModel
2创建数据库表
3mybatis自动生成do和domapper
用户交易功能
1完成services
services步骤分为四步:1 校验(否则抛异常)。2订单减库存。 3操作订单入库。4返回订单模型
@其中订单减库存在itemservices中完成,需要去数据库找到商品库存信息,然后执行更新数据库库存(减)。通过sql返回状态来判断执行是否成功,成功说明库存够用,状态设置为true,否则执行状态false。
@3插入订单数据(订单入库)
注意,订单数据的id是没有的,而且也没有设置成自增,因为在实际工作中,常用有意义的16为表示,其中8位年月日。 8位自增序列(区别各个订单)。2位分库分表位(此处写死)。
其中八位自增序列通过数据库sql实现,新增sequence表用来记录自增序列号,每次订单入库都去操作该表,更新该表内自增序列号。
1新增该交易数据到数据库
2更新商品对于销量+1
注意此处事务标签,表示即使在外层事物执行失败后(比如入库失败),该事物也会执行,即意味着会自增序列号还是会增加。
以上4步的services代码: