C++ 机房预约系统(六):学生模块——创建预约类、预约信息解析和预约信息更新、显示预约、取消预约功能、C++多个返回值函数的具体实现
创始人
2025-06-01 21:53:48
0

8、 学生模块

8.1 学生子菜单、登录和注销

实现步骤:

  • 在Student.cpp的有参构造函数中,初始化学生信息
  • 在Student.cpp中,实现成员函数void Student::operMenu() ,显示学生子菜单界面
  • 在机房预约系统.cpp中,当用户登录的是学生,添加学生菜单接口,添加全局函数 void studentMenu(Identity * &manager)
  • 在机房预约系统.cpp的studentMenu函数中,将学生功能框架搭建起来,不同的分支提供出来:
    • 申请预约
    • 查看我的预约
    • 查看所有预约
    • 取消预约
    • 注销登录
  • 在机房预约系统.cpp的studentMenu函数中,实现注销功能
  • 在机房预约系统.cpp的LoginIn函数中,学生成功登录后,调用学生的子菜单界面,实现接口对接。

Student.cpp 初始化学生属性 代码展示:

//有参构造(学号、姓名、密码)
Student::Student(int id, string name, string pwd)
{//初始化属性this->m_Id = id;this->m_Name = name;this->m_Pwd = pwd;
}//菜单界面
void Student::operMenu()
{cout << "欢迎学生代表:" << this->m_Name << "登录!" << endl;cout << "\t\t ----------------------------------\n";cout << "\t\t|                                 |\n";cout << "\t\t|          1.申请预约             |\n";cout << "\t\t|                                 |\n";cout << "\t\t|          2.查看我的预约         |\n";cout << "\t\t|                                 |\n";cout << "\t\t|          3.查看所有预约         |\n";cout << "\t\t|                                 |\n";cout << "\t\t|          4.取消预约             |\n";cout << "\t\t|                                 |\n";cout << "\t\t|          0.注销登录             |\n";cout << "\t\t|                                 |\n";cout << "\t\t ----------------------------------\n";cout << "请选择您的操作: " << endl;
}

机房预约系统.cpp studentMenu函数 学生子菜单框架 代码展示:
这部分和管理员的子菜单类似,不赘诉

//全局函数 进入学生子菜单界面
void studentMenu(Identity*& student)
{while (1){//调用子菜单student->openMenu();//将父类指针转为子类指针,调用子类的其他接口Student* stu = (Student*)student;//接收用户选择功能int select = 0;cin >> select;switch (select){case 1://申请预约cout << "申请预约" << endl;stu->applyOrder();break;case 2://查看自身预约cout << "查看自身预约" << endl;stu->showmyOrder();break;case 3://查看所有预约cout << "查看所有预约" << endl;stu->showallOrder();break;case 4://取消预约cout << "取消预约" << endl;stu->cancleOrder();break;default://默认情况下注销登录 释放堆区数据delete stu;//释放堆区数据 手动开辟手动释放cout << "注销成功!" << endl;system("pause");system("cls");return;}}
}

机房预约系统.cpp LoginIn函数 接口对接 代码位置:

登录验证通过:

学生子菜单和注销登录:

8.2 申请预约

8.2.1 获取机房信息

实现步骤:

  • 在申请预约时,学生需要看到机房信息进行预约,因此需要让学生获取到机房信息,故在Student.h中添加新的成员函数,vector vCom;
  • 在Student.cpp的有参构造函数中,读取机房信息。打开机房信息文件后,逐行读取信息,再存入vCom。

Student.h

	//机房容器vector vCom;

Student.cpp 有参构造函数 代码展示

//有参构造(学号、姓名、密码)
Student::Student(int id, string name, string password)
{this->m_Id = id;this->m_Name = name;this->m_Password = password;//初始化机房信息 读取信息ifstream ifs;ifs.open(COMPUTER_FILE, ios::in);ComputerRoom com;while (ifs >> com.m_ComId && ifs >> com.m_MaxNum){vCom.push_back(com);//读到的信息存在vector容器中}ifs.close();
}

8.2.2 预约功能实现

实现步骤:

  • 在student.cpp中实现成员函数 void Student::applyOrder(),这部分分为预约信息输入和预约信息写入。
  • 预约信息包括预约日期、预约时间段、预约机房编号;预约信息写入时,包括预约的日期、时间段、学生学号、学生姓名、机房编号、机房状态,默认机房状态都在审核中。
  • 预约日期/时间段/机房时,提示用户选择预约的日期/时间段/机房并输入,通过死循环控制用户是否输入正确。
  • 最后提示用户预约成功,再进行预约信息写入。
  • 预约信息写入时,每一行包括约的日期、时间段、学生学号、学生姓名、机房编号、机房状态

student.cpp 申请预约 代码展示:

//申请预约
void Student::applyOrder()
{int n = 15;int data = 0;//接收预约日期变量cout << string(n, '*') << " 机房开放时间为周一至周五! " << string(n, '*') << endl;cout << string(n, ' ') << " 请输入申请预约的时间: " << string(n, ' ') << endl;cout << string(n, ' ') << " 1—— 周一 " << string(n, ' ') << endl;cout << string(n, ' ') << " 2—— 周二 " << string(n, ' ') << endl;cout << string(n, ' ') << " 3—— 周三 " << string(n, ' ') << endl;cout << string(n, ' ') << " 4—— 周四 " << string(n, ' ') << endl;cout << string(n, ' ') << " 5—— 周五 " << string(n, ' ') << endl;//cout << "请输入申请预约的时间:" << endl;//cout << "1—— 周一" << endl;//cout << "2—— 周二" << endl;//cout << "3—— 周三" << endl;//cout << "4—— 周四" << endl;//cout << "5—— 周五" << endl;1//预约日期输入判断while (true){cin >> data;if (1 <= data <= 5)//输入正确{break;}cout << "输入有误,请重新输入!" << endl;}int period = 0;//接收预约时间段变量cout << string(n, '-') << " 请输入申请预约的时间段: " << string(n, '-') << endl;cout << string(16, ' ') << "1—— 上午" << string(n, ' ') << endl;cout << string(16, ' ') << "2—— 下午" << string(n, ' ') << endl;while (true){cin >> period;if (period == 1 || period == 2){break;}cout << "输入有误,请重新输入!" << endl;}int room = 0;//接收预约机房编号变量cout << string(n, '-') << " 请输入申请预约的机房:   " << string(n, '-') << endl;for (vector::iterator it = vCom.begin(); it != vCom.end(); it++){cout << string(16, ' ') << "机房编号为:" << it->m_ComId << "\t机房容量为:" << it->m_MaxNum << endl;}/*for (int i = 0; i < vCom.size(); i++){cout << "机房编号为:" << vCom[i].m_ComId << "\t机房容量为:" << vCom[i].m_MaxNum << endl;}*/while (true){cin >> room;if (1 <= room <= 3){break;}cout << "输入有误,请重新输入!" << endl;}cout << string(n, '*') << " 预约成功,审核中! " << string(n, '*') << endl;//预约信息写入ofstream ofs;ofs.open(ORDER_FILE, ios::app);ofs << "data:" << data << " ";ofs << "period:" << period << " ";ofs << "stuID:" << this->m_Id << " ";ofs << "stuName:" << this->m_Name << " ";ofs << "roomID:" << room << " ";ofs << "status:" << 1 << " " << endl;ofs.close();system("pause");system("cls");
}

测试效果:

在order.txt文件中生成如下内容:

在这里插入图片描述

8.3 显示预约

8.3.1 创建预约类-预约信息解析

功能描述: 显示预约记录时,需要从order.txt文件中获取到所有预约记录并显示。因此,创建预约类来管理预约记录以及更新预约的状态。

实现过程与代码:

  1. 在头文件以及源文件下分别创建orderFile.horderFile.cpp文件
  2. 在orderFile.h文件中,包括构造函数、更新预约记录函数、记录预约信息的容器、记录预约条数
  • 更新预约记录函数中,主要是更新机房的预约状态,包括审核中、通过、未通过、取消预约
  • 记录预约条数则是维护了order.txt文件中有多少条预约信息
  • 记录预约信息的容器,一个map嵌套map容器,解释如图示:
  1. 在orderFile.cpp中,写OrderFile()构造函数的具体实现-读取信息部分
  • 读取order.txt预约文件信息,创建接收文件中预约信息的变量,通过逐段读取并测试是否读取成功。
  • 测试前,在Student.h中包含OrderFile.h文件,#include "orderFile.h"
  • 在Student.cpp的查看自身预约函数 showmyOrder()中创建对象,调用orderFile的构造函数
    在这里插入图片描述
  1. 在orderFile.cpp中,写OrderFile()构造函数的具体实现-截取信息部分
  • 创建接收小容器,即map m;,以及临时接受key和value值的string变量。虽然除了姓名是字符串,其他信息都是数字,但是为了方便,统一用string类型来接收key和value。
  1. 每一键值对都是用冒号: 隔开,因此用find查找冒号: 的位置,冒号: 前是小容器map的key,冒号: 后是小容器map的value,find返回值是冒号: 的位置,用一个int类型变量pos接收。要注意,截取key和value前要对pos进行检测。
  2. 每一键值对的key和value可以用substr来截取,具体如下:
  • 对于key,substr截取的长度是0到pos;
  • 对于value的起始位置,应该是冒号: 的下一个位置,即pos+1,substr截取的长度从pos+1开始;
  • 对于value的结束位置,应该是冒号: 的全部信息,这个长度可以间接获取。统计整段要截取的长度,再减去冒号前的长度,就是所求长度了。具体而言,以stuName:Bella为例,stuName:Bella的长度是stuName.size()stuName: 的长度可以用pos表示,那么Bella的长度是stuName.size() - pos - 1
  • 上面这个例子也很好地说明了,为什么value的截取不能是pos+1到pos+2了。如果仅是pos+2作为结尾位置,只能截取姓名的第一个字符,而不是完整字符,而且只适用于目前记录的日期、时间段、学号、机房号、状态这些信息的截取。另外,如果日期、时间段、学号、机房号、状态这些信息不是只用一个数字表示的话,pos+2也不适用了。(不知道表诉清楚没)
  1. 每一键值对的key和value都截取后,放进小容器m中。由于这部分是重复的代码,我封装成函数了subdata(),注意这个函数是有两个返回值的,用到pair类型。
  2. orderFile.h写声明pair subdata(string data);,在orderFile.cpp写实现,并测试。要注意函数的类型是pair subdata(string data);,因为截取完后,key和value都要存入小容器m中。
  3. 所有信息截取完后,小容器m嵌套在大容器中,并且预约条数要更新,小容器m要释放,下一条记录
  4. 最后关闭文件,并对大容器的内容测试。

orderFile.h 完整代码展示

#pragma once
#include
using namespace std;
using std::pair;
#include 
#include "globalFile.h"
#include 
#include class orderFile
{
public://构造函数orderFile();//更新预约机房状态函数void updateOrder();//记录预约信息容器 key记录条数 value记录具体键值对信息  没有重复情况map> m_order;//记录预约条数int m_Size;//截取小容器key 和 valuepair subdata(string data);
};

OrderFile.cpp 构造函数 截取函数 完整代码展示

#include "orderFile.h"//构造函数
orderFile::orderFile()
{ifstream ifs(ORDER_FILE, ios::in);//接收预约文件各信息变量string date;string period;string stuID;string stuName;string roomID;string status;this->m_Size = 0;//初始化为0while (	ifs >> date && ifs >> period && ifs >> stuID&& ifs >> stuName && ifs >> roomID && ifs >> status){//测试/*cout << data << endl;cout << period << endl;cout << stuID << endl;cout << stuName << endl;cout << roomID << endl;cout << status << endl;*/map m;//截取日期/*//截取key value值并存入map小容器中 统一用stringstring key;string value;map m;//截取日期int pos = data.find(':', 0);key = data.substr(0, pos);value = data.substr(pos + 1, data.size() - pos - 1);m.insert(make_pair(key, value));*/m.insert(subdata(date));//截取时间段m.insert(subdata(period));//截取学生学号m.insert(subdata(stuID));//截取学生姓名m.insert(subdata(stuName));//截取机房号m.insert(subdata(roomID));//截取机房预约状态m.insert(subdata(status));//放进大容器中m_order.insert(make_pair(this->m_Size, m));//更新this->m_Size++;m.clear();//释放 存放下一条预约记录}ifs.close();//测试/*for (map>::iterator it = m_order.begin(); it != m_order.end(); it++){cout << "条数为:" << it->first << "\tvalue如下:" << endl;for (map::iterator mit = it->second.begin(); mit != it->second.end(); mit++){cout << "key = " << mit->first << "\tvalue = " << mit->second << endl;}cout << endl << endl;}*/
}//截取小容器key 和 value
pair orderFile::subdata(string data)
{string key;string value;map m;int pos = data.find(':');if (pos != -1){key = data.substr(0, pos);value = data.substr(pos + 1, data.size() - pos - 1);m.insert(make_pair(key, value));}return make_pair(key, value);//测试/*cout << "key = " << key << endl;cout << "value = " << value << endl;*/
}

小容器测试 截取每一键值对的key和value测试

读取信息测试: 看是否与order.txt信息对应上

大容器内容测试: 看是否正确存入预约信息

8.3.2 创建预约类-预约信息更新

功能描述: 更新所有预约信息,[]访问数据,这是一个map容器嵌套map容器

//更新预约机房状态函数
void orderFile::updateOrder()
{if (this->m_Size == 0){cout << "没有预约记录!" << endl;return;}ofstream ofs(ORDER_FILE, ios::out | ios::trunc);for (int i = 0; i < this->m_Size; i++){cout << i + 1 << "、" << endl;ofs << "date:" << this->m_order[i]["date"] << " ";ofs << "period:" << this->m_order[i]["period"] << " ";ofs << "stuID:" << this->m_order[i]["stuID"] << " ";ofs << "stuName:" << this->m_order[i]["stuName"] << " ";ofs << "roomID:" << this->m_order[i]["roomID"] << " ";ofs << "status:" << this->m_order[i]["status"] << endl;}ofs.close();
}

解释:

  1. 首先,要对文件预约信息条数进行判断:
  • 如果没有预约记录直接返回,对预约记录文件进行删除重建,
  • 如果有预约记录,再重新写入预约记录
  1. 对存放预约记录的容器m_order的内容重新写入
    其中,this->m_order[i] 表示第i条预约信息,这是一个map容器嵌套map容器。this->m_order[i] 底层还是一个map,可以通过[]访问,通过key直接索引value

8.3.2 显示自身预约

实现步骤:

  1. 首先我们先添加几条预约记录,可以用程序添加或者直接修改order.txt文件。
  2. 文件预约信息条数进行判断,如果没有预约记录直接返回。
  3. 如果有预约记录,根据学号找到自身的预约记录,并输出打印
  4. 在Student.cpp的showMyOrder()写具体代码实现

Student.cpp 代码展示

//查看自身预约
void Student::showmyOrder()
{orderFile order;if (order.m_Size == 0){cout << "没有预约记录!" << endl;system("pause");system("cls");return;}//对比学号for (int i = 0; i < order.m_Size; i++){//找到自身预约 并显示if (this->m_Id == atoi(order.m_order[i]["stuID"].c_str())){cout << "预约日期:周" << order.m_order[i]["date"];cout << "预约时间段:" << (order.m_order[i]["period"] == "1" ? "上午" : "下午");cout << "\t机房号:" << order.m_order[i]["roomID"];string status = "\t状态:";if (order.m_order[i]["status"] == "1"){status += "审核中";}else if (order.m_order[i]["status"] == "2"){status += "预约成功";}else if (order.m_order[i]["status"] == "-1"){status += "预约失败,审核未通过";}else{status += "预约已取消";}cout << status << endl;}}system("pause");system("cls");
}

注意点:

  1. order.m_order[i]["stuID"],表示第i条预约记录的学生学号,这是一个string类型的数据,而自身学号是一个int类型,需要做数据类型转换才可以进行学号比较,从而找到自身预约记录。
  2. 先用.c_str() 转成c语言风格的字符串const char * 再用atoi转成int类型,atoi返回的是int类型,即atoi(order.m_order[i]["stuID"].c_str()

测试前,先添加预约信息,如下:
在这里插入图片描述

8.3.3 显示所有预约

  • 只要遍历order.m_order容器,输出预约信息即可
  • 遍历前需要对order.m_Size进行判断,如果没有预约记录,直接返回
  • 如果有预约记录,在Student.cpp的void Student::showAllOrder()成员函数写具体实现
//查看所有预约
void Student::showallOrder()
{orderFile order;if (order.m_Size == 0){cout << "没有预约记录!" << endl;system("pause");system("cls");return;}for (int i = 0; i < order.m_Size; i++){cout << "\n第" << i + 1 << "条预约记录:";cout << "预约日期:周" << order.m_order[i]["date"];cout << "预约时间段:" << (order.m_order[i]["period"] == "1" ? "上午" : "下午");cout << "\t预约学生学号:" << order.m_order[i]["stuID"];cout << "\t预约学生姓名:" << order.m_order[i]["stuName"];cout << "\t机房号:" << order.m_order[i]["roomID"];string status = "\t状态:";if (order.m_order[i]["status"] == "1"){status += "审核中";}else if (order.m_order[i]["status"] == "2"){status += "预约成功";}else if (order.m_order[i]["status"] == "-1"){status += "预约失败,审核未通过";}else{status += "预约已取消";}cout << status << endl;}system("pause");system("cls");
}

测试效果如图:

8.4 取消预约

实现步骤:

  • 取消预约记录前,需要对order.m_Size进行判断,看是否有预约记录,如果没有预约记录,直接返回
  • 如果有预约记录,在Student.cpp的void Student::cancelOrder()成员函数写具体实现
  • 这块分两部分,第一个是对预约记录文件进行解析,读取预约记录文件的信息;第二部分是对预约记录文件进行更新,对审核中或预约成功的预约记录进行取消。
  • 预约记录文件解析时,首先判断是否有预约记录,如果没有预约记录,直接返回
  • 预约记录文件更新时,找到该学生所有预约记录,通过学号索引,再找到预约状态是审核中预约成功的记录,进行取消。
  • 取消部分理解的话,老师审核预约也很好理解了,都是一样的,只是操作对象不一样而已。

Student.cpp

//取消预约
void Student::cancleOrder()
{orderFile order;if (order.m_Size == 0){cout << "没有预约记录!" << endl;system("pause");system("cls");return;}cout << "审核中或预约成功的记录可以取消,请输入取消的记录" << endl;int index = 1;//记录该学生有多少条预约记录vector v;//存放该学生符合取消条件的预约记录//找到要取消预约的学生 以及该学生可以取消的预约记录for (int i = 0; i < order.m_Size; i++){//找到要取消预约的学生 string→const char *→intif (atoi(order.m_order[i]["stuID"].c_str()) == this->m_Id){//找到符合取消的预约记录 审核中1 预约成功2if (order.m_order[i]["status"] == "1" || order.m_order[i]["status"] == "2"){//保存可以取消的预约记录的真实下标,对应m_order的key  v.push_back(i);//展示该学生预约的所有记录 从1开始遍历 输出index 再+1 cout << index++ << "、 ";//有可能张三的记录在第一个、第二个、第四个cout << "预约日期:周" << order.m_order[i]["date"];cout << "预约时间段:" << (order.m_order[i]["period"] == "1" ? "上午" : "下午");cout << "\t机房号:" << order.m_order[i]["roomID"];string status = "\t状态:";if (order.m_order[i]["status"] == "1"){status += "审核中";}else if (order.m_order[i]["status"] == "2"){status += "预约成功";}cout << status << endl;}}}//取消预约cout << "请输入要取消的预约记录,0代表返回" << endl;int select = 0;while (true){cin >> select;//select范围:0-所有符合取消条件的预约记录的个数if (select >= 0 && select <= v.size()){if (select == 0){break;}else{order.m_order[v[select - 1]]["status"] = "0";order.updateOrder();cout << "已取消预约" << endl;break;}}else{cout << "输入有误,请重新输入" << endl;}}system("pause");system("cls");
}

取消预约代码思路解释:

一、找到预约记录:

如图所示,假设order.m_order容器中存放了四条记录,张三的有三条,要取消最后一条记录,也就是在order.m_order容器中删除最后一条记录。那么,怎么删除最后一条呢?进一步说,怎么获取最后一条记录的下标?

  1. 首先,通过遍历order.m_order容器,要找到张三和张三所有可以取消的预约记录,通过学号和预约状态可以找到,
  • atoi(order.m_order[i]["stuID"].c_str()) == this->m_Id,找到张三,这里的类型转变前面讲过,不赘诉
  • order.m_order[i]["status"] == "1" || order.m_order[i]["status"] == "2",找到张三所有可以取消的预约记录
  1. 在order.m_order容器中的第0、1、3记录是张三的且可以取消,这几条记录需要展示给张三看,让他选择取消取消哪一条记录。
  2. 因此,可以用一个int变量index来维护,记录张三可以取消预约记录的顺序。
  • 遍历容器时for (int i = 0; i < order.m_Size; i++),index随 i 变化,即index++
  • 此时,预约记录的顺序是index,分别为1、2、3。
  • 另外,后面张三输入取消预约记录的选择select,也只能从index的表示的这三条预约记录中选择。select表示张三的取消预约记录的选择。
  1. 那么如何找到这个预约记录在order.m_order容器中的真实下标呢?也就是怎么找到该在order.m_order容器中的key值?并且如何保存呢?
  2. 其实,在遍历容器order.m_order时,i 就是符合条件的预约记录在容器的key值。vector v存放的是张三可以取消的预约记录的真实下标,即对应order.m_order中的key。
  3. index++i 变化时,index表示符合要求的预约记录的顺序,i表示符合要求的预约记录的真实下标。通过vector容器保存该记录在order.m_order容器中的key值。即容器v维护的不是index,而是i值,即预约信息在order.m_order容器中的key值
  4. 为什么不用index来找预约记录呢?如果通过index去索引order.m_order容器的预约记录,找到的并不是张三要取消预约的记录。比如index=2时,order.m_order[index]找到的是李四的预约记录。因此容器v保存的是张三要取消预约记录的真实下标,即i,也即order.m_order容器中的key。
  5. 具体做法:for循环遍历容器order.m_order,遍历预约记录(index也同步变化,index++)时,每找到一条张三可以取消的预约记录,就保存该预约记录在order.m_order容器的key值,v.push_back(i)

二、预约记录怎么和用户的输入关联?

前面提到,index和select是对应的,即index是1、2、3,那么用户的选择select也只能是1、2、3。并且v中保存了对应预约记录的真实下标。找到预约记录的真实下标后,怎么和用户的选择联系起来呢?如图:

  1. 首先,这三条可以取消的记录1、2、3,在v容器中是0、1、2,在order.m_order容器的下标是0、1、3 。
  2. 那么要取消的最后一条记录,首先是3-1,即select-1,表示v下标,通过下标找到v中保存的信息,也就是找到记录的真实下标。即v[select - 1],表示通过select-1索引到v中保存的该记录的真实下标,即该记录对应在order.m_order容器的key
  3. 再进一步通过key索引order.m_order容器保存的记录,即order.m_order[v[select - 1]]
  4. 再者,要取消第二条记录 应该是2-1,找到v中的下标,再进一步索引order.m_order容器中这个下标对应的记录
  5. 要删除的记录是用户选择输入的,用一个变量来接收select ,范围是0-index,即1、2、3
  6. 具体做法,通过输入的值select,找到v存放的取消记录的真实下标v[select-1],对应order.m_order容器的key值。索引到order.m_order容器存放的记录order.m_order[v[select-1]],再通过字段找到预约状态,并设置为-1,即order.m_order[v[select - 1]]["status"] = "0";。最后更新容器order.m_order,并提示用户。

测试取消预约前-order.txt:

测试取消预约前-张三预约记录:

测试取消预约显示:

测试取消预约后-order.txt:

测试取消预约后-张三预约记录:

至此,学生模块功能全部实现

相关内容

热门资讯

拉动入境游,北京再推22条重磅... 6月3日上午,2025北京入境旅游发展大会开幕。记者从会上获悉,北京市入境旅游呈现加速发展态势,游客...
端午假期湘潭万楼景区人气旺 (记者 谷桔)端午与“六一”“童”行,传统与童趣碰撞。这个端午假期,作为我市文旅地标,万楼·芒果青年...
原创 吴... 许久未露面的吴尊,最近带着家人共度美好时光,前往浪漫之都巴黎。一家四口的颜值可谓是爆表,四人同框真让...
潮汕三日游最佳路线推荐,带娃去... 潮汕三日游最佳路线推荐,带娃去潮汕3天跟团旅游超详细行程 潮汕,这片位于广东省东部的神奇土地,以其悠...
【天天出发】6月珠海双飞甘青、... 【集合地点】珠海机场(2人起接送) 【出发时间】参看图片 【报名要求】提前3-5天报名 其余西北、甘...
香港迪士尼20周年展览登陆武汉... 在武昌万象城开业一周年、香港迪士尼乐园20周年之际,武昌万象城今年再次与香港迪士尼乐园共同呈献奇妙体...
草坪露营 | 一场与自然相拥的... 在城市的喧嚣中待久了,你是否渴望寻一处静谧之地,让身心与自然来一次亲密接触?那就来梵木罗汉山文创园的...
四川九寨沟乐山大佛旅游攻略跟团... 标题:【四川九寨沟乐山大佛旅游攻略跟团五天费用多少钱,驴友亲测!】—— 跟着乐乐游四川,体验地道川味...
带小孩超详细潮汕旅游五天价格,... 带小孩超详细潮汕旅游五天价格,潮汕五日纯玩团要多少钱? 潮汕,这片位于广东省东南沿海的宝地,以其悠久...
张家界旅行五天四晚人均花多少钱... 张家界,那是一幅大自然用鬼斧神工绘就的绝美画卷。它有着高耸入云的奇峰异石,如利剑般直插云霄;有着郁郁...
端午假期最后一天 西安蓝田水陆... 端午假期最后一天,西安市蓝田县水陆庵景区热度不减。走进水陆庵内,3700余尊塑像形态各异,栩栩如生,...
黄山四日游费用及行程,和女友去... 黄山,这座被誉为“天下第一奇山”的壮丽之地,以其独特的自然风光和深厚的文化底蕴,吸引着无数游客前来探...
文化中国行 欢迎到济宁丨新地标... 2025年5月31日,在孔子登临观世的精神原乡——尼山脚下,鲁源村景区以一场融合传统礼乐与现代光影的...
黄山四日游旅游攻略推荐,黄山自... 黄山四日游旅游攻略推荐,黄山自由行旅游4天需多少钱 随着年龄的增长,我越来越珍惜与家人共度的时光,尤...
潮汕玩5天花多少钱?头一次去潮... 五一假期即将来临,我和朋友们决定前往潮汕地区,开启一场五天的美食与文化之旅。潮汕地区以其独特的潮汕文...
“粽”情赋能,双节文旅市场火爆 端午节与“六一”国际儿童节激情邂逅,长春文旅市场迎来消费热潮,游人如织、热闹非凡。 为进一步传承端午...
原创 张... 6月1日儿童节,张若昀和唐艺昕这对小夫妻被网友们在伦敦街头的瞬间抓拍到!两人推着孩子悠哉悠哉地走在马...
报团去潮汕三日游花费要多少,潮... 报团去潮汕三日游花费要多少,潮汕三天两晚旅游跟团价格 潮汕,这片位于广东省东部沿海的神奇土地,以其悠...
2个人去潮汕玩5天大概要花多少... 假期总是让人充满期待,尤其是当计划着一场说走就走的旅行时。今年假期,我和几位好友决定前往潮汕,这片充...