시작하자마다 팀원이 정해지고 바로 미니 프로젝트를 시작하게 되었다.
처음에 역할 배정이되고 무엇을할지 몰르고 git도 쓸지 몰라 당황 하고 다른 팀원들의 무슨말을 하는지 잘 이해가 되지 않았다.
그래서 기본적으로 제공해주는 git 강의를 들을려고 했지만 너무 길어 문서만 쭉 보고 대충 이해하니 어느정도 쓸 수 있었다
처음 브랜치 하는법을 잘 몰라 팀원들 전부 처음부터 다 브랜치를 만들었다
github 주소 : 여기로 이동해서 볼 수 있다
-> html + css layout이 어느정도 정해지고 브랜치 해가서 기능 만들고 기능 붙여야 틀은 같은 상태에서 기능이 추가되는거라 충돌이 잘 안일어날것 같다
편하게 파이참에서 flask 같은 패키지 쉽게 불러왔는데 VScode로 진행 하면서 venv 설치와 패키지 설치를 터미널로 진행하게 되어서 힘들었다.
다음에 또 쓸 수 있도록 여기 남겨둔다
venv 설치
https://it4edu.tistory.com/160
python 깔고
ctrl + ` 터미널 열어 cmd로
python -m venv venv(이름)
ctrl + shift + p python interpreter 설정
가성활경 이름 딸린걸로
flask 설치
python3 -m pip install --upgrade pip
python3 -m pip install flask
디버그 json 만들기
flask snippets 설치
이상 등등이 있다
자료 강의를 듣다가 소스트리를 이용해서 사용하다 보니 어디서 문제가 생긴지 모르겠다
그래서 터미널을 이용해서 쓰기로 했고 명령어는 여기 두고 두고두고 쓰겠다
git init - 파일 git으로 설정하기
git status 지금 어디 인지 확인할때
git 연결 ---
git config --global user.name ID값
git config --global user.email email@gmail.com
git remote add origin 깃저장소(주소 복사)
git add . 모두 커밋
-> git status 하면 파일 스테이징 됬는지 확인
컷밋하기 (메세지 붙여서)
git commit -m "메세지 내용"
git log 커밋한 id 값 나중에 전 버전으로 이동 가능
브랜치만들기 -----
git checkout 커밋 id (커밋아이디로 가기)
git branch 이름 (복사본 만듬)
git branch -v (확인)
git checkout 이름(이동하고픈 브랜치명)
git push origin main (메인에 올리기)
https://gorokke.tistory.com/22 참고하기 여기는 더 많이 있다
문제 오류 발생시 그걸 캡쳐하고 복사해서 저장해서 해결방법을 적어둬야하는데
이미 많은걸 수정하고 고쳐냈지만 어떤 문제였는지 모르겠다 이후에 하루에 하나씩 글을 쓰겠다
@app.route("/save_card", methods=["POST"])
def card_save():
token_receive = request.cookies.get('mytoken')
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
userinfo = db.account.find_one({'id': payload['id']}, {'_id': False})
type_receive = request.form['type_give']
url_receive = request.form['url_give']
comment_receive = request.form['comment_give']
short_title_receive = request.form['short_title_give']
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get(url_receive, headers=headers)
soup = BeautifulSoup(data.text, 'html.parser')
try:
title = soup.select_one(f'meta[property="og:title"]')['content']
image = soup.select_one(f'meta[property="og:image"]')['content']
desc = soup.select_one(f'meta[property="og:description"]')['content']
number = int(uniform(1.0, 10.0) * 10000000000)
doc = {
'username': userinfo['id'],
'short_title': short_title_receive,
'title': title,
'image': image,
'desc': desc,
'type': type_receive,
'comment': comment_receive,
'num': number,
'url': url_receive
}
db.cardlist.insert_one(doc)
except:
title = short_title_receive
image = soup.select_one(f'meta[property="og:image"]')['content']
desc = '내용 요약은 따로 없습니다'
number = int(uniform(1.0, 10.0) * 10000000000)
doc = {
'username': userinfo['id'],
'short_title': short_title_receive,
'title': title,
'image': image,
'desc': desc,
'type': type_receive,
'comment': comment_receive,
'num': number,
'url': url_receive
}
db.cardlist.insert_one(doc)
return jsonify({'msg': "저장완료"})
처음엔 if문을 통해 값이 없으면 고쳐 보려 했지만 잘 되지않고 오류예외처리를 통해 구현을 해놨다. 쿠키의 id 값을 받아와 게시글이 로그인 했을때 자기 페이지에서 자기글을 보기 위해 id값을 가져와 넣어주었다
@app.route('/mypost/<userid>')
def mypost(userid):
token_receive = request.cookies.get('mytoken')
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
status = (userid == payload['id'])
user_info = list(db.cardlist.find({'username': userid }, {'_id': False}))
return render_template('mypost.html', status=status,user_info=user_info, token_receive=token_receive)
except jwt.ExpiredSignatureError:
return redirect(url_for('main', msg='로그인 시간이 만료되었습니다.'))
except jwt.exceptions.DecodeError:
return redirect(url_for("main", msg="로그인 정보가 존재하지 않습니다."))
이사이트에서 내가 쓴 게시글만 볼수 있다
토큰 값을 가져와서 디코드한 후 DB에서 id값으로 같은것만 불러와서 저장하고 render에 user_info로 넘겨주고 status가 true일때 게기글을 불러오기를 만들어 주었다
html중
{% if status %}
{% for card in user_info %}
{% set short_title =card['short_title'] %}
{% set image = card['image']%}
{% set comment = card['comment'] %}
{% set num = card['num']%}
{% set url =card['url'] %}
<div class="col">
<div class="card h-100">
<img src="{{ image }}" class="card-img-top in_card_image" alt="...">
<div class="card-body">
<h5 class="card-title" data-bs-toggle="modal" data-bs-target="#staticBackdrop"
onclick="openmodalDel({{ num }})">{{ short_title }}</h5>
<p class="card-text " data-bs-toggle="modal" data-bs-target="#staticBackdrop"
onclick="openmodalDel({{ num }})" id="show">{{comment}}</p>
</div>
</div>
</div>
{% endfor %}
{% endif %}
이부분에서 jinja2를 이용해서 게시글 불러오기를 해보았다, 다른 사이드렌더링에서는 ajax를 이용해서 불러왔다
function show_card() {
$.ajax({
type: "GET",
url: "/showcard",
data: {},
success: function (response) {
let cardlist = response["all_card"];
for (let i = 0; i < cardlist.length; i++) {
let num = cardlist[i]["num"];
let title = cardlist[i]["short_title"];
let comment = cardlist[i]["comment"];
let url = cardlist[i]["url"];
let image = cardlist[i]["image"];
let temp_html = `<div class="col">
<div class="card h-100">
<img src="${image}" class="card-img-top in_card_image" alt="...">
<div class="card-body">
<h5 class="card-title" data-bs-toggle="modal" data-bs-target="#staticBackdrop" onclick="openmodal(${num})">${title}</h5>
<p class="card-text " data-bs-toggle="modal" data-bs-target="#staticBackdrop" onclick="openmodal(${num})" id="show" >${comment}</p>
</div>
</div>
</div>`;
$("#card_list").append(temp_html);
}
},
});
}
이게 ajax 쓴 방식이다 전체적인 코드수를 줄일때 jinja2를 쓰는게 좋았지만
상황에 맞게 둘을 섞어서 쓰면 좋을 것 같다
처음에 모달이 먼지 몰랐다
그래서 찾아보았고 부트스트랩에서 찾아냈고 코드를 복사했지만
하나의 모달만 써서 조금 꼬일수 있는 위험이 있었다
<!-- Modal -->
<div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1"
aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">추가해tHub</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div id="modal">
<h1></h1>
</div>
<div id="delete"></div>
<div style="padding-top: 20px;" id="commentWrap">
<h3>댓글</h3>
<hr>
<ul id="commentsList">
</ul>
</div>
</div>
<div class="modal-footer">
</div>
{%if token_receive%}
<div class="input-group mb-3" id="commentBox">
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" id="button-addon2"
onclick="comments()">작성</button>
<input type="hidden" value="{{username}}" id="commentUserName">
</div>
</div>
{%endif%}
<div class="modal-footer">
<button id="newpost" onclick="savedata()" type="button" class="btn btn-dark">기록하기</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" onclick="deleteCommentBox()">Close</button>
</div>
</div>
</div>
</div>
요것이 메인 페이지의 모달 내용이다
저기서 id="modal"에 해당 게시물 내용을 넣었다
이후 추가하기를 누러면 게시글을 쓸수 있는 내용으로 바뀌게 만들었다.
function openmodal(num) {
// 모달이 열릴 때 댓글 불러오기
$(document).ready(function () {
$('#commentsList').empty()
listComments(num);
$('#newpost').hide()
$('#commentWrap').show();
$('#commentBox').show();
});
$('#modal').empty()
$.ajax({
type: "POST",
url: "/openmodal",
data: {
num_give: num
},
success: function (response) {
let cardlist = response['select_card']
let comment = cardlist['comment']
let short_title = cardlist['short_title']
let title = cardlist['title']
let desc = cardlist['desc']
let url = cardlist['url']
let image = cardlist['image']
let num = cardlist['num']
// 모달 열릴 때 댓글박스 html 태그 변수
let temp_commentBox = `
<input type="text" class="form-control" id="commentInput" placeholder="내용을 입력하세요"
aria-label="내용을 입력하세요" aria-describedby="button-addon2" style="margin-right: 15px;">
<input type="hidden" value="${num}" id="numOfCard">
`
let temp_html = `<div>
<img src="${image}" class="card-img-top in_modal_image" alt="...">
<div class="card-body">
<h5 class="card-title">${title}</h5>
<p class="card-text"> ${comment}</p>
<p class="card-text">${desc}</p>
<a href="${url}" target="_blank" class="btn btn-primary">페이지로 이동</a>
</div>
</div>`
$('#staticBackdropLabel').text(short_title)
$('#modal').append(temp_html)
$('#commentBox').prepend(temp_commentBox)
}
})
}
여기서 게시물 불러올때 num을 가져왔고 그 num을 이용해서 해당 게시물을 불러왔다
나는 여기서 num이 아니라 _id값을 가져와서 쓰고 싶었는데 이 기능을 1일차에 만들어서
_id 값을 변환하는 방법을 찾다가 막막해서 난수로 줘서 해결했다.
이후 다른 팀원이 나중에 _id 값을 쓰는것을 보고 코드 리뷰하고 내것으로 만들어 보겠다
이게 참 바닐라js로 만들기 어려워 보였다, Badel?를 쓰라고 하는데 먼지 모르겠다 다음주에 Reat를 배우니 그때 따로 구현해 보겠다.
강의에서 좋아요 구현이 있어서 따라해볼려고 했는데 생각보다 어렵고 해서 강의 다시 찾아볼 예정이다.
다른 조 주소 입력하면 지도랑 띄워주는게 참 신기했는데 카카오 네이버 지도 API를 쓴다고 하니 되게 쉬워 보였다 개발자로 전향하면서 만들고 싶은 앱이 있었는데 나중에 써보겠다.