【C++】 小项目---宠物小屋的分析设计与开发实现

news2024/11/14 0:38:37

目录

需求

分析设计

动物类

 笼子类

房子类

人类

小贴士

 整体设计图

开发实现

动物类

笼子类

房子类

人类

小贴士

控制台主函数


需求

动物猫(CCat)、狗(CDog)、蛇(CSnake),包含名字(m_strName)、颜色(m_strColor)、年龄(m_nAge)。
笼子类(CCage):它负责装3种动物,每个笼子有对应的编号。
房子类(CHouse):负责存放装动物的笼子。
人(CPeople):负责花钱买动物,造笼子,将动物放到笼子中,存放到房子里,杀死某个笼子动物,销毁某个笼子(如果有动物一并销毁),
查看某个或所有笼子动物,和某个动物玩耍。

控制台程序,通过输入命令,可以进行简单的人机交互。

分析设计

动物类

由于猫狗蛇有着许多共同的属性,所以我们选择创建一个动物类作为他们的父类,用继承和多态来实现他们的关系。

  • 它的成员属性包括:名字、颜色、年龄
  • 成员函数包括:初始化、玩耍、展示

 笼子类

它与动物类的关系是关联的关系

  • 成员属性:笼子编号、装的动物
  • 成员函数:笼子初始化、向笼子中装动物

房子类

 它与笼子类是聚合的关系

  • 成员属性:存放笼子的链表
  • 成员函数:向房子中装笼子

人类

它与动物类、笼子类和房子类是依赖的关系

  • 成员属性:姓名、钱
  • 成员函数:初始化、买动物、造笼子、将动物放在笼子里、将笼子放在房子里、清除笼子中的动物、销毁笼子、查看所有笼子、查看某一个笼子、和某个动物去玩、显示人物信息

小贴士

最后我们创建了一个小贴纸,将枚举类型和宏定义放在了里面

  • 枚举动物的种类,宏定义动物的价格和人的钱

 整体设计图

 

开发实现

动物类

  • 父类
//CAnimal.h
#pragma once
#include <string>
#include <iostream>
using namespace std;

class CAnimal
{
public:
	string m_strName;
	string m_strColor;
	int m_nAge;
public:
	CAnimal();
	virtual ~CAnimal(); //虚析构
	void initAni(string name, string color, int age);
	virtual void PlayAni() = 0;
	void ShowAni();

};
//CAnimal.cpp
#include "CAnimal.h"

CAnimal::CAnimal():m_nAge(0)
{
}

CAnimal::~CAnimal()
{
}

void CAnimal::initAni(string name, string color, int age)
{
	m_strName = name;
	m_strColor = color;
	m_nAge = age;
}

void CAnimal::ShowAni()
{
	cout << "name: " << m_strName << ", color: " << m_strColor << ", age" << m_nAge << endl;
}
  • 三个子类

狗:

//CDog.h
#pragma once
#include "CAnimal.h"
class CDog :public CAnimal
{
public:
	virtual void PlayAni();
};

//CDog.cpp
#include "CDog.h"

void CDog::PlayAni()
{
	cout << "汪~汪~汪,去啃骨头" << endl;
}

猫:

//CCat.h
#pragma once
#include "CAnimal.h"
class CCat :public CAnimal
{
public:
	virtual void PlayAni();
};

//CCat.cpp
#include "CCat.h"

void CCat::PlayAni()
{
	cout << "喵~喵~喵,捞鱼吃" << endl;
}

蛇:

//CSnake.h
#pragma once
#include "CAnimal.h"
class CSnake :public CAnimal
{
public:
	virtual void PlayAni();
};
//CSnake.cpp
#include "CSnake.h"

void CSnake::PlayAni()
{
	cout << "嘶~嘶~嘶,吃老鼠" << endl;
}

笼子类

//CCage.h
#pragma once
#include "CAnimal.h"
class CCage
{
public:
	int m_id;
	CAnimal* m_pAni;
public:
	CCage();
	~CCage();

	void InitCage(int id);
	void PushAnimal(CAnimal* pAni);
};

//CCage.cpp
#include "CCage.h"

CCage::CCage():m_id(0),m_pAni(nullptr)
{
}

CCage::~CCage()
{
}

void CCage::InitCage(int id)
{
	m_id = id;
}

void CCage::PushAnimal(CAnimal* pAni)
{
	if (pAni) {
		m_pAni = pAni;
	}
}

房子类

//CHouse.h
#pragma once
#include<list>
#include "CCage.h"
using namespace std;

class CHouse
{
public:
	list<CCage*> m_lstCage;
public:
	CHouse();
	~CHouse();
	void PushCage(CCage* pCage);
};

//CHouse.cpp
#include "CHouse.h"

CHouse::CHouse()
{
}

CHouse::~CHouse()
{
	list<CCage* >::iterator ite = m_lstCage.begin();
	while (ite != m_lstCage.end()) {
		if ((*ite)) {  //笼子不为空

			if ((*ite)->m_pAni) {  //如果存在动物
				delete(*ite)->m_pAni;  //销毁动物
				(*ite)->m_pAni = nullptr;
			}

			delete(*ite);  //销毁笼子
			(*ite) = nullptr;
		}
		ite++;
	}

	m_lstCage.clear();   //清空节点

}

void CHouse::PushCage(CCage* pCage)
{
	if (pCage) m_lstCage.push_back(pCage);
}

人类

//CPeople.h
#pragma once
#include "CHouse.h"
#include "config.h"

class CPeople
{
public:
	string m_name;
	int m_money;
public:
	CPeople();
	~CPeople();
	void InitPeople(string name, int money);
	bool BuyAnimal(CAnimal* pAni, ani_kind kind);
	CCage* CreatCage();
	void PushAniToCage(CCage* pCage, CAnimal* pAni);
	void PushCageToHouse(CHouse* pHouse, CCage* pCage);
	void KillAnimal(CHouse* pHouse, int id);
	void DestoryCage(CHouse* pHouse, int id);
	void LookAll(CHouse* pHouse);
	void LookOne(CHouse* pHouse, int id);
	void PlayWithAnimal(CHouse* pHouse, int id);
	void showPeople();

};

//CPeople.cpp
#include "CPeople.h"

CPeople::CPeople():m_money(0)
{
}

CPeople::~CPeople()
{
}

void CPeople::InitPeople(string name, int money)
{
	m_name = name;
	m_money = money;
}

#define BUY_ANIMAL(ANI_PRICE)\
		if (m_money - ANI_PRICE >= 0) {\
		m_money -= ANI_PRICE;\
		}\
		else {\
			cout << "穷鬼~,钱不够买动物了" << endl;\
			return false;\
		}

bool CPeople::BuyAnimal(CAnimal* pAni, ani_kind kind)
{
	if (!pAni) {
		cout << "动物的指针为空" << endl;
		return false;
	}

	switch (kind) 
	{
	case ani_kind::ani_dog:
	{
	/*	if (m_money - DOG_PRICE >= 0) {
			m_money -= DOG_PRICE;
		}
		else {
			cout << "穷鬼~,钱不够买动物了" << endl;
			return false;
		}*/
		BUY_ANIMAL(DOG_PRICE)
	}
		break;
	case ani_kind::ani_cat:
	{
		BUY_ANIMAL(CAT_PRICE)
	}
		break;
	case ani_kind::ani_sna:
	{
		BUY_ANIMAL(SNA_PRICE)
	}
		break;
	}


	cout << "动物买成功了" << endl;
	return true;
}

CCage* CPeople::CreatCage()
{
	CCage* pCage = new CCage;
	cout << "请输入笼子的ID(ID>0)" << endl;
	int id = 0;
	cin >> id;
	while (id <= 0) {
		cout << "输入的ID不合法,重新输入" << endl;
		cin >> id;
	}
	pCage->InitCage(id);
	return pCage;
}

void CPeople::PushAniToCage(CCage* pCage, CAnimal* pAni)
{
	if (!pCage || !pAni) {
		cout << "参数不合法" << endl;
		return;
	}

	pCage->PushAnimal(pAni);
	cout << "动物成功的添加到笼子中" << endl;
}

void CPeople::PushCageToHouse(CHouse* pHouse, CCage* pCage)
{
	if (!pHouse || !pCage) {
		cout << "参数不合法" << endl;
		return;
	}
	pHouse->PushCage(pCage);
	cout << "笼子成功的添加到房子中" << endl;

}

void CPeople::KillAnimal(CHouse* pHouse, int id)
{
	if (!pHouse) {
		cout << "房子的指针为空" << endl;
		return;
	}
	list<CCage*>::iterator ite = pHouse->m_lstCage.begin();
	while (ite != pHouse->m_lstCage.end()) { //遍历笼子的链表
		if ((*ite) && (*ite)->m_id == id) {  //笼子不为空 且 匹配到了
			if ((*ite)->m_pAni) {    //笼子中存在着动物
				delete(*ite)->m_pAni;   //杀死动物
				(*ite)->m_pAni = nullptr;
			}
			cout << "笼子中不存在动物了" << endl;
			return;
		}
		ite++;
	}
	cout << "未匹配到笼子id:" << id << endl;
}

void CPeople::DestoryCage(CHouse* pHouse, int id)
{
	if (!pHouse) {
		cout << "房子的指针为空" << endl;
		return;
	}
	list<CCage*>::iterator ite = pHouse->m_lstCage.begin();
	while (ite != pHouse->m_lstCage.end()) { //遍历笼子的链表
		if ((*ite) && (*ite)->m_id == id) {  //笼子不为空 且 匹配到了
			if ((*ite)->m_pAni) {    //笼子中存在着动物
				delete(*ite)->m_pAni;   //杀死动物
				(*ite)->m_pAni = nullptr;
			}
			delete(*ite);  //销毁笼子
			(*ite) = nullptr;

			cout << "笼子被成功的销毁了" << endl;
			return;
		}
		ite++;
	}
	cout << "未匹配到笼子id:" << id << endl;
}

void CPeople::LookAll(CHouse* pHouse) {
	if (!pHouse) {
		cout << "房子的指针为空" << endl;
		return;
	}
	for (CCage* pCage: pHouse->m_lstCage) {
		if (pCage) {
			cout << "id : " << pCage->m_id << " , ";
			if (pCage->m_pAni) {
				pCage->m_pAni->ShowAni();
			}
			else {
				cout << "笼子为空" << endl;
			}
		}
	}
}
void CPeople::LookOne(CHouse* pHouse, int id) {
	if (!pHouse) {
		cout << "房子的指针为空" << endl;
		return;
	}
	for (CCage* pCage : pHouse->m_lstCage) {
		if (pCage && pCage->m_id == id) {
			cout << "id : " << pCage->m_id << " , ";
			if (pCage->m_pAni) {
				pCage->m_pAni->ShowAni();
			}
			else {
				cout << "笼子为空" << endl;
			}
			return;
		}
	}
	cout << "未匹配到笼子id:" << id << endl;
}
void CPeople::PlayWithAnimal(CHouse* pHouse, int id) {
	if (!pHouse) {
		cout << "房子的指针为空" << endl;
		return;
	}
	for (CCage* pCage : pHouse->m_lstCage) {
		if (pCage && pCage->m_id == id) {
			cout << "准备去玩耍..." << endl;
			if (pCage->m_pAni) {
				pCage->m_pAni->PlayAni();
			}
			else {
				cout << "自己玩耍" << endl;
			}
			return;
		}
	}
	cout << "未匹配到笼子id:" << id << endl;
}
void CPeople::showPeople() {
	cout << "name : " << m_name << ",  money : " << m_money << endl;
}

小贴士

//config.h
#pragma once

enum class ani_kind {
	ani_cat,
	ani_dog,
	ani_sna
};

#define DOG_PRICE 100
#define CAT_PRICE 80
#define SNA_PRICE 120

#define PEO_MONEY 1200

#define CMD_BUY_CAT "buy cat"
#define CMD_BUY_DOG "buy dog"
#define CMD_BUY_SNA "buy sna"


#define CMD_KILL_ANI    "kill"
#define CMD_DESTORY_ANI "destory"

#define CMD_LOOK_ONE    "look one"
#define CMD_LOOK_ALL    "look all"

#define CMD_PLAY        "play"
#define CMD_SHOW        "show"

#define CMD_QUIT        "quit"

#define CMD_HELP        "help"


控制台主函数

#include <iostream>
using namespace std;
#include "CPeople.h"
#include "CCat.h"
#include "CDog.h"
#include "CSnake.h"
#include <windows.h>

void help() {
	cout << "*********宠物小屋 by wangj 2023.4.30*************************************************" << endl;
	cout << "*" << CMD_BUY_CAT << "买猫  *********************************************************" << endl;
	cout << "*" << CMD_BUY_DOG << "买猫  *********************************************************" << endl;
	cout << "*" << CMD_BUY_SNA << "买蛇  *********************************************************" << endl;
	cout << "*" << CMD_KILL_ANI << "杀死动物  *********************************************************" << endl;
	cout << "*" << CMD_DESTORY_ANI << "销毁笼子(如果有动物,一并销毁)  *********************************************************" << endl;
	cout << "*" << CMD_LOOK_ONE << "查看某个动物  *********************************************************" << endl;
	cout << "*" << CMD_LOOK_ALL << "查看所有动物  *********************************************************" << endl;
	cout << "*" << CMD_PLAY << "和某个动物玩耍  *********************************************************" << endl;
	cout << "*" << CMD_SHOW << "显示人物信息  *********************************************************" << endl;
	cout << "*" << CMD_QUIT << "程序退出  *********************************************************" << endl;
	cout << "*" << CMD_HELP << "命令帮助  *********************************************************" << endl;
	cout << "**********************************************************" << endl;
}

#define BUY_ANIMAL(ANI_CLASS,ANI_KIND)\
	pAni = new ANI_CLASS;\
	cout << "请输入动物的名字、颜色、年龄" << endl;\
	cin >> name >> color >> age;\
	pAni->initAni(name, color, age);\
	if (!pPeo->BuyAnimal(pAni, ANI_KIND)) {\
		delete pAni;\
		pAni = nullptr;\
	}

int main() {
	CPeople* pPeo = new CPeople;
	pPeo->InitPeople("张三", PEO_MONEY);
	
	CHouse* pHouse = new CHouse;

	//-------------------------------------------------------

	string cmd;
	string Return;

	help();

	while (1) {
		//cout << "请输入命令" << endl;
		//cin >> cmd;
		getline(cin, cmd);  //读取一行(遇到空格不停止)
		//cin.sync();
		//cin.clear();

		//判断输入的命令是否是买动物

		string name;
		string color;
		int age = 0;
		CAnimal* pAni = nullptr;

		if (cmd == CMD_BUY_CAT) {
			//pAni = new CCat;
			//cout << "请输入动物的名字、颜色、年龄" << endl;
			//cin >> name >> color >> age;
			//pAni->initAni(name, color, age);
			//if (!pPeo->BuyAnimal(pAni, ani_cat)) {//买动物如果失败,将new的动物回收
			//	delete pAni;
			//	pAni = nullptr;
			//}
			BUY_ANIMAL(CCat, ani_kind::ani_cat)
		}
		else if (cmd == CMD_BUY_DOG) {
			BUY_ANIMAL(CDog, ani_kind::ani_dog)
		}
		else if (cmd == CMD_BUY_SNA) {
			BUY_ANIMAL(CSnake, ani_kind::ani_sna)
		}

		if (pAni) {  //动物买成功了,建造笼子装动物,装房子
			CCage* pCage = pPeo->CreatCage();  //建造笼子
			pPeo->PushAniToCage(pCage, pAni);  //装动物
			pPeo->PushCageToHouse(pHouse, pCage);//装房子
		}

		if (CMD_KILL_ANI == cmd) {
			int id = 0;
			cout << "请输入要杀死动物的笼子id" << endl;
			cin >> id;
			pPeo->KillAnimal(pHouse, id);
		}
		if (CMD_DESTORY_ANI == cmd) {
			int id = 0;
			cout << "请输入要销毁的笼子id" << endl;
			cin >> id;
			pPeo->DestoryCage(pHouse, id);
		}

		if (CMD_LOOK_ONE == cmd) {
			int id = 0;
			cout << "请输入要查看的笼子的id" << endl;
			cin >> id;
			pPeo->LookOne(pHouse,id);
		}
		if (CMD_LOOK_ALL == cmd) {
			pPeo->LookAll(pHouse);
		}

		if (CMD_PLAY == cmd) {
			int id = 0;
			cout << "请输入要玩耍的动物的笼子" << endl;
			cin >> id;
			pPeo->PlayWithAnimal(pHouse, id);
		}

		if (CMD_SHOW == cmd) {
			pPeo->showPeople();
		}

		if (CMD_QUIT == cmd) {
			cout << "程序即将退出..." << endl;
			Sleep(2000);
			break;
		}

		if (CMD_HELP == cmd) {
			help(); 
		}

		getline(cin, Return);
	}



	//-------------------------------------------------------
	delete pHouse;
	pHouse = nullptr;

	delete pPeo;
	pPeo = nullptr;

	return 0;
}

 

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

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

相关文章

对折纸张厚度超过珠峰

对折 0.1 毫米的纸张&#xff0c;循环对折&#xff0c;超过珠峰高度输出对折次数。 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&a…

【计算机网络】学习笔记:第六章 应用层【王道考研】

基于本人观看学习b站王道计算机网络课程所做的笔记&#xff0c;不作任何获利 仅进行交流分享 特此鸣谢王道考研 若有侵权请联系&#xff0c;立删 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0c;如有疑问欢迎…

每天一道算法练习题--Day17 第一章 --算法专题 --- ----------布隆过滤器

场景 假设你现在要处理这样一个问题&#xff0c;你有一个网站并且拥有很多访客&#xff0c;每当有用户访问时&#xff0c;你想知道这个 ip 是不是第一次访问你的网站。 hashtable 可以么 一个显而易见的答案是将所有的 IP 用 hashtable 存起来&#xff0c;每次访问都去 hash…

ARM架构基本理论(1)

ARM架构基本理论 一、ARM的简介 ARM&#xff08;Advanced RISC Machine&#xff09;是一种基于RISC&#xff08;Reduced Instruction Set Computing&#xff09;架构的计算机处理器架构&#xff0c;由ARM Holdings&#xff08;ARM公司&#xff09;开发和授权给其他公司生产和…

【C++开发】基于QT+sqlite3的医疗管理系统

文章目录 前言数据库设计主要实现的功能病人列表页面病人信息页信息录入页面信息修改页面 & 信息查看页面 总结 前言 本次做的这个项目是医疗管理系统&#xff0c;是根据需求所定制的&#xff0c;因此只面向个人本地的使用。 本项目是本人在完全0基础的情况下边学边…

14-2-进程间通信-FIFO

一、命名管道FIFO 1.作用范围 对于命名管道FIFO&#xff0c;它可以在不相关的进程间也能相互通信。 2.命名管道可左右用于不相关进程的原因 因为命令管道&#xff0c;提前创建了一个类型为管道的设备文件&#xff0c;在进程里只要使用这个设备文件&#xff0c;就可以相互通信…

14-1-进程间通信-pipe

一.无名管道pipe 特点&#xff1a; (1)半双工&#xff08;在同一时刻&#xff0c;数据传输的方向只能是接收或发送&#xff09;&#xff1b; 例如&#xff1a;对于主机和从机而言&#xff0c;在某一时刻&#xff0c;只能是主机发送&#xff08;从机接收&#xff09;&#xff0…

CentOS+nginx手动搭建WordPress

文章目录 前提条件php安装安装 EPEL 源及源管理工具&#xff1a;安装 REMI 源&#xff1a;安装 PHP7.3 及扩展&#xff1a;设置开机自动启动其他php命令 wordpress 安装下载WordPress将下载的WordPress移动至网站根目录修改WordPress配置文件配置nginx 创建完成后根据域名访问 …

分析linux中动态库so文件的常用方法

前言 在linux系统中&#xff0c;我们经常会遇到各种各样的动态库文件&#xff0c;常见的是.so后缀&#xff0c;那么我们应该如何分析这些文件的用途和作用呢&#xff1f;毕竟我们不能一知半解的“搞事情”。 正文 查看文件属性 首先&#xff0c;我们从整体上了解一下该文件的基…

maven-gpg-plugin gpg禁用交互式输入密码 免密码输入 设置默认密码 关闭pinentry-qt输入 passphrase

一、问题描述 在使用maven-gpg-plugin打包jar时,默认情况下&#xff0c;每次都会弹出对话框要你输入密码&#xff1a; 这就有点烦&#xff0c;有啥办法可以设置默认方法没&#xff1f;网上找了一圈&#xff0c;通过搜索关键词“passphrase”&#xff0c;找到了一些教程&#x…

无损以太网与网络拥塞管理(PFC、ECN)

无损以太网 无损以太网&#xff08;Lossless Ethernet&#xff09;是一种专门用于数据中心网络的网络技术&#xff0c;旨在提供低延迟、高吞吐量和可靠性的传输服务。它是在传统以太网的基础上进行了扩展&#xff0c;引入了新的拥塞管理机制&#xff0c;以避免数据包丢失和网络…

探索【Stable-Diffusion WEBUI】的插件:ControlNet 1.1

文章目录 &#xff08;零&#xff09;前言&#xff08;二&#xff09;ControlNet&#xff08;v1.1&#xff09;&#xff08;2.1&#xff09;模型&#xff08;2.2&#xff09;新版界面&#xff08;2.3&#xff09;预处理器 &#xff08;三&#xff09;偷懒 &#xff08;零&#…

机器学习与深度学习——通过决策树算法分类鸢尾花数据集iris求出错误率画出决策树并进行可视化

什么是决策树&#xff1f; 决策树是一种常用的机器学习算法&#xff0c;它可以对数据集进行分类或回归分析。决策树的结构类似于一棵树&#xff0c;由节点和边组成。每个节点代表一个特征或属性&#xff0c;每个边代表一个判断或决策。从根节点开始&#xff0c;根据特征的不同…

list的使用介绍---C++

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

计算机网络第一章(谢希仁第8版学习)

作者&#xff1a;爱塔居 专栏&#xff1a;计算机网络 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起加油 文章目录 目录 文章目录 一、网络、互连网、互联网&#xff08;因特网&#xff09;的概念 二、因特网的组成 三、交换方式 3.1 电路交换 3.2 分组交换 3.3 电路…

详解c++---list介绍

目录标题 list介绍list定义list遍历list数据插入push_backpush_frontinsert list删除pop_backpop_fronterase list排序list去重list合并list转移list其他函数emptysizefrontbackassignswapresizeclear list排序效率问题 list介绍 list是可以在常数范围内在任意位置进行插入和删…

【Java笔试强训 22】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;小易的升…

【Java笔试强训 21】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525; 洗牌 &…

免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

java+jsp企业物流货运快递管理系统servlet

功能需求具体描述&#xff1a; (1)用户功能模块包括用户登录注册&#xff0c;用户信息的修改&#xff0c;用户发布货物信息&#xff0c;给客服人员留言&#xff0c;对运输公司进行评价。 (2)企业功能模块包括企业注册登录&#xff0c;企业信息的修改&#xff0c;受理用户发布的…