校验出生日期,校验身份证格式,校验会员账户:9开头数字,校验手机号码是否合法,判断字符串中的url是否都是图片格式字符串,通过图片url读取图片并将图片转换成base64编码

package com.jst.park.util;


import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import org.apache.commons.lang.StringUtils;


import sun.misc.BASE64Encoder;


public class CommonUtil {


/**
* 校验出生日期是否合法
* @param date 格式:YYYYMMDD或者YYYY-MM-DD
* @return
*/
public static boolean checkBirthDay(String birthDay){
if(birthDay.indexOf("-") > 0){
birthDay = birthDay.replaceAll("-", "");
}
Pattern birthDatePattern= Pattern.compile("(\\d{4})(\\d{2})(\\d{2}).*");
Matcher birthDateMather= birthDatePattern.matcher(birthDay); 
if(birthDateMather.find()){
String yearStr = birthDateMather.group(1); 
       int year = Integer.valueOf(yearStr);
       //闰年标识
       boolean isFlag = false;
       if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
        isFlag = true;
       }
           
       String monthStr = birthDateMather.group(2);
       int month = Integer.valueOf(monthStr);
       if(month > 12 || month <= 0){
        return false;
       }
       
       String dateStr = birthDateMather.group(3);
       int date = Integer.valueOf(dateStr);
       if(date <= 0){
    return false;
    }else{
    if(month == 2){
    if(isFlag){
    if(date > 29){
    return false;
    }else{
    return true;
    }
    }else{
    if(date > 28){
    return false;
    }else{
    return true;
    }
    }
           }else{
            if(monthStr.equals("1") || monthStr.equals("3") || monthStr.equals("5") || monthStr.equals("7") 
            || monthStr.equals("8") || monthStr.equals("10") || monthStr.equals("12")){
            if(date > 31){
            return false; 
                   }else{
                    return true; 
                   }
            }else{
            if(date > 30){
            return false; 
                   }else{
                    return true; 
                   }
            }
           }
   
        } 

return false;
}

/**
* 校验身份证格式
* @param str
* @return
*/
public static boolean checkCardNo(String cardNo){
Pattern idNumPattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");  
        //通过Pattern获得Matcher  
        Matcher idNumMatcher = idNumPattern.matcher(cardNo);  
        //判断用户输入是否为身份证号  
        if(idNumMatcher.matches()){    
            //如果是,定义正则表达式提取出身份证中的出生日期  
            Pattern birthDatePattern= Pattern.compile("\\d{6}(\\d{8}).*");  
            //通过Pattern获得Matcher  
            Matcher birthDateMather= birthDatePattern.matcher(cardNo);  
            //通过Matcher获得用户的出生年月日  
            if(birthDateMather.find()){
            return checkBirthDay(birthDateMather.group(1));          
            }     
        }
        return false; 
}


/**
* 校验银行卡号是否合法:信用卡卡16位 普通卡18位
* 设置范围16-20位数字
* @param bankNo
* @return
*/
public static boolean checkBankNo(String bankNo){
if((bankNo.length() >= 16 && bankNo.length() <= 20) && StringUtils.isNumeric(bankNo)){
return true;
}
return false;
}

/**
* 校验会员账户是否合法:9开头数字
* @param id
* @return
*/
public static boolean checkMemberId(String id){
if(id.startsWith("9") && StringUtils.isNumeric(id)){
return true;
}
return false;
}

/**
* 校验手机号码是否合法
* 规则:13 14 15 18号段,17虚拟号段不在校验范围
* @param mobile
* @return
*/
public static boolean checkMobile(String mobile) {
Pattern p = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$");
Matcher m = p.matcher(mobile);
return m.matches();
}

/**
* 校验密码是否合法:包含弱密码校验(4个连续字符、顺序字符)
* @param pwd
* @return
*/
public static String checkPassword(String pwd){
if(pwd.length() < 6 || pwd.length() > 40){
return "密码长度为6到40位";
}
if(pwd.matches("[0-9]{1,}")){
return "密码不能全是数字";
}
if(pwd.matches("[a-zA-Z]{1,}")){
return "密码不能全是字母";
}
String[] strArr = {"0123","1234","2345","3456","4567","5678","6789","9876","8765","7654","6543","5432","4321","3210","0000","1111","2222","3333","4444","5555","6666","7777","8888","9999","abcd","bcde","cdef","defg","efgh","fghi","ghij","hijk","ijkl","jklm","klmn","lmno","mnop","nopq","opqr","pqrs","qrst","rstu","stuv","tuvw","uvwx","vwxy","wxyz","zyxw","yxwv","xwvu","wvut","vuts","utsr","tsrq","srqp","rqpo","qpon","ponm","onml","nmlk","mlkj","lkji","kjih","jihg","ihgf","hgfe","gfed","fedc","edcb","dcba","ABCD","BCDE","CDEF","DEFG","EFGH","FGHI","GHIJ","HIJK","IJKL","JKLM","KLMN","LMNO","MNOP","NOPQ","OPQR","PQRS","QRST","RSTU","STUV","TUVW","UVWX","VWXY","WXYZ","ZYXW","YXWV","XWVU","WVUT","VUTS","UTSR","TSRQ","SRQP","RQPO","QPON","PONM","ONML","NMLK","MLKJ","LKJI","KJIH","JIHG","IHGF","HGFE","GFED","FEDC","EDCB","DCBA","aaaa","bbbb","cccc","dddd","eeee","ffff","gggg","hhhh","iiii","jjjj","kkkk","llll","mmmm","nnnn","oooo","pppp","qqqq","rrrr","ssss","tttt","uuuu","vvvv","wwww","xxxx","yyyy","zzzz","AAAA","BBBB","CCCC","DDDD","EEEE","FFFF","GGGG","HHHH","IIII","JJJJ","KKKK","LLLL","MMMM","NNNN","OOOO","PPPP","QQQQ","RRRR","SSSS","TTTT","UUUU","VVVV","WWWW","XXXX","YYYY","ZZZZ"};
for(String str : strArr){
if(pwd.indexOf(str) >= 0){
return "密码不合法(不能包含连续数字或字符)";
}
}
return "";
}

/**
* 校验银行卡(信用卡)有效期
* 格式:09/14
* @param date
* @return
*/
public static String checkBankExpireDate(String date){
String result = "有效期格式错误";
if(date.indexOf("/") < 0){
return result;
}
String[] arr = date.split("/");
if(arr.length != 2){
return result;
}
//去掉空格
String month = arr[0].replaceAll("\\s*", "");
String year = arr[1].replaceAll("\\s*", "");
//校验是否是数字
if(!(StringUtils.isNumeric(month) && StringUtils.isNumeric(year))){
return result;
}
//校验月份是否超期
if(!(Integer.valueOf(month) >=1 && Integer.valueOf(month) <= 12)){
return result;
}
return "";
}
/**
* 方法名: checkPictureFormat
* 描述: 判断字符串中的url是否都是图片格式字符串 (支持的图片格式后缀:jpg|jpeg|png|bmp) 
* @param imgUrl
* @return boolean
* 作者: linyuanq
* 创建时间: 2017年4月20日上午11:27:02
*/
public static boolean checkPictureFormat(String imgUrl){
if(StringUtils.isEmpty(imgUrl)){
return false;
}
String reg="(?i).+?\\.(jpg|jpeg|png|bmp)";
return imgUrl.matches(reg);
}
 
/**
* 方法名: getImageStr
* 描述: 通过图片url读取图片 并保存到其他位置
* @param _path 源图片位置
* @param _savePath 新保存到的位置
* 作者: linyuanq
* 创建时间: 2017年4月20日下午3:24:04
*/
public static void readImageByUrlAndWriteOther(String _path, String _savePath) {
String savePath = _savePath;
String path = _path;
int BYTE_SIZE = 1;
int SAVE_SIZE = 1024;
byte[] buff = new byte[BYTE_SIZE]; // 每次读的缓存
byte[] save = new byte[SAVE_SIZE]; // 保存前缓存
BufferedInputStream bf = null;
FileOutputStream file;
URL url = null;
String imgBase64 = "";
HttpURLConnection httpUrl;
try {
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();


url = new URL(path);
httpUrl = (HttpURLConnection) url.openConnection();
bf = new BufferedInputStream(httpUrl.getInputStream());
file = new FileOutputStream(savePath);

int i = 0;
while (bf.read(buff) != -1) { // 一个字节一个字节读
save[i] = buff[0];
if (i == SAVE_SIZE - 1) { // 达到保存长度时开始保存
imgBase64 += encoder.encode(save);
file.write(save, 0, SAVE_SIZE);
save = new byte[SAVE_SIZE];
i = 0;
} else {
i++;
}
}
// 最后这段如果没达到保存长度,需要把前面的保存下来
if (i > 0) {
imgBase64 += encoder.encode(save);
file.write(save, 0, i - 1);
}
httpUrl.disconnect();
file.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bf.close();


} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* 方法名: getImgToBase64
* 描述: 通过图片url读取图片并将图片转换成base64编码
* @param _path
* @return tup
* 作者: linyuanq
* 创建时间: 2017年4月20日下午3:20:57
*/
public static String getImgToBase64(String _path) {
String path = _path;
int BYTE_SIZE = 1;
int SAVE_SIZE = 1024;
byte[] buff = new byte[BYTE_SIZE]; // 每次读的缓存
byte[] save = new byte[SAVE_SIZE]; // 保存前缓存
byte[] imgByte = null;
String imgStr = null;
BufferedInputStream bf = null;
URL url = null;
HttpURLConnection httpUrl;
List<byte[]> byteList = null;
try {
byteList = new ArrayList<byte[]>();
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();


url = new URL(path);
httpUrl = (HttpURLConnection) url.openConnection();
bf = new BufferedInputStream(httpUrl.getInputStream());
int i = 0;
while (bf.read(buff) != -1) { // 一个字节一个字节读
save[i] = buff[0];
if (i == SAVE_SIZE - 1) { // 达到保存长度时开始保存
// 返回Base64编码过的字节数组字符串
byteList.add(save);
save = new byte[SAVE_SIZE];
i = 0;
} else {
i++;
}
}
// 最后这段如果没达到保存长度,需要把前面的保存下来
if (i > 0) {
// 返回Base64编码过的字节数组字符串
byteList.add(save);
}
int length = byteList.size();
imgByte = new byte[SAVE_SIZE * (length - 1) + i];
for (int j = 0; j < byteList.size() - 1; j++) {
byte[] temp = byteList.get(j);
System.arraycopy(temp, 0, imgByte, j * SAVE_SIZE, SAVE_SIZE);
}
if (i > 0) {
System.arraycopy(save, 0, imgByte, (length - 1) * SAVE_SIZE, i);
}
imgStr = encoder.encode(imgByte);


httpUrl.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
bf.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return imgStr;
}
/**
* 方法名: matchResult
* 描述: 根据正则表达式抽取相应字符串出来。比如抽取字符串的中文字符或者字母或者数字出来
* @param p
* @param str
* @return
* 作者: lin
* 创建时间: 2017年5月8日下午7:30:22
*/
public static String matchResult(Pattern p,String str)  
    {  
        StringBuilder sb = new StringBuilder();  
        Matcher m = p.matcher(str);  
        while (m.find())  
        for (int i = 0; i <= m.groupCount(); i++)   
        {  
            sb.append(m.group());     
        }  
        return sb.toString();  
    }  
}package com.jst.park.util;


import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import org.apache.commons.lang.StringUtils;


import sun.misc.BASE64Encoder;


public class CommonUtil {


/**
* 校验出生日期是否合法
* @param date 格式:YYYYMMDD或者YYYY-MM-DD
* @return
*/
public static boolean checkBirthDay(String birthDay){
if(birthDay.indexOf("-") > 0){
birthDay = birthDay.replaceAll("-", "");
}
Pattern birthDatePattern= Pattern.compile("(\\d{4})(\\d{2})(\\d{2}).*");
Matcher birthDateMather= birthDatePattern.matcher(birthDay); 
if(birthDateMather.find()){
String yearStr = birthDateMather.group(1); 
       int year = Integer.valueOf(yearStr);
       //闰年标识
       boolean isFlag = false;
       if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
        isFlag = true;
       }
           
       String monthStr = birthDateMather.group(2);
       int month = Integer.valueOf(monthStr);
       if(month > 12 || month <= 0){
        return false;
       }
       
       String dateStr = birthDateMather.group(3);
       int date = Integer.valueOf(dateStr);
       if(date <= 0){
    return false;
    }else{
    if(month == 2){
    if(isFlag){
    if(date > 29){
    return false;
    }else{
    return true;
    }
    }else{
    if(date > 28){
    return false;
    }else{
    return true;
    }
    }
           }else{
            if(monthStr.equals("1") || monthStr.equals("3") || monthStr.equals("5") || monthStr.equals("7") 
            || monthStr.equals("8") || monthStr.equals("10") || monthStr.equals("12")){
            if(date > 31){
            return false; 
                   }else{
                    return true; 
                   }
            }else{
            if(date > 30){
            return false; 
                   }else{
                    return true; 
                   }
            }
           }
   
        } 

return false;
}

/**
* 校验身份证格式
* @param str
* @return
*/
public static boolean checkCardNo(String cardNo){
Pattern idNumPattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");  
        //通过Pattern获得Matcher  
        Matcher idNumMatcher = idNumPattern.matcher(cardNo);  
        //判断用户输入是否为身份证号  
        if(idNumMatcher.matches()){    
            //如果是,定义正则表达式提取出身份证中的出生日期  
            Pattern birthDatePattern= Pattern.compile("\\d{6}(\\d{8}).*");  
            //通过Pattern获得Matcher  
            Matcher birthDateMather= birthDatePattern.matcher(cardNo);  
            //通过Matcher获得用户的出生年月日  
            if(birthDateMather.find()){
            return checkBirthDay(birthDateMather.group(1));          
            }     
        }
        return false; 
}


/**
* 校验银行卡号是否合法:信用卡卡16位 普通卡18位
* 设置范围16-20位数字
* @param bankNo
* @return
*/
public static boolean checkBankNo(String bankNo){
if((bankNo.length() >= 16 && bankNo.length() <= 20) && StringUtils.isNumeric(bankNo)){
return true;
}
return false;
}

/**
* 校验会员账户是否合法:9开头数字
* @param id
* @return
*/
public static boolean checkMemberId(String id){
if(id.startsWith("9") && StringUtils.isNumeric(id)){
return true;
}
return false;
}

/**
* 校验手机号码是否合法
* 规则:13 14 15 18号段,17虚拟号段不在校验范围
* @param mobile
* @return
*/
public static boolean checkMobile(String mobile) {
Pattern p = Pattern.compile("^[1][3,4,5,7,8][0-9]{9}$");
Matcher m = p.matcher(mobile);
return m.matches();
}

/**
* 校验密码是否合法:包含弱密码校验(4个连续字符、顺序字符)
* @param pwd
* @return
*/
public static String checkPassword(String pwd){
if(pwd.length() < 6 || pwd.length() > 40){
return "密码长度为6到40位";
}
if(pwd.matches("[0-9]{1,}")){
return "密码不能全是数字";
}
if(pwd.matches("[a-zA-Z]{1,}")){
return "密码不能全是字母";
}
String[] strArr = {"0123","1234","2345","3456","4567","5678","6789","9876","8765","7654","6543","5432","4321","3210","0000","1111","2222","3333","4444","5555","6666","7777","8888","9999","abcd","bcde","cdef","defg","efgh","fghi","ghij","hijk","ijkl","jklm","klmn","lmno","mnop","nopq","opqr","pqrs","qrst","rstu","stuv","tuvw","uvwx","vwxy","wxyz","zyxw","yxwv","xwvu","wvut","vuts","utsr","tsrq","srqp","rqpo","qpon","ponm","onml","nmlk","mlkj","lkji","kjih","jihg","ihgf","hgfe","gfed","fedc","edcb","dcba","ABCD","BCDE","CDEF","DEFG","EFGH","FGHI","GHIJ","HIJK","IJKL","JKLM","KLMN","LMNO","MNOP","NOPQ","OPQR","PQRS","QRST","RSTU","STUV","TUVW","UVWX","VWXY","WXYZ","ZYXW","YXWV","XWVU","WVUT","VUTS","UTSR","TSRQ","SRQP","RQPO","QPON","PONM","ONML","NMLK","MLKJ","LKJI","KJIH","JIHG","IHGF","HGFE","GFED","FEDC","EDCB","DCBA","aaaa","bbbb","cccc","dddd","eeee","ffff","gggg","hhhh","iiii","jjjj","kkkk","llll","mmmm","nnnn","oooo","pppp","qqqq","rrrr","ssss","tttt","uuuu","vvvv","wwww","xxxx","yyyy","zzzz","AAAA","BBBB","CCCC","DDDD","EEEE","FFFF","GGGG","HHHH","IIII","JJJJ","KKKK","LLLL","MMMM","NNNN","OOOO","PPPP","QQQQ","RRRR","SSSS","TTTT","UUUU","VVVV","WWWW","XXXX","YYYY","ZZZZ"};
for(String str : strArr){
if(pwd.indexOf(str) >= 0){
return "密码不合法(不能包含连续数字或字符)";
}
}
return "";
}

/**
* 校验银行卡(信用卡)有效期
* 格式:09/14
* @param date
* @return
*/
public static String checkBankExpireDate(String date){
String result = "有效期格式错误";
if(date.indexOf("/") < 0){
return result;
}
String[] arr = date.split("/");
if(arr.length != 2){
return result;
}
//去掉空格
String month = arr[0].replaceAll("\\s*", "");
String year = arr[1].replaceAll("\\s*", "");
//校验是否是数字
if(!(StringUtils.isNumeric(month) && StringUtils.isNumeric(year))){
return result;
}
//校验月份是否超期
if(!(Integer.valueOf(month) >=1 && Integer.valueOf(month) <= 12)){
return result;
}
return "";
}
/**
* 方法名: checkPictureFormat
* 描述: 判断字符串中的url是否都是图片格式字符串 (支持的图片格式后缀:jpg|jpeg|png|bmp) 
* @param imgUrl
* @return boolean
* 作者: linyuanq
* 创建时间: 2017年4月20日上午11:27:02
*/
public static boolean checkPictureFormat(String imgUrl){
if(StringUtils.isEmpty(imgUrl)){
return false;
}
String reg="(?i).+?\\.(jpg|jpeg|png|bmp)";
return imgUrl.matches(reg);
}
 
/**
* 方法名: getImageStr
* 描述: 通过图片url读取图片 并保存到其他位置
* @param _path 源图片位置
* @param _savePath 新保存到的位置
* 作者: linyuanq
* 创建时间: 2017年4月20日下午3:24:04
*/
public static void readImageByUrlAndWriteOther(String _path, String _savePath) {
String savePath = _savePath;
String path = _path;
int BYTE_SIZE = 1;
int SAVE_SIZE = 1024;
byte[] buff = new byte[BYTE_SIZE]; // 每次读的缓存
byte[] save = new byte[SAVE_SIZE]; // 保存前缓存
BufferedInputStream bf = null;
FileOutputStream file;
URL url = null;
String imgBase64 = "";
HttpURLConnection httpUrl;
try {
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();


url = new URL(path);
httpUrl = (HttpURLConnection) url.openConnection();
bf = new BufferedInputStream(httpUrl.getInputStream());
file = new FileOutputStream(savePath);

int i = 0;
while (bf.read(buff) != -1) { // 一个字节一个字节读
save[i] = buff[0];
if (i == SAVE_SIZE - 1) { // 达到保存长度时开始保存
imgBase64 += encoder.encode(save);
file.write(save, 0, SAVE_SIZE);
save = new byte[SAVE_SIZE];
i = 0;
} else {
i++;
}
}
// 最后这段如果没达到保存长度,需要把前面的保存下来
if (i > 0) {
imgBase64 += encoder.encode(save);
file.write(save, 0, i - 1);
}
httpUrl.disconnect();
file.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bf.close();


} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* 方法名: getImgToBase64
* 描述: 通过图片url读取图片并将图片转换成base64编码
* @param _path
* @return tup
* 作者: linyuanq
* 创建时间: 2017年4月20日下午3:20:57
*/
public static String getImgToBase64(String _path) {
String path = _path;
int BYTE_SIZE = 1;
int SAVE_SIZE = 1024;
byte[] buff = new byte[BYTE_SIZE]; // 每次读的缓存
byte[] save = new byte[SAVE_SIZE]; // 保存前缓存
byte[] imgByte = null;
String imgStr = null;

InputStream bf = null;

//BufferedInputStream bf = null;

//URL url = null;
//HttpURLConnection httpUrl;
List<byte[]> byteList = null;
try {
byteList = new ArrayList<byte[]>();
// 对字节数组Base64编码
BASE64Encoder encoder = new BASE64Encoder();


/*

url = new URL(path);

httpUrl = (HttpURLConnection) url.openConnection();

bf = new BufferedInputStream(httpUrl.getInputStream());

*/

HttpClient client = new DefaultHttpClient();
               HttpGet request = new HttpGet(path);
              HttpResponse response = client.execute(request);
              bf = response.getEntity().getContent();
int i = 0;
while (bf.read(buff) != -1) { // 一个字节一个字节读
save[i] = buff[0];
if (i == SAVE_SIZE - 1) { // 达到保存长度时开始保存
// 返回Base64编码过的字节数组字符串
byteList.add(save);
save = new byte[SAVE_SIZE];
i = 0;
} else {
i++;
}
}
// 最后这段如果没达到保存长度,需要把前面的保存下来
if (i > 0) {
// 返回Base64编码过的字节数组字符串
byteList.add(save);
}
int length = byteList.size();
imgByte = new byte[SAVE_SIZE * (length - 1) + i];
for (int j = 0; j < byteList.size() - 1; j++) {
byte[] temp = byteList.get(j);
System.arraycopy(temp, 0, imgByte, j * SAVE_SIZE, SAVE_SIZE);
}
if (i > 0) {
System.arraycopy(save, 0, imgByte, (length - 1) * SAVE_SIZE, i);
}
imgStr = encoder.encode(imgByte);
//httpUrl.disconnect();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
bf.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return imgStr;
}
/**
* 方法名: matchResult
* 描述: 根据正则表达式抽取相应字符串出来。比如抽取字符串的中文字符或者字母或者数字出来
* @param p
* @param str
* @return
* 作者: lin
* 创建时间: 2017年5月8日下午7:30:22
*/
public static String matchResult(Pattern p,String str)  
    {  
        StringBuilder sb = new StringBuilder();  
        Matcher m = p.matcher(str);  
        while (m.find())  
        for (int i = 0; i <= m.groupCount(); i++)   
        {  
            sb.append(m.group());     
        }  
        return sb.toString();  
    }  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值