diff --git a/NewMediaMonitoring/settings.py b/NewMediaMonitoring/settings.py index ff79486..3845eeb 100644 --- a/NewMediaMonitoring/settings.py +++ b/NewMediaMonitoring/settings.py @@ -1,4 +1,3 @@ -<<<<<<< HEAD """ Django settings for NewMediaMonitoring project. @@ -162,160 +161,3 @@ try: from .local_settings import * except ImportError as e: pass -======= -""" -Django settings for NewMediaMonitoring project. - -Generated by 'django-admin startproject' using Django 2.1.8. - -For more information on this file, see -https://docs.djangoproject.com/en/2.1/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/2.1/ref/settings/ -""" - -import os - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -import sys - -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'tj5m7-ns_6x_fvn2^q+7+2fopq!#7taqv!9ai(c_45i5!%m=*z' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = ['*'] - -# Application definition - -INSTALLED_APPS = [ - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'django_token', - 'corsheaders', - 'bootstrap3', - 'captcha', - 'dashboard', - 'management', - 'monitor', - 'polls' -] - -MIDDLEWARE = [ - 'django.middleware.security.SecurityMiddleware', - 'django.middleware.locale.LocaleMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'corsheaders.middleware.CorsMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django_token.middleware.TokenMiddleware', -] - -ROOT_URLCONF = 'NewMediaMonitoring.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 = 'NewMediaMonitoring.wsgi.application' - -# Database -# https://docs.djangoproject.com/en/2.1/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': 'newmediaDB1', - 'USER': 'newmedia', - 'PASSWORD': 'newmedia2020!@#', - 'HOST': '210.77.68.250', - 'PORT': '5432', - } -} - -# Password validation -# https://docs.djangoproject.com/en/2.1/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', - }, -] - -AUTHENTICATION_BACKENDS = ( - 'django.contrib.auth.backends.ModelBackend', - 'django_token.backends.TokenBackend' -) - -# Internationalization -# https://docs.djangoproject.com/en/2.1/topics/i18n/ - -LANGUAGE_CODE = 'zh-Hans' - -TIME_ZONE = 'Asia/Shanghai' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = False - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/2.1/howto/static-files/ - -STATIC_URL = '/static/' -STATICFILES_DIRS = [ - os.path.join(BASE_DIR, "static"), -] -STATIC_ROOT = '/var/www/p3/newmediamonitoring/static/' -MEDIA_URL = '/media/' -MEDIA_ROOT = '/var/www/p3/newmediamonitoring/media/' - -"""用户模块扩展部分""" -AUTH_PROFILE_MODULE = 'djangoadmin.myadmin.UserProfile' -"""用户模块扩展完成""" - -CORS_ORIGIN_ALLOW_ALL = True - -CORS_URLS_REGEX = r'^/polls/.*$' - -try: - from .local_settings import * -except ImportError as e: - pass ->>>>>>> de079fade2ba5827d88d778ef9ddc443baa48da8 diff --git a/polls/decorators.py b/polls/decorators.py new file mode 100644 index 0000000..6a6312f --- /dev/null +++ b/polls/decorators.py @@ -0,0 +1,10 @@ +from django.http import HttpResponse + +def polls_login_required(function): + def wrapper(request, *args, **kwargs): + u = request.user + if not request.user.is_authenticated: + return HttpResponse(status=401) + else: + return function(request, *args, **kwargs) + return wrapper \ No newline at end of file diff --git a/polls/routing.py b/polls/routing.py new file mode 100644 index 0000000..ff4898d --- /dev/null +++ b/polls/routing.py @@ -0,0 +1,7 @@ +from django.urls import re_path + +from . import consumers + +websocket_urlpatterns = [ + re_path(r'ws/chat/(?P\w+)/$', consumers.ChatConsumer), +] \ No newline at end of file diff --git a/polls/urls.py b/polls/urls.py index f1cbd39..0c4eb8a 100644 --- a/polls/urls.py +++ b/polls/urls.py @@ -7,4 +7,5 @@ urlpatterns = [ path('status_500', views.status_500, name='status_500'), path('status_401', views.status_401, name='status_401'), path('login', views.polls_login, name='polls_login'), + path('notices/list/', views.notices, name='polls_notices') ] diff --git a/polls/views/__init__.py b/polls/views/__init__.py new file mode 100644 index 0000000..99d7437 --- /dev/null +++ b/polls/views/__init__.py @@ -0,0 +1,2 @@ +from .user import index, status_500, status_401, polls_login, send_code, register_step_one, register_step_two, password_recover_step_one, password_recover_step_two +from .notice import notices diff --git a/polls/views/__pycache__/__init__.cpython-38.pyc b/polls/views/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 0000000..42a748a Binary files /dev/null and b/polls/views/__pycache__/__init__.cpython-38.pyc differ diff --git a/polls/views/__pycache__/notice.cpython-38.pyc b/polls/views/__pycache__/notice.cpython-38.pyc new file mode 100644 index 0000000..a2cbea7 Binary files /dev/null and b/polls/views/__pycache__/notice.cpython-38.pyc differ diff --git a/polls/views/__pycache__/user.cpython-38.pyc b/polls/views/__pycache__/user.cpython-38.pyc new file mode 100644 index 0000000..7e1aa9d Binary files /dev/null and b/polls/views/__pycache__/user.cpython-38.pyc differ diff --git a/polls/views/notice.py b/polls/views/notice.py new file mode 100644 index 0000000..9635844 --- /dev/null +++ b/polls/views/notice.py @@ -0,0 +1,24 @@ +from django.shortcuts import render +from django.http import HttpResponse, JsonResponse +from django.views.decorators.csrf import csrf_exempt +import datetime + +from polls.decorators import polls_login_required +from polls.models import Notice + +@csrf_exempt +@polls_login_required +def notices(request): + if request.method == 'POST': + return HttpResponse(status=405) + id = request.user.id + notices = Notice.objects.filter( + is_read=False)[:10] + results = [] + for o in notices: + result = dict() + result['id'] = o.id + result['content'] = o.title + result['added'] = o.added.strftime("%Y-%m-%d %H:%M:%S") + results.append(result) + return JsonResponse(results, safe=False) diff --git a/polls/views.py b/polls/views/user.py similarity index 87% rename from polls/views.py rename to polls/views/user.py index 50d986e..cc80afb 100644 --- a/polls/views.py +++ b/polls/views/user.py @@ -1,145 +1,163 @@ -from django.shortcuts import render -from django.http import HttpResponse, JsonResponse -from django.contrib.auth import get_user_model, authenticate, login -from django.views.decorators.csrf import csrf_exempt -from django_token.models import Token -import datetime - -from .models import VerifyCode -#这个地方sent_sms_code原先是send_sms_code,报错 -from .utils import generate_code, sent_sms_code - - -def index(request): - username = request.GET.get('username') - password = request.GET.get('password') - print(username, password) - return JsonResponse({'status': 'error', 'message': '用户名或密码错误'}) - - -def status_500(request): - return HttpResponse(status=500) - - -def status_401(request): - return HttpResponse(status=401) - - -@csrf_exempt -def polls_login(request): - if request.method == 'POST': - phone = request.POST.get('phone') - password = request.POST.get('password') - UserModel = get_user_model() - user = UserModel.objects.filter(username=phone).first() - if not user: - return JsonResponse({'status': 'error', 'message': '用户名或密码错误'}) - - u = authenticate(request, username=phone, password=password) - if u is not None: - login(request, u) - token = Token.objects.get_or_create(user=u) - result = dict() - profile = u.userprofile_set.first() - result['phone'] = u.first_name - result['token'] = token - if profile: - result['name'] = profile.name - result['gender'] = profile.sex - result['thumbnail'] = profile.image.path - result['organization'] = profile.organization.name - return JsonResponse({'status': 'success', 'message': result}) - else: - return JsonResponse({'status': 'error', 'message': '用户名或密码错误'}) - else: - return HttpResponse(status=405) - - -@csrf_exempt -def send_code(request): - if request.method == 'GET': - return HttpResponse(status=405) - phone = request.POST.get('phone') - category = request.POST.get('category', 0) - if not phone: - return JsonResponse({'status': 'error', 'message': '手机号不正确'}) - - exist_code = VerifyCode.objects.filter( - phone=phone, category=category).first() - if exist_code and exist_code.in_progress(): - return JsonResponse({'status': 'error', 'message': '验证码使用中'}) - - code = generate_code() - now = datetime.datetime.now() - after_10mins = now + datetime.timedelta(minutes=10) - response = sent_sms_code(phone, code) - result = response.decode('utf8') - if "OK" in result: - VerifyCode.objects.create(code=code, phone=phone, category=category) - return JsonResponse({'status': 'success'}) - return JsonResponse({'status': 'error', 'message': '验证码发送失败'}) - - -@csrf_exempt -def register_step_one(request): - if request.method == 'GET': - return HttpResponse(status=405) - phone = request.POST.get('phone') - code = request.POST.get('code') - - UserModel = get_user_model() - is_exists = UserModel.objects.filter(username=phone).exists() - if is_exists: - return JsonResponse({'status': 'error', 'message': '该手机号已经使用'}) - - verify_code = VerifyCode.objects.filter( - phone=phone, code=code, category=0).first() - if verify_code and verify_code.in_progress(): - return JsonResponse({'status': 'success', 'message': {phone: phone}}) - else: - return JsonResponse({'status': 'error', 'message': '验证码超时,请重发'}) - - -@csrf_exempt -def register_step_two(request): - if request.method == 'GET': - return HttpResponse(status=405) - phone = request.POST.get('phone') - name = request.POST.get('name') - gender = request.POST.get('gender') - password = request.POST.get('password') - organization = request.POST.get('organization') - UserModel = get_user_model() - UserModel.objects.create_user(username=phone, password=password) - return JsonResponse({'status': 'success', 'message': '注册成功'}) - - -@csrf_exempt -def password_recover_step_one(request): - if request.method == 'GET': - return HttpResponse(status=405) - phone = request.POST.get('phone') - code = request.POST.get('code') - verify_code = VerifyCode.objects.filter( - phone=phone, code=code, category=1).first() - if verify_code and verify_code.in_progress(): - return JsonResponse({'status': 'success', 'message': {phone: phone}}) - else: - return JsonResponse({'status': 'error', 'message': '验证码超时,请重发'}) - - -@csrf_exempt -def password_recover_step_two(request): - if request.method == 'GET': - return HttpResponse(status=405) - phone = request.POST.get('phone') - password = request.POST.get('password') - password_confirm = request.POST.get('password_confirm') - if password != password_confirm: - return JsonResponse({'status': 'error', 'message': '两次密码输入不一致'}) - UserModel = get_user_model() - user = UserModel.objects.filter(username=phone).first() - if not user: - return JsonResponse({'status': 'error', 'message': '用户名不存在'}) - user.set_password(password) - return JsonResponse({'status': 'success', 'message': {phone: phone}}) +from django.shortcuts import render +from django.http import HttpResponse, JsonResponse +from django.contrib.auth import get_user_model, authenticate, login +from django.views.decorators.csrf import csrf_exempt +from django_token.models import Token +import datetime + +from polls.models import VerifyCode +from polls.utils import generate_code, sent_sms_code + + +def index(request): + username = request.GET.get('username') + password = request.GET.get('password') + print(username, password) + return JsonResponse({'status': 'error', 'message': '用户名或密码错误'}) + + +def status_500(request): + return HttpResponse(status=500) + + +def status_401(request): + return HttpResponse(status=401) + + +@csrf_exempt +def polls_login(request): + if request.method == 'POST': + phone = request.POST.get('phone') + password = request.POST.get('password') + UserModel = get_user_model() + user = UserModel.objects.filter(username=phone).first() + if not user: + return JsonResponse({'status': 'error', 'message': '用户名或密码错误'}) + + u = authenticate(request, username=phone, password=password) + if u is not None: + login(request, u) + token = Token.objects.get_or_create(user=u) + result = dict() + profile = u.userprofile_set.first() + result['phone'] = u.first_name + result['token'] = token + if profile: + result['name'] = profile.name + result['gender'] = profile.sex + result['thumbnail'] = profile.image.path + result['organization'] = profile.organization.name + return JsonResponse({'status': 'success', 'message': result}) + else: + return JsonResponse({'status': 'error', 'message': '用户名或密码错误'}) + else: + return HttpResponse(status=405) + + +@csrf_exempt +def send_code(request): + if request.method == 'GET': + return HttpResponse(status=405) + phone = request.POST.get('phone') + category = request.POST.get('category', 0) + if not phone: + return JsonResponse({'status': 'error', 'message': '手机号不正确'}) + + exist_code = VerifyCode.objects.filter( + phone=phone, category=category).first() + if exist_code and exist_code.in_progress(): + return JsonResponse({'status': 'error', 'message': '验证码使用中'}) + + code = generate_code() + now = datetime.datetime.now() + after_10mins = now + datetime.timedelta(minutes=10) + response = sent_sms_code(phone, code) + result = response.decode('utf8') + if "OK" in result: + VerifyCode.objects.create(code=code, phone=phone, category=category) + return JsonResponse({'status': 'success'}) + return JsonResponse({'status': 'error', 'message': '验证码发送失败'}) + + +@csrf_exempt +def register_step_one(request): + if request.method == 'GET': + return HttpResponse(status=405) + phone = request.POST.get('phone') + code = request.POST.get('code') + + UserModel = get_user_model() + is_exists = UserModel.objects.filter(username=phone).exists() + if is_exists: + return JsonResponse({'status': 'error', 'message': '该手机号已经使用'}) + + verify_code = VerifyCode.objects.filter( + phone=phone, code=code, category=0).first() + if verify_code and verify_code.in_progress(): + return JsonResponse({'status': 'success', 'message': {phone: phone}}) + else: + return JsonResponse({'status': 'error', 'message': '验证码超时,请重发'}) + + +@csrf_exempt +def register_step_two(request): + if request.method == 'GET': + return HttpResponse(status=405) + phone = request.POST.get('phone') + name = request.POST.get('name') + gender = request.POST.get('gender') + password = request.POST.get('password') + organization = request.POST.get('organization') + UserModel = get_user_model() + UserModel.objects.create_user(username=phone, password=password) + return JsonResponse({'status': 'success', 'message': '注册成功'}) + + +@csrf_exempt +def password_recover_step_one(request): + if request.method == 'GET': + return HttpResponse(status=405) + phone = request.POST.get('phone') + code = request.POST.get('code') + verify_code = VerifyCode.objects.filter( + phone=phone, code=code, category=1).first() + if verify_code and verify_code.in_progress(): + return JsonResponse({'status': 'success', 'message': {phone: phone}}) + else: + return JsonResponse({'status': 'error', 'message': '验证码超时,请重发'}) + + +@csrf_exempt +def password_recover_step_two(request): + if request.method == 'GET': + return HttpResponse(status=405) + phone = request.POST.get('phone') + password = request.POST.get('password') + password_confirm = request.POST.get('password_confirm') + if password != password_confirm: + return JsonResponse({'status': 'error', 'message': '两次密码输入不一致'}) + UserModel = get_user_model() + user = UserModel.objects.filter(username=phone).first() + if not user: + return JsonResponse({'status': 'error', 'message': '用户名不存在'}) + user.set_password(password) + return JsonResponse({'status': 'success', 'message': {phone: phone}}) + +@csrf_exempt +def office(request): + if request.method == 'POST': + return HttpResponse(status=405) + + top = request.GET.get('top', '10') + offices = Notice.objects.filter(deleted=False).order_by('-view_count')[:int(top)] + results = [] + for o in offices: + result = dict() + result['id'] = o.id + result['title'] = o.title + current_thumbnail = o.current_thumbnail() + if current_thumbnail: + result['icon'] = o.current_thumbnail().thumbnail.url + result['view_count'] = o.view_count + results.append(result) + return JsonResponse(results, safe=False)