CMD> nodemon --inspect ./bin/www
//조회 : await this.axios.get(url, {headers:headers});
//추가 : await this.axios.post(url, body, {headers:headers});
//수정 : await this.axios.put(url, body, {headers:headers});
//파일명 : ItemUpdateBatch.vue
<div>
<el-card shadow="always">
<h3>물품일괄수정</h3>
<hr />
{{items}}
<el-button size="small" type="primary" @click="handleUpdateBatchAction">물품일괄수정</el-button>
<el-table :data="items" style="width: 100%;" size="mini" >
<el-table-column label="번호" width="120">
<template #default="scope">
{{scope.$index+1}}
</template>
</el-table-column>
<el-table-column label="물품명" width="120">
<template #default="scope">
<el-input size="mini" v-model="items[scope.$index].name"></el-input>
</template>
</el-table-column>
<el-table-column label="물품내용">
<template #default="scope">
<el-input size="mini" v-model="items[scope.$index].content"></el-input>
</template>
</el-table-column>
<el-table-column label="가격" width="120">
<template #default="scope">
<el-input size="mini" v-model="items[scope.$index].price"></el-input>
</template>
</el-table-column>
<el-table-column label="수량" width="80">
<template #default="scope">
<el-input size="mini" v-model="items[scope.$index].quantity"></el-input>
</template>
</el-table-column>
<el-table-column label="이미지" width="340">
<template #default="scope">
<img :src="items[scope.$index].image1" style="width:50px"/>
<input type="file" @change="handleImage($event, scope.$index)" />
</template>
</el-table-column>
</el-table>
</el-card>
</div>
======================================
CMD> npm i jsonwebtoken --save
// 파일명 : app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index'); // index.js
var usersRouter = require('./routes/users'); // users.js
var boardRouter = require('./routes/board'); // 추가됨. board.js
var itemRouter = require('./routes/item'); // 추가됨. item.js
var memberRouter = require('./routes/member'); // 추가됨. member.js
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/board', boardRouter); //추가됨.
app.use('/item', itemRouter); //추가됨.
app.use('/member', memberRouter); //추가됨.
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
// 파일명 : config/auth.js
module.exports = {
securityKey : 'fjifej$%e_ijfj39890uu94343',
options : {
algorithm : 'HS256', // 토큰 생성 hash알고리즘
expiresIn : '9h', // 토큰만료시간 ex) 9시간
issuer : 'corp01', // 토큰 발행자
}
}
// 파일명 : routes/member.js
var express = require('express');
var router = express.Router();
// 몽고DB연동
// CMD> npm i mongodb --save
const db = require('mongodb').MongoClient;
const DBURL = require('../config/db').mongodbURL;
const DBNAME = require('../config/db').mongodbDB;
// 로그인시에 토큰발행
// CMD> npm i jsonwebtoken --save
const jwt = require('jsonwebtoken');
const jwtKey = require('../config/auth').securityKey;
const jwtOptions = require('../config/auth').options;
// 회원가입, 로그인시 암호 hash용
const crypto = require('crypto');
// 로그인 : http://localhost:3000/member/select
// 암호정보가 있어서 post
router.post('/select', async function(req, res, next) {
try {
// 회원가입시 사용했던 암호화 방식으로 hash해야
// DB에서 로그인 비교가 가능함.
const hash = crypto.createHmac('sha256', req.body.uid)
.update(req.body.upw).digest('hex');
const obj = {
userid : req.body.uid,
userpw : hash
};
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("member");
// const query = { $and : [{_id:obj.userid}, {userpw:obj.userpw}] };
const query = { _id:obj.userid, userpw:obj.userpw };
const result = await coll.findOne(query);
console.log(result);
if(result !== null){ // DB에 일치하는 경우
const token = {
token : jwt.sign(
{ uid:result._id }, // 토큰에 포함할 내용들...
jwtKey, // 토큰생성 키
jwtOptions // 옵션
),
refreshToken : null, // null
}
return res.send({status:200, result : token});
}
// 일치하지 않을 경우
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({status:-1, result : err});
}
});
// 회원가입 : http://localhost:3000/member/insert
router.post('/insert', async function(req, res, next) {
try{
// hash(salt)는 abc -> io3rj987io23873987437839ufj3983r
const hash = crypto.createHmac('sha256', req.body.uid)
.update(req.body.upw).digest('hex');
const obj = {
_id : req.body.uid,
userpw : hash,
userage : Number(req.body.uage),
userbirth : req.body.ubirth,
useremail : req.body.uemail,
usercheck : req.body.ucheck,
usergender : Number(req.body.ugender)
};
console.log(obj);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("member");
const result = await coll.insertOne(obj); //{ }
console.log(result);
if( result.insertedId === obj._id ) {
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({status:-1, result : err});
}
});
// 아이디중복확인 : http://localhost:3000/member/idcheck?uid=aa
router.get('/idcheck', async function(req, res, next) {
try {
const userid = req.query.uid;
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("member");
const query = { _id : userid };
const result = await coll.countDocuments(query);
return res.send({status:200, result:result});
}
catch(err) {
console.error(err);
return res.send({status:-1, result : err});
}
});
module.exports = router;