支付宝支付 第五集:二维码生成工具



一、代码

  • 目录结构

  • BufferedImageLuminanceSource.java
    package com.dzy.alipay.qrcode;import com.google.zxing.LuminanceSource;import java.awt.*;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;public class BufferedImageLuminanceSource extends LuminanceSource {private final BufferedImage image;private final int left;private final int top;public BufferedImageLuminanceSource(BufferedImage image) {this(image, 0, 0, image.getWidth(), image.getHeight());}public BufferedImageLuminanceSource(BufferedImage image, int left, int top, int width, int height) {super(width, height);int sourceWidth = image.getWidth();int sourceHeight = image.getHeight();if (left + width > sourceWidth || top + height > sourceHeight) {throw new IllegalArgumentException("Crop rectangle does not fit within image data.");}for (int y = top; y < top + height; y++) {for (int x = left; x < left + width; x++) {if ((image.getRGB(x, y) & 0xFF000000) == 0) {image.setRGB(x, y, 0xFFFFFFFF); // = white}}}this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);this.image.getGraphics().drawImage(image, 0, 0, null);this.left = left;this.top = top;}public byte[] getRow(int y, byte[] row) {if (y < 0 || y >= getHeight()) {throw new IllegalArgumentException("Requested row is outside the image: " + y);}int width = getWidth();if (row == null || row.length < width) {row = new byte[width];}image.getRaster().getDataElements(left, top + y, width, 1, row);return row;}public byte[] getMatrix() {int width = getWidth();int height = getHeight();int area = width * height;byte[] matrix = new byte[area];image.getRaster().getDataElements(left, top, width, height, matrix);return matrix;}public boolean isCropSupported() {return true;}public LuminanceSource crop(int left, int top, int width, int height) {return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height);}public boolean isRotateSupported() {return true;}public LuminanceSource rotateCounterClockwise() {int sourceWidth = image.getWidth();int sourceHeight = image.getHeight();AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);Graphics2D g = rotatedImage.createGraphics();g.drawImage(image, transform, null);g.dispose();int width = getWidth();return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);}}
    
  • QrCodeResponse.java
    package com.dzy.alipay.qrcode;public class QrCodeResponse {/*** 返回的状态码*/private String code;/*** 返回的信息*/private String msg;/*** 交易的流水号*/private String out_trade_no;/*** 生成二维码的内容*/private String qr_code;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public String getOut_trade_no() {return out_trade_no;}public void setOut_trade_no(String out_trade_no) {this.out_trade_no = out_trade_no;}public String getQr_code() {return qr_code;}public void setQr_code(String qr_code) {this.qr_code = qr_code;}@Overridepublic String toString() {return "QrCodeResponse{" +"code='" + code + '\'' +", msg='" + msg + '\'' +", out_trade_no='" + out_trade_no + '\'' +", qr_code='" + qr_code + '\'' +'}';}
    }
  • QRCodeUtil.java
    package com.dzy.alipay.qrcode;import com.google.zxing.*;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    import org.springframework.util.ResourceUtils;import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.geom.RoundRectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.OutputStream;
    import java.util.Hashtable;public class QRCodeUtil {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";// 二维码尺寸private static final int QRCODE_SIZE = 300;// LOGO宽度private static final int WIDTH = 90;// LOGO高度private static final int HEIGHT = 90;/*** @Author xuke* @Description 二维码生成的方法* @Date 0:45 2021/4/2* @Param [content, imgPath, needCompress]* @return java.awt.image.BufferedImage**/private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}if (imgPath == null || "".equals(imgPath)) {return image;}// 插入图片QRCodeUtil.insertImage(image, imgPath, needCompress);return image;}private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println("" + imgPath + "   该文件不存在!");return;}Image src = ImageIO.read(new File(imgPath));int width = src.getWidth(null);int height = src.getHeight(null);if (needCompress) { // 压缩LOGOif (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩小后的图g.dispose();src = image;}// 插入LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);mkdirs(destPath);ImageIO.write(image, FORMAT_NAME, new File(destPath));}public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);return image;}public static void mkdirs(String destPath) {File file = new File(destPath);// 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}public static void encode(String content, String imgPath, String destPath) throws Exception {QRCodeUtil.encode(content, imgPath, destPath, false);}public static void encode(String content, String destPath) throws Exception {QRCodeUtil.encode(content, null, destPath, false);}public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);ImageIO.write(image, FORMAT_NAME, output);}public static void encode(String content, OutputStream output) throws Exception {QRCodeUtil.encode(content, null, output, false);}public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}public static String decode(String path) throws Exception {return QRCodeUtil.decode(new File(path));}}
    
  • QrResponse.java
    package com.dzy.alipay.qrcode;/*** 扫码返回的二维码参数和签名*/
    public class QrResponse {private QrCodeResponse alipay_trade_precreate_response;private String sign;public QrCodeResponse getAlipay_trade_precreate_response() {return alipay_trade_precreate_response;}public void setAlipay_trade_precreate_response(QrCodeResponse alipay_trade_precreate_response) {this.alipay_trade_precreate_response = alipay_trade_precreate_response;}public String getSign() {return sign;}public void setSign(String sign) {this.sign = sign;}
    }
    
  • AlipayService.java
    package com.dzy.alipay.service;import com.dzy.alipay.vo.PayVo;public interface AlipayService {/*** @return byte[]* @Author xuke* @Description 阿里支付接口* @Date 1:05 2020/9/9* @Param [payVo]**/byte[] alipay(PayVo payVo);
    }
    
  • PayVo.java
    package com.dzy.alipay.vo;import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.ToString;@Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class PayVo implements java.io.Serializable{// 支付用户private String userId;// 支付产品idprivate String courseid;
    }
    
  • R.java
    package com.dzy.alipay.vo;import lombok.Data;import java.util.HashMap;
    import java.util.Map;@Data
    public class R {private Boolean success;private Integer code;private String message;private Map<String, Object> data = new HashMap<String, Object>();private R(){}public static R ok(){R r = new R();r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());r.setCode(ResultCodeEnum.SUCCESS.getCode());r.setMessage(ResultCodeEnum.SUCCESS.getMessage());return r;}public static R error(){R r = new R();r.setSuccess(ResultCodeEnum.UNKNOWN_REASON.getSuccess());r.setCode(ResultCodeEnum.UNKNOWN_REASON.getCode());r.setMessage(ResultCodeEnum.UNKNOWN_REASON.getMessage());return r;}public static R setResult(ResultCodeEnum resultCodeEnum){R r = new R();r.setSuccess(resultCodeEnum.getSuccess());r.setCode(resultCodeEnum.getCode());r.setMessage(resultCodeEnum.getMessage());return r;}public R success(Boolean success){this.setSuccess(success);return this;}public R message(String message){this.setMessage(message);return this;}public R code(Integer code){this.setCode(code);return this;}public R data(String key, Object value){this.data.put(key, value);return this;}public R data(Map<String, Object> map){this.setData(map);return this;}
    }
    
  • ResultCodeEnum.java
    package com.dzy.alipay.vo;import lombok.Getter;@Getter
    public enum ResultCodeEnum {SUCCESS(true, 20000,"成功"),UNKNOWN_REASON(false, 20001, "未知错误"),LOGIN_PHONE_ERRROR(false, 20002, "手机号码不能为空"),ACCOUNT_PHONE_ERRROR(false, 20002, "账号信息不能为空"),LOGIN_PHONE_PATTARN_ERRROR(false, 20003, "手机号码格式不正确"),VALIDATION_CODE_ERROR(false, 20004, "验证码不正确"),LOGIN_CODE_ERROR(false, 20005, "短信验证码不能为空"),LOGIN_CAPATA_ERROR(false, 20006, "图形验证码不能为空"),LOGIN_CODE_FAIL_ERROR(false, 20007, "短信验证码失效,请重新发送"),LOGIN_CODE_INPUT_ERROR(false, 20008, "输入的短信码有误"),PHONE_ERROR_MSG(false, 20009, "该手机号未绑定账户"),USER_FORBIDDEN(false, 20010, "该用户已被禁用,请联系平台客服"),LOGIN_PWD_ERROR(false, 200011, "密码不允许为空"),LOGIN_PWD_INPUT_ERROR(false, 200012, "密码输入有误"),LOGIN_PWD_NO_INPUT_ERROR(false, 200013, "检测到没有完善密码信息"),BAD_SQL_GRAMMAR(false, 21001, "sql语法错误"),JSON_PARSE_ERROR(false, 21002, "json解析异常"),PARAM_ERROR(false, 21003, "参数不正确"),USER_PWD_ERROR(false, 21003, "尚未找到对应的用户信息");private Boolean success;private Integer code;private String message;private ResultCodeEnum(Boolean success, Integer code, String message) {this.success = success;this.code = code;this.message = message;}
    }
    
  • AlipayServiceImpl.java
    package com.dzy.alipay.service;
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.domain.AlipayTradePrecreateModel;
    import com.alipay.api.request.AlipayTradePrecreateRequest;
    import com.alipay.api.response.AlipayTradePrecreateResponse;
    import com.dzy.alipay.config.AlipayConfig;
    import com.dzy.alipay.qrcode.QRCodeUtil;
    import com.dzy.alipay.qrcode.QrCodeResponse;
    import com.dzy.alipay.qrcode.QrResponse;
    import com.dzy.alipay.util.GenerateNum;
    import com.dzy.alipay.vo.PayVo;
    import lombok.extern.log4j.Log4j2;
    import org.springframework.stereotype.Service;
    import org.springframework.util.FileCopyUtils;
    import org.springframework.util.ResourceUtils;
    import javax.imageio.ImageIO;
    import javax.imageio.stream.ImageOutputStream;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;@Service
    @Log4j2
    public class AlipayServiceImpl implements AlipayService {private final AlipayConfig alipayConfig;public AlipayServiceImpl(AlipayConfig alipayConfig) {this.alipayConfig = alipayConfig;}/** @Author* @Description 阿里支付 -打赏* @Date 23:59 2020/9/8* @Param [payVo]* @return byte[]**/@Overridepublic byte[] alipay(PayVo payVo) {try {// 1:支付的用户String userId = payVo.getUserId();// 2: 支付金额String money = "1";// 3: 支付的产品String title = "java面向对象";// 4: 支付的订单编号String orderNumber = GenerateNum.generateOrder();// 5:支付宝携带的参数在回调中可以通过request获取JSONObject json = new JSONObject();json.put("userId", userId);json.put("orderNumber", orderNumber);json.put("money", money);String params = json.toString();// 6:设置支付相关的信息AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();model.setOutTradeNo(orderNumber); // 自定义订单号model.setTotalAmount(money);// 支付金额model.setSubject(title);// 支付的产品名称model.setBody(params);// 支付的请求体参数model.setTimeoutExpress("30m");// 支付的超时时间model.setStoreId(userId+"");// 支付的库存idQrCodeResponse qrCodeResponse = qrcodePay(model);ByteArrayOutputStream output = new ByteArrayOutputStream();String logoPath = ResourceUtils.getFile("classpath:favicon.png").getAbsolutePath();BufferedImage buffImg = QRCodeUtil.encode(qrCodeResponse.getQr_code(), logoPath, false);//获取二维码ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);ImageIO.write(buffImg, "JPEG", imageOut);imageOut.close();ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());return FileCopyUtils.copyToByteArray(input);} catch (Exception ex) {ex.printStackTrace();return null;}}/*** 扫码运行代码* 验签通过返回QrResponse* 失败打印日志信息* 参考地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay**/public QrCodeResponse qrcodePay(AlipayTradePrecreateModel model) {// 1: 获取阿里请求客户端AlipayClient alipayClient = getAlipayClient();// 2: 获取阿里请求对象AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();// 3:设置请求参数的集合,最大长度不限request.setBizModel(model);// 设置异步回调地址request.setNotifyUrl(alipayConfig.getNotify_url());// 设置同步回调地址request.setReturnUrl(alipayConfig.getReturn_url());AlipayTradePrecreateResponse alipayTradePrecreateResponse = null;try {alipayTradePrecreateResponse = alipayClient.execute(request);} catch (AlipayApiException e) {e.printStackTrace();}assert alipayTradePrecreateResponse != null;QrResponse qrResponse = JSON.parseObject(alipayTradePrecreateResponse.getBody(), QrResponse.class);return qrResponse.getAlipay_trade_precreate_response();}/*** 获取AlipayClient对象**/private AlipayClient getAlipayClient() {return new DefaultAlipayClient(alipayConfig.getGatewayUrl(), alipayConfig.getApp_id(), alipayConfig.getMerchant_private_key(), "JSON", alipayConfig.getCharset(), alipayConfig.getAlipay_public_key(), alipayConfig.getSign_type());}
    }
    
  • AlipayCore.java
    package com.dzy.alipay.util;import org.apache.commons.codec.digest.DigestUtils;
    import org.apache.commons.httpclient.methods.multipart.FilePartSource;
    import org.apache.commons.httpclient.methods.multipart.PartSource;import java.io.File;
    import java.io.IOException;
    import java.util.*;/* **类名:AlipayFunction*功能:支付宝接口公用函数类*详细:该类是请求、通知返回两个文件所调用的公用函数核心处理文件,不需要修改*版本:3.3*日期:2012-08-14*说明:*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。*该代码仅供学习和研究支付宝接口使用,只是提供一个参考。*/public class AlipayCore {/*** 除去数组中的空值和签名参数** @param sArray 签名参数组* @return 去掉空值与签名参数后的新签名参数组*/public static Map<String, String> paraFilter(Map<String, String> sArray) {Map<String, String> result = new HashMap<String, String>();if (sArray == null || sArray.size() <= 0) {return result;}for (String key : sArray.keySet()) {String value = sArray.get(key);if (value == null || value.equals("") || key.equalsIgnoreCase("sign")|| key.equalsIgnoreCase("sign_type")) {continue;}result.put(key, value);}return result;}/*** 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串** @param params 需要排序并参与字符拼接的参数组* @return 拼接后字符串*/public static String createLinkString(Map<String, String> params) {List<String> keys = new ArrayList<String>(params.keySet());//对键排序Collections.sort(keys);String prestr = "";for (int i = 0; i < keys.size(); i++) {String key = keys.get(i);String value = params.get(key);if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符prestr = prestr + key + "=" + value;} else {prestr = prestr + key + "=" + value + "&";}}return prestr;}/*** 生成文件摘要** @param strFilePath      文件路径* @param file_digest_type 摘要算法* @return 文件摘要结果*/public static String getAbstract(String strFilePath, String file_digest_type) throws IOException {PartSource file = new FilePartSource(new File(strFilePath));if (file_digest_type.equals("MD5")) {return DigestUtils.md5Hex(file.createInputStream());} else if (file_digest_type.equals("SHA")) {return DigestUtils.sha256Hex(file.createInputStream());} else {return "";}}
    }
    
  • GenerateNum.java
    package com.dzy.alipay.util;import java.text.SimpleDateFormat;
    import java.util.Date;/*** 根据时间生成随机订单号*/
    public class GenerateNum {// 全局自增数private static int count = 0;// 每毫秒秒最多生成多少订单(最好是像9999这种准备进位的值)private static final int total = 99;// 格式化的时间字符串private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");// 获取当前时间年月日时分秒毫秒字符串private static String getNowDateStr() {return sdf.format(new Date());}// 记录上一次的时间,用来判断是否需要递增全局数private static String now = null;/*生成一个订单号*/public static String generateOrder() {String datastr = getNowDateStr();if (datastr.equals(now)) {count++;// 自增} else {count = 1;now = datastr;}int countInteger = String.valueOf(total).length() - String.valueOf(count).length();// 算补位String bu = "";// 补字符串for (int i = 0; i < countInteger; i++) {bu += "0";}bu += String.valueOf(count);if (count >= total) {count = 0;}return datastr + bu;}}
    
  • ParamsUtil.java
    package com.dzy.alipay.util;import javax.servlet.http.HttpServletRequest;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;public class ParamsUtil {/*** 将异步通知的参数转化为Map* @return*/public static Map<String, String> ParamstoMap(HttpServletRequest request) {Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}// 乱码解决,这段代码在出现乱码时使用。// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}return params;}
    }
    

支付宝支付 第五集:二维码生成工具相关推荐

  1. 二维码生成工具V1.0

    二维码生成工具V1.0 (安装 Microsoft .NET Framework 4.5) 功能一.基础配置是用来完成中间带Logo图标的配置功能,生成操作中,如果是要带图标时,必需上传: 功能二.单 ...

  2. 二维码生成工具微信小程序源码下载

    二维码生成工具 支持上传二维码logo和调整尺寸背景颜色等等 无需域名与服务器 使用教程,用HBuilder X软件打卡项目然后运行到微信小程序即可 下方是演示图: 小程序源码下载地址: (已更新)二 ...

  3. 软件推荐——二维码生成工具(绿色版)

    Simple Code Generator 二维码生成工具 软件介绍: Simple Code Generator是一款适用于Windows的简单工具,它允许您快速生成二维码,以便在智能手机上使用应用 ...

  4. QT-C++二维码生成工具(支持中文等任何字符的使用)

    QT-C++二维码生成工具 前言 1.效果预览 1.核心程序 全部程序 前言 QT/C++生成二维码程序,支持二维码图片本地保存功能. 1.效果预览 1.核心程序 如下: // 生成二维码图片QStr ...

  5. Python的妙用,PyQt5+qrcode,Python制作二维码生成工具

    前言: 今天我们就利用PyQt5+qrcode制作一个简单的二维码生成工具吧.让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: PyQt5模块: qrcode模块: 以及一些P ...

  6. 二维码 生成工具类(文件转Base64字符串,Base64字符串转文件)

    希望我的知识榨干了能帮到你解除困难,要是没有帮助你的,问度娘和知爹 一.POM.xml依赖下载 二.工具类提供 一.POM.xml依赖下载 <!-- 生成二维码依赖 --><depe ...

  7. 基于Excel的QR二维码生成工具——原理及算法详解(之一)

    老虎二维码(下载链接在这里)是一个基于Excel的二维码生成工具,完全使用Excel表单公式结合VBA实现,没有调用任何外部库,实现了支持中文英文混合字符以及常用微信二维码编码的自动生成,在工作表单元 ...

  8. Java:二维码生成工具类

    java 二维码生成工具类 需要引入的maven <!--Java 生成二维码 --> <dependency><groupId>com.google.zxing& ...

  9. 微信小程序二维码生成工具,后端二维码生成工具类。

    微信小程序开发二维码生成工具类 前言 业务背景 设计思路 具体实现 接下来我们进行工具的改造 前言 或许这是你搜寻的第n篇文章来解决你项目中的问题,虽然我不能去替你完全适配你的业务需求,但是我可以给你 ...

最新文章

  1. 成功检测远距离目标,将点云与RGB图像结合,谷歌Waymo提出新算法:4D-Net
  2. RBF网络——核心思想:把向量从低维m映射到高维P,低维线性不可分的情况到高维就线性可分了...
  3. XML文件与实体类的互相转换
  4. 恕我直言,IDEA的Debug,你可能只用了10%
  5. jQuery kxbdMarquee 无缝滚动
  6. hexo github搭建博客常用的命令
  7. linux 误删etc,centos7中误删/etc/passwd与etc/shadow文件恢复
  8. 【机器人】“市场很冷,从业者很拼” | 众多国内机器人厂商热议当前市场状态|人工智能...
  9. 《三体》动画版官宣!B站出品 刘慈欣“倒吸一口凉气”
  10. 在项目中配置PageHelper插件时遇到类型转换异常
  11. 如何在jQuery的SELECT元素中选择特定选项?
  12. 电脑小手图标怎么去除_图文教你去除桌面图标箭头_消除电脑图标小箭头的方法-系统城...
  13. 第九章 软件项目风险管理
  14. 百度云文字识别demo
  15. 《俞军产品方法论》阅读笔记2020-08-07
  16. Ubuntu16.04 解决外置USB蓝牙模块链接蓝牙耳机没有声音输出问题
  17. 网页前端 网页换肤(js)
  18. YonMaster开发者认证线上赋能培训班定档4月18日
  19. Unity烘焙时UV Overlap的解决办法
  20. 作用域/作用域链与原型/原型链

热门文章

  1. c语言求一个数组的众数,众数问题 (C语言代码)
  2. C++中sprintf()函数的使用详解
  3. 聊城中考计算机试题及答案,初中微机模拟考试试题(word版).doc
  4. 课堂上我们为什么不发言
  5. pytorch VIF(VIT 改)快了两倍
  6. 大话中文文本分类之TextRCNN
  7. python ftp文件传输服务端
  8. VSCode 小鸡汤 第00期 —— 安装和入门
  9. 对比Android和iPhone的优缺点
  10. 科技下的仓库,数据库