✨作者主页:IT研究室✨
个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。
☑文末获取源码☑
精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目
一、前言
随着旅游业的发展和旅游市场的不断扩大,导游服务的需求也日益增加。然而,传统的导游预约方式存在着很多问题,如信息不对称、服务质量不稳定等。这不仅影响了游客的旅游体验,也给导游的管理带来了很大的不便。因此,开发一款导游预约系统,利用信息化技术提高导游预约的效率和满意度,成为了迫切需要解决的问题。
当前,导游预约主要依靠线下方式,如电话、邮件等。然而,这些方式存在着很多问题:
信息不对称:游客和导游之间的信息交流不顺畅,导致游客难以了解导游的服务质量和经验,导游也难以了解游客的需求和反馈。
预约效率低下:线下预约的方式效率低下,游客需要多次联系导游或旅行社才能完成预约,浪费了大量的时间和精力。
服务质量不稳定:由于缺乏管理和监督机制,一些导游的服务质量难以保证,影响了游客的旅游体验。
这些问题进一步强调了开发导游预约系统的必要性。
本课题的研究目的是开发一款导游预约系统,利用信息化技术提高导游预约的效率和满意度。该系统将具备以下功能:
在线预约:游客可以在线选择导游和预约时间,方便快捷地完成预约。
信息展示:系统将为游客提供导游的基本信息和评价,帮助游客了解导游的服务质量和经验。
在线交流:游客和导游可以通过系统进行在线交流,及时解决问题和反馈意见。
服务质量监督:系统将建立管理和监督机制,对导游的服务质量进行监督和管理,保障游客的旅游体验。
通过这些功能,该系统能够提高导游预约的效率和满意度,为旅游业的发展提供更好的支持。
本课题的研究意义在于:
提高导游预约效率:通过在线预约和信息展示等功能,该系统能够提高导游预约的效率,节省游客的时间和精力。
增强服务质量稳定性:通过在线交流和服务质量监督等功能,该系统能够增强导游服务质量的稳定性,提高游客的旅游体验。
二、开发环境
- 开发语言:Java/Python两个版本
- 数据库:MySQL
- 系统架构:B/S
- 后端:SSM(Spring+SpringMVC+Mybatis)/SpringBoot/Django三个版本
- 前端:Vue
三、系统界面展示
- 导游预约系统界面展示:
四、代码参考
- Python项目实战代码参考:
class IndexView(View):
"""
首页视图
"""
def get(self, request):
# 判断是否登录
username = request.COOKIES.get('username')
if username:
# 获取用户昵称
nickname = request.session.get('nickname')
identity = request.session.get('identity')
if nickname:
# 获取对应用户
user = User.objects.get(username=username)
# 查询对应订单
tour_bookings = TourBooking.objects.filter(guests=user)
# 对应行程
trips = []
booking_list = []
for tour_booking in tour_bookings:
booking_item = {
'id': tour_booking.id,
'corp': tour_booking.corp.name,
'price': tour_booking.price,
}
booking_list.append(booking_item)
tour_trips = Trip.objects.filter(booking=tour_booking)
for tour_trip in tour_trips:
trips.append(tour_trip)
# print('tour_bookings: ', tour_bookings)
# print('trips: ', trips)
# 封装数据
trip_list = []
fmt = '%Y-%m-%d'
for trip in trips:
trip_item = {
'date_start': trip.date_start.strftime(fmt),
'date_end': trip.date_end.strftime(fmt),
'attraction': trip.attraction,
}
trip_list.append(trip_item)
context = {
'nickname': nickname,
# 'identity': identity,
'trip_list': trip_list,
'booking_list': booking_list,
}
if identity == User.UNSURE:
context['other_info'] = '待审核'
else:
return HttpResponseForbidden('登录状态有误')
else:
# 未登录
context = {
'status': 'OK',
}
return render(request, 'contents/index.html', context)
def get_client_list():
# 获取所有用户
clients = User.objects.filter(identity=User.VISITOR)
# 封装数据
client_list = []
index = 1
for client in clients:
client_item = {
'value': index,
'title': client.username,
'disabled': '',
'checked': '',
}
index = index + 1
client_list.append(client_item)
return client_list
def get_current_corp(request):
# 获取用户名
username = request.session.get('username')
# 获取用户对象
user = User.objects.get(username=username)
# 获取当前公司对象
corp = Corp.objects.get(owner=user)
return corp
class IndexView(LoginRequiredMixin, View):
"""首页视图"""
def get(self, request):
nickname = request.session.get('nickname')
if nickname:
context = {
'nickname': nickname,
}
return render(request, 'corp/index.html', context)
else:
return HttpResponseForbidden('登录状态有误')
class WelcomeView(View):
"""欢迎页面视图"""
def get(self, request):
nickname = request.session.get('nickname')
if nickname:
context = {
'nickname': nickname,
}
return render(request, 'corp/welcome.html', context)
else:
return HttpResponseForbidden('登录状态有误')
class BookingInfoView(View):
"""订单信息视图"""
def get(self, request):
return render(request, 'corp/bookings.html')
class GetBookingInfoView(View):
"""获取订单信息视图"""
def get(self, request):
# 获取当前公司对象
corp = get_current_corp(request)
# 查询当前公司对应的订单
bookings = TourBooking.objects.filter(corp=corp)
# 封装数据
booking_list = []
for booking in bookings:
booking_item = {
'id': booking.id,
'price': booking.price,
}
booking_list.append(booking_item)
return JsonResponse({
'code': 0,
'msg': '',
'data': booking_list,
})
class BookingManageView(View):
"""订单管理视图"""
def post(self, request):
# 获取操作类型
code = request.POST.get('code')
# 获取当前公司对象
corp = get_current_corp(request)
if code == '100': # 新增操作
# 获取参数
guests = request.POST.get('guests')
price = request.POST.get('price')
# print(guests)
# print(type(guests))
guests = json.loads(guests)
# print(type(guests))
# 处理参数
price = float(price)
# 新增订单
booking = TourBooking.objects.create(price=price, corp=corp)
# 添加顾客
for guest_name in guests:
guest = User.objects.get(username=guest_name)
booking.guests.add(guest)
elif code == '200': # 删除操作
# 获取参数
booking_id = request.POST.get('id')
booking_id = int(booking_id)
# 获取对应booking
booking = TourBooking.objects.get(id=booking_id)
# 先删除tirps
Trip.objects.filter(booking=booking).delete()
# 再删除booking对象
booking.delete()
elif code == '300': # 编辑操作
# 获取参数
guests = request.POST.get('guests')
price = request.POST.get('price')
booking_id = request.POST.get('booking_id')
# 处理参数
guests = json.loads(guests)
price = float(price)
booking_id = int(booking_id)
# 获取对应booking
booking = TourBooking.objects.get(id=booking_id)
# 修改值
booking.price = price
booking.guests.clear()
for guest_name in guests:
guest = User.objects.get(username=guest_name)
booking.guests.add(guest)
booking.save()
else:
return HttpResponseForbidden('操作类型不合法')
return JsonResponse({
'status': 'OK',
})
class AddBookingView(View):
"""新增订单表单视图"""
def get(self, request):
return render(request, 'corp/views/add_booking.html')
def post(self, request):
"""用于获取全部顾客对象来渲染表单"""
client_list = get_client_list()
return JsonResponse({
'status': 'OK',
'client_list': client_list,
})
class EditBookingView(View):
"""编辑订单表单视图"""
def get(self, request):
# 获取booking_id
booking_id = request.GET.get('booking_id')
booking_id = int(booking_id)
booking = TourBooking.objects.get(id=booking_id)
# 封装数据
context = {
'booking_id': booking_id,
'price': booking.price,
}
return render(request, 'corp/views/edit_booking.html', context)
def post(self, request):
# 获取booking_id
booking_id = request.POST.get('booking_id')
booking_id = int(booking_id)
booking = TourBooking.objects.get(id=booking_id)
guests = booking.guests.all()
client_list = []
index = 1
for guest in guests:
guest_item = {
'value': index,
'title': guest.username,
'disabled': '',
'checked': 'true',
}
index = index + 1
client_list.append(guest_item)
clients = User.objects.filter(identity=User.VISITOR)
for client in clients:
if client in guests:
continue
else:
client_item = {
'value': index,
'title': client.username,
'disabled': '',
'checked': '',
}
index = index + 1
client_list.append(client_item)
return JsonResponse({
'status': 'OK',
'client_list': client_list,
})
class BookingDetailView(View):
"""订单详细信息(行程信息)视图"""
def get(self, request):
booking_id = request.GET.get('booking_id')
context = {
'booking_id': booking_id,
}
return render(request, 'corp/views/booking_detail.html', context)
def post(self, request):
# 获取参数
booking_id = request.POST.get('booking_id')
booking_id = int(booking_id)
# 获取对应booking
booking = TourBooking.objects.get(id=booking_id)
# 获取该booking的行程
trips = Trip.objects.filter(booking=booking)
# 封装数据
trip_list = []
fmt = '%Y-%m-%d'
for trip in trips:
trip_item = {
'id': trip.id,
'date_start': trip.date_start.strftime(fmt),
'date_end': trip.date_end.strftime(fmt),
'attraction': trip.attraction,
}
trip_list.append(trip_item)
return JsonResponse({
'data': trip_list,
})
def date_str_process(date_str, fmt):
date = datetime.datetime.strptime(date_str, fmt)
date = date.date()
return date
class AddTourView(View):
"""增加行程视图"""
def get(self, request):
booking_id = request.GET.get('booking_id')
context = {
'booking_id': booking_id,
}
return render(request, 'corp/views/add_tour.html', context)
def post(self, request):
# 获取参数
booking_id = request.POST.get('booking_id')
date_start = request.POST.get('date_start')
date_end = request.POST.get('date_end')
attraction = request.POST.get('attraction')
# 参数处理
fmt = '%Y-%m-%d'
date_start = date_str_process(date_start, fmt)
date_end = date_str_process(date_end, fmt)
booking_id = int(booking_id)
# 获取对应booking
booking = TourBooking.objects.get(id=booking_id)
# 新增行程
trip = Trip.objects.create(booking=booking, date_start=date_start,
date_end=date_end, attraction=attraction)
return JsonResponse({
'status': 'OK',
})
class GuestsDetailView(View):
"""顾客信息视图"""
def get(self, request):
booking_id = request.GET.get('booking_id')
context = {
'booking_id': booking_id,
}
return render(request, 'corp/views/guests_detail.html', context)
def post(self, request):
# 获取参数
booking_id = request.POST.get('booking_id')
booking_id = int(booking_id)
booking = TourBooking.objects.get(id=booking_id)
guests = booking.guests.all()
guest_list = []
for guest in guests:
guest_item = {
'id': guest.id,
'username': guest.username,
'nickname': guest.nickname,
}
guest_list.append(guest_item)
return JsonResponse({
'data': guest_list,
})
# 模块化登录操作
def my_signin(request, user):
# 状态保持
login(request, user)
# 获取next参数
print(request.GET)
next = request.GET.get('next')
print(next)
# 如果next 存在则重定向至next
if next:
response = redirect(next)
# 否则重定向至首页
else:
if user.identity == User.VISITOR or user.identity == User.UNSURE:
response = redirect(reverse('contents:index'))
elif user.identity == User.HOTEL:
response = redirect(reverse('hotel:index'))
elif user.identity == User.TOUR_CORP:
response = redirect(reverse('corp:index'))
else:
response = redirect('/admin/')
# 设置cookie
response.set_cookie('username', user.username, max_age=3600)
# 设置cookie时若值是中文则出错
# response.set_cookie('nickname', user.nickname, max_age=3600)
# 设置session有效时长
request.session.set_expiry(3600)
# 添加session信息
request.session['username'] = user.username
request.session['nickname'] = user.nickname
request.session['identity'] = user.identity
return response
class LoginView(View):
"""
用户登录视图
"""
def get(self, request):
return render(request, 'login/login.html')
@method_decorator(csrf_protect)
def post(self, request):
"""登录逻辑"""
# 接收参数
username = request.POST.get('username')
password = request.POST.get('password')
# 校验参数
if not all([username, password]): # 校验是否有参数缺失
return HttpResponseForbidden("缺少必传参数")
# 相关参数正则校验
# if not re.match(r'^[a-zA-Z0-9_\u4e00-\u9fa5\s·]+$', username):
# return HttpResponseForbidden("用户名不能有特殊字符")
if not re.match(r'^[\S]{6,12}$', password):
return HttpResponseForbidden("密码必须6到12位,且不能出现空格")
# 认证用户
user = authenticate(username=username, password=password)
if user is None:
return render(request, 'login/login.html', {'login_errmsg': '账号或密码错误'})
# 登录(状态保持并并返回响应)
response = my_signin(request, user)
# 返回响应
return response
# # ajax验证
# @csrf_protect
# def verify_account(request):
# username = request.POST.get('username')
# password = request.POST.get('password')
#
# # 查询用户
# try:
# db_user = User.objects.get(username=username)
# except User.DoesNotExist as e:
# response_data = {'info': 'username_or_password_false'}
# return JsonResponse(response_data, charset='utf-8')
#
# # 验证密码
# if not db_user.check_password(password):
# response_data = {'info': 'username_or_password_false'}
# return JsonResponse(response_data, charset='utf-8')
# else:
# response_data = {'info': 'true'}
# return JsonResponse(response_data, charset='utf-8')
# 退出方法
@csrf_protect
def quit(request):
# 清除状态信息(清楚session数据)
logout(request)
# 删除cookie中的username
response = redirect(reverse('contents:index'))
response.delete_cookie('username')
return response
def create_user(username, password, nickname, email, phone, identity):
# 保存用户数据
try:
# 注意:这里需要用create_user,加密存储数据
user = User.objects.create_user(username=username, password=password,
nickname=nickname, email=email, phone=phone, identity=identity)
return user
except DatabaseError:
return None
class RegisterView(View):
"""
注册视图
"""
def get(self, request):
return render(request, 'login/register.html')
@method_decorator(csrf_protect)
def post(self, request):
# 接收参数
identity = request.POST.get('identity')
username = request.POST.get('username')
nickname = request.POST.get('nickname')
password = request.POST.get('password')
password2 = request.POST.get('password2')
phone = request.POST.get('phone')
email = request.POST.get('email')
# 从前端传过来的identity时字符串数据,必须先转换成整数类型
# print(type(identity))
identity = int(identity)
# print(type(identity))
# 校验是否缺少必传参数
if not all([identity, username, nickname, password, password2, phone, email]):
return HttpResponseForbidden("缺少必传参数")
# 正则校验
if not re.match(r'^[a-zA-Z0-9_\u4e00-\u9fa5\s·]+$', username):
return HttpResponseForbidden("用户名不能有特殊字符")
# if not re.match(r'',nickname):
# pass
if not re.match(r'^[\S]{6,12}$', password):
return HttpResponseForbidden("密码必须6到12位,且不能出现空格")
if password2 != password:
return HttpResponseForbidden("两次输入密码不一致")
if not re.match(
r'^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$',
phone):
return HttpResponseForbidden("请输入正确的手机号")
if not re.match(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', email):
return HttpResponseForbidden("请输入合法邮箱")
# 针对不同类型用户执行不同操作
if identity == User.VISITOR:
# 若是旅客,直接注册
user = create_user(username=username, nickname=nickname, password=password,
email=email, phone=phone, identity=identity)
elif identity == User.TOUR_CORP or identity == User.HOTEL or identity == User.ADMINISTRATOR:
# 若是旅游公司或宾馆
# 先将身份设置为待完善
user = create_user(username=username, nickname=nickname, password=password,
email=email, phone=phone, identity=User.UNSURE)
print(user.id)
# 生成注册申请
Application.objects.create(applicant=user, identity=identity, state=Application.PENDING)
# 提醒该用户账户类型待完善
else:
return HttpResponseForbidden("输入用户身份不合法")
if not user:
return render(request, 'login/register.html', {'register_errmsg': '注册失败'})
# 登录(状态保持并并返回响应)
response = my_signin(request, user)
# 返回响应
return response
class UsernameCountView(View):
"""
验证用户名是否重复注册
"""
@method_decorator(csrf_protect)
def get(self, request, username):
count = User.objects.filter(username=username).count()
return JsonResponse({
'count': count,
})
class PhoneCountView(View):
"""
验证手机号是否重复
"""
@method_decorator(csrf_protect)
def get(self, request, phone):
count = User.objects.filter(phone=phone).count()
return JsonResponse({
'count': count,
})
class EmailCountView(View):
"""
验证邮箱是否重复
"""
@method_decorator(csrf_protect)
def get(self, request, email):
count = User.objects.filter(email=email).count()
# print(count)
return JsonResponse({
'count': count,
})
五、论文参考
- 计算机毕业设计选题推荐-导游预约系统论文参考:
六、系统视频
导游预约系统项目视频:
计算机毕业设计选题推荐-导游预约系统-Python项目实战
结语
计算机毕业设计选题推荐-导游预约系统-Python项目实战
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:私信我