diff --git a/CMS_Django_Backend/settings.py b/CMS_Django_Backend/settings.py index a667bc1..ef4ed54 100644 --- a/CMS_Django_Backend/settings.py +++ b/CMS_Django_Backend/settings.py @@ -15,7 +15,6 @@ from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent - # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/ @@ -27,7 +26,6 @@ DEBUG = True ALLOWED_HOSTS = [] - # Application definition INSTALLED_APPS = [ @@ -72,7 +70,6 @@ TEMPLATES = [ WSGI_APPLICATION = 'CMS_Django_Backend.wsgi.application' - # Database # https://docs.djangoproject.com/en/5.1/ref/settings/#databases @@ -83,7 +80,6 @@ DATABASES = { } } - # Password validation # https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators @@ -102,7 +98,6 @@ AUTH_PASSWORD_VALIDATORS = [ }, ] - # Internationalization # https://docs.djangoproject.com/en/5.1/topics/i18n/ @@ -114,7 +109,6 @@ USE_I18N = True USE_TZ = True - # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/5.1/howto/static-files/ @@ -133,4 +127,12 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 如果设置了True,每次用户会话更新时,会话cookie的过期时间都会被更新 -SESSION_SAVE_EVERY_REQUEST = False \ No newline at end of file +SESSION_SAVE_EVERY_REQUEST = False + +import os + +# 配置 MEDIA_ROOT 作为你上传文件在服务器中的基本路径 +MEDIA_ROOT = os.path.join(BASE_DIR, 'upload') # 注意此处不要写成列表或元组的形式 + +# 配置 MEDIA_URL 作为公用 URL,指向上传文件的基本路径 +MEDIA_URL = '/media/' diff --git a/CMS_Django_Backend/urls.py b/CMS_Django_Backend/urls.py index a26249f..6d2af97 100644 --- a/CMS_Django_Backend/urls.py +++ b/CMS_Django_Backend/urls.py @@ -16,6 +16,8 @@ Including another URLconf """ from django.contrib import admin from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static urlpatterns = [ # path('admin/', admin.site.urls), @@ -23,4 +25,4 @@ urlpatterns = [ # path('auth', include('apps.auth.urls')) path('api/', include('apps.api.urls')), path('auth/', include('apps.auth.urls')) -] +] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT) diff --git a/apps/api/migrations/0001_initial.py b/apps/api/migrations/0001_initial.py index d00b4ab..1b662fa 100644 --- a/apps/api/migrations/0001_initial.py +++ b/apps/api/migrations/0001_initial.py @@ -1,28 +1,31 @@ -# Generated by Django 5.1 on 2024-08-17 09:50 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='SysConfig', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, unique=True, verbose_name='id')), - ('name', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='名称')), - ('identity', models.CharField(blank=True, max_length=100, null=True, verbose_name='标识')), - ('param', models.CharField(blank=True, max_length=200, null=True, verbose_name='参数')), - ('desc', models.CharField(max_length=500, verbose_name='描述')), - ('create_by', models.CharField(max_length=50, verbose_name='创建人')), - ('create_time', models.DateTimeField(verbose_name='创建时间')), - ('update_by', models.CharField(max_length=50, verbose_name='更新人')), - ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), - ], - ), - ] +# Generated by Django 5.1 on 2024-08-18 14:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='SysConfig', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, unique=True, verbose_name='id')), + ('name', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='名称')), + ('identity', models.CharField(blank=True, max_length=100, null=True, verbose_name='标识')), + ('param', models.CharField(blank=True, max_length=200, null=True, verbose_name='参数')), + ('desc', models.CharField(max_length=500, verbose_name='描述')), + ('create_by', models.CharField(max_length=50, verbose_name='创建人')), + ('create_time', models.DateTimeField(verbose_name='创建时间')), + ('update_by', models.CharField(max_length=50, verbose_name='更新人')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')), + ], + options={ + 'verbose_name': '系统配置表', + }, + ), + ] diff --git a/apps/api/migrations/0002_alter_sysconfig_options.py b/apps/api/migrations/0002_alter_sysconfig_options.py deleted file mode 100644 index b0c6ed2..0000000 --- a/apps/api/migrations/0002_alter_sysconfig_options.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.1 on 2024-08-17 15:22 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('api', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='sysconfig', - options={'verbose_name': '系统配置表'}, - ), - ] diff --git a/apps/auth/migrations/0001_initial.py b/apps/auth/migrations/0001_initial.py index 1fe0c2e..866e3a1 100644 --- a/apps/auth/migrations/0001_initial.py +++ b/apps/auth/migrations/0001_initial.py @@ -1,30 +1,31 @@ -# Generated by Django 5.1 on 2024-08-17 15:22 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='User', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False, unique=True, verbose_name='id')), - ('username', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='用户名')), - ('pwd', models.CharField(blank=True, max_length=1000, null=True, verbose_name='密码')), - ('email', models.CharField(blank=True, max_length=100, null=True, verbose_name='电子邮件')), - ('phone', models.CharField(max_length=11, verbose_name='手机')), - ('create_time', models.DateTimeField(verbose_name='注册时间')), - ('avatar', models.ImageField(upload_to='', verbose_name='头像')), - ('last_login_time', models.DateTimeField(auto_now=True, verbose_name='最后登录时间')), - ], - options={ - 'verbose_name': '用户表', - }, - ), - ] +# Generated by Django 5.1 on 2024-08-18 14:07 + +import apps.auth.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, unique=True, verbose_name='id')), + ('username', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='用户名')), + ('pwd', models.CharField(blank=True, max_length=1000, null=True, verbose_name='密码')), + ('email', models.EmailField(max_length=100, verbose_name='电子邮件')), + ('phone', models.CharField(blank=True, max_length=11, null=True, verbose_name='手机')), + ('create_time', models.DateTimeField(verbose_name='注册时间')), + ('avatar', models.ImageField(upload_to=apps.auth.models.user_directory_path, verbose_name='头像')), + ('last_login_time', models.DateTimeField(auto_now=True, verbose_name='最后登录时间')), + ], + options={ + 'verbose_name': '用户表', + }, + ), + ] diff --git a/apps/auth/models.py b/apps/auth/models.py index 1a44ed0..baf5f65 100644 --- a/apps/auth/models.py +++ b/apps/auth/models.py @@ -1,4 +1,12 @@ +from django.conf.global_settings import MEDIA_ROOT from django.db import models +import os + + +def user_directory_path(instance, filename): + ext = filename.split('.').pop() + filename = '{0}{1}.{2}'.format(instance.username, instance.phone, ext) + return os.path.join("avatar", filename) # 系统路径分隔符差异,增强代码重用性 # Create your models here. @@ -9,10 +17,10 @@ class User(models.Model): id = models.AutoField(verbose_name="id", primary_key=True, unique=True) username = models.CharField(max_length=50, unique=True, verbose_name="用户名", null=True, blank=True) pwd = models.CharField(max_length=1000, verbose_name="密码", null=True, blank=True) - email = models.CharField(max_length=100, verbose_name="电子邮件") + email = models.EmailField(max_length=100, verbose_name="电子邮件") phone = models.CharField(max_length=11, verbose_name="手机", null=True, blank=True) create_time = models.DateTimeField(verbose_name="注册时间") - avatar = models.ImageField(verbose_name="头像") + avatar = models.ImageField(verbose_name="头像", upload_to=user_directory_path) last_login_time = models.DateTimeField(verbose_name="最后登录时间", auto_now=True) def __str__(self): @@ -20,3 +28,10 @@ class User(models.Model): class Meta: verbose_name = '用户表' + + # 这里定义一个方法,作用是当用户注册时没有上传照片,模板中调用 [ModelName].[ImageFieldName].url 时赋予一个默认路径 + def avatar_url(self): + if self.avatar and hasattr(self.avatar, 'url'): + return self.avatar.url + else: + return '/media/avatar/default.jpg' diff --git a/apps/auth/urls.py b/apps/auth/urls.py index 1851d14..415032d 100644 --- a/apps/auth/urls.py +++ b/apps/auth/urls.py @@ -4,4 +4,5 @@ from apps.auth import views urlpatterns = [ path("gettoken/", views.gettoken, name="getToken"), path("searchuser/", views.search_user, name="searchuser"), + path("adduser/", views.add_user, name="addUser"), ] diff --git a/apps/auth/views.py b/apps/auth/views.py index 56bdf45..46b658c 100644 --- a/apps/auth/views.py +++ b/apps/auth/views.py @@ -1,8 +1,9 @@ -import json +import json, datetime, base64 from django.shortcuts import HttpResponse from django.middleware.csrf import get_token from django.views.decorators.http import require_GET, require_POST from apps.auth import models as auth_models +from django.contrib.auth.hashers import make_password, check_password # Create your views here. @@ -33,12 +34,28 @@ def search_user(request): @require_POST -def adduser(request): +def add_user(request): """ 用户注册 :param request: POST提交注册信息 :return: 注册结果 - - 先查询数据库中用户名username是否存在,如果存在则提示用户更改用户名,若不存在则进行存储 """ + username = request.POST.get("username") + pwd_base64 = base64.b64decode(request.POST.get("pwd")) + pwd = make_password(pwd_base64) + email = request.POST.get("email") + phone = request.POST.get("phone") + create_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + last_login_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + print(username, pwd, email, phone) + avatar = request.FILES.get("avatar") + auth_models.User.objects.create( + username=username, + pwd=pwd, + email=email, + phone=phone, + create_time=create_time, + last_login_time=last_login_time, + avatar=avatar + ) return HttpResponse("添加用户成功") diff --git a/data/db.sqlite3 b/data/db.sqlite3 index c2fb4b7..09789a5 100644 Binary files a/data/db.sqlite3 and b/data/db.sqlite3 differ diff --git a/data/db.sqlite3.sql b/data/db.sqlite3.sql deleted file mode 100644 index e69de29..0000000 diff --git a/upload/avatar/admin15101027760.jpg b/upload/avatar/admin15101027760.jpg new file mode 100644 index 0000000..b67d6c0 Binary files /dev/null and b/upload/avatar/admin15101027760.jpg differ diff --git a/upload/avatar/default.jpg b/upload/avatar/default.jpg new file mode 100644 index 0000000..2f2a3a7 Binary files /dev/null and b/upload/avatar/default.jpg differ