当前位置: 首页 > news >正文

使用MFC创建一个SaleSystem

目录

1、项目的创建:

2、项目的配置:

3、设置窗口属性:

(1)、设置图标

1)、添加导入资源

2)、代码初始化图标

(2)、设置标题

(3)、设置窗口大小和位置

4、CInfoFile类的引入:

5、登录功能的实现:

(1)、插入对话框

(2)、修改对话框ID 

(3)、修改对话框标题(caption)

(4)、添加控件

(5)、布局调整

(6)、登录窗口添加类

(7)、创建登录窗口以模态形式弹出

(8)、实现登录功能

(9)、保存账号密码

(10)、取消功能实现

(11)、解决问题1和问题2

6、静态拆分窗口:

(1)、添加类

(2)、添加拆分窗口对象

 (3)、重写客户端

7、树视图的功能:

8、个人信息界面搭建:

(1)UI以及属性的设置

(2)、新创建的dialog添加类

(3)、关联变量

9、自定义消息以及界面的挂载:

(1)、添加自定义的消息

(2)、挂载界面

10、个人信息功能完善:

(1)、完善我的信息

(2)、完善修改密码

(3)、取消修改

11、销售管理功能的实现:

(1)、创建对话框并且更改属性

(2)、为对话框添加类

 (3)、为控件添加变量

(4)、挂载窗口

(5)、完善窗口内容

(6)、如果出现乱码

(7)、重写一个改变的事件

(8)、添加购买的点击事件

(9)、购买之后清空数据

(10)、数据写到文件中

(11)、取消直接清空单价库存个数

12、添加商品的个数功能实现:

(1)UI设计

(2)、dlg添加类

(3)、控件添加变量

(4)、界面挂载

(5)、初始化界面

(6)、添加功能实现

(7)、取消添加按钮事件

(8)、添加新商品的添加按钮

(9)、添加商品的取消按钮


1、项目的创建:

2、项目的配置:

由于现在VS不支持传统的scanf,strcpy,sprintf等,所以直接使用这些函数会提示C4996错误。

VS建议采用带有_s的函数,如scanf_s、strcpy_s,但是这些不是标准的C++函数,如果想要继续使用这些函数需要添加_CRT_SECURE_NO_WARNINGS这个预定义。

在项目->属性->c++预处理器->预处理器中添加_CRT_SECURE_NO_WARNINGS

3、设置窗口属性:

(1)、设置图标

1)、添加导入资源

导入成功后会出先在资源视图Icon里面

2)、代码初始化图标

CMainFrame中的OnCreate函数的用途:

在MFC框架中,CMainFrame是主窗口的类,它是整个应用程序的核心。在CMainFrame的OnCreate函数中,通常会进行一些初始化操作,其中包括设置应用程序的图标

应用程序的图标是应用程序的重要标志,它通常出现在窗口标题栏、任务栏和启动器等地方。

具体来说,在CMainFrame的OnCreate函数中,通常会进行以下步骤:

        1、创建主窗口

通过调用CFrameWnd::Create函数来创建主窗口,并将窗口显示在屏幕上。

        2、设置主窗口图标

通过调用CWnd::SetIcon函数来设置主窗口的图标。可以选择不同大小的图标,以适应不同的显示需要。

        3、创建菜单和工具栏

根据设计需求,使用MFC提供的相关类来创建菜单和工具栏,并设置相应的功能和事件处理函数。

        4、加载默认文档

根据设计需求,利用MFC的文档视图框架来加载应用程序的默认文档,并打开初始的文档窗口。

因此,在CMainFrame的OnCreate函数中设置应用程序的图标,是一个很自然和合理的选择。这样可以通过一次函数调用来完成这个任务,同时也可以与其他初始化操作相结合,使代码更加清晰和易于维护。

代码部分:

//设置图标。IDI_ICON_WIN为图标资源ID// 在 CMainFrame::OnCreate 函数中设置窗口图标HICON hIcon = AfxGetApp()->LoadIconW(IDI_ICON_WIN);//SetIcon(hIcon, TRUE);    // 设置大图标SetIcon(hIcon, FALSE);   // 设置小图标

HICON代表图标资源句柄类型,

hIcon代表接收的窗口图标句柄,

AfxGetApp()->MFC全局函数(Afx开头)获取当前应用程序的指针

LoadIconW(ID)加载图标资源并且返回图标资源的句柄。

(2)、设置标题

(左标题由操作系统管理在文档类)

//设置左侧标题SetTitle(TEXT("销售管理系统"));

//设置标题(右侧标题)SetTitle(TEXT("2023.10.17"));

至于为什么标题的设置还有图标的初始化会在这些函数中:

在 MFC 中,应用程序类(CWinApp 的派生类)负责应用程序的初始化和管理。当应用程序启动时,应用程序类的 InitInstance 函数被调用,可以在其中创建主窗口框架(CMainFrame)对象、文档模板(CDocTemplate)对象以及其他需要的资源。 

 主窗口框架类(CMainFrame)是应用程序的主窗口,并且通常包含菜单栏、工具栏、状态栏等界面元素,通过 CFrameWnd::OnCreate 函数进行初始化。OnCreate 函数中,可以设置窗口的标题、图标、样式等属性。

 文档类(CDocument 的派生类)负责管理应用程序的数据以及与数据相关的业务逻辑。每个文档类对应一个打开的文档实例,当打开新文档时,文档类的 OnNewDocument 函数会被调用。在 OnNewDocument 函数中,可以进行文档的初始化,包括设置标题、初始化数据等操作。

(3)、设置窗口大小和位置

MoveWindow()函数前俩个参数代表坐标,后面俩个参数代表宽高。

CenterWindow()函数默认参数把窗口居中显示。

设置之后的窗口样式:

4、CInfoFile类的引入:

俩个文本文件可以直接读取,但是.h和.cpp文件必须得添加到现在的项目中

InfoFile.h

#pragma once#include <list>
#include <fstream>
#include <iostream>
#include <string>
//#include <afx.h>
//#include "stdafx.h"#define _F_LOGIN "./login.ini"//自定义宏_F_LOGIN代表打开login文件。
#define _F_STOCK "./stock.txt"//自定义宏_F_STOCK代表打开stock文件。using namespace std;struct msg
{int id; //商品idstring name; //商品名int price; //商品价格int num; //商品个数
};class CInfoFile
{
public:CInfoFile();~CInfoFile();//读取登录信息void ReadLogin(CString &name, CString &pwd);//修改密码void WritePwd(char* name, char* pwd);//读取商品数据void ReadDocline();//商品写入文件void WriteDocline();//添加新商品void Addline(CString name, int num, int price);list<msg> ls;	//存储商品容器int num;			//用来记录商品个数};

InfoFile.cpp


#include "stdafx.h"
#include "InfoFile.h"CInfoFile::CInfoFile()
{
}CInfoFile::~CInfoFile()
{
}//读取登录信息
void CInfoFile::ReadLogin(CString &name, CString &pwd)
{ifstream ifs; //创建文件输入对象ifs.open(_F_LOGIN);char buf[1024] = { 0 };if (!ifs.is_open()) {cout << "文件打开失败" << endl;}ifs.getline(buf, sizeof(buf));	//读取一行内容name = CString(buf);	//将char* 转换为CStringifs.getline(buf, sizeof(buf));	//读取一行内容pwd = CString(buf);	//将char* 转换为CStringifs.close();	//关闭文件
}//修改密码
void CInfoFile::WritePwd(char* name, char* pwd)
{ofstream ofs; //创建文件输出对象ofs.open(_F_LOGIN); //打开文件if (!ofs.is_open()){cout << "文件打开失败" << endl;}ofs << name << endl;	//name写入文件ofs << pwd << endl;	//pwd写入文件ofs.close();	//关闭文件
}//读取商品的信息
void CInfoFile::ReadDocline()
{ifstream ifs(_F_STOCK); //读取方式打开文件char buf[1024] = { 0 };num = 0;	//初始化商品数量为0ls.clear();//取出表头ifs.getline(buf, sizeof(buf));while (!ifs.eof())	//没到文件结尾{msg tmp;ifs.getline(buf, sizeof(buf));	//读取一行num++;	//商品数量加一//AfxMessageBox(CString(buf));char *sst = strtok(buf, "|");	//以"|"分隔if (sst != NULL){tmp.id = atoi(sst);	//商品id}else{break;}sst = strtok(NULL, "|");tmp.name = sst;	//商品名称sst = strtok(NULL, "|");tmp.price = atoi(sst);	//商品价格sst = strtok(NULL, "|");tmp.num = atoi(sst);	//商品数目ls.push_back(tmp);	//放在链表的后面}ifs.close();	//关闭文件}//商品写入文件
void CInfoFile::WriteDocline()
{ofstream ofs(_F_STOCK); //输出方式打开文件string bt = "商品ID|商品名|单价|库存";if (ls.size() > 0)	//商品链表有内容才执行{ofs << bt << endl;	//写入表头//通过迭代器取出链表内容,写入文件,以"|"分割,结尾加换行for (list<msg>::iterator it = ls.begin(); it != ls.end(); it++){ofs << it->id << "|";ofs << it->name << "|";ofs << it->price << "|";ofs << it->num << endl;}}ofs.close();}//添加新商品
//name:商品名称,num:库存,price:价格
void CInfoFile::Addline(CString name, int num, int price)
{msg tmp;if (ls.size() > 0){//商品名称,库存,价格有效if (!name.IsEmpty() && num > 0 && price > 0){tmp.id = ls.size() + 1;	//id自动加1CStringA str;str = name;					//CString 转CStringAtmp.name = str.GetBuffer();//CString 转为char *, 商品名称tmp.num = num;			//库存tmp.price = price;		//价格ls.push_back(tmp);			//放在链表的后面}}
}

(1)、功能测试

 

修改账号密码成功,弹出的新的账号密码。

5、登录功能的实现:

(1)、插入对话框

(2)、修改对话框ID 

(3)、修改对话框标题(caption)

(4)、添加控件

密码的Edit Control属性设置为密码不可见

(5)、布局调整

(6)、登录窗口添加类

(7)、创建登录窗口以模态形式弹出

问题1:关闭选项,关闭进入主窗口

问题2:在edit里面按下回车直接进入主窗口

(8)、实现登录功能

鼠标点击登录按钮事件

void CLoginDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码//登录按钮点击事件//控件中的内容同步到变量中,也就是密码同步到变量中UpdateData(TRUE);//1、判断俩个账号密码都不为空if (m_user.IsEmpty() || m_pwd.IsEmpty()) {MessageBox(TEXT("输入内容不为空"));return;}//CInfoFile类可以获取账号密码CInfoFile file;CString pwd,name;file.ReadLogin(name, pwd);//用户名,密码if (name == m_user)//用户名一致{if (pwd == m_pwd)//密码一致{//关闭当前的对话框MessageBox(TEXT("登陆成功!"));CDialog::OnCancel();}else {MessageBox(TEXT("密码错误"));}}else{MessageBox(TEXT("用户名错误"));}
}

(9)、保存账号密码

默认直接有账号密码

BOOL CLoginDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// TODO:  在此添加额外的初始化//默认登录信息CInfoFile file;CString name, pwd;file.ReadLogin(name, pwd);m_user = name;m_pwd = pwd;//同步到控件中UpdateData(FALSE);return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}

(10)、取消功能实现

(11)、解决问题1和问题2

问题1 窗口关闭直接跳转主窗口

更改消息里面的WM_CLOSE函数

问题2回车不能跳转页面

重写OnOK()函数

OnOK()函数回关闭当前对话框,直接注释掉。

6、静态拆分窗口:

(1)、添加类

(2)、添加拆分窗口对象

 (3)、重写客户端

先引入头文件

#include"SelectView.h"
#include "DispalyView.h"

重写拆分事件

//拆成一行俩列m_spliter.CreateStatic(this, 1, 2);//左侧右侧具体显示的信息m_spliter.CreateView(0,0,RUNTIME_CLASS(CSelectView),CSize(200,500),pContext);m_spliter.CreateView(0,1, RUNTIME_CLASS(CDispalyView), CSize(200, 500), pContext);return TRUE;//代表用户自己拆分

7、树视图的功能:

//初始化树视图//获取树控件m_treeCtrl = &GetTreeCtrl();//1、准备图片集合HICON icon = AfxGetApp()->LoadIconW(IDI_ICON_RE);m_imageList.Create(30, 30, ILC_COLOR32, 1, 1);m_imageList.Add(icon);m_treeCtrl->SetImageList(&m_imageList, TVSIL_NORMAL);//2、添加节点m_treeCtrl->InsertItem(TEXT("个人信息"),0,0,NULL);m_treeCtrl->InsertItem(TEXT("销售管理"), 0, 0, NULL);m_treeCtrl->InsertItem(TEXT("库存信息"), 0, 0, NULL);m_treeCtrl->InsertItem(TEXT("库存添加"), 0, 0, NULL);m_treeCtrl->InsertItem(TEXT("库存删除"), 0, 0, NULL);

InsertItem函数原型:

HTREEITEM InsertItem

(

LPCTSTR lpszItem,        //显示的文本

int nImage,                      //节点的图像索引

int nSelectedImage,        //节点被选中时图像的索引

HTREEITEM hParent     //指定该节点作为哪个节点的子节点

                                         //NULL代表是根节点,root代表父节点,parent代表子节点

);
 

create()函数原型: 

//获取当前的选中项HTREEITEM item = m_treeCtrl->GetSelectedItem();//获取选中项里面的内容CString name = m_treeCtrl->GetItemText(item);MessageBox(name);

8、个人信息界面搭建:

(1)UI以及属性的设置

 

(2)、新创建的dialog添加类

(3)、关联变量

9、自定义消息以及界面的挂载:

(1)、添加自定义的消息

从CSelectView.cpp中发送信息 

(2)、挂载界面

1)、引入要挂载界面的头文件

#include "UserDlg.h"

2)、代码部分

CCreateContext Context;if (wParam == NM_A){//MessageBox(L"个人信息界面挂载");//挂在界面Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg);Context.m_pCurrentFrame = this;Context.m_pLastView = (CFormView *)m_spliter.GetPane(0,1);m_spliter.DeleteView(0, 1);m_spliter.CreateView(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500),&Context);CUserDlg *pNewView = (CUserDlg *) m_spliter.GetPane(0,1);m_spliter.RecalcLayout();pNewView->OnInitialUpdate();m_spliter.SetActivePane(0,1);}

10、个人信息功能完善:

(1)、完善我的信息

void CUserDlg::OnInitialUpdate()
{CFormView::OnInitialUpdate();//初始化m_user = TEXT("销售员");CInfoFile file;CString name, pwd;file.ReadLogin(name, pwd);m_name = name;//获取名称UpdateData(FALSE);//变量同步到控件上// TODO: 在此添加专用代码和/或调用基类
}

(2)、完善修改密码

void CUserDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码//修改密码功能UpdateData(TRUE);//拿到最新的值if (m_newPwd.IsEmpty() || m_surePwd.IsEmpty()){MessageBox(TEXT("输入的内容不能为空!"));return;}//新密码和确定密码要一致if (m_newPwd != m_surePwd){MessageBox(TEXT("新密码与确定密码要一致!"));return;}//获取旧密码。CInfoFile file;CString name, pwd;file.ReadLogin(name, pwd);if (m_newPwd == pwd){MessageBox(TEXT("新密码和旧密码不能一致!"));return;}//WritePwd写要求的char *类型CStringA tmp;tmp = name;CStringA tmp1;tmp1 = m_newPwd;//现在放进去的应该是新的密码,不是旧的密码file.WritePwd(tmp.GetBuffer(), tmp1.GetBuffer());MessageBox(L"修改成功!");//情况内容m_newPwd.Empty();m_surePwd.Empty();UpdateData(FALSE);
}

修改成功。

(3)、取消修改

直接清空密码

void CUserDlg::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码//清空内容m_newPwd.Empty();m_surePwd.Empty();UpdateData(FALSE);
}

11、销售管理功能的实现:

(1)、创建对话框并且更改属性

(2)、为对话框添加类

 (3)、为控件添加变量

(4)、挂载窗口

(5)、完善窗口内容

在入口函数初始化下拉列表

void CSellDlg1::OnInitialUpdate()
{CFormView::OnInitialUpdate();// TODO: 在此添加专用代码和/或调用基类//初始化销售订单窗口//初始化下拉框CInfoFile file;//把商品读到对象中file.ReadDocline();list<msg>::iterator it = file.ls.begin();for (;it != file.ls.end();it++){	//遍历商品容器,把容器放到下拉框中//string->CStringm_combo.AddString(CString(it->name.c_str()));}//默认选中第一个m_combo.SetCurSel(0);}

(6)、如果出现乱码

可以使用getline函数获取文件文本中的内容,文件是以ANSI编码保存的则不会出现问题,如果采用其他编码格式(UTF-8,UTF-16会出现乱码),一般存放在string类型的对象中,如果要处理更加复杂的多字节字符集(UTF-8,UTF-16)可以使用wstring来处理。

(7)、重写一个改变的事件

重写改变事件的目睹为了在切换下拉框的时候跟新其他的信息。

void CSellDlg1::OnCbnSelchangeCombo1()
{// TODO: 在此添加控件通知处理程序代码//先获取商品的名称int index = m_combo.GetCurSel();CString name;m_combo.GetLBText(index,name);CInfoFile file;//根据商品名称获取到商品的价格和库存,并且显示到控件中//把商品读到对象中file.ReadDocline();list<msg>::iterator it = file.ls.begin();for (; it != file.ls.end(); it++){if ((CString)it->name.c_str() == name) {m_price = it->price;m_left = it->num;//同步到控件上UpdateData(FALSE);}}

由于第一个商品的单价库存没有同步,我们可以手动调用一次这个改变事件

(8)、添加购买的点击事件

实现购买功能

void CSellDlg1::OnBnClickedButton2(){//UpdateData(TRUE);//没有获取最新数据// TODO: 在此添加控件通知处理程序代码//购买功能实现if (m_num <= 0){MessageBox(L"购买数量要大于0");return;}//购买的数量不能大于库存if (m_num > m_left){MessageBox(L"购买数量不能大于库存");return;}//购买//获取到具体要买的商品名称int indx = m_combo.GetCurSel();CString name;m_combo.GetLBText(indx, name);CInfoFile file;file.ReadDocline();list<msg>::iterator it = file.ls.begin();for (; it != file.ls.end(); it++){//遍历的商品和这个商品一致减少库存if ((CString)it->name.c_str() == name) {//同步库存量it->num -= m_num;m_left = it->num;//控件上的库存量//告诉用户具体的购买信息CString str;str.Format(_T("商品: %s \r\n单价: %d  \r\n个数: %d \r\n总价: %d"), name, m_price, m_num, m_price*m_num);m_selfInfo = str;UpdateData(FALSE);MessageBox(L"购买成功");}

(9)、购买之后清空数据

(10)、数据写到文件中

我们购买之后库存并没有减少,所以我们要把数据写到文件中去

(11)、取消直接清空单价库存个数

void CSellDlg1::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码//取消按钮m_num = 0;UpdateData(FALSE);//默认选中第一个m_combo.SetCurSel(0);OnCbnSelchangeCombo1();//更新第一个商品里面的数据
}

12、添加商品的个数功能实现:

(1)UI设计

(2)、dlg添加类

(3)、控件添加变量

 商品添加变量

单价添加变量 

(4)、界面挂载

头文件引入

#include "ADddDlg.h"

实现挂载

else if (wParam == NM_D){//MessageBox(L"库存添加界面挂载");Context.m_pNewViewClass = RUNTIME_CLASS(ADddDlg);Context.m_pCurrentFrame = this;Context.m_pLastView = (CFormView *)m_spliter.GetPane(0, 1);m_spliter.DeleteView(0, 1);m_spliter.CreateView(0, 1, RUNTIME_CLASS(ADddDlg), CSize(600, 500), &Context);ADddDlg *pNewView = (ADddDlg *)m_spliter.GetPane(0, 1);m_spliter.RecalcLayout();pNewView->OnInitialUpdate();m_spliter.SetActivePane(0, 1);}

(5)、初始化界面

void ADddDlg::OnInitialUpdate()
{CFormView::OnInitialUpdate();// TODO: 在此添加专用代码和/或调用基类//初始化下拉框CInfoFile file;//把商品读到对象中file.ReadDocline();list<msg>::iterator it = file.ls.begin();for (; it != file.ls.end(); it++){//遍历商品容器,把容器放到下拉框中//string->CStringm_combo.AddString(CString(it->name.c_str()));}//默认选中第一个商品m_combo.SetCurSel(0);OnCbnSelchangeCombo1();//手动调用更新第一个商品数据
}void ADddDlg::OnCbnSelchangeCombo1()
{// TODO: 在此添加控件通知处理程序代码//先获取商品的名称int index = m_combo.GetCurSel();CString name;m_combo.GetLBText(index, name);CInfoFile file;//根据商品名称获取到商品的价格和库存,并且显示到控件中//把商品读到对象中file.ReadDocline();list<msg>::iterator it = file.ls.begin();for (; it != file.ls.end(); it++){if ((CString)it->name.c_str() == name){m_price1 = it->price;//同步到控件上UpdateData(FALSE);}}

(6)、添加功能实现

添加事件代码

void ADddDlg::OnBnClickedButton3()
{// TODO: 在此添加控件通知处理程序代码//添加商品按钮功能实现//拿到最新的数据UpdateData(TRUE);if (m_num1 <= 0){MessageBox(L"添加的数量必须大于0!");return;}//先获取你要添加的商品名称int indx = m_combo.GetCurSel();CString name;m_combo.GetLBText(indx, name);CInfoFile file;file.ReadDocline();list<msg>::iterator it = file.ls.begin();for (; it != file.ls.end(); it++){if ((CString)it->name.c_str() == name){//添加库存it->num += m_num1;m_num1 = 0;UpdateData(FALSE);MessageBox(L"添加成功!");}//把商品同步到文件中file.WriteDocline();}

运行效果

(7)、取消添加按钮事件

void ADddDlg::OnBnClickedButton4()
{// TODO: 在此添加控件通知处理程序代码m_num1 = 0;UpdateData(FALSE);m_combo.SetCurSel(0);OnCbnSelchangeCombo1();}

(8)、添加新商品的添加按钮

void ADddDlg::OnBnClickedButton5()
{// TODO: 在此添加控件通知处理程序代码//拿到最新的数据UpdateData(TRUE);//验证添加新商品//验证数据的有效性if (m_name2.IsEmpty() || m_num2 <= 0 || m_price2 <= 0) {MessageBox(L"你输入的信息有误!");return;}CInfoFile file;file.ReadDocline();file.Addline(m_name2, m_num2, m_price2);file.WriteDocline();MessageBox(L"商品添加成功!");//同步到左侧下拉框中m_combo.InsertString(0, m_name2);m_combo.SetCurSel(0);OnCbnSelchangeCombo1();//清空添加的新数据m_name2.Empty();m_num2 = 0;m_price2 = 0;UpdateData(FALSE);
}

(9)、添加商品的取消按钮

void ADddDlg::OnBnClickedButton6()
{// TODO: 在此添加控件通知处理程序代码m_num2 = 0;m_name2.Empty();m_price2 = 0;UpdateData(FALSE);}

相关文章:

使用MFC创建一个SaleSystem

目录 1、项目的创建&#xff1a; 2、项目的配置&#xff1a; 3、设置窗口属性&#xff1a; &#xff08;1&#xff09;、设置图标 1&#xff09;、添加导入资源 2&#xff09;、代码初始化图标 &#xff08;2&#xff09;、设置标题 &#xff08;3&#xff09;、设置窗口…...

grafana v10.1版本设置告警

1. 相关概念概述 如图所示&#xff0c;点击切换菜单标志&#xff0c;可以看到警报相关子选项。 警报规则&#xff1a;通过PromQL语句定义告警规则&#xff0c;即达到怎样的状态触发告警。 联络点&#xff1a; 设置当警报规则实例触发时&#xff0c;如何通知联系人&#xff0c;…...

Python+Requests+PyTest+Excel+Allure 接口自动化测试实战

本文主要介绍了PythonRequestsPyTestExcelAllure 接口自动化测试实战&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 Unittest是Python标准库中自带的单元测试框架…...

日志分析系统——ELK

目录 一、ELK概述 ELK的组成 1、ElasticSearch 2、Logstash 3、Kiabana 完整日志采集系统基本特征 ELK的工作原理 二、ELK的部署 1、环境准备 2、部署ElasticSearch软件 3、安装Elasticsearch-head插件 4、Logstash部署 5、Kibana部署 三、FilebeatELK部署 1、安…...

Ubuntu小知识总结

Ubuntu相关的小知识总结 一、Ubuntu系统下修改用户开机密码二、Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件的详细方法问题描述Vmware tools灰色不能安装解决方法小知识点&#xff1a;MarkDown的空格 三、Ubuntu虚拟机网络无法连接的几种解决方法1.重启网络编辑器2. 重启虚…...

2023年全球市场新能源汽车车载充电器总体规模、主要生产商、主要地区、产品和应用细分研究报告

按收入计&#xff0c;2022年全球新能源汽车车载充电器收入大约 百万美元&#xff0c;预计2029年达到 百万美元&#xff0c;2023至2029期间&#xff0c;年复合增长率CAGR为 %。同时2022年全球新能源汽车车载充电器销量大约 &#xff0c;预计2029年将达到 。2022年中国市场规模大…...

基于stm32控制的ESP8266在设备模式下通讯

一、文章中要用的指令 指令作用ATUART115200,8,1,0,0之前的51通讯是9600&#xff0c;这里的321用的是115200&#xff0c;需要改一下波特率ATCWMODEXX是1代表station&#xff08;设备&#xff09;模式 &#xff0c;X是2代表AP&#xff08;路由&#xff09;模式 &#xff0c;X是…...

用PHP组合数组,生成笛卡尔积。写几个例子

#创作灵感# [红色&#xff0c;白色&#xff0c;黄色&#xff0c;蓝色] [128G,256G,512G] [国行,港版,美版&#xff0c;韩版] 用PHP组合数组&#xff0c;生成笛卡尔积。写几个例子 你可以使用嵌套的循环来生成这些数组的笛卡尔积。以下是一些示例代码&#xff1a; // 示例…...

软设上午题错题知识点7

软设上午题错题知识点7 1、数据流图摆脱系统的物理内容&#xff0c;在逻辑上描述系统的功能、输入、输出和数据存储等&#xff0c;是系统逻辑模型的重要组成部分。 2、HTTPS&#xff08;Secure Hypertext Transfer Protocol&#xff09;安全超文本传输协议。 它是一个安全通信…...

让uniGUI支持https

今天在专家的帮助下&#xff0c;成功的让uniGUI支持https了。 首先&#xff0c;去申请个**的证书。我同事去阿里申请的&#xff0c;申请回是一个zip文件&#xff0c;里面有两个文件&#xff0c;一个扩展是per&#xff0c;一个key 然后&#xff0c;把这两个证书文件放到uniGUI…...

iPhone怎么导出微信聊天记录?3个值得收藏的方法

随着时间的推移&#xff0c;微信占用的内存空间会“膨胀”得越来越大。当手机内存不足时&#xff0c;清理微信中的聊天记录是一个可行的方法。但是很多小伙伴觉得有些重要的聊天记录还有用&#xff0c;可能以后需要进行查看。 因此&#xff0c;他们想将一些聊天记录进行导出或…...

【Proteus仿真】【STM32单片机】自动饲养控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1604显示模块、红外传感器、有害气体检测模块、PCF8591 ADC模块&#xff0c;蜂鸣器、DHT11温湿度、SG90舵机、风扇加热加湿等。 主要功能&a…...

【设计模式】模板方法模式

模板方法模式 1. 什么是模板方法 模板方法模式&#xff1a;定义一个操作中的算法骨架&#xff08;父类&#xff09;&#xff0c;而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构来重定义该算法的 2. 什么时候使用模板方法 实现一些操作时&#xff0c…...

c语言进制的转换二进制转换10进制

c语言进制的转换之二进制转换10进制 c语言的进制的转换 c语言进制的转换之二进制转换10进制一、二进制转换10进制的方法二、10进制程序打印 一、二进制转换10进制的方法 二进制&#xff1a; 二进制逢二进一&#xff0c;所有的数组是0、1组成 十进制转二进制&#xff1a; 除二反…...

C++ 纠错题总结2

1、for循环中的判断语句: 要注意初始赋值、< 还是 < for(int i 0; i < n; i) 2、cin.getline(char[], int, char) 注意&#xff1a;第二个参数为不是char[]的有效元素个数&#xff0c;因为最后一个元素位置要用来存储 \0 3、函数形参有默认值的&#xff0c;有默认…...

Jmeter性能 —— 事务控制器

统计性能测试结果一定会关注TPS&#xff0c;TPS表示&#xff1a;每秒处理事务数&#xff0c;JMeter默认每个事务对应一个请求。我们可以用逻辑控制器中的事务控制器将多个请求统计为一个事务。 1、添加事务控制器 2、事务控制器参数说明 Generate parent sample&#xff1a;如…...

Android C/C++ native编程NDK开发中logcat的使用

Android C/C native编程NDK开发中logcat的使用 前言具体用法 前言 在NDK开发过程中&#xff0c;C/C层&#xff0c;需要对代码进行一些调试&#xff0c;日志打印是我们解决异常或崩溃的重要手段&#xff0c;这里我就简单介绍下日志打印三步走。 首先我们先看下官方文档关于日志…...

什么是美颜SDK?深入了解直播实时美颜SDK

美颜已经成为了现代社交媒体和直播应用中的重要元素&#xff0c;它使用户能够在拍摄自拍照片或进行直播时改善其外貌特征。美颜技术的普及离不开美颜SDK&#xff08;软件开发工具包&#xff09;&#xff0c;特别是在直播应用中&#xff0c;直播实时美颜SDK正变得越来越流行。在…...

TensorFlow2从磁盘读取图片数据集的示例(tf.data.Dataset.list_files)

import os import warnings warnings.filterwarnings("ignore") import tensorflow as tf from tensorflow.keras.optimizers import Adam from tensorflow.keras.applications.resnet import ResNet50 from pathlib import Path import numpy as np#数据所在文件夹 …...

Jmeter(九):jmeter_逻辑控制器与HTTP Cookie管理器详解

Jmeter&#xff1a;jmeter_逻辑控制器_事务控制器 事务 性能测试中&#xff0c;事务指的是从端到端&#xff0c;一个完整的操作过程&#xff0c;比如一次登录、一次 筛选条件查询&#xff0c;一次支付等&#xff1b;技术上讲&#xff1a;事务就是由1个或多个请求组成的 事务…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...