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/ 一个浏览器插件,可搭配现有的搜索引擎来使用 最大化搜索效率,对搜索体验的提升相…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
