传智健康[八]

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 关于传智健康的相关知识

② . 预约

2>. 预约

  controller:
    1.将用户输入的验证码和redis中保存的验证码进行比对
    2.如果校验成功,将map参数传入service;根据service返回的结果来进行判断
    3.如果校验失败,返回错误信息结果给页面
  service:
    1.检查用户所选择的预约日期是否已经提前进行了预约设置,如果没有设置则无法进行 预约
    2.检查用户所选择的预约日期是否已经约满,如果已经约满则无法预约
    3.检查用户是否重复预约(同一个用户在同一天预约了同一个套餐),如果是重复预约 则无法完成
    再次预约
    4.检查当前用户是否为会员,如果是会员则直接完成预约,如果不是会员则自动完成注 册并进行
    预约
    5.预约成功,更新当日的已预约人数
    //在线体检预约
    @RequestMapping("/submit")
    /*
     controller:
        1.将redis缓存的验证码和前台输入框中的验证码进行比对
        2.如果比对成功!
           2.1 设置预约类型
           2.2 调用service
           2.3 如果result.isFlag==true 发送成功验证码
        3.如果比对不成功
    * */
    public Result submit(@RequestBody Map map){
           //要知道手机号
           String telephone = (String) map.get("telephone");
          //思路: 先从redis获取保存的验证码
           String validateCodeInRedis=jedisPool.getResource().
                   get(telephone+ RedisMessageConstant.SENDTYPE_ORDER);
          //将用户输入的验证码和redis中保存的验证码进行比对
          String validateCode = (String) map.get("validateCode");
       /*   if(StringUtils.equals(validateCodeInRedis,validateCode)){
          }*/
          if(validateCodeInRedis!=null&&validateCode!=null&&validateCode.equals(validateCodeInRedis)){
              //如果比对成功!调用服务完成预约业务进行处理
              //设置预约的类型,分为: 微信预约 | 电话预约
              map.put("orderType", Order.ORDERTYPE_WEIXIN);
              //通过dubbo来远程调用服务,来实现在线预约业务处理
              Result result=null;
              try {
                  result= orderService.order(map);
              }catch (Exception e){
                  e.getStackTrace();
                  return result;
              }
              if(result.isFlag()){
                  //预约成功!可以为用户发送短信
                  try {
                      SMSUtils.sendShortMessage(SMSUtils.ORDER_NOTICE,telephone,(String)map.get("orderDate"));
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
              return result;
          }else{
              //如果比对失败,返回结果给页面
              return new Result(false, MessageConstant.VALIDATECODE_ERROR);
          }
    }
    //体检预约
    @Override
    public Result order(Map map) throws Exception{
        //1、检查用户所选择的预约日期是否已经提前进行了预约设置,如果没有设置则无法进行预约
            //1.1 获取前台的日期
            String orderDate = (String) map.get("orderDate");
            Date date = DateUtils.parseString2Date(orderDate);
            OrderSetting orderSetting=orderSettingDao.findByOrderDate(date);
            if(orderSetting==null){
                //指定日期没有进行预约设置,则无法完成预约
                return new Result(false, MessageConstant.SELECTED_DATE_CANNOT_ORDER);
            }
        //2、检查用户所选择的预约日期是否已经约满,如果已经约满则无法预约
            //2.1 可预约的人数
            int number = orderSetting.getNumber();
            //2.2 已预约的人数
            int reservations=orderSetting.getReservations();
            if(reservations>=number){
              //预约已满,不能预约
              return new Result(false,MessageConstant.ORDER_FULL);
            }
        //3、检查用户是否重复预约(同一个用户在同一天预约了同一个套餐),如果是重复预约则无法完成再次预约
            String telephone = (String) map.get("telephone");//获取用户页面输入的手机号
            Member member = memberDao.findByTelephone(telephone);
            if(member!=null){
                //判断是否在重复预约
                Integer numberId = member.getId();//会员id
                String setmealId = (String) map.get("setmealId");//套餐id
                //同一个用户同一天预约了同一个套餐
                Order order = new Order(numberId, date, Integer.parseInt(setmealId));
                //根据条件进行查询
                List<Order> list = orderDao.findByCondition(order);
                if(list!=null&&list.size()>0){
                    //说明用户在重复预约,无法完成再次预约
                    return new Result(false,MessageConstant.HAS_ORDERED);
                }
            }else{
                //4、检查当前用户是否为会员,如果是会员则直接完成预约,如果不是会员则自动完成注 册并进行预约
                member=new Member();
                member.setName((String) map.get("name"));
                member.setPhoneNumber(telephone);
                member.setIdCard((String) map.get("idCard"));
                member.setSex((String) map.get("sex"));
                member.setRegTime(new Date());
                memberDao.add(member);//自动完成会员注册
            }
         //5、预约成功,更新当日的已预约人数
                Order order = new Order();
                order.setMemberId(member.getId());//设置会员ID
                order.setOrderDate(date);//预约日期
                order.setOrderType((String) map.get("orderType"));//预约类型
                order.setOrderStatus(Order.ORDERSTATUS_NO);//到诊状态
                order.setSetmealId(Integer.parseInt((String) map.get("setmealId")));//套餐ID
                orderDao.add(order);
               //设置已预约人数+1
               orderSetting.setReservations(orderSetting.getReservations()+1);
               orderSettingDao.editReservationsByOrderDate(orderSetting);
        return new Result(true,MessageConstant.ORDER_SUCCESS,order.getId());
    }

20191025170301672.png

③. 预约成功

3>. 预约成功

20191025170829759.png

20191025170148346.png

day08 手机登录 | 权限

①. 通过手机进行验证

1>. 通过手机进行验证

1.需求分析:

  • 手机快速登录功能,就是通过短信验证码的方式进行登录。这种方式相对于用户名密码 登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就可以完 成登录,是目前比较流行的登录方式


20191023214549946.png

20191023214657194.png

2. 发送验证码

思路
  前台:
    1.验证手机号是否正确
    2.如果手机号正确,通过定时器来完成倒计时30s
    3.发送ajax发送验证码[将电话号码作为参数传入后台]
    后台:[controller]
      1.调用阿里接口短信发送[验证码是工具类生成的]
      2.如果发送成功,将验证码保持到redis中
      注意:因为验证码是一次性的,在Redis中保持要用sete(key,time,value)  

步骤:

1.前台代码

20191024112253408.png

20191024112303826.png

2.后台代码

[在ValidateCodeController中提供send4Login方法,调用短信服务发送验证码并将验证 码保存到redis]

20191024112343126.png

3. 登录

思路
  前台:
    1.验证手机号是否正确[防止有人直接点击登录]
    2.如果手机号正确,通过定时器来完成倒计时30s
    3.发送ajax发送验证码[表单信息作为参数传入后台]
    后台:[controller]
      1.校验用户输入的短信验证码是否正确,如果验证码错误则登录失败
      2.如果验证码正确,则判断当前用户是否为会员,如果不是会员则自动完成会员注册
      3.向客户端写入Cookie,内容为用户手机号
      4.将会员信息保存到Redis,使用手机号作为key,保存时长为30分钟


前台步骤:

1.为登录按钮绑定事件

20191024112801415.png

2.对电话做出判断,发送ajax

20191024112835953.png

    //后台代码实现
    @Autowired
    private JedisPool jedisPool;
    @Reference
    private MemberService memberService;
    //手机号快速登录
    @RequestMapping("/login")
    public Result login(@RequestBody Map map, HttpServletResponse response){
        // 获取页面的手机号码
        String telephone= (String) map.get("telephone");
        // 获取redis中的验证码
        String redisCode = jedisPool.getResource().get(telephone + RedisMessageConstant.SENDTYPE_LOGIN);
        // 获取页面的验证码
        String validateCode= (String) map.get("validateCode");
        //1.比对redis中的验证码和输入的验证码是否相同
        if(redisCode!=null&&validateCode!=null&&redisCode.equals(validateCode)){
            //验证码正确
        //2.判断当前用户是否是会员(查询会员表示确定)
        Member member = memberService.findByTelephone(telephone);
            if(member==null){
                //不是会员,自动完成注册(自动将用户信息保持会员表)
                member=new Member();
                member.setRegTime(new Date());
                member.setPhoneNumber(telephone);
                memberService.add(member);
            }
        //3、向客户端写入Cookie,内容为用户手机号
        Cookie cookie=new Cookie("login_member_telephone",telephone);
        cookie.setPath("/");//路径
        cookie.setMaxAge(60*60*24*30);//有效期30天
        response.addCookie(cookie);
        //4、将会员信息保存到Redis,使用手机号作为key,保存时长为30分钟
            String json=JSON.toJSON(member).toString();
            jedisPool.getResource().setex(telephone,60*30,json);
            return new Result(true,MessageConstant.LOGIN_SUCCESS);
        }else{
            //验证码输入错误
            return new Result(false, MessageConstant.VALIDATECODE_ERROR);
        }
    }


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
SQL 前端开发 数据库
|
SQL JSON 前端开发
|
SQL 前端开发 数据可视化
|
XML 缓存 Java
传智健康day07 页面静态化
传智健康day07 页面静态化
传智健康day07 页面静态化
|
SQL 前端开发 JavaScript
传智健康day03 预约管理-检查组管理1
传智健康day03 预约管理-检查组管理1
传智健康day03 预约管理-检查组管理1
|
移动开发 Dubbo Java
传智健康day06 移动端开发-体检预约1
传智健康day06 移动端开发-体检预约1
传智健康day06 移动端开发-体检预约1
|
运维 监控 Java
传智健康day06 移动端开发-体检预约2
传智健康day06 移动端开发-体检预约2
传智健康day06 移动端开发-体检预约2
传智健康[二]
关于传智健康的相关知识
133 0
传智健康[二]
|
Java 数据库连接 mybatis
传智健康[五]
关于传智健康的相关知识
186 0
传智健康[五]
|
Java Maven Spring
传智健康[六]
关于传智健康的相关知识
164 0
传智健康[六]