From 6b72d8738467c60f018e242057337f6cdb5c4948 Mon Sep 17 00:00:00 2001 From: wzy <1458201660@qq.com> Date: Mon, 27 May 2024 11:37:12 +0800 Subject: [PATCH] commit0527 --- djangoProject2/.idea/.gitignore | 8 + djangoProject2/.idea/djangoProject2.iml | 25 ++++ .../inspectionProfiles/profiles_settings.xml | 6 + djangoProject2/.idea/misc.xml | 7 + djangoProject2/.idea/modules.xml | 8 + .../Movie recommendation system/__init__.py | 3 + .../Movie recommendation system/settings.py | 121 +++++++++++++++ .../Movie recommendation system/urls.py | 11 ++ .../Movie recommendation system/views.py | 8 + .../Movie recommendation system/wsgi.py | 6 + djangoProject2/manage.py | 20 +++ djangoProject2/movie/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 167 bytes .../movie/__pycache__/models.cpython-312.pyc | Bin 0 -> 7237 bytes djangoProject2/movie/admin.py | 83 +++++++++++ djangoProject2/movie/apps.py | 7 + djangoProject2/movie/context processors.py | 12 ++ djangoProject2/movie/forms.py | 96 ++++++++++++ djangoProject2/movie/models.py | 141 ++++++++++++++++++ 19 files changed, 562 insertions(+) create mode 100644 djangoProject2/.idea/.gitignore create mode 100644 djangoProject2/.idea/djangoProject2.iml create mode 100644 djangoProject2/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 djangoProject2/.idea/misc.xml create mode 100644 djangoProject2/.idea/modules.xml create mode 100644 djangoProject2/Movie recommendation system/__init__.py create mode 100644 djangoProject2/Movie recommendation system/settings.py create mode 100644 djangoProject2/Movie recommendation system/urls.py create mode 100644 djangoProject2/Movie recommendation system/views.py create mode 100644 djangoProject2/Movie recommendation system/wsgi.py create mode 100644 djangoProject2/manage.py create mode 100644 djangoProject2/movie/__init__.py create mode 100644 djangoProject2/movie/__pycache__/__init__.cpython-312.pyc create mode 100644 djangoProject2/movie/__pycache__/models.cpython-312.pyc create mode 100644 djangoProject2/movie/admin.py create mode 100644 djangoProject2/movie/apps.py create mode 100644 djangoProject2/movie/context processors.py create mode 100644 djangoProject2/movie/forms.py create mode 100644 djangoProject2/movie/models.py diff --git a/djangoProject2/.idea/.gitignore b/djangoProject2/.idea/.gitignore new file mode 100644 index 00000000..35410cac --- /dev/null +++ b/djangoProject2/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/djangoProject2/.idea/djangoProject2.iml b/djangoProject2/.idea/djangoProject2.iml new file mode 100644 index 00000000..52110e94 --- /dev/null +++ b/djangoProject2/.idea/djangoProject2.iml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/djangoProject2/.idea/inspectionProfiles/profiles_settings.xml b/djangoProject2/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/djangoProject2/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/djangoProject2/.idea/misc.xml b/djangoProject2/.idea/misc.xml new file mode 100644 index 00000000..ef8935ed --- /dev/null +++ b/djangoProject2/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/djangoProject2/.idea/modules.xml b/djangoProject2/.idea/modules.xml new file mode 100644 index 00000000..cb71eb50 --- /dev/null +++ b/djangoProject2/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/djangoProject2/Movie recommendation system/__init__.py b/djangoProject2/Movie recommendation system/__init__.py new file mode 100644 index 00000000..aa60bed8 --- /dev/null +++ b/djangoProject2/Movie recommendation system/__init__.py @@ -0,0 +1,3 @@ +import pymysql + +pymysql.install_as_MySQLdb() \ No newline at end of file diff --git a/djangoProject2/Movie recommendation system/settings.py b/djangoProject2/Movie recommendation system/settings.py new file mode 100644 index 00000000..04049287 --- /dev/null +++ b/djangoProject2/Movie recommendation system/settings.py @@ -0,0 +1,121 @@ +""" +Django settings for djangoProject2 project. + +Generated by 'django-admin startproject' using Django 5.0.6. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.0/ref/settings/ +""" +import os + +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +SECRET_KEY = 'django-insecure-p&$li#_laqa0p0il+ibs8cxcitn6d8s$iv8p05_7g=l)+1tp&s' + + +DEBUG = True + +ALLOWED_HOSTS = [] + + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'movie' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'djangoProject2.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR,'templates')], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + '' + ], + }, + }, +] + +WSGI_APPLICATION = 'djangoProject2.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/5.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'db_movie_recommend', + 'USER': 'root', + 'PASSWORD': '123456', + 'HOST': 'localhost', + 'PORT': '3306', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/5.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.0/howto/static-files/ + +STATIC_URL = 'static/' + +STATICFILES_DIRS=[ + os.path.join(BASE_DIR,'static'), +] + + diff --git a/djangoProject2/Movie recommendation system/urls.py b/djangoProject2/Movie recommendation system/urls.py new file mode 100644 index 00000000..4ea51103 --- /dev/null +++ b/djangoProject2/Movie recommendation system/urls.py @@ -0,0 +1,11 @@ +from django.contrib import admin +from django.urls import path,include + +from.views import index,star + + +urlpatterns = [ + path('admin/', admin.site.urls), + path('',index), + path('movie/',include('movie.urls')), +] diff --git a/djangoProject2/Movie recommendation system/views.py b/djangoProject2/Movie recommendation system/views.py new file mode 100644 index 00000000..88fb8298 --- /dev/null +++ b/djangoProject2/Movie recommendation system/views.py @@ -0,0 +1,8 @@ +from django.shortcuts import render + + +def index(request): + return render(request,'index.html') + +def star(request): + return render(request,'movie/star.html') diff --git a/djangoProject2/Movie recommendation system/wsgi.py b/djangoProject2/Movie recommendation system/wsgi.py new file mode 100644 index 00000000..9cf72e9d --- /dev/null +++ b/djangoProject2/Movie recommendation system/wsgi.py @@ -0,0 +1,6 @@ +import os +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Movie recommendation system.settings') + +application = get_wsgi_application() diff --git a/djangoProject2/manage.py b/djangoProject2/manage.py new file mode 100644 index 00000000..1db567e5 --- /dev/null +++ b/djangoProject2/manage.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject2.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "项目未安装 Django 库,请安装 Django 库。" + ) from exc + execute_from_command_line(sys.argv) + +if __name__ == '__main__': + main() diff --git a/djangoProject2/movie/__init__.py b/djangoProject2/movie/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/djangoProject2/movie/__pycache__/__init__.cpython-312.pyc b/djangoProject2/movie/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f5091663b84fe198bbcfa87fd7bc562223469d5 GIT binary patch literal 167 zcmX@j%ge<81iv->(m?cM5P=Rpvj9b=GgLBYGWxA#C}INgK7-VJbp{g7RxzQ)sYS&x z&-=QcEnM`xbxuq`WpYMhQEos{epYI7NpVa{R$^XyK9p+|lbc_bnHm!xpP83g5+AQu iQ2C3)CO1E&G$+-rh!toeBM=vZ7$2D#85xV1fh+)BkSw?W literal 0 HcmV?d00001 diff --git a/djangoProject2/movie/__pycache__/models.cpython-312.pyc b/djangoProject2/movie/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1cca1d9c4eb97559f721f0cd1c7d3fa850104199 GIT binary patch literal 7237 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 Y0=z?Ysm{o@pXbKR7tD7Vs8Xf)FFC*X=Kufz literal 0 HcmV?d00001 diff --git a/djangoProject2/movie/admin.py b/djangoProject2/movie/admin.py new file mode 100644 index 00000000..7ccc7647 --- /dev/null +++ b/djangoProject2/movie/admin.py @@ -0,0 +1,83 @@ +from django.contrib import admin +from movie.model import User,Genre,Movie_hot,Movie_rating,Movie_similarity + + +admin.site.site_title="电影推荐系统后台管理系统" +admin.site.site_header="电影推荐系统——后台管理系统" +admin.site.index_title="电影推荐系统" + + +@admin.register(User) +class UserAdmin(admin.ModelAdmin): + list_display=['id','name','password','email'] + search_fields=['name','email'] + list_per_page=12 + ordering=['id'] + + +@admin.register(Genre) +class GenreAdmin(admin.ModelAdmin): + list_display=['id','name'] + search_fields=['name'] + list_per_page=12 + ordering=['id'] + +@admin.register(Movie) +class MovieAdmin(admin.ModelAdmin): + list_display=['id','name','imdb_id','time','release_time','intro','director','writers','actor'] + search_fields=['name','intro','writers','actor'] + list_per_page=6 + ordering=['id'] + +@admin.register(Movie_hot) +class Movie_hotAdmin(admin.ModelAdmin): + list_display=['id','movie','rating_number'] + search_fields=['movie'] + list_per_page=6 + ordering=['-rating_number'] + + +@admin.register(Movie_rating) +class Movie_ratingAdmin(admin.ModelAdmin): + list_display=['id','user','movie','score','comment'] + search_fields=['user','movie'] + list_per_page=6 + ordering=['-score'] + + +@admin.register(Movie_similarity) +class Movie_similarityAdmin(admin.ModelAdmin): + list_display=['id','movie_source','movie_target','similarity'] + search_fields=['movie_source','movie_source'] + list_per_page=6 + ordering=['-similarity'] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/djangoProject2/movie/apps.py b/djangoProject2/movie/apps.py new file mode 100644 index 00000000..2ed287c0 --- /dev/null +++ b/djangoProject2/movie/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + + + +class MovieConfig(AppConfig): + name = 'movie' + verbose_name='电影推荐系统' \ No newline at end of file diff --git a/djangoProject2/movie/context processors.py b/djangoProject2/movie/context processors.py new file mode 100644 index 00000000..b2a396b8 --- /dev/null +++ b/djangoProject2/movie/context processors.py @@ -0,0 +1,12 @@ +from.models import User + +def movie_user(request): + user_id=request.session.get('user_id') + context={} + if user_id: + try: + user=User.objects.get(pk=user_id) + context['movie_user']=user + except: + pass + return context diff --git a/djangoProject2/movie/forms.py b/djangoProject2/movie/forms.py new file mode 100644 index 00000000..6d6686aa --- /dev/null +++ b/djangoProject2/movie/forms.py @@ -0,0 +1,96 @@ +from django import forms + +from movie.models import User,Movie_rating + +class RegisterForm(forms.ModelForm): + password_repeat=forms.CharField(max_length=256) + + def get_erros(self): + erros=self.erros.get_json_data() + erros_lst=[] + for messages in erros.values(): + for messages_dict in messages: + for key,message in message_dict.items(): + if key=='messasge': + erros_lst.apppend(message) + return erros_lst + + + def clean(self): + cleaned_data=super(RegisterForm,self).clean() + pwd=cleaned_data.get('password') + password_repeat=cleaned_data.get('password_repeat') + if pwd!=password_repeat: + raise forms.ValidationError(message='两次密码输入不一致!') + return cleaned_data + + + class Meta: + model=User + fields=['name','password','email'] + +class LoginForm(forms.modelForm): + name=forms.CharField(max_length=128) + remember=forms.IntegerField(required=False) + + class Mate: + model=User + fields=['password'] + + def get_error(self): + errors=self.errors.get_json_data() + errors_lst=[] + for messages in errors.values(): + for message_dict in messsages: + for key.message in message_dict.items(): + if key=='messasge': + errors_lst.append(message) + return errors_lst + +class CommentForm(forms.ModelForm): + def clean(self) + cleaned_data=super(CommentForm,self).clean() + score=cleaned_data.get('score') + if score<0 or score>5: + raise forms.ValidationError(message='评分不能为空!') + else: + return cleaned_data + + class Meta: + model=Movie_rating + fields=['score','comment'] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/djangoProject2/movie/models.py b/djangoProject2/movie/models.py new file mode 100644 index 00000000..5f8ea41f --- /dev/null +++ b/djangoProject2/movie/models.py @@ -0,0 +1,141 @@ +from django.db import models +from django.db.models import Avg + + +class Genre(models.Model): + name = models.CharField(max_length=100,verbose_name="类型") + + class Meta: + db_table='Genre' + verbose_name='电影类型' + verbose_name_plural='电影类型' + + def __str__(self): + return self.name + + +class Movie(models.Model): + name=models.CharField(max_length=256,verbose_name="电影名") + imdb_id=models.integerField(verbose_name="imdb_id") + time=models.CharField(max_length=256,blank=True,verbose_name="时长") + genre=models.ManyToManyField(Genre,verbose_name="类型") + release_time=models.CharField(max_length=256,blank=True,verbose_name="发行时间") + intro=models.TextField(blank=True,verbose_name="简介") + director=models.CharField(max_length=256,blank=True,verbose_name="导演") + actor=models.CharField(max_length=256,blank=True,verbose_name="演员") + writers=models.CharField(max_length=256,blank=True,verbose_name="编剧") + movie_similarity=models.ManyToManyField('self',through="Movie_similarity",symmetrical=False,verbose_name="相似电影") + + + class Meta: + db_table='Movie' + verbose_name='电影信息' + verbose_name_plural='电影信息' + + def __str__(self): + return f"" + + + def get_score(self): + result_dct=self.movie_rating_set.aaggregate(Avg('score')) + try: + result=round(result_dct['score__avg'],1) + except TypeError: + return 0 + else: + return result + + def get_user_score(self,user): + return self.movie_rating_set.filter(user=user).values('score') + + def get_score_int_range(self): + return range(int(self.get_score())) + + def get_genre(self): + genre_dct=self.genre.all().values('name') + genre_lst=[] + for dct in genre_dct.values(): + genre_lst.append(dct['name']) + return genre_lst + + + def get_similarity(self,k=5): + similarity_movies=self.movie_similarity.all()[:k] + return similarity_movies + +class Movie_similarity(models.Model): + movie_source=models.ForeignKey(Movie,related_name='movie_source',on_delete=models.CASCADE) + movie_target=models.ForeignKey(Movie,related_name='movie_target',on_delete=models.CASCADE) + similarity=models.FloatField(verbose_name="相似度") + + class Meta: + verbose_name='电影相似度' + verbose_name_plural='电影相似度' + + +class User(models.Model): + name=models.CharField(max_length=128,unique=True,verbose_name="用户名") + password=models.CharField(max_length=256,verbose_name="密码") + email=models.EmailField(unique=True,verbose_name="邮箱") + rating_movies=models.ManyToManyField(Movie,through="Movie_rating") + + + + def __str__(self): + return self.name + + class Meta: + db_table='Usser' + verbose_name='用户信息' + verbose_name_plural='用户信息' + +class Movie_rating(models.Model): + user=models.ForeignKey(Usser,on_delete=models.CASCADE,unique=False,verbose_name="用户") + movie=models.ForeignKey(Movie,on_delete=models.CASCADE,unique=False,verbose_name="电影") + score=models.FloatField(verbose_name="评分") + comment=models.TextField(blank=True,verbose_name="评论") + + class Meta: + db_table='Movie_rating' + verbose_name='电影评分信息' + verbose_name_plural='电影评分信息' + +class Movie_hot(model.Model): + movie=models.ForeignKey(Movie,on_delete=models.CASCADE,verbose_name="电影名") + rating_number=models.IntegereField(verbose_name="评分人数") + + + class Meta: + db_table='Movie_hot' + verbose_name='最热电影' + verbose_name_plural='最热电影' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +