Skip to content
Snippets Groups Projects
Commit 2a73df5f authored by 김시환's avatar 김시환
Browse files

Merge branch 'main' into 'mymy'

# Conflicts:
#   campics_/content/models.py
#   campics_/content/urls.py
#   campics_/content/views.py
#   campics_/jinstagram/urls.py
#   campics_/jinstagram/views.py
#   campics_/templates/jinstagram/ranking.html
#   campics_/user/models.py
#   campics_/user/views.py
parents e51adc09 cb863f2f
No related branches found
No related tags found
1 merge request!1Mymy
Showing
with 1608 additions and 853 deletions
# 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,
),
]
# 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,
),
]
# 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',
),
]
# 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'),
),
]
from django.db import models
from django.utils import timezone
# Create your models here.
class Feed(models.Model):
......@@ -9,9 +9,22 @@ class Feed(models.Model):
email = models.EmailField(verbose_name='email', max_length=100, blank=True, null=True)
user_id = models.CharField(max_length=30, blank=True, null=True)
like_count = models.IntegerField(default=0)
views = models.IntegerField(default=0) #조회수
view_count = models.IntegerField(default=0) #조회수
type = models.BooleanField(default=False) #전경 포토존
univ = models.CharField(max_length=30) #대학
univ = models.CharField(max_length=15)
class Reply(models.Model):
feed_id = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
user_id = models.CharField(max_length=30, blank=True, null=True)
content = models.TextField()
email = models.EmailField(verbose_name='email', max_length=100, blank=True, null=True)
class Meta:
indexes = [
models.Index(fields=['feed_id'])
]
class FeedLike(models.Model):
feed_id = models.IntegerField()
......@@ -24,8 +37,18 @@ class FeedLike(models.Model):
models.Index(fields=['email']),
]
class FeedView(models.Model):
feed_id = models.IntegerField()
email = models.CharField(max_length=30, blank=True, null=True)
is_view = models.BooleanField(default=False)
class Meta:
indexes = [
models.Index(fields=['feed_id']),
models.Index(fields=['email']),
]
class Bookmark(models.Model):
email = models.EmailField(verbose_name='email', max_length=100)
feed_id = models.IntegerField()
......
from django.urls import path
from .views import UploadFeed, LikeFeed, DeleteFeed, searchUniv, searchUser
from .views import UploadFeed, CreateReply, LikeFeed, ViewFeed, BookmarkFeed, DeleteFeed, searchUniv, searchUser
urlpatterns = [
path('upload', UploadFeed.as_view(), name='upload_feed'),
path('delete', DeleteFeed.as_view(), name='delete_feed'),
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'),
]
......
from django.shortcuts import render
from rest_framework.views import APIView
from content.models import Feed, FeedLike, FeedView
from content.models import Feed, Reply, FeedLike, FeedView, Bookmark
from rest_framework.response import Response
from user.models import User, Univ
from rest_framework.response import Response
......@@ -73,6 +73,87 @@ class LikeFeed(APIView):
return Response(status=200, data=dict(message='피드 좋아요 완료.'))
class ViewFeed(APIView):
def post(self, request):
feed_id = request.data.get('feed_id') #id?
email = request.data.get('email')
is_view = request.data.get('is_view', 'True')
if is_view.lower() == 'false':
is_view = False
else:
is_view = True
feed_view = FeedView.objects.filter(feed_id=feed_id, email=email).first()
if feed_view is None:
FeedView.objects.create(feed_id=feed_id,
email=email,
is_view=is_view,
)
else:
feed_view.is_view = is_view
feed_view.save()
return Response(status=200, data=dict(message='피드 조회 완료.'))
class CreateReply(APIView):
def post(self, request):
feed_id = request.data.get('feed_id')
email = request.data.get('email')
# feed_id = 1
# email = "ksshhses@ajou.ac.kr"
feed = Feed.objects.filter(id=feed_id).first()
if feed is None:
return Response(status=500, data=dict(message='삭제 실패'))
if feed.email == email:
feed.delete()
return render(request, "jinstagram/main.html") #프로필페이지
else:
return Response(status=500, data=dict(message='삭제 실패'))
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))
class searchUser(APIView):
def get(self, request):
# search_word = request.data.get('user')
search_word = 's1'
user_list = Feed.objects.filter(user_id__contains=search_word) # .values() 뭐 필요?
return Response(status=200, data=dict(message='북마크 설정 완료.'))
## 시환님꺼
class DetailFeed(APIView):
def get(self, request):
email = request.session.get('email', None)
if email is None:
return render(request, 'user/login.html')
user = User.objects.filter(email=email).first()
if user is None:
return render(request, 'user/login.html')
# feed 가지고 오기
feed = Feed.objects.get(feed_id=id)
if feed.email == user.email:
return(request, 'deatil_delete.html', feed)
else:
return(request, 'detail.html', feed)
class DeleteFeed(APIView):
def post(self, request):
feed_id = request.data.get('feed_id')
......
......@@ -14,7 +14,7 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.urls import path
from .views import Main, Profile, Ranking
from .views import Main, Post, Profile, Ranking
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, include
......@@ -22,6 +22,7 @@ from django.urls import path, include
urlpatterns = [
path('', Main.as_view(), name='main'),
path('post', Post.as_view(), name='post'),
path('profile', Profile.as_view(), name='profile'),
path('ranking', Ranking.as_view(), name='ranking'),
path('user/', include('user.urls')),
......
from django.shortcuts import render
from rest_framework.views import APIView
from content.models import Feed, FeedLike, FeedView
from user.models import User, Univ
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)
if email is None:
return render(request, 'user/login.html')
user = User.objects.filter(email=email).first()
if user is None:
return render(request, 'user/login.html')
feed_object_list = Feed.objects.filter(univ=user.univ).order_by('-id')
##### 게시글 정렬 #####
order_condition = request.GET.get('order', None)
if order_condition == 'recent':
feed_object_list.order_by('-id')
if order_condition == 'likesCount':
feed_object_list.order_by('-like_count')
####################
row_feed_list = []
feed_list = []
for feed in feed_object_list:
like_count = FeedLike.objects.filter(feed_id=feed.id, is_like=True).count()
is_like = FeedLike.objects.filter(feed_id=feed.id, is_like=True, email=email).exists()
row_feed_list.append(dict(
id=feed.id,
user_id=feed.user_id,
image=feed.image,
like_count=like_count,
is_like=is_like,
))
if len(row_feed_list) == 3:
feed_list.append(dict(row_feed_list=row_feed_list))
row_feed_list = []
if len(row_feed_list) > 0:
feed_list.append(dict(row_feed_list=row_feed_list))
return render(request,
'jinstagram/imgboard.html',
context=dict(feed_list=feed_list,
user=user))
class Post(APIView):
def get(self, request):
email = request.session.get('email', None)
if email is None:
return render(request, 'user/login.html')
user = User.objects.filter(email=email).first()
if user is None:
return render(request, 'user/login.html')
id=request.data.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
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
is_view = FeedView.objects.filter(feed_id=feed.id, is_view=True, email=email).exists()
feed.save()
profile_image = User.objects.filter(email=feed.email).first().thumbnail or 'default_profile.jpg'
print(like_count)
return render(request,
'jinstagram/post.html',
context=dict(id=feed.id,
profile_image=profile_image,
user_id=feed.user_id,
image=feed.image,
content=feed.content,
like_count=like_count,
is_like=is_like,
view_count=view_count,
is_view=is_view
))
class Ranking(APIView):
def get(self, request):
univ_list = Feed.objects.values('univ')\
.annotate(score=Count('univ') + Sum('views') + Sum('like_count'))\
.order_by('-score')
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)
if email is None:
......@@ -32,7 +129,7 @@ class Main(APIView):
))
return render(request,
'jinstagram/main.html',
'jinstagram/boarddetail.html',
context=dict(feed_list=feed_list,
user=user))
......
File added
This diff is collapsed.
......@@ -535,131 +535,6 @@
document.body.style.overflowY = "hidden"; // 스크롤 없애기
});
<!-- jquery 부분 -->
<!-- @@@댓글 달기 -->
$('.write_reply').click(function () {
console.log($(this).prev().val());
console.log($(this).attr('feed_id'));
let success = false;
let content = $(this).prev().val();
let feed_id = Number($(this).attr('feed_id'));
$.ajax({
url: "/content/reply/create",
data: {
email: '{{ user.email }}',
user_id: '{{ user.user_id }}',
content: content,
feed_id: feed_id
},
method: "POST",
dataType: "json",
async: false,
success: function (data){
alert(data.message);
success=true
},
error:function (request, status, error){
let data = JSON.parse(request.responseText);
console.log(data.message);
alert(data.message);
}
});
console.log(success)
if(success == true){
$(this).parent().prev().append('<span class="feed_txt"><b> {{ user.user_id }} </b> '+ content +' </span>');
$('.write_reply_input').val('');
}
});
<!-- @@@좋아요 누르기 -->
$('.favorite_icon').click(function () {
console.log($(this).prev().val());
console.log($(this).attr('feed_id'));
let success = false;
let icon = $.trim($(this).html());
console.log('지금현재 상태 : ' + icon);
let is_like = false;
if( icon == 'favorite_border'){
is_like = true;
}
let feed_id = Number($(this).attr('feed_id'));
$.ajax({
url: "/content/like",
data: {
email: '{{ user.email }}',
is_like: is_like,
feed_id: feed_id
},
method: "POST",
dataType: "json",
async: false,
success: function (data){
success=true
},
error:function (request, status, error){
let data = JSON.parse(request.responseText);
console.log(data.message);
}
});
console.log(success)
if(success == true){
console.log(is_like)
if(is_like){
$(this).html('favorite');
let like_count_object = $(this).parent().parent().next().find('p').find('span');
let like_count = Number(like_count_object.html());
like_count_object.html(like_count + 1);
console.log(like_count);
}else{
$(this).html('favorite_border');
let like_count_object = $(this).parent().parent().next().find('p').find('span');
let like_count = Number(like_count_object.html());
like_count_object.html(like_count - 1);
console.log(like_count);
}
}
});
<!-- @@@북마크 누르기 -->
$('.bookmark_icon').click(function () {
let success = false;
let icon = $.trim($(this).html());
let is_bookmarked = false;
if( icon == 'turned_in_not'){
is_bookmarked = true;
}
let feed_id = Number($(this).attr('feed_id'));
$.ajax({
url: "/content/bookmark",
data: {
email: '{{ user.email }}',
is_bookmarked: is_bookmarked,
feed_id: feed_id
},
method: "POST",
dataType: "json",
async: false,
success: function (data){
success=true
},
error:function (request, status, error){
let data = JSON.parse(request.responseText);
}
});
if(success == true){
if(is_bookmarked){
$(this).html('turned_in');
}else{
$(this).html('turned_in_not');
}
}
});
$('.close_modal').on("click", () => {
closeModal();
});
......@@ -741,6 +616,7 @@
const profile_image = $('#input_profile_image').attr('src');
const user_id = $.trim($('#input_user_id').text());
const email = $.trim($('#input_email').text());
const univ = $.trim($('#input_univ').text());
const file = files[0];
......@@ -752,6 +628,7 @@
fd.append('profile_image', profile_image);
fd.append('user_id', user_id);
fd.append('email', email);
fd.append('univ', univ);
if (image.length <= 0) {
alert("이미지가 비어있습니다.");
......
This diff is collapsed.
This diff is collapsed.
......@@ -9,8 +9,10 @@
<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 '/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>
......@@ -51,6 +53,7 @@
<tbody>
{% for univ in univ_list %}
<tr>
<td class="align-middle">1</td>
<td class="align-middle">{{univ.univ}}</td>
<td class="align-middle">{{univ.score}}</td>
</tr>
......@@ -65,29 +68,29 @@
<div class="text-bg-primary py-1" >
<div class="row align-middle">
<div class="col col-2 text-center">
<a href="imgboard.html" class="btn btn-sm fs-3 fw-bold text-light" alt="my univ">
<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="imgboard.html" class="btn btn-sm fs-3 fw-bold text-light" alt="all">
<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="ranking.html" class="btn btn-sm fs-3 fw-bold text-light " alt="ranking">
<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="imgboard.html" class="btn btn-sm fs-3 fw-bold text-light " alt="my list">
<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">
<a href="add.html" class="btn btn-sm fs-3 fw-bold text-light " alt="등록">
<span id="add_feed" class="btn btn-sm fs-3 fw-bold text-light " alt="등록">
<i class="bi bi-plus-circle fs"></i>
</a>
</span>
</div>
<div class="col col-2 text-center">
<a href="univserach.html" class="btn btn-sm fs-3 fw-bold text-light " alt="대학검색">
......
# 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',
},
),
]
# 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,
),
]
......@@ -8,7 +8,7 @@ class User(AbstractBaseUser):
email = models.EmailField(verbose_name='email', max_length=100, blank=True, null=True, unique=True)
user_id = models.CharField(max_length=30, blank=True, null=True)
thumbnail = models.CharField(max_length=256, default='default_profile.jpg', blank=True, null=True)
univ = models.CharField(max_length=30)
univ = models.CharField(max_length=15)
USERNAME_FIELD = 'id'
REQUIRED_FIELDS = ['user_id']
......@@ -24,5 +24,23 @@ class User(AbstractBaseUser):
db_table = 'users'
class Follow(models.Model):
follower = models.EmailField(verbose_name='email', max_length=100)
following = models.EmailField(verbose_name='email', max_length=100)
is_live = models.BooleanField(default=False)
class Meta:
db_table = 'follow'
constraints = [
models.UniqueConstraint(fields=['follower', 'following'], name='follower-following')
]
indexes = [
models.Index(fields=['follower']),
models.Index(fields=['following']),
]
class Univ(models.Model):
univ = models.CharField(max_length=30)
univ = models.CharField(max_length=15)
class Meta:
db_table = 'univ'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment