软件测试银行项目网上支付接口调用测试实例
公司最近有一个网站商城项目要开始开发了,这几天老板和几个同事一起开着需求会议,
讨论了接下来的业务规划和需求策略,等技术需求一下来还要讨论技术需求,
确认后再慢慢的进入开发阶段,趁着闲暇时间新造的人想总结一下进入公司不久
接触过的一个关于银行支付API接口的调用,咱是第一次接触这类东西。
以后还是尽量养成写技术生活博客的习惯,工作了4年多,今年才开始想起来应该把自己的工作经历记录成
文,形成经验积累和技术共享,以前很多经历都淡忘了,希望以后能够每每有点思绪就记录下来,时间长了
也是一笔不小的积累和总结(好记性不如烂笔头),总不能工作这么多年一点技术经验积累记录都木有,实
为缺憾哉!(语言组织能力欠佳,还望海涵)
废话有点多,下面是正题:
一、API调用环境与相关配置详细说明;
要在网上支持客户(或商城会员)使用交通银行(BOCOM,交行国际)支付方式买东西,首先公司得与交行
合作,要求其提供支付接口API(一般程序员都知道),等公司拿到API之后需要按照银行API要求调用的环
境安装一些软件(一般是由银行提供API安装包)以及配置各种参数:
从银行拿到的API安装包:
图1(图中start.bat文件是后来加的,具体作用后面会做说明)
各文件夹简要说明(我直接从doc文件夹里的技术开发说明文档拷贝过来的):
- cert 提供商户端测试环境的商户测试证书、银行端测试环境测试根证书及 银行端生产环境根证书;
- demo 存放交易演示Asp页面文件,商户可参照demo中的页面进行编程开发;起始页面:Index.htm;
- doc 存放开发编程说明文档;
- icon 交通银行logo徽标
- ini 商户端API配置文件,API初始化需指定该配置文件,配置文件内容包含地址的指定、证书的指定及日志存放目录
- 指定等。
- setup 存放API的安装文件。
- lib 提供商户编程API所需全部 DLL 文件 ;
里面会有一个安装说明(如上图的简要说明.txt),打开后内有详细API安装及环境参数配置说明:
图2
相信以上图片中白纸黑字大家都能看懂,我为大家更详细介绍下
(上图所示文本中提到的 文档 是指由交行提供的另一个技术开发指导文档,放在doc文件夹里):
注:以下各种安装配置是配置的通用版的测试环境,网上有下载的,正式调用只需修改相关配置参数即可;
1.首先在网上下载最新版本jdk,安装java运行环境:
图3
(根据自己电脑的情况选择合适版本的java运行环境,我电脑是64位系统);
2.C盘新建文件夹commjava
(可自定义,但要和后面相关参数的配置一致,不知道可不可以装在别的盘,待我后期测试再看看补起来),
将上图1中ini、cert文件夹复制进去;
3.将已经拷过去的文件夹cert中的证书文件(PFX文件)打开进行安装导入到浏览器
(支付的时候需要验证是否安装了交行提供的证书,否则无法支付,交行也会返回相关验证信息):
图4
一直点“下一步”直到填写密码处,默认密码是:12345678,再继续点“下一步”直到完成,
导入成功以后可以在浏览器中看到(Internet选项→内容→证书):
图5
4.将之前安装包里的lib文件夹下所有的文件都拷到之前安装的jdk目录 Java\jre7\lib\ext 下,
同时也要复制一份拷到之前commjava文件夹下(需先在commjava文件夹下新建lib目录),
或者干脆把整个lib文件夹拷进去,
并在commjava文件夹新建名为log和settlement的文件夹
(其中log用来存放下面提到的bat文件执行日志);
5.在任何一个文件夹新建一个.bat 批处理文件并执行;
(图中我是新建在安装包目录下,其实只要内容编辑正确放哪里都可以,内容编辑按照你之前安装的目录自行修改),
编辑内容如下:
java -jar C:\bocommjava\lib\socket_c#.jar 8080 C:\bocommjava\ini\B2CMerchant.xml C:\bocommjava\log\socket.log
这里采用8080端口,命令大致意思是:执行该批处理命令会调用jar包,读取xml配置信息,
返回执行结果日志并在log目录下生成日志文件(与执行结果日志一致)。
注:该批处理文件打开后就不要关闭,以后测试接口调用就是以这个为基础,关掉后会无法调用;
笔者注:这么一路配置下来总感觉网上银行支付接口的调用环境配置都是银行自己定义死了
(下面的页面调用很多配置也是定死的。。。),
只要有一个地方配置错误后面调用就会有问题。
二、页面调用详细说明;
以上的准备工作做好后,就可以在页面前后台代码中进行相关调用了。
1.前台配置:交行支付接口报文验证很严格,报文中不能有其他任何规定之外的参数存在,不然就会因验签失败而出错,
所以页面提交的时候,一个form是不够的,一个form用来放除支付接口所需参数外的所有页面控件HTML代码,
另一个form用来专门提交支付接口所需参数:
(1)第一个form:
1 <form id="form1" runat="server"> 2 <!--除支付接口所需参数外的所有页面控件HTML代码比如选择银行的控件,确认支付按钮等--> 3 </form>
(2)第二个form:(注:以下各个参数安装包的开发文档中都有说明。每个参数具体注释请见后面的后台代码注释)
1 <form id="form2" name="form2" method="post" action="<%=orderUrl %>">2 <input type="hidden" name="interfaceVersion" value="<%=interfaceVersion%>" />3 <input type="hidden" name="merID" value="<%=merID%>" />4 <input type="hidden" name="orderid" value="<%=orderid%>" />5 <input type="hidden" name="orderDate" value="<%=orderDate%>" />6 <input type="hidden" name="orderTime" value="<%=orderTime%>" />7 <input type="hidden" name="tranType" value="<%=tranType%>" />8 <input type="hidden" name="amount" value="<%=amount%>" />9 <input type="hidden" name="curType" value="<%=curType%>" />
10 <input type="hidden" name="orderContent" value="<%=orderContent%>" />
11 <input type="hidden" name="orderMono" value="<%=orderMono%>" />
12 <input type="hidden" name="phdFlag" value="<%=phdFlag%>" />
13 <input type="hidden" name="notifyType" value="<%=notifyType%>" />
14 <input type="hidden" name="merURL" value="<%=merURL%>" />
15 <input type="hidden" name="goodsURL" value="<%=goodsURL%>" />
16 <input type="hidden" name="jumpSeconds" value="<%=jumpSeconds%>" />
17 <input type="hidden" name="payBatchNo" value="<%=payBatchNo%>" />
18 <input type="hidden" name="proxyMerName" value="<%=proxyMerName%>" />
19 <input type="hidden" name="proxyMerType" value="<%=proxyMerType%>" />
20 <input type="hidden" name="proxyMerCredentials" value="<%=proxyMercredentials%>" />
21 <input type="hidden" name="netType" value="<%=netType%>" />
22 <input type="hidden" name="merSignMsg" value="<%=merSignMsg%>" />
23 <input type="hidden" name="issBankNo" value="<%=issBankNo%>" />
24 </form>
(3).表单提交的js:
<script language="javascript" type="text/javascript">function submitForm(form) {setTimeout(function () {$(form).submit();}, 0);}</script>
2.后台代码:
(1)网关传输参数初始化:
1 #region 交行网关传输参数2 public string interfaceVersion = "1.0.0.0"; /*消息版本号,固定为1.0.0.0*/3 public string orderid = DateTime.Now.ToString("yyyyMMddHHmmss"); /*订单号,商户应保证3个月以上的唯一性*/4 public string orderDate = DateTime.Now.ToString("yyyyMMdd"); /*商户订单日期,格式:yyyyMMdd*/5 public string orderTime = DateTime.Now.ToString("HHmmss"); /*商户订单时间,格式:HHmmss*/6 public string tranType = "0"; /*交易类别 0 B2C*/7 public string amount = "1"; /*订单金额,单位:元并带两位小数15位整数+2位小数*/8 public string curType = "CNY"; /*订单币种, 人民币 CNY*/9 public string orderContent = string.Empty; /*商家填写的其他订单信息,在个人客户页面显示*/
10 public string orderMono = "6222600110030037084"; /*不在个人客户页面显示的备注,但可在商户管理页面上显示*/
11 public string phdFlag = string.Empty; /*物流配送标志:0-非物流 ,1-物流配送*/
12 public string notifyType = "1"; /*通知方式:0-不通知,1-通知,2-转页面*/
13 public string jumpSeconds = string.Empty; /*自动跳转时间,等待n秒后自动跳转取货URL;若不填写则表示不自动跳转*/
14 public string payBatchNo = string.Empty; /*商户批次号,商家可填入自己的批次号,对账使用*/
15 public string proxyMerName = string.Empty; /*代理商家名称,二级商户编号/或证件号码*/
16 public string proxyMerType = string.Empty; /*代理商家证件类型*/
17 public string proxyMercredentials = string.Empty; /*代理商家证件号码*/
18 public string netType = "0"; /*渠道编号,固定填0:(html渠道)*/
19 public string issBankNo = "BOCOM"; /*发行卡机构号*/
20 public string merURL = ""; /*主动通知URL,为空则不发通知*/
21 public string goodsURL = "../PayRuslut/COMMPayReslut.aspx"; /*取货URL,显示商户最终订单支付结果信息,为空则不显示按钮,不自动跳转*/
22 public string merSignMsg = string.Empty; /*发行卡机构号*/
23 public string merID = "301310063009501"; /*网上支付授权码,也就是上面导入的那个证书编号*/
24 public string tranCode = "cb2200_sign"; /*交易编号*/
25 public string orderUrl = string.Empty; /*订单最终的提交地址,需要从xml配置文件里获取*/
26 #endregion
(2).把安装包里的demo文件下:C#\netpay\App_Code 的 config.cs 文件拷贝到系统界面层,
修改其命名空间及其类名即可,或者在你自己的代码中添加也可以,只要能够供后面调用即可;
这个类的完整代码如下:
1 using System;2 using System.Data;3 using System.Configuration;4 5 using System.Web;6 using System.Web.Security;7 using System.Web.UI;8 using System.Web.UI.HtmlControls;9 using System.Web.UI.WebControls;
10 using System.Web.UI.WebControls.WebParts;
11
12 using System.Net.Sockets;
13
14 /// <summary>
15 ///config 的摘要说明
16 ///配置的系统参数和通讯方法示例
17 ///
18 /// </summary>
19 public class config
20 {
21 //商户号,就是前面导入进去的那个证书编号
22 public static string merchantID = "301310063009501";
23 //socket bridge通讯ip,测试环境一般是本地,正式生产环境中需要修改
24 public static string ip = "127.0.0.1";
25 //socket bridge端口
26 public static int port = 8080;
27
28 public config()
29 {
30
31 }
32
33 //与socket bridge通讯的方法示例
34 public string sendAndReceive(string sendMsg)
35 {
36 TcpClient client = new TcpClient(config.ip, config.port);
37 NetworkStream stream = client.GetStream();
38
39 Byte[] data = System.Text.Encoding.UTF8.GetBytes(sendMsg.ToString());
40 stream.Write(data, 0, data.Length);
41 data = new Byte[50 * 1024];
42 String responseData = String.Empty;
43 Int32 bytes = stream.Read(data, 0, data.Length);
44 responseData = System.Text.Encoding.UTF8.GetString(data, 0, bytes);
45 stream.Close();
46 client.Close();
47 return responseData;
48 }
49 }
(3).在支付提交的方法里加入如下代码:
#region 交行支付网关orderid = DateTime.Now.ToString("yyyyMMddHHmmss"); /*订单号,商户应保证3个月以上的唯一性*/amount = _CountPayMoney.ToString("F2"); /*订单金额,单位:元并带两位小数15位整数+2位小数*/merID = config.merchantID;/*获取证书编号*/string issuerId = IssUserID;/*银行代码,交行为bocom*/Random ro = new Random();string orderDatetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");int orderAmount = Convert.ToInt32(Convert.ToDouble(_CountPayMoney.ToString("F2")) * 100);string ext1 = OrderID + "&" + "0";string ext2 = VIPID.ToString();//会员帐号//拼接商户订单支付所需信息字符串orderMono = _payType + "_" + issuerId + "_" + orderAmount + "_" + ext1 + "_" + ext2 + "_" + orderDatetime;string sourceMsg = interfaceVersion + "|" + merID + "|" + orderid + "|" +orderDate + "|" + orderTime + "|" + tranType + "|" + amount + "|" + curType + "|" +orderContent + "|" + orderMono + "|" + phdFlag + "|" + notifyType + "|" + merURL + "|" +goodsURL + "|" + jumpSeconds + "|" + payBatchNo + "|" + proxyMerName + "|" + proxyMerType +"|" + proxyMercredentials + "|" + netType;StringBuilder sendMsg = new StringBuilder("");//组织申请报文sendMsg.Append("<Message>").Append("<TranCode>").Append(tranCode).Append("</TranCode>").Append("<MsgContent>").Append(sourceMsg).Append("</MsgContent></Message>");string responseData = new config().sendAndReceive(sendMsg.ToString());//解析返回报文XmlDocument xmlDoc = new XmlDocument();xmlDoc.LoadXml(responseData);XmlNodeList list = xmlDoc.GetElementsByTagName("retCode");string retCode = list.Item(0).InnerText.Trim();list = xmlDoc.GetElementsByTagName("errMsg");string errMsg = list.Item(0).InnerText.Trim();list = xmlDoc.GetElementsByTagName("signMsg");merSignMsg = list.Item(0).InnerText.Trim();list = xmlDoc.GetElementsByTagName("orderUrl");orderUrl = list.Item(0).InnerText.Trim();if (!retCode.Equals("0")){Response.Write("交易返回码:" + retCode + "<br>");Response.Write("交易错误信息:" + errMsg + "<br>");}else{//提交ClientScript.RegisterStartupScript("".GetType(), "", "<script language=\"javascript\" type=\"text/javascript\">submitForm('#form2');</script>");}#endregion
(4)银行返回支付结果后系统进行处理的代码:
需新建一个支付结果接收页面,也就是上面配置的取货URL参数goodsURL里的aspx页面。
在页面加载的时候调用:
protected void Page_Load(object sender, EventArgs e){PayResult();}
1 /// <summary>2 /// 支付返回结果3 /// </summary>4 private void PayReslut()5 {6 string tranCode = "cb2200_verify";7 string notifyMsg = Request.Params.Get("notifyMsg");8 9 StringBuilder sendMsg = new StringBuilder("");10 //sendMsg.Append("<?xml version='1.0' encoding='UTF-8'?>")11 //组织申请报文12 sendMsg.Append("<Message>")13 .Append("<TranCode>").Append(tranCode).Append("</TranCode>")14 .Append("<MsgContent>")15 .Append(notifyMsg)16 .Append("</MsgContent></Message>");17 18 TcpClient client = new TcpClient(config.ip, config.port);19 NetworkStream stream = client.GetStream();20 21 Byte[] data = System.Text.Encoding.UTF8.GetBytes(sendMsg.ToString());22 stream.Write(data, 0, data.Length);23 data = new Byte[50 * 1024];24 String responseData = String.Empty;25 Int32 bytes = stream.Read(data, 0, data.Length);26 responseData = System.Text.Encoding.UTF8.GetString(data, 0, bytes);27 stream.Close();28 client.Close();29 30 //解析返回报文31 XmlDocument xmlDoc = new XmlDocument();32 xmlDoc.LoadXml(responseData);33 XmlNodeList list = xmlDoc.GetElementsByTagName("retCode");34 string retCode = list.Item(0).InnerText.Trim();35 list = xmlDoc.GetElementsByTagName("errMsg");36 string errMsg = list.Item(0).InnerText.Trim();37 38 if (!retCode.Equals("0"))39 {40 //支付失败41 PayReslutShowH3.InnerHtml = "当前订单本次支付失败!";42 PayReslutShowH3.Attributes.Add("class", "paySuccess_p1F");43 }44 else45 {46 //支付成功47 string[] strs = notifyMsg.Split('|');48 string[] orderMono = Encoding.GetEncoding("utf-8").GetString(Convert.FromBase64String(strs[16])).Split('_');49 decimal PayMoney = Convert.ToDecimal(strs[2]);//获得支付的钱50 decimal OrderMoney = (Convert.ToDecimal(orderMono[2]) / 100);//获得订单钱51 orderIDSpan.InnerHtml = strs[1];//显示交行支付的订单号52 PayMoneySpan.InnerHtml = PayMoney.ToString("F2");//显示本次支付的钱53 string[] _ext1 = orderMono[3].Split('&');54 string PayType = _ext1[1];//获得支付类型 0=订单,1=充值,2=还款 3=团购订单 4=续费55 string OrderID = _ext1[0];//订单号:订单支付的时候才会有56 int VipID = int.Parse(orderMono[4]);//会员ID号码57 //BLL.HSSM_LinPayLog.Exists(paymentResult.getPaymentOrderId())58 if (HSSM_Public_DB.IsRecord("HSSM_LinPayLog", "paymentOrderId='" + OrderID + "'"))/*判断是否重复支付,根据支付的订单号进行判断*/59 {60 PayReslutShowH3.InnerHtml = "当前订单已经支付成功!";61 return;62 }63 if (PayMoney <= 0)64 {65 Response.Redirect("~/NullData.html");66 return;67 }#region 系统接收支付结果返回成功结果进行扣款操作//相关代码略,依据系统需求而定,可能调用发送订单回执短信、邮件等#endregion
256 }
257 }
好了,至此,所有的相关配置以及代码就介绍完了。
以上所有的过程都是按照成功运行之后回头总结的,其实在配置API调用环境和调试支付接口的调用时遇到了一些问题,
通过技术主管跟银行方面沟通以及主管和自己的不断调试运行,最终支付接口的调用才成功,银行那边也返回了各种消息。
我想以后每每有点东西都会记录成文,望坚持下去。。
分享就是快乐,大家一起学习进步,一天进步一点,日积月累。。。
相关文章:
软件测试银行项目网上支付接口调用测试实例
公司最近有一个网站商城项目要开始开发了,这几天老板和几个同事一起开着需求会议, 讨论了接下来的业务规划和需求策略,等技术需求一下来还要讨论技术需求, 确认后再慢慢的进入开发阶段,趁着闲暇时间新造的人想总结一…...
w806 adc 中断扫描通道采集
用到了该芯片adc 扫描4个adc 通道,官方的死循环等待非常浪费时间,这里改用adc 中断采集方式,记录一下 int32_t adcFilterSum[4]{0}; int32_t detec_adc_value[4]{0};//mV int16_t detec_convt_ok[4]{0};/*is OK*/ ADC_HandleTypeDef hadc;vo…...
使用CSS的Positions布局打造响应式网页
在当今移动互联网的时代,响应式网页设计已经成为了一个必备的技能。通过使用CSS Positions布局,我们可以轻松地实现一个响应式的网页,使网页能够在不同的屏幕尺寸下自动适应。本文将介绍如何使用CSS Positions布局来打造一个响应式网页&#…...
模型训练环境相关(CUDA、PyTorch)
模型训练环境相关(CUDA、PyTorch) 1. 查看当前 GPU 所能支持的最高版本的 CUDA2. 如何判断是否安装了 CUDA3. 安装 PyTorch3.1 创建虚拟环境3.2 激活并进入虚拟环境3.3 安装 PyTorch 1. 查看当前 GPU 所能支持的最高版本的 CUDA 打开 NVIDIA 控制面板&a…...
链动2+1模式:社交电商行业的新型商业模式与营销手段
链动21模式是近年来在社交电商行业中崭露头角的一种新型商业模式和营销手段。在经历了多年的发展之后,社交电商行业已经进入了一个竞争激烈、用户获取成本高昂的阶段。在这个阶段,如何迅速吸引用户并增加他们的留存率和复购率成为了亟待解决的问题。 为了…...
竞赛选题 深度学习 opencv python 实现中国交通标志识别
文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 🔥 优质…...
LuatOS-SOC接口文档(air780E)-- fskv - kv数据库,掉电不丢数据
示例 -- 本库的目标是替代fdb库 -- 1. 兼容fdb的函数 -- 2. 使用fdb的flash空间,启用时也会替代fdb库 -- 3. 功能上与EEPROM是类似的 fskv.init() fskv.set("wendal", 1234) log.info("fskv", "wendal", fskv.get("wendal"))--[[ fs…...
一篇文章教你Pytest快速入门和基础讲解,一定要看!
前言 目前有两种纯测试的测试框架,pytest和unittestunittest应该是广为人知,而且也是老框架了,很多人都用来做自动化,无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架出去面试也好,跟别…...
SpringBoot项目:Cannot find declaration to go to
SpringBoot项目get,set方法总报Cannot find declaration to go to 搜了很多答案,没解决 后来仔细一想,原来是我的idea软件重装了,lombok插件没重新安装导致。 安装步骤: 1、下载地址:https://plugins.jetbrains.com…...
【高并发】多线程和高并发提纲
文章目录 三大源头两个主要问题三大解决方案 最近正在面试,对多线程和高并发相关问题整理了一个简单的提纲。 个人感觉这三大部分由底向上,足够引出对并发编程中大部分问题的讨论~ 三大源头 线程切换带来的原子性问题。 原子操作:利用CPU提…...
vue.js处理数组对象中某个字段是否变为两个字段
一、场景: 产品要求做一个时间步骤条,使用目前后端已返回的数据进行操作实现。时间步骤条要求日期和时间分开显示且相同日期只显示第一个日期。 图左边为实现效果,右边为后台返回的接口。接口中current字段表示当前到达第几步,从…...
从零开始的C++(补充三的内容)
auto:在编译阶段根据数据的类型确认auto所代表的类型,并将auto换成对应的类型。 特点: 1、auto所能代表的类型必须是在编译阶段就能确认的。 2、auto修饰的变量必须初始化,否则编译器无法判断auto的实际类型。 3、auto会根据第一个数据来…...
微信小程序通过createSelectorQuery获取元素 高度,宽度与界面距离
小程序官方有提供给我们一个 const query wx.createSelectorQuery() 函数 我们可以先编写这样一段代码 wxml <view><button bindtap"getDom">点击查看</button><view class "textIn" style "height: 100px;width: 30px;&quo…...
MySQL-事务
MySQL-事务 1.什么是事务 举例:想象炒菜的过程。 洗菜切菜炒菜装盘 我相信缺少任何任何一个步骤,都不完美!!!可以将炒菜的过程理解为一个事务,是一组操作的集合,而MySQL中的事务也是如此。但…...
自动定时删除磁盘文件的脚本(从文件日期最早的开始删)
#!/bin/bash# 指定的挂载点 MOUNTPOINT"/media/vm/MyDisk512GB"# 设置磁盘大小的限制 (例如:800G) LIMIT$((800 * 1024 * 1024)) # 单位是KB# 获取挂载点的已使用空间 USED_SPACE$(df -kP "$MOUNTPOINT" | tail -1 | awk {print $3})echo &quo…...
拆解CPU的基本结构和运行原理
CPU的基本结构 CPU是一个计算系统的核心 南北桥芯片将CPU与外设连接起来 CPU执行流程 CPU的电路基础 组合电路基本原理 时序电路基本原理 多核成为主流 汇编语言和寄存器 中断的基本原理 中断的产生 中断服务程序 CPU 做为计算机的总司令官,它管理着计算…...
Docker安装——Ubuntu (Jammy 22.04)
一、为什么要用 Ubuntu?(centos和ubuntu有什么区别) 使用lsb_release命令:lsb_release -a ,即可查看ubantu的版本,但是为什么要使用ubantu 呢? 区别:1、centos基于EHEL开发,而ubunt…...
Fast DDS之Transport
目录 transport层负责为DDS用户数据收发和服务发现提供通信。包含UDP,TCP,SHM。...
爱普生L125X_L325X系列打印机Wi-Fi配置方法(Smart Panel)
准备工作: 手机需要下载“Epson Smart Panel”APP; 配置无线(Wi-Fi)方法 说明:SSID名称(Wi-Fi名)不能包含中文字符,路由器需要选择2.4GHz频段; 1. 打开“Epson Smart Panel”软件࿰…...
【回顾一下Docker的基本用法】
文章目录 回顾一下Docker的基本用法1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.…...
【Python】Python基础知识
【Python】Python基础知识 关键字 查看Python关键字: >python >>>import keyword >>>keyword.kwlist 注释 注释有两方面作用: (1)提高程序的可读性(最重要的作用);…...
【计算机视觉 05】YOLO论文讲解:V1-V7
https://ai.deepshare.net/live_pc/l_63243a65e4b050af23b79338 Part1.目标检测与YOLO系列 1. 目标检测任务及发展脉络 2. YOLO的发展史 Anchors Base原理: Part2.YOLOV1-V3 3. YOLO V1的网络结构 4. YOLO V3的网络结构与实验结果 Part3.YOLO的进化 5. YOLO V4的网络…...
git全局与单仓库的密码管理
概要 在使用git时,有默认的全局配置,每个仓库也有自己的配置,在使用时常常傻傻分不清楚,现在进行一个简单的整理记录。 一般情况下全局配置中的git账号和邮箱通常设置成自己的,其他仓库再根据项目需要进行单独配置&a…...
IDEA的使用(一) (IntelliJ IDEA 2022.1.3版本)
目录 1. IDEA项目结构 2. 模块的导入操作 2.1 正规操作 2.2 取巧操作 2.3 出现乱码 2.4 模块改名 3. 代码模板的使用 后缀补全(Postfix Completion)、实时模板(Live Templates)菜单里面什么介绍都有,可以自学&a…...
javaee SpringMVC文件上传 项目结构
引入依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…...
JavaScript DOM 函数大全详解(使用最新的 JS 语法)
JavaScript DOM 函数大全详解(使用最新的 JS 语法) JavaScript 的 Document Object Model(DOM)是用于操作网页内容的编程接口。在最新的 JavaScript 语法下,我们有很多方便和高效的方法来处理 DOM。下面是一些常用 DO…...
Stm32_标准库_8_ADC_光敏传感器_测量具体光照强度
ADC简介 测量方式 采用二分法比较数据 IO通道 ADC基本结构及配置路线 获取数字变量需要用到用到光敏电阻的AO口,AO端口接在PA0引脚即可 测得的模拟数据与实际光照强度之间的关系为 光照强度 100 - 模拟量 / 40;代码: 完整朴素代码: #in…...
基于SSM的固定资产管理系统的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
Leetcode---364场周赛
题目列表 2864. 最大二进制奇数 2865. 美丽塔 I 2866. 美丽塔 II 2867. 统计树中的合法路径数目 一、最大二进制奇数 这题只要你对二进制有了解(学编程的不会不了解二进制吧),应该问题不大,这题要求最大奇数,1.奇数:只要保证…...
使用 Powershell 检索不理解的命令
使用 Powershell 检索不理解的命令 尝试使用 Powershell 完成 Powershell 的命令行 使用 Powershell 时,有时您会忘记某个 cmdlet 或想要了解哪些 cmdlet 可用。在这种情况下,最好在互联网上查找,但您也可以使用 Powershell 函数来完成。 以…...
懒人做图网站/太原seo霸屏
Java反射是Java语言一个很重要的特征,简单剖析下反射的定义、原理、使用、性能及应用场景。 (一)定义 程序运行时,允许改动程序结构或变量类型,这种语言称为动态语言。java不属于动态语言,但提供了RTTI&…...
西安做网站程序/搜索引擎排名查询
Django模型Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。 Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。 MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例…...
宁夏水利厅建设管理处网站/seo搜索如何优化
MinHash首先它是一种基于JaccardIndex相似度的算法,也是一种LSH的降维的方法,应用于大数据集的相似度检索、推荐系统。下边按我的理解介绍下MinHash。举例A,B两个集合:A{s1,s3,s6,s8,s9}B{s3,s4,s7,s8,s10}根据JaccardIndex公式&a…...
网站APP推广/seo排名优化网站
一、Tomcat运行原理分析 1. Tomcat是运行在JVM中的一个进程。它定义为【中间件】,顾名思义,是一个在Java项目与JVM之间的中间容器。 2. Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(main方法),,意…...
网站建设有哪些软件/网络营销的四个特点
CUDA基本使用方法 在介绍OpenCV中GPU模块使用之前,先回顾下CUDA的一般使用方法,其基本步骤如下: 1.主机代码执行;2.传输数据到GPU;3.确定grid,block大小; 4.调用内核函数,GPU运行程序…...
网站建设应该注意哪些原则/短视频矩阵seo系统源码
第一步启用Ad Hoc Distributed Queries 在SQLserver执行以下的语句: exec sp_configure show advanced options,1 reconfigure exec sp_configure Ad Hoc Distributed Queries,1 reconfigure ----允许在进程中使用ACE.OLEDB.12 在安装了 ACE2010的驱动才可以执行…...