상세 컨텐츠

본문 제목

투두완성

카테고리 없음

by bumychoi 2024. 4. 16. 12:22

본문

from flask import Flask,render_template,jsonify,request
from pymongo import MongoClient
from bson.objectid import ObjectId


client = MongoClient("")
db=client.ex

app=Flask(__name__)

@app.route('/post', methods=["POST"])
def post_todo():
    content_receive = request.form["content_give"]
    date_receive = request.form["date_give"]
    doc = {
        "content":content_receive,
        'check':"false",
        "date":date_receive
    }
    db.todos.insert_one(doc)

    return jsonify({"msg": content_receive})

@app.route("/")
def home():    
    return render_template("home.html",title="main")

@app.route("/list",methods=['GET'])
def list_todo():
    date = request.args.get("date")

    contents = list(db.todos.find({'date':date}))
    for content in contents:
        content['_id']=str(content['_id'])

    return jsonify({"result": contents})

@app.route('/modify', methods=["POST"])
def modify_todo():
    id_receive = request.form["id_give"]
    content_receive = request.form["content_give"]
    id_receive = ObjectId(id_receive)
    db.todos.update_one({'_id':id_receive},{'$set':{"content":content_receive}})

    return jsonify({"msg":"수정완료"})

@app.route("/delete",methods=["POST"])
def delet_todo():
    id_receive = request.form["id_give"]
    id_receive = ObjectId(id_receive)
    db.todos.delete_one({'_id':id_receive})

    return jsonify({"msg":"삭제완료"})


@app.route('/check', methods=["POST"])
def check_todo():
    id_receive = request.form["id_give"]
    check_receive = request.form["check_give"]
    id_receive = ObjectId(id_receive)
    db.todos.update_one({'_id':id_receive},{'$set':{"check":check_receive}})

    return jsonify({"msg":"체크완료"})

if __name__ == "__main__":
    app.run(debug=True ,port=5001)

 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{title}}</title>
    <style>
        html,
        body,
        h1,
        h2,
        h3,
        div,
        span,
        a,
        button,
        input {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            background-color: aquamarine;
        }

        .wrap {
            background-color: azure;
            width: 350px;
            height: 750px;
            margin: auto;
        }

        .flex-row {
            display: flex;
            flex-direction: row;
            align-items: center;
            justify-content: center;
        }

        .flex-col {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }

        .wrap-todo {
            padding: 16px;
        }

        h1 {
            font-size: 18px;
            margin: 16px auto 20px 0px;
        }

        .todo {
            padding: 16px;
            background-color: antiquewhite;
            border-radius: 8px;
            width: 300px;
            height: 50px;
            margin-bottom: 8px;
        }

        .todo-content {
            margin-right: auto;
            margin-left: 8px;

        }

        .todo>span {
            margin-right: auto;
            margin-left: 8px;
        }

        .todo>input {
            zoom: 1.5;
            background-color: transparent;
            border: none;
        }

        .add-form {
            padding: 16px;
            background-color: antiquewhite;
            border-radius: 8px;
            width: 300px;
            height: 50px;
            border: 1px solid goldenrod;
            display: none;

        }

        .add-form-btns {
            margin: auto;
        }

        .add-form>input {
            background-color: transparent;
            border: none;
            font-size: 14px;

        }

        .add-form>input:focus-visible {
            outline: none;
        }

        .add-btn {
            padding: 16px;
            background-color: transparent;
            border-radius: 8px;
            width: 300px;
            height: 50px;
            border: 1px dashed red;
            cursor: pointer;

        }

        .add-btn>span {
            margin-bottom: 3px;
            zoom: 1.5;
        }

        .add-btn>button {
            margin-left: 8px;
            margin-right: auto;
            background-color: transparent;
            border: none;
            cursor: pointer;
        }

        .add-form-btns {
            margin-left: auto;
        }

        .add-form-btns>button {
            margin: 0px 4px;
            background-color: transparent;
            border: none;
            cursor: pointer;
            font-size: 12px;
            font-weight: 600;
        }

        .todo-content-modify>input {
            border: none;
            background-color: transparent;
            margin-left: 8px;
            margin-right: auto;
            font-size: 16px;
            color: blueviolet;
            width: 160px;
        }

        .todo-content-modify>input:focus-visible {
            outline: none;
        }

        .todo-content-modify>button {
            background-color: transparent;
            border: none;
            margin: 0px 8px;
            cursor: pointer;
            font-size: 11px;
        }

        .todo>button {
            background-color: transparent;
            border: none;
            cursor: pointer;
            font-weight: 600;
            font-size: 11px;
            color: brown;
        }
        .calendar{
            background-color: rgb(240, 181, 63);
        }
        .calendar>h2{
            margin: 16px 0;
        }
        .days{
            display: grid;
            grid-template-columns: repeat(7,1fr);
            grid-gap: 18px ;
            margin-bottom: 20px;
        }
        .days>div{
            width: 30px;
            height: 30px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
        }
        .red{
            color: red;
        }
        .blue{
            color: blue;
        }
        .date{
            display: grid;
            grid-template-columns: repeat(7,1fr);
            grid-gap: 18px ;
            margin-bottom: 20px;
        }
        .date>div{
            width: 30px;
            height: 30px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            cursor: pointer;
        }
        .date > div.clicked{
            background-color: gold;
            border-radius: 50%;
            color: blue;
            }
    </style>
    <script>
        let date_clicked;

        $(document).ready(() => {
           
            loadCalendar()
            todayclicked()
        })
        function loadCalendar(){
            let today = new Date()
            let year = today.getFullYear()
            let month =today.getMonth()+1
            $("#this-month").text(`${year}${month}월`)
            let first_day = (new Date(year,month-1,1)).getDay()
            let last_day = (new Date(year,month,0)).getDate()

            for(let i =0; i<first_day; i++){
                    let temp_html="<div></div>"
                    $(`#date`).append(temp_html)
            }
            for(let i=0; i<last_day; i++){
                let id =`${year}-${month}-${i+1}`

                let target_day = (new Date(year,month-1,i+1)).getDay()
                let color =''
                if (target_day ==0){
                    color="red"
                }
                else if (target_day==6){
                    color='blue'
                }

                let temp_html=`<div class="${color}" onclick="addClicked('${id}')" id=${id}>${i+1}</div>`
                $(`#date`).append(temp_html)

            }            
        }
        function addClicked(id){
            $('#date>div').removeClass('clicked')
            $(`#${id}`).addClass('clicked')
            $(`#today-todo`).text(`${id}=>오늘의 할일`)
            date_clicked = id;
           
            listContent();

        }
        function showAddForm() {
            $("#add-form").css("display", "flex");
            $("#add-btn").hide();
        }
        function todayclicked(){
            let  today = new Date();
            let year = today.getFullYear()
            let month =today.getMonth()+1
            let date = today.getDate()
            let id = `${year}-${month}-${date}`
            // console.log(id)
            $(`#${id}`).trigger('click');
        }
        function hideAddForm() {
            if (confirm("정말 취소하겠습니까?.")) {
                $("#add-form").hide();
                $("#add-btn").css("display", "flex");
            }
        }
        function addContent() {
            let content = $("#content").val();
            let formData = new FormData()
            formData.append("content_give", content)
            formData.append("date_give",date_clicked)

            fetch('/post', { method: "POST", body: formData }).then(res => res.json()).then(data => {
                alert(data["msg"])
                window.location.reload()
            })

        }
        function listContent() {
            let date= date_clicked;
            let url = `/list?date=${date}`

            fetch(url).then(res => res.json()).then(data => {
                let rows = data['result'];
                $("#todos").empty()
                rows.forEach((row) => {
                    let content = row["content"]
                    let _id = row['_id']
                    let check = row['check']
                    // console.log(check)
                    let text_checked = ''
                    let txt_style = ''
                    if(check == "true"){
                        text_checked ="checked"
                        txt_style = "style='text-decoration:line-through'"
                    }

                    let temp = `<div id="${_id}" class="todo flex-row">    
                                    <input ${text_checked} type="checkbox"  onchange="checkContent('${_id}')">
                                    <span ${txt_style} onclick="showUpdataForm('${_id}')" class="todo-content">${content}</span>
                                    <button onclick="deleteContent('${_id}')">삭제</button>
                                    <div style="display:none;" class="todo-content-modify flex-row">
                                        <input value="${content}" type="text">
                                        <button onclick="modifyContent('${_id}')">수정</button>
                                        <button onclick="hideUpdataForm('${_id}')">취소</button>
                                    </div>
                                </div>
                    `
                    $("#todos").append(temp)
                })
            })
        }
        function showUpdataForm(_id) {
            $(`#${_id} > span`).hide();
            $(`#${_id}>button`).hide();
            $(`#${_id}>input`).hide();
            $(`#${_id} > div`).css("display", "flex")
        }
        function hideUpdataForm(_id) {
            $(`#${_id} > span`).show()
            $(`#${_id}>button`).show();
            $(`#${_id}>input`).show();
            $(`#${_id} > div`).hide()
        }
        function modifyContent(_id) {
            let new_content = $(`#${_id}>div>input`).val()
            let formData = new FormData()
            formData.append("id_give", _id)
            formData.append("content_give", new_content)

            fetch('/modify', { method: "POST", body: formData }).then(res => res.json()).then(data => {
                alert(data["msg"])
                window.location.reload()

            })
        }
        function deleteContent(_id) {
            let formData = new FormData()
            formData.append("id_give", _id)
            fetch('/delete', { method: "POST", body: formData }).then(res => res.json()).then(data => {
                alert(data["msg"])
                window.location.reload()

            })
        }
        function checkContent(_id) {
            let is_checked = $(`#${_id}>input`).is(':checked');
            let formData = new FormData()
            formData.append("id_give", _id)
            formData.append("check_give", is_checked)

            fetch('/check', { method: "POST", body: formData }).then(res => res.json()).then(data => {
                alert(data["msg"])
                window.location.reload()
            })
        }
       
    </script>
</head>

<body>
    <div class="wrap">
        <div class="calendar flex-col">
            <h2 id="this-month" onclick="todayclicked()">2024-04-15</h2>
            <div class="days flex-row">
                <div class="red"></div>
                <div></div>
                <div></div>
                <div></div>
                <div></div>
                <div></div>
                <div class="blue"></div>
            </div>
            <div id="date" class="date flex-row">

            </div>
        </div>
        <div class="wrap-todo flex-col">
            <h1 id="today-todo">오늘의 할일</h1>
            <div id="todos" class="todos flex-col">
            </div>
            <div id="add-form" class="add-form flex-row">
                <input id="content" type="text">
                <div class="add-form-btns flex-row">
                    <button onclick="addContent()">저장</button>
                    <button onclick="hideAddForm()">취소</button>
                </div>
            </div>
            <div id="add-btn" onclick="showAddForm()" class="add-btn flex-row">
                <span>+</span>
                <button>추가하기</button>
            </div>
        </div>
    </div>

</body>

</html