同過濾算法的電影推薦系統(tǒng):Django+Vue+MySQL全棧實現(xiàn)指南)
簡介這是一套面向計算機(jī)專業(yè)本科生的畢業(yè)設(shè)計實戰(zhàn)資源聚焦于推薦系統(tǒng)工程實踐基于協(xié)同過濾算法構(gòu)建可運(yùn)行的電影推薦平臺解決傳統(tǒng)影視平臺個性化服務(wù)不足與開發(fā)學(xué)習(xí)資料碎片化問題。資源包共688個文件13.07MB涵蓋38個核心Python后端邏輯文件、33個Vue前端組件如IndexMain.vue、update-password.vue等、162個SVG圖標(biāo)與162個JS腳本支撐交互配合Django RESTful接口、MySQL數(shù)據(jù)庫腳本及完整部署腳本install.bat、run.bat等實現(xiàn)前后端分離架構(gòu)落地。已有277人學(xué)習(xí)下載提供從環(huán)境搭建、用戶/管理員雙角色功能含評分管理、分類維護(hù)、評論收藏、協(xié)同過濾推薦模塊到畢業(yè)論文全文的完整交付物代碼結(jié)構(gòu)清晰、注釋規(guī)范適合作為課程設(shè)計參考、畢設(shè)開題原型或算法工程化學(xué)習(xí)范例。1. 項目概述與核心價值又到了一年一度的畢業(yè)季相信不少計算機(jī)相關(guān)專業(yè)的同學(xué)正在為畢業(yè)設(shè)計焦頭爛額。選題既要體現(xiàn)技術(shù)深度又要能跑通、能答辯還得有完整的文檔和代碼著實是個不小的挑戰(zhàn)。如果你正在尋找一個能綜合運(yùn)用主流Web開發(fā)技術(shù)、算法知識并且有完整實現(xiàn)方案的項目那么一個基于協(xié)同過濾算法的電影推薦系統(tǒng)絕對是一個“六邊形戰(zhàn)士”級別的選擇。這個項目不僅涵蓋了Python后端、Vue前端、MySQL數(shù)據(jù)庫的經(jīng)典技術(shù)棧還引入了推薦算法這一AI領(lǐng)域的核心應(yīng)用技術(shù)含量和展示度都足夠。我當(dāng)年畢業(yè)設(shè)計做的就是推薦系統(tǒng)相關(guān)深知其中的門道。一個完整的電影推薦系統(tǒng)遠(yuǎn)不止是調(diào)用一個算法庫那么簡單。它需要你理解業(yè)務(wù)邏輯用戶、電影、評分、設(shè)計合理的數(shù)據(jù)流從前端交互到后端處理再到算法計算最后還要把結(jié)果優(yōu)雅地展示出來。這個項目能讓你把大學(xué)里學(xué)的數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫、Web開發(fā)、甚至機(jī)器學(xué)習(xí)導(dǎo)論的知識都串起來形成一個完整的作品。更重要的是它的成果非常直觀——一個能根據(jù)你的喜好推薦電影的網(wǎng)站在答辯時演示效果拉滿老師一眼就能看出你的工作量和技術(shù)能力。接下來我就以這個“PythonDjangoVueMySQL電影推薦系統(tǒng)”為例為你徹底拆解它的技術(shù)內(nèi)核、實現(xiàn)步驟以及那些教科書上不會寫的“踩坑”經(jīng)驗。無論你是即將開始畢設(shè)的同學(xué)還是想通過一個綜合項目提升技能的開發(fā)者這份超詳細(xì)的指南都能讓你少走很多彎路。2. 技術(shù)棧選型與整體架構(gòu)設(shè)計2.1 為什么是Django Vue MySQL在開始敲代碼之前搞清楚為什么選這些技術(shù)比盲目上手更重要。這關(guān)系到整個項目的技術(shù)合理性和你的學(xué)習(xí)收益。后端Python DjangoPython是數(shù)據(jù)科學(xué)和Web開發(fā)領(lǐng)域的“瑞士軍刀”生態(tài)豐富。選擇Django而非Flask或FastAPI主要基于畢設(shè)項目的特殊性“開箱即用”與開發(fā)效率Django自帶Admin后臺、ORM、用戶認(rèn)證、路由等大量組件。對于畢設(shè)這種需要快速搭建完整后臺管理功能管理用戶、電影數(shù)據(jù)的項目Django能節(jié)省大量重復(fù)勞動時間。結(jié)構(gòu)化與規(guī)范性Django強(qiáng)調(diào)“約定優(yōu)于配置”其項目結(jié)構(gòu)如models.py,views.py,urls.py非常清晰。這強(qiáng)迫你寫出結(jié)構(gòu)良好的代碼對于畢業(yè)論文中“系統(tǒng)設(shè)計”章節(jié)的撰寫也極其有利你可以直接按照Django的MVTModel-View-Template模式來闡述。ORM的強(qiáng)大與安全Django ORM讓你用Python類來操作數(shù)據(jù)庫避免了手寫SQL字符串天然防止了SQL注入攻擊。對于需要處理復(fù)雜用戶-電影-評分關(guān)系的系統(tǒng)用ORM進(jìn)行多表查詢和聚合操作會方便很多。注意很多同學(xué)會覺得Django“重”但對于一個需要展示完整增刪改查、權(quán)限管理功能的畢設(shè)系統(tǒng)它的“重”恰恰是優(yōu)點(diǎn)。如果你追求極致的API性能可以考慮Django REST framework (DRF) 來構(gòu)建RESTful API這同樣是行業(yè)主流實踐。前端Vue.jsVue是目前國內(nèi)最主流的前端框架之一其漸進(jìn)式、易上手的特點(diǎn)非常適合學(xué)生項目。前后端分離的必然選擇現(xiàn)代Web開發(fā)趨勢就是前后端分離。Vue負(fù)責(zé)所有頁面渲染和用戶交互通過Axios等庫與Django后端API通信。這使得前后端可以并行開發(fā)職責(zé)清晰也方便你在畢業(yè)論文中分別論述前端和后端的設(shè)計。組件化開發(fā)電影推薦系統(tǒng)的前端頁面可以拆分成多個組件如導(dǎo)航欄、電影卡片、評分組件、推薦列表等。Vue的組件化思想能讓你更好地組織代碼復(fù)用UI模塊。豐富的生態(tài)Element Plus、Vant等UI庫能讓你快速搭建出美觀的界面把精力集中在業(yè)務(wù)邏輯而非CSS樣式上。數(shù)據(jù)庫MySQL選擇MySQL而不是SQLite或PostgreSQL是基于實用性和普遍性考慮。廣泛認(rèn)可與穩(wěn)定性MySQL是世界上最流行的開源關(guān)系數(shù)據(jù)庫之一在畢業(yè)論文中提及它沒有任何認(rèn)知門檻。其穩(wěn)定性和性能足以支撐畢業(yè)設(shè)計級別的數(shù)據(jù)量和并發(fā)。與Django完美兼容Django官方對MySQL支持非常好配置簡單。ORM生成的遷移文件能無縫在MySQL上運(yùn)行。便于部署與展示你可以在本地或云服務(wù)器上輕松安裝MySQL方便最終的項目部署和答辯演示。協(xié)同過濾算法這是本項目的靈魂。協(xié)同過濾是推薦系統(tǒng)的經(jīng)典算法分為基于用戶的和基于物品的。對于電影推薦基于用戶的協(xié)同過濾UserCF更直觀“找到和你口味相似的用戶把他們喜歡而你沒看過的電影推薦給你”。實現(xiàn)它你需要理解“用戶-物品評分矩陣”、“相似度計算如余弦相似度、皮爾遜相關(guān)系數(shù)”、“最近鄰查找”和“評分預(yù)測”這幾個核心概念。用Python的NumPy和SciPy庫可以高效實現(xiàn)矩陣運(yùn)算。2.2 系統(tǒng)核心模塊設(shè)計一個可運(yùn)行、可演示的推薦系統(tǒng)至少需要以下核心模塊這也是你設(shè)計和編碼的藍(lán)圖用戶模塊負(fù)責(zé)用戶注冊、登錄、登出、個人信息管理。這是系統(tǒng)的基礎(chǔ)。電影資源模塊電影信息的增刪改查CRUD。包括電影標(biāo)題、海報、類型、導(dǎo)演、簡介等字段。這部分?jǐn)?shù)據(jù)通常需要從公開數(shù)據(jù)集如MovieLens導(dǎo)入。評分與交互模塊這是推薦算法的“燃料”。用戶對電影進(jìn)行評分例如1-5星或點(diǎn)擊“喜歡”。每一條評分記錄都將被存入數(shù)據(jù)庫用于計算用戶偏好。推薦算法模塊系統(tǒng)的核心“大腦”。它定期或?qū)崟r運(yùn)行協(xié)同過濾算法根據(jù)所有用戶的評分歷史為每個用戶生成一個個性化的電影推薦列表并將結(jié)果緩存或存入數(shù)據(jù)庫。推薦展示模塊前端頁面從后端獲取針對當(dāng)前用戶的推薦列表并以美觀的網(wǎng)格或列表形式展示出來。后臺管理模塊基于Django Admin方便你作為管理員管理用戶、電影數(shù)據(jù)監(jiān)控評分記錄甚至可以手動觸發(fā)推薦算法的計算任務(wù)。整體數(shù)據(jù)流可以這樣理解用戶在前端評分 - 評分?jǐn)?shù)據(jù)通過API存入MySQL - 推薦算法模塊讀取所有評分?jǐn)?shù)據(jù)計算相似度并生成推薦結(jié)果 - 前端請求推薦API - 后端返回推薦列表 - 前端渲染展示。3. 開發(fā)環(huán)境搭建與項目初始化3.1 Python與Node.js環(huán)境配置工欲善其事必先利其器。一個干凈的開發(fā)環(huán)境是成功的第一步。Python環(huán)境后端強(qiáng)烈建議使用conda或venv創(chuàng)建獨(dú)立的Python虛擬環(huán)境避免包版本沖突。# 創(chuàng)建并激活虛擬環(huán)境 (以venv為例) python -m venv venv # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate # 安裝Django及其他核心依賴 pip install django django-cors-headers djangorestframework numpy scipy pandas pymysqldjango-cors-headers用于處理前端Vue項目跨域請求前后端分離項目必備。djangorestframework用于構(gòu)建RESTful API讓前后端數(shù)據(jù)交互更規(guī)范。numpy, scipy, pandas協(xié)同過濾算法進(jìn)行矩陣計算和數(shù)據(jù)處理的基石。pymysqlPython連接MySQL數(shù)據(jù)庫的驅(qū)動。Node.js環(huán)境前端確保安裝了Node.js建議LTS版本然后使用Vue官方工具Vite或Vue CLI創(chuàng)建項目。這里以更快的Vite為例# 使用Vite創(chuàng)建Vue項目 npm create vuelatest movie-recommendation-frontend # 按照提示選擇需要的特性如TypeScript, Router, Pinia等。 # 進(jìn)入項目并安裝基礎(chǔ)依賴 cd movie-recommendation-frontend npm install # 安裝UI庫和HTTP客戶端 (以Element Plus和Axios為例) npm install element-plus axios npm install --save-dev sass3.2 Django后端項目初始化與配置創(chuàng)建Django項目和應(yīng)用django-admin startproject backend cd backend python manage.py startapp recommender # 推薦系統(tǒng)核心應(yīng)用 python manage.py startapp user # 用戶管理應(yīng)用 python manage.py startapp movie # 電影資源管理應(yīng)用分應(yīng)用開發(fā)能讓代碼結(jié)構(gòu)更清晰recommender應(yīng)用專門存放算法邏輯。配置MySQL數(shù)據(jù)庫 在backend/settings.py中修改數(shù)據(jù)庫配置DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: movie_recommend_db, # 數(shù)據(jù)庫名 USER: your_username, PASSWORD: your_password, HOST: localhost, PORT: 3306, } }記得先在MySQL中創(chuàng)建名為movie_recommend_db的數(shù)據(jù)庫。配置跨域與REST Framework 在settings.py的INSTALLED_APPS中添加corsheaders和rest_framework。并添加中間件和CORS設(shè)置MIDDLEWARE [ corsheaders.middleware.CorsMiddleware, # 盡量放在前面 # ... ] CORS_ALLOW_ALL_ORIGINS True # 開發(fā)階段允許所有源生產(chǎn)環(huán)境需指定 # 或者更安全的方式 # CORS_ALLOWED_ORIGINS [ # http://localhost:5173, # Vite默認(rèn)前端地址 # ]3.3 數(shù)據(jù)模型設(shè)計詳解這是項目的基石設(shè)計好壞直接影響后續(xù)開發(fā)復(fù)雜度。主要涉及三張核心表用戶表 (User)可以直接繼承Django內(nèi)置的AbstractUser增加頭像、個性簽名等字段。電影表 (Movie)存儲電影元數(shù)據(jù)。# movie/models.py from django.db import models class Movie(models.Model): title models.CharField(max_length200, verbose_name電影標(biāo)題) genres models.CharField(max_length100, verbose_name類型) # 如喜劇|愛情|科幻 release_date models.DateField(nullTrue, blankTrue, verbose_name上映日期) director models.CharField(max_length100, blankTrue, verbose_name導(dǎo)演) actors models.TextField(blankTrue, verbose_name主演) plot models.TextField(blankTrue, verbose_name劇情簡介) poster_url models.URLField(max_length500, blankTrue, verbose_name海報鏈接) imdb_id models.CharField(max_length20, blankTrue, uniqueTrue) # 可以添加平均評分、評分人數(shù)等衍生字段方便排序和展示 average_rating models.FloatField(default0.0) rating_count models.IntegerField(default0) def __str__(self): return self.title評分表 (Rating)連接用戶和電影的橋梁是算法計算的依據(jù)。# recommender/models.py 或 user/models.py from django.conf import settings from movie.models import Movie class Rating(models.Model): user models.ForeignKey(settings.AUTH_USER_MODEL, on_deletemodels.CASCADE, related_nameratings) movie models.ForeignKey(Movie, on_deletemodels.CASCADE, related_nameratings) score models.FloatField() # 評分如4.5 created_at models.DateTimeField(auto_now_addTrue) class Meta: unique_together (user, movie) # 防止同一用戶對同一電影重復(fù)評分 indexes [ models.Index(fields[user, movie]), # 復(fù)合索引加速查詢 ]實操心得在Rating表上建立(user, movie)的聯(lián)合唯一約束和索引至關(guān)重要。唯一約束保證數(shù)據(jù)一致性索引能極大提升“查詢某個用戶對某電影的評分”這類高頻操作的效率尤其是在用戶量和評分?jǐn)?shù)據(jù)增長后。這是數(shù)據(jù)庫優(yōu)化中非常實用的一招。運(yùn)行python manage.py makemigrations和python manage.py migrate創(chuàng)建數(shù)據(jù)表。4. 協(xié)同過濾算法核心實現(xiàn)與優(yōu)化4.1 算法原理與實現(xiàn)步驟我們以實現(xiàn)**基于用戶的協(xié)同過濾UserCF**為例。其核心思想是計算用戶之間的相似度找到目標(biāo)用戶的“鄰居”然后將鄰居喜歡而目標(biāo)用戶未看過的物品推薦給他。步驟拆解構(gòu)建用戶-物品評分矩陣 從數(shù)據(jù)庫的Rating表中取出所有用戶的評分?jǐn)?shù)據(jù)構(gòu)建一個二維矩陣R其中行代表用戶列代表電影值R[u][i]代表用戶u對電影i的評分。對于用戶未評分的電影值通常為0或NaN空。計算用戶相似度 這是算法的關(guān)鍵。常用的相似度度量方法有余弦相似度將用戶視為高維空間中的向量其評分組成向量計算向量夾角的余弦值。適合處理稀疏數(shù)據(jù)。皮爾遜相關(guān)系數(shù)衡量兩個用戶評分趨勢的線性相關(guān)性能消除用戶評分尺度不同有的用戶習(xí)慣打高分有的習(xí)慣打低分的影響。在實際電影推薦中皮爾遜往往效果更好。 我們可以使用scipy.spatial.distance中的pdist和squareform函數(shù)或者sklearn.metrics.pairwise中的cosine_similarity函數(shù)來高效計算整個用戶群的相似度矩陣。尋找最近鄰KNN 對于目標(biāo)用戶u根據(jù)相似度矩陣找出與u最相似的K個用戶構(gòu)成鄰居集合N(u)。K值是一個超參數(shù)通常通過實驗調(diào)整如10-50。生成推薦評分預(yù)測 對于用戶u未評分的電影i預(yù)測其評分P(u,i)。常用公式為P(u,i) mean_u Σ_{v∈N(u)} sim(u,v) * (R(v,i) - mean_v) / Σ_{v∈N(u)} |sim(u,v)|其中mean_u和mean_v分別是用戶u和v的平均評分。這個公式的本質(zhì)是用鄰居用戶v對電影i的評分減去v自己的平均分以消除偏差按照與u的相似度加權(quán)平均最后加上u自己的平均分。生成推薦列表 對用戶u所有未評分電影的預(yù)測評分進(jìn)行排序取Top-N個評分最高的電影作為推薦結(jié)果。4.2 Django中的算法服務(wù)封裝我們不建議在每次用戶請求推薦時都實時計算那樣延遲太高。通常采用離線計算緩存的策略。創(chuàng)建算法服務(wù)類 在recommender/services目錄下創(chuàng)建cf_recommender.py。import numpy as np from scipy.spatial.distance import pdist, squareform from django.db.models import Count, Avg from user.models import User from movie.models import Movie from recommender.models import Rating from django.core.cache import cache class UserCFRecommender: def __init__(self, k20, n_rec10): self.k k # 鄰居數(shù) self.n_rec n_rec # 推薦數(shù) self.user_sim_matrix None self.user_id_map None # 用戶ID到矩陣索引的映射 self.movie_id_map None # 電影ID到矩陣索引的映射 def _build_rating_matrix(self): 從數(shù)據(jù)庫構(gòu)建評分矩陣 ratings Rating.objects.select_related(user, movie).all() # 創(chuàng)建映射 users User.objects.all() movies Movie.objects.all() self.user_id_map {u.id: idx for idx, u in enumerate(users)} self.movie_id_map {m.id: idx for idx, m in enumerate(movies)} # 初始化矩陣 n_users len(users) n_movies len(movies) rating_matrix np.zeros((n_users, n_movies)) # 填充矩陣 for r in ratings: u_idx self.user_id_map[r.user_id] m_idx self.movie_id_map[r.movie_id] rating_matrix[u_idx][m_idx] r.score return rating_matrix def _calculate_similarity(self, rating_matrix): 計算用戶相似度矩陣 (使用皮爾遜相關(guān)系數(shù)) # 為簡化這里使用余弦相似度示例。皮爾遜計算需先中心化。 from sklearn.metrics.pairwise import cosine_similarity # 處理缺失值評分為0視為缺失這里需要根據(jù)業(yè)務(wù)邏輯調(diào)整 # 一種常見方法計算相似度時忽略共同未評分的項目 # 此處為示例使用簡單的余弦相似度 self.user_sim_matrix cosine_similarity(rating_matrix) def fit(self): 訓(xùn)練模型構(gòu)建矩陣并計算相似度 print(開始構(gòu)建評分矩陣...) rating_matrix self._build_rating_matrix() print(開始計算用戶相似度...) self._calculate_similarity(rating_matrix) print(模型訓(xùn)練完成。) # 可以將相似度矩陣緩存起來避免重復(fù)計算 cache.set(user_sim_matrix, self.user_sim_matrix, timeout3600*24) # 緩存24小時 cache.set(user_id_map, self.user_id_map, timeout3600*24) cache.set(movie_id_map, self.movie_id_map, timeout3600*24) def recommend_for_user(self, user_id, top_n10): 為指定用戶生成推薦 # 1. 從緩存加載模型 self.user_sim_matrix cache.get(user_sim_matrix) self.user_id_map cache.get(user_id_map) self.movie_id_map cache.get(movie_id_map) if None in [self.user_sim_matrix, self.user_id_map, self.movie_id_map]: self.fit() # 如果緩存失效重新訓(xùn)練 # 2. 獲取目標(biāo)用戶索引及其評分向量 if user_id not in self.user_id_map: return [] # 新用戶無法推薦可返回?zé)衢T電影 u_idx self.user_id_map[user_id] # 3. 獲取相似用戶 (排除自己) sim_scores list(enumerate(self.user_sim_matrix[u_idx])) sim_scores sorted(sim_scores, keylambda x: x[1], reverseTrue) neighbor_indices [i for i, score in sim_scores[1:self.k1]] # 取前k個跳過自己(索引0) # 4. 預(yù)測評分 (簡化版聚合鄰居的評分) # 這里需要獲取原始評分矩陣為簡化假設(shè)我們能訪問到 # 實際中可能需要將評分矩陣也緩存或從數(shù)據(jù)庫實時查詢鄰居的評分 # ... # 5. 返回推薦電影ID列表 (此處為偽代碼) recommended_movie_ids [...] # 根據(jù)上述預(yù)測邏輯計算得到 return recommended_movie_ids[:top_n]設(shè)計后臺計算任務(wù) 算法計算是CPU密集型任務(wù)不能阻塞Web請求。我們可以使用Django的自定義管理命令通過定時任務(wù)如Linux的cron或Celery定期執(zhí)行。 創(chuàng)建recommender/management/commands/refresh_recommendations.pyfrom django.core.management.base import BaseCommand from recommender.services.cf_recommender import UserCFRecommender class Command(BaseCommand): help Refresh user recommendation data using Collaborative Filtering def handle(self, *args, **options): self.stdout.write(Starting recommendation refresh...) recommender UserCFRecommender(k20) recommender.fit() # 接下來可以為每個用戶計算推薦列表并存入數(shù)據(jù)庫的UserRecommendation表或緩存 self.stdout.write(self.style.SUCCESS(Successfully refreshed recommendations.))然后可以通過python manage.py refresh_recommendations手動運(yùn)行或配置定時任務(wù)。4.3 算法優(yōu)化與冷啟動問題性能優(yōu)化稀疏矩陣存儲用戶-電影評分矩陣非常稀疏一個用戶只看過極少部分電影。使用scipy.sparse中的CSR或CSC格式存儲和計算可以節(jié)省大量內(nèi)存和計算時間。增量更新每次用戶新產(chǎn)生評分后完全重新計算相似度矩陣代價高昂。可以研究增量更新算法只更新受影響的部分用戶相似度。緩存策略如上述代碼所示將相似度矩陣、映射關(guān)系、甚至每個用戶的最終推薦列表進(jìn)行緩存Django Cache, Redis是提升響應(yīng)速度的關(guān)鍵。冷啟動問題這是推薦系統(tǒng)的經(jīng)典難題。對于新用戶無評分歷史或新電影無評分記錄協(xié)同過濾無法工作。常見的解決方案熱門推薦當(dāng)無法進(jìn)行個性化推薦時退回推薦當(dāng)前最熱門的電影根據(jù)評分次數(shù)或平均分。基于內(nèi)容的推薦作為補(bǔ)充。對于新電影可以根據(jù)其類型、導(dǎo)演、演員等元信息推薦與其相似的其他電影。這需要你為電影建立特征向量?;旌贤扑]結(jié)合協(xié)同過濾和基于內(nèi)容的方法根據(jù)數(shù)據(jù)豐富程度動態(tài)調(diào)整權(quán)重。在你的畢設(shè)中實現(xiàn)基礎(chǔ)的UserCF后如果能提及并簡單實現(xiàn)一種冷啟動解決方案如熱門推薦會是論文和答辯中的加分項。5. 前后端分離開發(fā)與API接口設(shè)計5.1 Django REST Framework API開發(fā)我們使用DRF來構(gòu)建清晰、規(guī)范的API。序列化器 (Serializers) 定義數(shù)據(jù)如何序列化輸出為JSON和反序列化從JSON解析為模型實例。# movie/serializers.py from rest_framework import serializers from .models import Movie class MovieSerializer(serializers.ModelSerializer): class Meta: model Movie fields [id, title, genres, release_date, director, plot, poster_url, average_rating, rating_count]視圖集 (ViewSets) 與視圖 (APIViews) DRF的視圖集可以快速實現(xiàn)標(biāo)準(zhǔn)的CRUD操作。# movie/views.py from rest_framework import viewsets, permissions from .models import Movie from .serializers import MovieSerializer class MovieViewSet(viewsets.ModelViewSet): queryset Movie.objects.all().order_by(-rating_count) # 默認(rèn)按熱度排序 serializer_class MovieSerializer permission_classes [permissions.IsAuthenticatedOrReadOnly] # 未登錄可讀登錄可寫對于推薦、評分等自定義邏輯使用APIView更靈活。# recommender/views.py from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from django.core.cache import cache from movie.models import Movie from movie.serializers import MovieSerializer class RecommendationAPIView(APIView): permission_classes [permissions.IsAuthenticated] def get(self, request): user request.user # 嘗試從緩存獲取推薦列表 cache_key fuser_rec_{user.id} recommended_movie_ids cache.get(cache_key) if not recommended_movie_ids: # 緩存未命中調(diào)用算法服務(wù)實時計算或返回空/熱門 from .services.cf_recommender import UserCFRecommender recommender UserCFRecommender() recommended_movie_ids recommender.recommend_for_user(user.id) if recommended_movie_ids: cache.set(cache_key, recommended_movie_ids, timeout3600) # 緩存1小時 if not recommended_movie_ids: # 如果還是沒有推薦返回?zé)衢T電影 movies Movie.objects.order_by(-rating_count)[:20] else: movies Movie.objects.filter(id__inrecommended_movie_ids) serializer MovieSerializer(movies, manyTrue) return Response(serializer.data)路由配置 在urls.py中注冊路由。# backend/urls.py from django.contrib import admin from django.urls import path, include from rest_framework.routers import DefaultRouter from movie.views import MovieViewSet from recommender.views import RecommendationAPIView router DefaultRouter() router.register(rmovies, MovieViewSet) urlpatterns [ path(admin/, admin.site.urls), path(api/, include(router.urls)), path(api/recommend/, RecommendationAPIView.as_view(), namerecommend), path(api-auth/, include(rest_framework.urls)), # DRF登錄API ]5.2 Vue前端項目開發(fā)要點(diǎn)項目結(jié)構(gòu)規(guī)劃src/ ├── api/ # 所有API請求封裝 ├── assets/ # 靜態(tài)資源 ├── components/ # 可復(fù)用組件 (MovieCard, RatingStar, NavBar等) ├── router/ # Vue Router配置 ├── stores/ # Pinia狀態(tài)管理 (管理用戶登錄狀態(tài)、推薦列表等) ├── views/ # 頁面組件 (Home, Login, MovieDetail, Recommendation) └── App.vue狀態(tài)管理 (Pinia) 使用Pinia管理全局狀態(tài)如用戶登錄信息。// stores/user.js import { defineStore } from pinia import { ref } from vue import { login, logout, getProfile } from /api/auth export const useUserStore defineStore(user, () { const user ref(null) const token ref(localStorage.getItem(token) || ) const setUser (userInfo) { user.value userInfo } const setToken (newToken) { token.value newToken localStorage.setItem(token, newToken) } const clearUser () { user.value null token.value localStorage.removeItem(token) } const userLogin async (credentials) { const res await login(credentials) setToken(res.data.token) // 獲取用戶詳情 const profile await getProfile() setUser(profile.data) return profile } return { user, token, setUser, setToken, clearUser, userLogin } })核心頁面實現(xiàn)首頁 (HomeView)展示電影列表可以分“熱門電影”、“最新上映”、“個性化推薦”等標(biāo)簽頁。推薦標(biāo)簽頁下調(diào)用/api/recommend/接口獲取數(shù)據(jù)。電影詳情頁 (MovieDetailView)展示電影詳細(xì)信息并提供一個評分組件。用戶評分后通過API將評分?jǐn)?shù)據(jù)POST到后端。登錄/注冊頁表單提交調(diào)用后端認(rèn)證API成功后更新Pinia狀態(tài)并跳轉(zhuǎn)。API請求封裝 (Axios)// api/request.js import axios from axios import { useUserStore } from /stores/user import router from /router const service axios.create({ baseURL: http://localhost:8000/api, // Django后端地址 timeout: 10000 }) // 請求攔截器添加token service.interceptors.request.use( config { const userStore useUserStore() if (userStore.token) { config.headers.Authorization Bearer ${userStore.token} } return config }, error Promise.reject(error) ) // 響應(yīng)攔截器處理token過期等 service.interceptors.response.use( response response, error { if (error.response?.status 401) { // 清除用戶信息跳轉(zhuǎn)到登錄頁 const userStore useUserStore() userStore.clearUser() router.push(/login) } return Promise.reject(error) } ) export default service6. 系統(tǒng)部署、測試與畢業(yè)論文撰寫要點(diǎn)6.1 本地運(yùn)行與基礎(chǔ)測試啟動后端服務(wù)cd backend python manage.py runserver訪問http://127.0.0.1:8000/admin進(jìn)入后臺管理創(chuàng)建超級用戶導(dǎo)入初始電影數(shù)據(jù)可以從MovieLens數(shù)據(jù)集轉(zhuǎn)換導(dǎo)入。啟動前端服務(wù)cd movie-recommendation-frontend npm run dev訪問http://localhost:5173查看前端頁面。功能測試流程注冊新用戶登錄。瀏覽電影列表對若干電影進(jìn)行評分1-5星。刷新頁面或進(jìn)入“推薦”頁查看系統(tǒng)是否根據(jù)你的評分生成了不同的推薦列表。嘗試另一個用戶登錄評分幾部電影觀察推薦結(jié)果是否個性化。在Django Admin中查看評分記錄是否正確存入。6.2 畢業(yè)論文核心章節(jié)組織建議你的畢業(yè)論文可以圍繞這個項目清晰地展示你的工作第一章 緒論介紹推薦系統(tǒng)的背景、意義以及本項目的目標(biāo)和主要內(nèi)容。第二章 相關(guān)技術(shù)綜述詳細(xì)介紹Python、Django、Vue.js、MySQL以及協(xié)同過濾算法的基本原理和特點(diǎn)。第三章 系統(tǒng)需求分析與設(shè)計分析系統(tǒng)的功能性需求用戶管理、電影瀏覽、評分、推薦和非功能性需求性能、可用性。給出系統(tǒng)總體架構(gòu)圖前后端分離、功能模塊圖、數(shù)據(jù)庫E-R圖。第四章 系統(tǒng)詳細(xì)設(shè)計與實現(xiàn)這是核心章節(jié)。4.1 數(shù)據(jù)庫設(shè)計詳細(xì)說明User、Movie、Rating等表的結(jié)構(gòu)、字段和關(guān)系。4.2 后端設(shè)計與實現(xiàn)分模塊說明Django模型、視圖、API接口的設(shè)計重點(diǎn)闡述協(xié)同過濾算法服務(wù)類的設(shè)計與實現(xiàn)流程附關(guān)鍵代碼片段。4.3 前端設(shè)計與實現(xiàn)說明Vue組件結(jié)構(gòu)、頁面路由、狀態(tài)管理以及如何通過Axios與后端交互。第五章 系統(tǒng)測試與結(jié)果分析展示系統(tǒng)主要界面截圖設(shè)計測試用例如用戶登錄、評分、推薦功能對推薦算法進(jìn)行簡單評估如準(zhǔn)確率、召回率或進(jìn)行A/B測試的模擬描述分析系統(tǒng)性能。第六章 總結(jié)與展望總結(jié)項目完成的工作、遇到的挑戰(zhàn)及解決方案指出系統(tǒng)當(dāng)前不足如冷啟動、算法效率和未來可改進(jìn)的方向。6.3 常見問題與避坑指南跨域問題 (CORS)前端訪問后端API時出現(xiàn)CORS錯誤。確保Django后端正確安裝并配置了django-cors-headers且CORS_ALLOWED_ORIGINS包含了你的前端開發(fā)服務(wù)器地址如http://localhost:5173。靜態(tài)文件問題部署時Django的靜態(tài)文件Admin后臺CSS/JS可能無法加載。開發(fā)時使用python manage.py runserver沒問題但生產(chǎn)環(huán)境需要配置Web服務(wù)器如Nginx來服務(wù)靜態(tài)文件或者使用python manage.py collectstatic命令收集。算法計算慢首次加載推薦或運(yùn)行管理命令時非常慢。原因全量用戶和電影數(shù)據(jù)導(dǎo)致矩陣巨大。解決使用稀疏矩陣對數(shù)據(jù)進(jìn)行采樣例如只選取評分?jǐn)?shù)量大于一定閾值的活躍用戶和熱門電影將計算任務(wù)放入后臺異步執(zhí)行使用Celery并務(wù)必使用緩存。新用戶/新電影無推薦冷啟動解決在推薦API的邏輯中增加判斷。如果算法返回空列表則返回一個備選方案如“近期熱門電影”、“同類高分電影”等。在論文中需要專門討論這個問題。前端路由刷新404使用Vue Router的history模式在非根路徑刷新頁面時可能會得到Django返回的404。這是因為該路徑在后端沒有定義。解決在生產(chǎn)環(huán)境部署時需要配置Nginx或Apache將所有非靜態(tài)文件且非API的請求都重定向到前端入口文件index.html。數(shù)據(jù)庫連接數(shù)過多開發(fā)時沒問題但上線后可能出現(xiàn)。確保在Django設(shè)置中正確配置數(shù)據(jù)庫連接池如使用django-db-connections或者在Web服務(wù)器如Gunicorn層面控制worker數(shù)量。這個電影推薦系統(tǒng)項目從技術(shù)棧的廣度到算法應(yīng)用的深度都足以支撐一份優(yōu)秀的本科畢業(yè)設(shè)計。關(guān)鍵在于你不要只停留在“跑通代碼”而要真正理解每一行代碼背后的設(shè)計意圖每一個技術(shù)選型背后的權(quán)衡。在論文和答辯中清晰地闡述你如何解決上述這些問題會比單純展示一個能用的系統(tǒng)獲得更高的評價。祝你畢設(shè)順利本文還有配套的精品資源點(diǎn)擊獲取