본문 바로가기
Project/축구모임 홈페이지개발

[축구모임 홈페이지개발] 01/01 개발일지 Nodejs css / MVP Board 디자인, 매치일정 탭 서버 DB 연결

by 한33 2024. 1. 2.

 

 

홈 화면에 남은 마지막 탭인 MVP Board 탭을 css 로 구현했다. 시즌 MVP 를 뽑기위해서 누적된 MVP 포인트와 순위를 보기 위함이다.

        <div class="MvpBoard-Container">
          <div class="MvpBoard-title">
            MVP BOARD
          </div>
          <div class="MvpBoard-menu">
            <div style="width: 20%; text-align: center;">RANK</div>
            <div class="MvpBoard-bar"></div>
            <div style="width: 60%; text-align: center;">NAME</div>
            <div class="MvpBoard-bar"></div>
            <div style="width: 20%; text-align: center;">SCORE</div>
          </div>
          <div class="MvpBoard-area">
            <div class="MvpBoard-area-rank">01</div>
            <div class="MvpBoard-area-name">ㅇㅇㅇ</div>
            <div class="MvpBoard-area-rank">265</div>
          </div>

 

위와 같이 html 코드고, MvpBoard-area 영역이 인원수만큼 복사붙여넣기를 했다.

근데 개발일지를 쓰다보니 반복문으로 그냥 만들어도 괜찮겠다는 생각이 들었다.

아직 디자인만 해놓은 상황이라서 서버랑 js 로 기능을 구현할 때 시도해봐야겠다.

 

.MvpBoard-Container {
    margin-top: 50px;
    width: 95%;
    margin: 30px auto 100px auto;

}

.MvpBoard-title {
    color: white;
    font-size: 300%;
    font-weight: 800;
    text-align: center;
    margin-bottom: 5px;
}

.MvpBoard-menu {
    background-color: white;
    display: flex;
    color: #002832;
    font-size: 120%;
    font-weight: 500;
    padding: 10px 0px 10px 0px;
    margin-bottom: 20px;
}

.MvpBoard-bar {
    width: 1px;
    background-color: #002832;
}

.MvpBoard-area {
    color: #002832;
    font-size: 120%;
    font-weight: 500;
    text-align: center;
    display: flex;
    margin-bottom: 5px;

}

.MvpBoard-area-rank {
    width: 20%;
    background-color: #002832;
    padding: 10px 0px 10px 0px;
    color: white;
    border: 2px solid white;

}


.MvpBoard-area-name {
    width: 60%;
    background-color: white;
    padding: 10px 0px 10px 0px;

}


@media only screen and (max-width: 1000px) {
    .MvpBoard-title {
        font-size: 200%;
    }

    .MvpBoard-menu {
        font-size: 80%;
        padding: 5px 0px 5px 0px;
        margin-bottom: 10px;
    }

    .MvpBoard-area {
        font-size: 80%;
        font-weight: 500;  
        margin-bottom: 3px;
 
    }

    .MvpBoard-area-rank {
        width: 20%;
        padding: 5px 0px 5px 0px;
   
    }
   
    .MvpBoard-area-name {
        width: 60%;
        padding: 5px 0px 5px 0px;
    }
  }

 

MVP Board 탭의 css코드.

 


 

매치일정 탭이다. 얼마 전에 삼성 플립 유저들이 작은 화면으로 접속할 때 장소 안내글씨가 아래로 밀리는 현상이 있어서 이를 플립 전용으로 하나 짰는데, 넓은 화면으로 접속할 때 역시 아래로 밀리는 현상이 발견됐다.

플립이 문제다 ㅜ 추가로 플립으로 볼 때 경기일정에서 오늘도골대FC 폰트 사이즈 줄여야하고 2자리수 득점 - 2자리수 득점 같은 경우에도 화면 구성이 밀리니까 확인하고 수정하자.

        <div class="main-planmatch-datefont">
          24. <%=매치일정[0].month %>. <%=매치일정[0].date %> (금)
        </div>

        <div class="planmatch-result-area">
          <div class="planmatch-result-vs">
            vs
          </div>
          <div class="planmatch-result-scorebox">
            <div class="planmatch-result-teamarea1">
              <div>
                <img class="planmatch-result-scorebox-teamlogo1"
                  alt="오늘도골대FC로고">
              </div>
              <div class="planmatch-result-teamfont">
                오늘도골대FC
              </div>
            </div>
            <div class="planmatch-time">
              <%=매치일정[0].time %>-<%=매치일정[0].timeto %>
            </div>
            <div class="planmatch-result-teamarea2">
              <div>
                <img class="planmatch-result-scorebox-teamlogo2"
                  alt="상대팀로고">
              </div>

              <div class="planmatch-result-teamfont">
                <%=매치일정[0].awayteam%>
              </div>
            </div>
          </div>

          <div class="planmatch-place">
            <img class="planmatch-place-logo"
              alt="place">
            <div>
              <%=매치일정[0].place %>
            </div>
            <div onclick="copyToClipboard()" class="planmatch-place-copy" id="planmatch-place-copy">
              복사
            </div>
          </div>

        </div>

 

원래 서버에서 /navi 엔드포인트를 통해서 네이버 지도로 확인하는 기능을 넣었었는데, 아래 이미지와 같이 그냥 이번 주 매치에 대한 정보를 입력할 때 한번에 주소값까지 넣게 해서 하나의 MongoDB 영역에서 정보들을 관리하고 불러올 수 있게 시스템을 수정해줬다.

 

 

      <form class="form-box" action="/match-plan" method="POST">
      <div>
        <h4>이번 주 매치</h4>
        <div>
          24년
          <input class="management-input" type="text" name="planmonth" placeholder="00">
          <input class="management-input" type="text" name="plandate" placeholder="00">
          <br>
          시간 : <input class="management-input2" name="plantime" type="text" placeholder="00:00"> - <input class="management-input2" name="plantimeto" type="text" placeholder="00:00">
          <br>
          상대팀명 : <input class="management-input3" type="text" name="planawayteam" placeholder="상대팀명">
          <br>
          장소 : <input class="management-input3" type="text" name="planplace" placeholder="풋살구장 이름">
        </div>
      </div>
      <div>
        <div style="height: 160px;">
          주소 : <input id="navi_address" style="width: 200px;" name="planaddress" type="text" placeholder="주소">
          <div>현재 저장된 주소 : <%=매치일정[0].address%>
          </div>
          <button type="submit">등록</button>
        </div>
      </div>
      </form>

 

placeholder = "" 속성을 이용해서 입력시에 원하는 식으로 입력을 할 수 있게 유도했다.

 

app.post('/match-plan', async (req, res) => {
  let result = db.collection('matchplan').insertOne({
    month: req.body.planmonth,
    date : req.body.plandate,
    time : req.body.plantime,
    timeto : req.body.plantimeto,
    awayteam : req.body.planawayteam,
    place : req.body.planplace,
    address : req.body.planaddress
  })
  res.redirect('/')
})

 

app.get('/', async (req, res) => {

  let result = await db.collection('mvp').find().sort({ _id: -1 }).limit(1).toArray();
  let Weeklymvp = result.length > 0 ? result[0].mvp : null;
  let match_result = await db.collection('result').find().sort({ _id: -1 }).toArray();
  let matchplan = await db.collection('matchplan').find().sort({ _id: -1 }).toArray();

  res.render('home.ejs', { MVP: Weeklymvp, 매치일정: matchplan, result : match_result });
})

 

개발일지를 쓰면서 또 생각이 든건데, 위에서 보면 mvp 데이터를 가져올 때 limit(1) 속성을 이용해서 DB 로 부터 가장 최근의 값만 가져왔다.

match_result 같은 경우는 홈 화면에서 최근 3개의 매치를 가져와야해서 속성을 안넣었는데, 결국 데이터가 쌓이다보면 싹 다 가져와서 그 중 3개를 html 상에서 처리하는 것 보다 애초에 불러올 때 3개만 가져와서 처리하는 게 더 속도면에서 이득을 볼 수 있지 않을까 하는 생각이 들었다.

마찬가지로 matchplan 같은 경우는 가장 최근 1개의 데이터만 있으면 되기 때문에 limit(1) 을 넣어봐야겠다.