Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
db.js
129 changes: 128 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,128 @@
# Boost
<<<<<<< HEAD
# 선거 시스템

### 1주차 과제

1. 회원가입/로그인/로그아웃
2. 회원가입 시 지역 설정
-> 지역 별로 후보 다르게 뜨게 하기
3. 자기가 가입한 지역에서 후보 등록(신청) 가능
-> 허가 받을 필요 X(추후 과제로 나갈 예정)
-> 즉 후보 등록 신청을 하기만 하면 다 후보에 오를 수 있음
4. 투표 작동 (투표 표수 반영X 결과 표기될 필요X)
-> 예를 들어, 체크 표시 칸 안에 클릭만 되게 하기 등

##### 기본 세팅

###### 필요한 패키지 설치

npm init -y //

npm install express mysql2 bcryptjs jsonwebtoken body-parser

###### 데이터베이스 생성

회원가입을 하는 users 테이블

후보에 등록하면 저장되는 candidates 테이블

##### 메인화면

###### 모듈 기본 설정

const express = require("express"); // 웹을 쉽게 구축

const session = require("express-session"); //사용자의 상태정보를 서버에 저장

const bodyParser = require("body-parser"); //클라이언트가 보내는 요청의 본문을 쉽게 파싱

const FileStore = require("session-file-store")(session); // 세션데이터를 파일 시스템에 저장할 수 있게 해줌

그 외 라우터들 설정

##### 회원가입

화면 레이아웃의 경우 아래 링크의 템플릿을 참고함

https://sirius7.tistory.com/59

// 회원가입 화면

router.get("/register", function (request, response) {

var title = "회원가입";

var html = template.HTML(

title,

"내용"

);

response.send(html);

});

/register 경로에 get 요청이 들어오면 함수 실행 → 회원 가입 페이지 실행됨

##### 로그인

/login_process 경로에 post 요청이 들어오면 함수 실행 → 입력한 아이디와 비밀번호가 db에 있는지 확인

##### 로그아웃

/logout 경로에 get 요청이 들어오면 로그아웃 실행

→ 로그아웃 시 get 함수가 사용됨을 알게되었다

##### 후보등록

- 개선할 점

후보 등록 시 후보를 등록하려는 사람의 로그인 정보와 동일한 지역의 후보로만 출마할 수 있도록 설정하고 싶었는데 로그인 정보를 연결하는데 실패

→ 로그인한 회원의 지역 정보를 어떻게 불러오는지 모르겠음

##### 투표

- 지역 선택

db에 존재하는 후보들의 지역 이름이 테이블의 형태로 제시되도록 함

후보가 없는 지역은 제시되지 않음

지역을 선택하면 해당 지역에 있는 후보를 투표할 수 있는 페이지로 넘어감

- 후보 선택 후 투표

해당 지역에 출마한 후보들이 나오고 체크박스 선택 후 투표 버튼 누르면 투표 완료

##### 1주차 정리

- 회원가입과 로그인 페이지는 누군가 작성한 템플릿을 인용하여 예쁜데, 나머지 부분은 기본이라 예쁘지 않음…. 예쁘게 꾸미는 방법은 추후에 보강 예정

- 후보 등록시 로그인 정보 연결하는 방법 찾아보기

- node.js 실행은 $node main.js 이고 localhost3000 페이지 들어가기

- readme는 어떻게 꾸미는 거죠.....?

- git 연결 방법

`git init`

`git remote origin add (레포주소)`

`git checkout -b 브랜치이름`

`git add .`

`git commit -m “ ”`

`git push`

까먹지 좀 말자……
=======
# Boost
>>>>>>> fd8b8fb2af7b0068964d7c494639ebe92279ea10
53 changes: 53 additions & 0 deletions lib_candidate/candidates.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
const express = require("express");
const router = express.Router();
const db = require("../db.js");

// 후보 등록 페이지
router.get("/register", (req, res) => {
res.send(`
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>후보 등록</title>
</head>
<body>
<h1>후보 등록</h1>
<form action="/candidates/register" method="POST">
<input type="text" name="name" placeholder="후보 이름" required>
<input type="text" name="region" placeholder="지역" required>
<button type="submit">등록</button>
</form>
</body>
</html>
`);
});

// 후보 등록 처리
router.post("/register", (req, res) => {
const { name, region } = req.body;

// 로그인한 사용자의 지역 정보 가져오기
const userRegion = req.session.region; // 세션에서 사용자 지역 정보 가져오기

if (!name || !region) {
return res.status(400).send("모든 필드를 입력해야 합니다.");
}

// 사용자의 지역과 후보 등록 지역 비교
if (userRegion !== region) {
console.log(`사용자의 지역: ${userRegion}, 후보 등록 지역: ${region}`); // 콘솔에 지역 정보 출력
return res.status(403).send("자신의 지역에서만 후보 등록이 가능합니다.");
}

const query = "INSERT INTO candidates (name, region) VALUES (?, ?)";
db.query(query, [name, region], (err) => {
if (err) {
return res.status(500).send("후보 등록 실패");
}
x;
res.send("후보 등록 완료");
});
});

module.exports = router;
128 changes: 128 additions & 0 deletions lib_candidate/votes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
const express = require("express");
const router = express.Router();
const db = require("../db"); // db 연결 모듈

// 지역 선택 페이지
router.get("/", (req, res) => {
// 모든 지역 목록을 가져오는 쿼리
const query = "SELECT DISTINCT region FROM candidates";
db.query(query, (err, results) => {
if (err) {
return res.status(500).send("지역 조회 실패");
}

// 지역 목록을 HTML 테이블로 생성
let regionRows = results
.map(
(region) => `
<tr>
<td><a href="/votes/${region.region}">${region.region}</a></td>
</tr>
`
)
.join("");

// 최종 HTML 응답
res.send(`
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>투표하기 - 지역 선택</title>
<style>
table {
width: 100%;
border-collapse: collapse;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
</style>
</head>
<body>
<h1>투표할 지역을 선택하세요</h1>
<table>
<thead>
<tr>
<th>지역</th>
</tr>
</thead>
<tbody>
${regionRows}
</tbody>
</table>
</body>
</html>
`);
});
});

// 특정 지역의 후보 페이지
router.get("/:region", (req, res) => {
const region = req.params.region;

// 특정 지역의 후보 조회
const query = "SELECT * FROM candidates WHERE region = ?";
db.query(query, [region], (err, results) => {
if (err) {
return res.status(500).send("후보 조회 실패");
}

// 후보 목록을 HTML로 생성
let candidateCheckboxes = results
.map(
(candidate) => `
<div>
<input type="checkbox" name="candidateIds" value="${candidate.id}" id="candidate${candidate.id}">
<label for="candidate${candidate.id}">${candidate.name}</label>
</div>
`
)
.join("");

// 최종 HTML 응답
res.send(`
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>${region} 지역 투표하기</title>
</head>
<body>
<h1>${region} 지역 투표하기</h1>
<form action="/votes" method="POST">
${candidateCheckboxes}
<button type="submit">투표</button>
</form>
</body>
</html>
`);
});
});

// 투표 처리
router.post("/", (req, res) => {
let { candidateIds } = req.body; // let으로 변경

// 후보자가 선택되지 않았거나 candidateIds가 존재하지 않을 경우 처리
if (!candidateIds) {
return res.status(400).send("후보를 선택해야 합니다.");
}

// 후보자가 하나만 선택된 경우에도 정상 처리
if (!Array.isArray(candidateIds)) {
candidateIds = [candidateIds]; // 배열이 아닌 경우 배열로 변환
}

// DB에 투표 저장 로직 추가 필요
// 예시: candidateIds 배열을 사용하여 DB에 투표 기록을 저장하는 로직을 추가하세요.

res.send("투표 완료");
});

module.exports = router;
Loading