Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
80efad6
Merge pull request #21 from pirogramming/dev
mnjese Aug 5, 2025
a965217
ci: ssh 값 수정 후 cicd test 다시 시도
mnjese Aug 5, 2025
078264b
ci: ssh 값 수정 후 cicd test 3차 시도
mnjese Aug 5, 2025
651d954
ci: ssh 값 수정 후 cicd test 4차 시도
mnjese Aug 5, 2025
7978a49
ci: ssh 값 수정 후 cicd test 5차 시도
mnjese Aug 5, 2025
429f63d
ci: cicd 오류 해결을 위한 디버깅 작업
mnjese Aug 5, 2025
160a527
ci: ssh 값 수정 후 cicd test 6차 시도
mnjese Aug 5, 2025
32482ca
ci: ssh 값 수정 후 cicd test 7차 시도
mnjese Aug 5, 2025
868ab2e
fix: STATIC_ROOT 파일 추가
mnjese Aug 5, 2025
2089fba
fix: ALLOWED_HOSTS에 배포 서버 추가
mnjese Aug 5, 2025
ceb9253
fix: static 파일 위치 수정
mnjese Aug 5, 2025
84f9d5e
feat: add nginx service for static files
mnjese Aug 5, 2025
d4044d3
ci: main.yml 파일 수정
mnjese Aug 5, 2025
6e64c40
ci: nginx 수정 후 테스트
mnjese Aug 5, 2025
ea0aa8d
test: https 소셜 로그인 테스트 완료 및 static 파일 서버에 적용
mnjese Aug 5, 2025
3c78614
Merge pull request #27 from pirogramming/dev
mnjese Aug 5, 2025
9b8b8de
fix: 실제 DB 값에 맞게 BigIntegerField 모두 FloatField로 수정
GGo-Dong Aug 5, 2025
bc2f60d
del: 배포에서 필요없는 파일 삭제
mnjese Aug 5, 2025
aa643db
view :왼쪽 오른쪽 움직이던 login.css, profile.css 수정완료
Gyubuk Aug 5, 2025
7fc7a7e
기존 이메일 부분 닉네임으로 변경, css도 밑줄로 수정
Gyubuk Aug 5, 2025
3a447b9
Merge pull request #28 from pirogramming/feat/5
Gyubuk Aug 5, 2025
72b3569
Merge pull request #29 from pirogramming/feat/8
mnjese Aug 5, 2025
075e5c4
Merge pull request #30 from pirogramming/dev
mnjese Aug 5, 2025
2bbb826
feat : 메인페이지 main.html 구현
Gyubuk Aug 6, 2025
33d2f85
feat : main.html 장고html로변경
Gyubuk Aug 6, 2025
b86abc1
Merge pull request #31 from pirogramming/feat/13
GGo-Dong Aug 6, 2025
3188cd4
feat : main 앱 생성, main.html 연결
Gyubuk Aug 6, 2025
68f08ea
Merge pull request #32 from pirogramming/feat/7
GGo-Dong Aug 6, 2025
ece9f94
style : main 페이지 css 수정, scroll 작동을 위한 수정
Gyubuk Aug 6, 2025
1b2af08
style : margin -5px 추가
Gyubuk Aug 6, 2025
f9adbb8
Merge pull request #33 from pirogramming/feat/13
GGo-Dong Aug 6, 2025
b1d84c8
refactor: 유저 프로필 저장 시 디폴트 값 변경
mnjese Aug 7, 2025
9a6a602
Merge branch 'dev' of https://github.com/pirogramming/Healthtant into…
mnjese Aug 7, 2025
5d2c006
feat: 로그인 기능 구현 완료 (닉네임 중복 여부 제외)
mnjese Aug 7, 2025
0725b38
Merge pull request #34 from pirogramming/feat/3
mnjese Aug 7, 2025
3ce5683
Merge pull request #36 from pirogramming/dev
mnjese Aug 7, 2025
770a9de
fix: requirements 수정
mnjese Aug 7, 2025
3e2a0a3
fix: settings 파일 분기 처리
mnjese Aug 7, 2025
ad836a8
chore: 로컬 테스트용 빈 커밋
mnjese Aug 7, 2025
f31e31f
chore: 로컬 2차 테스트용 빈 커밋
mnjese Aug 7, 2025
0ea44cc
chore: requirements 수정
mnjese Aug 7, 2025
f27a995
fix: settings 파일에 쿠키 허용
mnjese Aug 8, 2025
ddafc90
fix: 소셜 로그인 리디렉션 수정
mnjese Aug 8, 2025
8aaf494
fix: 소셜 로그인 리디렉션 2차 수정
mnjese Aug 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,17 @@ jobs:
uses: webfactory/ssh-agent@v0.8.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

# USERNAME과 HOST 확인용 디버그 스텝
- name: Debug Secrets
run: |
echo "USERNAME is set to: ${{ secrets.USERNAME }}"
echo "HOST is set to: ${{ secrets.HOST }}"

# SSH 접속 테스트 (-vvv 옵션으로 디버깅)
- name: Test SSH Connection
run: |
ssh -vvv -o StrictHostKeyChecking=no ${{ secrets.USERNAME }}@${{ secrets.HOST }} exit

- name: Deploy to server
run: |
Expand All @@ -25,4 +36,5 @@ jobs:
docker-compose down
docker-compose up -d --build
docker-compose exec -T web python manage.py migrate
docker-compose exec -T web python manage.py collectstatic --noinput
EOF
13 changes: 13 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM python:3.10-slim

WORKDIR /app

COPY requirements.txt /app/

RUN pip install --no-cache-dir -r requirements.txt

COPY . /app/

EXPOSE 8000

CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000"]
6 changes: 6 additions & 0 deletions accounts/adapters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from allauth.account.adapter import DefaultAccountAdapter

class CustomAccountAdapter(DefaultAccountAdapter):
def get_signup_redirect_url(self, request):
request.session["just_signed_up"] = True
return "/accounts/profile/"
33 changes: 33 additions & 0 deletions accounts/migrations/0002_alter_userprofile_nickname_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 5.2.4 on 2025-08-07 06:01

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('accounts', '0001_initial'),
]

operations = [
migrations.AlterField(
model_name='userprofile',
name='nickname',
field=models.CharField(max_length=30),
),
migrations.AlterField(
model_name='userprofile',
name='profile_image_url',
field=models.TextField(blank=True, null=True),
),
migrations.AlterField(
model_name='userprofile',
name='user_age',
field=models.IntegerField(blank=True, null=True),
),
migrations.AlterField(
model_name='userprofile',
name='user_gender',
field=models.CharField(blank=True, choices=[('M', 'Male'), ('F', 'Female'), ('OTHER', 'Other')], max_length=10, null=True),
),
]
12 changes: 8 additions & 4 deletions accounts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@

class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")
nickname = models.CharField(max_length=10)
user_gender = models.CharField(max_length=10, choices=[('M', 'Male'), ('F', 'Female'), ('OTHER', 'Other')])
user_age = models.IntegerField()
profile_image_url = models.TextField()
nickname = models.CharField(max_length=30)
user_gender = models.CharField(
max_length=10,
choices=[('M', 'Male'), ('F', 'Female'), ('OTHER', 'Other')],
null=True, # DB에 null 허용
blank=True)
user_age = models.IntegerField(null=True, blank=True)
profile_image_url = models.TextField(null=True, blank=True)

def __str__(self):
return self.nickname
14 changes: 7 additions & 7 deletions accounts/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created: # 새 User가 생성된 경우
UserProfile.objects.create(
user=instance,
nickname=instance.username or "새 유저",
user_gender="M", # 기본값 (원하면 "F" 또는 None도 가능)
user_age=20, # 기본값
profile_image_url="default.png"
)
UserProfile.objects.create(
user=instance,
nickname=instance.username or "새 유저",
user_gender=None,
user_age=None,
profile_image_url=None
)
1 change: 1 addition & 0 deletions accounts/templates/accounts/profile.html
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@
if (response.ok) {
alert('프로필이 성공적으로 업데이트되었습니다.');
// 성공 시 리다이렉트 또는 다른 처리
window.location.href = '/';
} else {
alert(result.error || '오류가 발생했습니다.');
}
Expand Down
3 changes: 1 addition & 2 deletions accounts/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@
from . import views

urlpatterns = [
path('login/', views.basic_login, name='basic_login'),
path('signup/', views.signup, name='signup'),
path('profile/', views.profile, name='profile'),
path('check-nickname/', views.check_nickname, name='check_nickname'),
#path('check-nickname/', views.check_nickname, name='check_nickname'),
]
104 changes: 62 additions & 42 deletions accounts/views.py
Original file line number Diff line number Diff line change
@@ -1,63 +1,83 @@
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def basic_login(request):
if request.method == "POST":
# 로그인 로직 작성
return JsonResponse({"message": "기본 로그인 성공"})
return JsonResponse({"error": "Invalid request"}, status=400)

@csrf_exempt
def signup(request):
if request.method == "POST":
# 회원가입 로직 작성
return JsonResponse({"message": "회원가입 성공"})
return JsonResponse({"error": "Invalid request"}, status=400)

import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.shortcuts import render, redirect
from django.http import JsonResponse
from .models import UserProfile


@csrf_exempt
@login_required
def profile(request):
if request.method == "GET":
# profile.html 렌더링
return render(request, 'accounts/profile.html', {
"user": request.user,
"profile": getattr(request.user, "profile", None)
})
if request.session.get("just_signed_up", False):
request.session["just_signed_up"] = False
return render(request, 'accounts/profile.html', {
"user": request.user,
"profile": request.user.profile,
})
return redirect("/")

elif request.method == "POST":
try:
profile = request.user.profile

profile.nickname = request.POST.get("nickname")
profile.user_gender = request.POST.get("user_gender")
profile.user_age = request.POST.get("user_age")
# 프로필 이미지 URL은 추후 파일 업로드 처리 방식에 따라 별도 처리 가능
profile.save()

return JsonResponse({"message": "회원 정보 수정 성공", "redirect": "/"})
except Exception as e:
return JsonResponse({"error": str(e)}, status=400)

return JsonResponse({"error": "Invalid request"}, status=400)


@csrf_exempt
def signup(request):
if request.method == "POST":
try:
data = json.loads(request.body)
profile = request.user.profile

profile.nickname = data.get("nickname")
profile.user_gender = data.get("user_gender")
profile.user_age = data.get("user_age")
profile.profile_image_url = data.get("profile_image_url")
username = data.get("username")
email = data.get("email")
password = data.get("password")
nickname = data.get("nickname")
gender = data.get("user_gender")
age = data.get("user_age")

# 중복 체크
if User.objects.filter(username=username).exists():
return JsonResponse({"error": "이미 존재하는 아이디입니다."}, status=400)
if UserProfile.objects.filter(nickname=nickname).exists():
return JsonResponse({"error": "이미 존재하는 닉네임입니다."}, status=400)

# User 생성 및 프로필 설정
user = User.objects.create_user(username=username, email=email, password=password)
profile = user.profile
profile.nickname = nickname
profile.user_gender = gender
profile.user_age = age
profile.profile_image_url = data.get("profile_image_url", "default.png")
profile.save()

return JsonResponse({
"message": "회원 정보 수정 성공",
"user_id": request.user.id,
"nickname": profile.nickname,
"user_gender": profile.user_gender,
"user_age": profile.user_age,
"profile_image_url": profile.profile_image_url,
"user_email": request.user.email,
})
# 로그인 처리 및 플래그 설정
login(request, user)
request.session["just_signed_up"] = True

return redirect("/accounts/profile/")
except Exception as e:
return JsonResponse({"error": str(e)}, status=400)

return JsonResponse({"error": "Invalid request"}, status=400)

'''
def check_nickname(request):
nickname = request.GET.get("nickname")
if nickname == "abc": # 예시
return JsonResponse({"available": False})
return JsonResponse({"available": True})
if not nickname:
return JsonResponse({"error": "닉네임이 필요합니다."}, status=400)

exists = UserProfile.objects.filter(nickname=nickname).exists()
return JsonResponse({"available": not exists})
'''
Loading