diff --git a/App/migrations/0022_packageupload.py b/App/migrations/0022_packageupload.py new file mode 100644 index 0000000..434affe --- /dev/null +++ b/App/migrations/0022_packageupload.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.9 on 2022-10-13 01:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('App', '0021_alter_videoupload_video_title'), + ] + + operations = [ + migrations.CreateModel( + name='packageUpload', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('username', models.CharField(max_length=100)), + ('package_time', models.DateTimeField(auto_now_add=True)), + ('package_title', models.CharField(max_length=200, unique=True)), + ('package_size', models.IntegerField(default=0)), + ('package_desc', models.TextField(default='')), + ('downloads', models.IntegerField(default=0)), + ], + ), + ] diff --git a/App/migrations/0023_remove_packageupload_package_desc.py b/App/migrations/0023_remove_packageupload_package_desc.py new file mode 100644 index 0000000..b129325 --- /dev/null +++ b/App/migrations/0023_remove_packageupload_package_desc.py @@ -0,0 +1,17 @@ +# Generated by Django 3.2.9 on 2022-10-13 02:13 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('App', '0022_packageupload'), + ] + + operations = [ + migrations.RemoveField( + model_name='packageupload', + name='package_desc', + ), + ] diff --git a/App/models.py b/App/models.py index 101bb5c..a5da29a 100644 --- a/App/models.py +++ b/App/models.py @@ -73,4 +73,14 @@ class videoUpload(models.Model): views = models.IntegerField(default=0) video_image = models.URLField(max_length=10000, default='') def __str__(self): - return self.username \ No newline at end of file + return self.username + +class packageUpload(models.Model): + username = models.CharField(max_length=100) + package_time = models.DateTimeField(auto_now_add=True) + package_title = models.CharField(max_length=200, unique=True) + package_size = models.IntegerField(default=0) + #package_desc = models.TextField(default="") + downloads = models.IntegerField(default=0) + def __str__(self): + return self.username diff --git a/App/urls.py b/App/urls.py index 2154b4d..814e4fd 100644 --- a/App/urls.py +++ b/App/urls.py @@ -21,7 +21,9 @@ urlpatterns = [ path('paperview/', views.paperDetail, name='paperDetail'), path('video/', views.videoView, name='videoView'), path('videolist/', views.videoList, name='videoList'), - #static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + # static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) path('videoView/', views.stream_video, name='stream_video'), path('videoDownload/', views.videoDownload, name='videoDownload'), -] \ No newline at end of file + path('packagelist/', views.packagelist, name='packagelist'), + path('packageDownload/', views.packageDownload, name='packageDownload'), +] diff --git a/App/views.py b/App/views.py index 751909b..e264fe0 100644 --- a/App/views.py +++ b/App/views.py @@ -39,7 +39,16 @@ def login(request): password = form.cleaned_data.get('loginPass') user = authenticate(username=username, password=password) auth.login(request, user) - info = getAddr(request.META['REMOTE_ADDR']) + #info = getAddr(request.META['REMOTE_ADDR']) + info = { + "status": "success", + "query": "none", + "city": "none", + "country": "none", + "regionName": "none", + "lat": "none", + "lon": "none" + } if info['status'] == 'success': Login.objects.create(username=username, client_addr=info['query'], city=info['city'], country=info['country'], region=info['regionName'], latitude=info['lat'], @@ -59,7 +68,9 @@ def userinfo(request): image_data = Upload.objects.filter(username=request.user.username).order_by('-upload_time')[:5] blog_data = paper.objects.filter(username=request.user.username).order_by('-paper_time')[:5] task_data = Task.objects.filter(username=request.user.username).order_by('-task_time')[:5] - return render(request, 'function/user.html', {'name': auth.get_user(request).username, 'login_data': login_data, 'image_data': image_data, 'blog_data': blog_data, 'task_data': task_data, 'regtime': auth.get_user(request).date_joined}) + video_data = videoUpload.objects.filter(username=request.user.username).order_by('-video_time')[:5] + package_data = packageUpload.objects.filter(username=request.user.username).order_by('-package_time')[:5] + return render(request, 'function/user.html', {'name': auth.get_user(request).username, 'login_data': login_data, 'image_data': image_data, 'blog_data': blog_data, 'task_data': task_data, 'video_data': video_data, 'package_data': package_data, 'regtime': auth.get_user(request).date_joined}) def logout(request): @@ -81,13 +92,12 @@ def register(request): email = request.POST.get('email') password = form.cleaned_data.get('password') likes = request.POST.getlist('like') - role = request.POST.get('role') + role = "False" try: User.objects.create_user(username=username, email=email, password=password, first_name=first_name, last_name=last_name, is_staff=role, likes=likes) except Exception as e: return render(request, 'register.html', {'errors': e}) - return redirect(reverse('App:login')) else: return render(request, 'register.html', {'errors': form.errors}) @@ -121,6 +131,9 @@ def dashboard(request, type): elif type == 'video': data = getData(username, t, 'video') table = videoUpload.objects.order_by('-video_time').all()[:100] + elif type == 'package': + data = getData(username, t, 'package') + table = packageUpload.objects.order_by('package_time').all()[:100] else: data = table = "" return render(request, 'nav/dashboard.html', {'data': data, 'table': table, 'type': type}) @@ -172,6 +185,26 @@ def upload(request): Upload.objects.create(username=auth.get_user(request).username, file_name=file.name, file_path=file.name,file_size=file.size, url_path=url_path['url']).save() data = {'success': 1, 'message': "上传成功", 'url': url_path['url']} return JsonResponse(data) + elif ftype == 'package': + file = request.FILES.getlist('file', None) + data = {'status': 'success', 'msg': []} + file_path = os.path.join(settings.MEDIA_ROOT, 'package') + for i in file: + if not os.path.exists(file_path): + os.makedirs(file_path) + file_path = os.path.join(file_path, i.name) + package = packageUpload.objects.filter(username=auth.get_user(request).username,package_title=i.name,package_size=i.size) + if package.exists(): + package.update(username=auth.get_user(request).username) + else: + try: + packageUpload.objects.create(username=auth.get_user(request).username, package_title=i.name, package_size=i.size).save() + with open(file_path, 'wb') as f: + for chunk in i.chunks(): + f.write(chunk) + except Exception as e: + print(e) + return JsonResponse(data) else: file = request.FILES.getlist('file', None) data = {'status': 'success', 'msg': []} @@ -199,10 +232,13 @@ def getData(username, time, type='login'): data.update({str(date): paper.objects.filter(paper_time__startswith=date).count()}) elif type == 'video': data.update({str(date): videoUpload.objects.filter(video_time__startswith=date).count()}) + elif type == 'package': + data.update({str(date): packageUpload.objects.filter(package_time__startswith=date).count()}) + print(data) return data -def getAddr(ip): +def getAddr(ip=None): ip = requests.get('https://httpbin.org/ip').json()['origin'] info = requests.get('http://ip-api.com/json/' + ip + '?lang=zh-CN') info = info.json() @@ -347,5 +383,23 @@ def videoDownload(request, id): response = FileResponse(file) response['Content-Type'] = 'application/octet-stream' response['Content-Disposition'] = 'attachment;filename="{}"'.format(quote(file_name)) - #messages.error(request, '下载成功') return response + +def packagelist(request): + data = packageUpload.objects.all().order_by('package_time') + return render(request, 'nav/packagelist.html', {'data': data}) + +def packageDownload(request, id): + try: + data = packageUpload.objects.filter(id=id) + data.update(downloads=data.get().downloads+1) + file_path = os.path.join(settings.MEDIA_ROOT, 'package', data.get().package_title) + file_name = os.path.basename(file_path) + file = open(file_path, 'rb') + response = FileResponse(file) + response['Content-Type'] = 'application/octet-stream' + response['Content-Disposition'] = 'attachment;filename="{}"'.format(quote(file_name)) + return response + except Exception as e: + print(e) + return HttpResponse('内部错误') \ No newline at end of file diff --git a/static/images/package.jpg b/static/images/package.jpg new file mode 100644 index 0000000..ea579c5 Binary files /dev/null and b/static/images/package.jpg differ diff --git a/static/images/video.jpg b/static/images/video.jpg new file mode 100644 index 0000000..d74e47c Binary files /dev/null and b/static/images/video.jpg differ diff --git a/templates/function/user.html b/templates/function/user.html index f8b0e30..be0489d 100644 --- a/templates/function/user.html +++ b/templates/function/user.html @@ -15,11 +15,19 @@

你好,{{ name }}

本站点功能依旧在开发当中,欢迎你的使用及反馈,以下为你在本站的操作轨迹。

注册时间:{{ regtime }}

+
+

版本更新日志:v1.10.11

+

1、版本修改了登录逻辑,不在记录非公网的登录位置

+

2、优化注册页面

+

3、新增文件上传下载功能

+

4、优化了图片显示方式

+

5、用户界面添加视频及文件归档

+

6、增加仪表盘界面的文件上传数据

-
+
@@ -32,6 +40,26 @@ {% endfor %}
+
+

文件存储

+

显示5次最近文件上传时数据,获取所有数据查看{% url 'App:packagelist' %}

+
    + {% for i in package_data %} +
  • 上传时间:{{ i.package_time }}  下载地址: {{ i.package_title }} +
  • + {% endfor %} +
+
+
+

视频存储

+

显示5次最近视频上传数据,获取所有数据查看{% url 'App:videoList' %}

+
    + {% for i in video_data %} +
  • 上传时间:{{ i.video_time }}  观看地址:{{ i.video_title }} +
  • + {% endfor %} +
+

图床数据

最近5次,获取所有数据查看我的相册

@@ -65,6 +93,7 @@ {% endfor %}
+
{% endblock %} diff --git a/templates/index.html b/templates/index.html index 222d908..02c9a3e 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,9 +7,6 @@ {% endblock %} {% block login %} -{# #}
@@ -119,7 +116,7 @@ -

事件处理

+

任务处理

请在规定时间内完成规定任务,此功能仅支持内部使用,任务下达会在课堂中提醒,任务完成过程中请截图保留。未完成将得到奖励、

点击查看

@@ -135,7 +132,17 @@
+ +

文件上传

+

课程文件上传文件库

+

立即上传

+
+
+

视频上传

diff --git a/templates/nav/dashboard.html b/templates/nav/dashboard.html index c56d9d9..7446909 100644 --- a/templates/nav/dashboard.html +++ b/templates/nav/dashboard.html @@ -36,15 +36,9 @@ - @@ -211,6 +205,37 @@
+ {% elif type == 'package' %} +
+

文件数据

+
+ + +

[仅显示最近100条]

+
+ + + + + + + + + + + + {% for i in table %} + + + + + + + + {% endfor %} + +
上传时间上传用户文件标题文件大小下载量
{{ i.package_time }}{{ i.username }}{{ i.package_title }}{{ i.package_size |filesizeformat }}{{ i.downloads }}
+
{% endif %} diff --git a/templates/nav/upload.html b/templates/nav/upload.html index beaa405..e8cbf4d 100644 --- a/templates/nav/upload.html +++ b/templates/nav/upload.html @@ -34,7 +34,7 @@ theme: 'fas', language: 'zh', uploadUrl: '{% url 'App:upload' %}?type={{ type }}', - allowedFileExtensions: ['jpg', 'png', 'gif','mp4'], + allowedFileExtensions: ['jpg', 'png', 'gif','mp4', 'gz', 'zip', 'exe', 'xz', 'tar'], uploadExtraData: function () { return { 'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val() @@ -62,7 +62,7 @@ $("#test-upload").fileinput({ 'theme': 'fas', 'showPreview': false, - 'allowedFileExtensions': ['jpg', 'png', 'gif','mp4'], + 'allowedFileExtensions': ['jpg', 'png', 'gif','mp4', 'gz', 'zip', 'exe', 'xz', 'tar'], 'elErrorContainer': '#errorBlock' }); diff --git a/templates/register.html b/templates/register.html index b8ddd11..1a01f67 100644 --- a/templates/register.html +++ b/templates/register.html @@ -108,9 +108,8 @@
- @ + placeholder="用于登录" required>
用户名必须填写
@@ -142,22 +141,6 @@ {% endif %}
-

来宾类型

- -
-
- - -
-
- - -
-
- -
-
diff --git a/templates/template.html b/templates/template.html index 02ab44e..f0ca99a 100644 --- a/templates/template.html +++ b/templates/template.html @@ -82,6 +82,10 @@ + + +
@@ -137,6 +141,14 @@ 视频站 +
  • + + + + + 文件库 + +
  • @@ -189,11 +201,14 @@
  • + class="nav-link p-0 text-muted" target="_blank">SQL在线练习 + + class="nav-link p-0 text-muted" target="_blank">API调试工具 + + class="nav-link p-0 text-muted" target="_blank">Linux命令检索 +