计算机毕业设计选题推荐-导游预约系统-Python项目实战

作者主页: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项目实战
大家可以帮忙点赞、收藏、关注、评论啦~
源码获取:私信我

精彩专栏推荐⬇⬇⬇
Java项目
Python项目
安卓项目
微信小程序项目

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
毕业设计选题系统是一个用于管理学生毕业设计选题的系统,在该系统中,学生可以浏览和选择感兴趣的毕业设计选题,并向指导教师提交选题申请。为了更好地理解和设计该系统,可以使用E-R图进行建模。 E-R图是一种用于描述实体与实体之间关系的图形化工具。对于毕业设计选题系统,可以识别出以下实体和关系: 1. 实体:学生、选题、指导教师、系部 - 学生是该系统的一个重要实体,具有属性如学号、姓名、专业等; - 选题是学生选择的某个毕业设计主题,具有属性如题目、描述、难度等; - 指导教师是负责指导学生进行毕业设计的教师,具有属性如工号、姓名、职称等; - 系部是学校的一个组织机构,负责管理学生的毕业设计,具有属性如系号、名称、联系方式等。 2. 关系:选择、指导 - 选择关系表示学生与选题之间的选择关系,一个学生可以选择一个或多个选题,一个选题也可以被多个学生选择; - 指导关系表示指导教师与学生之间的指导关系,一个指导教师可以指导一个或多个学生,一个学生也可以被一个或多个指导教师指导。 通过以上实体和关系的识别,可以绘制E-R图。图中使用方框表示实体,菱形表示关系,箭头表示关系的方向。 在系统的逻辑设计和数据库建模阶段,E-R图可以帮助开发人员更好地理解和设计系统的实体和关系,从而进行数据库表的设计和系统流程的优化。 总之,通过E-R图对毕业设计选题系统进行建模可以帮助开发人员从宏观角度把握系统的核心实体、关系和流程,为后续的系统设计和开发提供了指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT研究室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值