推荐系统:Python汽车推荐系统 数据分析 可视化 协同过滤推荐算法 汽车租赁 Django框架 大数据 计算机✅

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

1、项目介绍

  • 技术栈:Python语言、Django框架(Web后端+MVT架构)、MySQL数据库(存储汽车/用户/订单数据)、Echarts可视化(浏览量排行/数据统计)、基于用户的协同过滤推荐算法、HTML+CSS(前端交互界面)
  • 核心功能:汽车租赁全流程支持(选车-推荐-下单-充值-订单管理)、汽车信息展示(热门车型/详情)、用户交互(点赞/收藏/评分/评论)、个性化推荐(协同过滤驱动)、数据可视化(浏览量排行)、后台管理(数据/订单/评分管控)
  • 研究背景:汽车租赁行业线上化需求激增,但传统平台存在痛点——用户选车依赖人工咨询,难以快速匹配“符合预算/使用场景的车型”;推荐仅依赖热门度,忽略个人偏好(如用户常租SUV却推荐轿车);租赁流程分散(选车与支付、订单查询需切换页面),用户体验差,亟需“一站式、个性化”的汽车租赁线上系统解决。
  • 研究意义:技术层面,整合Django全栈开发、协同过滤推荐与租赁业务逻辑,构建“推荐-租赁-管理”闭环;应用层面,为用户提供“精准选车+便捷租赁”体验,为商家提供“数据化运营+订单管控”工具;学习层面,适合作为Web开发+业务场景结合的毕业设计,覆盖核心技术与实际商业需求。

2、项目界面

  1. 首页----热门汽车(热门租赁车型展示)
    在这里插入图片描述

  2. 汽车详情页—详情信息、评分、点赞、收藏、评论(单车型租赁参考)
    在这里插入图片描述

  3. 浏览量排行榜可视化(热门车型数据洞察)
    在这里插入图片描述

  4. 我的收藏(用户偏好车型管理)
    在这里插入图片描述

  5. 我的租赁订单(用户订单状态查询)
    在这里插入图片描述

  6. 汽车推荐—协同过滤算法(个性化租赁推荐)
    在这里插入图片描述

  7. 充值中心—租赁汽车(租赁支付前置支持)
    在这里插入图片描述

  8. 注册登录(用户身份认证)
    在这里插入图片描述

  9. 后台数据管理(全量数据运维)
    在这里插入图片描述

  10. 用户评分管理(评分真实性管控)
    在这里插入图片描述

3、项目说明

本项目是基于Django开发的汽车租赁一站式智能系统,聚焦“个性化选车-便捷租赁-高效管理”核心需求,通过协同过滤算法实现精准推荐,Echarts实现数据可视化,配套完整的租赁流程(充值-下单-订单跟踪)与后台管控,旨在解决传统汽车租赁平台“选车难、流程散、管理乱”的问题。

(1)系统架构与技术逻辑

  • 架构设计:采用Django MVT架构,结合业务场景分层,支撑租赁全流程:
    1. 数据层(MySQL):核心表结构覆盖全业务——
      • 汽车表:车型、配置(座位数/油耗)、租赁价格(日租/月租)、图片、库存状态;
      • 用户表:账号、密码(加密存储)、余额、注册信息、浏览/收藏记录;
      • 订单表:订单号、用户ID、汽车ID、租赁周期、金额、支付状态(待支付/已完成/已取消);
      • 评分表:用户ID、汽车ID、评分(1-5星)、评论内容、时间;
    2. 业务逻辑层(Django)
      • 模型层(Model):映射数据库表,定义数据关联(如“订单-用户-汽车”多对一关系);
      • 视图层(View):处理核心业务——用户认证(注册登录)、租赁流程(下单/支付/订单状态更新)、推荐算法调用、数据统计(浏览量/评分);
      • 模板层(Template):结合HTML+CSS渲染前端界面,嵌入Echarts图表与交互组件;
    3. 算法层:基于用户的协同过滤算法,以“用户行为(浏览/收藏/评分)”为核心,生成个性化租赁推荐;
    4. 交互层:前端界面支持“选车-推荐-下单-充值-查单”闭环操作,降低用户操作成本;
  • 核心流程:用户注册登录→浏览热门/推荐车型→查看详情并收藏/评分→下单租赁→充值支付→在“我的订单”跟踪状态→管理员通过后台维护数据/管控评分。

(2)核心功能模块详解

① 汽车租赁核心流程模块(业务闭环)
  • 功能:覆盖“选车-下单-支付-订单管理”全流程,实现租赁线上化;
  • 关键环节实现
    1. 选车与推荐:用户通过“首页热门汽车”“汽车推荐”模块筛选车型,推荐算法基于历史行为匹配偏好(如常租7座车则优先推荐MPV);
    2. 下单:在汽车详情页点击“立即租赁”,选择租赁周期(日租/月租),系统自动计算金额(如日租200元×3天=600元),生成待支付订单;
    3. 充值支付:用户进入“充值中心”,选择充值金额(支持自定义),完成支付后余额更新,可用于支付订单(系统记录充值日志,保障资金可追溯);
    4. 订单管理:“我的租赁订单”展示所有订单,标注状态(待支付/已支付/已完成),支持“取消待支付订单”“查看已完成订单详情”,后台管理员可同步查看全量订单,处理异常(如用户取消已确认订单)。
② 基于用户的协同过滤推荐模块(技术核心)
  • 功能:解决“推荐同质化”问题,为租赁场景提供精准车型匹配;
  • 技术实现
    1. 行为数据采集:记录用户核心行为并赋值权重——浏览(权重1)、收藏(权重3)、评分(权重=评分值,如5星=5),构建“用户-汽车行为矩阵”;
    2. 相似度计算:通过余弦相似度计算“目标用户与其他用户的行为相似度”,公式为:
      sim ( u , v ) = ∑ i ∈ I u v w u i × w v i ∑ i ∈ I u w u i 2 × ∑ i ∈ I v w v i 2 \text{sim}(u,v) = \frac{\sum_{i \in I_{uv}} w_{ui} \times w_{vi}}{\sqrt{\sum_{i \in I_u} w_{ui}^2} \times \sqrt{\sum_{i \in I_v} w_{vi}^2}} sim(u,v)=iIuwui2 ×iIvwvi2 iIuvwui×wvi
      其中 u u u为目标用户, v v v为其他用户, w u i w_{ui} wui u u u对汽车 i i i的行为权重, I u v I_{uv} Iuv为两者共同交互的汽车集合;
    3. 推荐生成:筛选相似度≥0.6的TOP15相似用户,提取其高权重(收藏/5星评分)且目标用户未浏览的汽车,按“加权得分”降序生成TOP8推荐列表,标注“推荐理由”(如“与您偏好相似的用户常租此车型”)。
③ 数据可视化与用户交互模块(体验支撑)
  • 数据可视化(Echarts核心应用)

    1. 浏览量排行榜:柱状图展示“TOP10热门车型浏览量”(如“丰田汉兰达浏览量1200次,排名第一”),支持按“周/月”切换统计周期,帮助用户快速定位高关注度车型;
    2. 隐性数据支撑:后台可查看“各车型租赁转化率”(浏览量→下单量)、“用户评分分布”(如某车型4-5星占比85%),辅助商家优化车型库存。
  • 用户交互功能

    1. 点赞/收藏/评论:用户在详情页对车型点赞(增加热度值)、收藏(加入“我的收藏”,便于后续租赁)、发表评论(补充使用体验,如“空间大,适合家庭出行”),所有操作实时同步至数据库;
    2. 评分管理:用户提交评分后,管理员在“用户评分管理”模块审核,删除恶意评分(如无理由1星),保障评分真实性,为其他用户提供可靠参考。
④ 后台管理模块(运维支撑)
  • 功能:保障系统数据准确与业务稳定,分为两大核心:
    1. 全量数据管理:管理员通过“后台数据管理”维护汽车数据(新增车型、更新租赁价格、调整库存)、用户数据(禁用违规账号、重置用户密码)、订单数据(处理用户取消申请、标记订单完成);
    2. 评分管控:“用户评分管理”模块展示所有用户评分,支持按“车型/时间”筛选,管理员可删除不合理评分(如广告评论、恶意低分),维护评分体系公正性。

4、核心代码



def add_order(request):
    # 用户预定车辆
    user_id = request.session.get('user_id')
    car_id = request.POST.get('car_id')
    car = CarModel.objects.get(id=car_id)
    user = UserInfoModel.objects.get(id=user_id)
    if user.money < car.price:
        return JsonResponse({'code': 400, 'message': '您的账户余额不足,请充值'})
    if car.number == 0:
        return JsonResponse({'code': 400, 'message': '该车辆暂无库存'})
    OrderModel.objects.create(
        user_id=user_id,
        car_id=car_id,
        price=car.price
    )
    user.money -= car.price
    user.save()
    car.number -= 1
    car.save()
    return JsonResponse({'code': 200})


def add_collect(request):
    # 添加收藏
    user_id = request.session.get('user_id')
    car_id = request.POST.get('car_id')
    flag = CollectModel.objects.filter(user_id=user_id, item_id=car_id).first()
    if flag:
        return JsonResponse({'code': 400, 'message': '该车辆已收藏,请勿重复添加'})
    CollectModel.objects.create(
        user_id=user_id,
        item_id=car_id
    )
    return JsonResponse({'code': 200})


def input_score(request):
    # 用户对汽车进行评分
    user_id = request.session.get('user_id')
    if not user_id:
        return JsonResponse({'code': 400, 'message': '请先登录'})
    score = int(request.POST.get('score'))
    car_id = request.POST.get('car_id')
    MarkModel.objects.create(
        item_id=car_id,
        score=score,
        user_id=user_id
    )
    return JsonResponse({'code': 200})


def add_comment(request):
    # 添加评论
    user_id = request.session.get('user_id')
    if not user_id:
        return JsonResponse({'code': 400, 'message': '请先登录'})
    content = request.POST.get('content')
    car_id = request.POST.get('car_id')
    if not content:
        return JsonResponse({'code': 400, 'message': '内容不能为空'})

    CommentModel.objects.create(
        user_id=user_id,
        content=content,
        car_id=car_id
    )
    return JsonResponse({'code': 200})


def my_info(request):
    user_id = request.session.get('user_id')
    if request.method == 'GET':
        # 个人信息界面
        info = UserInfoModel.objects.filter(
            id=user_id
        ).first()
        context = {
            'info': info
        }
        return render(request, 'my_info.html', context=context)
    else:
        # 更新个人信息
        username = request.POST.get('username')
        password = request.POST.get('password')
        phone = request.POST.get('phone')
        if not (username or password or phone):
            return JsonResponse({'code': 400, 'message': '参数不能为空'})

        UserInfoModel.objects.filter(
            id=user_id
        ).update(
            username=username,
            password=password,
            phone=phone,
        )
        return JsonResponse({'code': 200})


def top_up(request):
    user_id = request.session.get('user_id')
    user = UserInfoModel.objects.get(id=user_id)
    if request.method == 'GET':
        # 显示充值界面
        context = {
            'user': user
        }
        return render(request, 'top_up.html', context=context)
    else:
        money = request.POST.get('money')
        if not money:
            return JsonResponse({'code': 400, 'message': '充值金额不能为空'})
        user.money = user.money + int(money)
        user.save()
        return JsonResponse({'code': 200})


def calculate_cosine_similarity(user_ratings1, user_ratings2):
    # 将用户1的车辆评分存入字典,键为车辆ID,值为评分
    item_ratings1 = {rating.item_id: rating.score for rating in user_ratings1}
    # 将用户2的车辆评分存入字典,键为车辆ID,值为评分
    item_ratings2 = {rating.item_id: rating.score for rating in user_ratings2}

    # 找出两个用户共同评价过的车辆
    common_items = set(item_ratings1.keys()) & set(item_ratings2.keys())

    if len(common_items) == 0:
        return 0.0  # 无共同评价的车辆,相似度为0

    # 提取共同评价车辆的评分,存入NumPy数组
    user1_scores = np.array([item_ratings1[item_id] for item_id in common_items])
    user2_scores = np.array([item_ratings2[item_id] for item_id in common_items])

    # 计算余弦相似度
    cosine_similarity = np.dot(user1_scores, user2_scores) / (
            np.linalg.norm(user1_scores) * np.linalg.norm(user2_scores))
    return cosine_similarity


def user_based_recommendation(request, user_id):
    try:
        # 获取目标用户对象
        target_user = UserInfoModel.objects.get(id=user_id)
    except UserInfoModel.DoesNotExist:
        return JsonResponse({'code': 400, 'message': '该用户不存在'})

    # 获取目标用户的车辆评分记录
    target_user_ratings = MarkModel.objects.filter(user=target_user)

    # 用于存储推荐车辆的字典
    recommended_items = {}

    # 遍历除目标用户外的所有其他用户
    for other_user in UserInfoModel.objects.exclude(pk=user_id):
        # 获取其他用户的车辆评分记录
        other_user_ratings = MarkModel.objects.filter(user=other_user)

        # 计算目标用户与其他用户的相似度
        similarity = calculate_cosine_similarity(target_user_ratings, other_user_ratings)

        if similarity > 0:
            # 遍历其他用户评价的车辆
            for item_rating in other_user_ratings:
                # 仅考虑目标用户未评价过的车辆
                if item_rating.item not in target_user_ratings.values_list('item', flat=True):
                    if item_rating.item.id in recommended_items:
                        # 累积相似度加权的评分和相似度
                        recommended_items[item_rating.item.id]['score'] += similarity * item_rating.score
                        recommended_items[item_rating.item.id]['similarity'] += similarity
                    else:
                        # 创建推荐车辆的记录
                        recommended_items[item_rating.item.id] = {'score': similarity * item_rating.score,
                                                                  'similarity': similarity}

    # 将推荐车辆按照加权评分排序
    sorted_recommended_items = sorted(recommended_items.items(), key=lambda x: x[1]['score'], reverse=True)

    # 获取排名靠前的推荐车辆的ID
    top_recommended_items = [item_id for item_id, _ in sorted_recommended_items[:5]]

    # 构建响应数据
    response_data = []
    for item_id in top_recommended_items:
        item = CarModel.objects.get(pk=item_id)
        similarity = recommended_items[item_id]['similarity']
        response_data.append({
            'name': item.name,
            'id': item.id,
            'image': item.image,
            'similarity': similarity,
        })
    context = {
        'response_data': response_data
    }
    return render(request, 'item_recommend.html', context=context)


def view_count(request):
    # 浏览量
    if request.method == 'GET':
        return render(request, 'view_count.html')
    else:
        cars = CarModel.objects.all().order_by('-view_number')[:10]
        name_list = []
        count_list = []
        for car in cars:
            name_list.append(car.name)
            count_list.append(car.view_number)
        return JsonResponse({'code': 200, 'name_list': name_list, 'count_list': count_list})

🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目编程以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅

点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值