20211231
CMD> nodemon --inspect ./bin/www
// 파일명 : item.js
var express = require('express');
var router = express.Router();
// CMD> npm i mongodb --save
const db = require('mongodb').MongoClient;
// config/db.js 파일의 내용 가져오기
const DBURL = require('../config/db').mongodbURL;
const DBNAME = require('../config/db').mongodbDB;
// CMD> npm i multer --save
const multer = require('multer');
// 특정폴더에 파일을 보관 or 메모리(DB에 저장)
const upload = multer({storage:multer.memoryStorage()});
/
db.sequence.insert([
{_id : 'SEQ_BOARD_NO', seq : 1},
{_id : 'SEQ_BOARDREPLY_NO', seq : 1},
{_id : 'SEQ_ITEM_NO', seq : 10001}
]);
/
// 물품등록 : http://localhost:3000/item/insert
// 이미지1, 물품코드(X), 물품명, 물품내용, 물품가격, 재고수량, 등록일(X)
router.post('/insert', upload.single("file"), async function(req, res, next) {
try {
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("sequence");
const result = await coll.findOneAndUpdate(
{ _id:'SEQ_ITEM_NO' }, { $inc : { seq : 1} }
);
//console.log(result.value.seq);
const obj = {
_id : result.value.seq, // 물품번호(자동부여)
name : req.body.name, //물품명, 물품내용, 가격, 수량
content : req.body.content,
price : req.body.price ,
quantity : req.body.quantity,
filename : req.file.originalname, //파일명
filetype : req.file.mimetype,
filedata : req.file.buffer,
filesize : req.file.size,
regdate : new Date()
};
const coll1 = dbConn.db(DBNAME).collection("item");
const result1 = await coll1.insertOne(obj); //{}
if( result1.insertedId > 0 ){
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({status:-1, result : err});
}
});
// 이미지(1개) : http://localhost:3000/item/image?no=2
router.get('/image', async function(req, res, next) {
try {
const no = Number(req.query.no);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.findOne(
{ _id : no }, //조건
{ projection : {filedata:1, filetype:1} } //필요한 항목만
);
console.log(result);
res.contentType(result.filetype);// json ->image/jpeg
return res.send(result.filedata.buffer);
}
catch(err) {
console.error(err);
return res.send({status:-1, result : err});
}
});
// 물품목록 : http://localhost:3000/item/select?page=1
router.get('/select', async function(req, res, next) {
try {
const page = Number(req.query.page);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
// 물품코드, 물품명, 가격, 수량, 등록일
const result = await coll.find(
{}, // 조건
{ projection : {_id:1, name:1, price:1, quantity:1, regdate:1} } // 가져올 항목만
)
.sort({_id:-1}) // 1 오름차순, -1 내림차순
.skip((page-1) * 10 ) // 생략할 개수
.limit(10) // 10개 까지만
.toArray();
const total = await coll.countDocuments({});
return res.send({status:200, result:result, total:total});
}
catch(err) {
console.error(err);
return res.send({status:-1, result : err});
}
});
// 물품1개조회(이미지포함) : http://localhost:3000/item/selectone?code=10001
router.get('/selectone', async function(req, res, next) {
try {
const code = Number(req.query.code);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.findOne(
{_id : code}, //조건
{projection : {filename:0, filedata:0, filesize:0, filetype:0 } } //필요한 항목만
);
console.log(result); // 확인
// 이미지 데이터를 전달X,
// 이미지를 볼수있는 URL정보 전달
result['image'] = '/item/image?no=' + code + '&dt=' + new Date().getTime();
return res.send({status:200, result: result});
}
catch(err) {
console.error(err);
return res.send({status:-1, result : err});
}
});
// 물품삭제 : http://localhost:3000/item/delete?code=10004
router.delete('/delete', async function(req, res, next) {
try {
const code = Number(req.query.code);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.deleteOne({_id:code});
if(result.deletedCount === 1){
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/item/update?code=10004
// query + body
router.put('/update', upload.single("file"),
async function(req, res, next) {
try {
const code = Number(req.query.code);
// 물품명, 물품내용, 물품가격, 재고수량, 이미지
// const 상수 처음만든 값에 +, - 안됨.
// let, var 변수 처음만든값에 +, - 가능함.
let obj = {
name : req.body.name,
content : req.body.content,
price : req.body.price,
quantity : req.body.quantity
};
if(typeof req.file !== 'undefined') {
obj['filename'] = req.file.originalname;
obj.filetype = req.file.mimetype;
obj.filedata = req.file.buffer;
obj.filesize = req.file.size;
}
console.log(code);
console.log(obj);
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.updateOne(
{ _id : code }, //조건
{ $set : obj } //실제변경할내용
);
console.log(result);
if(result.modifiedCount === 1) {
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/item/insertbatch
router.post('/insertbatch', upload.array("file"),
async function(req, res, next) {
try {
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("sequence");
const count = req.body.name.length;
let arr = []; //[ {obj},{obj} ]
for(let i=0; i<count; i++){ //0 1
const result = await coll.findOneAndUpdate(
{ _id:'SEQ_ITEM_NO' }, { $inc : { seq : 1} }
);
const obj = {
_id : result.value.seq,
name : req.body.name[i],
content : req.body.content[i],
price : req.body.price[i],
quantity : req.body.quantity[i],
filename : req.files[i].originalname,
filedata : req.files[i].buffer,
filetype : req.files[i].mimetype,
filesize : req.files[i].size,
regdate : new Date()
};
arr.push(obj);
}
const coll1 = dbConn.db(DBNAME).collection("item");
const result1 = await coll1.insertMany(arr); //[{},{}]
console.log(result1);
if(result1.insertedCount === count){
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/item/deletebatch
router.delete('/deletebatch', async function(req, res, next) {
try {
// req.body => {code : [100031, 100032, 10033]}
// req.body.code[0], req.body.code[1]
// { code : 100031 } [ {code : 10031 } ]
// [ {code: 10031}, {code: 10032}, {code: 10033} ]
// req.body[0].code req.body[1].code
console.log(req.body);
let arr = []; //[{},{},{}] [1,2,3]
for(let i=0; i< req.body.length; i++) { // 0 1 2
arr.push( req.body[i].code );
}
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
const result = await coll.deleteMany({
_id : { $in : arr }
});
console.log(result);
// { acknowledged: true, deletedCount: 3 }
if(result.deletedCount === req.body.length){
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/item/updatebatch
router.put('/updatebatch', upload.array("file"), async function(req, res, next){
try {
console.log(req.body);
const count = req.body.name.length;
const dbConn = await db.connect(DBURL);
const coll = dbConn.db(DBNAME).collection("item");
let cnt = 0; //변경한 라인의 숫자
for(let i=0; i<count; i++) { // 0 1
// 변경할 내용들
let obj = {
name : req.body.name[i],
content : req.body.content[i],
price : req.body.price[i],
quantity : req.body.quantity[i]
};
// req.files ==> []
if(typeof req.files[i] !== 'undefined'){
obj['filename'] = req.files[i].originalname;
obj['filedata'] = req.files[i].buffer;
obj['filetype'] = req.files[i].mimetype;
obj.filesize = req.files[i].size;
}
const result = await coll.updateOne(
{ _id : Number(req.body.code[i]) },
{ $set : obj }
);
console.log(result);
cnt += result.modifiedCount; // cnt에 누적하기
}
if(cnt === count){
return res.send({status:200});
}
return res.send({status:0});
}
catch(err) {
console.error(err);
return res.send({status:-1, result : err});
}
});
module.exports = router;
========================================
// 파일명 : Seller.vue
<div>
<el-card shadow="always">
<h4>판매자</h4>
<hr />
{{items}}
<hr />
{{chk1}}
<p>물품목록</p>
<router-link to="iteminsert" style="margin-right:5px">
<el-button size="small" type="primary" >물품등록</el-button>
</router-link>
<router-link to="iteminsertbatch" style="margin-right:5px">
<el-button size="small" type="primary">물품일괄등록</el-button>
</router-link>
<el-button size="small" type="primary" @click="handleDeleteBatch">물품일괄삭제</el-button>
<el-table :data="items" size="mini" style="width: 100%;">
<el-table-column label="체크" width="180">
<template #default="scope">
<div>
{{scope.$index}}
<input type="checkbox" v-model="items[scope.$index].chk1" />
</div>
</template>
</el-table-column>
<el-table-column label="코드" width="180">
<template #default="scope">
<div @click="handlePage(scope.row._id)" style="cursor:pointer;">
{{scope.row._id}}
</div>
</template>
</el-table-column>
<el-table-column prop="name" label="물품명" width="180" />
<el-table-column prop="price" label="가격" />
<el-table-column prop="quantity" label="재고수량" />
<el-table-column prop="regdate" label="등록일" />
<el-table-column fixed="right" label="버튼" width="220">
<template #default="scope">
<el-button size="small" type="danger" @click.prevent="deleteRow(scope.$index, scope.row)">
삭제
</el-button>
<el-button size="small" type="primary" @click.prevent="updateRow(scope.$index, scope.row)">
수정
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination layout="prev, pager, next" :total="total" @current-change="currentChange"></el-pagination>
</el-card>
<!-- 별도 위치 -->
<el-dialog v-model="dialogVisible" title="Tips" width="30%">
<span>
<img :src="itemOne.image" style="width:100px" />
<input type="file" ref="file" @change="handleImage" />
</span>
<p><input type="text" v-model="itemOne.name" /></p>
<p><textarea v-model="itemOne.content"></textarea></p>
<p><input type="text" v-model="itemOne.price" /></p>
<p><input type="text" v-model="itemOne.quantity" /></p>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="handleUpdateAction">수정</el-button>
<el-button @click="dialogVisible = false">닫기</el-button>
</span>
</template>
</el-dialog>
</div>
//파일명 : ItemInsertBatch.vue
<div>
<el-card shadow="always">
<h4>물품일괄등록</h4>
<hr />
{{items}}
<el-button size="small" type="info" @click="handlePlus">항목추가</el-button>
<el-button size="small" type="info" @click="handleMinus">항목삭제</el-button>
<el-button size="small" type="primary" @click="handleInsertBatch">일괄추가</el-button>
<el-button size="small" type="primary">목록으로</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].imageurl" style="width:50px"/>
<input type="file" @change="handleImage($event, scope.$index)" />
</template>
</el-table-column>
</el-table>
</el-card>
</div>
Author And Source
이 문제에 관하여(20211231), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@gegus1220/20211231저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)