(三)用戶模型開發(fā)

1.otp驗(yàn)證碼獲取

   //用戶獲取otp短信接口
    @RequestMapping(value = "/getotp",method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommenReturnType getOtp(@RequestParam(name="telphone") String telphone){
        //1. 按照一定的規(guī)則生成OPT驗(yàn)證碼
        Random random = new Random();
        int randomInt = random.nextInt(99999);// [0,99999)
        randomInt += 10000;   //  [10000,109999]
        String otpCode = String.valueOf(randomInt);

        //2. 將OPT驗(yàn)證碼與用戶手機(jī)號相關(guān)聯(lián),使用HttpSession的方式(企業(yè)里使用分布式的Redis)
        httpServletRequest.getSession().setAttribute(telphone,otpCode);


        //3. 將OPT驗(yàn)證碼通過短信通道發(fā)送給用戶,省略(可夠買第三方短信通道,以HTTP Post 方式發(fā)送)
        //企業(yè)里控制臺輸出是用log4j阵面,這里方便調(diào)試轻局,簡單的把驗(yàn)證碼輸入控制臺
        System.out.println("telphone = "+telphone+" & otpCode = "+otpCode);

        return CommenReturnType.create(null);

    }

2.用戶注冊

//用戶注冊接口
    @RequestMapping(value = "/register",method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommenReturnType register(@RequestParam(name="telphone") String telphone,
                                     @RequestParam(name="otpCode") String otpCode,
                                     @RequestParam(name="password") String password,
                                     @RequestParam(name="name") String name,
                                     @RequestParam(name="gender") Integer gender,
                                     @RequestParam(name="age") Integer age) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
        //驗(yàn)證手機(jī)號和otpcode相符合
        String inSessionOtpCode = (String)this.httpServletRequest.getSession().getAttribute(telphone);
        if(!StringUtils.equals(otpCode,inSessionOtpCode)){
            throw new BusinessException(EmBussinessError.PARMETER_VALIDATION_ERROR,"短信驗(yàn)證碼不符合");
        }
        //用戶注冊流程
        UserModel userModel = new UserModel();
        userModel.setName(name);
        //userModel.setGender(gender);
        userModel.setGender(new Byte(String.valueOf(gender.intValue())));

        userModel.setTelphone(telphone);
        userModel.setAge(age);
        userModel.setEncrptPassWord(this.EncodeByMd5(password));

        userService.register(userModel);

        return CommenReturnType.create(null);

    }

3.用戶登錄


    //用戶登錄接口
    @RequestMapping(value = "/login",method = {RequestMethod.POST}, consumes = {CONTENT_TYPE_FORMED})
    @ResponseBody
    public CommenReturnType login(@RequestParam(name="telphone") String telphone,
                                     @RequestParam(name="password") String password) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
        //入?yún)⑿r?yàn)
        if(StringUtils.isEmpty(telphone)||
                StringUtils.isEmpty(password)){
            throw new BusinessException(EmBussinessError.PARMETER_VALIDATION_ERROR);
        }

        //用戶登錄服務(wù),用來校驗(yàn)用戶登錄是否合法
        UserModel userModel = userService.validateLogin(telphone,this.EncodeByMd5(password));

        //將登錄憑證加入到用戶登錄成功的session內(nèi)
        this.httpServletRequest.getSession().setAttribute("IS_LOGIN",true);
        this.httpServletRequest.getSession().setAttribute("LOGIN_USER",userModel);

        return CommenReturnType.create(null);

    }

4.優(yōu)化校驗(yàn)

(1) 檢驗(yàn)結(jié)果

import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

public class ValidationResult {
    //校驗(yàn)結(jié)果是否有錯(cuò)
    private boolean hasErrors = false;
    private Map<String,String> errMsgMap = new HashMap<>();

    public boolean isHasErrors() {
        return hasErrors;
    }

    public void setHasErrors(boolean hasErrors) {
        this.hasErrors = hasErrors;
    }

    public Map<String, String> getErrMsgMap() {
        return errMsgMap;
    }

    public void setErrMsgMap(Map<String, String> errMsgMap) {
        this.errMsgMap = errMsgMap;
    }
    //實(shí)現(xiàn)通用的通過格式化字符串信息獲取錯(cuò)誤結(jié)果的msg的方法

    public  String getErrMsg(){
        return StringUtils.join(errMsgMap.values().toArray(),",");

    }
}

(2)校驗(yàn)器


import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;

@Component
public class ValidatorImpl implements InitializingBean {

    private Validator validator;

    //實(shí)現(xiàn)校驗(yàn)方法并返回結(jié)果
    public ValidationResult validate(Object bean){
        final ValidationResult result = new ValidationResult();
        Set<ConstraintViolation<Object>> constraintViolationSet = validator.validate(bean);
        if(constraintViolationSet.size()>0){
            //有錯(cuò)誤
            result.setHasErrors(true);
            constraintViolationSet.forEach(constraintViolation->{
                String errMsg = constraintViolation.getMessage();
                String propertyName = constraintViolation.getPropertyPath().toString();
                result.getErrMsgMap().put(propertyName,errMsg);
            });
        }
        return result;


    }

    @Override
    public void afterPropertiesSet() throws Exception {
        //將hibernate validator 通過工廠的初始化方式使其實(shí)例化
        this.validator = (Validator) Validation.buildDefaultValidatorFactory().getValidator();
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末样刷,一起剝皮案震驚了整個(gè)濱河市仑扑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌置鼻,老刑警劉巖镇饮,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箕母,居然都是意外死亡储藐,警方通過查閱死者的電腦和手機(jī)俱济,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钙勃,“玉大人蛛碌,你說我怎么就攤上這事∠皆矗” “怎么了蔚携?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長克饶。 經(jīng)常有香客問我酝蜒,道長,這世上最難降的妖魔是什么矾湃? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任亡脑,我火速辦了婚禮,結(jié)果婚禮上洲尊,老公的妹妹穿的比我還像新娘远豺。我一直安慰自己,他們只是感情好坞嘀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布躯护。 她就那樣靜靜地躺著,像睡著了一般丽涩。 火紅的嫁衣襯著肌膚如雪棺滞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天矢渊,我揣著相機(jī)與錄音继准,去河邊找鬼。 笑死矮男,一個(gè)胖子當(dāng)著我的面吹牛移必,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毡鉴,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼崔泵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了猪瞬?” 一聲冷哼從身側(cè)響起憎瘸,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陈瘦,沒想到半個(gè)月后幌甘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年锅风,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酥诽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡皱埠,死狀恐怖盆均,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漱逸,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布芒珠,位于F島的核電站悍缠,受9級特大地震影響奢啥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜袋坑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望眯勾。 院中可真熱鬧枣宫,春花似錦、人聲如沸吃环。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽郁轻。三九已至翅娶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間好唯,已是汗流浹背竭沫。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骑篙,地道東北人蜕提。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像靶端,于是被迫代替她去往敵國和親谎势。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容