js GMX项目函数运用

layui.define([], function (exports) {
    'use strict';
    var BASE_64 = function () {
        var hexIn = false;
        var hexOut = false;
        var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        var base64DecodeChars = new Array(
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
            52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
            -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
            15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
            -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
            41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);

        function base64encode(str) {
            var out, i, len;
            var c1, c2, c3;
            var charCode;

            len = str.length;
            i = 0;
            out = "";
            while (i < len) {
                c1 = (hexIn ? str[i++] : str.charCodeAt(i++)) & 0xff;
                if (i == len) {
                    out += base64EncodeChars.charAt(c1 >> 2);
                    out += base64EncodeChars.charAt((c1 & 0x3) << 4);
                    out += "==";
                    break;
                }
                c2 = (hexIn ? str[i++] : str.charCodeAt(i++));
                if (i == len) {
                    out += base64EncodeChars.charAt(c1 >> 2);
                    out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
                    out += base64EncodeChars.charAt((c2 & 0xF) << 2);
                    out += "=";
                    break;
                }
                c3 = (hexIn ? str[i++] : str.charCodeAt(i++));
                out += base64EncodeChars.charAt(c1 >> 2);
                out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
                out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
                out += base64EncodeChars.charAt(c3 & 0x3F);
            }
            return out;
        }

        function base64decode(str) {
            var c1, c2, c3, c4;
            var i, len, out;
            var charCode;

            len = str.length;
            i = 0;
            out = hexOut ? [] : "";
            while (i < len) {
                /* c1 */
                do {
                    c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
                } while (i < len && c1 == -1);
                if (c1 == -1)
                    break;

                /* c2 */
                do {
                    c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
                } while (i < len && c2 == -1);
                if (c2 == -1)
                    break;

                charCode = (c1 << 2) | ((c2 & 0x30) >> 4);
                hexOut ? out.push(charCode) : out += String.fromCharCode(charCode);

                /* c3 */
                do {
                    c3 = str.charCodeAt(i++) & 0xff;
                    if (c3 == 61)
                        return out;
                    c3 = base64DecodeChars[c3];
                } while (i < len && c3 == -1);
                if (c3 == -1)
                    break;
                charCode = ((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2);
                hexOut ? out.push(charCode) : out += String.fromCharCode(charCode);

                /* c4 */
                do {
                    c4 = str.charCodeAt(i++) & 0xff;
                    if (c4 == 61)
                        return out;
                    c4 = base64DecodeChars[c4];
                } while (i < len && c4 == -1);
                if (c4 == -1)
                    break;
                charCode = ((c3 & 0x03) << 6) | c4;
                hexOut ? out.push(charCode) : out += String.fromCharCode(charCode);
            }
            return out;
        }

        function utf16to8(str) {
            var out, i, len, c;
            var charCode;
            out = hexIn ? [] : "";
            len = str.length;
            for (i = 0; i < len; i++) {
                c = hexIn ? str[i] : str.charCodeAt(i);
                if ((c >= 0x0001) && (c <= 0x007F)) {
                    hexIn ? out.push(str[i]) : out += str.charAt(i);
                } else if (c > 0x07FF) {
                    charCode = (0xE0 | ((c >> 12) & 0x0F));
                    hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
                    charCode = (0x80 | ((c >> 6) & 0x3F));
                    hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
                    charCode = (0x80 | ((c >> 0) & 0x3F));
                    hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
                } else {
                    charCode = (0xC0 | ((c >> 6) & 0x1F));
                    hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
                    charCode = (0x80 | ((c >> 0) & 0x3F));
                    hexIn ? out.push(charCode) : out += String.fromCharCode(charCode);
                }
            }
            return out;
        }

        function utf8to16(str) {
            var out, i, len, c;
            var char2, char3;
            var charCode;

            out = hexOut ? [] : "";
            len = str.length;
            i = 0;
            while (i < len) {
                c = hexOut ? str[i++] : str.charCodeAt(i++);
                switch (c >> 4) {
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                        // 0xxxxxxx
                        hexOut ? out.push(str[i - 1]) : out += str.charAt(i - 1);
                        break;
                    case 12:
                    case 13:
                        // 110x xxxx   10xx xxxx
                        char2 = hexOut ? str[i++] : str.charCodeAt(i++);
                        charCode = ((c & 0x1F) << 6) | (char2 & 0x3F);
                        hexOut ? out.push(charCode) : out += String.fromCharCode(charCode);
                        break;
                    case 14:
                        // 1110 xxxx  10xx xxxx  10xx xxxx
                        char2 = hexOut ? str[i++] : str.charCodeAt(i++);
                        char3 = hexOut ? str[i++] : str.charCodeAt(i++);
                        charCode = ((c & 0x0F) << 12) |
                            ((char2 & 0x3F) << 6) |
                            ((char3 & 0x3F) << 0);
                        hexOut ? out.push(charCode) : out += String.fromCharCode(charCode);
                        break;
                }
            }

            return out;
        }

        function CharToHex(str) {
            var out, i, len, c, h;
            out = "";
            len = str.length;
            i = 0;
            while (i < len) {
                c = str.charCodeAt(i++);
                h = c.toString(16);
                if (h.length < 2)
                    h = "0" + h;

                out += "\\x" + h + " ";
                if (i > 0 && i % 8 == 0)
                    out += "\r\n";
            }

            return out;
        }

        function base64_encode(src, hI) {
            if (isEmpty(hI)) hI = false;
            hexIn = hI;
            return base64encode(hexIn ? src : utf16to8(src));
        }

        function base64_decode(src, hO, out_de) {
            if (isEmpty(hO)) hO = false;
            if (isEmpty(out_de)) out_de = 'text';
            hexOut = hO;
            var ret = base64decode(src);
            if (!hexOut || out_de == 'u' || out_de == 'd') {
                ret = utf8to16(ret);
            }
            return ret;
        }

        return {
            base64encode: base64encode,
            base64decode: base64decode,
            utf16to8: utf16to8,
            utf8to16: utf8to16,
            base64_encode: base64_encode,
            base64_decode: base64_decode,
        }
    };

    /**
     * 时间转换, 年-月-日 / 年-月-日 时:分:秒
     * @param {Number, String} utcDate 对应时间到 1970 年 1 月 1 日 的毫秒数
     * @param {String} type 返回值格式 'ymd','hms',ymdhms'
     * @returns {String} yyyy-mm-dd hh:mm:ss / yyyy-mm-dd / hh:mm:ss
     */
    var utcToDate = function (utcDate, type) {
        var date = new Date(utcDate);
        var Y = date.getFullYear();
        var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
        var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
        var h = date.getHours() < 10 ? '0' + date.getHours() : date.getHours();
        var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes();
        var s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds();

        var ymd, hms, ymdhms;
        ymd = Y + '-' + M + '-' + D;
        hms = h + ':' + m + ':' + s;
        ymdhms = ymd + ' ' + hms;
        switch (type) {
            case 'ymd':
                return ymd;
            case 'hms':
                return hms;
            case 'ymdhms':
                return ymdhms;
            default:
                return ymd;
        }
    };
    var getNowMonth = function () {
        var date = new Date();
        var Y = date.getFullYear();
        var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
        var D = getDaysInMonth(Y, M);
        return Y + '-' + M + '-01' + ' - ' + Y + '-' + M + '-' + D;
    };
    var getDaysInMonth = function (year, month) {
        month = parseInt(month, 10);  //parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制。
        var temp = new Date(year, month, 0);
        return temp.getDate();
    };
    var dateToUtc = function (date) {
        var index = date.indexOf(' ');
        if (index != -1) {
            var str1 = date.substring(0, index),
                str2 = date.substring(index + 1);
            var arr1 = str1.split('-'),
                arr2 = str2.split(':');
            return Date.UTC(+arr1[0], +arr1[1], +arr1[2], +arr2[0], +arr2[1], +arr2[2]);
        } else {
            var arr = date.split('-');
            return Date.UTC(+arr[0], +arr[1], +arr[2]);
        }
    };

    var MillisecondToDate = function (msd) {
        var time = parseFloat(msd) / 1000;
        if (null != time && "" != time) {
            if (time > 60 && time < 60 * 60) {
                time = parseInt(time / 60.0) + "分钟" + parseInt((parseFloat(time / 60.0) -
                    parseInt(time / 60.0)) * 60) + "秒";
            }
            else if (time >= 60 * 60 && time < 60 * 60 * 24) {
                time = parseInt(time / 3600.0) + "小时" + parseInt((parseFloat(time / 3600.0) -
                    parseInt(time / 3600.0)) * 60) + "分钟" +
                    parseInt((parseFloat((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60) -
                        parseInt((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60)) * 60) + "秒";
            }
            else {
                time = parseInt(time / 3600.0) + "小时" + parseInt((parseFloat(time / 3600.0) -
                    parseInt(time / 3600.0)) * 60) + "分钟" +
                    parseInt((parseFloat((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60) -
                        parseInt((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60)) * 60) + "秒";
            }
        }
        return time;
    };
    var MillisecondToTime = function (msd) {
        var time = parseFloat(msd) / 1000;
        if (null != time && "" != time) {
            if (time > 60 && time < 60 * 60) {
                var a = parseInt(time / 60.0) < 10 ? ('0' + parseInt(time / 60.0)) : parseInt(time / 60.0);
                var ms = parseInt((parseFloat(time / 60.0) - parseInt(time / 60.0)) * 60);
                var b = (ms < 10) ? ('0' + ms) : ms;
                time = '00:' + a + ':' + b;
            }
            else if (time >= 60 * 60 && time < 60 * 60 * 24) {
                var H = parseInt(time / 3600.0) < 10 ? ('0' + parseInt(time / 3600.0)) : parseInt(time / 3600.0);
                var ms = parseInt((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60);
                var M = (ms < 10) ? ('0' + ms) : ms;
                var ss = parseInt((parseFloat((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60) -
                    parseInt((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60)) * 60);
                var S = (ss < 10) ? ('0' + ss) : ss;
                time = H + ':' + M + ':' + S;
            }
            else {
                var d = parseInt(time) < 10 ? ('0' + parseInt(time)) : parseInt(time);
                time = '00:00:' + d;
            }
        }
        return time;
    };
    var toMiner = function (hour, min, seconds) {
        var miner;
        miner = hour * (60 * 60 * 1000) + min * (60 * 1000) + seconds * 1000;
        return miner;
    };
    var toHHmmss = function (data) {
        var s;
        var hours = parseInt((data % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        var minutes = parseInt((data % (1000 * 60 * 60)) / (1000 * 60));
        var seconds = (data % (1000 * 60)) / 1000;
        s = (hours < 10 ? ('0' + hours) : hours) + ':' + (minutes < 10 ? ('0' + minutes) : minutes) + ':' + (seconds < 10 ? ('0' + seconds) : seconds);
        return s;
    };

    var hourToSs = function (hour) {
        return hour * 3600000;
    };

    var ssToHms = function (ss) {
        var h = parseInt(ss / 3600000);
        var m = parseInt(ss % 3600000 / 60000);
        var s = parseInt(ss % 3600000 % 60000 / 1000);
        return h + ':' + (m < 10 ? ('0' + m) : m) + ':' + (s < 10 ? ('0' + s) : s);
    };
    /**
     * 解析地址信息
     * @param {String} url 地址字符串 exam: http://localhost:8080/page/login?name=测试&id=1
     * @returns {Object} obj 返回地址信息  exam: { name: '测试', id: 1 }
     */
    var parseUrl = function (url) {
        if (url.indexOf("?") === -1) {
            return {};
        }
        url = decodeURIComponent(url);
        var query = url.split("?")[1];
        var queryArr = query.split("&");
        var obj = {};
        queryArr.forEach(function (item) {
            var key = item.split("=")[0];
            var value = item.split("=")[1];
            obj[key] = decodeURIComponent(value);
        });
        return obj;
    };
    /**
     * 直接获取当前地址信息
     * @returns {Object} obj 返回地址信息  exam: { name: '测试', id: 1 }
     */
    var getLocaMsg = function () {
        var url = window.location.href;
        return this.parseUrl(url);
    };

    /**
     * 校验是否是日期
     * @param  {[type]}  datestr [description]
     * @return {Boolean}         [description]
     */
    var isDate = function (datestr) {
        var result = datestr.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
        if (result == null) {
            return false;
        }
        var d = new Date(result[1], result[3] - 1, result[4]);
        return (d.getFullYear() == result[1] && (d.getMonth() + 1) == result[3] && d.getDate() == result[4]);
    };

    /**
     * 是否为数字
     * @param  {[type]}  e [description]
     * @return {Boolean}   [description]
     */
    var isNumber = function (e) {
        var re = /^[0-9]+.?[0-9]*$/;
        return re.test(e);
    };

    /**
     * 校验是否为中文
     * @param {[type]} str [description]
     */
    var isChinese = function (str) {
        if (str.length != 0) {
            var reg = /^[\u0391-\uFFE5]+$/;
            return reg.test(str);
        } else {
            return false;
        }
    };

    /**
     * 判断是否为空
     * @param  {[type]}  [description]
     * @return {Boolean}     [description]
     */
    var isEmpty = function (obj) {
        if (typeof obj === "undefined" || obj === null || obj === "") {
            return true;
        }
        return false;
    };

    var isUndefined = function (obj) {
        if (typeof obj === "undefined") {
            return true;
        }
        return false;
    };

    /**
     * 判断是否为字符串
     * @param {[type]} source
     */
    var isString = function (source) {
        return Object.prototype.toString.call(source) === "[object String]";
    };

    /**
     *  判断是否为function
     * @param t
     * @returns {boolean}
     */
    var isFunction = function e(t) {
        return "function" == typeof t && "number" != typeof t.nodeType
    };

    /**
     * trim
     * @param str
     * @returns
     */
    var trim = function (str) { //删除左右两端的空格
        return str.replace(/(^\s*)|(\s*$)/g, "");
    };

    var removeStrNull = function (str) {
        return str.replace(/\s/g, "");
    };

    /**
     * 是否是固定电话
     * @param  {[type]} phone [description]
     * @return {[type]}       [description]
     */
    var isTelephone = function (phone) {
        var phone_reg = new RegExp(/^([+]{0,1}\d{3,4}|\d{3,4}-)?\d{7,8}$/);
        return phone_reg.test(phone);
    };

    /**
     * 校验手机号码
     * @param  {[type]} mobile [description]
     * @return {[type]}        [description]
     */
    var isMobilephone = function (mobile) {
        var mobile_reg = new RegExp(/^0{0,1}1[0-9]{10}$/);
        return mobile_reg.test(mobile);
    };

    /**
     * 校验折扣
     * @param  {[type]}  discount [description]
     * @return {Boolean}          [description]
     */
    var isDiscount = function (discount) {
        var reg = new RegExp(/^(0([\.]\d{1,2})|1|1.00|1.0)$/);
        return reg.test(discount);
    };

    /**
     * 校验电子邮箱
     * @param  {[type]} email [description]
     * @return {[type]}       [description]
     */
    var isEmail = function (email) {
        var email_reg = new RegExp(/^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$/);
        return email_reg.test(email);
    };

    /**
     * 校验身份证(简单校验)
     * @param  {[type]} str [description]
     * @return {[type]}     [description]
     */
    var isIDCard = function (str) {
        var IDCardReg = new RegExp(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/);
        return IDCardReg.test(str)
    };

    /**
     * 改变对象的值,如果未设置,报错
     * @param {Object} obj 操作的对象
     * @param {String} key 操作的属性
     * @param {String} val 改变的值
     */
    var xChange = function (obj, key, val) {
        if (isUndefined(obj[key])) {
            console.error(key + '不存在')
            return;
        }
        obj[key] = val;
    };

    /**
     * 空值安全返回
     * @param {any} str
     * @param {any} preText
     */
    var xrtSafe = function (str, preText) {
        if (isEmpty(str)) {
            return preText;
        }
        return str;
    };

    /**
     * 判断是否是数组
     * @param {any} arg
     */
    var isArray = function (arg) {
        return Object.prototype.toString.call(arg) === '[object Array]';
    };

    /**
     * 多次window.onload事件
     * @param {Function} func
     */
    var addLoadEvent = function (func) {
        var oldonload = window.onload;
        if (typeof window.onload != 'function') {
            window.onload = func;
        } else {
            window.onload = function () {
                oldonload();
                func();
            }
        }
    };

    /**
     * class 是否含有的判断
     * @param {HTMLBaseElement} obj
     * @param {CSS} cls
     */
    var hasClass = function (obj, cls) {
        return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
    };

    /**
     * class 添加
     * @param {*} obj
     * @param {*} cls
     */
    var addClass = function (obj, cls) {
        if (!hasClass(obj, cls)) obj.className += " " + cls;
    };

    /**
     * class 移除
     * @param {*} obj
     * @param {*} cls
     */
    var removeClass = function (obj, cls) {
        if (hasClass(obj, cls)) {
            var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
            obj.className = obj.className.replace(reg, ' ');
        }
    };

    /**
     * 目标 class 切换
     * @param {*} obj
     * @param {*} cls
     */
    var toggleClass = function (obj, cls) {
        if (hasClass(obj, cls)) {
            removeClass(obj, cls);
        } else {
            addClass(obj, cls);
        }
    };

    /**
     * 对象深拷贝,不能拷贝函数对象
     * @param {*} obj
     */
    var deepCopy = function (obj) {
        return JSON.parse(JSON.stringify(obj))
    };

    /**
     * insertBefore的补充
     * @param newElement
     * @param targetElement
     */
    var insertAfters = function (newElement, targetElement) {
        var parent = targetElement.parentNode;
        if (parent.lastChild === targetElement) {
            parent.appendChild(newElement);
        } else {
            targetElement.appendChild(newElement, targetElement.nextSibling);
        }
    };

    /**
     * 解析字符串为dom元素
     * @param nodeList
     * @returns {NodeListOf<Node & ChildNode>}
     */
    var parseDom = function (nodeList) {
        var objE = document.createElement("div");
        objE.innerHTML = nodeList;
        return objE.childNodes;
    };

    /**
     * 除对象空值
     * @param obj 初始对象
     * @returns {Object} 去空对象
     */
    var removeObjEmpty = function (obj) {
        for (var item in obj) {
            if (isEmpty(obj[item])) {
                delete obj[item];
            }
        }
        return obj;
    };

    var arrHas = function (item, arr) {
        for (var i = 0, len = arr.length; i < len; i++) {
            if (item === arr[i]) return true;
        }
        return false;
    };

    var eb64 = function (str) {
        return window.btoa(str)
    };
    var db64 = function (b64) {
        return window.atob(b64)
    };

    var MODENAME = 'utils';
    var MODECONTENT = {

        // =============  判断 ========================

        isDate: isDate, // 日期判断
        isNumber: isNumber, // 数字判断
        isChinese: isChinese, // 中文判断
        isEmpty: isEmpty, // 空值判断
        isUndefined: isUndefined, // 空值判断
        isString: isString, // 字符串判断
        isArray: isArray, // 数组判断
        isFunction: isFunction, // 数组判断
        isTelephone: isTelephone, // 固话判断
        isMobilephone: isMobilephone, // 手机号码判断
        isDiscount: isDiscount, // 折扣判断
        isEmail: isEmail, // 电子邮箱校验
        isIDCard: isIDCard, // 身份证简单校验

        // ==============================================

        // ============== 数据类型转换 ===================

        utcToDate: utcToDate, // 时间转化
        dateToUtc: dateToUtc, // 时间转化
        hourToSs: hourToSs, // 时间转化
        getNowMonth: getNowMonth,//获取当前月份日期范围
        MillisecondToDate: MillisecondToDate,//时间戳转化为时分秒(例如:1小时30分钟0秒)
        toMiner: toMiner,//时分秒转化为毫秒整数(例如:00:30:00)
        toHHmmss: toHHmmss,//时间戳转化为时分秒(例如:00:30:00)
        ssToHms: ssToHms,//时间戳转化为时分秒(例如:00:30:00)无上限
        MillisecondToTime: MillisecondToTime,//毫秒整数转化为时分秒(例如:毫秒数转换为00:30:00)
        parseUrl: parseUrl, // 解析url
        getLocaMsg: getLocaMsg, // 获取当前地址信息
        removeObjEmpty: removeObjEmpty, // 去除对象空值
        eb64: BASE_64().base64_encode,
        db64: BASE_64().base64_decode,
        // db64_utf8: Base64._utf8_decode,

        // ==============================================

        // ============== 数据信息改变 ===================

        trim: trim, // 去空格
        removeStrNull: removeStrNull, // 去空格
        xChange: xChange, // 对象已有值安全改变
        xrtSafe: xrtSafe, // 空值安全返回
        deepCopy: deepCopy, // 对象深拷贝,不能拷贝函数对象
        arrHas: arrHas,

        // ==============================================

        // ============= 非数据类型工具封装  ==============

        addLoadEvent: addLoadEvent, // window.onload多次

        hasClass: hasClass, // 判断是否有class
        addClass: addClass, // 添加class
        removeClass: removeClass, // 移除class
        toggleClass: toggleClass, // 增加或移除class(切换状态)
        insertAfters: insertAfters, // 在元素后面插入元素
        parseDom: parseDom, // 字符串转dom

        // ==============================================

    };
    exports(MODENAME, MODECONTENT);
});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值