개발 인원은 프론트엔드 4명, 백엔드 2명
- Front-End : React.js, sass, slick, react-modal
- Back-End : Python, Django web framework, Beautifulsoup, Selenium, Bcrypt, My SQL
- Common : KAKAO social login, AWS(EC2,RDS), RESTful API
프로젝트를 하면서 기억에 남는 그리고 절대 잊을 수 없는 코드를 나열해보도록 하자
// 무한 스크롤 구현
infiniteScroll = () => {
let scroolHeight = Math.max(
document.documentElement.scrollHeight,
document.body.scrollHeight
);
let scrollTop = Math.max(
document.documentElement.scrollTop,
document.body.scrollTop
);
let clientHeight = document.documentElement.clientHeight;
if (scrollTop + clientHeight + 1 > scroolHeight) {
this.setState({
scrolling: !this.state.scrolling,
preItems: this.state.items,
items: this.state.items + 25
});
this.getCardList();
}
};
getCardList = () => {
fetch(`${SERVER_URL}/card/dailylook`)
.then(res => res.json())
.then(res => {
this.setState({
cardList: this.state.cardList.concat(
res.card_list.slice(this.state.preItems, this.state.items)
),
scrolling: !this.state.scrolling
});
});
};
<script src="//developers.kakao.com/sdk/js/kakao.min.js"></script>
// SDK 로드
!window.Kakao.Auth && window.Kakao.init("키");
// 초기설정
// 회원가입 부분 코드
signinWithKakao = () => {
window.Kakao.Auth.login({
success: authObj => {
this.setState(
{
kakaoToken: authObj.access_token
},
() => {
fetch(`${SERVER_URL}/user/kakao/sign-in`, {
method: "GET",
headers: {
Authorization: this.state.kakaoToken
}
})
.then(res => res.json())
.then(res => {
if (res.user_info) {
localStorage.setItem("kakao_id", res.user_info.kakao_id);
localStorage.setItem("kakao_email", res.user_info.email);
this.props.history.push("/signupinfo");
}
});
}
);
},
fail: function(err) {
console.log("에러", err);
}
});
};
// 사진을 선택하면 url 경로 따로 파일객체 따로 저장하는 부분
handleChangeFile = e => {
const file = e.target.files[0];
const reader = new FileReader();
reader.readAsDataURL(file);
this.setState(
{
url: e.target.files[0]
},
() => {
this.handlePost();
}
);
reader.onloadend = e => {
this.setState(
{
imgUrl: e.target.result
},
() => {
this.setState({
visiList: this.state.visiList.concat(this.state.imgUrl)
});
}
);
};
};
// 사진을 직접적으로 백엔드와 통신해서 formData 규격에 맞게 전송하는 코드
handlePost = () => {
const formData = new FormData();
formData.append("filename", this.state.url);
fetch(`${SERVER_URL}/card/upload/image`, {
method: "POST",
headers: {
Authorization:
"토큰"
},
body: formData
})
.then(res => res.json())
.then(res =>
this.setState({
resultList: this.state.resultList.concat(res.image_url_list)
})
)
.then(res => console.log(this.state.resultList));
};
<label for="upload_file" onChange={this.handleChangeFile}>
<div className="plus_icon" />
<input
type="file"
id="upload_file"
name="myFile"
accept=".png, .jpg, .jpeg"
/></label>
// 사진이 여러장 업로드 되는데 X버튼을 이용해 하나하나 삭제하는 기능
onClick={() => {
delete this.state.visiList[idx];
delete this.state.resultList[idx];
}}
import Modal from "react-modal";
Modal.setAppElement("#root");
class CardModal extends Component {}
ReactDOM.render(<CardModal />, document.querySelector("#root"));
export default withRouter(CardModal);
{this.state.select === `${idx} img_hover` ? (
<div className={`${idx} img_hover`}>
<div className="like"></div>
<div className="comment"></div>
<div className="share"></div>
<div className="more"></div>
</div>
) : (
""
)}