Xây dựng website đặt vé du lịch

70 13 0
Xây dựng website đặt vé du lịch

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC SƯ PHẠM KHOA TIN HỌC BÁO CÁO KHÓA LUẬN TỐT NGHIỆP TÊN ĐỀ TÀI XÂY DỰNG WEBSITE ĐẶT VÉ DU LỊCH GVHD Sinh Viên Lớp : TS Trần Văn Hưng : Lý Văn Trà : 16 CNTT01 ĐÀ NẴNG, 07/2020 LỜI MỞ ĐẦU Hiện việc ứng dụng công nghệ thông tin xem yếu tố định hoạt động kinh doanh cá nhân, công ty doanh nghiệp đóng vai trị quan trọng để tạo đột phá mạnh mẽ Cùng với phát triển mạng Internet Trong sản xuất, kinh doanh thúc đẩy mạnh mẽ thông qua thương mại điện tử Đối với cửa hàng hay shop việc tiếp cận, quảng bá, giới thiệu, tạo nhiều điều kiện thuận lợi thỏa mãn nhu cầu khách hàng Vậy nên, em thực đồ án “Xây dựng website đặt vé du lịch” để tạo nhiều điều kiện thuận lợi cho khách hàng quảng bá du lịch Việt Nam Em xin chân thành cảm ơn TS Trần Văn Hưng trực tiếp bảo hưỡng dẫn em suốt q trình hồn thành khóa luận Và em xin cảm ơn tất thầy Khoa Tin học nhiệt tình giúp đỡ đào tạo em thời gian vừa qua Em xin trân trọng cảm ơn! Đà Nẵng, ngày tháng năm 2020 Sinh viên thực Lý Văn Trà Ý KIẾN CỦA GIẢNG VIÊN HƯỚNG DẪN Đà Nẵng, ngày tháng năm 2020 Cán hướng dẫn MỤC LỤC MỞ ĐẦU CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1.1 Tổng quan thương mại điện tử website bán hàng 1.1.1 Thương mại điện tử gì? 1.1.2 Lợi ích thương mại điện tử 1.1.3 Các mơ hình thương mại điện tử 1.2 Giới thiệu Python 1.2.1 Python gì? 1.2.2 Tại phải sử dụng Python? .6 1.3 Gới thiệu Django 1.3.1 Django gì? 1.3.2 Tại sử dụng Django Framework? 1.3.3 MVT Patten Django .7 1.4 Gới thiệu hệ quản trị sở liệu Mysql 1.4.1 Khái niệm 1.4.2 Tại lại sử dụng hệ quản trị sở liệu Mysql ? CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ WEBSITE 13 2.1 Phân tích yêu cầu hệ thống 13 2.1.1 Mô tả hệ thống 13 2.1.2 Yêu cầu chức hệ thống 13 2.1.3 Yêu cầu phi chức 13 2.2 Phân tích thiết kế hệ thống 13 2.2.1 Sơ đồ BFD 14 2.2.2 Sơ đồ DFD 15 2.2.3 Sơ đồ ERD 28 2.2.4 Mơ hình liệu quan hệ 29 CHƯƠNG 3: TRIỂN KHAI VÀ KẾT QUẢ ĐẠT ĐƯỢC 35 3.1 Triển khai môi trường làm việc 35 3.1.1 Yêu cầu 35 3.1.2 Thực 35 3.2 Kết đạt 35 KẾT LUẬN 47 TÀI LIỆU THAM KHẢO 48 PHỤ LỤC MÃ NGUỒN 49 DANH MỤC HÌNH ẢNH Hình Cấu trúc tập tin mơ hình MVT Hình Sơ đồ BFD 14 Hình Sơ đồ ngữ cảnh 16 Hình DFD Chức luồng hệ thống 17 Hình DFD Đăng kí tài khoản 18 Hình DFD Xem thơng tin tour 19 Hình DFD Đăng nhập 19 Hình DFD Thay đổi thông tin cá nhân 20 Hình DFD Đặt vé 20 Hình 10 DFD Bình luận 21 Hình 11 DFD Đăng blog 21 Hình 12 DFD Quản lý thông tin tài khoản 22 Hình 13 DFD Reset mật 23 Hình 14 DFD Quản lý tour 24 Hình 15 DFD Quản lý điểm đến 25 Hình 16 DFD Quản lý comment 26 Hình 17 DFD Quản lý đặt vé 26 Hình 18 DFD Quản lý blog 27 Hình 19 DFD Đặt vé,thanh toán 27 Hình 20 Sơ đồ ERD 29 Hình 21 Sơ đồ liệu quan hệ 34 DANH MỤC BẢNG Bảng User 30 Bảng Blog 30 Bảng Comment 31 Bảng Booking 31 Bảng Role 31 Bảng Photo 31 Bảng Tour 32 Bảng Destination 32 Bảng Area 32 MỞ ĐẦU Lí chọn đề tài Sự phát triển công nghệ thông tin nước ta bước vào thời kì với việc ứng dụng rộng rải công nghệ thông tin tổ chức xã hội, kinh doanh,… Công nghệ thông tin bước vào sống có vai trị lớn phát triển đất nước Do việc áp dụng cơng nghệ thơng tin vào nhiều ngành, nhiềulĩnh vực quan trọng,trong có ngành du lịch Ngành có đóng góp GDP 10% nước ngành thu nhiều ngoại tệ Nhận thấy dịp lễ việc mua vé khách du lịch khó khăn,việc mua vé phải di chuyển đến địa điểm bán vé, phải xếp hàng đợi, hết vé phải mua vé qua tay với giá cao,…Vì vậy, website đặt vé du lịch đời Mục tiêu đề tài Xây dựng hệ thống đặt vé cho khách du lịch người muốn tìm hiểu du lịch cách thuận tiện với thiết kế đa dạng, dễ mở rộng Các tour du lịch phải thể đầy đủ thông tin cần thiết cho người dung Ngoài hệ thống phải hướng đến việc mở rộng đặt vé du lịch nước Đối tượng nghiên cứu Website xây dựng hướng đến người dùng khách du lịch người muốn tìm hiểu du lịch Phương pháp nghiên cứu Với mục đích nêu trên, để xây dựng hệ thống hồn chỉnh em đặt phương pháp cụ thể sau: - Sử dụng kiến thức học website, sở liệu để phân tích thiết kế hệ thống tối ưu Lý Văn Trà – Lớp 16CNTT1 (2016-2020) - Khảo sát người dùng để thu thập yêu cầu từ người dùng hệ thống mà người dùng mong muốn - Tìm hiểu MySQL - Tìm hiểu Django - Tìm hiểu Python - Thực xây dựng phân tích kế hệ thống website cho phù hợp Bố cục Chương 1: Giới thiệu ngôn ngữ sử dụng thư viện phân tích ưu nhược điểm Giới thiệu sở liệu Chương 2: Lấy yêu cầu, đánh giá phân tích yêu cầu chức để thiết kế website Chương 3: Thực đánh giá từ kết thu Lý Văn Trà – Lớp 16CNTT1 (2016-2020) CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1.1 Tổng quan thương mại điện tử website bán hàng 1.1.1 Thương mại điện tử gì? Thương mại điện tử (cịn gọi E-commerce hay E-bussines) quy trình mua bán dịch vụ thơng qua thương mại điện tử mạng viễn thông, đặc biệt qua máy tính mạng Internet Ngày người ta hiểu khái niện Thương mại điện tử thông thường tất phương pháp tiến hành kinh doanh quy trình quản trị thơng qua kênh điện tử Internet đóng vai trị công nghệ thông tin điều kiện tiên 1.1.2 Lợi ích thương mại điện tử Lợi ích lớn mà Thương mại điện tà mang lại tiết kiệm chi phí, tạo thuận lợi cho bên giao dịch Giao dịch phương tiện điện tử nhanh giao dịch truyền thơng, ví dụ gửi fax hay thư điện tử nội dung thông tin đến người nhận nhanh gửi thư Giao dịch qua Internet có chi phí rẻ, doanh nghiệp gửi thư tiếp thị, chào hàng đến hàng loạt khách hàng với chi phi giống gửi cho khách hàng Với thương mại điện tử, bên tiến hành giao xa nhau, thành phố với nông thơn, từ nước sang nước khác hay nói cách khác khơng bị giói hạn khơng gian địa lý Điều cho phép doanh nghiệp tiết kiệm chi phí lại, thời gian gặp mặt mua bán Với người tiêu dùng họ ngồi nhà để đặt hàng, mua sắm nhiều loại hàng hóa dịch yụ thật nhanh chóng 1.1.3 Các mơ hình thương mại điện tử Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 49 PHỤ LỤC MÃ NGUỒN -Đăng nhập đăng xuất: Sử dụng authenticate django from django.contrib.auth import login, authenticate -Xử lý trang đăng kí: def signup(request): if request.method == 'POST': form = SignUpForm(request.POST) if form.is_valid(): user = form.save() user.refresh_from_db() user.profile.gender = form.cleaned_data.get('gender') user.profile.phone_number form.cleaned_data.get('phone_number') user.profile.country = form.cleaned_data.get('country') user.save() raw_password = form.cleaned_data.get('password1') user=authenticate(username=user.username, password=raw_password) login(request, user) messages.info(request,'Tài khoản bạn tạo') return redirect('index') else: form = SignUpForm() context={ 'form':form } Lý Văn Trà – Lớp 16CNTT1 (2016-2020) = 50 return render(request, 'registration/signup.html', context) -Xử lý trang chủ: def index(request): destinations=Area.objects.prefetch_related('areas', 'areas tours').annotate(num_tour=Count('areas tours'))[:6] sliders = Slider.objects.all() blogs = Blog.objects.select_related('user')[:3] context = { 'destinations' : destinations, 'sliders' : sliders, 'places' : Tour.get_tour_list(6), 'blogs' : blogs, } return render(request, 'index.html', context) -Xử lý trang giới thiệu: def about(request): done_bookings = Booking.objects.filter(status_booking=1) tour_totals = Tour.objects.count() clients = User.objects.count() blogs = Blog.objects.select_related('user')[:3] context = { 'bookings' : done_bookings.count, 'tour_totals' : tour_totals, 'clients' : clients, 'blogs' : blogs, } Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 51 return render(request, 'about.html', context) -Xử lý phân trang: def pagination(request,self): page = request.GET.get('page', 1) paginator = Paginator(self, 10) try: result = paginator.page(page) except PageNotAnInteger: result = paginator.page(1) except EmptyPage: result = paginator.page(paginator.num_pages) return result -Xử lý thông tin địa điểm: def destination(request): places = pagination(request,Tour.get_tour_list(6)) blogs = Blog.objects.select_related('user')[:3] context = { 'places' : places, 'blogs' : blogs } return render(request, 'destination.html', context) -Tìm kiếm: Xử dụng SearchResultsView trả kết ListView: class SearchResultsView(ListView): model = Tour template_name = 'search.html' def get_queryset(self): query = self.request.GET.get('q') Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 52 object_list = Tour.objects.filter( Q(tour_name icontains=query) | Q(destination location_to icontains=query) ) return object_list -Xử lý hồ sơ cá nhân: @login_required def profile(request, pk): if request.user.pk == pk: p= get_object_or_404(User.objects.prefetch_related('booking'), pk=pk) else: messages.warning(request,'Khơng thể tìm thấy trang này') return redirect('index') context = { 'p' : p, } return render(request, 'profile.html', context) -Đăng blog: def blog(request): blogs = Blog.objects.select_related('user') recent_post = Blog.objects.all().order_by('-date')[:6] tag = Blog.objects.values('tag').annotate(num_tag=Count('id')) if request.method == 'POST': if request.user.is_authenticated: form=BlogForm(request.POST, request.FILES) if form.is_valid(): blog = form.save(commit=False) blog.content = form.cleaned_data.get('content') blog.title = form.cleaned_data.get('title') blog.tag = form.cleaned_data.get('tag') blog.user = request.user Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 53 blog.image = form.cleaned_data.get('image') blog.save() messages.info(request,'Đăng thành công') return redirect('blog') else: return redirect('index') else: return redirect('login') else: form=BlogForm() context = { 'form' : form, 'tag' : tag, 'blogs' : blogs, 'recent_post' : recent_post } return render(request, 'blog.html', context) -Liên hệ: def contact(request): return render(request, 'contact.html') -Chi tiết blog: def blog_detail(request, pk): blog = get_object_or_404(Blog.objects.select_related('user'), pk=pk) recent_post = Blog.objects.all().order_by('-date')[:6] tag = Blog.objects.values('tag').annotate(num_tag=Count('id')) context = { 'tag' : tag, 'blog' : blog, 'recent_post' : recent_post } return render(request, 'blog_detail.html', context) Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 54 -Quản trị trang web:Sử dụng django-admin, giao diện quản trị tự động, cần cung cấp model-centric cho from django.contrib import admin @admin.register(Destination) class DestinationAdmin(admin.ModelAdmin): list_display = ('id', 'location_from', 'location_to', 'destination_name', 'area') list_per_page = 10 @admin.register(Booking) class BookingAdmin(admin.ModelAdmin): list_display = ('id', 'profile', 'tour', 'status_booking','booking_time', 'people_number','total_price') list_per_page = 10 @admin.register(Slider) class SliderAdmin(admin.ModelAdmin): list_display = ('id', 'slider_image','title', 'teaser') @admin.register(Blog) class BlogAdmin(admin.ModelAdmin): list_display = ('title', 'content', 'date', 'tag', 'image') list_per_page = 10 @admin.register(Tour) class TourAdmin(admin.ModelAdmin): list_display = ('id', 'tour_name', 'experience_time','price','start_day', 'end_day', 'min_age', 'max_people', 'status_evaluete','short_tour_detail') list_per_page = 10 - Bình luận chi tiết tour: def destination_detail(request,pk): Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 55 tour = get_object_or_404(Tour.objects.prefetch_related('tour_photo', 'review'), pk=pk) if request.method == 'POST': if request.user.is_authenticated: if 'comment' in request.POST: formcmt = CommentForm(request.POST) if formcmt.is_valid(): review = formcmt.save(commit=False) review.author = request.user review.tour = tour review.content = formcmt.cleaned_data.get('content') review.save() return redirect('destination_detail', pk=pk) else: return redirect('destination_detail', pk=pk) if 'booking' in request.POST: form = BookingForm(request.POST) if form.is_valid(): booking = form.save(commit=False) num_people = form.cleaned_data.get('people_number') request.session['tour_id'] = pk request.session['people_number'] = num_people request.session['total_price'] = num_people*int(tour.price) return redirect('order') else: return redirect('destination_detail', pk=pk) else: Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 56 return redirect('login') else: form = BookingForm() formcmt = CommentForm() context = { 'tours' : Tour.get_tour_list(3), 'tour' : tour, 'form':form, 'formcmt' : formcmt, } return render(request, 'destination_detail.html', context) -Xử lý oder : @login_required def order(request): tour_id = request.session.get('tour_id') total_price = request.session.get('total_price') people_number = request.session.get('people_number') tour = Tour.objects.get(pk=tour_id) booking_time = datetime.datetime.now() booking = { 'booking_time' : booking_time, 'tour' : tour, 'total_price' : total_price, 'people_number' : people_number, } context = { 'booking' : booking,} Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 57 return render(request, 'order.html', context) -Thanh toán PayPal Stripe: @csrf_exempt def payment_done(request): tour_id = request.session.get('tour_id') total_price = request.session.get('total_price') people_number = request.session.get('people_number') tour = Tour.objects.get(pk=tour_id) booking = Booking.objects.create(profile=request.user,tour=tour, people_number=people_number, total_price=total_price,) booking.status_booking = booking.save() context = { 'booking' : booking, 'tour' : tour, } return render(request, 'done.html', context) @csrf_exempt def payment_canceled(request): messages.warning(request, 'Thanh tốn khơng thành cơng') return redirect('index') def payment_process(request): tour_id = request.session.get('tour_id') total_price = request.session.get('total_price') tour = Tour.objects.get(pk=tour_id) Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 58 price = total_price/23178 host = request.get_host() paypal_dict = { 'business': settings.PAYPAL_RECEIVER_EMAIL, 'amount': '%.2f' % price, 'amount': '200', 'item_name': ' {}'.format(tour.tour_name), 'invoice': '', 'currency_code': 'USD', 'notify_url': 'http://{}{}'.format(host, reverse('paypal-ipn')), 'return_url': 'http://{}{}'.format(host, reverse('done')), 'cancel_return': 'http://{}{}'.format(host, reverse('cancelled')), } form = PayPalPaymentsForm(initial=paypal_dict) context = { 'form': form, } return render(request, 'payment_process.html', context) @csrf_exempt def stripe_config(request): if request.method == 'GET': stripe_config = {'publicKey': settings.STRIPE_PUBLISHABLE_KEY} return JsonResponse(stripe_config, safe=False) @csrf_exempt Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 59 def create_checkout_session(request): tour_id = request.session.get('tour_id') total_price = request.session.get('total_price') tour = Tour.objects.get(pk=tour_id) price = total_price/23178 host = request.get_host() if request.method == 'GET': domain_url = 'http://localhost:8000/' stripe.api_key = settings.STRIPE_SECRET_KEY try: checkout_session = stripe.checkout.Session.create( success_url=domain_url 'payment/done?session_id={CHECKOUT_SESSION_ID}', cancel_url='http://{}{}'.format(host, reverse('cancelled')), payment_method_types=['card'], mode='payment', line_items=[ { 'name': tour.tour_name, 'quantity': 1, 'currency': 'usd', 'amount': int(price)*100, } ] ) return JsonResponse({'sessionId': checkout_session['id']}) except Exception as e: Lý Văn Trà – Lớp 16CNTT1 (2016-2020) + 60 return JsonResponse({'error': str(e)}) -Model:Trong model sử dụng authentication User quan hệ 1-1 với Profile from django.contrib.auth.models import User class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True) birthdate = models.DateField(null=True, blank=True) gender = models.IntegerField(choices=GENDER_CHOICES, blank=True, null=True, default=1) phone_number = models.CharField(validators=[phone_regex], max_length=10, blank=True) country = models.CharField(max_length=100, blank=True) image = models.ImageField(upload_to='images/profile', null=True) class Area(models.Model): area_name = models.CharField(max_length=100, blank=True) image = models.ImageField(upload_to='images/area') class Destination(models.Model): area = models.ForeignKey(Area, on_delete=models.CASCADE, related_name='areas') location_from = Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 61 models.TextField(max_length=50, blank=True) location_to = models.TextField(max_length=50, blank=True) destination_name = models.CharField(max_length=70, blank=True) class Tour(models.Model): destination = models.ForeignKey( Destination, on_delete=models.CASCADE, related_name='tours' ) tour_name = models.TextField(max_length=80, null=True, blank=True) experience_time = models PositiveIntegerField(validators =[MinValueValidator(1)]) price = models.DecimalField(max_digits=10, decimal_places=0) start_day = models.DateField(null=True, blank=True) end_day = models.DateField(null=True, blank=True) min_age = models.PositiveIntegerField(validators =[MinValueValidator(2)]) max_people = models.IntegerField(validators= [MinValueValidator(1)]) status_evaluete = models.IntegerField(choices=STATUS_E_CHOICES, default=0) detail_tour = models.TextField() votes = models.IntegerField(default=0) class Booking(models.Model): profile = models.ForeignKey(User, Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 62 on_delete=models.CASCADE, related_name='booking') tour = models.ForeignKey(Tour, on_delete=models.CASCADE) status_booking = models.IntegerField (choices=STATUS_B_CHOICES, default=0) booking_time = models.DateField (auto_now_add=True) people_number = models.PositiveIntegerField (validators=[MinValueValidator(1)]) total_price = models DecimalField(max_digits=10 , decimal_places=0) class Blog(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) title = models.CharField(max_length=150) content = models.TextField() date = models.DateField(auto_now_add=True) tag = models.CharField(max_length=50) image = models.ImageField(upload_to='images/blogs/') class Slider(models.Model): slider_image = models.ImageField(upload_to='images/sliders', blank=True) title = models.CharField(max_length=100) teaser = models.TextField('teaser', blank=True) class Photo(models.Model): tour = models.ForeignKey(Tour, on_delete=models.CASCADE, related_name='tour_photo') image = Lý Văn Trà – Lớp 16CNTT1 (2016-2020) 63 models.ImageField(upload_to='images/tours') class Review(models.Model): tour= models.ForeignKey(Tour, on_delete=models.CASCADE, related_name='review') author = models.ForeignKey(User, on_delete=models.CASCADE) content = models.TextField() date = models.DateTimeField(auto_now_add=True) Lý Văn Trà – Lớp 16CNTT1 (2016-2020) ... hàng đợi, hết vé phải mua vé qua tay với giá cao,…Vì vậy, website đặt vé du lịch đời Mục tiêu đề tài Xây dựng hệ thống đặt vé cho khách du lịch người muốn tìm hiểu du lịch cách thuận tiện với... du lịch phải thể đầy đủ thông tin cần thiết cho người dung Ngoài hệ thống phải hướng đến việc mở rộng đặt vé du lịch nước Đối tượng nghiên cứu Website xây dựng hướng đến người dùng khách du lịch. .. thỏa mãn nhu cầu khách hàng Vậy nên, em thực đồ án ? ?Xây dựng website đặt vé du lịch? ?? để tạo nhiều điều kiện thuận lợi cho khách hàng quảng bá du lịch Việt Nam Em xin chân thành cảm ơn TS Trần Văn

Ngày đăng: 06/05/2021, 16:58

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan