Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
abyss-s committed Aug 4, 2024
2 parents 34867db + 6278469 commit 2015bff
Show file tree
Hide file tree
Showing 16 changed files with 138 additions and 57 deletions.
Binary file removed meong_signal/static/readme/7.png
Binary file not shown.
Binary file added meong_signal/static/readme/detail1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added meong_signal/static/readme/detail2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added meong_signal/static/readme/detail3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added meong_signal/static/readme/erd2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
Binary file added meong_signal/static/readme/guide1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added meong_signal/static/readme/guide2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
File renamed without changes
File renamed without changes
Binary file added meong_signal/static/readme/team.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions meong_signal/walk/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ class Walk(models.Model):
kilocalories = models.DecimalField(max_digits=10, decimal_places=1)
time = models.IntegerField()
date = models.DateField()
image = models.ImageField(upload_to='walks', default='walks/default_walk.png')
image = models.ImageField(upload_to='dogs', default='dogs/default_dog.png')

def save(self, *args, **kwargs):
if not self.image:
self.image = 'walks/default_walk.png'
self.image = 'dogs/default_dog.png'
super().save(*args, **kwargs)

class Trail(models.Model):
Expand Down
20 changes: 2 additions & 18 deletions meong_signal/walk/serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,35 +45,19 @@ class Meta:
class WalkRegisterSerializer(serializers.ModelSerializer):
class Meta:
model = Walk
fields = ['dog_id', 'time', 'distance', 'image']
fields = ['dog_id', 'time', 'distance']

def create(self, validated_data):
if 'image' in validated_data:
# 파일의 확장자 추출
image = validated_data['image']

file_extension = image.name.split('.')[-1]

# UUID를 사용한 새 파일 이름 생성
new_file_name = generate_uuid_filename(file_extension)

# 파일을 메모리에 저장
temp_file = ContentFile(image.read())
temp_file.name = new_file_name

validated_data['image'] = temp_file

user = self.context['request'].user # 산책한 사람

dog = Dog.objects.select_related('user_id').get(id = validated_data['dog_id'].id) # 관련된 user 객체도 가져옴
owner = dog.user_id

kilocalories = get_calories(validated_data['time'], float(validated_data['distance']))
walk = Walk.objects.create(user_id=user, owner_id = owner, kilocalories=kilocalories, date=date.today(), **validated_data)

walk = Walk.objects.create(user_id=user, owner_id = owner, image = dog.image, kilocalories=kilocalories, date=date.today(), **validated_data)
return walk


# 강아지 정보 조회할 때 필요한 산책에 대한 정보
class DogWalkRegisterSerializer(serializers.ModelSerializer):
nickname = serializers.SerializerMethodField() # 같이 산책한 사람의 nickname
Expand Down
52 changes: 28 additions & 24 deletions meong_signal/walk/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ def new_walk(request):

if isinstance(data, QueryDict):
data = QueryDict.dict(data)

try:
dog = Dog.objects.get(id = data["dog_id"])
if dog.user_id.id == user: # 강아지 주인의 id와 user id가 같을시 return
Expand All @@ -142,7 +143,7 @@ def new_walk(request):
if walks.exists():
week_distance_before = walks.aggregate(Sum('distance'))['distance__sum']
week_unique_dog_count_before = walks.values('dog_id').distinct().count()

serializer = WalkRegisterSerializer(data=data, context={'request': request})
if serializer.is_valid():
saved_data = serializer.save()
Expand All @@ -152,27 +153,28 @@ def new_walk(request):

# 관련 업적 갱신
achievements = UserAchievement.objects.filter(user_id = request.user.id, is_achieved = False)
for achievement in achievements:
try:
original_achievement = Achievement.objects.get(id = achievement.achievement_id.id)
if original_achievement.category == 'dog':
if achievement.count + 1 >= original_achievement.total_count: # 업적 달성 조건을 만족한경우
achievement.is_achieved = True
achievement.count += 1
achievement.save()

else: # achievement.category == 'walking'
if achievement.count + distance >= original_achievement.total_count: # 업적 달성 조건을 만족한경우
achievement.is_achieved = True
achievement.count = original_achievement.total_count
else:
achievement.count += distance
achievement.save()

except ObjectDoesNotExist:
pass
except Exception as e:
return Response({"error": f"업적 update error: {e}"}, status=500)
if achievements.exists():
for achievement in achievements:
try:
original_achievement = Achievement.objects.get(id = achievement.achievement_id.id)
if original_achievement.category == 'dog':
if achievement.count + 1 >= original_achievement.total_count: # 업적 달성 조건을 만족한경우
achievement.is_achieved = True
achievement.count += 1
achievement.save()

else: # achievement.category == 'walking'
if achievement.count + distance >= original_achievement.total_count: # 업적 달성 조건을 만족한경우
achievement.is_achieved = True
achievement.count = original_achievement.total_count
else:
achievement.count += distance
achievement.save()

except ObjectDoesNotExist:
pass
except Exception as e:
return Response({"error": f"업적 update error: {e}"}, status=500)

# User DB의 distance, count 갱신
try:
Expand Down Expand Up @@ -366,12 +368,14 @@ def walk_user_image(request):
@api_view(['POST'])
@authentication_classes([JWTAuthentication])
def walk_and_review_info(request):
return_data = {"dog_name" : '', "total_distance" : 0, "my_profile_image" : "", "reviewer_profile_image" : "", "reviewer_average_rating" : 0, "my_review" : "", "received_review" : "", "image" : "walks/default_walk", "dog_image":"", "reviewer_nickname":""}
return_data = {"dog_name" : '', "total_distance" : 0, "my_profile_image" : "", "reviewer_profile_image" : "", "reviewer_average_rating" : 0, "my_review" : "", "received_review" : "", "dog_image":"", "reviewer_nickname":"", "distance" : 0, "date" : "", "time" : 0}
user = request.user
walk_id = request.data['walk_id']
try:
walk = Walk.objects.get(id = walk_id)
return_data["image"] = walk.image.url
return_data["distance"] = walk.distance
return_data["date"] = walk.date
return_data["time"] = walk.time

dog = Dog.objects.get(id=walk.dog_id.id)
return_data["dog_name"] = dog.name
Expand Down
119 changes: 106 additions & 13 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,31 @@
> Team 감자탕후루 |
> 김시원 김애리 백세희 유승인 이영주
![리드미 메인](meong_signal/static/readme/2.png)
![리드미 메인](meong_signal/static/readme/main.png)

<br>
더 건강하개, 더 재미있개!
<br><br>

**'더 건강하개, 더 재미있개! 당신을 위한 귀여운⭐ 산책메이트, 강쥐시그널'**

### [🛠️강쥐시그널 배포 링크 바로가기](https://meong-signal.o-r.kr)
### [🎬강쥐시그널 홍보 영상 바로가기](https://youtu.be/4Iq38YWdS-4?si=wcxGkzFkustVEiyr)
### [🛠️멍 시그널 배포 링크 바로가기](https://meong-signal.o-r.kr)

### [🎬멍 시그널 홍보 영상 바로가기](https://youtu.be/4Iq38YWdS-4?si=wcxGkzFkustVEiyr)

<br>
<br><br>

## 📂 Content
### 📂 Content

- [🔎 기술 스택](#기술-스택)
- [🔎 서비스 고안 배경](#서비스-고안-배경)
- [🔎 서비스 매커니즘](#서비스-매커니즘)
- [🔎 서비스 매커니즘](#서비스-매커니즘-사용-가이드)
- [🔎 주요 기능](#주요-기능)
- [🔎 상세 기능](#상세-기능)
- [🔎 서버 아키텍처](#서버-아키텍처)
- [🔎 와이어프레임](#와이어프레임)
- [🔎 데이터베이스 구조](#데이터베이스-구조--erd-diagram)
- [🔎 데이터베이스 구조](#데이터베이스-구조)
- [🔎 api 명세](#api-명세)
- [🔎 개발 과정](#개발-과정)
- [🔎 팀 소개](#팀-소개)
Expand All @@ -32,7 +36,7 @@

## 🛠️기술 스택

![기술 스택](meong_signal/static/readme/3.png)
![기술 스택](meong_signal/static/readme/stack.png)
<br>

> 프론트엔드 (FrontEnd)
Expand Down Expand Up @@ -78,31 +82,84 @@

산책자는 혼자 하는 산책보다 더 즐거운 시간을 보낼 수 있고, 귀여운 강아지와의 교감을 통해 더욱 특별한 추억을 만들 수 있습니다. 견주들은 강아지가 충분히 운동하고 행복하게 산책할 수 있어서 안심할 수 있죠!

또한, 단순 산책 뿐만 아니라 챌린지, 업적, 추천 산책로 등 다양한 기능을 통해 산책의 건강한 즐거움을 체험하고, 다각적 방면의 사용자 건강 증진을 기대합니다.

이제 강쥐시그널과 더 건강하개, 더 귀엽개 산책하세요!

또한, 단순 산책 뿐만 아니라 앱 내 다양한 재미요소와 미션을 걸어 산책의 즐거움을 사용자에게 체험하게함으로써, 다각적인 방면에서의 건강을 증진시키는 것을 기대합니다.
<br>

## 🔗서비스 매커니즘
## 🔗서비스 매커니즘; 사용 가이드

![가이드1](meong_signal/static/readme/guide1.png)
![가이드2](meong_signal/static/readme/guide2.png)

<br>

**⭐ '내'가 강아지의 '도그워커'로써 어플리케이션을 사용할 때!**

>
> 1) 홈 화면에서 내 주변의 산책 가능한 강아지를 조회합니다.
>
> 2) 마음에 드는 강아지를 발견했나요? 강아지의 프로필을 클릭하여 보호자와 채팅을 시작합니다.
>
> 3) 채팅으로 약속을 조율하고, 캘린더 버튼을 눌러 약속을 생성합니다.
>
> 4) 약속 날짜가 되면 보호자와 컨택하고, 강아지와 산책을 시작합니다! (추천 산책로 서비스를 이용 가능합니다.)
>
> 5) 산책을 완료하면, 다시 강아지를 보호자에게 돌려 보내고 리뷰를 작성합니다.
<br>

**⭐ '내'가 강아지의 '보호자'로써 어플리케이션을 사용할 때!**

>
> 1) '내 정보' 화면에서 강아지를 등록합니다. (성별, 나이, 성격 등을 설정할 수 있습니다.)
>
> 2) 내 강아지의 현재 상태에 따라 '내 정보' 창에서 강아지의 상태를 변경할 수 있습니다!
> > 심심해요 : 강아지가 산책을 원하는 상태로, 도그워커의 지도에 내 강아지 정보가 표시됩니다.
> >
> > 산책중! : 도그워커와 강아지가 산책을 시작하면 자동으로 전환되는 상태입니다. 다른 도그워커의 지도에 강아지 정보가 표시되지 않습니다.
> >
> > 쉬는 중 : 강아지가 산책을 원하지 않는 상태/산책이 필요없는 상태로, 다른 도그워커의 지도에 강아지 정보가 표시되지 않습니다.
>
> 3) 도그워커에게 채팅이 오면, 약속을 조율하고 약속을 생성 및 확인합니다.
>
> 4) 도그워커가 약속 날 산책을 시작하면, '지도' 화면의 '산책현황'에서 내 강아지가 어디 있는지 확인할 수 있습니다.
>
> 5) 도그워커의 산책이 끝나면, 도그워커에게 리뷰를 써 주세요!
(간략하게 주요 서비스 매커니즘 설명)
<br>

## 🔔주요 기능
![주요기능](meong_signal/static/readme/primefunc.png)

![주요기능](meong_signal/static/readme/6.png)
<br><br>
**🗺️사용자 위치 기반 지도**
- 도그워커의 현재 위치를 기반으로 **주변의 강아지 정보**를 불러옵니다.
**사용자 위치 기반 지도**

- 도그워커의 현재 위치를 기반으로 주변의 강아지 정보를 불러옵니다.
- 견주의 집 위치를 기반으로 강아지 정보를 생성합니다.
- 도그워커가 견주의 강아지와 산책 중일 때, 견주는 도그워커의 현재 위치를 원격으로 볼 수 있습니다.
- 도그워커가 이동한 경로가 지도에 표시되며, 이동 거리와 소모 칼로리가 계산됩니다.
- 도그워커가 **이동한 경로** 지도에 표시되며, **이동 거리와 소모 칼로리** 계산됩니다.

**💬실시간 채팅**
- 도그워커가 지도에서 강아지의 정보를 확인하고, 견주와 **채팅을 시작**할 수 있습니다.
- 채팅방 안에서 날짜와 시간, 약속명을 설정하여 **약속을 생성**할 수 있습니다.
- 채팅방 목록에서 곧 다가오는 **산책 약속을 확인**할 수 있습니다.
**실시간 채팅**

- 도그워커가 지도에서 강아지의 정보를 확인하고, 견주와 채팅을 시작할 수 있습니다.
- 채팅방 안에서 날짜와 시간, 약속명을 설정하여 약속을 생성할 수 있습니다.
- 채팅방 목록에서 곧 다가오는 산책 약속을 확인할 수 있습니다.

**🙌다양한 재미요소**
- 다양한 업적을 달성하고, **칭호**를 획득할 수 있습니다. 칭호는 당신의 이름을 더욱 빛내줄거에요!
- 강아지와 산책하는 것만으로 **챌린지**를 달성하고, 재화를 획득할 수 있습니다. 획득한 재화는 물건 구매나 리뷰 작성 시 상대방에게 선물할 수 있습니다.
- **산책 기록 데이터**를 통해 내가 얼마나 산책했는지 확인할 수 있습니다.

**다양한 재미요소**

- 다양한 업적을 달성하고, 칭호를 획득할 수 있습니다. 칭호는 당신의 이름을 더욱 빛내줄거에요!
Expand All @@ -113,7 +170,31 @@

## ✨상세 기능

![detail1](meong_signal/static/readme/detail1.png)
<br><br>
> **내 정보 | 내 정보 수정, 산책 기록 조회, 업적(칭호) 관리, 리뷰 조회, 강아지 등록, 강아지 별 산책 기록 조회, 강아지 상태 변경이 가능합니다.**
<br><br>
![detail2](meong_signal/static/readme/detail2.png)
<br><br>
> **멍 샵 | 멍을 충전하고, 멍으로 구매 가능한 상품을 조회할 수 있습니다.**
>
> **추천 산책로, 챌린지 | 이 주의 챌린지를 달성하여 재화를 획득할 수 있습니다. 현재 위치 기반으로 추천 산책로를 조회하고, 저장할 수 있습니다.**
<br><br>
![detail3](meong_signal/static/readme/detail3.png)
<br><br>
> **채팅 창 | 채팅 창에서 메시지를 확인할 수 있습니다. 3일 이내의 곧 다가오는 약속을 상단에서 확인할 수 있습니다.**
>
> **산책 시작 | 산책이 시작되면 강아지의 보호자는 원격으로 자신의 강아지의 위치를 확인할 수 있습니다.**
>
> **리뷰 | 산책 종료 후 리뷰를 작성할 수 있습니다.**
<br><br>
**⭐이 외 디테일**

> 소셜로그인 | 일반적인 회원가입 외에 카카오톡, 구글, 네이버로 소셜 로그인을 진행할 수 있습니다.
>
>
> 리뷰 | 산책이 끝난 후 도그워커와 견주 간 상호 리뷰를 남길 수 있고, 멍 선물도 가능합니다.
>
Expand All @@ -122,6 +203,7 @@
> 산책 정보 제공 | 지금까지의 산책 내역, 산책 추이 그래프, 산책 별 이동 거리, 소모 칼로리 등 다양한 정보를 확인할 수 있습니다.
>
> 업적 | 거리 이동형, 산책 횟수형과 같은 업적을 달성해 칭호를 획득할 수 있습니다.
>
>
> 챌린지 | 설정된 주간 챌린지를 달성하여 앱 내에서 사용 가능한 재화, '멍'을 획득할 수 있습니다.
>
Expand All @@ -135,16 +217,27 @@

## 💎와이어프레임

![와이어프레임](meong_signal/static/readme/4.png)
![와이어프레임](meong_signal/static/readme/frame.png)
<br>

#### [🛠️강쥐시그널 와이어프레임 프로토타입 링크](https://www.figma.com/design/YznRx0ey7UWGjUKVWEql8c/%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85?node-id=1-17&t=e4APDaxG8BwdyHzq-1)
<br>

## 🗃️데이터베이스 구조

![erd](meong_signal/static/readme/erd2.png)
<br>

#### [🛠️강쥐시그널 ERD 링크](https://www.erdcloud.com/d/8iGrcJThkHzbaZ5nH)
<br>
## 🗃️데이터베이스 구조 | ERD Diagram

<br><br>

## ⛓️api 명세

### [🛠️멍 시그널 기능명세 노션 링크](https://abyss-2.notion.site/e607658be211483a9aa4f76c5e8223c2?pvs=4)
#### [🛠️강쥐시그널 기능명세 노션 링크](https://abyss-2.notion.site/e607658be211483a9aa4f76c5e8223c2?pvs=4)
<br>

## 💻개발 과정

Expand All @@ -155,7 +248,7 @@

멋쟁이사자처럼 인하대학교 12기 중앙 해커톤 1팀, 감자탕후루 팀입니다.

![팀 소개 페이지](meong_signal/static/readme/7.png)
![팀 소개 페이지](meong_signal/static/readme/team.png)

| 김시원 | 김애리 | 백세희 | 유승인 | 이영주 |
| ---------------------------------------- | ------------------------------------ | -------------------------------------- | ------------------------------------------------ | -------------------------------------- |
Expand Down

0 comments on commit 2015bff

Please sign in to comment.