植物大战僵尸杂交版破解C++实现

news2024/11/15 12:47:23

文章目录

  • 前言
  • 准备工作:基地址与偏移
  • UI界面设计和绑定
    • 项目模板
    • 总览图
    • 生成与实现
    • 信号处理
      • 1、阳光值更新:BTN1
      • 2、三种钱币值更新:BTN2-BTN4
      • 3、冷却刷新:BTN5
      • 4、锁定阳光:check1
      • 5、无冷却:check2
      • 6、OnTimer()和OnClose()处理函数
      • 7、其余未描述部分参考

前言

最近出来的PVZ杂交版又掀起一波热潮,在各大短视频平台也有一席之地,借助工具Cheat Engine,写了个简单的植物大战僵尸杂交版破解程序,话不多说,我们来看如何实现的。
工具:Cheat Engine、visual studio (MFC支持)、植物大战僵尸杂交版

准备工作:基地址与偏移

通过CE寻找基地址的工作可以参考其他人的博客:
通过CE寻找游戏基址1
通过CE寻找游戏基址2
这里直接给出对应内容:【基址+偏移】
阳光值:0x006A9EC0 + 0x00000768 + 0x00005560
银币值:0x006A9EC0 + 0x0000082C + 0x00000208
金币值:0x006A9EC0 + 0x0000082C + 0x0000020C
钻石值:0x006A9EC0 + 0x0000082C + 0x00000210
冷却值:0x006A9EC0 + 0x00000768 + 0x00000144 +{
0x00000070, 0x000000C0, 0x00000110, 0x00000160,
0x000001B0, 0x00000200, 0x00000250, 0x000002A0,
0x000002F0, 0x00000340, 0x00000390, 0x000003E0,
0x00000430, 0x00000480, 0x000004D0, 0x00000520
对应卡牌栏目第几章卡牌,索引就是几,实际上卡牌不会超过14张,只要给出14个就行了,找到前几个偏移量之后可以按照规律往后推测。
}

UI界面设计和绑定

项目模板

使用MFC应用程序,选择基于对话框选项

总览图

UI设计图

生成与实现

1、依此双击按钮、单选框,studio会自动建立信号与函数的映射。
2、Dlg.h中添加成员变量:

public:
UINT sunvalue;	//阳光
UINT money_a;	//银币
UINT money_b;	//金币
UINT money_c;	//钻石
int check1;		//锁定阳光	check 的状态
int check2;		//无冷却	check 的状态

3、Dlg.cpp中进行内容绑定:

void CPVZCrackerDlg::DoDataExchange(CDataExchange* pDX){
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, sunvalue);	//将edit1的内容与sunvalue绑定,以下同理
	DDX_Text(pDX, IDC_EDIT2, money_a);	
	DDX_Text(pDX, IDC_EDIT3, money_b);	
	DDX_Text(pDX, IDC_EDIT4, money_c);	
	DDX_Check(pDX, CHECK1, check1);
	DDX_Check(pDX, CHECK2, check2);
}

4、如何让check选择时,实现阳光锁定和刷新冷却呢?
可以在check勾选时,开启定时器,每隔0.5s进行模拟点击刷新事件来达到效果
因此需要引入定时器模块,给出相关博客(主要参考2)
MFC中如何使用定时器:1
MFC中如何使用定时器:2
创建出void XXXXXDlg::OnTimer(UINT_PTR nIDEvent)。
当勾选状态时,打开计时器,未勾选状态时,关闭计时器即可

5、经过上面的操作后,Dlg.h内容大致如下:


// PVZCrackerDlg.h: 头文件
//

#pragma once

// CPVZCrackerDlg 对话框
class CPVZCrackerDlg : public CDialogEx
{
// 构造
public:
	CPVZCrackerDlg(CWnd* pParent = nullptr);	// 标准构造函数
	UINT sunvalue;	//阳光
	UINT money_a;	//银币
	UINT money_b;	//金币
	UINT money_c;	//钻石
	int check1;		//锁定阳光	check 的状态
	int check2;		//无冷却	check 的状态
// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_PVZCRACKER_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButton3();
	afx_msg void OnBnClickedButton4();
	afx_msg void OnBnClickedButton5();

	afx_msg void OnBnClickedCheck1();
	afx_msg void OnBnClickedCheck2();
	afx_msg void OnTimer(UINT_PTR nIDEvent);

	int TIM_X ;
	afx_msg void OnClose();
};

信号处理

1、阳光值更新:BTN1

void CPVZCrackerDlg::OnBnClickedButton1(){
	// 修改阳光
	UpdateData(TRUE);	//先进行数据更新
	HWND PVZ;			//获取窗口句柄
	PVZ = ::FindWindow(L"MAINWINDOW", L"植物大战僵尸杂交版v2.0");//这里需要对应游戏窗口名。
	DWORD pid = 0;
	GetWindowThreadProcessId(PVZ, &pid);	//获取进程id
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);//打开进程,获取所有权

	SIZE_T ipread = 0;           //下面要用的参数,实际上往往忽略,但不写又不行

	DWORD base = 0x006A9EC0;	 //数据基地址偏移量等由CE给出。
	DWORD offset1 = 0x00000768;
	DWORD offset2 = 0x00005560;
	//[A]->B 表示将A地址里的值拿到B中,不加[]代表立即数下文同理,如有错误欢迎指正
	//[base]->sunbase
	DWORD sunbase = 0;
	ReadProcessMemory(handle, LPCVOID(base), &sunbase, sizeof(DWORD), &ipread);

	//[sunbase+offset1]->sunoffset1
	DWORD sunoffset1 = 0;
	ReadProcessMemory(handle, LPCVOID(sunbase + offset1), &sunoffset1, sizeof(DWORD), &ipread);

	//sunvalue -> [sunoffset1+offset2]
	DWORD svalue = sunvalue;
	WriteProcessMemory(handle, LPVOID(sunoffset1 + offset2), &svalue, sizeof(DWORD), &ipread);
}

2、三种钱币值更新:BTN2-BTN4

void CPVZCrackerDlg::OnBnClickedButton2(){
	// TODO: 在此添加控件通知处理程序代码
	// 修改银币
	UpdateData(TRUE);
	HWND PVZ;
	PVZ = ::FindWindow(L"MAINWINDOW", L"植物大战僵尸杂交版v2.0");
	DWORD pid = 0;
	GetWindowThreadProcessId(PVZ, &pid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

	SIZE_T ipread = 0;           //下面要用的参数

	DWORD base = 0x006A9EC0;	 //数据基地址偏移量等由CE给出。
	DWORD offset1 = 0x0000082C;
	DWORD offset2 = 0x00000208;

	//[base]->moneybase
	DWORD moneybase = 0;
	ReadProcessMemory(handle, LPCVOID(base), &moneybase, sizeof(DWORD), &ipread);

	//[moneybase+offset1]->moneyoffset1
	DWORD moneyoffset1 = 0;
	ReadProcessMemory(handle, LPCVOID(moneybase + offset1), &moneyoffset1, sizeof(DWORD), &ipread);

	//money_a -> [moneyoffset1+offset2]
	DWORD svalue = money_a;
	WriteProcessMemory(handle, LPVOID(moneyoffset1 + offset2), &svalue, sizeof(DWORD), &ipread);
}
void CPVZCrackerDlg::OnBnClickedButton3(){
	// TODO: 在此添加控件通知处理程序代码
	// 修改金币
	UpdateData(TRUE);
	HWND PVZ;
	PVZ = ::FindWindow(L"MAINWINDOW", L"植物大战僵尸杂交版v2.0");
	DWORD pid = 0;
	GetWindowThreadProcessId(PVZ, &pid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

	SIZE_T ipread = 0;           //下面要用的参数

	DWORD base = 0x006A9EC0;	 //数据基地址偏移量等由CE给出。
	DWORD offset1 = 0x0000082C;
	DWORD offset2 = 0x0000020C;

	//[base]->moneybase
	DWORD moneybase = 0;
	ReadProcessMemory(handle, LPCVOID(base), &moneybase, sizeof(DWORD), &ipread);

	//[moneybase+offset1]->moneyoffset1
	DWORD moneyoffset1 = 0;
	ReadProcessMemory(handle, LPCVOID(moneybase + offset1), &moneyoffset1, sizeof(DWORD), &ipread);

	//money_b -> [moneyoffset1+offset2]
	DWORD svalue = money_b;
	WriteProcessMemory(handle, LPVOID(moneyoffset1 + offset2), &svalue, sizeof(DWORD), &ipread);
}


void CPVZCrackerDlg::OnBnClickedButton4(){
	// TODO: 在此添加控件通知处理程序代码
	// 修改钻石
	UpdateData(TRUE);
	HWND PVZ;
	PVZ = ::FindWindow(L"MAINWINDOW", L"植物大战僵尸杂交版v2.0");
	DWORD pid = 0;
	GetWindowThreadProcessId(PVZ, &pid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

	SIZE_T ipread = 0;           //下面要用的参数

	DWORD base = 0x006A9EC0;	 //数据基地址偏移量等由CE给出。
	DWORD offset1 = 0x0000082C;
	DWORD offset2 = 0x00000210;

	//[base]->moneybase
	DWORD moneybase = 0;
	ReadProcessMemory(handle, LPCVOID(base), &moneybase, sizeof(DWORD), &ipread);

	//[moneybase+offset1]->moneyoffset1
	DWORD moneyoffset1 = 0;
	ReadProcessMemory(handle, LPCVOID(moneybase + offset1), &moneyoffset1, sizeof(DWORD), &ipread);

	//money_a -> [moneyoffset1+offset2]
	DWORD svalue = money_c;
	WriteProcessMemory(handle, LPVOID(moneyoffset1 + offset2), &svalue, sizeof(DWORD), &ipread);
}

3、冷却刷新:BTN5

void CPVZCrackerDlg::OnBnClickedButton5(){
	// 修改冷却
	UpdateData(TRUE);
	HWND PVZ;
	PVZ = ::FindWindow(L"MAINWINDOW", L"植物大战僵尸杂交版v2.0");
	DWORD pid = 0;
	GetWindowThreadProcessId(PVZ, &pid);
	HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

	SIZE_T ipread = 0;           //下面要用的参数

	DWORD base = 0x006A9EC0;	 //数据基地址偏移量等由CE给出。
	DWORD offset1 = 0x00000768;
	DWORD offset2 = 0x00000144;
	DWORD offset3[16] = {
		0x00000070, 0x000000C0, 0x00000110, 0x00000160,
		0x000001B0, 0x00000200, 0x00000250, 0x000002A0,
		0x000002F0, 0x00000340, 0x00000390, 0x000003E0,
		0x00000430, 0x00000480, 0x000004D0, 0x00000520
	};

	//[base]->freshbase
	DWORD freshbase = 0;
	ReadProcessMemory(handle, LPCVOID(base), &freshbase, sizeof(DWORD), &ipread);

	//[freshbase+offset1]->freshoffset1
	DWORD freshoffset1 = 0;
	ReadProcessMemory(handle, LPCVOID(freshbase + offset1), &freshoffset1, sizeof(DWORD), &ipread);

	//[freshoffset1+offset2]->freshoffset2
	DWORD freshoffset2 = 0;
	ReadProcessMemory(handle, LPVOID(freshoffset1 + offset2), &freshoffset2, sizeof(DWORD), &ipread);

	//1 ->[freshoffset2+offset3]
	DWORD freshvalue = 1;	//1代表冷却完毕	其他代表正在冷却
	for (int i = 0; i < 16; ++i)
		WriteProcessMemory(handle, LPVOID(freshoffset2 + offset3[i]), &freshvalue, sizeof(DWORD), &ipread);
}

4、锁定阳光:check1

void CPVZCrackerDlg::OnBnClickedCheck1(){
	// TODO: 在此添加控件通知处理程序代码
	CButton* pBtn = (CButton*)GetDlgItem(CHECK1);
	int checked = pBtn->GetCheck();	//获取check状态
	//实际上可以直接check1
	switch (checked){
	case 1: {
		SetTimer(1, 500, NULL);	//设置500ms为周期的定时器,标签为1,并开启
		break;
	}
	case 0: {
		KillTimer(1);			//关闭标签为1的定时器
		break;
	}
	default:
		break;
	}
}

5、无冷却:check2

void CPVZCrackerDlg::OnBnClickedCheck2(){
	// TODO: 在此添加控件通知处理程序代码
	CButton* pBtn = (CButton*)GetDlgItem(CHECK2);
	int checked = pBtn->GetCheck();

	switch (checked) {
	case 1: {
		SetTimer(2, 500, NULL);
		break;
	}
	case 0: {
		KillTimer(2);
		break;
	}
	default:
		break;
	}
}

6、OnTimer()和OnClose()处理函数

void CPVZCrackerDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	switch (nIDEvent){
	case 1: OnBnClickedButton1(); break;
	case 2: OnBnClickedButton5(); break;
	default:
		break;
	}
	CDialogEx::OnTimer(nIDEvent);
}


void CPVZCrackerDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	KillTimer(1);
	KillTimer(2);
	CDialogEx::OnClose();
}

7、其余未描述部分参考


// PVZCrackerDlg.cpp: 实现文件
#include "pch.h"
#include "framework.h"
#include "PVZCracker.h"
#include "PVZCrackerDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CPVZCrackerDlg 对话框
CPVZCrackerDlg::CPVZCrackerDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PVZCRACKER_DIALOG, pParent){
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	check1 = 0;
	check2 = 0;
	sunvalue = 5000;
	money_a = 10000;
	money_b = 10000;
	money_c = 10000;
	TIM_X = 0;
}

void CPVZCrackerDlg::DoDataExchange(CDataExchange* pDX){
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, sunvalue);	//将edit1的内容与sunvalue绑定,以下同理
	DDX_Text(pDX, IDC_EDIT2, money_a);	
	DDX_Text(pDX, IDC_EDIT3, money_b);	
	DDX_Text(pDX, IDC_EDIT4, money_c);	
	DDX_Check(pDX, CHECK1, check1);
	DDX_Check(pDX, CHECK2, check2);
}

BEGIN_MESSAGE_MAP(CPVZCrackerDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CPVZCrackerDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CPVZCrackerDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CPVZCrackerDlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &CPVZCrackerDlg::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON5, &CPVZCrackerDlg::OnBnClickedButton5)

	
	ON_BN_CLICKED(CHECK1, &CPVZCrackerDlg::OnBnClickedCheck1)
	ON_BN_CLICKED(CHECK2, &CPVZCrackerDlg::OnBnClickedCheck2)
	ON_WM_TIMER()
	ON_WM_CLOSE()
END_MESSAGE_MAP()


// CPVZCrackerDlg 消息处理程序

BOOL CPVZCrackerDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	this->SetWindowTextW(L"植物大战僵尸杂交版破解 by 和八哥的环球探险");
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,这将由框架自动完成。

void CPVZCrackerDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CPVZCrackerDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

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

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

相关文章

数 据 类 型

概述 Java 是强类型语言。 每一种数据都定义了明确的数据类型&#xff0c;在内存中分配了不同大小的内存空间&#xff08;字节&#xff09;。 Java 中一共有 8 种基本类型&#xff08;primitive type&#xff09;&#xff0c;包括 4 种整型、2 种浮点型、1 种字符类型&#…

【C语言】07.函数

一、概念 C语言的函数&#xff0c;有些翻译为&#xff1a;子程序&#xff0c;子程序这种翻译更加准确⼀些。 C语言中的函数就是⼀个完成某项特定的任务的⼀小段代码。这段代码是有特殊的写法和调用方法的。 C语言的程序其实是由无数个小的函数组合而成的&#xff0c;也可以说&…

什么是SIEM

SIEM 解决方案是一种企业级应用程序&#xff0c;可集中和自动化与网络安全相关的操作&#xff0c;该工具通过收集、分析和关联从组织 IT 基础设施中的各种实体聚合的网络事件来帮助应对网络威胁。 与帮助监控和评估组织物理空间中的危险的监视控制台相比&#xff0c;SIEM解决方…

【百万字详解Redis】主从复制

文章目录 一、主从复制概述1.1、单机问题1.1.1、机器宕机1.1.2、容器瓶颈1.1.3、QPS瓶颈 1.2、什么是主从复制1.3、主从复制形式1.3.1、一主一从1.3.2、一主多从 1.4、主从复制作用 二、单机主从2.1、复制redis.conf2.2、配置主机2.3、配置从机2.4、启动服务2.5、读写分离 三、…

[工具探索]富士mini90拍立得使用指南

文章目录 1. 基本功能介绍1.1 相机外观1.2 电池与胶片 2. 设置相机2.1 装入电池2.2 装入胶片 3. 拍摄模式3.1 标准模式3.2 儿童模式3.3 远景模式3.4 双重曝光模式3.5 Bulb&#xff08;B&#xff09;模式3.6 **派对模式**3.7 微距模式3.8 **亮度模式**3.9 **定时拍摄模式**3.10 …

php探针代码怎么写

创建php文件并输入代码&#xff0c;访问文件查看php版本、环境和系统配置信息&#xff0c;可使用ini_set()函数定制输出&#xff0c;但注意在生产环境中使用时要注重安全&#xff0c;因为它会泄露敏感信息。 PHP探针代码撰写指南 PHP探针代码是一种脚本&#xff0c;可提供关于…

基于Java Mq的数据交换平台实现_设计消息的格式和内容

基于Java Mq的数据交换平台实现 目录概述需求&#xff1a; 设计思路实现思路分析 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challen…

FileZilla:不安全的服务器,不支持 FTP over TLS 原因与解决方法

今天在用FileZilla Client连接某个主机的FTP的时候&#xff0c;主机地址、账号、密码、端口确定百分之百正确的情况下&#xff0c;结果报错如下&#xff1a; 状态: 正在解析 x.x.x 的地址 状态: 正在连接 x.x.x.x:21... 状态: 连接建立&#xff0c;等待欢迎消息... 状态: 不安全…

6.6SSH的运用

ssh远程管理 ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 22 网络层 传输层 数据传输的过程中是加密的 …

Java Web学习笔记19——Ajax介绍

Ajax: 概念&#xff1a;Asynchronous JavaScript And XML 异步的JavaScript和XML。 作用&#xff1a; 1&#xff09;数据交换&#xff1a;通过Ajax可以给服务器发送请求&#xff0c;并获得服务器的响应数据。 2&#xff09;异步交互&#xff1a;可以在不重新加载页面的情况…

【NetTopologySuite类库】生成凸包

介绍 计算几何体的凸包。凸包是最小的凸几何体&#xff0c;包含输入几何体中的所有点。使用Graham Scan算法。 API地址&#xff1a; https://nettopologysuite.github.io/NetTopologySuite/api/NetTopologySuite.Algorithm.ConvexHull.html 示意图 示例代码 需在NuGet中安装…

nomachine使用记录以及录包

录包命令&#xff1a; rosbag record 话题名字&#xff08;可以是原相机话题和执行程序的话题&#xff09;rosbag play 包名&#xff08;可以离线播放包的数据&#xff09; rqt_image_view 话题可视化

新买的移动硬盘无法识别

文章目录 背景解决方案 背景 同事新买的移动硬盘&#xff0c;插在电脑上识别不出来盘符&#xff0c;检查了一下&#xff0c;硬盘没问题应该&#xff0c;是ssk的硬盘盒M.2的SSD&#xff0c;硬盘驱动也是正常的&#xff0c;插拔了几次&#xff0c;都不识别&#xff0c;换了太电脑…

未见过类型题每周总结(个人向)

1.DP40 小红取数 题目 解析 一道01背包的衍生问题&#xff0c;我们可以按照它的思路定义数组dp[i][j],表示前i个数中%k为j的最大和。为什么设置未%k的最大和呢&#xff1f;是因为当两个数分别%k&#xff0c;如a%kx&#xff0c;b%ky。那么&#xff08;ab&#xff09;%k&#…

FENDI CLUB精酿啤酒品鉴体验

当提及“品质卓越&#xff0c;口感非凡”的啤酒时&#xff0c;FENDI CLUB精酿啤酒无疑是一个值得一试的选择。这款啤酒以其独特的酿造工艺和优质的原料&#xff0c;为消费者带来了与众不同的味觉享受。 一、独特的酿造工艺 FENDI CLUB精酿啤酒在酿造过程中&#xff0c;严格遵循…

关于 spring boot 的 目录详解 和 配置文件 以及 日志

目录 配置文件 spring boot 的配置文件有两种格式&#xff0c;分别是 properties 和 yml&#xff08;yaml&#xff09;。这两种格式的配置文件是可以同时存在的&#xff0c;此时会以 properties 的文件为主&#xff0c;但一般都是使用同一种格式的。 格式 properties 语法格…

使用 Django 创建 App

文章目录 步骤 1&#xff1a;创建 Django 项目步骤 2&#xff1a;创建 App步骤 3&#xff1a;配置 App步骤 4&#xff1a;编写代码步骤 5&#xff1a;运行服务器 在 Django 中&#xff0c;App 是组织代码的基本单元&#xff0c;它可以包含模型、视图、模板等组件&#xff0c;帮…

Hadoop的Windows环境准备

一、将Hadoop传输到Windows中 1、备份副本 cp -r /opt/softs/hadoop3.1.3/ /opt/softs/hadoop3.1.3_temp 2、删除备份的share目录 cd /opt/softs/hadoop3.1.3_temp rm -rf share/ 3、下载到Windows中 重命名去掉_temp 4、删除备份文件 rm -rf /opt/softs/hadoop3.1.3_t…

Redis到底支不支持事务?

文章目录 一、概述二、使用1、正常执行&#xff1a;2、主动放弃事务3、全部回滚:4、部分支持事务:5、WATCH: 三、事务三阶段四、小结 redis是支持事务的&#xff0c;但是它与传统的关系型数据库中的事务是有所不同的 一、概述 概念: 可以一次执行多个命令&#xff0c;本质是一…

如何提高网站排名?

提高网站排名是一个复杂的过程&#xff0c;涉及到多个方面的优化&#xff0c;包括但不限于内容质量、网站结构、用户体验、外部链接建设等&#xff0c;GSR这个系统&#xff0c;它是一种快速提升关键词排名的方案&#xff0c;不过它有个前提&#xff0c;就是你的站点在目标关键词…