【电商秒杀笔记】2

用户信息管理

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()优点

  1. 无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。
  2. 为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
  3. 惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
  4. 可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

stream().map()方法的使用示例:

  1. List list= Arrays.asList("a", "b", "c", "d");
  2. List collect =list.stream().map(String::toUpperCase).collect(Collectors.toList());
  3. System.out.println(collect); //[A, B, C, D]
  4. List num = Arrays.asList(1,2,3,4,5);
  5. List collect1 = num.stream().map(n -> n * 2).collect(Collectors.toList());
  6. 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代码:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值