node 2022/02/08

무간·2022년 2월 8일

파일명 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;
profile
당신을 한 줄로 소개해보세요

0개의 댓글