基于Django的餐厅推荐系统

38 阅读5分钟

一、个人简介

💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊

二、系统介绍

开发语言:Java+Python 数据库:MySQL 系统架构:B/S 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django 前端:Vue+HTML+CSS+JavaScript+jQuery

Django餐厅推荐系统是一个基于Python Django框架开发的现代化餐饮服务平台,采用前后端分离的B/S架构设计,前端运用Vue.js配合ElementUI组件库构建用户界面,后端基于Django框架提供RESTful API服务,数据存储采用MySQL关系型数据库。该系统整合了用户管理、餐厅信息管理、菜品分类管理、订单处理等核心业务模块,为用户提供便捷的餐厅查找和菜品推荐服务。系统支持用户注册登录、个人信息维护、餐厅详情浏览、菜品信息查询、在线下单等完整的餐饮服务流程,同时为管理员提供后台管理功能,包括餐厅信息录入、菜品类型分类、订单状态跟踪等运营管理工具。通过Django的ORM机制实现数据持久化,Vue的响应式设计保证良好的用户体验,ElementUI组件确保界面的美观性和一致性,整体架构清晰,功能模块划分合理,具备良好的可扩展性和维护性。

三、Django餐厅推荐系统-视频解说

基于Django的餐厅推荐系统

四、Django餐厅推荐系统-功能展示

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、Django餐厅推荐系统-代码展示


from pyspark.sql import SparkSession
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required
from .models import Restaurant, MenuItem, Order, User
import json
from datetime import datetime
from django.db import transaction

@csrf_exempt
@login_required
def restaurant_recommendation(request):
    spark = SparkSession.builder.appName("RestaurantRecommendation").getOrCreate()
    if request.method == 'POST':
        data = json.loads(request.body)
        user_id = data.get('user_id')
        cuisine_preference = data.get('cuisine_type', '')
        price_range = data.get('price_range', 'medium')
        location = data.get('location', '')
        user_orders = Order.objects.filter(user_id=user_id).select_related('restaurant')
        visited_restaurants = [order.restaurant.id for order in user_orders]
        base_query = Restaurant.objects.filter(is_active=True)
        if cuisine_preference:
            base_query = base_query.filter(cuisine_type__icontains=cuisine_preference)
        if location:
            base_query = base_query.filter(address__icontains=location)
        if price_range == 'low':
            base_query = base_query.filter(average_price__lte=50)
        elif price_range == 'medium':
            base_query = base_query.filter(average_price__gt=50, average_price__lte=100)
        else:
            base_query = base_query.filter(average_price__gt=100)
        candidate_restaurants = base_query.exclude(id__in=visited_restaurants)
        recommendation_scores = {}
        for restaurant in candidate_restaurants:
            score = 0
            if restaurant.cuisine_type and cuisine_preference:
                if cuisine_preference.lower() in restaurant.cuisine_type.lower():
                    score += 30
            score += min(restaurant.rating * 10, 25)
            recent_orders = Order.objects.filter(restaurant=restaurant, created_at__gte=datetime.now().replace(day=1)).count()
            score += min(recent_orders * 2, 20)
            menu_variety = MenuItem.objects.filter(restaurant=restaurant).count()
            score += min(menu_variety, 15)
            if restaurant.average_price:
                if price_range == 'low' and restaurant.average_price <= 50:
                    score += 10
                elif price_range == 'medium' and 50 < restaurant.average_price <= 100:
                    score += 10
                elif price_range == 'high' and restaurant.average_price > 100:
                    score += 10
            recommendation_scores[restaurant.id] = score
        sorted_restaurants = sorted(recommendation_scores.items(), key=lambda x: x[1], reverse=True)
        recommended_restaurant_ids = [item[0] for item in sorted_restaurants[:10]]
        recommended_restaurants = Restaurant.objects.filter(id__in=recommended_restaurant_ids)
        restaurant_data = []
        for restaurant in recommended_restaurants:
            restaurant_data.append({
                'id': restaurant.id,
                'name': restaurant.name,
                'cuisine_type': restaurant.cuisine_type,
                'address': restaurant.address,
                'rating': restaurant.rating,
                'average_price': restaurant.average_price,
                'image_url': restaurant.image.url if restaurant.image else None,
                'recommendation_score': recommendation_scores.get(restaurant.id, 0)
            })
        return JsonResponse({'success': True, 'restaurants': restaurant_data})
    return JsonResponse({'success': False, 'message': 'Invalid request method'})

@csrf_exempt
@login_required
@transaction.atomic
def create_order(request):
    spark = SparkSession.builder.appName("OrderProcessing").getOrCreate()
    if request.method == 'POST':
        data = json.loads(request.body)
        user_id = request.user.id
        restaurant_id = data.get('restaurant_id')
        menu_items = data.get('menu_items', [])
        delivery_address = data.get('delivery_address', '')
        special_instructions = data.get('special_instructions', '')
        if not restaurant_id or not menu_items:
            return JsonResponse({'success': False, 'message': 'Restaurant and menu items are required'})
        try:
            restaurant = Restaurant.objects.get(id=restaurant_id, is_active=True)
        except Restaurant.DoesNotExist:
            return JsonResponse({'success': False, 'message': 'Restaurant not found'})
        total_amount = 0
        order_items = []
        for item_data in menu_items:
            menu_item_id = item_data.get('menu_item_id')
            quantity = int(item_data.get('quantity', 1))
            try:
                menu_item = MenuItem.objects.get(id=menu_item_id, restaurant=restaurant, is_available=True)
            except MenuItem.DoesNotExist:
                return JsonResponse({'success': False, 'message': f'Menu item {menu_item_id} not found or unavailable'})
            item_total = menu_item.price * quantity
            total_amount += item_total
            order_items.append({
                'menu_item': menu_item,
                'quantity': quantity,
                'unit_price': menu_item.price,
                'total_price': item_total
            })
        delivery_fee = 5.00 if total_amount < 30 else 0
        final_amount = total_amount + delivery_fee
        order = Order.objects.create(
            user_id=user_id,
            restaurant=restaurant,
            total_amount=final_amount,
            delivery_address=delivery_address,
            special_instructions=special_instructions,
            status='pending',
            created_at=datetime.now()
        )
        for item in order_items:
            from .models import OrderItem
            OrderItem.objects.create(
                order=order,
                menu_item=item['menu_item'],
                quantity=item['quantity'],
                unit_price=item['unit_price'],
                total_price=item['total_price']
            )
        restaurant.total_orders = Restaurant.objects.filter(id=restaurant_id).first().total_orders + 1
        restaurant.save()
        for item in order_items:
            menu_item = item['menu_item']
            menu_item.order_count = menu_item.order_count + item['quantity']
            menu_item.save()
        return JsonResponse({
            'success': True,
            'order_id': order.id,
            'total_amount': float(final_amount),
            'delivery_fee': float(delivery_fee),
            'estimated_delivery_time': '30-45 minutes',
            'message': 'Order created successfully'
        })
    return JsonResponse({'success': False, 'message': 'Invalid request method'})

@csrf_exempt
@login_required
def menu_management(request):
    spark = SparkSession.builder.appName("MenuManagement").getOrCreate()
    if request.method == 'GET':
        restaurant_id = request.GET.get('restaurant_id')
        category_filter = request.GET.get('category', '')
        price_filter = request.GET.get('price_range', '')
        availability_filter = request.GET.get('available_only', 'false').lower() == 'true'
        if not restaurant_id:
            return JsonResponse({'success': False, 'message': 'Restaurant ID is required'})
        try:
            restaurant = Restaurant.objects.get(id=restaurant_id)
        except Restaurant.DoesNotExist:
            return JsonResponse({'success': False, 'message': 'Restaurant not found'})
        menu_query = MenuItem.objects.filter(restaurant=restaurant)
        if availability_filter:
            menu_query = menu_query.filter(is_available=True)
        if category_filter:
            menu_query = menu_query.filter(category__name__icontains=category_filter)
        if price_filter:
            if price_filter == 'low':
                menu_query = menu_query.filter(price__lte=20)
            elif price_filter == 'medium':
                menu_query = menu_query.filter(price__gt=20, price__lte=50)
            elif price_filter == 'high':
                menu_query = menu_query.filter(price__gt=50)
        menu_items = menu_query.order_by('category__name', 'name')
        categories = {}
        for item in menu_items:
            category_name = item.category.name if item.category else 'Other'
            if category_name not in categories:
                categories[category_name] = []
            item_data = {
                'id': item.id,
                'name': item.name,
                'description': item.description,
                'price': float(item.price),
                'is_available': item.is_available,
                'image_url': item.image.url if item.image else None,
                'ingredients': item.ingredients.split(',') if item.ingredients else [],
                'preparation_time': item.preparation_time,
                'order_count': item.order_count
            }
            categories[category_name].append(item_data)
        popular_items = MenuItem.objects.filter(restaurant=restaurant).order_by('-order_count')[:5]
        popular_items_data = []
        for item in popular_items:
            popular_items_data.append({
                'id': item.id,
                'name': item.name,
                'price': float(item.price),
                'order_count': item.order_count
            })
        return JsonResponse({
            'success': True,
            'restaurant_name': restaurant.name,
            'categories': categories,
            'popular_items': popular_items_data,
            'total_items': menu_items.count()
        })
    elif request.method == 'POST':
        data = json.loads(request.body)
        restaurant_id = data.get('restaurant_id')
        item_name = data.get('name', '').strip()
        item_description = data.get('description', '').strip()
        item_price = data.get('price')
        category_id = data.get('category_id')
        ingredients = data.get('ingredients', '').strip()
        preparation_time = data.get('preparation_time', 15)
        if not all([restaurant_id, item_name, item_price, category_id]):
            return JsonResponse({'success': False, 'message': 'Required fields are missing'})
        try:
            restaurant = Restaurant.objects.get(id=restaurant_id)
            from .models import MenuCategory
            category = MenuCategory.objects.get(id=category_id)
            price_decimal = float(item_price)
        except (Restaurant.DoesNotExist, MenuCategory.DoesNotExist, ValueError):
            return JsonResponse({'success': False, 'message': 'Invalid restaurant, category, or price'})
        if MenuItem.objects.filter(restaurant=restaurant, name=item_name).exists():
            return JsonResponse({'success': False, 'message': 'Menu item with this name already exists'})
        menu_item = MenuItem.objects.create(
            restaurant=restaurant,
            category=category,
            name=item_name,
            description=item_description,
            price=price_decimal,
            ingredients=ingredients,
            preparation_time=preparation_time,
            is_available=True,
            order_count=0,
            created_at=datetime.now()
        )
        return JsonResponse({
            'success': True,
            'menu_item_id': menu_item.id,
            'message': 'Menu item created successfully'
        })
    return JsonResponse({'success': False, 'message': 'Invalid request method'})

六、Django餐厅推荐系统-文档展示

在这里插入图片描述

七、END

💕💕文末获取源码联系计算机编程果茶熊