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='最热电影'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+