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/ 一个浏览器插件,可搭配现有的搜索引擎来使用 最大化搜索效率,对搜索体验的提升相…...

1-linux下mysql8.0.33安装
在互联网企业的日常工作/运维中,我们会经常用到mysql数据库,而linux下mysql的安装方式有三种: 1.mysql rpm安装 2.mysql二进制安装 3.mysql源码安装 今天就为大家讲讲linux下mysql8.0.33版本rpm方式的安装。 1.前提 1.1.系统版本 Cent…...

golang反射获取结构体的值和修改值
功能:根据id和反射技术封装 创建和更新人的查询 一、代码二、演示 一、代码 package coryCommonimport ("context""errors""github.com/gogf/gf/v2/container/gvar""github.com/tiger1103/gfast/v3/internal/app/system/dao&qu…...

中文大模型评估数据集——C-Eval
C-EVAL: A Multi-Level Multi-Discipline Chinese Evaluation Suite for Foundation Models https://arxiv.org/pdf/2305.08322v1.pdfhttps://github.com/SJTU-LIT/cevalhttps://cevalbenchmark.com/static/leaderboard.html Part1 前言 怎么去评估一个大语言模型呢? 在广泛…...

Unity 四元素
//-------------旋转------------ // //设置角度 (超过90或负数时,会设置-1结果是359这样的问题,可以使用下面旋转的方式) transform.rotate new Quaternion(0,0,0,0);//Quaternion四元数 transform.localEulerAngles new Vector3(0,0,0);//EulerA…...

如何入门python爬虫
对于初学者,想要入门python爬虫需要注意什么,如何快速入门呢? 首先需要明白四点: 熟悉python编程了解HTML了解网络爬虫的基本原理学习使用python爬虫的一些库与框架python编程 如果你不懂python,那么需要先学习python这门非常easy的语言(相对其它语言而言)。 编程语言…...

深入学习 Redis - 基于 Jedis 通过 Java 客户端操作 Redis
目录 一、Jedis 依赖 二、Java 客户端操控 redis 2.1、准备工作(ssh 隧道) 2.2、概要 2.2、string 2.3、hash 2.4、list 2.5、set 2.5、zset 一、Jedis 依赖 自己去 中央仓库 上面找. 二、Java 客户端操控 redis 2.1、准备工作(ssh 隧…...

019 - STM32学习笔记 - Fatfs文件系统(一) - FatFs文件系统初识
019 - STM32学习笔记 - Fatfs文件系统(一) - FatFs文件系统初识 最近工作比较忙,没时间摸鱼学习,抽空学点就整理一点笔记。 1、文件系统 在之前学习Flash的时候,可以调用SPI_FLASH_BufferWrite函数,将数…...

Selenium开发环境搭建
1.下载Python https://www.python.org/downloads/ 下载下来选择自己创建的路径进行安装,然后配置环境变量 cmd命令框查看 2.安装selenium cmd命令框输入: pip install selenium3.下载pycharm https://www.jetbrains.com/pycharm/download/#sec…...

解决 The ‘more_itertools‘ package is required
在使用爬虫获取维基百科数据时看到了一个很好的项目: 博客:https://blog.51cto.com/u_15919249/5962100 项目地址:https://github.com/wjn1996/scrapy_for_zh_wiki 但在使用过程中遇到若干问题,记录一下: The more_it…...

手把手教你在云环境炼丹(部署Stable Diffusion WebUI)
前几天写了一篇《手把手教你在本机安装Stable Diffusion秋叶整合包》的文章,有些同学反映对硬件的要求太高,显卡太TM贵了。今天我再分享一个云服务器炼丹的方法,方便大家快速入门上手,这个云服务不需要特殊网络设置,能…...