passport-helper.js 5.85 KB
/**
 * Created by TaoHuang on 2016/6/20.
 */
'use strict';

const Promise = require('bluebird');
const co = Promise.coroutine;
const _ = require('lodash');

const helpers = global.yoho.helpers;
const indexService = require('./index-service');
const UserService = require('./user-service');

const DEFAULT_HEAD_IMG_ICO = 'http://img10.static.yhbimg.com/headimg/2013/11/28/09/01cae078abe5fe320c88cdf4c220212688.gif?imageView/2/w/100/h/100';

/**
 * 获得图片
 */
const getLeftBannerAsync = (resourceCode) => {
    const DEFAULT_VALUE = {
        img: 'http://img12.static.yhbimg.com/' +
        'yhb-img01/2015/12/01/07/020a0b6e7ff908d0c2bc4045b4fef42b9f.png?imageView/2/w/252/h/190',
        url: ''
    };

    return co(function* () {
        let resource = yield indexService.getResourceAsync(resourceCode);

        if (_.isEmpty(resource)) {
            return DEFAULT_VALUE;
        }

        let value = {};

        // 有点问题 // passport model 58
        value.img = helpers.image(resource[0].data[0].src, 252, 190);
        value.url = resource[0].data[0].url;

        return value;
    })();
};

/**
 * 国家数据
 */
const getCountry = () => {
    return [
        {
            areaCode: '+61',
            selected: false,
            name: '澳大利亚'
        },
        {
            areaCode: '+82',
            selected: false,
            name: '韩国'
        },
        {
            areaCode: '+1',
            selected: false,
            name: '加拿大'
        },
        {
            areaCode: '+60',
            selected: false,
            name: '马来西亚'
        },
        {
            areaCode: '+1',
            selected: false,
            name: '美国'
        },
        {
            areaCode: '+81',
            selected: false,
            name: '日本'
        },
        {
            areaCode: '+65',
            selected: false,
            name: '新加坡'
        },
        {
            areaCode: '+44',
            selected: false,
            name: '英国'
        },
        {
            areaCode: '+86',
            selected: true,
            name: '中国'
        },
        {
            areaCode: '+853',
            selected: false,
            name: '中国澳门'
        },
        {
            areaCode: '+886',
            selected: false,
            name: '中国台湾'
        },
        {
            areaCode: '+852',
            selected: false,
            name: '中国香港'
        }
    ];
};

/**
 * 各国手机号规则
 */
const _areaMobileVerify = (phone, area) => {
    area = area || '86';
    phone = phone.trim();

    let verify = {
        86: {
            name: '中国',
            match: /^1[3|4|5|8|7][0-9]{9}$/.test(phone)
        },
        852: {
            name: '中国香港',
            match: /^[9|6|5][0-9]{7}$/.test(phone)
        },
        853: {
            name: '中国澳门',
            match: /^[0-9]{8}$/.test(phone)
        },
        886: {
            name: '中国台湾',
            match: /^[0-9]{10}$/.test(phone)
        },
        65: {
            name: '新加坡',
            match: /^[9|8][0-9]{7}$/.test(phone)
        },
        60: {
            name: '马来西亚',
            match: /^1[1|2|3|4|6|7|9][0-9]{8}$/.test(phone)
        },
        1: {
            name: '加拿大&美国',
            match: /^[0-9]{10}$/.test(phone)
        },
        82: {
            name: '韩国',
            match: /^01[0-9]{9}$/.test(phone)
        },
        44: {
            name: '英国',
            match: /^7[7|8|9][0-9]{8}$/.test(phone)
        },
        81: {
            name: '日本',
            match: /^0[9|8|7][0-9]{9}$/.test(phone)
        },
        61: {
            name: '澳大利亚',
            match: /^[0-9]{11}$/.test(phone)
        }
    };

    if (verify[area]) {
        return verify[area].match;
    } else {
        return false;
    }
};

/**
 * 验证国际手机号是否合法
 */
const isAreaMobile = areaMobile => {
    if (!areaMobile) {
        return false;
    }

    let mobile = {
        area: '86',
        phone: ''
    };

    let splitMobile = areaMobile.split('-');

    if (splitMobile.length === 2) {
        mobile.area = splitMobile[0];
        mobile.phone = splitMobile[1];
    } else {
        mobile.phone = splitMobile[0];
    }

    return _areaMobileVerify(mobile.phone, mobile.area);
};

/**
 * 验证邮箱是否合法
 */
const verifyEmail = email => {
    if (!email) {
        return false;
    }

    const emailRegExp = /^[\.a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;

    return emailRegExp.test(email);
};

/**
 * 生成带区号的手机号码
 */
const makeAreaMobile = (area, mobile) => {
    if (!area || area === '86') {
        return mobile;
    }

    return `${area}-${mobile}`;
};

/**
 * 密码是否合法
 */
const isPassword = pwd => {
    if (!pwd) {
        return false;
    }

    let pwdRegexp = /^([a-zA-Z0-9\-\+_!@\#$%\^&\*\(\)\:\;\.=\[\]\\\',\?]){6,20}$/;

    return pwdRegexp.test(_.trim(pwd));
};

/**
 * 第三方登录 根据手机号获取用户相关信息
 */
const getUserInfo = (area, mobile) => {
    return UserService.findByMobileAsync(area, mobile).then(user => {
        let profile = (user.profile_name || mobile).toString();

        if ((profile.length === 11 && profile.indexOf('*') < 0) || (profile.indexOf('-') >= 0 &&
            profile.indexOf('*') < 0)) {
            profile = profile.substring(0, 3) + '****' + profile.substring(7, 11);
        }

        return {
            username: profile,
            headImg: user.head_ico ? helpers.image(user.head_ico, 100, 100, 2) : DEFAULT_HEAD_IMG_ICO,
            bindLogin: helpers.urlFormat('/signin.html', { bindMobile: mobile, bindArea: area })
        };
    });
};

module.exports = {
    validator: {
        isAreaMobile,
        verifyEmail,
        isPassword
    },
    makeAreaMobile,
    getCountry,
    getLeftBannerAsync,
    getUserInfo
};