C++实现通讯录管理系统

目录

1、系统需求

2、创建项目

2.1 创建项目

3、菜单功能

4、退出功能

5、添加联系人

5.1 设计联系人结构体

5.2 设计通讯录结构体

5.3 main函数中创建通讯录

5.4 封装联系人函数

5.5 测试添加联系人功能

6、显示联系人

6.1 封装显示联系人函数

7、删除联系人

7.1 封装检测联系人是否存在

7.2 封装删除联系人函数

8、查找联系人

8.1 封装查找联系人函数

9、修改联系人

9.1 封装修改联系人函数

10、清空联系人

10.1 封装清空联系人函数


1、系统需求

通讯录是一个可以记录亲人,好友信息的工具。

本教程主要利用C++来实现一个通讯录管理系统

系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人

  • 显示联系人:显示通讯录所有联系人信息

  • 删除联系人:按照姓名进行删除指定联系人

  • 查找联系人:按照姓名查看指定联系人信息

  • 修改联系人:按照姓名重新修改指定联系人

  • 清空联系人:清空通讯录中所有信息

  • 退出通讯录:退出当前使用的通讯录

2、创建项目

创建项目步骤如下:

  • 创建新项目

  • 添加文件

2.1 创建项目

打开vs2012,点击编辑新项目,创建新的C++项目

3、菜单功能

功能描述:用户选择功能的界面

菜单界面效果如下图:

 

步骤:

  • 封装函数显示该界面void showMenu ()

  • 在main函数中调用封装好的函数

代码:

//- 封装函数显示该界面void showMenu ()
//- 在main函数中调用封装好的函数
#include <iostream>
using namespace std;

//显示菜单页面
void showMenu()
{
	cout << "*************************" << endl;
	cout << "***** 1、添加联系人 *****" << endl;
	cout << "***** 2、显示联系人 *****" << endl;
	cout << "***** 3、删除联系人 *****" << endl;
	cout << "***** 4、查找联系人 *****" << endl;
	cout << "***** 5、修改联系人 *****" << endl;
	cout << "***** 6、清空联系人 *****" << endl;
	cout << "***** 0、退出通讯录 *****" << endl;
	cout << "*************************" << endl;
}


int main()
{
	//菜单调用
	showMenu();
	system("pause");
	return 0;
}

4、退出功能

功能描述:退出通讯录系统

思路:根据用户不同的选择,进入不同的功能,可以选择switch分支结构,将整个架构进行搭建

当用户选择0时候,执行退出,选择其他先不操作,也不退出程序。

int main()
{
	int select_num = 0;
	while (true)
	{
		//菜单调用
		showMenu();
		cin >> select_num;
		switch (select_num)
		{
		case 0:
			//0、退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		case 1:
			//1、添加联系人
			break;
		case 2:
			//2、显示联系人
			break;
		case 3:
			//3、删除联系人
			break;
		case 4:
			//4、查找联系人
			break;
		case 5:
			//5、修改联系人
			break;
		case 6:
			//6、清空联系人
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

效果图:

 

 

5、添加联系人

功能描述:

实现添加联系人功能,联系人上限为1000人,联系人信息包括(姓名、性别、年龄、联系电话、家庭住址)

添加联系人实现步骤:

  • 设计联系人结构体

  • 设计通讯录结构体

  • main函数中创建通讯录

  • 封装添加联系人函数

  • 测试添加联系人功能

5.1 设计联系人结构体

联系人信息包括:姓名、性别、年龄、联系电话、家庭住址

代码:

//联系人结构体
struct Contacts
{
	string name;//姓名
	int sex;//性别1-男  2-女
	int age;//年龄
	string phone_num;//电话号
	string home_place;//家庭住址
};

5.2 设计通讯录结构体

设计时候可以在通讯录结构体中,维护一个容量为1000的存放联系人的数组,并记录当前通讯录中联系人数量。

代码:

//通讯录结构体
struct Addrssbooks
{
	struct Contacts personArray[Max_size];//通讯录中保存的联系人数组
	int now_num; //现在的联系人个数
};

5.3 main函数中创建通讯录

添加联系人函数封装好后,在main函数中创建一个通讯录变量,这个就是我们需要一直维护的通讯录

//创建通讯录结构体变量
	Addrssbooks abs;
	//初识化通讯录中当前人员
	abs.now_num = 0;

5.4 封装联系人函数

思路:添加联系人前先判断通讯录是否已满,如果满了就不再添加,未满情况将新联系人信息逐个加入到通讯录

添加联系人代码:

//添加联系人
void addPerson (Addrssbooks * abs)
{
	//判断通讯录是否已满
	if (abs ->now_num >= Max_size)
	{
		cout << "通讯录已满,无法添加。" << endl;
		return;
	}
	else
	{
		//添加具体联系人
		//姓名
		string name;//姓名
		cout << "请输入姓名:" << endl;
		cin >> name;
		//将用户输入姓名加入到personArray数组中
		abs -> personArray[abs -> now_num].name = name;
		//性别
		int sex;
		while (true)
		{
			cout << "请输入性别:1-男 2-女 " << endl;
			//如果输入的是1或者2可以退出循环,因为输入的是正确数字
			//如果输入错误,继续输入
			cin >> sex;
			//将用户输入的性别加入到persongArray数组
			if(sex == 1 || sex == 2)
			{
				abs -> personArray[abs -> now_num].sex = sex;
				break;
			}
			else
			{
				cout << "您输入的是非法数字,请从新输入!" << endl;
			}
		}
		
		//年龄
		int age = 0;
		while (true)
		{
			cout << "请输入年龄:" << endl;
			cin >> age;
			if (age > 0)
			{
				abs -> personArray[abs -> now_num].age = age;
				break;
			}
			else
			{
				cout << "您输入正确的年龄!" << endl;
			}
		}
		//电话号
		cout << "请输入联系电话:" << endl;
		string phone;
		cin >> phone;
		abs -> personArray[abs -> now_num].phone_num = phone;
		//地址
		cout << "请输入家庭地址:" << endl;
		string addsplace;
		cin >> addsplace;
		abs -> personArray[abs -> now_num].home_place = addsplace;
		//更新通讯录人数
		abs -> now_num ++;
		cout << "添加成功!" << endl;

		system("pause");//任意键继续
		system ("cls");//任意键清屏
	}
}

5.5 测试添加联系人功能

选择界面中,如果玩家选择了1,代表添加联系人。我们可以测试下该功能

在switch case语句中,case1里添加:

case 1:
			//1、添加联系人
			addPerson(&abs);//利用地址传递可以修饰实参
			break;

效果图:

6、显示联系人

功能描述:显示通讯录通讯录中已有的联系人信息

显示联系人实现步骤:

  • 封装显示联系人函数

  • 测试显示联系人功能

6.1 封装显示联系人函数

思路:判断如果当前通讯录中没有人员,就提示记录为空,人数大于0,显示通讯录中信息

显示联系人代码:

//显示所有联系人
void showPerson(Addrssbooks * abs)
{
	//判断通讯录人数是否为空如果人数为空,提示记录为空
	//如果不为0,显示记录的联系人信息
	if(abs -> now_num == 0)
	{
		cout << "联系人为空。" << endl;
	}
	else
	{
		for (int i = 0; i < abs -> now_num; i++)
		{
			cout << "姓名:" << abs -> personArray[i].name << "\t";
			cout << "年龄:" << abs -> personArray[i].age << "\t";
			cout << "性别:" << (abs -> personArray[i].sex == 1 ? "男" : "女")<< "\t";
			cout << "电话号码;" << abs -> personArray[i].phone_num << "\t";
			cout << "家庭住址:" << abs -> personArray[i].home_place << endl;
		}
	}
	system("pause");//按任健继续
	system("cls");//清屏
}

效果图:

7、删除联系人

功能描述:按照姓名进行删除指定联系人

删除联系人实现步骤:

  • 封装检测联系人是否存在

  • 封装删除联系人函数

  • 测试删除联系人功能

7.1 封装检测联系人是否存在

设计思路:

删除联系人前,我们需要先判断用户输入的联系人是否存在,如果存在删除,不存在提示用户没有要删除的联系人

因此我们可以把检测联系人是否存在封装成一个函数中,如果存在,返回联系人在通讯录中的位置,不存在返回-1

//检测联系人是否存在,如果存在返回下标编号,不存在返回-1
//参数1 通讯录 参数2 对比姓名
int isExist(Addrssbooks * abs,string name)
{
	for (int i = 0; i < abs -> now_num; i++)
	{
		//找到用户输入姓名了
		if (abs -> personArray[i].name == name)
		{
			return i;
		}
		
	}
    return -1;//遍历结束都没有找到就返回-1
}

7.2 封装删除联系人函数

根据用户输入的联系人判断该通讯录中是否有此人

能找到进行删除,并提示删除成功

查不到提示查无此人

//删除指定联系人
void deletePerson(Addrssbooks * abs)
{
	cout << "请输入您要删除的联系人:" << endl;
	string name;
	cin >> name;
	//ret == -1 表示未查到
	//ret != -1 表示查到
	int ret = isExist(abs,name);
	if (ret != -1)
	{
		//查到此人,进行删除操作
		for (int i = ret; i < abs ->now_num; i++)
		{
			abs -> personArray[i] = abs -> personArray[i+1];
			
		}
		abs -> now_num --;
		cout << "删除成功!" << endl;
	}
	else
	{
		cout << "查无此人无法删除!" << endl;
	}
	system("pause");
	system("cls");
}

效果图:

 

8、查找联系人

功能描述:按照姓名查看指定联系人信息

查找联系人实现步骤

  • 封装查找联系人函数

  • 测试查找指定联系人

8.1 封装查找联系人函数

实现思路:判断用户指定的联系人是否存在,如果存在显示信息,不存在则提示查无此人

查找联系人代码:

//查找联系人
void findPerson(Addrssbooks * abs)
{
	cout << "请输入您要查找的联系人" << endl;
	string name;
	cin >> name;

	//判断联系人是否存在通讯录中
	int ret = isExist(abs,name);
	if (ret != -1)//找到联系人
	{
		cout << "姓名:" << abs -> personArray[ret].name << "\t";
		cout << "性别:" << abs -> personArray[ret].sex << "\t";
		cout << "年龄:" << abs -> personArray[ret].age << "\t";
		cout <<"电话号码:" << abs -> personArray[ret].phone_num << "\t";
		cout << "家庭地址:" << abs -> personArray[ret].home_place << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
}

效果图:

 

9、修改联系人

功能描述:按照姓名重新修改指定联系人

修改联系人实现步骤:

  • 封装修改联系人函数

  • 测试修改联系人功能

9.1 封装修改联系人函数

实现思路:查找用户输入的联系人,如果查找成功进行修改操作,查找失败提示查无此人

修改联系人代码:

//修改联系人
void modifyPerson(Addrssbooks * abs)
{
	cout << "请输入要修改的联系人姓名:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs,name);

	if (ret != -1)//找到指定联系人
	{
		//姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs -> personArray[ret].name = name;
		//性别
		
		int sex;
		while (true)
		{
			cout << "请输入要修改的性别:1-男  2-女" << endl;
			cin >> sex;
			if(sex == 1 || sex == 2)
			{
				abs -> personArray[ret].sex = sex;
				break;
			}
			else
			{
				cout << "输入错误,请重新输入。" << endl;
			}
		}
		//年龄
		cout << "请输入年龄:" << endl;
		int age;
		cin >> age;
		abs -> personArray[ret].age = age;
		
		//手机号
		string phone;
		cout << "请输入手机号:" << endl;
		cin >> phone;
		abs -> personArray[ret].phone_num = phone;

		//地址
		string address;
		cout << "请输入家庭住址:" << endl;
		cin >> address;
		abs -> personArray[ret].home_place = address;
		cout << "修改成功!" << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
	system ("pause");
	system ("cls");
}

效果图:

10、清空联系人

功能描述:清空通讯录中所有信息

清空联系人实现步骤:

  • 封装清空联系人函数

  • 测试清空联系人

10.1 封装清空联系人函数

实现思路:将通讯录所有联系人信息清除掉,只要将通讯录记录的联系人数量置为0,作逻辑清空即可。

清空联系人代码:

//清空联系人
void cleanPerson(Addrssbooks * abs)
{
	int confirm_num;
	while (true)
	{
		cout << "请再次确认您是否要清空通讯录?" << endl;
		cout << "1--确认     2--取消" << endl;
	
		cin >> confirm_num;
		if (confirm_num == 1)
		{
			abs -> now_num = 0;
			cout << "已将通讯录清空!" << endl;
			break;
		}
		else if(confirm_num == 2)
		{
			cout << "已取消清空通讯录操作!" << endl;
			break;
		}
		else
		{
			cout << "您输入的是非法操作!" << endl;
		}
	}
    system("pause");
	system("cls");
}

效果图:

所有程序代码:

//- 封装函数显示该界面void showMenu ()
//- 在main函数中调用封装好的函数
#include <iostream>
using namespace std;
#include <string>
#define Max_size 1000 //最大人数
//联系人结构体
struct Contacts
{
	string name;//姓名
	int sex;//性别1-男  2-女
	int age;//年龄
	string phone_num;//电话号
	string home_place;//家庭住址
};

//通讯录结构体
struct Addrssbooks
{
	struct Contacts personArray[Max_size];//通讯录中保存的联系人数组
	int now_num; //现在的联系人个数
};

//显示菜单页面
void showMenu()
{
	cout << "*************************" << endl;
	cout << "***** 1、添加联系人 *****" << endl;
	cout << "***** 2、显示联系人 *****" << endl;
	cout << "***** 3、删除联系人 *****" << endl;
	cout << "***** 4、查找联系人 *****" << endl;
	cout << "***** 5、修改联系人 *****" << endl;
	cout << "***** 6、清空联系人 *****" << endl;
	cout << "***** 0、退出通讯录 *****" << endl;
	cout << "*************************" << endl;
}

//添加联系人
void addPerson (Addrssbooks * abs)
{
	//判断通讯录是否已满
	if (abs ->now_num >= Max_size)
	{
		cout << "通讯录已满,无法添加。" << endl;
		return;
	}
	else
	{
		//添加具体联系人
		//姓名
		string name;//姓名
		cout << "请输入姓名:" << endl;
		cin >> name;
		//将用户输入姓名加入到personArray数组中
		abs -> personArray[abs -> now_num].name = name;
		//性别
		int sex;
		while (true)
		{
			cout << "请输入性别:1-男 2-女 " << endl;
			//如果输入的是1或者2可以退出循环,因为输入的是正确数字
			//如果输入错误,继续输入
			cin >> sex;
			//将用户输入的性别加入到persongArray数组
			if(sex == 1 || sex == 2)
			{
				abs -> personArray[abs -> now_num].sex = sex;
				break;
			}
			else
			{
				cout << "您输入的是非法数字,请从新输入!" << endl;
			}
		}
		
		//年龄
		int age = 0;
		while (true)
		{
			cout << "请输入年龄:" << endl;
			cin >> age;
			if (age > 0)
			{
				abs -> personArray[abs -> now_num].age = age;
				break;
			}
			else
			{
				cout << "您输入正确的年龄!" << endl;
			}
		}
		//电话号
		cout << "请输入联系电话:" << endl;
		string phone;
		cin >> phone;
		abs -> personArray[abs -> now_num].phone_num = phone;
		//地址
		cout << "请输入家庭地址:" << endl;
		string addsplace;
		cin >> addsplace;
		abs -> personArray[abs -> now_num].home_place = addsplace;
		//更新通讯录人数
		abs -> now_num ++;
		cout << "添加成功!" << endl;

		system("pause");//任意键继续
		system ("cls");//任意键清屏
	}
}

//显示所有联系人
void showPerson(Addrssbooks * abs)
{
	//判断通讯录人数是否为空如果人数为空,提示记录为空
	//如果不为0,显示记录的联系人信息
	if(abs -> now_num == 0)
	{
		cout << "联系人为空。" << endl;
	}
	else
	{
		for (int i = 0; i < abs -> now_num; i++)
		{
			cout << "姓名:" << abs -> personArray[i].name << "\t";
			cout << "年龄:" << abs -> personArray[i].age << "\t";
			cout << "性别:" << (abs -> personArray[i].sex == 1 ? "男" : "女")<< "\t";
			cout << "电话号码;" << abs -> personArray[i].phone_num << "\t";
			cout << "家庭住址:" << abs -> personArray[i].home_place << endl;
		}
	}
	system("pause");//按任健继续
	system("cls");//清屏
}

//检测联系人是否存在,如果存在返回下标编号,不存在返回-1
//参数1 通讯录 参数2 对比姓名
int isExist(Addrssbooks * abs,string name)
{
	for (int i = 0; i < abs -> now_num; i++)
	{
		//找到用户输入姓名了
		if (abs -> personArray[i].name == name)
		{
			return i;
			
		}
				
	}
	return -1;//遍历结束都没有找到就返回-1
	
}

//删除指定联系人
void deletePerson(Addrssbooks * abs)
{
	cout << "请输入您要删除的联系人:" << endl;
	string name;
	cin >> name;
	//ret == -1 表示未查到
	//ret != -1 表示查到
	int ret = isExist(abs,name);

	if (ret != -1)
	{
		//查到此人,进行删除操作
		for (int i = ret; i < abs -> now_num; i++)
		{
			abs -> personArray[i] = abs -> personArray[i+1];
			
		}
		abs -> now_num --;
		cout << "删除成功!" << endl;
	}
	else
	{
		cout << "查无此人无法删除!" << endl;
	}
	system("pause");
	system("cls");
}

//查找联系人
void findPerson(Addrssbooks * abs)
{
	cout << "请输入您要查找的联系人" << endl;
	string name;
	cin >> name;

	//判断联系人是否存在通讯录中
	int ret = isExist(abs,name);
	if (ret != -1)//找到联系人
	{
		cout << "姓名:" << abs -> personArray[ret].name << "\t";
		cout << "性别:" << abs -> personArray[ret].sex << "\t";
		cout << "年龄:" << abs -> personArray[ret].age << "\t";
		cout <<"电话号码:" << abs -> personArray[ret].phone_num << "\t";
		cout << "家庭地址:" << abs -> personArray[ret].home_place << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
}

//修改联系人
void modifyPerson(Addrssbooks * abs)
{
	cout << "请输入要修改的联系人姓名:" << endl;
	string name;
	cin >> name;
	int ret = isExist(abs,name);

	if (ret != -1)//找到指定联系人
	{
		//姓名
		string name;
		cout << "请输入姓名:" << endl;
		cin >> name;
		abs -> personArray[ret].name = name;
		//性别
		
		int sex;
		while (true)
		{
			cout << "请输入要修改的性别:1-男  2-女" << endl;
			cin >> sex;
			if(sex == 1 || sex == 2)
			{
				abs -> personArray[ret].sex = sex;
				break;
			}
			else
			{
				cout << "输入错误,请重新输入。" << endl;
			}
		}
		//年龄
		cout << "请输入年龄:" << endl;
		int age;
		cin >> age;
		abs -> personArray[ret].age = age;
		
		//手机号
		string phone;
		cout << "请输入手机号:" << endl;
		cin >> phone;
		abs -> personArray[ret].phone_num = phone;

		//地址
		string address;
		cout << "请输入家庭住址:" << endl;
		cin >> address;
		abs -> personArray[ret].home_place = address;
		cout << "修改成功!" << endl;
	}
	else
	{
		cout << "查无此人!" << endl;
	}
	system ("pause");
	system ("cls");
}

//清空联系人
void cleanPerson(Addrssbooks * abs)
{
	int confirm_num;
	while (true)
	{
		cout << "请再次确认您是否要清空通讯录?" << endl;
		cout << "1--确认     2--取消" << endl;
	
		cin >> confirm_num;
		if (confirm_num == 1)
		{
			abs -> now_num = 0;
			cout << "已将通讯录清空!" << endl;
			break;
		}
		else if(confirm_num == 2)
		{
			cout << "已取消清空通讯录操作!" << endl;
			break;
		}
		else
		{
			cout << "您输入的是非法操作!" << endl;
		}
	}
	system("pause");
	system("cls");
}
int main()
{
	//创建通讯录结构体变量
	Addrssbooks abs;
	//初识化通讯录中当前人员
	abs.now_num = 0;
	int select_num = 0;
	while (true)
	{
		//菜单调用
		showMenu();
		cin >> select_num;
		switch (select_num)
		{
		case 0:
			//0、退出通讯录
			cout << "欢迎下次使用" << endl;
			system("pause");
			return 0;
			break;
		case 1:
			//1、添加联系人
			addPerson(&abs);//利用地址传递可以修饰实参
			break;
		case 2:
			//2、显示联系人
			showPerson(&abs);
			break;
		case 3:
			{
				//3、删除联系人
				deletePerson(&abs);
				break;
			}
			
		case 4:
			//4、查找联系人
			findPerson(&abs);
			break;
		case 5:
			//5、修改联系人
			modifyPerson(&abs);
			break;
		case 6:
			//6、清空联系人
			cleanPerson(&abs);
			break;
		default:
			cout << "您选择的数字错误,请重新选择。" << endl;
			break;
		}
	}
	system("pause");
	return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Security简介

什么是Spring Security Spring Security是 Spring提供的安全认证服务的框架。 使用Spring Security可以帮助我 们来简化认证和授权的过程。 官网&#xff1a;Spring Security 对应的maven坐标&#xff1a; <!--security启动器--> <dependency><groupId>or…

Scala入门01

Spark入门 1.入门 spark采用Scala语言开发 Spark是用来计算的 Scala掌握&#xff1a;特性&#xff0c;基本操作&#xff0c;集合操作&#xff0c;函数&#xff0c;模式匹配&#xff0c;trait&#xff0c;样例类&#xff0c;actor等内容。 2.内容讲解 2.1 Scala简介 在http…

Missing or invalid credentials.(Git push报错解决方案)

前言 本文主要讲解git push后报错Missing or invalid credentials的解决方案。这里针对的是windows的。 编程环境&#xff1a;VsCode 问题原因 问题翻译起来就是 凭据缺失或无效。这里我们解决方案是取消vscode里面默认的控制终端git凭据来解决,具体方案如下. 解决方案 1…

金田金业:中国大妈十年炒黄金后有何启发? 黄金交易要有策略

十多年前的2013年中国大妈炒黄金曾威震华尔街&#xff0c;一度成为投资界佳话。当时经过经历2008年全球金融危机五年后随着美国经济持续改善、美国缩减量化宽松规模&#xff0c;在美元强力反弹压制下&#xff0c;国际现货黄金从1700美元下跌到1300美元左右。正是在这个相对低点…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

C++------高精度减法

题目描述&#xff1a; 分析&#xff1a; 一、A - B分两种情况&#xff1a; 当A>B ----> A - B&#xff1b;当A<B ----> -(B-A); 二、借位 t 的情况&#xff1a; t > 0 : 说明t不需要借位t < 0 : 说明 需要 t10 去补 AC代码如下&#xff1a; #in…

新建react项目,react-router-dom配置路由,引入antd

提示&#xff1a;reactrouter6.4版本&#xff0c;与reactrouter5.0的版本用法有区别&#xff0c;互不兼容需注意 文章目录 前言一、创建项目二、新建文件并引入react-router-dom、antd三、配置路由跳转四、效果五、遇到的问题六、参考文档总结 前言 需求&#xff1a;新建react项…

uniapp瀑布流实现

1. 图片瀑布流&#xff1a; 不依赖任何插件&#xff0c;复制即可见效&#xff1a; <template><view class"page"><view class"left" ref"left"><image class"image" v-for"(item,i) in leftList" :k…

使用Spring AOP做接口权限校验和日志记录

文章目录 一、AOP 介绍1.1 AOP 应用场景1.2 AOP 中的注解 二、权限校验2.1 定义权限注解2.2 定义切面类2.3 权限验证服务2.4 织入切点2.5 测试 三、日志记录3.1 日志切面类3.2 异常统一处理 四、AOP 底层原理4.1 todo 一、AOP 介绍 AOP&#xff1a; 翻译为面向切面编程&#x…

PMO和项目经理向老板提涨薪的成功秘籍有哪些?

一、PMO和项目经理向老板提涨薪的必备准备 作为PMO和项目经理&#xff0c;在向老板提涨薪之前&#xff0c;首先需要做好充分的准备。这不仅包括对自身工作的全面梳理&#xff0c;还需对公司目标、业务需求和市场环境有深刻的理解。了解公司目标意味着要清晰地了解公司对项目管…

ADC模数转换器

1. ADC模数转换器 ADC: 模数转换器 : 将模拟量转换为数字量 的 硬件设备 DAC: 数模转换器 : 将数字量转换为模拟量 1.1 工作原理 ADC: 工作原理 主要用于测量电压 1. 逐次逼近型CMOS: 结构一般 成本一般 转换一般 稳定性较低 即对精度要求不高,转换位数一般 成本低…

西瓜书学习笔记——层次聚类(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 层次聚类是一种将数据集划分为层次结构的聚类方法。它主要有两种策略&#xff1a;自底向上和自顶向下。 其中AGNES算法是一种自底向上聚类算法&#xff0c;用于将数据集划分为层次结构的聚类。算法的基本思想是从每个数据点开始&#xff0…

vue+elmentUI解决前端页面时间显示为一串数字

在该属性上添加注解 JsonFormat(pattern "yyyy-MM-dd HH:mm:ss") private Date createTime; 导入包 import com.fasterxml.jackson.annotation.JsonFormat; 效果

Python tkinter (12) —— Treeview控件

本文主要是Python tkinter Treeview控件介绍及使用简单示例。 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 Python tkinte…

【Docker Registry】docker 镜像仓库实战

Docker Registry 镜像仓库 (Docker Registry) 负责存储、管理和分发镜像&#xff0c;并且提供了登录认证能力&#xff0c;建立了仓库的索引。 镜像仓库管理多个 Repository&#xff0c; Repository 通过命名来区分。每个 Repository 包含一个或多个镜像&#xff0c;镜像通过镜…

如何使用Python+Flask搭建本地Web站点并结合内网穿透公网访问?

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

【Docker】docker安装jenkins

一、执行命令 下载jenkins镜像 #下载jenkins 镜像 docker pull jenkins/jenkins:latest-jdk8 启动jenkins容器 #启动jenkins 容器 #挂载 如果不挂载 每次启动jenkins的配置、插件、用户等信息都没有了 #jenkins_home 包含jenkins配置、插件、用户等信息。 要指定必须配置用…

【日志框架】

日志打印 建议用{}占位而不是字符串拼接打日志前先判断日志级别是否可用&#xff1a; 先根据等级过滤规则再决定写不写&#xff1b;先往一个管道写了内容&#xff0c;但再经等级过滤丢弃&#xff0c;徒增开销。 日志框架 Slf4J Slf4J 不是底层日志框架&#xff0c;只是门面…

STL_list

一、有关list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。Ii…

elasticsearch8.x版本docker部署说明和集成springboot

前提&#xff0c;当前部署没有涉及证书和https访问 1、环境说明,我采用三个节点&#xff0c;每个节点启动两个es&#xff0c;用端口区分 主机角色ip和端口服务器Amaster192.168.2.223:9200服务器Adata192.168.2.223:9201服务器Bdata,master192.168.2.224:9200服务器Bdata192.1…