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/ 一个浏览器插件,可搭配现有的搜索引擎来使用 最大化搜索效率,对搜索体验的提升相…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
