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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ const methodOverride = require("method-override");
const testRouter = require("./routes/testRouter");
const boardRouter = require("./routes/boardRouter");
const commentRouter = require("./routes/commentRouter");
const indexRouter = require('./routes/index');
const userRouter = require('./routes/user');

// view engine setup
app.set("views", path.join(__dirname, "views"));
Expand All @@ -35,6 +37,9 @@ app.use("/test", testRouter);
app.use("/board", boardRouter);
app.use("/comment", commentRouter);

app.use('/', indexRouter);
app.use('/user', userRouter);

// catch 404 and forward to error handler
app.use(function (req, res, next) {
next(createError(404));
Expand Down
16 changes: 16 additions & 0 deletions controllers/indexcontroller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//main 함수 index.ejs 뷰를 렌더링하여 응답을 보내는 역할
exports.main = (req, res) => {
res.render('index');
};
// 로그인 페이지를 보여주는 역할
exports.login = (req, res) => {
res.render('login');
};
//회원가입하는 페이지를 보여주는 역할
exports.signUp = (req, res) => {
res.render('signUp');
};
// 고객 정보 조회(사용자 프로필) 페이지를 보여주는 역할
exports.profile = (req, res) => {
res.render('profile');
};
111 changes: 111 additions & 0 deletions controllers/usercontroller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
const User = require('../model/quser'); // 쿼리 모델
const secretKey = process.env.SECRET_KEY || 'your_secret_key';



// 회원가입
exports.CsignUp = async (req, res) => {
console.log(req.body);
try {
const hashedPassword = await bcrypt.hash(req.body.pw, 10);
const userData = { ...req.body, pw: hashedPassword };
const result = await User.MsignUp(userData);
console.log('signUp', result);
res.status(200).res.send("회원가입 성공");
res.json({ result: true });
} catch (error) {
res.status(500).json({ result: false, message: '회원가입 실패', error: error.message });
}
};

// 로그인
exports.Clogin = async (req, res) => {
console.log(req.body);
try {
const result = await User.Mlogin(req.body);
console.log('login', result);
if (result.length >= 1) {
const user = result[0];
console.log('Stored hash:', user.user_pw);
console.log('Entered password:', req.body.pw);
const match = await bcrypt.compare(req.body.pw, user.user_pw);
console.log('Password match:', match);
if (match) {
const token = jwt.sign({ id: user.id, username: user.username }, secretKey, { expiresIn: '1h' });
res.cookie(user.user_id, token, { httpOnly: true, secure: true });
res.json({ result: true, message: '로그인 성공', token: token, data: { user_nickname: user.user_nickname, user_id: user.user_id } });
} else {
res.json({ result: false, message: '비밀번호가 일치하지 않습니다.' });
}
} else {
res.json({ result: false, message: '사용자를 찾을 수 없습니다.' });
}
} catch (error) {
console.error('로그인 중 에러 발생:', error);
res.status(500).json({ result: false, message: '로그인 실패', error: error.message });
}
};

// 회원정보 조회
exports.Cinfo = async (req, res) => {
try {
const token = req.cookies.token;
console.log('Token:', token);
if (!token) {
return res.status(401).json({ result: false, message: '토큰이 없습니다.' });
}
const decoded = jwt.verify(token, secretKey);
console.log('Decoded ID:', decoded.id);

const result = await User.Minfo(decoded.id);
console.log('info', result);
if (result.length > 0) {
res.json({ result: true, info: result[0], message: '회원존재' });
} else {
res.json({ result: false, info: null, message: '존재하지 않는 회원' });
}
} catch (error) {
console.error('Error in Cinfo:', error);
res.status(401).json({ result: false, message: '인증 실패' });
}
};

// 회원정보 수정
exports.Cupdate = async (req, res) => {
try {
const token = req.cookies.token;
console.log('Token:', token);
if (!token) {
return res.status(401).json({ result: false, message: '토큰이 없습니다.' });
}
const decoded = jwt.verify(token, secretKey);
console.log('Decoded ID:', decoded.id);

console.log('Request Body:', req.body);
const hashedPassword = await bcrypt.hash(req.body.pw, 10); // 비밀번호 해싱
console.log('Hashed Password:', hashedPassword);

const updateData = { ...req.body, pw: hashedPassword, id: decoded.id,username:decoded.username };
const result = await User.Mupdate(updateData);
console.log('Update Result:', result);

res.json({ result: true });
} catch (error) {
res.status(401).json({ result: false, message: '인증 실패' });
}
};

// 회원정보 삭제
exports.Cdelete = async (req, res) => {
try {
const token = req.cookies.token;
const decoded = jwt.verify(token, secretKey);
const result = await User.Mdelete(decoded.id);
console.log('delete', result);
res.json({ result: true });
} catch (error) {
res.status(401).json({ result: false, message: '인증 실패' });
}
};
20 changes: 20 additions & 0 deletions middlewares/authmiddleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
const jwt = require('jsonwebtoken');
const secretKey = process.env.SECRET_KEY || 'your_secret_key';

const authenticateJWT = (req, res, next) => {
const authHeader = req.headers['authorization'];
if (authHeader) {
const token = authHeader.split(' ')[1];
jwt.verify(token, secretKey, (err, user) => {
if (err) {
return res.sendStatus(403);
}
req.user = user;
next();
});
} else {
res.sendStatus(401);
}
};

module.exports = authenticateJWT;
45 changes: 45 additions & 0 deletions models/quser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@

const pool = require('../config/db')

exports.MsignUp = async (data) => {
const query = `INSERT INTO user (user_id, user_pw, user_nickname) VALUES (?, ?, ?)`;
try {
const [result] = await pool.query(query, [data.id, data.pw, data.username]);
console.log('Database Insert Result:', result);
return result;
} catch (error) {
console.error('Database Insert Error:', error);
throw error;
}
};

exports.Mlogin = async (data) => {
const query = `SELECT * FROM user WHERE user_id = ?`;
const [rows] = await pool.query(query, [data.id]);
return rows;
};

exports.Minfo = async (id) => {
const query = `SELECT * FROM user WHERE user_id = ?`;
console.log('Executing query:', query, 'with ID:', id); // 로그 추가
const [rows] = await pool.query(query, [id]);
return rows;
};

exports.Mupdate = async (data) => {
const query = `UPDATE user SET user_pw = ?, user_nickname = ? WHERE user_id = ?`;
console.log('Executing update query:', query, 'with data:', data); // 로그 추가
try {
const [result] = await pool.query(query, [data.pw, data.username, data.id]);
console.log('Database Update Result:', result); // 로그 추가
return result;
} catch (error) {
console.error('Database Update Error:', error);
throw error;
}
};
exports.Mdelete = async (data) => {
const query = `DELETE FROM user user_id = ?`;
const [result] = await pool.query(query, [data.id]);
return result;
};
11 changes: 11 additions & 0 deletions routes/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
const express = require('express');
const controller = require('../controller/indexcontroller'); // 경로 확인
const router = express.Router();

// localhost:3000/
router.get('/', controller.main);
router.get('/login', controller.login);
router.get('/signUp', controller.signUp);
router.get('/profile/:id', controller.profile);

module.exports = router;
12 changes: 12 additions & 0 deletions routes/user.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const express = require('express');
const userController = require('../controller/usercontroller'); // 경로 확인
const authenticateJWT = require('../middlewares/authmiddleware'); // JWT 미들웨어 경로 확인
const router = express.Router();

router.post('/signUp', userController.CsignUp);
router.post('/login', userController.Clogin);
router.get('/info/:id', authenticateJWT, userController.Cinfo);
router.patch('/update', authenticateJWT, userController.Cupdate);
router.delete('/delete', authenticateJWT, userController.Cdelete);

module.exports = router;