Skip to content

Commit e4e5269

Browse files
Merge pull request #64 from pirogramming/feat-chan
Feat chan
2 parents 0a5f0f3 + 8f55265 commit e4e5269

18 files changed

Lines changed: 158 additions & 446 deletions

backend-core/missions/views.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,12 @@ def mission_update(request, mission_id):
162162
def get_mission_list(request):
163163
"""JSON으로 미션 목록 반환 (Serializer 적용 버전)"""
164164
# 관련 데이터를 한 번에 가져오도록(Select/Prefetch) 최적화
165-
qs = Mission.objects.select_related("author").prefetch_related("tags", "images").order_by("-created_at")
166-
165+
qs = Mission.objects.select_related("author", "author__university").prefetch_related("tags", "images").order_by("-created_at")
166+
167+
# 내 학교 미션만 (로그인 유저의 university와 작성자(author)의 university가 같은 것만)
168+
if getattr(request.user, "university", None):
169+
qs = qs.filter(author__university=request.user.university)
170+
167171
# 필터링 로직
168172
category = request.GET.get("category")
169173
if category in Category.values:

backend-core/static/users/css/homepage.css

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,9 @@ margin-bottom: 20px;
300300
color: #4DA6FF;
301301
}
302302

303-
/* 하단 네비게이션 */
303+
/* 하단 네비게이션 - 화면 바닥에 고정 */
304304
.bottom-nav {
305-
position: absolute;
305+
position: fixed;
306306
bottom: 0;
307307
width: 100%;
308308
height: 70px;
@@ -311,6 +311,7 @@ margin-bottom: 20px;
311311
justify-content: space-around;
312312
align-items: center;
313313
border-top: 1px solid #eee;
314+
z-index: 1000;
314315
}
315316

316317
.bottom-nav .badge, .bottom-nav .notification-dot {
@@ -329,6 +330,11 @@ margin-bottom: 20px;
329330
box-shadow: 0 4px 10px rgba(77, 166, 255, 0.3);
330331
}
331332

333+
/* 하단 네비 높이만큼 여백 (스크롤 시 콘텐츠가 가려지지 않도록) */
334+
.mission-list-section {
335+
padding-bottom: 90px;
336+
}
337+
332338
.mission-section {
333339
margin-bottom: 24px;
334340
}

backend-core/static/users/js/auth_helper.js

Lines changed: 0 additions & 58 deletions
This file was deleted.

backend-core/static/users/js/blocked_users.js

Lines changed: 13 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,9 @@ function getCookie(name) {
1515
}
1616

1717
async function getuserData() {
18-
// 1. 금고(로컬스토리지)에서 토큰 꺼내기
19-
const token = localStorage.getItem('access_token');
20-
21-
if (!token) {
22-
console.warn("로그인 토큰이 없습니다.");
23-
return null;
24-
}
25-
26-
try {
27-
const response = await fetch('/api/users/api/blocked_users/', {
28-
headers: {
29-
'Authorization': 'Bearer ' + token,
30-
'Content-Type': 'application/json',
31-
},
32-
});
33-
34-
if (response.ok) {
35-
const userData = await response.json();
36-
console.log("유저 정보 로드 성공:", userData);
37-
return userData;
38-
} else {
39-
const text = await response.text();
40-
try {
41-
const err = JSON.parse(text);
42-
console.error("API 오류:", err);
43-
} catch (_) {
44-
console.error("응답이 JSON이 아님 (로그인 필요할 수 있음)");
45-
}
46-
return null;
47-
}
48-
} catch (error) {
49-
console.error("네트워크 오류 발생:", error);
50-
return null;
51-
}
18+
const userData = await Auth.getData('/api/users/api/blocked_users/');
19+
if (userData) console.log("유저 정보 로드 성공:", userData);
20+
return userData;
5221
}
5322

5423
async function renderBlockUser() {
@@ -87,41 +56,16 @@ async function renderBlockUser() {
8756
}
8857
}
8958

90-
async function transmit_user_id(target_id){
91-
92-
const token = localStorage.getItem('access_token');
93-
94-
if (!token) {
95-
alert("로그인 정보가 없습니다.");
96-
return;
97-
}
98-
try {
99-
// 2. 백엔드 API에 토큰을 담아서 던지기 (fetch)
100-
const response = await fetch('/api/users/api/blocked_users/', {
101-
method: 'POST',
102-
headers: {
103-
'Content-Type': 'application/json',
104-
'Authorization': 'Bearer ' + token,
105-
'X-CSRFToken': getCookie('csrftoken')
106-
},
107-
body: JSON.stringify({ target_id: target_id })
108-
});
109-
110-
if (response.ok) {
111-
const response_json = await response.json();
112-
const message = response_json.message;
113-
alert(message)
114-
location.reload();
115-
} else {
116-
console.error("토큰이 만료되었거나 유효하지 않습니다.");
117-
alert('노 토큰')
118-
// window.location.href = '/users/login/';
119-
return null;
120-
}
121-
122-
} catch (error) {
123-
console.error("네트워크 오류 발생:", error);
124-
return null;
59+
async function transmit_user_id(target_id) {
60+
const response_json = await Auth.postData(
61+
'/api/users/api/blocked_users/',
62+
{ target_id: target_id },
63+
false,
64+
{ headers: { 'X-CSRFToken': getCookie('csrftoken') } }
65+
);
66+
if (response_json && response_json.message) {
67+
alert(response_json.message);
68+
location.reload();
12569
}
12670
}
12771

backend-core/static/users/js/change_password.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ async function handleSignup() {
2020

2121
const csrftoken = getCookie('csrftoken');
2222

23-
const password_reset_token = localStorage.getItem('password_reset_token')
23+
const password_reset_token = sessionStorage.getItem('password_reset_token')
2424

2525
const changeData = {
2626
password: document.getElementById('password').value,

backend-core/static/users/js/mypage.js

Lines changed: 11 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,7 @@
11
async function getUserData() {
2-
const token = localStorage.getItem('access_token');
3-
4-
if (!token) {
5-
console.warn("로그인 토큰이 없습니다.");
6-
window.location.href = "/api/users/login/"
7-
return null;
8-
}
9-
10-
try {
11-
const response = await fetch('/api/users/api/profile/', {
12-
method: 'GET',
13-
headers: {
14-
'Authorization': `Bearer ${token}`,
15-
'Content-Type': 'application/json'
16-
}
17-
});
18-
19-
if (response.ok) {
20-
const userData = await response.json();
21-
console.log("유저 정보 로드 성공:", userData);
22-
return userData;
23-
} else {
24-
console.error("토큰이 만료되었거나 유효하지 않습니다.");
25-
return null;
26-
}
27-
} catch (error) {
28-
alert("네트워크 오류 발생:");
29-
window.location,href = "/api/users/login/"
30-
return null;
31-
}
2+
const userData = await Auth.getData('/api/users/api/profile/');
3+
if (userData) console.log("유저 정보 로드 성공:", userData);
4+
return userData;
325
}
336

347
async function renderProfile() {
@@ -46,8 +19,6 @@ async function renderProfile() {
4619
const score_bar_fill = document.getElementById('score_bar_fill');
4720
const imgEl = document.getElementById('userprofile');
4821

49-
score_bar_fill.style = `width : ${user.manner_score}%;`
50-
5122
// 1. 기본 정보 반영
5223
if (usernameElement) usernameElement.innerText = user.username;
5324
if (univElement) univElement.innerText = user.university;
@@ -102,7 +73,7 @@ async function renderProfile() {
10273
mannerScore.innerText = `${user.manner_score}점`;
10374
const scoreBar = document.querySelector('.score-bar-fill');
10475
if (scoreBar) {
105-
scoreBar.style.width = `${user.manner_score}%`;
76+
scoreBar.style.width = `${Math.round((user.manner_score / 5) * 100)}%`;
10677
}
10778
}
10879
}
@@ -118,40 +89,18 @@ function toggleReviews() {
11889
}
11990

12091
function logout() {
121-
localStorage.removeItem('access_token');
122-
localStorage.removeItem('refresh_token');
12392
alert("로그아웃 되었습니다.");
124-
window.location.href = "/api/users/login/";
93+
Auth.logout("/api/users/login/");
12594
}
12695

12796

12897
async function signout() {
129-
const token = localStorage.getItem('access_token');
130-
if (!token) return;
131-
132-
try {
133-
const res = await fetch('/api/users/api/signout/', {
134-
method: 'DELETE',
135-
headers: {
136-
'Authorization': `Bearer ${token}`,
137-
'Content-Type': 'application/json'
138-
}
139-
});
140-
141-
if (res.ok) {
142-
const data = await res.json();
143-
localStorage.removeItem('access_token');
144-
localStorage.removeItem('refresh_token');
145-
console.error("회원 탈퇴 완료");
146-
window.location.href = "/api/users/login/"
147-
return
148-
} else {
149-
console.error("탈퇴 중 에러발생");
150-
alert('에러')
151-
return null;
152-
}
153-
} catch (error) {
154-
console.error("오류 발생:", error);
98+
const res = await Auth.deleteData('/api/users/api/signout/');
99+
if (res !== null) {
100+
Auth.clearTokens();
101+
window.location.href = "/api/users/login/";
102+
} else {
103+
alert('에러');
155104
}
156105
}
157106

0 commit comments

Comments
 (0)