p2p手机绑定
本文工具類 ? ??http://www.cnblogs.com/jokerq/p/8590498.html
?
1.需求分析
2.設(shè)計(jì)分析
3.前臺(tái)頁(yè)面(freemarker)
<script type="text/javascript">$(function(){if($("#showBindPhoneModal").size()>0){//點(diǎn)擊立刻綁定,彈出模式窗口 $("#showBindPhoneModal").click(function(){$("#bindPhoneForm")[0].reset(); $("#bindPhoneModal").modal("show");});//給發(fā)送短信按鈕添加時(shí)間 $("#sendVerifyCode").click(function(){var _this=$(this);_this.attr("disabled",true);//1,發(fā)送一個(gè)Ajax請(qǐng)求; $.ajax({url:"/sendVerifyCode.do",dataType:"json",type:"POST",data:{phoneNumber:$("#phoneNumber").val()},success:function(data){if(data.success){var sec=90;var timer=window.setInterval(function(){sec--;if(sec>0){_this.text(sec+"秒重新發(fā)送");}else{//去掉定時(shí)器 window.clearInterval(timer);_this.text("重新發(fā)送驗(yàn)證碼");_this.attr("disabled",false);}},1000);}else{$.messager.popup(data.msg);_this.attr("disabled",false);}}});});//給提交綁定窗口按鈕添加事件 $("#bindPhoneForm").ajaxForm(function(data){if(data.success){window.location.reload();}else{$.messager.popup(data.msg);}});$("#bindPhone").click(function(){$("#bindPhoneForm").submit();});};})</script> <div class="col-sm-4"><div class="el-accoun-auth"><div class="el-accoun-auth-left"><img src="images/shouji.jpg" /></div><div class="el-accoun-auth-right"><h5>手機(jī)認(rèn)證</h5><#if userinfo.isBindPhone ><p>已認(rèn)證<a href="#">查看</a></p><#else><p>未認(rèn)證<a href="javascript:;" id="showBindPhoneModal">立刻綁定</a><!--彈出模態(tài)框--></p></#if> </div><div class="clearfix"></div><p class="info">可以收到系統(tǒng)操作信息,并增加使用安全性</p></div></div> <#if !userinfo.isBindPhone><div class="modal fade" id="bindPhoneModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button><h4 class="modal-title" id="exampleModalLabel">綁定手機(jī)</h4></div><div class="modal-body"><form class="form-horizontal" id="bindPhoneForm" method="post" action="/bindPhone.do"><div class="form-group"><label for="phoneNumber" class="col-sm-2 control-label">手機(jī)號(hào):</label><div class="col-sm-4"><input type="text" class="form-control" id="phoneNumber" name="phoneNumber" /><button id="sendVerifyCode" class="btn btn-primary" type="button" autocomplate="off">發(fā)送驗(yàn)證碼</button></div></div><div class="form-group"><label for="verifyCode" class="col-sm-2 control-label">驗(yàn)證碼:</label><div class="col-sm-4"><input type="text" class="form-control" id="verifyCode" name="verifyCode" /></div></div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">取消</button><button type="button" class="btn btn-primary" id="bindPhone">保存</button></div></div></div></div></#if>4.發(fā)送驗(yàn)證碼Controller
package com.xmg.p2p.base.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import com.xmg.p2p.base.service.IVerifyCodeService; import com.xmg.p2p.base.service.impl.VerifyCodeServiceImpl; import com.xmg.p2p.base.util.JSONResult;/*** 驗(yàn)證碼相關(guān)Controller* @author Administrator**/ @Controller public class VerifyCodeController {@Autowiredprivate IVerifyCodeService verifyCodeService;@RequestMapping("/sendVerifyCode")@ResponseBodypublic JSONResult sendVerifyCode(String phoneNumber){JSONResult json = new JSONResult();try {verifyCodeService.sendVerifyCode(phoneNumber);} catch (RuntimeException e) {json.setMsg(e.getMessage());json.setSuccess(false);}return json;}}5.發(fā)送驗(yàn)證碼ServiceImpl
package com.xmg.p2p.base.service.impl;import java.util.Date; import java.util.UUID;import org.springframework.stereotype.Service;import com.xmg.p2p.base.service.IVerifyCodeService; import com.xmg.p2p.base.util.DateUtil; import com.xmg.p2p.base.util.UserContext; import com.xmg.p2p.base.vo.VerifyCodeVO;@Service public class VerifyCodeServiceImpl implements IVerifyCodeService { @Value("${sms.username}")private String username;@Value("${sms.password}")private String password;@Value("${sms.apikey}")private String apiKey;@Value("${sms.url}")private String url; @Overridepublic void sendVerifyCode(String phoneNumber) {//判斷當(dāng)前是否能夠發(fā)送短信//從Session中獲取最后一次發(fā)送短信的事件VerifyCodeVO vc = UserContext.getCurrentVerifyCode();if (vc==null || DateUtil.secondsBetween(new Date(), vc.getLastSendTime()) > 90) {//正常發(fā)送驗(yàn)證碼短信//生成一個(gè)驗(yàn)證碼String verifyCode = UUID.randomUUID().toString().substring(0,4);//發(fā)送短信//System.out.println("給手機(jī) "+phoneNumber+"發(fā)送驗(yàn)證碼:"+verifyCode);//通過URL 得到一個(gè)HTTPURLConnetion連接對(duì)象try {//創(chuàng)建一個(gè)URL對(duì)象URL url = new URL(this.url);HttpURLConnection conn = (HttpURLConnection) url.openConnection();//拼接POST請(qǐng)求的內(nèi)容StringBuilder content = new StringBuilder(100).append("username=").append(username).append("&password=").append(password).append("&apikey=").append(apiKey).append("&mobile=").append(phoneNumber).append("&content=").append("驗(yàn)證碼是:").append(verifyCode).append(",請(qǐng)?jiān)?分鐘內(nèi)使用");//發(fā)送post請(qǐng)求,POST或者GET一定要大寫conn.setRequestMethod("POST");//設(shè)置POST請(qǐng)求是有請(qǐng)求體的conn.setDoOutput(true);//寫入post請(qǐng)求體 conn.getOutputStream().write(content.toString().getBytes());//得到響應(yīng)流(其實(shí)就已經(jīng)發(fā)送了)String response = StreamUtils.copyToString(conn.getInputStream(), Charset.forName("UTF-8"));if (response.startsWith("success:")) {//發(fā)送成功//把手機(jī)號(hào)碼 驗(yàn)證碼 發(fā)送時(shí)間 裝配到Vo中 并保存到sessionvc = new VerifyCodeVO();vc.setLastSendTime(new Date());vc.setPhoneNumber(phoneNumber);vc.setVerifyCode(verifyCode);UserContext.putVerifyCode(vc);}else {//發(fā)送失敗throw new RuntimeException();}} catch (Exception e) {e.printStackTrace();throw new RuntimeException("短信發(fā)送失敗");} }else {throw new RuntimeException("發(fā)送過于頻繁");}} @Overridepublic boolean verify(String phoneNumber, String verifyCode) {VerifyCodeVO vc = UserContext.getCurrentVerifyCode();if (vc!=null //發(fā)送了驗(yàn)證碼&& vc.getPhoneNumber().equals(phoneNumber)//手機(jī)號(hào)&& vc.getVerifyCode().equalsIgnoreCase(verifyCode)//驗(yàn)證碼&& DateUtil.secondsBetween(new Date(), vc.getLastSendTime()) <= BidConst.VERIFYCODE_VAILDATE_SECOND //驗(yàn)證碼時(shí)間小于5分鐘 ) {return true;}return false;}
?
}(發(fā)送短信給短信網(wǎng)關(guān)需要寫配置文件指定信息)
sms.username=xmg sms.password=1111 sms.apikey=1111 #模擬短信網(wǎng)關(guān) sms.url=http://localhost:8082/send.do?
6.存放驗(yàn)證碼相關(guān)內(nèi)容的vo
package com.xmg.p2p.base.vo;import java.util.Date;import lombok.Getter; /*** 存放驗(yàn)證碼相關(guān)內(nèi)容 這個(gè)對(duì)象時(shí)放在Session中的* * @author Administrator**/public class VerifyCodeVO {private String verifyCode;//驗(yàn)證碼private String phoneNumber;//發(fā)送驗(yàn)證碼的手機(jī)號(hào)private Date lastSendTime;//最后成功發(fā)送驗(yàn)證碼的時(shí)間public String getVerifyCode() {return verifyCode;}public void setVerifyCode(String verifyCode) {this.verifyCode = verifyCode;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public Date getLastSendTime() {return lastSendTime;}public void setLastSendTime(Date lastSendTime) {this.lastSendTime = lastSendTime;}}7.提交綁定窗口Controller
package com.xmg.p2p.base.controller;import javax.jws.WebParam.Mode;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import com.xmg.p2p.base.domain.Logininfo; import com.xmg.p2p.base.service.IAccountService; import com.xmg.p2p.base.service.IUserinfoService; import com.xmg.p2p.base.util.JSONResult; import com.xmg.p2p.base.util.RequireLogin; import com.xmg.p2p.base.util.UserContext;@Controller public class PersonalController {@Autowiredprivate IUserinfoService userinfoService; @RequestMapping("bindPhone")@ResponseBodypublic JSONResult bindPhone(String phoneNumber,String verifyCode){JSONResult json = new JSONResult();try {userinfoService.bindPhone(phoneNumber,verifyCode);} catch (RuntimeException e) {json.setSuccess(false);json.setMsg(e.getMessage());}return json;} }8.提交綁定窗口serviceImpl
package com.xmg.p2p.base.service.impl;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import com.xmg.p2p.base.domain.Userinfo; import com.xmg.p2p.base.mapper.UserinfoMapper; import com.xmg.p2p.base.service.IUserinfoService; import com.xmg.p2p.base.service.IVerifyCodeService; import com.xmg.p2p.base.util.BitStatesUtils; import com.xmg.p2p.base.util.UserContext;@Service public class UserinfoServiceImpl implements IUserinfoService {@Autowiredprivate UserinfoMapper userinfoMapper;@Autowiredprivate IVerifyCodeService verifyCodeService;@Overridepublic void update(Userinfo userinfo) {int ret = userinfoMapper.updateByPrimaryKey(userinfo);if (ret == 0) {throw new RuntimeException("樂觀鎖失敗,Userinfo:"+userinfo.getId());}}@Overridepublic void bindPhone(String phoneNumber, String verifyCode) {//如果用戶沒有綁定驗(yàn)證碼Userinfo current = get(UserContext.getCurrent().getId());if (!current.getIsBindPhone()) {//驗(yàn)證驗(yàn)證碼合法boolean ret = this.verifyCodeService.verify(phoneNumber,verifyCode);//在VerifyCodeServiceImpl中新加方法if (ret) {//如果合法 給用戶綁定手機(jī)//current.setBitState(BitStatesUtils.addState(current.getBitState(), BitStatesUtils.OP_BIND_PHONE)); current.addState(BitStatesUtils.OP_BIND_PHONE);//上行過于復(fù)雜 在Userinfo中添加方法進(jìn)行此處簡(jiǎn)化this.update(current);}else {//否則拋出異常throw new RuntimeException("綁定手機(jī)失敗!");}}}}?(domain ? Userinfo類)
package com.xmg.p2p.base.domain;import com.alibaba.druid.support.logging.Log; import com.xmg.p2p.base.util.BitStatesUtils;import lombok.Getter; import lombok.Setter;/*** 用戶相關(guān)信息* @author Administrator**/ @Getter @Setter public class Userinfo extends BaseDomain {/*** UserInfo:屬性名稱 屬性類型 屬性說(shuō)明Version Int 版本號(hào),用作樂觀鎖bitState Long 用戶狀態(tài)值realName String 用戶實(shí)名值(冗余數(shù)據(jù))idNumber String 用戶身份證號(hào)(冗余數(shù)據(jù))phoneNumber String 用戶電話incomeGrade SystemDictionaryItem 收入Marriage SystemDictionaryItem 婚姻情況kidCount SystemDictionaryItem 子女情況educationBackground SystemDictionaryItem 學(xué)歷houseCondition SystemDictionaryItem 住房條件*/private int version; //版本號(hào)private long bitState;//用戶狀態(tài)嗎private String realName;private String idNumber;private String phoneNumber;private SystemDictionaryItem incomeGrade;//收入private SystemDictionaryItem marriage;// private SystemDictionaryItem kidCount;// private SystemDictionaryItem educationBackground;// private SystemDictionaryItem houseCondition;// public void addState(long state){this.setBitState(BitStatesUtils.addState(this.getBitState(),state));}// 判斷是否已經(jīng)綁定了手機(jī)public boolean getIsBindPhone() {return BitStatesUtils.hasState(this.bitState,BitStatesUtils.OP_BIND_PHONE);}// 判斷是否已經(jīng)綁定看了銀行卡public boolean getIsBindBank() {return BitStatesUtils.hasState(this.bitState,BitStatesUtils.OP_HAS_BIND_BANK);}// 判斷是否已經(jīng)綁定了郵箱public boolean getIsBindEmail() {return BitStatesUtils.hasState(this.bitState,BitStatesUtils.OP_BIND_EMAIL);}// 添加綁定的狀態(tài)碼public void addState(Long state) {bitState = BitStatesUtils.addState(this.bitState, state);}// 移除狀態(tài)碼public void removeState(Long state) {bitState = BitStatesUtils.removeState(this.bitState, state);}// 判斷用戶是否已經(jīng)填寫了基本資料public boolean getIsBasicInfo() {return BitStatesUtils.hasState(this.bitState,BitStatesUtils.OP_BASIC_INFO);}// 判斷用戶是否已經(jīng)實(shí)名認(rèn)證public boolean getIsRealAuth() {return BitStatesUtils.hasState(this.bitState,BitStatesUtils.OP_REAL_AUTH);}// 判斷用戶是否已經(jīng)視頻認(rèn)證public boolean getIsVedioAuth() {return BitStatesUtils.hasState(this.bitState,BitStatesUtils.OP_VEDIO_AUTH);}// 判斷用戶是否已經(jīng)有一個(gè)借款在審核流程中public boolean getHasBidRequestInProcess() {return BitStatesUtils.hasState(this.bitState,BitStatesUtils.OP_HAS_BIDREQUEST_PROCESS);}// 判斷用戶是否已經(jīng)有一個(gè)提現(xiàn)在審核流程中public boolean getHasWithdrawInProcess() {return BitStatesUtils.hasState(this.bitState,BitStatesUtils.OP_HAS_WITHDRAW_PROCESS);} }?
轉(zhuǎn)載于:https://www.cnblogs.com/jokerq/p/8590504.html
總結(jié)
- 上一篇: HDU3966 树链剖分
- 下一篇: 企业信息化有哪些好处?