【content】
项目简介
项目名称:面包星推荐——好吃不贵的面包入手推荐
项目目的:为商家提供录入面包信息的服务、为用户提供查询面包信息的服务、寻找附近最近的面包店(该项服务有待开发)
项目背景:随着人民生活水平的不断提高,人们对食物的要求也在不断提高。减肥或健身人士对面包的要求会较为苛刻,他们更想要选择适合自己健身目标的面包;爱好甜品或面包的大小朋友们会跟家在意面包的口感,寻找跟适合自己口味的面包。该软件的开发基于用户对面包的要求不同,帮助用户省时省力地找到适合自己的面包。
行业背景:随着科技社会的日益发展,面包的种类和口味可谓是与日俱增,适当的甜品摄入对人体是有好处的,比如在进行大量脑力活动后来一个甜甜的纸杯蛋糕,不乏美味,也能减轻大脑疲劳。当我们走进面包店,扑面而来的面包香气夹杂着奶油的清甜在空气中酝酿,一口咬下去的满足感在我们的脑海中挥之不去,这个时候看着琳琅满目的面包以及旁边标签上的价钱,如何选择一款好吃不贵、又能满足自己对甜品期望值的面包就成为了不少人的难题。
PPT简介
项目优缺点
优点
①该项目具有针对性,专为喜爱面包、甜品的用户提供服务,服务内容更具体;
②软件分区明确,功能明确,提供多元的信息录入渠道;
③软件可拓展性强,可以由此延伸出多种服务;
④实现录入面包信息的功能,便于商家和顾客使用查找;
⑤实现查找面包信息的功能,有很多不同的分类便于查找,便于功能使用;
⑥实现提出建议的功能,有利于产品维护与后期更新。
缺点
程序:
①如果输入信息错误对应的店铺或面包或蛋糕只能修改一项信息;
②查询功能不够完善,数据库数据不够充足,查询范围有限;
功能:
①供用户导航到对应面包店的功能待开发;
②借助个性化推荐引擎,根据用户搜索频率与搜索内容可给用户推荐用户可能喜欢的面包信息待开发;
③根据商家创建的信息推出面包销量排行榜的功能待开发;
④实时更新面包销量数据及剩余量的功能待开发
总体来说,仍有部分功能尚不完善,可发展的项目受部分局限。
代码部分展示
(没有进行多文件编译)
对于控制台的字体颜色改变通过函数进行,详情见【c++】设置控制台窗口字体颜色和背景色(system和SetConsoleTextAttribute函数 )https://blog.csdn.net/AWMsilverL/article/details/125714259?spm=1001.2014.3001.5501
//ourc++ ——类的定义
#include<iostream>
#include<string>
#include<vector>
#include<Windows.h>
using namespace std;
string bcname = "面包&蛋糕"; //改变提示信息
class Bread_store //面包店相关信息——面包店名、位置、联系方式,以及对面包店进行计数
class Name //【组合类一】面包/蛋糕名称
class Price//【组合类二】面包/蛋糕价钱
class Date //【组合类三】面包/蛋糕的日期——生产日期和保质期
class Taste //【组合类四】面包的口感——口味+松软度+甜度
class Ingredients //【组合类五】面包的原料——配料表
class Recommend //【组合类六】面包/蛋糕推荐——面包的评价、推荐指数以及适食用的时间
class Bread //汇总
class Inch //Cake类的友元类
class Cake :public Bread //cake类,作为bread类的派生类
//文件作用域皆可用
vector<Bread>mybread; //用vector数组创建一个Bread类的对象,可创建多个对象
vector<Bread_store>mystore; //用vector数组创建一个Bread_store类的对象,可创建多个对象
vector<Cake>mycake; //用vector数组创建一个Cake类的对象,可创建多个对象
void p(char y) //设置字体颜色
{
if (y == 'y') {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);//设置黄色
}
else if (y == 'w') {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//设置白色
}
else if (y == 'g') {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);//设置灰色
}
else if (y == 'r') {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
}
else if (y == 'q') {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//设置青色
}
}
const void display_Bread(Bread_store mybreadstore, vector<Bread>mybread) //diaplay函数,来展示面包店及面包的信息,设为常函数,不改变值
const void display_Cake(Bread_store mybreadstore, vector<Cake>mycake)
void change_store(Bread_store* b) //店铺信息错误纠正
bool notsame(string n) //判断输入的店铺查询信息是否有存档
bool notsame1(string n) //判断输入的面包查询信息是否有存档
bool notsame2(string n) //判断输入的蛋糕查询信息是否有存档
int main()
{
//在数据库内创建一些对象供用户查询
//两家Bread_store
Bread_store system_store[2] = { Bread_store("奈雪の茶","雁塔区长安中路123号赛格购物中心1层QC101","13925241884"),Bread_store("二牛极致烘焙(政法大学店)","雁塔区长安南路321号东八里新村4号楼一层临街","029-87551996") };
//bread的一些信息:名称、价钱、生产日期、保质期、口味、原料、评价等等
Name sn1[3] = { Name("草莓魔法棒"),Name("樱花白桃软欧包"),Name("一串葡萄") };
Name sn2("提拉米苏罐子蛋糕");
Name se1[3] = { Name("奥利奥|雪媚娘"),Name("全麦莓果|法式硬欧包"),Name("云朵乳酪卷") };
Name se2("杨枝甘露|啵啵杯");
Price pn1[3] = { Price("20"),Price("19"), Price("20") };
Price pn2("25");
Price pe1[3] = { Price("22"),Price("15"), Price("27") };
Price pe2("19.8");
Date dn1[3] = { Date("2022","5","3","2"),Date("2022","5","3","2") ,Date("2022","5","3","1") };
Date dn2("2022", "5", "3", "2");
Date de1[3] = { Date("2022","5","3","1"),Date("2022","5","2","5") ,Date("2022","5","3","3") };
Date de2("2022", "5", "3", "1");
Taste tn1[3] = { Taste("微甜","很软"),Taste("甜(白桃果酱)","很软"),Taste("甜(葡萄果酱)","很软") };
Taste tn2("甜", "适中");
Taste te1[3] = { Taste("很甜","很软"),Taste("甜","硬"),Taste("很甜","很软") };
Taste te2("很甜(杨枝甘露果酱)", "很软");
Ingredients In1[3] = { Ingredients("小麦粉、新鲜草莓、红曲酥粒、巧克力、黄油、淡奶油"),Ingredients("小麦粉、鸡蛋、白桃果酱、淡奶油、牛奶"),Ingredients("小麦粉、牛奶、鸡蛋、葡萄果酱、芝士、葡萄味粉圆、葡萄味饼干粉") };
Ingredients In2("小麦粉、鸡蛋、牛奶、淡奶油、马斯卡彭奶酪、咖啡粉");
Ingredients Ie1[3] = { Ingredients("小麦粉、奥利奥饼干碎、淡奶油、糯米"),Ingredients("全麦粉、提子干、提子粉、牛奶") ,Ingredients("面粉、鸡蛋、牛奶、动物淡奶油、乳酪胚") };
Ingredients Ie2("安佳淡奶油、果酱、芒果、小麦粉");
Recommend rn1[3] = { Recommend("3","下午茶","奶油味很清爽,颜值与美味并存,味道很出色"),Recommend("4","下午茶","樱花的造型搭配着白桃茉莉奶酪馅,酸甜可口,是初春温暖幸福的味道") ,Recommend("5","下午茶","讨喜葡萄造型面包,高颜值粉紫色,欧包里包着浓郁葡萄芝士馅,一口下去葡萄味清欢萦绕心间") };
Recommend rn2("4", "晚饭", "浓厚风味的马斯卡彭奶酪遇上乳香淡奶油,再邂逅香浓咖啡与厚厚可可粉,一层叠一层,浪漫的提拉米苏蛋糕带来别样风味");
Recommend re1[3] = { Recommend("2","下午茶","味道很细腻,一口咬下去口感很丰富,奥利奥味道很足"),Recommend("4","夜宵","味道很不错,很有嚼劲") ,Recommend("5","夜宵","乳酪入口即化,淡淡的甜味,很推荐") };
Recommend re2("3", "下午茶", "味道很棒,奶油水果都很新鲜,味道也很赞,而且做外观也很漂亮,水果、蛋糕层次分明,入口即化,很推荐!!");
Inch in2("3");
Inch ie2("3");
//把面包的信息汇总在一起
Bread system_bread_1[3] = { //隶属于“奈雪的茶”面包店的面包
Bread(sn1[0],pn1[0],dn1[0],tn1[0],In1[0],rn1[0]),
Bread(sn1[1],pn1[1],dn1[1],tn1[1],In1[1],rn1[1]),
Bread(sn1[2],pn1[2],dn1[2],tn1[2],In1[2],rn1[2])
};
Bread system_bread_2[3] = { //隶属于“二牛极致烘焙”面包店的面包
Bread(se1[0],pe1[0],de1[0],te1[0],Ie1[0],re1[0]),
Bread(se1[1],pe1[1],de1[1],te1[1],Ie1[1],re1[1]),
Bread(se1[2],pe1[2],de1[2],te1[2],Ie1[2],re1[2])
};
bool buildstore = 0; //用来提示是否build了store
bool buildbread = 0; //用来提示是否build了bread
bool buildcake = 0; //用来提示是否build了cake
string clean; //用来清屏提示
string flag; //用来提示所需要使用的功能——build、index、advise
p('q'); //设置为青色
cout << "-—-—welcome to BREADSTAR recommendations system—-—-" << endl;
do {
p('w'); //设置为白色
cout << "build请输入0 index请输入1 advise请输入2" << endl << "please enter : "; //导航栏
p('g'); //设置灰色
cin >> flag;
while (flag != "0" && flag != "1" && flag != "2") { //输入错误提示
p('r'); //设置为红色
cout << "[warning] Misinput";
p('w'); //设置为白色
cout << "——请重新输入:";
p('g'); //设置灰色
cin >> flag;
}
//商家build阶段
if (flag == "0") {
buildstore = 1;
p('w'); //设置为白色
cout << "Now you're building your own database..." << endl;
p('r');//设置红色提示
cout << "[温馨提示]请您按照我们的提示输入,我们将完全按照您的输入给用户提供信息,如若未按照提示输入而导致错误信息我们概不负责,您可以在输入完成后修改信息。" << endl;
p('g'); //设置灰色
string a = "1"; //a用来提示Bread_store类的对象是否继续继续创建(是否还有其他面包店)
while (a == "1") {
Bread_store mybreadstore;//创建面包店对象,通过调用类的成员函数提示用户输入信息
Bread_store* bb; //对象指针,在后面用于修改信息
bb = &mybreadstore;
mybreadstore.get_storename();
mybreadstore.get_location();
mybreadstore.get_telenum();
mystore.push_back(mybreadstore);
p('w'); //设置为白色
cout << "# Now you're going to build the information of the bread|cake #" << endl;
p('r'); //设置为红色
cout << "* 一次仅能选择一个类别:bread 或 cake *" << endl;
p('w'); //设置为白色
string b; //b用来提示创建对象为bread类还是cake类
do {
cout << "Bread or Cake (bread for 0;cake for 1):";
p('g'); //设置灰色
cin >> b;
//bread类还是cake类——输入错误的提示
while (b != "1" && b != "0") {
p('w'); //设置为白色
cout << "输入格式错误,请按照提示重新输入:";
p('g'); //设置灰色
cin >> b;
}
//Bread类对象
if (b == "0") {
p('w'); //设置为白色
cout << "您已确认无误,数据已上传至系统。" << endl;
p('y'); //设置为黄色
cout << endl << "——finishing BREAD class——" << endl << endl;
}
//Cake类对象
else if (b == "1") {
p('w'); //设置为白色
cout << "您已确认无误,数据已上传至系统。" << endl;
p('y'); //设置为黄色
cout << endl << "——finishing CAKE class——" << endl << endl;
}
p('w'); //设置为白色
cout << endl << "是否继续输入其他面包店及其面包的信息(是|请输入1 否|请输入0):";
p('g'); //设置灰色
cin >> a;
while (a != "1" && a != "0") {
p('w'); //设置为白色
cout << "输入格式错误,请按照提示输入:";
p('g'); //设置灰色
cin >> a;
}
if (a == "0")break;
} while ( a == "1");
}
p('w'); //设置白色
cout << "您已输入完毕,数据均已上传系统。";
p('y'); //设置黄色
cout << endl << endl << "*****************DATA BASE*****************" << endl;
Bread_store::show_storecount();
if (buildcake) {
Cake::show_c_count();
}
if (buildbread) {
Bread::show_count();
}
}
//用户index阶段
else if (flag == "1") {
string a; //提示用户查询店铺/面包/蛋糕的信息
string b; //判断是否继续查询
p('w'); //设置为白色
cout << " Now you're indexing some delicious bread..." << endl;
p('y');
cout << endl << "# Here are our system information offered for you to index #" << endl;
p('g');
cout << "-----------------------------------------------------------" << endl;
cout << " 店铺 | " << system_store[0].show_storename() << " | " << system_store[1].show_storename() << endl;
cout << "-----------------------------------------------------------" << endl;
cout << " 面包 |" << " " << system_bread_1[0].name.show_name() << " | " << system_bread_2[0].name.show_name() << endl;
cout << " | " << system_bread_1[1].name.show_name() << " | " << system_bread_2[1].name.show_name() << endl;
cout << " | " << system_bread_1[2].name.show_name() << " | " << system_bread_2[2].name.show_name() << endl;
cout << "-----------------------------------------------------------" << endl;
cout << " 蛋糕 | " << sn2.show_name() << " | " << se2.show_name() << endl;
cout << "-----------------------------------------------------------" << endl << endl;
do {
p('w');
cout << "查询店铺信息请输入";
p('r');
cout << "A";
p('w');
cout << "|| 查询面包信息请输入";
p('r');
cout << "B";
p('w');
cout << "|| 查询蛋糕信息请输入";
p('r');
cout << "C" << endl;
p('w');
cout << "请输入(A/B/C):";
p('g');
cin >> a;
//输入错误提示
while (a != "A" && a != "B" && a != "C") {
p('r'); //设置为红色
cout << "[warning] Misinput";
p('w'); //设置为白色
cout << "——请重新输入(A/B/C):";
p('g'); //设置灰色
cin >> a;
}
//查询店铺信息
if (a == "A") {
string n;
p('g');
cout << "请输入要查询的店铺名称:";
cin >> n;
//判断输入信息是否存档
if (buildstore) {//进行了build阶段
while (notsame(n)) { //判断输入信息是否存档
p('r'); //设置为红色
cout << "[Misinput]——抱歉,我们暂时未上传该店铺信息";
p('w'); //设置为白色
cout << endl << "请重新输入(请选择已存档信息):";
p('g'); //设置灰色
cin >> n;
}
}
else {
while (n != "奈雪の茶" && n != "二牛极致烘焙") {
p('r'); //设置为红色
cout << "[Misinput]——抱歉,我们暂时未上传该店铺信息";
p('w'); //设置为白色
cout << endl << "请重新输入(请选择已存档信息):";
p('g'); //设置灰色
cin >> n;
}
}
//展示信息
if (n == "奈雪の茶") {
cout << endl << "————" << system_store[0].show_storename() << "————" << endl;
cout << "位置:" << system_store[0].show_location() << endl;
cout << "电话:" << system_store[0].show_telenum() << endl;
cout << endl;
}
else if (n == "二牛极致烘焙") {
cout << endl << "————" << system_store[1].show_storename() << "————" << endl;
cout << "位置:" << system_store[1].show_location() << endl;
cout << "电话:" << system_store[1].show_telenum() << endl;
cout << endl;
}
if (buildstore) {
for (int i = 0; i < mystore.size(); i++) {
while (n == mystore[i].show_storename()) {
cout << endl << "————" << mystore[i].show_storename() << "————" << endl;
cout << "位置:" << mystore[i].show_location() << endl;
cout << "电话:" << mystore[i].show_telenum() << endl;
cout << endl;
}
}
}
}
//查询面包信息
else if (a == "B") {
string n;
p('g');
cout << "请输入要查询的面包名称:";
cin >> n;
//判断输入信息是否存档
if (buildbread) {//进行了build阶段
while (notsame1(n)) { //判断输入信息是否存档
p('r'); //设置为红色
cout << "[Misinput]——抱歉,我们暂时未上传该面包信息";
p('w'); //设置为白色
cout << endl << "请重新输入(请选择已存档信息):";
p('g'); //设置灰色
cin >> n;
}
}
else {
while (n != "草莓魔法棒" && n != "樱花白桃软欧包" && n != "一串葡萄" && n != "奥利奥|雪媚娘" && n != "全麦莓果|法式硬欧包" && n != "云朵乳酪卷") {
p('r'); //设置为红色
cout << "[Misinput]——抱歉,我们暂时未上传该面包信息";
p('w'); //设置为白色
cout << endl << "请重新输入(请选择已存档信息):";
p('g'); //设置灰色
cin >> n;
}
}
if (n == "草莓魔法棒") {
system_bread_1[0].display();
cout << endl;
}
else if (n == "樱花白桃软欧包") {
system_bread_1[1].display();
cout << endl;
}
else if (n == "一串葡萄") {
system_bread_1[2].display();
cout << endl;
}
else if (n == "奥利奥|雪媚娘") {
system_bread_2[0].display();
cout << endl;
}
else if (n == "全麦莓果|法式硬欧包") {
system_bread_2[1].display();
cout << endl;
}
else if (n == "云朵乳酪卷") {
system_bread_2[2].display();
cout << endl;
}
if (buildbread) {
for (int i = 0; i < mybread.size(); i++) {
while (n == mybread[i].name.show_name()) {
mybread[i].display();
cout << endl;
}
}
}
}
//查询蛋糕信息
else if (a == "C") {
string n;
p('g');
cout << "请输入要查询的蛋糕名称:";
cin >> n;
//判断输入信息是否存档
if (buildcake) {//进行了build阶段
while (notsame2(n)) { //判断输入信息是否存档
p('r'); //设置为红色
cout << "[Misinput]——抱歉,我们暂时未上传该蛋糕信息";
p('w'); //设置为白色
cout << endl << "请重新输入(请选择已存档信息):";
p('g'); //设置灰色
cin >> n;
}
}
else {
while (n != "提拉米苏罐子蛋糕" && n != "杨枝甘露|啵啵杯") {
p('r'); //设置为红色
cout << "[Misinput]——抱歉,我们暂时未上传该蛋糕信息";
p('w'); //设置为白色
cout << endl << "请重新输入(请选择已存档信息):";
p('g'); //设置灰色
cin >> n;
}
}
if (n == "提拉米苏罐子蛋糕") {
cout << endl << "【" << sn2.show_name() << "】" << endl;
pn2.show_price();
in2.show_inch();
dn2.show_date();
tn2.show_taste();
In2.show_ingredients();
rn2.show_recommend();
cout << endl;
}
else if (n == "杨枝甘露|啵啵杯") {
cout << endl << "【" << se2.show_name() << "】" << endl;
pe2.show_price();
ie2.show_inch();
de2.show_date();
te2.show_taste();
Ie2.show_ingredients();
re2.show_recommend();
cout << endl;
}
if (buildcake) {
for (int i = 0; i < mycake.size(); i++) {
while (n == mycake[i].name.show_name()) {
mycake[i].display();
cout << endl;
}
}
}
}
p('w');
cout << "是否继续查询信息(是|请输入1 否|请输入0):";
p('g');
cin >> b;
cout << endl;
while (b != "1" && b != "0") {
p('w'); //设置为白色
cout << "输入格式错误,请按照提示输入:";
p('g'); //设置灰色
cin >> b;
}
if (b == "0")break;
} while (b == "1");
p('q');
cout << endl << "************感谢您的使用,祝您生活愉快************" << endl;
}
//用户advise阶段
else if (flag == "2") {
string q;
cout << "欢迎留言,请留下您宝贵的意见,我们感激不尽 :";
cin >> q;
}
if (flag == "0") {
p('q'); //设置青色
cout << endl << "***********************************************************************************************" << endl;
cout << "感谢您的使用,请随便输入字符作为结束语(温馨提示:输入完后将清空屏幕):";
p('g'); //设置为灰色
cin >> clean;
system("cls"); //清屏以便下一项操作
p('q'); //设置为青色
cout << "-—-—welcome to BREADSTAR recommendations system—-—-" << endl;
p('g'); //设置为灰色
cout << " 您已创建过面包店||面包的信息(信息已存档,可查询)" << endl;
}
p('r'); //设置为红色
cout << " ——Do you want to continue to use our product, yes or no ? Please enter:";
p('g'); //设置为灰色
cin >> flag;
} while (flag == "yes");
p('q'); //设置青色
cout << endl << "Thank you for your using,visiting and belief in our product,Welcome next time." << endl;
p('w'); //设置为白色
return 0;
}