B078-项目实战--支付模块 领养订单支付流程
目录
- 支付模块
- 需求分析
- 表设计
- 支付单表
- 支付宝账号信息表-商家账号
- 微信支付账号信息表-商家账号
- 银行账号表-商家
- 资金账号表
- 支付流水表
- 流程分析
- 支付基础模块继承
- 加密算法
- 沙箱环境准备
- 支付宝支付-流程分析
- 根据demo封装工具类
- 导入依赖
- AlipayConfig
- AlipayInfo
- AlipayUtil
- 内网穿透
- 领养订单-支付流程
- 后端生成支付单和进行支付
- AdoptOrderServiceImpl
- PayConstants
- PayBill
- PayBillServiceImpl
- 测试
- 前台显示支付form表单
- 前台完成支付
- 异步回调通知后完成后续逻辑
- 订单与支付汇总流程图
每种订单都有对应类型的支付
支付模块
需求分析

资金账号(支付账号)
支付方式
支付单
支付流水
表设计

三种类型:支付单表,支付流水表,支付方式表
支付单表
CREATE TABLE `t_pay_bill` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`digest` varchar(100) DEFAULT NULL COMMENT '交易摘要',`money` decimal(11,2) NOT NULL COMMENT '金额',`state` tinyint(4) NOT NULL DEFAULT '0' COMMENT '支付状态 0待支付1 已支付-1 取消',`lastPayTime` datetime DEFAULT NULL,`payChannel` tinyint(4) NOT NULL COMMENT '支付方式 余额 三方支付(支付宝,微信,银联)',`createTime` datetime DEFAULT NULL,`updateTime` datetime DEFAULT NULL,`unionPaySn` char(15) DEFAULT NULL COMMENT '统一支付单号',`businessType` varchar(255) NOT NULL COMMENT '业务类型',`businessKey` bigint(20) NOT NULL COMMENT '关联业务键',`user_id` bigint(20) DEFAULT NULL,`nickName` varchar(255) DEFAULT '',`shopName` varchar(255) DEFAULT NULL,`shop_id` bigint(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COMMENT='支付单';

1.订单模块生成订单
2.支付模块生成支付单
3.支付模块生成统一支付单号,调三方接口进行支付
4.支付成功返回统一支付单号给支付模块,支付模块根据统一支付单号找到订单修改状态
5.订单模块根据支付模块的订单类型和订单号找到订单,修改订单状态
支付宝账号信息表-商家账号
CREATE TABLE `t_pay_alipay_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`shop_id` bigint(20) DEFAULT NULL,`shopName` varchar(255) DEFAULT NULL,`appid` varchar(255) DEFAULT NULL COMMENT '应用id',`merchant_private_key` varchar(2500) DEFAULT NULL COMMENT '商家私钥',`alipay_public_key` varchar(2500) DEFAULT NULL COMMENT '支付宝公钥',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
微信支付账号信息表-商家账号
CREATE TABLE `t_pay_wechat_info` (`merchant_private_key` varchar(2500) DEFAULT NULL,`appid` varchar(255) DEFAULT NULL,`id` bigint(20) NOT NULL AUTO_INCREMENT,`alipay_public_key` varchar(2500) DEFAULT NULL,`shop_id` bigint(20) DEFAULT NULL,`shopName` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
银行账号表-商家
CREATE TABLE `t_pay_bank_info` (`merchant_private_key` varchar(2500) DEFAULT NULL,`appid` varchar(255) DEFAULT NULL,`id` bigint(20) NOT NULL AUTO_INCREMENT,`alipay_public_key` varchar(2500) DEFAULT NULL,`shop_id` bigint(20) DEFAULT NULL,`shopName` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
资金账号表
CREATE TABLE `t_pay_account` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`createTime` datetime DEFAULT NULL,`updateTime` datetime DEFAULT NULL,`user_id` bigint(20) NOT NULL COMMENT '用户ID',`useableBalance` int(11) NOT NULL DEFAULT '0' COMMENT '可用金额',`frozenBalance` int(11) NOT NULL DEFAULT '0' COMMENT '冻结金额',`creditBanance` int(11) NOT NULL DEFAULT '0' COMMENT '积分',`salt` varchar(255) DEFAULT NULL,`payPassword` varchar(32) NOT NULL COMMENT '支付密码 md5加密+加盐',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户账户';
支付流水表
CREATE TABLE `t_pay_account_flow` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`createTime` bigint(20) DEFAULT NULL,`user_id` bigint(20) NOT NULL COMMENT '用户ID',`nickName` varchar(20) DEFAULT NULL COMMENT '用户姓名',`money` decimal(11,2) NOT NULL COMMENT '金额',`type` tinyint(4) NOT NULL COMMENT '支付方式',`businessType` varchar(4) NOT NULL COMMENT '业务类型',`businessName` varchar(20) NOT NULL COMMENT '业务名',`businessKey` bigint(20) NOT NULL COMMENT '关联业务键',`payChannel` tinyint(4) NOT NULL,`payChannelName` varchar(20) NOT NULL,`note` varchar(50) DEFAULT NULL COMMENT '备注',`digest` varchar(100) DEFAULT NULL,`unionPaySeq` char(15) DEFAULT NULL COMMENT '统一支付单号',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户支付流水';
流程分析
结合上面内容

https://opendocs.alipay.com/open/00a0ut
电脑网站支付 - 产品介绍 -> 流程介绍
支付基础模块继承
拷贝java和xml代码,配置yml扫描别名
加密算法

沙箱环境准备
在线加密生成自己的公钥和私钥
把自己的公钥告诉支付宝并得到支付宝的公钥
保存自己的 appid 私钥 和支付宝的公钥到数据库表里
支付宝支付-流程分析
https://opendocs.alipay.com/open/00a0ut
电脑网站支付 - 接入指南 - 电脑网站支付快速接入 -> 流程介绍


根据订单生成支付单后调支付接口要传同步通知地址和异步通知地址
支付平台返回string(内容是一个支付表单)给后端,后端将这个String交给前端到浏览器显示,
中间的步骤由用户与支付宝他们自己完成
支付完成后三重返回保证
1.同步通知,只做重定向页面通知
2.异步通知,以此为准,收到后分别去更改支付单和订单的状态
3.主动用统一支付单号去支付宝查询状态
根据demo封装工具类
导入依赖
<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>3.7.4.ALL</version>
</dependency>
AlipayConfig
public class AlipayConfig {// 服务器异步通知路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String notify_url = "http://c84pns.natappfree.cc/notify";// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问public static String return_url = "http://localhost/success.html";// 签名方式public static String sign_type = "RSA2";// 字符编码格式public static String charset = "utf-8";// 测试环境支付宝网关public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
}
AlipayInfo
@Data
public class AlipayInfo extends BaseDomain {private String merchant_private_key;//我的私钥private String appid;//我的AppIDprivate String alipay_public_key;//支付宝公钥private Long shop_id;private String shopName;}
AlipayUtil
public class AlipayUtil {public static String pay(AlipayInfo info, PayBill payBill){try {//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(cn.ming.pay.utils.AlipayConfig.gatewayUrl,info.getAppid(),info.getMerchant_private_key(),"json",cn.ming.pay.utils.AlipayConfig.charset,info.getAlipay_public_key(),cn.ming.pay.utils.AlipayConfig.sign_type);//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(cn.ming.pay.utils.AlipayConfig.return_url);alipayRequest.setNotifyUrl(cn.ming.pay.utils.AlipayConfig.notify_url);//商户订单号,商户网站订单系统中唯一订单号,必填String out_trade_no = payBill.getUnionPaySn();//付款金额,必填String total_amount = payBill.getMoney().toString();//订单名称,必填String subject = payBill.getDigest();//商品描述,可空String body = payBill.getDigest();alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","+ "\"total_amount\":\""+ total_amount +"\","+ "\"subject\":\""+ subject +"\","+ "\"body\":\""+ body +"\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求String result = alipayClient.pageExecute(alipayRequest).getBody();return result;} catch (AlipayApiException e) {e.printStackTrace();}return null;}}
内网穿透
使用内网穿透将本地的异步通知地址暴露到公网上供外网访问
官网首页:https://natapp.cn/
NATAPP1分钟快速新手图文教程:https://natapp.cn/article/natapp_newbie
购买隧道 - 免费
名称:pethome,隧道协议:web,本地端口:8080, - 免费购买
查看我的隧道,得到authtoken
下载客户端,解压至任意目录,得到natapp.exe
同文件夹下新建config.ini文件,输入authtoken=xxx保存
双击natapp.exe得到公网可用域名
配置以下两个回调地址
// 服务器异步通知路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://254fde.natappfree.cc/notify";
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://localhost/success.html";
ph-web拷贝success.html到根目录,编码异步回调notify接口,
AlipayController
@PostMapping("/notify")public void notify(HttpServletRequest request){System.out.println("支付宝异步回调!");}
领养订单-支付流程
后端生成支付单和进行支付
AdoptOrderServiceImpl
/*** 领养订单结算*/@Override@Transactionalpublic String submit(Map<String, Object> params, Logininfo loginIn) {Long petId = Long.valueOf(params.get("pet_id").toString());Long addressId = Long.valueOf(params.get("address_id").toString());//收货地址:t_user_address的idInteger payMethod = Integer.valueOf(params.get("pay_method").toString());//1 支付宝 2 微信 3 银联 0 余额Integer serviceMethod = Integer.valueOf(params.get("service_method").toString());//送货方式//1.修改状态 准备下架Pet pet = petMapper.loadById(petId);pet.setState(0);pet.setOffsaletime(new Date());//2.绑定用户User user = userMapper.loadByloginInfoId(loginIn.getId());pet.setUser(user);pet.setUser_id(user.getId());pet.setShop_id(pet.getShop().getId());petMapper.update(pet);//3.生成订单 一次性AdoptOrder order = initAdoptOrder(pet, user);//骚操作:为了后边操作支付单,不用再来修改订单,先生成统一的支付单号String unionPaySn = CodeGenerateUtils.generateUnionPaySn();order.setPaySn(unionPaySn);adoptOrderMapper.save(order);// 3.1 生成订单地址UserAddress userAddress = userAddressMapper.loadById(addressId);OrderAddress orderAddress = userAddress2OrderAddress(order, userAddress);orderAddressMapper.save(orderAddress);// 4.支付单PayBill payBill = initPayBill(payMethod, pet, user, order);payBillMapper.save(payBill);//调用统一支付接口(老杨定义的)return payBillService.pay(payBill);// 5.订单定时取消任务 @TODO}private AdoptOrder initAdoptOrder(Pet pet, User user) {AdoptOrder order = new AdoptOrder();order.setDigest("【摘要】" + pet.getName());order.setPrice(pet.getSaleprice());order.setOrderSn(CodeGenerateUtils.generateOrderSn(user.getId()));order.setLastConfirmTime(new Date(System.currentTimeMillis() + 15*60*1000));//最后确认时间order.setPet_id(pet.getId());order.setUser_id(user.getId());order.setShop_id(pet.getShop().getId());return order;}private OrderAddress userAddress2OrderAddress(AdoptOrder order, UserAddress userAddress) {OrderAddress orderAddress = new OrderAddress();BeanUtils.copyProperties(userAddress, orderAddress);orderAddress.setId(null);orderAddress.setOrder_id(order.getId());orderAddress.setOrderSn(order.getOrderSn());return orderAddress;}@Overridepublic PageList<AdoptOrder> queryAdmin(AdoptOrderQuery query, Long loginInfoId) {//1.通过loginInfoID查询出EmployeeEmployee employee = employeeMapper.loadByLoginInfoId(loginInfoId);//2.如果employee中的shopID不为null,就是店铺。否则就是平台员工if (employee.getShop_id() != null) {query.setShopId(employee.getShop_id());}return super.queryPage(query);}@Overridepublic PageList<AdoptOrder> queryUser(AdoptOrderQuery query, Long loginInfoId) {User user = userMapper.loadByloginInfoId(loginInfoId);query.setUserId(user.getId());return super.queryPage(query);}private PayBill initPayBill(Integer payMethod, Pet pet, User user, AdoptOrder order) {PayBill payBill = new PayBill();payBill.setDigest(order.getDigest()+"支付单");payBill.setMoney(order.getPrice());//重点:支付唯一表示payBill.setUnionPaySn(order.getPaySn());payBill.setLastPayTime(new Date(System.currentTimeMillis() + PayConstants.LAST_TIME));payBill.setPayChannel(Long.valueOf(payMethod));//0 余额 1 支付宝 2 微信 3 银联payBill.setBusinessType(PayConstants.BUSINESS_TYPE_ADOPT);payBill.setBusinessKey(order.getId());payBill.setUser_id(user.getId());payBill.setShop_id(pet.getShop().getId());payBill.setNickName(user.getUsername());return payBill;}
PayConstants
public class PayConstants {public static final Integer LAST_TIME = 15*60*1000;//领养订单public static final String BUSINESS_TYPE_ADOPT = "business_type_adopt";//服务订单public static final String BUSINESS_TYPE_PRODUCT = "business_type_product";//收购订单public static final String BUSINESS_TYPE_ACQUISITION = "business_type_acquisition";//商品订单public static final String BUSINESS_TYPE_GOODS = "business_type_goods";//充值订单public static final String BUSINESS_TYPE_RECHARGE = "business_type_recharge";}
PayBill
@Data
public class PayBill extends BaseDomain {private String digest;private BigDecimal money;private String unionPaySn;private Integer state = 0;//0待支付1 已支付-1 取消private Date lastPayTime;private Long payChannel; //0 余额 1 支付宝 2 微信 3 银联private String businessType;private Long businessKey;private Date updateTime;private Date createTime = new Date();private Long user_id;private Long shop_id;private String nickName;
}
PayBillServiceImpl
@Overridepublic String pay(PayBill payBill) {if(payBill == null){throw new BusinessException("请生成支付单后,在进行支付!!!");}PayBill payBill1 = payBillMapper.loadByUnionPaySn(payBill.getUnionPaySn());if(payBill1 == null){throw new BusinessException("请生成支付单后,在进行支付!!!");}Long payChannel = payBill1.getPayChannel();String resultData = "";switch(payChannel.intValue()){case 1 ://支付宝AlipayInfo info = alipayInfoMapper.loadByShopId(payBill1.getShop_id());resultData = AlipayUtil.pay(info, payBill1);break;case 2 ://微信//TODObreak;case 3 ://银联//TODObreak;default : //0 余额//TODO}return resultData;}
测试
adoptOrder.html
methods: {orderSubmit() {this.$http.post("/adopt/submit", this.order).then(result => {console.log(result.data);// $("#alipayForm").html(result.data.resultObj);// location.href = "personCenter.html";}).catch(result => {alert("系统错误!!");})}},

前台显示支付form表单
<div id="alipayForm"></div>
methods: {orderSubmit() {this.$http.post("/adopt/submit", this.order).then(result => {console.log(result.data);$("#alipayForm").html(result.data.resultObj);// location.href = "personCenter.html";}).catch(result => {alert("系统错误!!");})}},
前台完成支付
form表单显示后会展示支付宝扫码或登录页面,完成支付后跳转到success回调页面,可从url取到unionPaySn查询数据显示到success页面。



异步回调通知后完成后续逻辑
AlipayController
@PostMapping("/notify")public void notify(HttpServletRequest request){System.out.println("支付宝异步回调!");//获取支付宝POST过来反馈信息try {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);params.put(name, valueStr);}String unionPaySn = params.get("out_trade_no");PayBill payBill = payBillService.loadByUnionPaySn(unionPaySn);if(payBill != null){AlipayInfo info = alipayInfoService.getByShopId(payBill.getShop_id());boolean signVerified = AlipaySignature.rsaCheckV1(params,info.getAlipay_public_key(),AlipayConfig.charset,AlipayConfig.sign_type); //调用SDK验证签名if(signVerified) {//验证成功//商户订单号String out_trade_no = unionPaySn;//支付宝交易号String trade_no = request.getParameter("trade_no");//交易状态String trade_status = request.getParameter("trade_status");if(trade_status.equals("TRADE_FINISHED")){//用户确认}else if (trade_status.equals("TRADE_SUCCESS")){//1. 改支付单状态payBill.setState(1);payBill.setUpdateTime(new Date());payBillService.update(payBill);String businessType = payBill.getBusinessType();//2.再修改对应(领养)的订单状态 businessType businessKey 订单if(PayConstants.BUSINESS_TYPE_ADOPT.equals(businessType)){//领养订单Long orderId = payBill.getBusinessKey();AdoptOrder order = adoptOrderService.getById(orderId);order.setState(1);adoptOrderService.update(order);}}}else {//验证失败System.out.println("老宋,不要搞事");//调试用,写文本函数记录程序运行情况是否正常//String sWord = AlipaySignature.getSignCheckContentV1(params);//AlipayConfig.logResult(sWord);}}} catch (AlipayApiException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
订单与支付汇总流程图

相关文章:
B078-项目实战--支付模块 领养订单支付流程
目录 支付模块需求分析表设计支付单表支付宝账号信息表-商家账号微信支付账号信息表-商家账号银行账号表-商家资金账号表支付流水表 流程分析支付基础模块继承加密算法沙箱环境准备支付宝支付-流程分析根据demo封装工具类导入依赖AlipayConfigAlipayInfoAlipayUtil 内网穿透 领…...
[css]margin-top不起作用问题(外边距合并)
在初学css时,会遇到突然间margin-top不起作用的情况。如下面: 情况一: 代码: <html> <head><style type"text/css"> * {margin:0;padding:0;border:0; }#outer {width:300px;height:300px;backgroun…...
Vue2基础八、插槽
零、文章目录 Vue2基础八、插槽 1、插槽 (1)默认插槽 作用:让组件内部的一些 结构 支持 自定义需求: 将需要多次显示的对话框, 封装成一个组件问题:组件的内容部分,不希望写死,希望能使用的时候自定义。…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:连接到特征存储]
分类目录:《自然语言处理从入门到应用》总目录 特征存储是传统机器学习中的一个概念,它确保输入模型的数据是最新和相关的。在考虑将LLM应用程序投入生产时,这个概念非常重要。为了个性化LLM应用程序,我们可能希望将LLM与特定用户…...
jenkins自定义邮件发送人姓名
jenkins发送邮件的时候发送人姓名默认的,如果要自定义发件人姓名,只需要修改如下信息即可: 系统管理-system-Jenkins Location下的系统管理员邮件地址 格式为:自定义姓名<邮件地址>...
SolidWorks二次开发---简单的连接solidworks
创建一个.net Framework的应用,正常4.0以上就可以了。 打开nuget包管理 在里面搜索paine 在版中选择对应的solidworks年份开头的,进行安装。 安装完之后 : 同时选中下面两个dll,把嵌入操作类型改为false 然后在按钮的单击事件中输入: Connect.Crea…...
docker 安装 active Mq
在安装完Docker的机器上,安装activeMQ。 拉取镜像: docker pull webcenter/activemq 查看镜像: docker images Docker运行ActiveMQ镜像 docker run --name activemq -d -p 8161:8161 -p 61616:61616 --privilegedtrue --restartalways …...
【Linux】TCP协议
🌠 作者:阿亮joy. 🎆专栏:《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录 👉TCP协议&…...
DevOps系列文章之 自动化测试大全(单测和集成测试)
自动化测试业界主流工具 核心目标: 主要是功能测试和覆盖率测试 业界常用主流工具 GoogleTest GoogleTest是一个跨平台的(Liunx、Mac OS X、Windows 、Cygwin 、Windows CE and Symbian ) C单元测试框架,由google公司发布,为在不同平台上为编…...
Android启动速度优化
本节主要内容:了解APP启动流程、启动状态、查看启动时间、CPU Profile定位启动耗时代码、StrictMode严苛模式检测不合理写法、解决启动黑白屏问题。 一、APP启动流程 ①用户点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startAc…...
linux 日志 系统安全日志 web日志
web日志 LINUX日志系统之WEB日志(一)_dracut.log_麻子来了的博客-CSDN博客 系统安全日志 Linux系统安全日志详解_sinolover的博客-CSDN博客 wtmp和utmp文件都是二进制文件,需使用who、w、users、last和ac来操作这两个文件。 who /var/lo…...
SpringBoot 整合 MongoDB 连接 阿里云MongoDB
注:spring-boot-starter-data-mongodb 2.7.5;jdk 1.8 阿里云MongoDB是副本集实例的 在网上查找了一番,大多数都是教连接本地mongodb或者linux上的mongodb 阿里云上有java版连接教程,但它不是SpringBoot方法配置的,是手…...
Debeizum 增量快照
在Debeizum1.6版本发布之后,成功推出了Incremental Snapshot(增量快照)的功能,同时取代了原有的实验性的Parallel Snapshot(并行快照)。在本篇博客中,我将介绍全新快照方式的原理,以…...
windows下安装composer
安装Php 教程 下载composer 官网 中文网站 exe下载地址 下载好exe 双击运行 找到php.ini注释一行代码 测试 composer -v说明安装成功 修改源 执行以下命令即可修改 composer config -g repo.packagist composer https://packagist.phpcomposer.com # 查看配置…...
企业游学进华秋,助力电子产业创新与发展
近日,淘IC企业游学活动,携20多位电子行业的企业家,走进了深圳华秋电子有限公司(以下简称“华秋”),进行交流学习、供需对接。华秋董事长兼CEO陈遂佰对华秋的发展历程、业务版块、产业布局等做了详尽的介绍&…...
玩转Tomcat:从安装到部署
文章目录 一、什么是 Tomcat二、Tomcat 的安装与使用2.1 下载安装2.2 目录结构2.3 启动 Tomcat 三、部署程序到 Tomcat3.1 Windows环境3.2 Linux环境 一、什么是 Tomcat 一看到 Tomcat,我们一般会想到什么?没错,就是他,童年的回忆…...
吃透《西瓜书》第四章 决策树定义与构造、ID3决策树、C4.5决策树、CART决策树
目录 一、基本概念 1.1 什么是信息熵? 1.2 决策树的定义与构造 二、决策树算法 2.1 ID3 决策树 2.2 C4.5 决策树 2.3 CART 决策树 一、基本概念 1.1 什么是信息熵? 信息熵: 熵是度量样本集合纯度最常用的一种指标,代表一个系统中蕴…...
复现宏景eHR存在任意文件上传漏洞(0day)
目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现 一、漏洞描述 北京宏景世纪软件股份有限公司(简称“宏景软件”)自成立以来始终专注于国有企事业单位人力与人才管理数智化(数字化、智能化)产品的研发和应用推广,是中国国有企事业单位人力与人才管理数智…...
unity连接MySQL数据库并完成增删改查
数据存储量比较大时,我就需要将数据存储在数据库中方便使用,尤其是制作管理系统时,它的用处就更大了。 在编写程序前,需要在Assets文件夹中创建plugins文件,将.dll文件导入,文件从百度网盘自取:…...
13个ChatGPT类实用AI工具汇总
在ChatGPT爆火后,各种工具如同雨后春笋一般层出不穷。以下汇总了13种ChatGPT类实用工具,可以帮助学习、教学和科研。 01 / ChatGPT for google/ 一个浏览器插件,可搭配现有的搜索引擎来使用 最大化搜索效率,对搜索体验的提升相…...
魔兽争霸III终极优化指南:让你的经典游戏在现代系统上焕发新生
魔兽争霸III终极优化指南:让你的经典游戏在现代系统上焕发新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在Window…...
测试工程师必知的数据库知识:这4个数据库技能,测试必备
在软件开发的全生命周期中,数据库是支撑所有业务逻辑运转的核心骨架——用户的每一次点击、每一笔交易、每一条信息的展示,最终都会转化为数据库中数据的增删改查。对于软件测试工程师而言,数据库知识早已不是面试中的加分项,而是…...
如何用bsf创建第一个3D场景:从零开始的完整教程
如何用bsf创建第一个3D场景:从零开始的完整教程 【免费下载链接】B3DFramework Modern C library for the development of real-time graphical applications 项目地址: https://gitcode.com/gh_mirrors/bs/B3DFramework bsf(B3DFramework&#x…...
抖音无水印下载终极指南:douyin-downloader让你轻松保存喜欢的视频
抖音无水印下载终极指南:douyin-downloader让你轻松保存喜欢的视频 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fa…...
剪映专业版教程:制作堆排序算法原理演示视频
前言 今天教大家用剪映制作堆排序算法的原理演示视频。堆排序的原理是:先将无序序列构建成一个小根堆(堆顶元素是整个堆中最小的),然后反复取出堆顶元素放到有序序列末尾,再将剩余元素重新调整成小根堆,重…...
后端开发必知的数据库优化技巧:这5个方法让你的系统性能提升10倍
对于软件测试从业者来说,理解数据库优化逻辑不仅能帮我们更快定位性能瓶颈,还能让我们在测试阶段就提前发现潜在的数据库设计问题,避免上线后出现大规模性能故障。很多测试同学往往把注意力放在接口逻辑、功能正确性上,却忽略了数…...
【CDA干货】用这4种数据分析思维,拆解爆款视频密码
很多做视频的人,发视频全凭感觉。今天视频火了,不知道为什么;明天流量掉了,也不知道哪里出了问题。其实,爆款背后从来不是运气,而是数据的逻辑。用数据分析思维做视频账号,就是把那些说不清道不…...
5月21日-23日微相携多款产品亮相2026世界无人机大会暨UASE无人机展以先进无人机侦测反制技术产品赋能城市低空安全防护
微相亮相2026世界无人机大会暨UASE无人机展...
Veo生成模糊/断帧/色偏?立刻停用默认设置!20年视频架构师紧急发布的5项必改Veo 2K/4K硬核配置
更多请点击: https://intelliparadigm.com 第一章:Veo 2K/4K视频生成质量崩塌的根源诊断 当Veo模型在2K或4K分辨率下输出视频时,高频细节严重丢失、运动伪影显著增强、纹理结构模糊化,这一现象并非单纯算力不足所致,而…...
【参数辨识】经典Prandtl–Ishlinskii(PI)迟滞模型及其PSO算法参数辨识【含Matlab源码 15544期】
💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab领域博客之家💞&…...
