发表于: 2020-06-11 23:36:29

1 1864


今天完成的事情:


1. 把验证验证码有效期    和  发送次数单独建了一张表

写了接口  实现类


发送短信的逻辑:

            //先从数据库查询有没有
           ForYzm forYzm = forYzmService.selectByPhone(tel);
           
           if(forYzm==null) {
//              如果为空   插入个新的   手机号  验证码  创建时间   次数
               long createTime = System.currentTimeMillis();
               ForYzm forYzmA = new ForYzm();
               forYzmA.setPhone(tel);
               forYzmA.setPhone(pyzm);
               forYzmA.setCreateAt(createTime);
               forYzmA.setNum(1);

               int a = forYzmService.insert(forYzmA);

           }else {
//              如果不为空    根据手机号更改     新的验证码   新的创建时间   次数+1
               int num = forYzm.getNum();
               int numInce = num+1;
               long createTime = System.currentTimeMillis();
               ForYzm forYzmA = new ForYzm();
               forYzmA.setPhone(tel);
               forYzmA.setPhone(pyzm);
               forYzmA.setCreateAt(createTime);
               forYzmA.setNum(numInce);

               boolean tf = forYzmService.updateByPhone(forYzmA);

           }


验证的逻辑:

 //先从数据库查询
       ForYzm forYzm = forYzmService.selectByPhone(phone);

       //大于5次就不能发送
       if(forYzm.getNum()>5){
           String error = "请求验证码超过5次!请重新发送!";
           logger.info("请求验证码超过5次!请重新发送!");
           request.setAttribute("YzmError", error);
           return "phoneRegister";
       }

       long NowTime = System.currentTimeMillis();
       long startTime = forYzm.getCreateAt();
       long endTime = NowTime - startTime;

       //当前时间 - 创建时间    如果超过60秒就过期
       if (endTime > 60*1000) {
           String error = "验证码已经过期!请重新发送!";
           logger.info("未发送验证码!");
           request.setAttribute("YzmError", error);
           return "phoneRegister";
       }

       //获取缓存中的验证么
       String GetDBYzm = forYzm.getYzm();
       logger.info("获取到的缓存里的验证码是" + GetDBYzm);

       if (InputYzm.equals(GetDBYzm)) {
           logger.info("验证码相同");

           MyAccount account = new MyAccount();
           account.setUsername(u);
           account.setPassword(p);
           account.setPhone(phone);
           logger.info("要注册的用户数据为:" + account);

           try {

               //插入数据
               int id = my.insertAccount(account);
               logger.info("注册完毕生成的用户id" + id);
               logger.info("注册成功!");
               //返回到登录页面
               return "loginPage";

           } catch (Exception e) {
               String error = "注册失败,请再试试";
               logger.info("注册失败,请重新输入");
               request.setAttribute("error", error);
               return "phoneRegister";
           }

       } else {
           String error = "验证码错误,请重新输入!";
           logger.info("验证码错误");
           request.setAttribute("YzmError", error);
           return "phoneRegister";
       }
   }
}




任务总结:



1.完成任务时间:

一    任务进度是否符合预期,是否延期,如果延期,原因是什么,如何避免下次继续延期

9天  比较慢


二    脑图分析




三    任务中遇到哪些疑难问题,最终是如何解决的,有哪些值得分享的收获

1. 刚开始就是第三方sdk看不懂

可以下载官方的demo  跟着跑一遍就好了

2. 不用SDK时,Java调用API需要 httpClient,

可以在java代码里模拟浏览器客户端发送请求。

3.验证码可以放在缓存里(前提是业务中已经增加了缓存功能)

验证码也可以放在数据库里,不过会稍微增大些数据库的压力

完全业务需求来选择。

4.Java不通过第三方,也有一个调用个人或企业邮件的发邮件功能

不过前提是你的邮箱 需要关闭登录保护,开启POP3/SMTP服务


整个任务最重要的就是要看懂第三方的demo  

快速使用第三方的sdk或者api实现业务功能



深度思考:


1.什么是Annotation,怎么自定义Annotation,Annotation和XML的优缺点各是什么?


Annotation就是注解
注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释代码的一部分。
注解对于代码的运行效果没有直接影响。
用处:
提供信息给编译器:编译器可以利用注解来探测错误和警告信息
编译阶段时的处理:软件工具可以利用注解信息来生成代码 html 文档或者其他相应的处理

运行时的处理:某些注解可以在程序运行的时候接受代码的提取

注解--优点:
简化配置
使用起来直观且容易,提升开发的效率
类型安全,容易检测出问题
缺点:
修改起来比xml麻烦

如果不项目不了解,可能给开发和维护带来麻烦


Xml--优点:
把类与类之间松解偶;修改方便;容易扩展
容易和其他系统进行数据交互
对象之间的关系一目了然
缺点:
配置冗长,需要额外维护;影响开发效率
类型不安全,校验不出来,出错不好排查
注解简单概括:写起来比较简单、方便,看起来也简洁,但是修改麻烦
Xml配置概括:写起来比较灵活、修改方便,但是写和维护麻烦

参考: https://www.jianshu.com/p/ac276f068ea4


自己写的   自定义注解
@Target(value = {ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface NameAnnotation {
//注解类型元素
public String name();
//也可以设置默认属性
// String name() default "管理员";
}
@target  定义这个注解只能放在类 / 接口 / 方法上运行   (可定义多种)
@Retention  (RetentionPolicy.RUNTIME)表示这个注解可以在运行期的加载阶段被加载到Class对象中。那么在程序运行阶段,我们可以通过反射得到这个注解,并通过判断是否有这个注解或这个注解中属性的值,从而执行不同的程序代码段。 除了这个还有两种
@Documented   被用来指定自定义注解是否能随着被定义的java文件生成到JavaDoc文档当中。
在自定义注解中,其实现部分只能定义一个东西:注解类型元素   就是我们接口定义的属性  String name(  );
怎么用:    注解放在方法上赋值即可    
public class NameAnnoationTest {
@NameAnnotation(name="")
public void Nmae(String name ){
System.out.println(name);
}

参考: https://blog.csdn.net/xsp_happyboy/article/details/80987484


2.如何调用第三方API实现图片上传?


以金山云为例:
1 调用金山云对象储存API   向API (POST     https://bucket.kss.ksyun.com )
发送 key(新的文件名)     accessKeyId,file, Policy, Signature 进行图片的上传
2 引入金山云sdk    自己写一个工具类

通过工具类   传入bucket , accesskeyId   , accessKeySecret , file  ,address,key  来上传图片


3.怎么用Python写一个图片迁移脚本?  

4.第三方的服务可靠吗,如果出现错误该怎么处理?  

阿里/腾讯/百度云   这种大厂的第三方服务可靠度应该更高     其他的厂商私有云可靠度会低
如果出现错误,可以根据官方的返回的错误码来排查自己代码的问题。

如果是确认自己的代码没问题,程序有异常。或者调用第三方服务时突然出现大量异常,就要去找第三方服务客服或技术去解决问题。


5.怎么快速集成第三方服务组件,API和SDK的区别是什么?  
怎么快速集成第三方服务组件:调用第三方api或者接口
1 API(应用程序编程接口)
是一些预先定义的函数
目的:作为“介面”沟通两个不同的东西,提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节
2 SDK(软体开发工具包)
是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合
是由第三方服务商提供的实现软件产品某项功能的工具包
API怎么用:
在代码里   利用Java的httpClient组件     模拟访问API     并传入符合要求的参数即可
SDK怎么用:
引入第三方SDK依赖    根据官方Demo,修改其中的参数,并调用其中的对象方法 ,来实现业务功能。 



6.上传图片应该由前端或客户端直接上传到第三方存储服务,还是应该先上传到服务器,再由服务器上传到第三方?
通过服务器:将文件传到服务端,由服务端上传到第三方
通过前端js:将文件由js直接上传到第三方
两种方式都可以完成上传
但是前者还需占用服务端的带宽来上传文件,然后再由服务端上传;
而后者仅占用客户端的资源,这样可以减轻服务端的压力。


7.怎么实现图片防盗链,缩略图,水印等功能?  
防盗链: 每个对象储存服务器的bucket里都可以设置,自定义添加网站白名单/黑名单

缩略图:每个对象储存服务器也可以自定义设置缩略图尺寸大小,添加水印,并生成固定模板,需要时直接调用即可。


8.为什么要使用第三方图片存储服务,好处是什么?  

1.节省自己服务器的空间。
2.服务器不用处理静态图片,提升服务器性能。
3.生成第三方url,可存入数据库调用方便
4.第三方帮你做防盗链,缩略图,水印,  太省事了。

5.唯一缺点可能就是要花钱了


9.怎么样将短信发送服务抽像成公共代码,可以在多个项目中复用?
写个工具类    属性可以随业务需求变化
传入参数    直接调用即可


10.点对点短信和群发短信的通道区别是什么,怎么支持多种短信通道?  


 点对点短信: 是用户通过手机或其他电信终端直接发送或接收的文字或数字信息。点对点短信是指在手机与手机之间发送和接收的端到端的文本信息业务形式。
群发短信: 在运营商申请一个公共的号码,向大量手机发短信。   群发短信是指在系统向多个手机发送文本信息业务形式。
群发需要申请短信通道:
短信通道是由中国移动、联通、电信等运营商直接提供的短信发送接口,实现与客户指定号码进行短信批量发送和自定义发送的目的。
短信通道目前有多种,具体可以分为四大类:
1.三网合一通道,显示号码为1069。
2.移动短信通道,显示号码为10657。
3. 联通短信通道,显示号码为10655。
4. 电信短信通道,显示号码有四种,分别为10659、020、0760、0769。
大公司可以根据业务需求储备多个短信通道,比如注册一个,通知一个,触发一个,验证码一个。

参考;  https://www.lx598.com/hangyedongtai/958.html




返回列表 返回列表
评论

    分享到