发表于: 2018-01-29 17:47:55

1 680


2018129日星期五

今天完成的事情:

1  改下前端页面

登录

   

注册

使用bootstrap + jQuery

2  数据库

添加三个字段,重新用mybatis 逆向工程生成代码。

这里有个问题,是没有做验证码的校验,仅仅是发送了一个验证码。而且用户状态只有注册和未注册,没有"已注册,未激活"这个状态。

我想的解决方案是再建一个临时表,只存放已注册,未激活的用户。

字段应该有:用户名、邮箱、手机号、验证码、验证码发送时间。

这个表用来检测验证码是否正确,用户状态是否激活。

时间有限就先不做了。

3  短信

使用api51的接口,不免费,4分钱一条,不用实名认证,充了1块钱的,可以发25条。

工具类:

比较简单就不说了,填入自己的token令牌,指定模板,按照模板参数,传入数据即可。

jsp页面,用ajax提交请求:

代码:这里邮箱和手机号放在一块,所以先用正则判断:

 

// 点击 获取 验证码
// 注册时,email 文本内容改变的话,开始校验 email
$("#get_key_btn").click(function () {
// 提交数据先进行前端校验
   if(!form_validate_email("#register_email_input")) {
return false;
   }

// 如何获取 input 的输入值
   var sendData = $("#register_email_input").val();
   // url 指定一个变量
   var sendUrl = "";
   if($("#register_email_input").attr("name")=="email") {
sendData="email=" + sendData;
       sendUrl="/pushEmailCode";
   } else{
sendData="phone=" + sendData;
       sendUrl="/pushPhoneCode";
   }

$.ajax({
url:sendUrl,
       type:"POST",
       data:sendData,
       // result controller函数返回对象(序列化后的json字符)
       success:function (result) {
if(result.code==100){
// 使用抽取的函数 显示提示信息
               $("#register_email_input").parent().removeClass("has-error");
               $("#email_help_block").text("验证码已发送,请输入");
           }else{
$("#register_email_input").parent().addClass("has-error");
               $("#email_help_block").text("邮箱或手机号已注册");
               return false;
           }
}
});

})


controller:首先要判断手机号是否被注册,没有被注册就发送验证码,这里直接发送了固定的字符串,实际情况应该发送一个随机字符串,并保存这个随机字符串,进行验证。

/**
* 检验用户名,是否和数据库中的重复
* @param  phone 用户输入的 phone number
* @return 自定义的格式,使用 Jackson 转为 json 字符
*/
@RequestMapping(value = "/pushPhoneCode", method = RequestMethod.POST)
@ResponseBody
public ResponseMsg pushPhoneCode(@RequestParam("phone")String phone) {
if (userService.isPhoneRegister(phone)) {
return ResponseMsg.fail();
   } else {
sendPhoneCode(phone,"456123");
       return ResponseMsg.success();
   }
}


service层,写了一个判断手机号是否存在的方法,直接调用。

 

debug测试,发送成功:

4  邮箱

4.1  使用javaMailsmtp服务,用个人qq邮箱来发

代码不贴了,给个博客吧,几乎没怎么改:

http://blog.csdn.net/xietansheng/article/details/51673073   

单元测试,(发件人:1521189886@qq.com,收件人: outlook邮箱)发送成功:

4.2  使用sendmail接口,绑定域名来发

绑定域名:很多后缀不好的域名只要几块钱,买了一个 lqtblog.xyz ,绑定成功:

我用的sendmailsmtp接口,同样需要javamailjar包支持。

也是直接用sendmail的示例代码,就不贴了。

测试,发送成功

5  七牛上传文件

5.1  编写工具类

直接用七牛的官方java sdk,重新写下方法

 

package com.bpzj.task4.util.qiniu;

import java.io.IOException;
import java.io.InputStream;

import com.qiniu.common.Zone;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.util.Auth;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class QiNiuUtil {

@Autowired
   private Auth qiniuAuth;

   /**
    * 七牛账号的 ACCESS_KEY SECRET_KEY ,秘钥组
    * defaultBucket 对象存储 - 存储空间列表 ,默认上传到这个 bucket
    */
   private final static String ACCESS_KEY="*****";
   private final static String SECRET_KEY="*****";
   private String defaultBucket ="picture";

   // 不使用 spring注入,而使用 普通方法创建 QiniuAuth 对象
   // static QiniuAuth auth = QiniuAuth.create(ACCESS_KEY,SECRET_KEY);

   // ********************** 创建上传对象 **************************
   // 构造一个带指定Zone对象的配置类,zone0 表示华东机房
   private Configuration cfg = new Configuration(Zone.zone0());
   // 创建 上传对象
   private UploadManager uploadManager=new UploadManager(cfg);


   // 上传到七牛后保存的文件名,同名直接覆盖
   // 默认不指定 key 的情况下,以文件内容的hash值作为文件名
   private String key = null;


   /**
    * 从 文件路径 上传文件到 七牛云
    * @param bucketName 指定 bucket
    * @param filePath 上传文件的路径
    * @return 上传成功,返回 文件名(hash值),上传失败,返回 空字符串
    * @throws IOException
    */
   public String uploadFile(String bucketName,String filePath) throws IOException {

String upToken = qiniuAuth.uploadToken(bucketName);

       try {
//调用put方法上传
           Response response = uploadManager.put(filePath, key, upToken);
           //打印返回的信息
           if (response.isOK()) {
String[] resultString=response.bodyString().split("\"");
               // System.out.println(resultString[3]);
               return resultString[3];
           }
} catch (QiniuException e) {
Response r = e.response;
           //请求失败时打印的异常的信息
           System.out.println(r.toString());
           try {
//响应的文本信息
               System.out.println(r.bodyString());
           } catch (QiniuException e1) {
e.printStackTrace();
           }
}
return "";
   }

/**
    * InputStream 上传文件到 七牛
    * @param bucketName 指定 bucket
    * @param inputStream 传入的 InputStream
    * @return 上传成功,返回 文件名(hash值),上传失败,返回 空字符串
    */
   public String uploadFile(String bucketName,InputStream inputStream){
String upToken = qiniuAuth.uploadToken(bucketName);

       try {
// InputStream 转为 byte[]
//            byte[] byteData = IOUtils.toByteArray(inputStream);
//            Response response = uploadManager.put(byteData, key, upToken);
           Response response = uploadManager.put(inputStream,key,upToken,null,null);
           if (response.isOK()) {
String[] resultString = response.bodyString().split("\"");
               // System.out.println(resultString[3]);
               return resultString[3];
           }
} catch (QiniuException e) {
Response r = e.response;
           //请求失败时打印的异常的信息
           System.out.println(r.toString());
           try {
//响应的文本信息
               System.out.println(r.bodyString());
           } catch (QiniuException e1) {
e.printStackTrace();
           }
} catch (Exception e) {
return "";
       }

return "";
   }



public void deleteFile(String bucketName, String FileKey) {
BucketManager bucketManager = new BucketManager(qiniuAuth, cfg);
       try {
bucketManager.delete(bucketName, FileKey);
       } catch (QiniuException ex) {
//如果遇到异常,说明删除失败
           System.err.println(ex.code());
           System.err.println(ex.response.toString());
       }
}
}


5.2  使用spring注入的问题

注入一个 com.qiniu.util.Auth bean,使用官方sdk的时候,就会发现官方用的是

Auth. create方法:

 

这就有问题了,还好这个sdk是开源的:

github下载源码,打开,这是一个gradle项目:

添加两个构造器

重新编译:

替换本地maven仓库中的jar

然后用spring注入,用构造器方法注入

 

<!-- 通过spring来配置 七牛 图片存储 -->
<context:property-placeholder
       location="classpath:fileUpload.properties"
       ignore-unresolvable="true"/>
<bean id="qiniuAuth" class="com.qiniu.util.Auth">
   <constructor-arg name="accessKey" value="${qiniu.accessKey}"/>
   <constructor-arg name="secretKey" value="${qiniu.secretKey}"/>
</bean>

测试,正常。

 

5.3  jsp页面用form表单提交

比较简单,就不说了。


5.4  jsp页面用ajax上传文件

前端页面,

先引入jQuery 2.1.4bootstrap 3.3.7 cssbootstrap 3.3.7 js

 jsp页面:

<input type="file" name="uploadedFile" id="selectedFile" multiple/>
<br/>
<input class="btn btn-info" id="upload_btn" value="ajax上传"/>
<br/>


Chrome中效果

选择文件后:

编写ajax上传的js脚本,要的效果是:点击ajax上传按钮,进行上传。

 

$("#upload_btn").click(function () {
// var formData = new FormData(); 实例化了一个空的FormData对象
   // 可以认为它就是一个form表单,但现在里面什么控件都没有
   var data = new FormData();

   // FormData.append(name, value, filename)方法可以很方便的
   // -对的形式给FormData添加控件
   // data.append('uploadedFile', $('input[name=uploadedFile]')[0].files[0]);
   data.append('uploadedFile', $("#selectedFile")[0].files[0]);

   $.ajax({
// url:"http:localhost:8080/uploadFile",
       url:"http:localhost:8080/qiniuUpload",
       type:"POST",
       data:data,
       // 上传文件不需要缓存。
       cache: false,
       /* ********************************************
        contentTypeprocessData参数:
        processData参数,根据jQuery.ajax()文档中的解释,默认情况下,jQuery
        会处理发送的数据,将数据按照'application/x-www-form-urlencoded'
        要求转换为查询字符串,这里是文件,所以,不让 jQuery进行转换

        contentType:因为发送数据 input type="file"(上传文件),那么这时
        contentType应该设置为'multipart/form-data',但是在data.append的时
        候,已经自动设置了,所以,不能再让jQuery设置一遍,会报错,可以在浏览器
        F12 看下,详见笔记截图
        */
       processData: false,
       contentType: false,
   })
});


contentTypeprocessData参数,在浏览器调试:

 

还有另一种处理方式:

http://chen1218chen.github.io/2016/09/28/SpringMVC%E4%B9%8B%E5%A4%9A%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0/

就是用FormDataform表单(表单中有input file) 转为 FormData对象,然后用ajax上传。


1.1  controller中用InputStream直接上传到七牛云

@RequestMapping(value = "/qiniuUpload",method = RequestMethod.POST)
@ResponseBody
public ResponseMsg qiniuUpload(@RequestParam("uploadedFile")MultipartFile file)
throws IllegalStateException, IOException {
String nameInQiniu = qiNiuUtil.uploadFile("picture", file.getInputStream());
   System.out.println(nameInQiniu);
   return ResponseMsg.success();

}

测试:

成功:

明天计划的事情:

完成任务7,开始任务8

 

遇到的问题:

在前端jsp页面上浪费的时间太多了,还看了七牛云javascriptsdk,第三方JavaScript上传插件bootstrap fileinput,反正在前端浪费太多时间了。

 

收获:

IO

contentType: false

 


返回列表 返回列表
评论

    分享到