课程作业,在设计上用到了前后端分离的思想,把业务层和逻辑交互层分开来写。本来想用qml实现前后端分离,时间问题没做图形界面,只写了个扣1扣2的cmd界面,谈不上前后端之分。前前后后写了三天,从最底层数据封装开始,到内存的自动管理,再到业务层,最后是扣1扣2的界面层,总体来说还是很累的,简单记录一下屎山x。其中交互层还有很多未知bug,但咱重点突出一个能跑就行好吧,也欢迎大家指正。
如果对你有帮助那真是太好了(目移)。
任务目标
总体来说是一个物流管理系统,大致内容都在下面了。
如图↑,没什么好说的,具体直接看代码说吧。
程序结构
总体上就是这几个文件
服务依赖↑ 交互窗口↑
在服务依赖这几个类中把主要涉及的数据处理封装好,最终在Service_User以及Service_Admin里面只暴露出相应服务操作的接口函数以供前端交互窗口调用,把数据存储,内存管理等全部封装好,避免写业务逻辑时再去关心这些内容。使得整体的架构更清晰也更方便维护。
交互窗口主要是两部分组成,一是存放展示界面的windows,二是存放页面逻辑的cmdApp。同样分开来写,让结构清晰一点。
下面详细讲讲每个类的实现
前后端“通信”
因为涉及到前后端的理念,不得不说明下是如何通信的。
设计理念就是,在前端实例化服务类的对象来启动服务,调用对象里的函数来向后端发起”请求“。在这个对象里会有一个public的链表,用于储存需要展示的信息的指针,前端通过读取这个链表的全部内容将信息解析并展示,以次完成”通讯“。
后端服务依赖
config
#pragma once
#pragma warning(disable:4996)
#include <iostream>
#include <string>
#include <fstream>
#include <ctime>
#include <cstring>
#include <random>
#include <cstdlib>
//数据大小
#define MAX_NOTE_NUM 200
#define MAX_PHONE_NUM 11
#define MAX_ACCONT_NUM 20
#define MAX_PASSWORD_NUM 20
#define MAX_NIKENAME_NUM 20
#define MAX_REALNAME_NUM 20
#define MAX_ADDRESS_NUM 50
#define MAX_ODERNUM_NUM 23
#define MAX_DAY_NUM 8
#define MAX_TIME_NUM 6
#define USERINFOR_FILE "UserInfor.dat"
#define ADDRESSINFOR_FILE "AddressBook.dat"
#define ODERINFOR_FILE "Oders.dat"
#define ADMININFOR_FILE "Admin.dat"
#define FRAGILLE 1
#define FRAGILLE_PRICE 8
#define BOOK 2
#define BOOK_PRICE 2
#define NORMAL 3
#define NORMAL_PRICE 5
一些宏定义,一些include,并且将一些自定义数据的大小进行了指定,方便之后对存储的管理。
BaseData
BaseData.h
#pragma once
#include "config.h"
template<int Num>
class myArray;
template<int Num>
std::ostream& operator<< (std::ostream &outp,const myArray<Num> &item);
template<int Num>
class myArray
{
public:
char Infor[Num];
myArray():Infor("*"){};
myArray(const std::string str)
{ int i = 0;
for(i;i<Num-1&&i<str.length();i++)
{
Infor[i] = str[i];
}
for(i;i<Num;i++)
{
Infor[i] = 0;
}
};
myArray(char const *str )
{
int i =0;
for(i;i<Num-1&&i<strlen(str);i++)
{
Infor[i] = str[i];
}
for(i;i<Num;i++)
{
Infor[i] = 0;
}
};
myArray(const myArray<Num> &obj)
{
for(int i = 0;i<Num;i++)
{
Infor[i] = obj.Infor[i];
}
};
~myArray(){};
int len(){return Num;};
friend std::ostream& operator<< <> (std::ostream &outp,const myArray<Num> &item);
bool operator==(const myArray<Num>&obj)
{
if(strcmp(Infor,obj.Infor)==0)return true;
else
return false;
};
operator std::string()const{return Infor;};
};
//linklist to manage the data
template <class ELE>
class Node
{
public:
ELE data;
Node<ELE> *next = NULL;
Node(const ELE &data)
{
this->data = data;
}
Node(){};
};
template<class ELE>
class LinkList
{
private:
Node<ELE>* head;
int len = 0;
public:
LinkList()
{
head = new Node<ELE>;
head->next = NULL;
head->data = {};
len = 0;
};
~LinkList()
{
Node<ELE>* p =head->next;
Node<ELE>* del;
while(p!=NULL)
{
del = p;
p = p->next;
delete del;
}
};
bool isEmpty()
{
return(head->next==NULL);
};
void clear()
{
Node<ELE>*p = head->next;
Node<ELE>*del = p;
while(p!=NULL)
{
del = p;
p=p->next;
delete del;
}
head->next = NULL;
len = 0;
};
void PushFront(Node<ELE>* node)
{
node->next = head->next;
head->next = node;
len++;
};
void PushBack(Node<ELE>* node)
{
Node<ELE>* p = head;
while (p->next!=NULL)
{
p = p->next;
}
p->next = node;
len++;
};
void AddI(int i,Node<ELE>* node)//need to use a
{
std::cout<<"adding";
if(i<=len+1)
{
Node<ELE>* temp = head;
for(int j = 0;j<i-1;j++)
{
temp = temp->next;
}
Node<ELE>* temp2 = temp->next;
temp->next = node;
node->next = temp2;
len++;
std::cout<<"add succeee"<<std::endl;
}
};
void ChangeI(int i,Node<ELE>* node)//把第i个位置的结点替换成node
{
if(!this->isEmpty()&&i<=len)
{
Node<ELE>* temp = head;
for(int j = 0;j<i-1;j++)
{
temp = temp->next;
}
Node<ELE>* temp1 = temp->next;
temp->next = node;
node->next = temp1->next;
delete temp1;
}
};
void DelI(int i)// 删掉第i个
{
if(!this->isEmpty()&&i<=len)
{
Node<ELE>* temp = head;
for(int j = 0;j<i-1;j++)
{
temp = temp->next;
}
Node<ELE>* temp2 = temp->next;
temp->next = temp2->next;
len--;
delete temp2;
}
};
int Getindex(Node<ELE>* node)
{
int i = 0;
Node<ELE> *temp = node;
while(temp!=NULL)
{
i++;
temp = temp->next;
}
int res = len-i+1;
return res;
}
Node<ELE>* GetI(int i)//返回指向第i个结点的指针
{
if (!this->isEmpty() && i <= len)
{
Node<ELE>* temp = head;
for (int j = 0; j < i; j++)
{
temp = temp->next;
}
return temp;
}
else
return head;
};
Node<ELE>* PopBack()
{
if(!this->isEmpty())
{
Node<ELE>* temp = head;
for(int i = 0;i<this->len-1;i++)
{
temp = temp->next;
}
Node<ELE>* temp1 = temp->next;
temp->next = NULL;
len--;
return temp1;
}
else
{
std::cout<<"emptyLinkList"<<std::endl;
return 0;
}
};
Node<ELE>* PopFront()//把开头的弹出,同时返回指向被弹出结点的指针
{
if(!this->isEmpty())
{
Node<ELE>* node = head->next;
head->next = head->next->next;
return node;
}
else
{
std::cout<<"empty LinkList"<<std::endl;
return 0;
}
};
Node<ELE>* PopI(int i)
{
if(!this->isEmpty()&&i<=len)
{
Node<ELE>* temp = GetI(i-1);
Node<ELE>* tem1 = temp->next;
temp->next = tem1->next;
len--;
return tem1;
}
else
{
std::cout<<"emptyLinkList"<<std::endl;
return 0;
}
};
Node<ELE>* Gethead()
{
return head;
};
int getlen()
{
return len;
};
};
template<int Num>
std::ostream& operator<< (std::ostream &outp,const myArray<Num> &item)
{
std::cout<<item.Infor;
return outp;
};
//封装数据结点
typedef myArray<MAX_PHONE_NUM+1> Phone;
typedef myArray<MAX_NOTE_NUM+1> Note;
typedef myArray<MAX_PHONE_NUM+1> Phone;
typedef myArray<MAX_ACCONT_NUM+1> Account;
typedef myArray<MAX_PASSWORD_NUM+1> PassWord;
typedef myArray<MAX_NIKENAME_NUM+1> NickName;
typedef myArray<MAX_REALNAME_NUM+1> RealName;
typedef myArray<MAX_ODERNUM_NUM+1> OderCode;
typedef myArray<MAX_DAY_NUM+1> DayYear;
typedef myArray<MAX_TIME_NUM+1> Time;
typedef myArray<MAX_ADDRESS_NUM+1> Address;
typedef struct UserInfor
{//用户信息
Account Accont;//keyword
Phone Phone;
PassWord PassWord;
NickName NickName;
double money = 0;
void display()
{
std::cout<<"|userinfor"<<std::endl;
std::cout<<"-|Account :"<<Accont<<std::endl;
std::cout<<"-|Phone :"<<Phone<<std::endl;
std::cout<<"-|Password:"<<PassWord<<std::endl;
std::cout<<"-|NickName:"<<NickName<<std::endl;
std::cout<<"-|money :"<<money<<std::endl;
std::cout<<"|end..."<<std::endl;
};
}UserInfor;
typedef struct AdministratorInfor
{
Account Account;
PassWord PassWord;
NickName NickName;
double money = 0;
void display()
{
std::cout<<"|AdministratorInfor"<<std::endl;
std::cout<<"-|Account :"<<Account<<std::endl;
std::cout<<"-|Password:"<<PassWord<<std::endl;
std::cout<<"-|NickName:"<<NickName<<std::endl;
std::cout<<"-|money :"<<money<<std::endl;
std::cout<<"|end..."<<std::endl;
};
}AdministratorInfor;
typedef struct AddressInfor
{//地址信息
Account relateAccont;//keyword
RealName name;
Phone Phone;
Address Address;
void display()
{
std::cout<<"|AddressInfor"<<std::endl;
std::cout<<"-|Realname:"<<name<<std::endl;
std::cout<<"-|Phone :"<<Phone<<std::endl;
std::cout<<"-|Address :"<<Address<<std::endl;
std::cout<<"|end..."<<std::endl;
};
}AddressInfor;
typedef struct Timess
{
int year = 0;
int month = 0;
int day = 0;
int hour = 0;
int minute = 0;
int sec = 0;
Timess(){};
Timess(tm* ltm)
{
year = ltm->tm_year+1900;
month = ltm->tm_mon+1;
day = ltm->tm_mday;
hour = ltm->tm_hour;
minute = ltm->tm_min;
sec = ltm->tm_sec;
}
}Timess;
typedef struct Statu
{
int num1=0;//为1代取件
Timess time1;
int num2=0;//为1:运输中
Timess time2;
int num3=0;//为1:运达,待取件
Timess time3;
int num4=0;//为1:确认收货
Timess time4;
}Status;
typedef struct OderInfor
{//订单信息
OderCode OderNum;
Account relateAccont;
AddressInfor Sender;
AddressInfor Recevier;
Status StatuCode;
int Kinds;
double Price;
int hadRecharged = 0;
Note notes;
void display()
{
std::cout<<"|OderInfor"<<std::endl;
std::cout<<"-|OderNum :"<<OderNum<<std::endl;
std::cout<<"-|Sender :"<<std::endl;
Sender.display();
std::cout<<"-|Recevier:"<<std::endl;
Recevier.display();
std::cout<<"-|Notes :"<<notes<<std::endl;
std::cout<<"|end..."<<std::endl;
};
}OderInfor;
typedef Node<UserInfor> UserInfor_Node;
typedef Node<AddressInfor> AddressInfor_Node;
typedef Node<AddressInfor_Node*> AddressPointor_Node;
typedef Node<OderInfor> Oder_Node;
typedef Node<Oder_Node*> OderPointor_Node;
typedef Node<AdministratorInfor> AdministratorInfor_Node;
typedef LinkList<UserInfor> UserInfor_list;
typedef LinkList<AddressInfor> AddressInfor_list;
typedef LinkList<AddressInfor_Node*> AddressDisplay_list;
typedef LinkList<OderInfor> Oderinfor_list;
typedef LinkList<Oder_Node*> OderDisplay_list;
typedef LinkList<AdministratorInfor> AdministratorInfor_list;
在这个头文件里,用模板类将之后业务常见的数据类型进行了封装和指定,并重载了一些基本的运算符,主要目的是string不能指定长度,会对之后数据的永久化储存产生困扰,干脆用指定长度的字符串进行存储。
又对一些关键的信息集用struct进行了封装,方便之后使用
同时还实现了一个简单的链表用于内存管理,这个链表有些方法后面没有用上,但它用起来真的很舒服,用链表进行内存管理极大程度上减轻了思考的负担。至于为什么自己写而没用std里的...因为懒得看)
然后就是利用typedef把模板类指定成一个个实例类,方便之后使用
这里实现和声明没有分开写是因为模板类分开写会报错,虽然一开始我分开写的时候并没有遇到问题但网上都这么建议,我也就都写在一个文件里了。
myDatabase
myDatabase.h
#pragma once
#include "BaseData.h"
//这一层的函数,参数全部使用引用的方式,把内存管理封死在这一层,提供给业务层接口
//所有业务操作有关于内存的均在此处完成,查询等功能也在此处完成
class myDatabase
{
public:
void saveUser();
void saveAddress();
void saveOder();
void saveAdmin();
//注意原本储存链表内有数据,不能直接load,会反复读取,需要对链表进行clear操作
void loadUser();
void loadAddress();
void loadOder();
void loadAdmin();
void saveAll();//把链表内所有信息重新写入到文件中,并且刷新所有的信息覆盖
void loadALL();
UserInfor_list *Userlist_ALL_P;
AddressInfor_list *Addreslist_ALL_P;
Oderinfor_list *Oderlist_ALL_P;
AdministratorInfor_list *adminlist_ALL_P;
AdministratorInfor_Node* search_adminP_by_Accont(Account &act);
UserInfor_Node* search_userP_by_Accont(Account &act);
Oder_Node* search_OderP_by_OderCode(OderCode &code);
myDatabase();
myDatabase(UserInfor_list* UserP, AddressInfor_list* adres = NULL, Oderinfor_list* oder = NULL, AdministratorInfor_list* Admin = NULL)
:Userlist_ALL_P(UserP),Addreslist_ALL_P(adres),Oderlist_ALL_P(oder),adminlist_ALL_P(Admin) {};//测试用
~myDatabase();
};
myDatabase.cpp
#include "myDatabase.h"
myDatabase::myDatabase()
{
Userlist_ALL_P = new UserInfor_list;
Addreslist_ALL_P = new AddressInfor_list;
Oderlist_ALL_P = new Oderinfor_list;
adminlist_ALL_P = new AdministratorInfor_list;
loadALL();
std::cout<<"data service running..."<<std::endl;
}
myDatabase::~myDatabase()
{
delete Userlist_ALL_P;
delete Addreslist_ALL_P;
delete Oderlist_ALL_P;
delete adminlist_ALL_P;
std::cout<<"data service closed..."<<std::endl;
}
void myDatabase::saveUser()
{
std::ofstream dataFile(USERINFOR_FILE,std::ios::out|std::ios::binary);
if(!dataFile)
{
std::cerr<<"file to load UserInfor type:SAVE"<<std::endl;
return;
};
UserInfor_Node *temp = Userlist_ALL_P->Gethead();
while(temp->next!=NULL)
{
temp = temp->next;
// dataFile.write((char*)&(temp->data.Accont),sizeof(Account));
// dataFile.write((char*)&(temp->data.Phone),sizeof(Phone));
// dataFile.write((char*)&(temp->data.PassWord),sizeof(PassWord));
// dataFile.write((char*)&(temp->data.NickName),sizeof(NickName));
// dataFile.write((char*)&(temp->data.money),sizeof(double));
int watch = sizeof(UserInfor);
dataFile.write((char*)&(temp->data),sizeof(UserInfor));
}
dataFile.close();
}
void myDatabase::saveAdmin()
{
std::ofstream dataFile(ADMININFOR_FILE,std::ios::out|std::ios::binary);
if(!dataFile)
{
std::cerr<<"file to load AdminInfor type:SAVE"<<std::endl;
return;
};
AdministratorInfor_Node *temp = adminlist_ALL_P->Gethead();
while(temp->next!=NULL)
{
temp = temp->next;
// dataFile.write((char*)&(temp->data.Accont),sizeof(Account));
// dataFile.write((char*)&(temp->data.Phone),sizeof(Phone));
// dataFile.write((char*)&(temp->data.PassWord),sizeof(PassWord));
// dataFile.write((char*)&(temp->data.NickName),sizeof(NickName));
// dataFile.write((char*)&(temp->data.money),sizeof(double));
dataFile.write((char*)&(temp->data),sizeof(AdministratorInfor));
}
dataFile.close();
}
void myDatabase::saveAddress()
{
std::ofstream dataFile(ADDRESSINFOR_FILE,std::ios::out|std::ios::binary);
if(!dataFile)
{
std::cerr<<"file to load Address type:SAVE"<<std::endl;
return;
};
AddressInfor_Node *temp = Addreslist_ALL_P->Gethead();
while(temp->next!=NULL)
{
temp = temp->next;
// dataFile.write((char*)&(temp->data.relateAccont),sizeof(Account));
// dataFile.write((char*)&(temp->data.name),sizeof(RealName));
// dataFile.write((char*)&(temp->data.Phone),sizeof(Phone));
// dataFile.write((char*)&(temp->data.Address),sizeof(Address));
dataFile.write((char*)(&temp->data),sizeof(AddressInfor));
}
dataFile.close();
}
void myDatabase::saveOder()
{
std::ofstream dataFile(ODERINFOR_FILE,std::ios::out|std::ios::binary);
if(!dataFile)
{
std::cerr<<"file to load Oderifor type:SAVE"<<std::endl;
return;
};
Oder_Node *temp = Oderlist_ALL_P->Gethead();
while(temp->next!=NULL)
{
temp = temp->next;
dataFile.write((char*)(&temp->data),sizeof(OderInfor));
}
dataFile.close();
}
void myDatabase::loadUser()
{
std::ifstream dataFile(USERINFOR_FILE,std::ios::ate|std::ios::binary);
if(!dataFile)//打开错误处理
{
std::cerr<<"file to load UserInfor type:READ"<<std::endl;
return;
};
int filesize;
filesize = dataFile.tellg();//获取文件大小
dataFile.seekg(0,std::ios::beg);//指针返回起始位置
int filep = 0;
while(filep<filesize)
{
UserInfor_Node* temp = new UserInfor_Node;
dataFile.read((char*)(&temp->data),sizeof(UserInfor));
filep = dataFile.tellg();
Userlist_ALL_P->PushBack(temp);
};
dataFile.close();
}
void myDatabase::loadAdmin()
{
std::ifstream dataFile(ADMININFOR_FILE,std::ios::ate|std::ios::binary);
if(!dataFile)//打开错误处理
{
std::cerr<<"file to load UserInfor type:READ"<<std::endl;
return;
};
int filesize;
filesize = dataFile.tellg();//获取文件大小
dataFile.seekg(0,std::ios::beg);//指针返回起始位置
int filep = 0;
while(filep<filesize)
{
AdministratorInfor_Node* temp = new AdministratorInfor_Node;
dataFile.read((char*)(&temp->data),sizeof(AdministratorInfor));
filep = dataFile.tellg();
adminlist_ALL_P->PushBack(temp);
};
dataFile.close();
}
void myDatabase::loadAddress()
{
std::ifstream dataFile(ADDRESSINFOR_FILE,std::ios::ate|std::ios::binary);
if(!dataFile)//打开错误处理
{
std::cerr<<"file to load AddressInfor type:READ"<<std::endl;
return;
};
int filesize;
filesize = dataFile.tellg();//获取文件大小
dataFile.seekg(0,std::ios::beg);//指针返回起始位置
int filep = 0;
while(filep<filesize)
{
AddressInfor_Node* temp = new AddressInfor_Node;
dataFile.read((char*)(&temp->data),sizeof(AddressInfor));
filep = dataFile.tellg();
Addreslist_ALL_P->PushBack(temp);
};
dataFile.close();
}
void myDatabase::loadOder()
{
std::ifstream dataFile(ODERINFOR_FILE,std::ios::ate|std::ios::binary);
if(!dataFile)//打开错误处理
{
std::cerr<<"file to load OderInfor type:READ"<<std::endl;
return;
};
int filesize;
filesize = dataFile.tellg();//获取文件大小
dataFile.seekg(0,std::ios::beg);//指针返回起始位置
int filep = 0;
while(filep<filesize)
{
Oder_Node* temp = new Oder_Node;
dataFile.read((char*)(&temp->data),sizeof(OderInfor));
filep = dataFile.tellg();
Oderlist_ALL_P->PushBack(temp);
};
dataFile.close();
}
void myDatabase::saveAll()
{
saveAddress();
saveUser();
saveOder();
saveAdmin();
}
void myDatabase::loadALL()
{
loadAddress();
loadUser();
loadOder();
loadAdmin();
}
AdministratorInfor_Node* myDatabase::search_adminP_by_Accont(Account &act)
{
AdministratorInfor_Node* p;
int i = adminlist_ALL_P->getlen();
for(int j = 1;j<i;j++)
{
p = adminlist_ALL_P->GetI(j);
if(p->data.Account==act)
{
return p;
}
}
p = adminlist_ALL_P->GetI(i);
if(p->data.Account ==act)return p;
p = NULL;
return p;
};
UserInfor_Node* myDatabase::search_userP_by_Accont(Account &act)
{
UserInfor_Node* p;
int i = Userlist_ALL_P->getlen();
for(int j =1;j<i;j++)
{
p = Userlist_ALL_P->GetI(j);
if(p->data.Accont==act)
{
return p;
}
}
p = Userlist_ALL_P->GetI(i);
if(p->data.Accont==act)return p;
p = NULL;
return p;
};
Oder_Node* myDatabase::search_OderP_by_OderCode(OderCode &code)
{
Oder_Node* p;
int i = Oderlist_ALL_P->getlen();
for(int j = 1;j<i;j++)
{
p = Oderlist_ALL_P->GetI(j);
if(p->data.OderNum==code)
{
return p;
}
}
p = Oderlist_ALL_P->GetI(i);
if(p->data.OderNum ==code)return p;
p = NULL;
return p;
};
在这里,主要是为了实现数据的长久储存(吐槽一下为什么不让用数据库),这里偷懒,采用启动程序直接把数据读到内存里,处理完再覆盖上去的方式。没有考虑数据量太大怎么办,毕竟目的是能跑就行。
然后实现了一些查找功能,便于之后编写。
在这一层极力把对指针的操作封死在此处,减轻上层的思考负担,专注于业务的编写
Service
Service.h
#pragma once
#include "myDatabase.h"
class Service
{
protected:
public:
myDatabase *DataBase;
OderDisplay_list *Display_list_oder;//订单展示的链表
//展示链表:一个记录了所需要展示的信息的指针的链表,信息还是存在database里的四个链表内,
//相当于在database的链表内查询到要展示的结点,返回一个指向这些结点的指针储存在这个显示链表内
//信息真实的存储地址还是database链表内的结点处
Service();
~Service();
//产生订单唯一订单号
tm* TimeGetor();//获取当前时间信息集
void add0(std::string &str,int n);//把字符串格式的数字修改成应该的n位
Time time_tm2Time(tm *ltm);//把数字时间信息转成Time
DayYear dayer_tm2Dayear(tm *ltm);//把数字年月转成Dayear
int randomint();
OderCode Creat_OderCode(const Time &tim, const DayYear &dyr);
virtual void AllOder_Pushin()=0;//清空展示链表,同时把 所有订单信息|该账号相关的所有订单信息 压入展示链表
virtual void searchOderbyOderCode_Pushiin(OderCode &code)=0;//按订单号在 所有订单信息|该账号相关的所有订单信息 中查询记录并压入展示链表
virtual void searchOderbytime_Pushin(int year,int month)=0;//按年月在 所有订单信息|该账号相关的所有订单信息 中查询记录并压入展示链表
virtual void searchOderbySenderPhone_Pushin(Phone &pho)=0;//按发送者的手机号在 所有订单信息|该账号相关的所有订单信息 中查询记录并压入显示链栈
virtual void searchOderbyReciverPhone_Pushin(Phone &pho)=0;//按接收者的手机号在 所有订单信息|该账号相关的所有订单信息 中查询记录并压入显示链栈
};
#include "Service.h"
Service::Service()
{
DataBase = new myDatabase;
Display_list_oder = new OderDisplay_list;
}
Service::~Service()
{
delete DataBase;
delete Display_list_oder;
}
tm* Service::TimeGetor()
{
time_t now = time(0);
tm*ltm = localtime(&now);
return ltm;
};
Time Service::time_tm2Time(tm *ltm)
{
std::string hour = std::to_string(ltm->tm_hour);
std::string min = std::to_string(ltm->tm_min);
std::string sec = std::to_string(ltm->tm_sec);
add0(hour,2);add0(min,2);add0(sec,2);
std::string temp = hour+min+sec;
Time res = temp;
return res;
};//把数字时间信息转成Time
DayYear Service::dayer_tm2Dayear(tm *ltm)
{ std::string year = std::to_string(ltm->tm_year+1900);
std::string month =std::to_string(ltm->tm_mon+1);
std::string day = std::to_string(ltm->tm_mday);
add0(year,4);add0(month,2);add0(day,2);
std::string temp = year+month+day;
DayYear res = temp;
return res;
};//把数字年月转成Dayear
void Service::add0(std::string &str,int n)
{
int round = str.length();
if(round>=n)return;
if(round<n)
{
std::string tem = "0";
for(round;round<n-1;round++)
{
tem+="0";
}
std::string res = tem+str;
str = res;
}
};
int Service::randomint()
{
srand(unsigned(time(NULL)));
int a = 1+(int)9999*rand()/(RAND_MAX+1);
return a;
};
OderCode Service::Creat_OderCode(const Time &tim,const DayYear &dyr)
{
std::string radomnum = std::to_string(randomint());
add0(radomnum,4);
std::string time = tim;
std::string dyrear = dyr;
std::string res = "FURRY"+dyrear+time+radomnum;
OderCode odco = res;
return odco;
}
这一层是服务类的抽象类,用纯虚函数把这一层指定成接口类,用来写User和Admin共有的一些方法。
Service_User
Service_User.h
#pragma once
#include "Service.h"
class Service_User :
public Service
{
public:
UserInfor_Node* User;
//特有的一个展示队列
AddressDisplay_list* Display_list_address;
Service_User();
~Service_User();
//账号相关操作
bool login(Account &act,PassWord &psw);
bool regist(Account &act,PassWord &psw,NickName &nic,Phone &pho);
void changePassword(PassWord &newPsw);
void changeNickname(NickName &newNic);
void Recharge(double money);
//地址簿相关操作
void Refresh_Display_list_address();//对地址信息展示栈的操作,刷新并展示此账号关联的地址信息
void Add_Address(RealName &name,Phone &pho,Address &Address);
void Del_Address(AddressInfor_Node* p);
void Change_Address(AddressInfor_Node* p,AddressInfor &ifor);
//订单相关操作
double culculator(int kinds,double weight);
Oder_Node* Add_Oder(AddressInfor_Node* sender,AddressInfor_Node* recevier,int kinds,Note notes,double price);//下订单
void Confirm_Oder(Oder_Node* p);
//订单查询业务
void AllOder_Pushin();//清空展示链表,同时把该账号相关的所有订单信息 压入展示链表
void searchOderbyOderCode_Pushiin(OderCode &code);//按订单号在该账号相关的所有订单信息 中查询记录并压入展示链表
void searchOderbytime_Pushin(int year,int month);//按年月在该账号相关的所有订单信息 中查询记录并压入展示链表
void searchOderbySenderPhone_Pushin(Phone &pho);//按发送者的手机号在该账号相关的所有订单信息 中查询记录并压入显示链栈
void searchOderbyReciverPhone_Pushin(Phone &pho);//按接收者的手机号在该账号相关的所有订单信息 中查询记录并压入显示链栈
};
Service_User.cpp
#include "Service_User.h"
Service_User::Service_User()
{
Display_list_address = new AddressDisplay_list;
User = NULL;
};
Service_User::~Service_User()
{
delete Display_list_address;
User = NULL;
}
bool Service_User::login(Account &act,PassWord &psw)
{
UserInfor_Node *p = DataBase->search_userP_by_Accont(act);
if(p!=NULL)
{
if(p->data.PassWord==psw)
{
this->User = p;
return true;
}
else
return false;
}
else
return false;
};
bool Service_User::regist(Account &act,PassWord &psw,NickName &nic,Phone &pho)
{
UserInfor_Node *p = DataBase->search_userP_by_Accont(act);
if(p!=NULL)return false;
UserInfor userdata = {act,pho,psw,nic,0};
UserInfor_Node* res = new UserInfor_Node(userdata);
DataBase->Userlist_ALL_P->PushBack(res);
return true;
};
void Service_User::changePassword(PassWord &newPsw)
{
User->data.PassWord = newPsw;
};
void Service_User::changeNickname(NickName &newNic)
{
User->data.NickName = newNic;
};
void Service_User::Recharge(double money)
{
User->data.money+=money;
};
void Service_User::Refresh_Display_list_address()
{
Display_list_address->clear();//清空显示栈
AddressInfor_Node* p;
int len = DataBase->Addreslist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Addreslist_ALL_P->GetI(i);
if(p->data.relateAccont == User->data.Accont)
{
AddressPointor_Node *pt = new AddressPointor_Node(p);
Display_list_address->PushBack(pt);//压入显示栈
}
}
};
void Service_User::Add_Address(RealName &name,Phone &pho,Address &Address)
{
AddressInfor adinfo = {User->data.Accont,name,pho,Address};
AddressInfor_Node *adrNode = new AddressInfor_Node(adinfo);
DataBase->Addreslist_ALL_P->PushBack(adrNode);
}
void Service_User::Del_Address(AddressInfor_Node* p)
{
int index = DataBase->Addreslist_ALL_P->Getindex(p);
DataBase->Addreslist_ALL_P->DelI(index);
};
void Service_User::Change_Address(AddressInfor_Node* p,AddressInfor &ifor)
{
p->data = ifor;
};
double Service_User::culculator(int kinds,double weight)//1:FRAGILLE 2:BOOK 3:NOMALL
{
if (kinds == FRAGILLE)
{
return weight * FRAGILLE_PRICE;
}
else if (kinds == BOOK)
{
return weight * BOOK_PRICE;
}
else if (kinds == NORMAL)
{
return weight * NORMAL_PRICE;
}
else
return 0;
}
Oder_Node* Service_User::Add_Oder(AddressInfor_Node* sender,AddressInfor_Node* recevier,int kinds,Note notes,double price)
{
tm* ltm = TimeGetor();
Time time_mine = time_tm2Time(ltm);
DayYear dayer = dayer_tm2Dayear(ltm);
OderCode code = Creat_OderCode(time_mine,dayer);
Timess timess(ltm);
Status statucode;
statucode.num1 = 1;
statucode.time1 = timess;
OderInfor data;
data.OderNum = code;
data.relateAccont = User->data.Accont;
data.Sender = sender->data;
data.Recevier = recevier->data;
data.StatuCode = statucode;
data.Kinds = kinds;
data.Price = price;
data.hadRecharged = 0;
data.notes = notes;
Oder_Node *Node = new Oder_Node(data);
DataBase->Oderlist_ALL_P->PushBack(Node);//把新的数据压入数据库
return Node;
};
void Service_User::Confirm_Oder(Oder_Node* p)
{
tm* ltm = TimeGetor();
p->data.StatuCode.num4 = 1;
p->data.StatuCode.time4.year = ltm->tm_year+1900;
p->data.StatuCode.time4.month = ltm->tm_mon+1;
p->data.StatuCode.time4.day = ltm->tm_mday;
p->data.StatuCode.time4.hour = ltm->tm_hour;
p->data.StatuCode.time4.minute = ltm->tm_min;
p->data.StatuCode.time4.sec = ltm->tm_sec;
};
void Service_User::AllOder_Pushin()
{
Display_list_oder->clear();
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
if(p->data.relateAccont==User->data.Accont)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
}
}
void Service_User::searchOderbyOderCode_Pushiin(OderCode &code)
{
Display_list_oder->clear();
Oder_Node* p=DataBase->search_OderP_by_OderCode(code);
if(p!= NULL&&p->data.relateAccont==User->data.Accont)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
};
void Service_User::searchOderbytime_Pushin(int year,int month)
{
Display_list_oder->clear();
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
if(p->data.relateAccont==User->data.Accont)
{
int ye = p->data.StatuCode.time1.year;
int mo = p->data.StatuCode.time1.month;
if(ye==year&&mo==month)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
}
}
};
void Service_User::searchOderbySenderPhone_Pushin(Phone &pho)
{
Display_list_oder->clear();
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
if(p->data.relateAccont==User->data.Accont)
{
Phone phone = p->data.Sender.Phone;
if(phone == pho)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
}
}
};
void Service_User::searchOderbyReciverPhone_Pushin(Phone &pho)
{
Display_list_oder->clear();
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
if(p->data.relateAccont==User->data.Accont)
{
Phone phone = p->data.Recevier.Phone;
if(phone == pho)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
}
}
};
对于User能干的事情进行了详细的编写,最终前端调用只创建Service_User对象并调用其中函数即可。
Service_Admin
Service_Admin.h
#pragma once
#include "Service.h"
class Service_Admin :
public Service
{
public:
AdministratorInfor_Node* Admin;
Service_Admin();
~Service_Admin();
bool login(Account &act,PassWord &psw);
void RecivedGoods(Oder_Node* p);
void ArrivedGoods(Oder_Node* p);
void getmoney();
void AllOder_Pushin();//清空展示链表,同时把 所有订单信息|该账号相关的所有订单信息 压入展示链表
void searchOderbyOderCode_Pushiin(OderCode &code);//按订单号在 所有订单信息|该账号相关的所有订单信息 中查询记录并压入展示链表
void searchOderbytime_Pushin(int year,int month);//按年月在 所有订单信息|该账号相关的所有订单信息 中查询记录并压入展示链表
void searchOderbySenderPhone_Pushin(Phone &pho);//按发送者的手机号在 所有订单信息|该账号相关的所有订单信息 中查询记录并压入显示链栈
void searchOderbyReciverPhone_Pushin(Phone &pho);//按接收者的手机号在 所有订单信息|该账号相关的所有订单信息 中查询记录并压入显示链栈
};
Service_Admin.cpp
#include "Service_Admin.h"
Service_Admin::Service_Admin()
{
Admin = NULL;
};
Service_Admin::~Service_Admin()
{
Admin = NULL;
}
bool Service_Admin::login(Account &act,PassWord &psw)
{
AdministratorInfor_Node* p = DataBase->search_adminP_by_Accont(act);
if(p!=NULL)
{
if(p->data.PassWord==psw)
{
this->Admin = p;
return true;
}
else
return false;
}
else
return false;
}
void Service_Admin::RecivedGoods(Oder_Node* p)
{
tm* ltm = TimeGetor();
p->data.StatuCode.num2 = 1;
p->data.StatuCode.time2.year = ltm->tm_year+1900;
p->data.StatuCode.time2.month = ltm->tm_mon+1;
p->data.StatuCode.time2.day = ltm->tm_mday;
p->data.StatuCode.time2.hour = ltm->tm_hour;
p->data.StatuCode.time2.minute = ltm->tm_min;
p->data.StatuCode.time2.sec = ltm->tm_sec;
};
void Service_Admin::ArrivedGoods(Oder_Node* p)
{
tm* ltm = TimeGetor();
p->data.StatuCode.num3 = 1;
p->data.StatuCode.time3.year = ltm->tm_year+1900;
p->data.StatuCode.time3.month = ltm->tm_mon+1;
p->data.StatuCode.time3.day = ltm->tm_mday;
p->data.StatuCode.time3.hour = ltm->tm_hour;
p->data.StatuCode.time3.minute = ltm->tm_min;
p->data.StatuCode.time3.sec = ltm->tm_sec;
};
void Service_Admin::getmoney()
{
if(Admin==NULL)return;
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
double money = 0;
for(int i =1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
int a = p->data.hadRecharged;
int b = p->data.StatuCode.num4;
if(a==0&&b==1)
{
p->data.hadRecharged = 1;
money+=p->data.Price;
}
}
Admin->data.money+=money;
}
//查询操作
void Service_Admin::AllOder_Pushin()
{
Display_list_oder->clear();
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
}
void Service_Admin::searchOderbyOderCode_Pushiin(OderCode &code)
{
Display_list_oder->clear();
Oder_Node* p=DataBase->search_OderP_by_OderCode(code);
if(p!= NULL)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
};
void Service_Admin::searchOderbytime_Pushin(int year,int month)
{
Display_list_oder->clear();
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
int ye = p->data.StatuCode.time1.year;
int mo = p->data.StatuCode.time1.month;
if(ye==year&&mo==month)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
}
};
void Service_Admin::searchOderbySenderPhone_Pushin(Phone &pho)
{
Display_list_oder->clear();
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
Phone phone = p->data.Sender.Phone;
if(phone == pho)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
}
};
void Service_Admin::searchOderbyReciverPhone_Pushin(Phone &pho)
{
Display_list_oder->clear();
Oder_Node* p;
int len = DataBase->Oderlist_ALL_P->getlen();
for(int i = 1;i<=len;i++)
{
p = DataBase->Oderlist_ALL_P->GetI(i);
Phone phone = p->data.Recevier.Phone;
if(phone == pho)
{
OderPointor_Node *pt = new OderPointor_Node(p);
Display_list_oder->PushBack(pt);
}
}
};
对于Admin能干的事情进行了详细的编写,最终前端调用只创建Service_Admin对象并调用其中函数即可。
前端交互
在这里面,主要是对展示链表内数据的解析以及调用后端暴露出的接口函数,并把一些简单的判错逻辑实现掉。还有就是界面的展示。
windows
windows.h
#pragma once
#include "config.h"
#include "Service_User.h"
#include "Service_Admin.h"
using namespace std;
void window_welcome();
void window_Userlogin();
void window_Adminlogin();
void window_Regist();
void window_UserPlatform(Service_User &ser_user);
void window_AdminPlatform(Service_Admin &ser_adim);
void window_OderManage(Service_Admin &ser_adim,int now);
void window_OderManage(Service_User &ser_user,int now);
void frame_DisplayOder(OderPointor_Node *oderP,int ind);
void Detail_DisplayOder(Oder_Node* p);
void window_addressManage(Service_User &ser_user,int now);
void frame_DisplayAddress(AddressInfor_Node *adrsP,int ind);
#include "windows.h"
void window_welcome()
{
cout<<" ======================FURRYTMS========================="<<endl;
cout<<" = 欢迎使用物流管理系统 ="<<endl;
cout<<" = 用户登录请扣1 ="<<endl;
cout<<" = 管理员登录请扣2 ="<<endl;
cout<<" = 注册请扣3 ="<<endl;
cout<<" = 退出请扣0 ="<<endl;
cout<<" ======================FURRYTMS========================="<<endl;
}
void window_Userlogin()
{
cout<<" ======================FURRYTMS========================="<<endl;
cout<<" = ="<<endl;
cout<<" = 用户登录 ="<<endl;
cout<<" = 继续请扣1 ="<<endl;
cout<<" = 返回请扣0 ="<<endl;
cout<<" = ="<<endl;
cout<<" ======================FURRYTMS========================="<<endl;
}
void window_Adminlogin()
{
cout<<" ======================FURRYTMS========================="<<endl;
cout<<" = ="<<endl;
cout<<" = 管理员登录 ="<<endl;
cout<<" = 继续请扣1 ="<<endl;
cout<<" = 返回请扣0 ="<<endl;
cout<<" = ="<<endl;
cout<<" ======================FURRYTMS========================="<<endl;
};
void window_Regist()
{
cout<<" ======================FURRYTMS========================="<<endl;
cout<<" = ="<<endl;
cout<<" = 欢迎使用FURRYTMS! ="<<endl;
cout<<" = 即将为您注册账号 ="<<endl;
cout<<" = 继续请扣1 ="<<endl;
cout<<" = 返回请扣0 ="<<endl;
cout<<" = ="<<endl;
cout<<" ======================FURRYTMS========================="<<endl;
};
void window_UserPlatform(Service_User &ser_user)
{
NickName n = ser_user.User->data.NickName;
double m = ser_user.User->data.money;
cout<<"===================================FURRYTMS==================================="<<endl;
cout<<" 你好,"<<n<<"!"<<" ~( ̄▽ ̄~)(~ ̄▽ ̄)~ 账户余额:"<<m<<endl;
cout<<"= 我的快递[1] 下订单[2] ="<<endl;
cout<<"= 我的地址簿[3] 充值[4] ="<<endl;
cout<<"= 修改密码[5] 修改昵称[6] ="<<endl;
cout<<"= 退出程序[0] ="<<endl;
cout<<"===================================FURRYTMS==================================="<<endl;
};
void window_AdminPlatform(Service_Admin &ser_adim)
{
NickName n = ser_adim.Admin->data.NickName;
double m = ser_adim.Admin->data.money;
cout<<"===================================FURRYTMS==================================="<<endl;
cout<<" 你好,"<<n<<"!"<<" 账户余额:"<<m<<endl;
cout<<"= "<<endl;
cout<<"= 管理快递[1] "<<endl;
cout<<"= ヽ(`д´)ノ "<<endl;
cout<<"= 退出系统[0] "<<endl;
cout<<"= "<<endl;
cout<<"= @管理员平台 "<<endl;
cout<<"===================================FURRYTMS==================================="<<endl;
};
void frame_DisplayOder(OderPointor_Node *oderP,int ind)
{ OderCode odcod = oderP->data->data.OderNum;
RealName senNa = oderP->data->data.Sender.name;
RealName recNa = oderP->data->data.Recevier.name;
string statu;
Status st = oderP->data->data.StatuCode;
if(st.num1==1&&st.num2==0&&st.num3==0&&st.num4==0){statu = "代取件";}
else if (st.num1==1&&st.num2==1&&st.num3==0&&st.num4==0){statu = "运输中";}
else if (st.num1==1&&st.num2==1&&st.num3==1&&st.num4==0){statu = "代取件";}
else if (st.num1==1&&st.num2==1&&st.num3==1&&st.num4==1){statu = "已完成";}
else {statu = "未知";}
int year = st.time1.year;
cout<<"------------------------------------Oder-------------------------------------"<<endl;
cout<<"|"<<ind<<"、 "<<endl;
cout<<"|订单号:"<<odcod<<" "<<endl;
cout<<"|发件人:"<<senNa<<" "<<endl;
cout<<"|收件人:"<<recNa<<" ="<<endl;
cout<<"|当前状态:"<<statu<<" @管理员平台 ="<<endl;
cout<<"|下单时间:"<<st.time1.year<<st.time1.month<<st.time1.day<<st.time1.hour<<st.time1.minute<<" @管理员平台 ="<<endl;
cout<<"------------------------------------FURRYTMS--------------------------------"<<endl;
};
void frame_DisplayAddress(AddressInfor_Node *adrsP,int ind)
{
cout<<"-"<<ind<<"----------------------------------Address-------------------------------------"<<endl;
cout<<"|姓名:"<<adrsP->data.name<<endl;
cout<<"|手机号:"<<adrsP->data.Phone<<endl;
cout<<"|地址:"<<adrsP->data.Address<<endl;
cout<<"------------------------------------FURRYTMS--------------------------------"<<endl;
};
void window_OderManage(Service_Admin &ser_adim,int now)
{
int len = ser_adim.Display_list_oder->getlen();
int allPage = len/4+1;
int round = 0;
if(allPage>now)round = 4;
else round = len%4;
cout<<"===================================FURRYTMS==================================="<<endl;
if(ser_adim.Display_list_oder->isEmpty())
{
cout<<"===================================Fund Nothing==================================="<<endl;
}
else
{
for(int i = 1;i<=round;i++)
{
int index = (now-1)*4+i;
OderPointor_Node *p = ser_adim.Display_list_oder->GetI(index);
frame_DisplayOder(p,i);
}
}
cout<<" "<<now<<"/"<<allPage<<endl;
cout<<"===================================FURRYTMS==================================="<<endl;
cout<<"1~4查看订单详情并操作 5 展示全部订单信息 6 按订单号查找订单 7 按时间查找订单 8 按发件人手机号查找 "<<endl;
cout<<"9 按收件人手机号查找订单信息 0 返回上一级 11 向前翻页 22 向后翻页"<<endl;
};
void window_OderManage(Service_User &ser_user,int now)
{
int len = ser_user.Display_list_oder->getlen();
int allPage = len/4+1;
int round = 0;
if(allPage>now)round = 4;
else round = len%4;
cout<<"===================================FURRYTMS==================================="<<endl;
if(ser_user.Display_list_oder->isEmpty())
{
cout<<"===================================Fund Nothing==================================="<<endl;
}
else
{
for(int i = 1;i<=round;i++)
{
int index = (now-1)*4+i;
OderPointor_Node *p = ser_user.Display_list_oder->GetI(index);
frame_DisplayOder(p,i);
}
}
cout<<" "<<now<<"/"<<allPage<<endl;
cout<<"===================================FURRYTMS==================================="<<endl;
cout<<"1~4查看订单详情并操作 5 展示全部订单信息 6 按订单号查找订单 7 按时间查找订单 8 按发件人手机号查找 "<<endl;
cout<<"9 按收件人手机号查找订单信息 0 返回上一级 11 向前翻页 22 向后翻页"<<endl;
};
void window_addressManage(Service_User &ser_user,int now)
{
int len = ser_user.Display_list_address->getlen();
int allPage = len/4+1;
int round = 0;
if(allPage>now)round = 4;
else round = len%4;
cout<<"===================================FURRYTMS==================================="<<endl;
if(ser_user.Display_list_address->isEmpty())
{
cout<<"===================================Fund Nothing==================================="<<endl;
}
else
{
for(int i = 1;i<=round;i++)
{
int index = (now-1)*4+i;
AddressInfor_Node *p = ser_user.Display_list_address->GetI(index)->data;
frame_DisplayAddress(p,index);
}
}
cout<<" "<<now<<"/"<<allPage<<endl;
cout<<"===================================FURRYTMS==================================="<<endl;
cout<<"扣1新建地址 扣2删除地址 扣3修改地址 扣0返回上一级"<<endl;
cout<<" 扣4上一页 扣5下一页 "<<endl;
};
void Detail_DisplayOder(Oder_Node *oderP)
{
OderCode odcod = oderP->data.OderNum;
RealName senNa = oderP->data.Sender.name;
RealName recNa = oderP->data.Recevier.name;
string statu;
Status st = oderP->data.StatuCode;
if(st.num1==1&&st.num2==0&&st.num3==0&&st.num4==0){statu = "代取件";}
else if (st.num1==1&&st.num2==1&&st.num3==0&&st.num4==0){statu = "运输中";}
else if (st.num1==1&&st.num2==1&&st.num3==1&&st.num4==0){statu = "代取件";}
else if (st.num1==1&&st.num2==1&&st.num3==1&&st.num4==1){statu = "已完成";}
else {statu = "未知";}
string kinddds;
int kinds = oderP->data.Kinds;
if (kinds == FRAGILLE)
{
kinddds = "易碎品";
}
else if (kinds == BOOK)
{
kinddds = "书籍";
}
else if (kinds == NORMAL)
{
kinddds = "普通货物";
}
int year = st.time1.year;
cout<<"------------------------------------Oder-------------------------------------"<<endl;
cout<<"|订单号:"<<odcod<<" "<<endl;
cout<<"|关联账户:"<<oderP->data.relateAccont<<" "<<endl;
cout<<"|发件人:"<<senNa<<" "<<endl;
cout<<"|发件人手机号:"<<oderP->data.Sender.Phone<<" "<<endl;
cout<<"|收件人:"<<recNa<<" ="<<endl;
cout<<"|收件人手机号:"<<oderP->data.Recevier.Phone<<" "<<endl;
cout<<"|当前状态:"<<statu<<" ="<<endl;
cout<<"|下单时间:"<<st.time1.year<<st.time1.month<<st.time1.day<<st.time1.hour<<st.time1.minute<<" ="<<endl;
cout<<"|种类:"<<kinddds<<" ="<<endl;
cout<<"|运费:"<<oderP->data.Price<<" "<<endl;
cout<<"|备注:"<<oderP->data.notes<<" @管理员平台 ="<<endl;
cout<<"------------------------------------FURRYTMS--------------------------------"<<endl;
};
数据的最终解析与展示,还有界面
cmdApp
cmdApp.h
#pragma once
#include "Service_User.h"
#include "Service_Admin.h"
#include "windows.h"
using namespace std;
void run();
void welcome(Service_Admin &ser_adim,Service_User &ser_user,int &wh);
bool Userlogin(Service_Admin &ser_adim,Service_User &ser_user,int &wh);
bool Adminlogin(Service_Admin &ser_adim,Service_User &ser_user,int &wh);
bool UserRegist(Service_User &ser_user);
void Oderdetail(Service_Admin &ser_adim,Oder_Node *node);//admin用的订单查询
void Oderdetail(Service_User &ser_user,Oder_Node *node);//admin用的订单查询
void userPlatform(Service_User &ser_user);
void UserOderManage(Service_User &ser_user);
void UserAdresManage(Service_User &ser_user);
void adminPlatform(Service_Admin &ser_adim);
void AdminOderManage(Service_Admin &ser_adim);
void showAddress_simple(Service_User &ser_user);
void addOder(Service_User& ser_user);
#include "cmdApp.h"
void run()
{
Service_Admin service_Admin;
Service_User service_User;
int who = 0;
welcome(service_Admin,service_User,who);
if(who ==1)//进到用户界面
{
userPlatform(service_User);
service_User.DataBase->saveAll();
return;
}
else if (who ==2)//进到管理员界面
{
adminPlatform(service_Admin);
service_Admin.DataBase->saveAll();
return;
}
}
void welcome(Service_Admin &ser_adim,Service_User &ser_user,int& wh)
{
window_welcome();//界面
cout<<"请输入0-3:";
int input = 0;//操作数
while(cin>>input)
{
if(input<0||input>3)
{
cout<<"错误输入,请重新输入0-3"<<endl;
continue;
}
switch (input)
{
case 1:
{
bool t = Userlogin(ser_adim,ser_user,wh);
if(t)return;
break;
}
case 2:
{
bool t = Adminlogin(ser_adim,ser_user,wh);
if(t)return;
break;
}
case 3:
{
bool t = UserRegist(ser_user);
break;
}
case 0:
{
cout<<"byebye~"<<endl;
return;
}
}
window_welcome();//界面
cout<<"请输入0-3:";
}
}
bool UserRegist(Service_User &ser_user)
{
window_Regist();
int input = 0;//操作数
cout<<"请输入0-1:";
while(cin>>input)
{
if(input<0||input>1)
{
cout<<"错误输入,请重新输入0-1"<<endl;
continue;
}
switch (input)
{
case 1:
{
string actt;
string psww;
string nic;
string pho;
cout<<"请输入账号:";cin>>actt;cout<<endl;
cout<<"请输入密码:";cin>>psww;cout<<endl;
cout<<"请输入昵称:";cin>>nic;cout<<endl;
cout<<"请输入手机号:";cin>>pho;cout<<endl;
Account act(actt);PassWord psw(psww);NickName niic(nic);Phone ph(pho);
int res = ser_user.regist(act,psw,niic,ph);
if(res == 1)
{
cout<<"注册成功!欢迎您 "<<endl;
ser_user.DataBase->saveAll();
return true;
}
else if (res==0)
{
cout<<"此账号已被注册,请试试别的账号!"<<endl;
cout<<"请输入0-1:";
break;
}
}
case 0:
{
return false;
}
}
window_Regist();//界面
cout<<"请输入0-1"<<endl;
}
}
bool Userlogin(Service_Admin &ser_adim,Service_User &ser_user,int &wh)
{
window_Userlogin();
int input = 0;//操作数
cout<<"请输入0-1:";
while(cin>>input)
{
if(input<0||input>1)
{
cout<<"错误输入,请重新输入0-1"<<endl;
continue;
}
switch (input)
{
case 1:
{
string actt;
string psww;
cout<<"请输入账号:";cin>>actt;cout<<endl;
cout<<"请输入密码:";cin>>psww;cout<<endl;
Account act(actt);PassWord psw(psww);
int res = ser_user.login(act,psw);
if(res == 1)
{
cout<<"登录成功!欢迎您 "<<ser_user.User->data.NickName<<endl;
wh = 1;
return true;
}
else if (res==0)
{
cout<<"账号或密码错误,请重新输入!"<<endl;
cout<<"请输入0-1:";
}
break;
}
case 0:
{
return false;
}
}
window_Userlogin();//界面
cout<<"请输入0-1";
}
}
bool Adminlogin(Service_Admin &ser_adim,Service_User &ser_user,int &wh)
{
window_Adminlogin();
int input = 0;//操作数
cout<<"请输入0-1:";
while(cin>>input)
{
if(input<0||input>2)
{
cout<<"错误输入,请重新输入0-1"<<endl;
continue;
}
switch (input)
{
case 1:
{
string actt;
string psww;
cout<<"请输入管理员账号:";cin>>actt;cout<<endl;
cout<<"请输入密码:";cin>>psww;cout<<endl;
Account act(actt);PassWord psw(psww);
int res = ser_adim.login(act,psw);
if(res == 1)
{
cout<<"登录成功!欢迎您 "<<ser_adim.Admin->data.NickName<<endl;
wh = 2;
return true;
}
else if (res==0)
{
cout<<"账号或密码错误,请重新输入!"<<endl;
cout<<"请输入0-1:";
}
break;
}
case 0:
{
return false;
}
}
window_Adminlogin();//界面
cout<<"请输入0-1";
}
}
void userPlatform(Service_User &ser_user)
{
window_UserPlatform(ser_user);//界面
cout<<"请输入0~6:";
int input = 0;//操作数
while(cin>>input)
{
if(input<0||input>6)
{
cout<<"错误输入,请重新输入0-6"<<endl;
continue;
}
switch (input)
{
case 1:
{
UserOderManage(ser_user);
break;
}
case 2:
{
addOder(ser_user);
break;
}
case 3:
{
UserAdresManage(ser_user);
break;
}
case 4:
{
double money;
cout<<"请输入你要充值的金额:";
cin>>money;
ser_user.Recharge(money);
cout<<"充值完成!"<<endl;
break;
}
case 5:
{
string pasw;
cout<<"请输入您的新密码:";
cin>>pasw;
PassWord psw(pasw);
ser_user.changePassword(psw);
cout<<"密码修改完成!您的新密码是:"<<ser_user.User->data.PassWord<<endl;
break;
}
case 6:
{
string newni;
cout<<"请输入您的新昵称";
cin>>newni;
NickName nick(newni);
ser_user.changeNickname(nick);
cout<<"昵称修改完成,你好,"<<ser_user.User->data.NickName<<"!"<<endl;
break;
}
case 0:
{
cout<<"byebye~"<<endl;
return;
}
}
window_UserPlatform(ser_user);//界面
cout<<"请输入0-6:";
}
};
void adminPlatform(Service_Admin &ser_adim)
{
window_AdminPlatform(ser_adim);//界面
cout<<"请输入0~1:";
int input = 0;//操作数
while(cin>>input)
{
if(input<0||input>1)
{
cout<<"错误输入,请重新输入0-1"<<endl;
continue;
}
switch (input)
{
case 1:
{
AdminOderManage(ser_adim);
break;
}
case 0:
{
cout<<"byebye~"<<endl;
return;
}
}
window_AdminPlatform(ser_adim);//界面
cout<<"请输入0-1:";
}
};
void AdminOderManage(Service_Admin &ser_adim)
{
// int lenth;
// int alPage;
// int lenth = ser_adim.Display_list_oder->getlen();
// int alPage = lenth/4 +1;
// int now;
int now = 1;
ser_adim.AllOder_Pushin();
window_OderManage(ser_adim,now);//界面
cout<<"请输入0~9,11 or 22:";
int input = 0;//操作数
while(cin>>input)
{
if(input<0||input>9)
{
if (input!=11||input!=22)
{
cout<<"错误输入,请重新输入0-9"<<endl;
continue;
}
}
switch (input)
{
case 1:
{
Oder_Node* p = ser_adim.Display_list_oder->GetI((now-1)*4+1)->data;
Oderdetail(ser_adim,p);
break;
}
case 2:
{
Oder_Node* p = ser_adim.Display_list_oder->GetI((now-1)*4+2)->data;
Oderdetail(ser_adim,p);
break;
}
case 3:
{
Oder_Node* p = ser_adim.Display_list_oder->GetI((now-1)*4+3)->data;
Oderdetail(ser_adim,p);
break;
}
case 4:
{
Oder_Node* p = ser_adim.Display_list_oder->GetI((now-1)*4+4)->data;
Oderdetail(ser_adim,p);
break;
}
case 5:
{
now = 1;
ser_adim.AllOder_Pushin();
break;
}
case 6:
{
now = 1;
cout<<"请输入订单号:";
string tem;
cin>>tem;
cout<<endl;
OderCode odc(tem);
ser_adim.searchOderbyOderCode_Pushiin(odc);
break;
}
case 7:
{
now = 1;
int year;int month;
cout<<"请输入年份:";
cin>>year;
cout<<"请输入月份:";
cin>>month;
ser_adim.searchOderbytime_Pushin(year,month);
break;
}
case 8:
{
now = 1;
string ph;
cout<<"请输入发件人的手机号";
cin>>ph;
Phone phon(ph);
ser_adim.searchOderbySenderPhone_Pushin(phon);
break;
}
case 9:
{
string ph;
now = 1;
cout<<"请输入收件人的手机号";
cin>>ph;
Phone phon(ph);
ser_adim.searchOderbyReciverPhone_Pushin(phon);
break;
}
case 11:
{ if(now-1>0)
now--;
else
cout<<"已经是第一页啦~"<<endl;
break;
}
case 22:
{
if(now+1>ser_adim.Display_list_oder->getlen()/4+1)
now++;
else
cout<<"已经是最后一页啦~"<<endl;
break;
}
case 0:
{
return;
}
}
window_OderManage(ser_adim,now);//界面
cout<<"请输入0-9,11or12:";
}
};
void UserOderManage(Service_User &ser_user)
{
// int lenth;
// int alPage;
// int lenth = ser_adim.Display_list_oder->getlen();
// int alPage = lenth/4 +1;
// int now;
int now = 1;
ser_user.AllOder_Pushin();
window_OderManage(ser_user,now);//界面
cout<<"请输入0~9,11 or 22:";
int input = 0;//操作数
while(cin>>input)
{
if(input<0||input>9)
{
if (input!=11||input!=22)
{
cout<<"错误输入,请重新输入0-9"<<endl;
continue;
}
}
switch (input)
{
case 1:
{
Oder_Node* p = ser_user.Display_list_oder->GetI((now-1)*4+1)->data;
Oderdetail(ser_user,p);
break;
}
case 2:
{
Oder_Node* p = ser_user.Display_list_oder->GetI((now-1)*4+2)->data;
Oderdetail(ser_user,p);
break;
}
case 3:
{
Oder_Node* p = ser_user.Display_list_oder->GetI((now-1)*4+3)->data;
Oderdetail(ser_user,p);
break;
}
case 4:
{
Oder_Node* p = ser_user.Display_list_oder->GetI((now-1)*4+4)->data;
Oderdetail(ser_user,p);
break;
}
case 5:
{
now = 1;
ser_user.AllOder_Pushin();
break;
}
case 6:
{
now = 1;
cout<<"请输入订单号:";
string tem;
cin>>tem;
cout<<endl;
OderCode odc(tem);
ser_user.searchOderbyOderCode_Pushiin(odc);
break;
}
case 7:
{
now = 1;
int year;int month;
cout<<"请输入年份:";
cin>>year;
cout<<"请输入月份:";
cin>>month;
ser_user.searchOderbytime_Pushin(year,month);
break;
}
case 8:
{
now = 1;
string ph;
cout<<"请输入发件人的手机号";
cin>>ph;
Phone phon(ph);
ser_user.searchOderbySenderPhone_Pushin(phon);
break;
}
case 9:
{
string ph;
now = 1;
cout<<"请输入收件人的手机号";
cin>>ph;
Phone phon(ph);
ser_user.searchOderbyReciverPhone_Pushin(phon);
break;
}
case 11:
{ if(now-1>0)
now--;
else
cout<<"已经是第一页啦~"<<endl;
break;
}
case 22:
{
if(now+1>ser_user.Display_list_oder->getlen()/4+1)
now++;
else
cout<<"已经是最后一页啦~"<<endl;
break;
}
case 0:
{
return;
}
}
window_OderManage(ser_user,now);//界面
cout<<"请输入0-9,11or12:";
}
};
//
void UserAdresManage(Service_User &ser_user)
{
int now = 1;
ser_user.Refresh_Display_list_address();
window_addressManage(ser_user,now);//界面
cout<<"请输入0~9,11 or 22:";
int input = 0;//操作数
while(cin>>input)
{
if(input<0||input>9)
{
if (input!=11||input!=22)
{
cout<<"错误输入,请重新输入0-9"<<endl;
continue;
}
}
switch (input)
{
case 1:
{
string nam;
string pho;
string add;
cout<<"请输入姓名:";cin>>nam;cout<<endl;
cout<<"请输入手机号:";cin>>pho;cout<<endl;
cout<<"请输入地址:";cin>>add;cout<<endl;
RealName name(nam);
Phone phone(pho);
Address adres(add);
ser_user.Add_Address(name,phone,adres);
cout<<"新建地址信息完成";
ser_user.Refresh_Display_list_address();
now = 1;
break;
}
case 2:
{
int index = 0;
cout<<"请输入要删除的地址信息序号:";cin>>index;cout<<endl;
if(index<1||index>ser_user.Display_list_address->getlen())
{
cout<<"请输入正确的序号!"<<endl;
break;
}
AddressInfor_Node* p = ser_user.Display_list_address->GetI(index)->data;
ser_user.Del_Address(p);
cout<<"完成删除"<<endl;
ser_user.Refresh_Display_list_address();
now = 1;
break;
}
case 3:
{
int index = 0;
cout<<"请输入要修改的地址信息序号:";cin>>index;cout<<endl;
if(index<1||index>ser_user.Display_list_address->getlen())
{
cout<<"请输入正确的序号!"<<endl;
break;
}
AddressInfor_Node* p = ser_user.Display_list_address->GetI(index)->data;
string nam;
string pho;
string add;
cout<<"请输入姓名:";cin>>nam;cout<<endl;
cout<<"请输入手机号:";cin>>pho;cout<<endl;
cout<<"请输入地址:";cin>>add;cout<<endl;
RealName name(nam);
Phone phone(pho);
Address adres(add);
AddressInfor adrsif = {ser_user.User->data.Accont,name,phone,adres};
ser_user.Change_Address(p,adrsif);
cout<<"修改完成!" ;
ser_user.Refresh_Display_list_address();
now = 1;
break;
}
case 4:
{
if(now-1>0)
now--;
else
cout<<"已经是第一页啦~"<<endl;
break;
}
case 5:
{
if(now+1>ser_user.Display_list_oder->getlen()/4+1)
now++;
else
cout<<"已经是最后一页啦~"<<endl;
break;
}
case 0:
{
return;
}
}
window_addressManage(ser_user,now);//界面
cout<<"请输入0-5:";
}
};
void Oderdetail(Service_Admin &ser_adim,Oder_Node *node)
{
Detail_DisplayOder(node);
cout<<"[1]我已收到此货物 [2]此货物已送达 [0]返回上一级"<<endl;
cout<<"请输入0~2:";
int input = 0;//操作数
while(cin>>input)
{
if(input<0||input>2)
{
cout<<"错误输入,请重新输入0-1"<<endl;
continue;
}
switch (input)
{
case 1:
{
int ket = 0;
cout<<"确认操作? 1 or 0:";cin>>ket;
if(ket)
{ser_adim.RecivedGoods(node);
cout<<"订单状态已修改"<<endl;
}
break;
}
case 2:
{
int ket = 0;
cout<<"确认操作? 1 or 0:";cin>>ket;
if(ket)
{
ser_adim.ArrivedGoods(node);
cout<<"订单状态已修改"<<endl;
}
break;
}
case 0:
{
return;
}
}
Detail_DisplayOder(node);
cout<<"[1]我已收到此货物 [2]此货物已送达 [0]返回上一级"<<endl;
cout<<"请输入0-2:";
}
};
void Oderdetail(Service_User &ser_user,Oder_Node *node)//用户界面的订单详情
{
Detail_DisplayOder(node);
cout<<"[1]我已收到此货物 [0]返回上一级"<<endl;
cout<<"请输入0~1:";
int input = 0;//操作数
while(cin>>input)
{
if(input<0||input>1)
{
cout<<"错误输入,请重新输入0-1"<<endl;
continue;
}
switch (input)
{
case 1:
{ int ket = 0;
cout<<"确认操作? 1 or 0:";cin>>ket;
if(ket)
{
cout<<"已确认收货,感谢您的信赖"<<endl;
ser_user.Confirm_Oder(node);
}
break;
}
case 0:
{
return;
}
}
Detail_DisplayOder(node);
cout<<"[1]我已收到此货物 [2]此货物已送达 [0]返回上一级"<<endl;
cout<<"请输入0-2:";
}
};
void showAddress_simple(Service_User &ser_user)
{
ser_user.Refresh_Display_list_address();
int i = ser_user.Display_list_address->getlen();
for(int j = 1;j<=i;j++)
{
AddressInfor_Node *p = ser_user.Display_list_address->GetI(j)->data;
cout<<j<<"、"<<"姓名:"<<p->data.name<<" 手机号:"<<p->data.Phone<<" 地址:"<<p->data.Address<<endl;
}
};
void addOder(Service_User &ser_user)
{
int kin;
double weight;
string notes;
cout<<"请填写以下表单"<<endl;
cout<<"请选择货物的类型: [1]易碎品 [2]书籍 [3]普通货物"<<endl;
while(cin>>kin)
{
if(kin<1||kin>3)
{
cout<<"请选择正确的货物种类"<<endl;
cout<<"请选择货物的类型: [1]易碎品 [2]书籍 [3]普通货物"<<endl;
}
else
break;
}
cout<<"请输入货物的重量/件数:";cin>>weight;
int index1 = 0,index2 = 0;
showAddress_simple(ser_user);
cout<<"请选择发件人的地址信息:";
while(cin>>index1)
{
if(index1>0&&index1<ser_user.Display_list_address->getlen())break;
else
{
cout<<"请按地址簿序号正确填写"<<endl;
}
};
showAddress_simple(ser_user);
cout<<"请选择收件人的地址信息:";
while(cin>>index2)
{
if(index2>0&&index2<ser_user.Display_list_address->getlen())break;
else
{
cout<<"请按地址簿序号正确填写"<<endl;
}
};
cout<<"请输入备注:"<<endl;cin>>notes;
Note nots(notes);
cout<<"正在生成订单..."<<endl;
AddressInfor_Node* sender = ser_user.Display_list_address->GetI(index1)->data;
AddressInfor_Node* reciver = ser_user.Display_list_address->GetI(index2)->data;
double price = ser_user.culculator(kin,weight);
Oder_Node* p = ser_user.Add_Oder(sender,reciver,kin,notes,price);
cout<<"您的订单已生成,订单号是:"<<p->data.OderNum<<endl;
cout<<"您稍后可在【我的订单】选项中查看订单状态"<<endl;
}
最长也是最shit山的一个,写完不想看第二眼。主要实现了页面跳转逻辑以及一些业务逻辑的处理。
在这里还实现了一个简单的分页功能,可以把展示链表里的内容分页展示,支持翻页,还是挺有趣的
总结
写的很shit,还是以记录为主。
记录下大二上学期的结束,记录下菜鸡的自己。
随便用,如果能帮到你留个言让我感动一下)