diff --git a/campics_/content/__init__.py b/campics_/content/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c45523b2f83d4ee6d8742e97d5c9f9775f01cae0 100644 --- a/campics_/content/__init__.py +++ b/campics_/content/__init__.py @@ -0,0 +1,2 @@ +import pymysql +pymysql.install_as_MySQLdb() \ No newline at end of file diff --git a/campics_/content/migrations/0001_initial.py b/campics_/content/migrations/0001_initial.py index 08d487e36131203616dc0e08ad10c3bb47d40c0a..01670539a9870a65c5de3b9d957fcfc6d85ba27e 100644 --- a/campics_/content/migrations/0001_initial.py +++ b/campics_/content/migrations/0001_initial.py @@ -1,58 +1,90 @@ -# Generated by Django 4.0.4 on 2022-05-31 14:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Feed', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content', models.TextField()), - ('image', models.TextField()), - ('profile_image', models.TextField()), - ('email', models.EmailField(blank=True, max_length=100, null=True, verbose_name='email')), - ('user_id', models.CharField(blank=True, max_length=30, null=True)), - ('like_count', models.IntegerField()), - ('views', models.IntegerField()), - ('type', models.BooleanField(default=False)), - ('univ', models.CharField(max_length=30)), - ], - ), - migrations.CreateModel( - name='FeedLike', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('feed_id', models.IntegerField()), - ('email', models.CharField(blank=True, max_length=30, null=True)), - ('is_like', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='FeedView', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('email', models.EmailField(max_length=100, verbose_name='email')), - ('feed_id', models.IntegerField()), - ], - ), - migrations.AddIndex( - model_name='feedview', - index=models.Index(fields=['email'], name='content_fee_email_a02fc8_idx'), - ), - migrations.AddIndex( - model_name='feedlike', - index=models.Index(fields=['feed_id'], name='content_fee_feed_id_1c82cf_idx'), - ), - migrations.AddIndex( - model_name='feedlike', - index=models.Index(fields=['email'], name='content_fee_email_3901d6_idx'), - ), - ] +# Generated by Django 4.0.4 on 2022-06-05 09:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Bookmark', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('email', models.EmailField(max_length=100, verbose_name='email')), + ('feed_id', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='Feed', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('content', models.TextField()), + ('image', models.TextField()), + ('profile_image', models.TextField()), + ('email', models.EmailField(blank=True, max_length=100, null=True, verbose_name='email')), + ('user_id', models.CharField(blank=True, max_length=30, null=True)), + ('like_count', models.IntegerField(default=0)), + ('view_count', models.IntegerField(default=0)), + ('type', models.BooleanField(default=False)), + ('univ', models.CharField(max_length=15)), + ], + ), + migrations.CreateModel( + name='FeedLike', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('feed_id', models.IntegerField()), + ('email', models.CharField(blank=True, max_length=30, null=True)), + ('is_like', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='FeedView', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('feed_id', models.IntegerField()), + ('email', models.CharField(blank=True, max_length=30, null=True)), + ('is_view', models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name='Reply', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('feed_id', models.IntegerField()), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('user_id', models.CharField(blank=True, max_length=30, null=True)), + ('content', models.TextField()), + ('email', models.EmailField(blank=True, max_length=100, null=True, verbose_name='email')), + ], + ), + migrations.AddIndex( + model_name='reply', + index=models.Index(fields=['feed_id'], name='content_rep_feed_id_49ae3d_idx'), + ), + migrations.AddIndex( + model_name='feedview', + index=models.Index(fields=['feed_id'], name='content_fee_feed_id_0b2735_idx'), + ), + migrations.AddIndex( + model_name='feedview', + index=models.Index(fields=['email'], name='content_fee_email_a02fc8_idx'), + ), + migrations.AddIndex( + model_name='feedlike', + index=models.Index(fields=['feed_id'], name='content_fee_feed_id_1c82cf_idx'), + ), + migrations.AddIndex( + model_name='feedlike', + index=models.Index(fields=['email'], name='content_fee_email_3901d6_idx'), + ), + migrations.AddIndex( + model_name='bookmark', + index=models.Index(fields=['email'], name='content_boo_email_03c3c8_idx'), + ), + ] diff --git a/campics_/content/migrations/0009_feed_created_at.py b/campics_/content/migrations/0009_feed_created_at.py deleted file mode 100644 index 9bfd650ae4f2eb9c57618285bbb5837e889d2474..0000000000000000000000000000000000000000 --- a/campics_/content/migrations/0009_feed_created_at.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.0.4 on 2022-06-01 06:23 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('content', '0008_auto_20211014_1246'), - ] - - operations = [ - migrations.AddField( - model_name='feed', - name='created_at', - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now), - preserve_default=False, - ), - ] diff --git a/campics_/content/migrations/0010_feed_univ.py b/campics_/content/migrations/0010_feed_univ.py deleted file mode 100644 index fb3e1b8b73ca771fcdca26443806ac5386c2512d..0000000000000000000000000000000000000000 --- a/campics_/content/migrations/0010_feed_univ.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.0.4 on 2022-06-01 07:43 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('content', '0009_feed_created_at'), - ] - - operations = [ - migrations.AddField( - model_name='feed', - name='univ', - field=models.CharField(default=django.utils.timezone.now, max_length=15), - preserve_default=False, - ), - ] diff --git a/campics_/content/migrations/0011_remove_feed_created_at.py b/campics_/content/migrations/0011_remove_feed_created_at.py deleted file mode 100644 index 17f8b920d16d78c2d223c6b19e99253a8da721bf..0000000000000000000000000000000000000000 --- a/campics_/content/migrations/0011_remove_feed_created_at.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.0.4 on 2022-06-01 08:39 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('content', '0010_feed_univ'), - ] - - operations = [ - migrations.RemoveField( - model_name='feed', - name='created_at', - ), - ] diff --git a/campics_/content/migrations/0012_feedview_feed_type_feed_views_and_more.py b/campics_/content/migrations/0012_feedview_feed_type_feed_views_and_more.py deleted file mode 100644 index a1c273128c10f4faea0d391258365088b8c3ab9d..0000000000000000000000000000000000000000 --- a/campics_/content/migrations/0012_feedview_feed_type_feed_views_and_more.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 4.0.4 on 2022-06-04 03:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('content', '0011_remove_feed_created_at'), - ] - - operations = [ - migrations.CreateModel( - name='FeedView', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('email', models.EmailField(max_length=100, verbose_name='email')), - ('feed_id', models.IntegerField()), - ], - ), - migrations.AddField( - model_name='feed', - name='type', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='feed', - name='views', - field=models.IntegerField(default=0), - ), - migrations.AddIndex( - model_name='feedview', - index=models.Index(fields=['email'], name='content_fee_email_a02fc8_idx'), - ), - ] diff --git a/campics_/content/urls.py b/campics_/content/urls.py index 05f812bd6a96f33a4585b02d129f9f2b3c2b9007..d7466becc6abd3bd672370e02d4f10b92dc964ae 100644 --- a/campics_/content/urls.py +++ b/campics_/content/urls.py @@ -1,5 +1,5 @@ from django.urls import path -from .views import UploadFeed, CreateReply, LikeFeed, ViewFeed, BookmarkFeed, DeleteFeed, searchUniv, searchUser +from .views import UploadFeed, LikeFeed, ViewFeed, DeleteFeed, searchUniv, searchUser urlpatterns = [ @@ -7,11 +7,8 @@ urlpatterns = [ path('like', LikeFeed.as_view(), name='like'), path('view', ViewFeed.as_view(), name='view'), - path('bookmark', BookmarkFeed.as_view(), name='bookmark'), - ## 시환님꺼 path('delete', DeleteFeed.as_view(), name='delete_feed'), path('searchUniv', searchUniv.as_view(), name='seacrh_univ'), path('searchUser', searchUser.as_view(), name='search_user'), -] - +] \ No newline at end of file diff --git a/campics_/content/views.py b/campics_/content/views.py index 39e1d4c33984bc318856fcf2c35fe8fe94fb2378..953b6a2fe5a3871e210b1414384c146e868b2c85 100644 --- a/campics_/content/views.py +++ b/campics_/content/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render from rest_framework.views import APIView -from content.models import Feed, Reply, FeedLike, FeedView, Bookmark +from content.models import Feed, FeedLike, FeedView from rest_framework.response import Response from user.models import User, Univ from rest_framework.response import Response @@ -30,7 +30,6 @@ class UploadFeed(APIView): Feed.objects.create(content=content, image=image, profile_image=profile_image, user_id=user_id, email=email, like_count=0, univ=univ) return Response(status=200) - class LikeFeed(APIView): def post(self, request): feed_id = request.data.get('feed_id') @@ -119,14 +118,14 @@ class DeleteFeed(APIView): class searchUniv(APIView): def get(self, request): # search_word = request.data.get('univ') - search_word = '대학' - - univ_list = Univ.objects.filter(univ__contains=search_word).values('univ') - - if univ_list.count() == 0: - return Response(status=404, data=dict(message='대학이 없습니다.')) - else: - return Response(status=200, data=dict(univ=univ_list)) + # search_word = '대학' + # univ_list = Univ.objects.filter(univ__contains=search_word).values('univ') + + # if univ_list.count() == 0: + # return Response(status=404, data=dict(message='대학이 없습니다.')) + # else: + # return Response(status=200, data=dict(univ=univ_list)) + return render(request, "jinstagram/search_result.html") class searchUser(APIView): def get(self, request): diff --git a/campics_/jinstagram/settings.py b/campics_/jinstagram/settings.py index 0c5813da4e8222533f76e30593e2804229123bc4..a6044901cb23b16ddd5c1fce7cab0f40fe3f02dd 100644 --- a/campics_/jinstagram/settings.py +++ b/campics_/jinstagram/settings.py @@ -77,19 +77,18 @@ WSGI_APPLICATION = 'jinstagram.wsgi.application' # https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'campics', - 'USER': 'root', - 'PASSWORD': '1101', - 'HOST': 'localhost', - 'PORT': '3306', - } # 'default': { - # # 'ENGINE': 'django.db.backends.sqlite3', - # # 'NAME': BASE_DIR / 'db.sqlite3', - # - # } + # 'ENGINE': 'django.db.backends.mysql', + # 'NAME': 'campics', + # 'USER': 'root', + # 'PASSWORD': '1101', + # 'HOST': 'localhost', + # 'PORT': '3306', + # } + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } } @@ -146,4 +145,4 @@ MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -AUTH_USER_MODEL = 'user.User' +AUTH_USER_MODEL = 'user.User' \ No newline at end of file diff --git a/campics_/jinstagram/views.py b/campics_/jinstagram/views.py index af972a77582e9318c07c9197e326d85e75a45d45..243f737f9bd8aac4973112b66f211d19cd8f88ea 100644 --- a/campics_/jinstagram/views.py +++ b/campics_/jinstagram/views.py @@ -4,6 +4,7 @@ from content.models import Feed, Reply, FeedLike, FeedView, Bookmark from user.models import User, Follow, Univ from django.db.models import Count, Sum + class Main(APIView): def get(self, request): email = request.session.get('email', None) @@ -20,11 +21,13 @@ class Main(APIView): order_condition = request.GET.get('order', None) if order_condition == 'recent': - feed_object_list.order_by('-id') + feed_object_list.filter(univ=user.univ).order_by('-id') if order_condition == 'likesCount': - feed_object_list.order_by('-like_count') + feed_object_list.filter(univ=user.univ).order_by('-like_count') + print(order_condition) + print(feed_object_list) #################### row_feed_list = [] @@ -52,6 +55,7 @@ class Main(APIView): context=dict(feed_list=feed_list, user=user)) + class Post(APIView): def get(self, request): email = request.session.get('email', None) @@ -62,10 +66,12 @@ class Post(APIView): if user is None: return render(request, 'user/login.html') - id=request.data.get('id') + if request.method == 'GET': + id = request.GET.get('id') + feed = Feed.objects.get(id=id) like_count = FeedLike.objects.filter(feed_id=feed.id, is_like=True).count() - feed.like_count=like_count + feed.like_count = like_count is_like = FeedLike.objects.filter(feed_id=feed.id, is_like=True, email=email).exists() view_count = FeedView.objects.filter(feed_id=feed.id, is_view=True).count() feed.view_count = view_count @@ -73,12 +79,14 @@ class Post(APIView): feed.save() profile_image = User.objects.filter(email=feed.email).first().thumbnail or 'default_profile.jpg' - print(like_count) + # print(like_count) return render(request, 'jinstagram/post.html', context=dict(id=feed.id, profile_image=profile_image, - user_id=feed.user_id, + feed_user_id=feed.user_id, + user_email=user.email, + user_id=user.user_id, image=feed.image, content=feed.content, like_count=like_count, @@ -90,18 +98,18 @@ class Post(APIView): class Ranking(APIView): def get(self, request): - - univ_list = Feed.objects.values('univ')\ - .annotate(score=Count('univ') + Sum('views') + Sum('like_count'))\ + univ_list = Feed.objects.values('univ') \ + .annotate(score=Count('univ') + Sum('view_count') + Sum('like_count')) \ .order_by('-score') - print(univ_list) - for i in range(len(univ_list)): - print(i, univ_list[i]['univ']) + # print(univ_list) + # for i in range(len(univ_list)): + # print(i, univ_list[i]['univ']) return render(request, 'jinstagram/ranking.html', context=dict(univ_list=univ_list)) + class Detail(APIView): def get(self, request): email = request.session.get('email', None) @@ -133,6 +141,7 @@ class Detail(APIView): context=dict(feed_list=feed_list, user=user)) + class Profile(APIView): def get(self, request): email = request.session.get('email', None) @@ -167,9 +176,8 @@ class Profile(APIView): if len(row_feed_list) > 0: feed_list.append(dict(row_feed_list=row_feed_list)) - return render(request, 'jinstagram/profile.html', context=dict(feed_list=feed_list, feed_count=feed_count, - user=user)) + user=user)) \ No newline at end of file diff --git a/campics_/templates/jinstagram/imgboard.html b/campics_/templates/jinstagram/imgboard.html index dac3326f661cd72a94b9078b62611bf6f1940b4d..35d0381734674f67ef71d29912a5c2d9362530b3 100644 --- a/campics_/templates/jinstagram/imgboard.html +++ b/campics_/templates/jinstagram/imgboard.html @@ -11,7 +11,8 @@ <link rel="stylesheet" href="{% static '/bootstrap-icons-1.8.2/bootstrap-icons.css' %}"> <!-- <script src="{% static '/jquery/jquery.min.js' %}"></script> --> <script src="{% static '/js/bootstrap.min.js' %}"></script> - + <script src="{% static '/js/bootstrap.bundle.min.js' %}"></script> + <script src="{% static '/js/popper.js' %}"></script> <!-- 요기에 구글 머티리얼 아이콘 --> <link href="https://fonts.googleapis.com/css?family=Material+Icons|Material+Icons+Outlined|Material+Icons+Two+Tone|Material+Icons+Round|Material+Icons+Sharp" @@ -194,7 +195,7 @@ padding: 10px; } - + .modal_title{ display: flex; flex-direction: row; @@ -253,37 +254,41 @@ <div class="col col-2 text-start"> <a href="{% url 'login' %}" class="btn btn-sm fs-4 fw-bold text-light "> <i class="bi bi-arrow-bar-left fs"></i> - </a> + </a> </div> <div class="col col-8 text-center "> <span class="fs-3 fw-normal align-middle" >{{ user.univ }}</span> </div> <div class="col col-2 text-end" > - <a href="#" class="btn btn-sm fs-4 fw-bold text-light "> <!-- 정렬 버튼--> - <i class="bi bi-filter fs"></i> - </a> - <a href="#" class="btn btn-sm fs-4 fw-bold text-light "> <!-- 정렬 버튼--> - <i class="bi bi-filter fs"></i> - </a> + + <div class="dropdown"> + <button class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false"> + + </button> + <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1"> + <li><a class="dropdown-item" href="/?order=recent">최신순</a></li> + <li><a class="dropdown-item" href="/?order=likesCount">추천순</a></li> + </ul> + </div> </div> - + </div> </div> </div> <!-- Page Top End --> - <!-- Page Content Start --> + <!-- Page Content Start --> <div class="mt-5"> {% for feed in feed_list %} <div class="row " style="display: flex; flex-direction: row"> {% for row_feed in feed.row_feed_list %} - <div class="col col-4 g-1"> - <img class="row_feed" src="{% get_media_prefix %}{{ row_feed.image }}" width="400px" height="300px"> + <div class="col col-4 g-1 mt-2 "> + <img class="row_feed img-fluid img-thumbnail" id="{{ row_feed.id}}" src="{% get_media_prefix %}{{ row_feed.image }}" > </div> {% endfor %} </div> {% endfor %} - </div> - + </div> + <!-- Page Content end --> <!-- Page bottom Start --> <div class="fixed-bottom"> @@ -310,18 +315,12 @@ </a> </div> <div class="col col-2 text-center"> - <!-- <span id="add_feed" class="btn btn-sm fs-3 fw-bold text-light" alt="등록"> - <i class="bi bi-plus-circle fs"></i> - </span> --> <span id="add_feed" class="btn btn-sm fs-3 fw-bold text-light " alt="등록"> <i class="bi bi-plus-circle fs"></i> </span> - <!-- <a href="add.html" id="add_feed" class="btn btn-sm fs-3 fw-bold text-light " alt="등록"> - <i class="bi bi-plus-circle fs"></i> - </a> --> </div> <div class="col col-2 text-center"> - <a href="univserach.html" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색"> + <a href="/content/searchUniv" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색"> <i class="bi bi-search fs"></i> </a> </div> @@ -340,18 +339,18 @@ <span id="close_modal" class="material-icons-outlined"> close </span> - + </div> </div> <div class="modal_image_upload"> <span style="text-align: center"></span> </div> - </div> + </div> </div> - - <div id="modal_add_feed_content" class="modal modal_overlay_content"> + + <div id="modal_add_feed_content" class="modal modal_overlay"> <div class="modal_window"> <div class="modal_title"> <div class="modal_title_side"></div> @@ -364,7 +363,7 @@ </div> <div class="modal_image_content"> <div id="input_image" class="modal_image_upload_content"> - + </div> <div class="modal_content_write"> <div class="feed_name"> @@ -374,6 +373,7 @@ </div> <span id="input_user_id" class="feed_name_txt"> {{ user.user_id }} </span> <span id="input_email" style="display: none"> {{ user.email }} </span> + <span id="input_univ" style="display: none"> {{ user.univ }} </span> </div> <div style="height: 440px"> <textarea id="input_content" class="feed_content_textarea form-control col-sm-5" rows="10" @@ -385,11 +385,40 @@ </div> </div> </div> - + </div> </div> - +<script> + // 조회수 + $('.row_feed').click(function(){ + console.log("클릭했다"); + let feed_id = $(this).attr('id'); + // let feed_id = 1; + let email = "{{ user.email }}"; + let is_view = true; + console.log(feed_id); + console.log(email); + $.ajax({ + url: "/content/view", + data: { + feed_id: feed_id, + email: email, + is_view: is_view + }, + method: "POST", + dataType: "json", + success: function (data){ + location.replace("{% url 'post'%}?id=" + feed_id); + }, + error:function (request, status, error){ + let data = JSON.parse(request.responseText); + console.log(data.message); + alert(data.message); + } + }); + }); +</script> <!-- Optional JavaScript; choose one of the two! --> <script> diff --git a/campics_/templates/jinstagram/post.html b/campics_/templates/jinstagram/post.html new file mode 100644 index 0000000000000000000000000000000000000000..978209c991c569bf5d83f638c9ec4c1eb7a8a81e --- /dev/null +++ b/campics_/templates/jinstagram/post.html @@ -0,0 +1,162 @@ +<!-- static 로딩 --> +{% load static %} + +<!doctype html> +<html lang="ko"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>게시물 상세보기</title> + <link href="{% static '/css/bootstrap.css' %}" rel="stylesheet" > + <link rel="stylesheet" href="{% static '/bootstrap-icons-1.8.2/bootstrap-icons.css' %}"> + <!-- <script src="{% static '/jquery/jquery.min.js' %}"></script> --> + <script src="{% static '/js/bootstrap.min.js' %}"></script> + <!-- jquery 사용하기 위해 --> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> + + </head> + <body> + <div class="container"> + <!-- Page Top Start --> + <div class="fixed-top"> + <div class="text-bg-primary py-1" > + <div class="row align-middle"> + <div class="col col-2 text-start"> + <a href="{% url 'main' %}" class="btn btn-sm fs-4 fw-bold text-light "> + <i class="bi bi-arrow-bar-left fs"></i> + </a> + </div> + <div class="col col-8 text-center "> + <span class="fs-3 fw-normal align-middle" >게시글 상세보기</span> + </div> + <div class="col col-2 text-end" ></div> + </div> + </div> + </div> + <!-- Page Top End --> + <!-- Page Content Start --> + <div class="mt-5 py-4"> + <div class="row text-center"> + <label class="col col-form-label"><i class="bi bi-person-circle fs-5"></i> {{feed_user_id}} 님의 게시글</label> + </div> + <div class="text-center mb-3 "> + <img src="{% get_media_prefix %}{{ image }}" class="rounded img-fluid" alt="..."> + </div> + <div class="row text-center"> + <label class="col col-form-label"><i class="like bi bi-hand-thumbs-up fs-5"></i>{{like_count}} 조회수 : {{view_count}}</label> + </div> + <div class="row text-center"> + <div class="col"> + <textarea class="form-control" id="inputText" rows="5">{{content}}</textarea> + </div> + </div> + + {% if user_id == feed_user_id %} + <div class="row justify-content-end text-center mt-3"> + <div class="col col-2"> + <a href="" class="btn btn-danger" id="delete"> 삭제</a> + </div> + </div> + {% endif %} + + + </div> + <!-- Page Content end --> + <!-- Page bottom Start --> + <div class="fixed-bottom"> + <div class="text-bg-primary py-1" > + <div class="row align-middle"> + <div class="col col-2 text-center"> + <a href="{% url 'main' %}" class="btn btn-sm fs-3 fw-bold text-light" alt="my univ"> + <i class="bi bi-view-list fs"></i> + </a> + </div> + <div class="col col-2 text-center"> + <a href="{% url 'main' %}" class="btn btn-sm fs-3 fw-bold text-light" alt="all"> + <i class="bi bi-view-stacked fs"></i> + </a> + </div> + <div class="col col-2 text-center"> + <a href="{% url 'ranking' %}" class="btn btn-sm fs-3 fw-bold text-light " alt="ranking"> + <i class="bi bi-list-ol fs"></i> + </a> + </div> + <div class="col col-2 text-center"> + <a href="{% url 'profile' %}" class="btn btn-sm fs-3 fw-bold text-light " alt="my list"> + <i class="bi bi-tags fs"></i> + </a> + </div> + <div class="col col-2 text-center"> + <span id="add_feed" class="btn btn-sm fs-3 fw-bold text-light " alt="등록"> + <i class="bi bi-plus-circle fs"></i> + </span> + </div> + <div class="col col-2 text-center"> + <a href="univserach.html" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색"> + <i class="bi bi-search fs"></i> + </a> + </div> + </div> + </div> + </div> + </div> + + <script> + // 삭제 + $('#delete').click(function(){ + console.log("클릭했다"); + let feed_id = "{{id}}" + let email = "{{ user_email }}"; + console.log(feed_id); + console.log(email); + + $.ajax({ + url: "/content/delete", + data: { + feed_id: feed_id, + email: email, + }, + method: "POST", + dataType: "json", + success: function (data){ + alert(data.message); + location.replace("{% url 'main'%}?id=" + feed_id); + }, + error:function (request, status, error){ + let data = JSON.parse(request.responseText); + console.log(data.message); + alert(data.message); + } + }); + }); + + // 추천 + $('.like').click(function(){ + console.log("클릭했다"); + let feed_id = "{{id}}" + let email = "{{ user_email }}"; + let is_like = true; + console.log(feed_id); + console.log(email); + $.ajax({ + url: "/content/like", + data: { + feed_id: feed_id, + email: email, + is_like: is_like + }, + method: "POST", + dataType: "json", + success: function (data){ + location.replace("{% url 'post'%}?id=" + feed_id); + }, + error:function (request, status, error){ + let data = JSON.parse(request.responseText); + console.log(data.message); + alert(data.message); + } + }); + }); + </script> + </body> +</html> \ No newline at end of file diff --git a/campics_/templates/jinstagram/profile.html b/campics_/templates/jinstagram/profile.html index 824231672f3b89d341774dd69bb7750353317e49..b8c34130d4cf9b7e8e07a9149e0eb942ea2d9183 100644 --- a/campics_/templates/jinstagram/profile.html +++ b/campics_/templates/jinstagram/profile.html @@ -11,7 +11,7 @@ <link rel="stylesheet" href="{% static '/bootstrap-icons-1.8.2/bootstrap-icons.css' %}"> <!-- <script src="{% static '/jquery/jquery.min.js' %}"></script> --> <script src="{% static '/js/bootstrap.min.js' %}"></script> - + <!-- 요기에 구글 머티리얼 아이콘 --> <link href="https://fonts.googleapis.com/css?family=Material+Icons|Material+Icons+Outlined|Material+Icons+Two+Tone|Material+Icons+Round|Material+Icons+Sharp" @@ -22,6 +22,7 @@ </head> <body> + <div class="container"> <!-- Page Top Start --> <div class="fixed-top"> @@ -30,38 +31,30 @@ <div class="col col-2 text-start"> <a href="{% url 'login' %}" class="btn btn-sm fs-4 fw-bold text-light "> <i class="bi bi-arrow-bar-left fs"></i> - </a> + </a> </div> <div class="col col-8 text-center "> <span class="fs-3 fw-normal align-middle" >{{ user.univ }}</span> </div> - <div class="col col-2 text-end" > - <a href="#" class="btn btn-sm fs-4 fw-bold text-light "> - <i class="bi bi-filter fs"></i> - </a> - <a href="#" class="btn btn-sm fs-4 fw-bold text-light "> - <i class="bi bi-filter fs"></i> - </a> - </div> - </div> </div> </div> <!-- Page Top End --> - <!-- Page Content Start --> + <!-- Page Content Start --> <div class="mt-5"> {% for feed in feed_list %} <div class="row " style="display: flex; flex-direction: row"> {% for row_feed in feed.row_feed_list %} - <div class="col col-4 g-1"> - <a href="boarddetail.html"><img class="row_feed" src="{% get_media_prefix %}{{ row_feed.image }}" width="400px" height="300px"></a> + <div class="col col-4 g-1 mt-2 "> + <img class="row_feed img-fluid img-thumbnail" id="{{ row_feed.id}}" src="{% get_media_prefix %}{{ row_feed.image }}" > + <!-- <a href="{% url 'post' %}?id={{ row_feed.id}}"><img class="row_feed" id="{{ row_feed.id}}" src="{% get_media_prefix %}{{ row_feed.image }}" width="400px" height="300px"></a> --> </div> {% endfor %} </div> {% endfor %} - </div> - - + </div> + + <!-- Page Content end --> <!-- Page bottom Start --> <div class="fixed-bottom"> @@ -88,18 +81,12 @@ </a> </div> <div class="col col-2 text-center"> - <!-- <span id="add_feed" class="btn btn-sm fs-3 fw-bold text-light" alt="등록"> - <i class="bi bi-plus-circle fs"></i> - </span> --> <span id="add_feed" class="btn btn-sm fs-3 fw-bold text-light " alt="등록"> <i class="bi bi-plus-circle fs"></i> </span> - <!-- <a href="add.html" id="add_feed" class="btn btn-sm fs-3 fw-bold text-light " alt="등록"> - <i class="bi bi-plus-circle fs"></i> - </a> --> </div> <div class="col col-2 text-center"> - <a href="univserach.html" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색"> + <a href="/content/searchUniv" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색"> <i class="bi bi-search fs"></i> </a> </div> @@ -109,33 +96,27 @@ <!-- Page bottom End --> </div> - - - <script> - // 상세페이지 이동 코드 - $('#button_join').on('click',()=>{ - console.log('클릭했다.'); - let user_id = $('#user_id').val(); - let password = $('#password').val(); - let nickname = $('#nicknickname').val(); - let univname = $('#univname').val(); - - console.log('아이디 :' + user_id + ', 비밀번호 :' + password + ', 닉네임 :' + nickname + ', 학교이름 :' + univname); - + // 조회수 + $('.row_feed').click(function(){ + console.log("클릭했다"); + let feed_id = $(this).attr('id'); + // let feed_id = 1; + let email = "{{ user.email }}"; + let is_view = true; + console.log(feed_id); + console.log(email); $.ajax({ - url: "/user/join", + url: "/content/view", data: { - user_id: user_id, - password: password, - nickname: nickname, - univname: univname + feed_id: feed_id, + email: email, + is_view: is_view }, method: "POST", dataType: "json", success: function (data){ - alert(data.message); - location.replace("{% url 'login'%}"); + location.replace("{% url 'post'%}?id=" + feed_id); }, error:function (request, status, error){ let data = JSON.parse(request.responseText); @@ -145,5 +126,6 @@ }); }); </script> + </body> </html> \ No newline at end of file diff --git a/campics_/templates/jinstagram/ranking.html b/campics_/templates/jinstagram/ranking.html index f05e692c3d5c4f7ad2e495972d992e25a5ef9276..4dca93b379cdf5f2691d97d21fba50b6eec1f3cd 100644 --- a/campics_/templates/jinstagram/ranking.html +++ b/campics_/templates/jinstagram/ranking.html @@ -13,7 +13,7 @@ <script src="{% static '/js/bootstrap.min.js' %}"></script> <!-- jquery 사용하기 위해 --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> - + </head> <body> <div class="container"> @@ -22,23 +22,18 @@ <div class="text-bg-primary py-1" > <div class="row align-middle"> <div class="col col-2 text-start"> - <!-- <a href="javascript:history.back()" class="btn fs-3 fw-bold text-light "> + <a href="{% url 'login' %}" class="btn btn-sm fs-4 fw-bold text-light "> <i class="bi bi-arrow-bar-left fs"></i> - </a> --> + </a> </div> <div class="col col-8 text-center "> <span class="fs-2 fw-semibold align-middle" >순위</span> </div> - <div class="col col-2 text-end" > - <a href="#" class="btn btn-sm fs-4 fw-bold text-light "> - <i class="bi bi-filter fs"></i> - </a> - </div> </div> </div> </div> <!-- Page Top End --> - <!-- Page Content Start --> + <!-- Page Content Start --> <br> <div class="mt-5"> <div class="row" > @@ -53,15 +48,15 @@ <tbody> {% for univ in univ_list %} <tr> - <td class="align-middle">1</td> + <td class="align-middle">{{forloop.counter}}</td> <td class="align-middle">{{univ.univ}}</td> <td class="align-middle">{{univ.score}}</td> </tr> {% endfor %} </tbody> </table> - </div> - + </div> + <!-- Page Content end --> <!-- Page bottom Start --> <div class="fixed-bottom"> @@ -93,7 +88,7 @@ </span> </div> <div class="col col-2 text-center"> - <a href="univserach.html" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색"> + <a href="/content/searchUniv" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색"> <i class="bi bi-search fs"></i> </a> </div> diff --git a/campics_/templates/jinstagram/search_result.html b/campics_/templates/jinstagram/search_result.html new file mode 100644 index 0000000000000000000000000000000000000000..d5efef2e1ffd60911c0245f80650a367d714cc2b --- /dev/null +++ b/campics_/templates/jinstagram/search_result.html @@ -0,0 +1,101 @@ +<!-- static 로딩 --> +{% load static %} + +<!doctype html> +<html lang="ko"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>포토존</title> + <link href="{% static '/css/bootstrap.css' %}" rel="stylesheet" > + <link rel="stylesheet" href="{% static '/bootstrap-icons-1.8.2/bootstrap-icons.css' %}"> + <!-- <script src="{% static '/jquery/jquery.min.js' %}"></script> --> + <script src="{% static '/js/bootstrap.min.js' %}"></script> + <script src="{% static '/js/bootstrap.bundle.min.js' %}"></script> + <script src="{% static '/js/popper.js' %}"></script> + <!-- 요기에 구글 머티리얼 아이콘 --> + <link + href="https://fonts.googleapis.com/css?family=Material+Icons|Material+Icons+Outlined|Material+Icons+Two+Tone|Material+Icons+Round|Material+Icons+Sharp" + rel="stylesheet"> + + <!-- jquery 사용하기 위해 --> + <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> + </head> + <body> + <div class="container"> + <!-- Page Top Start --> + <div class="fixed-top"> + <div class="text-bg-primary py-1" > + <div class="row align-middle"> + <div class="col col-2 text-start"> + <a href="{% url 'login' %}" class="btn btn-sm fs-4 fw-bold text-light "> + <i class="bi bi-arrow-bar-left fs"></i> + </a> + </div> + <div class="col col-8 text-center "> + <span class="fs-2 fw-semibold align-middle" >검색</span> + </div> + </div> + </div> + </div> + <!-- Page Top End --> + <!-- Page Content Start --> + <br> + <div class="mt-5"> + <div class="row" > + <form class="d-flex" role="search"> + <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search"> + <button class="btn btn-outline-success" type="submit">Search</button> + </form> + <ul class="list-group mt-4"> + <li class="list-group-item " aria-current="true">고려대학교</li> + <li class="list-group-item">경희대학교</li> + <li class="list-group-item">서울대학교</li> + <li class="list-group-item active">아주대학교</li> + <li class="list-group-item">연세대학교</li> + </ul> + </div> + </div> + + <!-- Page Content end --> + <!-- Page bottom Start --> + <div class="fixed-bottom"> + <div class="text-bg-primary py-1" > + <div class="row align-middle"> + <div class="col col-2 text-center"> + <a href="{% url 'main' %}" class="btn btn-sm fs-3 fw-bold text-light" alt="my univ"> + <i class="bi bi-view-list fs"></i> + </a> + </div> + <div class="col col-2 text-center"> + <a href="{% url 'main' %}" class="btn btn-sm fs-3 fw-bold text-light" alt="all"> + <i class="bi bi-view-stacked fs"></i> + </a> + </div> + <div class="col col-2 text-center"> + <a href="{% url 'ranking' %}" class="btn btn-sm fs-3 fw-bold text-light " alt="ranking"> + <i class="bi bi-list-ol fs"></i> + </a> + </div> + <div class="col col-2 text-center"> + <a href="{% url 'profile' %}" class="btn btn-sm fs-3 fw-bold text-light " alt="my list"> + <i class="bi bi-tags fs"></i> + </a> + </div> + <div class="col col-2 text-center"> + <span id="add_feed" class="btn btn-sm fs-3 fw-bold text-light " alt="등록"> + <i class="bi bi-plus-circle fs"></i> + </span> + </div> + <div class="col col-2 text-center"> + <a href="/content/searchUniv" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색"> + <i class="bi bi-search fs"></i> + </a> + </div> + </div> + </div> + </div> + <!-- Page bottom End --> + </div> + </body> +</html> \ No newline at end of file diff --git a/campics_/user/__init__.py b/campics_/user/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c45523b2f83d4ee6d8742e97d5c9f9775f01cae0 100644 --- a/campics_/user/__init__.py +++ b/campics_/user/__init__.py @@ -0,0 +1,2 @@ +import pymysql +pymysql.install_as_MySQLdb() \ No newline at end of file diff --git a/campics_/user/migrations/0001_initial.py b/campics_/user/migrations/0001_initial.py index 3f1ec9bd087bddbd6333dbe89621e8ad10a0ab25..a4a07df3be0baa929c2768bf77a52d5d35c6e3d6 100644 --- a/campics_/user/migrations/0001_initial.py +++ b/campics_/user/migrations/0001_initial.py @@ -1,37 +1,64 @@ -# Generated by Django 4.0.4 on 2022-05-31 14:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='User', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('name', models.CharField(blank=True, max_length=30, null=True)), - ('email', models.EmailField(blank=True, max_length=100, null=True, unique=True, verbose_name='email')), - ('user_id', models.CharField(blank=True, max_length=30, null=True)), - ('thumbnail', models.CharField(blank=True, default='default_profile.jpg', max_length=256, null=True)), - ('univ', models.CharField(max_length=30)), - ], - options={ - 'db_table': 'users', - }, - ), - migrations.CreateModel( - name='Univ', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('univ', models.CharField(max_length=30)), - ], - ), - ] +# Generated by Django 4.0.4 on 2022-06-05 09:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('name', models.CharField(blank=True, max_length=30, null=True)), + ('email', models.EmailField(blank=True, max_length=100, null=True, unique=True, verbose_name='email')), + ('user_id', models.CharField(blank=True, max_length=30, null=True)), + ('thumbnail', models.CharField(blank=True, default='default_profile.jpg', max_length=256, null=True)), + ('univ', models.CharField(max_length=15)), + ], + options={ + 'db_table': 'users', + }, + ), + migrations.CreateModel( + name='Follow', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('follower', models.EmailField(max_length=100, verbose_name='email')), + ('following', models.EmailField(max_length=100, verbose_name='email')), + ('is_live', models.BooleanField(default=False)), + ], + options={ + 'db_table': 'follow', + }, + ), + migrations.CreateModel( + name='Univ', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('univ', models.CharField(max_length=15)), + ], + options={ + 'db_table': 'univ', + }, + ), + migrations.AddIndex( + model_name='follow', + index=models.Index(fields=['follower'], name='follow_followe_227ce4_idx'), + ), + migrations.AddIndex( + model_name='follow', + index=models.Index(fields=['following'], name='follow_followi_9fea95_idx'), + ), + migrations.AddConstraint( + model_name='follow', + constraint=models.UniqueConstraint(fields=('follower', 'following'), name='follower-following'), + ), + ] diff --git a/campics_/user/migrations/0007_univ.py b/campics_/user/migrations/0007_univ.py deleted file mode 100644 index 9667105e4bd00c15b81463ee2301fd0c1e281bbf..0000000000000000000000000000000000000000 --- a/campics_/user/migrations/0007_univ.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.0.4 on 2022-06-01 02:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('user', '0006_auto_20211014_1134'), - ] - - operations = [ - migrations.CreateModel( - name='Univ', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('univ', models.CharField(max_length=15)), - ], - options={ - 'db_table': 'univ', - }, - ), - ] diff --git a/campics_/user/migrations/0008_user_univ.py b/campics_/user/migrations/0008_user_univ.py deleted file mode 100644 index b24aa889978061587391fd8abcc313f81d2b9dd3..0000000000000000000000000000000000000000 --- a/campics_/user/migrations/0008_user_univ.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.0.4 on 2022-06-01 07:43 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('user', '0007_univ'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='univ', - field=models.CharField(default=django.utils.timezone.now, max_length=15), - preserve_default=False, - ), - ]