June 06, 2021
오늘의집 사이트를 모티브로 은행의집 사이트를 제작했다. 자취하면서 인테리어에 관심갖게 되고 자주 들락날락 했었던 사이트. 우리집 인테리어에 많은 기여를 해줬던 사이트.
1차 프로젝트의 경험으로 2차 업무분장은 금방 할 수 있었다. 이번에는 styled-component를 사용했는데 common.css 와 variable.css 등등을 적용해서 초기세팅하는 부분은 처음에 좀 혼란스러웠다. 헷갈렸던 부분들을 정리해두었다. 👉🏼 styled-components에 대해
BANK HOUSE (은행의 도움을 받아 집을 매매하는 현실을 반영..)
네브에 탭들이 많아서 선택과 집중을 해야 했다. 이커머스 기능은 1차 때 해봤으므로 패스..! 커뮤니티 부분에 집중을 했다. 사용자가 본인 집 인테리어를 직접 올려서 공유하고 소통하는 기능 위주로 구현했다. 메인페이지 구성을 조금 바꿨다. (기존 메인페이지의 배너 부분 + 사진 카테고리페이지)로 구성했다.
프론트 : HTML
, Styled-component
, JavaScript
, React(hooks)
백엔드 : Python
, Django
, Doker
Trello
, Gighub
, Slack
2주 (2021.05.24. ~ 06.04.)
프론트엔드 4명, 백엔드 2명
(내가 기여한 기능 볼드체 표시)
슬라이더 부분은 react-slick 라이브러리를 사용!
필터가 6개가 있다. 필터기능구현보다 해당 필터 선택시 색이 변하는 기능과 초기화 기능
소셜로그인과 일반로그인 기능이 있다.
(gif업데이트)
const timeFromNow = postedTime => {
const today = new Date()
const postedDate = new Date(postedTime)
const minutesDiff = Math.floor(
(today.getTime() - postedDate.getTime()) / 1000 / 60
)
const hourDiff = Math.floor(minutesDiff / 60)
const dayDiff = Math.floor(minutesDiff / 60 / 24)
const monthDiff = Math.floor(minutesDiff / 60 / 24 / 30)
if (minutesDiff < 1) return '방금전'
if (minutesDiff < 60) {
return `${minutesDiff}분 전`
}
if (hourDiff < 24) {
return `${hourDiff}시간 전`
}
if (dayDiff < 31) {
return `${dayDiff}일 전`
}
if (monthDiff < 12) {
return `${monthDiff}달 전`
}
return `${Math.floor(dayDiff / 365)}년 전`
}
//2021-06-01T01:08:38.348Z 값을
//"2021-05-23T23:19:20+0000" 형식으로 변경
const postedDate = date => {
const timeSplit = date.slice(0, 19)
const posted = new Date(`${timeSplit}+0000`)
return timeFromNow(posted.getTime())
}
(gif업데이트)
isBtnOnceClicked
state 를 false로 하고 올리기 버튼을 누를 때 true로 바꿨다.isBtnOnceClicked
가 true && 아래의 selectedCategory
가 비어져있다면 red 로 변경const [selectedCategory, setSelectedCategory] = useState({
description: '',
livingtype: '',
space: '',
size: '',
style: '',
})
<SelectWrapper
isSelected={!!selectedCategory?.[menuName.menuNameValue]}
isBtnOnceClicked={isBtnOnceClicked}
>
<Option
// 생략
/>
))}
</SelectWrapper>
);
}
const SelectWrapper = styled.select`
border: 1px solid
${({ theme, isSelected, isBtnOnceClicked }) =>
!isSelected && isBtnOnceClicked ? 'red' : theme.inputGray};
;<UploadInput
type="file"
name="photo"
id="photo"
accept="image/*"
onChange={onFileInput}
required
/>
const onFileInput = e => {
e.preventDefault()
const reader = new FileReader()
const file = e.target.files[0]
reader.readAsDataURL(file)
reader.onload = () => {
setPreviewURL(reader.result)
setFile(file)
}
}
사진 올리기 기능과 preview!
const onPost = () => {
const selectedInfo = JSON.stringify(selectedCategory)
// 스타일, 평수 등의 data는 JSON문자열로 변환한다.
const categoryData = new FormData()
// FormData 객체를 만든다.
categoryData.append('info', selectedInfo)
categoryData.append('image', file)
// 스타일, 평수 등의 data는 변환한 값을, file data는 변환하지 않은 값을 넣어준다. 'info', 'image'는 백과 값을 맞춰준다.
fetch('API', {
method: 'POST',
headers: {
Authorization: localStorage.getItem('access_token'),
},
body: categoryData,
})
.then(res => res.json())
.then(data => console.log(`data`, data))
history.push(`/`)
}
<form onSubmit={onSubmitComment}>
{' '}
// 댓글달고 submit을 누르면
<CommentInput
type="text"
name="comment"
placeholder="칭찬과 격려의 댓글은 작성자에게 큰 힘이 됩니다 :)"
value={inputValue}
onChange={onChangeCommentInput}
/>
<Register alert={opacity}>등록</Register>
</form>
headers에 토큰을 보내 로그인상태인 사람만 댓글추가 가능.
성공적으로 POST 됐다면 setCommentList를 해서 댓글state 변경
const onSubmitComment = e => {
e.preventDefault()
fetch(`${API}/posts/comments`, {
method: 'POST',
headers: {
Authorization: localStorage.getItem('access_token'),
},
body: JSON.stringify({
post_id: path,
content: inputValue,
}),
})
.then(res => res.json())
.then(res => {
if (res.message === 'SUCCESS') {
fetch(`${API}/posts/comments/${path}`)
.then(res => res.json())
.then(res => setCommentList(res.data))
}
})
}