파일명 src/component/router/index.js
// npm install vue-router@next --save
// 파일명 src/routes/insex.js
import { createWebHashHistory, createRouter } from "vue-router";
// 라우터 설정하기
import Home from '@/components/Home.vue';
import Board from '@/components/Board.vue';
import Login from '@/components/Login.vue';
import Logout from '@/components/Logout.vue';
import Admin from '@/components/Admin.vue';
import Join from '@/components/Join.vue';
import BoardContent from '@/components/BoardContent.vue';
import Chart from '@/components/Chart.vue';
import Chart1 from '@/components/Chart1.vue';
import BoardWrite from '@/components/BoardWrite.vue';
import BoardTest from '@/components/BoardTest.vue';
import BoardUpdate from '@/components/BoardUpdate.vue';
import Mypage from '@/components/Mypage.vue';
const routes = [
{ path : '/', name: "Home", component:Home },
{ path : '/login', name: "Login", component:Login },
{ path : '/logout', name: "Logout", component:Logout },
{ path : '/board', name: "Board", component:Board },
{ path : '/admin', name: "Admin", component:Admin },
{ path : '/join', name: "Join", component:Join },
{ path : '/boardcontent', name: "BoardContent", component:BoardContent },
{ path : '/chart', name: "Chart", component:Chart },
{ path : '/chart1', name: "Chart1", component:Chart1 },
{ path : '/boardwrite', name: "BoardWrite", component:BoardWrite },
{ path : '/boardtest', name: "BoardTest", component:BoardTest },
{ path : '/boardupdate', name: "BoardUpdate", component:BoardUpdate },
{ path : '/mypage', name: "Mypage", component:Mypage },
]
// localhost : 8080/#/
// 127.0.0.1:8080/#/login
// 127.0.0.1:8080/#/board
// 라우터 생성 (주소표기방식, 라우터 설정 변수)
const router = createRouter({
history : createWebHashHistory(), // 127.0.0.1:8080/#/login
routes : routes
})
// 라우터 이동 경로 확인 (이동하는 페이지, 이동전 페이지, 다음페이지로 이동)
router.beforeEach((to, from, next) => {
console.log('이동하는 페이지:', to.path);
// 저장소에 보관하기
sessionStorage.setItem('CURL',to.path);
console.log('이동전 페이지:', from);
next(); // 다음페이지로 이동
})
export default router;
=====================================================
파일명 src/App.vue
<template>
<div>
<!-- ElMenu.vue -->
<!-- props로 default-active숫자값을 전달 -->
<!-- props로 router TRUE값을 전달 -->
<!-- 자식컴포넌트 emit 를 통해서 select이벤트 -->
<el-menu :default-active="state.activeIndex"
class="el-menu-demo"
mode="horizontal"
:router="true"
@select="handleSelect">
<el-menu-item index="/">Home</el-menu-item>
<el-menu-item v-show="logged === false" index="/login">Login</el-menu-item>
<el-menu-item v-show="logged === true" index="/logout">Logout</el-menu-item>
<el-menu-item v-show="logged === true" index="/mypage">Mypage</el-menu-item>
<el-menu-item index="/board">Board</el-menu-item>
<el-menu-item index="/admin">Admin</el-menu-item>
<el-menu-item index="/join">Join</el-menu-item>
<el-menu-item index="/chart">Chart</el-menu-item>
</el-menu>
{{menu}},{{logged}}
<hr />
<router-view></router-view>
</div>
</template>
<script>
import {useStore} from 'vuex';
import {computed, reactive, onMounted } from 'vue';
export default {
setup () {
const store = useStore();
// store의 menu값 실시간으로 가져오기
// 마지막으로 방문한 페이지를 session저장소에 보관후에 변환
const menu = computed(()=>{
return store.getters.getMenu
});
// store의 logged값 실시간으로 확인
const logged = computed(()=>{
return store.getters.getLogged
});
// store에서 읽은 메뉴값으로 초기값으로 세팅
const state = reactive({
activeIndex : menu
})
onMounted( async () => {
// 저장소에 있는 TOKEN값을 읽어서 존재 유무 확인
// TOKEN을 추가하는 시점은 로그인이 완료 되었을때
// TOKEN의 값을 제거하는 시점은 로그아웃되었을때
if(sessionStorage.getItem("TOKEN")===null){
// store의 logged변수 값을 false
store.commit("setLogged", false);
}
else{
store.commit("setLogged", true);
}
})
// 메뉴를 클릭했을 떄
// store값 변경하기
const handleSelect = (idx) =>{
console.log(idx);
// 메소드명,value 값
store.commit("setMenu", idx);
}
// // store의 state 변수가 변경되는 시점을 바로 알 수 있음.
// store.subscribe((mutation, state) => {
// console.log('store.subscribe',mutation,state);
// })
return {state, menu, logged, handleSelect}
}
}
</script>
<style lang="scss" scoped>
</style>
=====================================================
파일명 src/component/Login.vue
<template>
<div>
<h3>src/component/Login.vue</h3>
{{state}}
<hr />
<input type="text" v-model="state.userid"/>
<input type="password" v-model="state.userpw"/>
<input type="button" value="로그인" @click="handleLogin"/>
</div>
</template>
<script>
import { reactive } from 'vue';
import axios from 'axios';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex';
export default {
// ver 3.0
setup () { // this를 사용할 수 없음
const router = useRouter();
const store = useStore();
const state = reactive({
userid : 'aaa@gmail.com',
userpw : 'aaa',
});
const handleLogin = async() => {
const url = `/member/select`;
const headers = {"Content-Type":"application/json"};
const body = {
email : state.userid,
password : state.userpw
};
const response = await axios.post(url, body, {headers});
console.log(response.data.status);
if(response.data.status === 200){
console.log(response.data.token)
// 저장소에 보관하기
sessionStorage.setItem("TOKEN", response.data.token);
alert('로그인 되었습니다.');
// 주소창만 바뀜
router.push({name:'Home'});
// app.vue에 메뉴의 선택항목을 변경하도록 알려줌
// 메뉴 활성화
store.commit("setMenu","/");
// 로그인 상태
store.commit("setLogged",true);
}
else{
alert('아이디와 암호를 확인하세요');
}
};
return {state, handleLogin}
},
}
</script>
<style lang="scss" scoped>
</style>
=====================================================
파일명src/component/Logout.vue
<template>
<div>
</div>
</template>
<script>
import { useRouter } from 'vue-router';
import { useStore } from 'vuex';
import { onMounted, nextTick } from 'vue';
export default {
setup () {
const router = useRouter();
const store = useStore();
onMounted( async () => { // F5 새로고침
nextTick( ()=>{ // 화면 랜더링 완료후
if(confirm('로그아웃 할까요?')) {
sessionStorage.removeItem("TOKEN");
alert('로그아웃 되었습니다.');
// 1. 주소창만 바뀜
router.push({name:'Home'});
// 2. 메뉴활성화
store.commit("setMenu", "/");
// 3. 로그인상태
store.commit("setLogged", false);
}
else{
router.push({name:'Home'});
store.commit("setMenu", "/");
}
})
});
return {}
}
}
</script>
<style lang="scss" scoped>
</style>
=====================================================
파일명 src/component/Mypage.vue
<template>
<div>
<h3>src/component/Mypage.vue</h3>
<button @click="handleMenu(1)">정보수정</button>
<button @click="handleMenu(2)">암호변경</button>
<button @click="handleMenu(3)">회원탈퇴</button>
<menu-1 v-if="state.menu === 1"></menu-1>
<menu-2 v-if="state.menu === 2"></menu-2>
<menu-3 v-if="state.menu === 3"></menu-3>
</div>
</template>
<script>
import {reactive} from 'vue';
import Menu1 from './mypage/Menu1.vue';
import Menu2 from './mypage/Menu2.vue';
import Menu3 from './mypage/Menu3.vue';
export default {
components:{
Menu1, Menu2, Menu3,
},
setup () {
const state = reactive({
menu:1
});
const handleMenu = (idx)=> {
state.menu = idx;
}
return {state, handleMenu}
}
}
</script>
<style lang="scss" scoped>
</style>
=====================================================
파일명 src/components/mypage/Menu1.vue
<template>
<div>
<h3>Menu1</h3>
<el-form :inline="true" >
<el-form-item label-width="120px" label="이름" >
<el-input v-model="state.name" ></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" >
<el-form-item label-width="120px" label=" " >
<el-button style="width:100px" @click="handleUpdateAction" type="primary">정보변경</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import {reactive} from 'vue';
import axios from 'axios';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex';
export default {
setup () {
const router = useRouter();
const store = useStore();
const state = reactive ({
name:'',
token : sessionStorage.getItem("TOKEN"),
});
const handleUpdateAction = async () =>{
if(state.name === ''){
alert('이름을 입력 하세요');
return false; // 이 위치에서 메소드 종료
}
if(state.token !== null ){
const url = `/member/update`;
const headers = {
"Content-Type":"application/json",
"token" : state.token
};
const body = {
name : state.name
}
const response = await axios.put(url, body, {headers});
console.log(response.data);
if(response.data.status === 200){
alert('회원 정보가 변경 되었습니다.')
}
}
else{
// url을 홈으로 변경
// 매뉴선탣을 "/"
// 로그인 상태를 false
// 1. 주소창만 바뀜
router.push({name:'Home'});
// 2. 메뉴활성화
store.commit("setMenu", "/");
// 3. 로그인상태
store.commit("setLogged", false);
}
}
return {state, handleUpdateAction}
}
}
</script>
<style lang="scss" scoped>
</style>
=====================================================
파일명 src/components/mypage/Menu2.vue
<template>
<div>
<h3>Menu2</h3>
<el-form :inline="true" >
<el-form-item label-width="120px" label="현재 암호" >
<el-input type="password" v-model="state.pw"></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" >
<el-form-item label-width="120px" label="바꿀 암호" >
<el-input type="password" v-model="state.pw1"></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" >
<el-form-item label-width="120px" label="암호확인" >
<el-input type="password" v-model="state.pw2"></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" >
<el-form-item label-width="120px" label=" " >
<el-button style="width:100px" @click="handleUpdateAction" type="primary">암호변경</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { reactive } from 'vue';
import axios from 'axios';
export default {
setup () {
const state = reactive({
pw : '',
pw1 : '',
pw2 : '',
token : sessionStorage.getItem("TOKEN"),
});
const handleUpdateAction = async() =>{
if(state.pw === ''){
alert('암호를 입력 하세요');
return false; // 이 위치에서 메소드 종료
}
if(state.pw1 === ''){
alert('변경할 암호를 입력 하세요');
return false; // 이 위치에서 메소드 종료
}
if(state.pw2 === ''){
alert('암호확인을 입력 하세요');
return false; // 이 위치에서 메소드 종료
}
if(state.pw === state.pw1){
alert('변경전 암호와 같습니다.');
return false; // 이 위치에서 메소드 종료
}
if(state.pw1 !== state.pw2){
alert('암호 확인이 같지 않습니다.');
return false; // 이 위치에서 메소드 종료
}
if(state.token !== null ){
const url = `/member/updatepw`;
const headers = {
"Content-Type":"application/json",
"token" : state.token
};
const body = {
password : state.pw,
password1 : state.pw1
}
const response = await axios.put(url, body, {headers});
console.log(response.data);
if(response.data.status === 200){
alert('암호가 변경 되었습니다.')
}
else{
alert('압호를 확인하세요')
}
}
}
return {state, handleUpdateAction}
}
}
</script>
<style lang="scss" scoped>
</style>
=====================================================
파일명 src/components/mypage/Menu3.vue
<template>
<div>
<h3>Menu3</h3>
<el-form :inline="true" >
<el-form-item label-width="120px" label="현재 암호" >
<el-input type="password" v-model="state.pw"></el-input>
</el-form-item>
</el-form>
<el-form :inline="true" >
<el-form-item label-width="120px" label=" " >
<el-button style="width:100px" @click="handleDeleteAction" type="primary">회원 탈퇴</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { reactive } from 'vue';
import { useRouter } from 'vue-router';
import { useStore } from 'vuex';
import axios from 'axios';
export default {
setup () {
const router = useRouter();
const store = useStore();
const state = reactive({
pw : '',
token : sessionStorage.getItem("TOKEN")
});
const handleDeleteAction = async() => {
if(state.pw === ''){
alert('암호를 입력하세요')
return false;
}
if(confirm('정말 탈퇴할까요??')) {
const url = `/member/delete`;
const headers = {
"Content-Type":"application/json",
"token" : state.token
};
const body = {
password : state.pw,
}
// 구조) delete(url, {headers:헤드, data:전송값})
const response = await axios.delete(
url, {headers:headers, data:body});
console.log(response.data);
if(response.data.status === 200){
sessionStorage.removeItem("TOKEN");
alert('회원탈퇴 되었습니다.');
// 1. 주소창만 바뀜
router.push({name:'Home'});
// 2. 메뉴활성화
store.commit("setMenu", "/");
// 3. 로그인상태
store.commit("setLogged", false);
}
}
}
return {state, handleDeleteAction}
}
}
</script>
<style lang="scss" scoped>
</style>
=====================================================
파일명 /route/member.js
var express = require('express');
var router = express.Router();
// config/mongodb.js 에서 DB내용 불러와서 연결
const db = require('mongodb').MongoClient;
const dburl = require('../config/mongodb').URL;
const dbname = require('../config/mongodb').DB;
// 문자를 HASH하기(암호보안)
const crypto = require('crypto');
// 토큰 발행을 위한 필요 정보 가져오기
// CMD> npm i jsonwebtoken
const jwt = require('jsonwebtoken');
const { read } = require('fs');
const { log } = require('console');
const jwtKey = require('../config/auth').securityKey;
const jwtOptions = require('../config/auth').options;
const checkToken = require('../config/auth').checkToken;
// 회원정보수정 put
// localhost:3000/member/update
// 토큰 이메일(PK) 이름(변경할 내용)
// checkToken으로 들어가서 점증 후 req로 들어감
router.put('/update',checkToken, async function(req, res, next) {
try{
console.log('이메일',req.body.uid);
console.log('기존이름',req.body.uname);
console.log('변경할 이름',req.body.name);
// BD 연동
const dbconn = await db.connect(dburl);
const collection = dbconn.db(dbname).collection('member1');
// 정보변경
const result = await collection.updateOne(
{ _id : req.body.uid },
{ $set : { name : req.body.name } }
);
console.log(result);
if(result.matchedCount === 1){
return res.send({ status:200 });
}
// 결과값 리턴
return res.send({status : 0});
}
catch(e){
console.error(e);
res.send({status : -1, message:e});
}
});
// 회원암호변경 put
// localhost:3000/member/updatepw
// 토큰 이메일, 현재암호 , 변경할 암호
router.put('/updatepw',checkToken, async function(req, res, next) {
try{
// 토큰에서 꺼낸 정보
const email = req.body.uid; // 토큰에서 꺼낸 정보
const pw = req.body.password; // 현재 암호
const pw1 = req.body.password1; // 변경할 암호
// 2. 암호는 바로 비교 불가 회원가입과 동일한 hash후에 비교
const hashPassword = crypto.createHmac('sha256', email).update(pw).digest('hex');
console.log(email);
console.log(hashPassword);
//==================================================================================
const dbconn = await db.connect(dburl);
const collection = dbconn.db(dbname).collection('member1');
const result = await collection.findOne({
_id : email,
pw : hashPassword
});
if(result !== null) { //로그인 가능
//바꿀 암호를 hash
const hashPassword1 = crypto.createHmac('sha256', email).update(pw1).digest('hex');
const result1 = await collection.updateOne(
{ _id : email },
{ $set : { pw : hashPassword1 } }
);
if(result1.modifiedCount === 1) {
return res.send({status : 200});
}
}
// 로그인 실패시
return res.send({status : 0});
}
//==================================================================================
// const hashPassword1 = crypto.createHmac('sha256', email).update(pw1).digest('hex');
// // BD 연동
// const dbconn = await db.connect(dburl);
// const collection = dbconn.db(dbname).collection('member1');
// // 정보변경
// const result = await collection.updateOne(
// { _id : email, pw : hashPassword },
// { $set : { pw : hashPassword1 } }
// );
// console.log(result);
// // 결과값 리턴
// if(result.matchedCount === 1 ){
// return res.send({status : 200});
// }
// return res.send({status : 0});
// }
catch(e){
console.error(e);
res.send({status : -1, message:e});
}
});
// 회원탈퇴 delete
// localhost:3000/member/delete
// 토큰 이메일, 현재 암호
router.delete('/delete', checkToken, async function(req, res, next) {
try{
// 토큰에서 꺼낸 정보
const email = req.body.uid;
const pw = req.body.password;
// 2. 암호는 바로 비교 불가 회원가입과 동일한 hash후에 비교
const hashPassword = crypto.createHmac('sha256', email).update(pw).digest('hex');
// 3. 회원정보가 일치하면 토큰을 발행
const dbconn = await db.connect(dburl);
const collection = dbconn.db(dbname).collection('member1');
// 이메일과 hash한 암호가 둘다(AND) 일치
const result = await collection.findOne({
_id : email,
pw : hashPassword
});
console.log(result);
if(result !== null) { //로그인 가능
const result1 = await collection.deleteOne(
{ _id : email }
);
if(result1.deletedCount === 1) {
return res.send({status : 200});
}
}
// 로그인 실패시
return res.send({status : 0});
}
catch(e){
console.error(e);
res.send({status : -1, message:e});
}
});
// 로그인 post
// localhost:3000/member/select
// 이메일, 암호 => 현시점에 생성된 토큰을 전송
router.post('/select', async function(req, res, next) {
try{
// 1. 전송값 받기(이메일,암호)
const email = req.body.email;
const pw = req.body.password;
// 2. 암호는 바로 비교 불가 회원가입과 동일한 hash후에 비교
const hashPassword = crypto.createHmac('sha256',email).update(pw).digest('hex');
// 3. 회원정보가 일치하면 토큰을 발행
const dbconn = await db.connect(dburl);
const collection = dbconn.db(dbname).collection('member1');
// 이메일과 hash한 암호가 둘다(AND) 일치
const result = await collection.findOne({
_id : email,
pw : hashPassword
});
console.log(result);
if(result !== null){// 로그인 가능
const token = jwt.sign (
{ uid : email, uname : result.name }, // 토큰에 포함할 내용들..
jwtKey, // 토큰생성시 키값
jwtOptions, // 토큰 생성 옵션
);
return res.send({status : 200, token:token });
}
return res.send({status : 0});
}
catch(e){
console.error(e);
res.send({status : -1, message:e});
}
});
// 회원가입 post
// localhost:3000/member/insert
// 이메일(pk), 암호, 이름 받기
// 등록일 자동 생성
router.post('/insert', async function(req, res, next) {
try{
// 사용자1 aaa => ajsdklfqwermklnaocvoiajwlasd => 16진수
// 사용자2 aaa => kjasfdiownfaiadfioqwemnkavsa => 16진수
const hashPassword = crypto.createHmac('sha256',req.body.email).update(req.body.password).digest('hex');
const obj={
_id : req.body.email,
pw : hashPassword,
name : req.body.name,
regdate : new Date()
}
const dbconn = await db.connect(dburl);
const collection = dbconn.db(dbname).collection('member1');
const result = await collection.insertOne(obj);
// console.log('========================');
// console.log(result);
// console.log('========================');
// console.log(req.body);
// console.log('------------------------');
// 결과 확인
if( result.insertedId === req.body.email ) {
return res.send({status:200});
}
return res.send({status : 0});
}
catch(e){
console.error(e);
res.send({status : -1, message:e});
}
});
// 이메일 중복확인 get
// 이메일 => 결과
// localhost:3000/member/emailcheck?email=aaa@gmail.com
router.get('/emailcheck', async function(req, res, next) {
try{
// db연결, db선택, 컬렉션선택
const dbconn = await db.connect(dburl);
const collection = dbconn.db(dbname).collection('member1');
const result = await collection.countDocuments({
_id : req.query.email
});
// 결과 확인 : 일치하는 개수 리턴 0 또는 1
return res.send({status : 200, result : result});
}
catch(e){
console.error(e);
res.send({status : -1, message:e});
}
});
module.exports = router;
=====================================================
파일명 /route/seller.js
var express = require('express');
var router = express.Router();
// 문자를 HASH하기(암호보안)
const crypto = require('crypto');
// config/mongodb.js 에서 DB내용 불러와서 연결
const db = require('mongodb').MongoClient;
const dburl = require('../config/mongodb').URL;
const dbname = require('../config/mongodb').DB;
// 토큰 발행을 위한 필요 정보 가져오기
const jwt = require('jsonwebtoken');
const jwtKey = require('../config/auth').securityKey;
const jwtOptions = require('../config/auth').options;
const checkToken = require('../config/auth').checkToken;
// 이미지 파일 전송
const multer = require('multer');
// 특정 폴더에 파일로
// 메모리 DB에 추가
const upload = multer({storage:multer.memoryStorage()});
// 1. 물품1개 조회(물품코드가 전달되면)
// localhost:3000/seller/selectone?code=111
router.get('/selectone', checkToken, async function(req, res, next) {
try{
const code = Number(req.query.code);
console.log
const dbconn = await db.connect(dburl);
const collection = dbconn.db(dbname).collection('item1');
const result = await collection.findOne(
{ _id : code },
{ projection : {filename:0, filedata:0, filesize:0, filetype:0 } }
);
console.log(result);
if(result !== null){
return res.send({status : 200});
}
else{
return res.send({status : 0});
}
}
catch(e){
console.error(e);
res.send({status : -1, message:e});
}
});
// 2. 물품전체 조회(판매자 토큰에 해당하는 것만)
// localhost:3000/seller/selectlist
// router.get('/selectlist', checkToken, async function(req, res, next) {
// try{
// const dbconn = await db.connect(dburl);
// const collection = dbconn.db(dbname).collection('item1');
// return res.send({status : 200});
// }
// catch(e){
// console.error(e);
// res.send({status : -1, message:e});
// }
// });
// 3. 물품 이미지 표시(물품코드가 전달되면 이미지 표시)
// localhost:3000/seller/image?code=111
// 4. 물품번호 n개에 해당하는 항목 조회(물품코드 배열로 전달)
// localhost:3000/seller/selectcode
// { code : [ 1049, 1050 ] }
// 물품 일괄 수정
// localhost:3000/seller/update
router.put('/update', checkToken, upload.array("image"), async function(req, res, next) {
try{
// DB접속
const dbconn = await db.connect(dburl);
// 2. DB선택 및 컬렉션 선택
const collection = dbconn.db(dbname).collection('item1');
// req.body { code:[1030,1031,1032 ], title: ['a','b'] }
// req.files => [ { }, { } ]
let cnt = 0; // 실질적으로 변경할 개수를 누적할 변수
for(let i=0; i<req.body.title.length; i++){
let obj = { // 4개의 키만 존재
name : req.body.title[i],
price : req.body.price[i],
quantity : req.body.quantity[i],
content : req.body.content[i],
};
// 이미지 첨부하면 키를 4개 더 추가함
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 collection.updateOne(
{ _id : Number(req.body.code[i]) }, //조건
{ $set : obj } //변경내용
);
cnt += result.matchedCount;
}
//실제 변경된 개수 === 처음 변경하기 위해 반복했던 개수 일치유무
if(cnt === req.body.title.length){
return res.send({status : 200});
}
}
catch(e){
console.error(e);
return res.send({status : -1, message:e });
}
});
// 물품 일괄 삭제
// localhost:3000 /seller/delete
router.delete('/delete', checkToken, async function(req, res, next) {
try{
// { "code":[1019,1020,1021] }
const code = req.body.code;
console.log(code);
// DB접속
const dbconn = await db.connect(dburl);
// 2. DB선택 및 컬렉션 선택
const collection = dbconn.db(dbname).collection('item1');
// { $in : [ 1,2,3,4 ] } 포함 된 항목
const result = await collection.deleteMany(
{ _id : {$in : code} }
)
console.log(result);
if(result.deletedCount === code.length){
return res.send({status : 200});
}
return res.send({status : 0});
}
catch(e){
console.error(e);
return res.send({status : -1, message:e });
}
});
// 물품 등록 : 로그인, 이미지를 포함한 n개
// localhost:3000 /seller/insert
// 로그인을 한 사용자가 판매자
router.post('/insert', upload.array("image"), checkToken, async function(req, res, next) {
try{
// 전송1, body => { title : [1,2] price : [3,4]}
// 전송2, files => [ {originalname }, { } ]
// 최종, arr => [ { }, { } ]
// console.log(req.body); // 물품명, 가격, 수량, 내용
// DB접속
const dbconn = await db.connect(dburl);
// 2. DB선택 및 컬렉션 선택(sequence값 1씩 증가시키는 DB)
const collection = dbconn.db(dbname).collection('sequence');
// 3. 시퀀스에서 값을 가져오고, 그 다음을 위해서 가지고 올때 값 증가
const arr = [];
for(let i=0; i<req.body.title.length; i++){
const result = await collection.findOneAndUpdate(
{ _id : 'SEQ_ITEM1_NO' }, // sequence 값( _id 자동 생성)
{ $inc : {seq : 1} }
);
// console.log('========================');
// console.log(result.value.seq);
// console.log('========================');
arr.push({
_id : result.value.seq,
name : req.body.title[i],
price : req.body.price[i],
quantity : req.body.quantity[i],
content : req.body.content[i],
filename : req.files[i].originalname,
filedata : req.files[i].buffer,
filetype : req.files[i].mimetype,
filesize : req.files[i].size,
regdate : new Date(),
seller : req.body.uid //checkToken에서 넣어줌
});
}
console.log(arr); // 물품명, 가격, 수량, 내용
//console.log(req.files); // 물품대표이미지
// DB선택.컬렉션 생성 및 선택
const collection1 = dbconn.db(dbname).collection('item1');
// 선택된 컬렉션에 데이터 추가
const result1 = await collection1.insertMany(arr);
console.log(result1);
if(result1.insertedCount === req.body.title.length) {
return res.send({status : 200});
}
res.send({status : 0}) ;
}
catch(e){
console.error(e);
return res.send({status : -1, message:e });
}
});
module.exports = router;