② . 预约
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()); }
③. 预约成功
3>.
预约成功
day08 手机登录 | 权限
①. 通过手机进行验证
1>.
通过手机进行验证
1.需求分析:
- 手机快速登录功能,就是通过短信验证码的方式进行登录。这种方式相对于用户名密码 登录方式,用户不需要记忆自己的密码,只需要通过输入手机号并获取验证码就可以完 成登录,是目前比较流行的登录方式
2.
发送验证码
思路 前台: 1.验证手机号是否正确 2.如果手机号正确,通过定时器来完成倒计时30s 3.发送ajax发送验证码[将电话号码作为参数传入后台] 后台:[controller] 1.调用阿里接口短信发送[验证码是工具类生成的] 2.如果发送成功,将验证码保持到redis中 注意:因为验证码是一次性的,在Redis中保持要用sete(key,time,value)
步骤:
1.前台代码
2.后台代码
[在ValidateCodeController中提供send4Login方法,调用短信服务发送验证码并将验证 码保存到redis]
3.
登录
思路 前台: 1.验证手机号是否正确[防止有人直接点击登录] 2.如果手机号正确,通过定时器来完成倒计时30s 3.发送ajax发送验证码[表单信息作为参数传入后台] 后台:[controller] 1.校验用户输入的短信验证码是否正确,如果验证码错误则登录失败 2.如果验证码正确,则判断当前用户是否为会员,如果不是会员则自动完成会员注册 3.向客户端写入Cookie,内容为用户手机号 4.将会员信息保存到Redis,使用手机号作为key,保存时长为30分钟
前台步骤:
1.为登录按钮绑定事件
2.对电话做出判断,发送ajax
//后台代码实现 @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); } }