mongoDB + Postman + vue

국비 코딩 풀스택 수업 27일차 백엔드 복습(처음부터 짜봄), chk로 삭제x(숨김), select(v-for, value, 표기)

비루블 2022. 7. 28. 12:48

요약정리

 

정적인걸 먼저 만들고 동적인것에 데이터 기입(데이터 관리가 쉬워짐)

ex_sellmodel.js 모델 설계 정석으로 배워봄

select를 v-for로 만들어봄 화면 출력값(한글 ex)가전제품)과, 실제 서버 업로드용(영어 ex)AAA) cate, category를 이용해서 표현

오후는 실습위주

 

item, itemimage erd만듬

커뮤니티에서 물품판매

=====================설계 방향==========================
ex_sell
ㅁ수많은 커뮤니티중 하나에서 물품이 판매되는 것
예시
10001 a       AAA 농산물
10002 b       BBB 수산물
                    CCC 가전제품
--------
1001 사과
1002 배
1003 귤
--------
1 10001 1001 1
2 10002 1002 0
2 10002 1003 1
10002번(b커뮤니티) 커뮤니티에서 배와 귤을 팔고있음.
뒤에 번호 1,0을 붙여서 재고 부족시 숨김이나,
삭제시 데이터에서 삭제하지 않고
남기고 게시판에서만 없앰
==============설계 방향끝 ===========================

 

정적인걸 먼저 만들고 동적인것에 데이터 기입(데이터 관리가 쉬워짐)

ex_category분류표 만들음 정적인 데이터(단계나 등급이랑 같은 원리)
AAA 농산물
BBB 수산물
CCC 가전제품
추가

ex_sellmodel.js
모델 설계 정석으로 배워봄

// nodejs mongodb ORM기반 모듈
var mongoose = require('mongoose');

// 자동번호 생성시킴
const AutoIncrement = require('mongoose-sequence')(mongoose);

// 스키마 == 컬렉션 == 테이블
// _id는 기본키로 인식
var Schema = mongoose.Schema;
var sellSchema =  new Schema({
    _id      : Number,
    regdate  : { type:Date, default:Date.now }, // 등록일, 자동으로
    communityno  : { type:Number, default:0 }, // 커뮤니티번호
    itemno       : { type:Number, default:0 }, // 물품번호, 숫자
    chk          : { type:Number, default:1 }, // 판매유무, 숫자
});

sellSchema.plugin(AutoIncrement,{
    id          :   "SEQ_SELL_NO", 
    inc_field   :   '_id',  // 위에 생성한 스키마 중에서 어떤항목(_id)
    start_seq   :   101     // 시작값, 생략시 1부터 시작
});

module.exports = mongoose.model('ex_sell', sellSchema);

 


라우트 작성
ex_category 몽고디비에서 수동으로 넣어줌


ex_item 

var express = require('express');
var router = express.Router();


var Item = require('../models/ex_itemmodel');
var Category = require('../models/ex_categorymodel');


// npm i moment
// npm i moment-timezone --save
require('moment-timezone');
var moment = require('moment');
moment.tz.setDefault('Asia/Seoul'); // 표준시 UTC 시간, 아시아.서울로 설정

// 물품삭제
// 127.0.0.1:3000/api/ex_item/delete.json
router.delete('/delete.json', async function(req, res, next) {
    try {
        const query = {_id : Number(req.body._id)};
        const result = await Item.deleteOne(query);
        console.log(result);

        const data = {status:200, result:result};
        return res.send(data)
    }
    catch(e) {
        console.error(e);
        return res.send({status:-1, result:e})
    }
  });

// 물품조회
// 127.0.0.1:3000/api/ex_item/select.json
// {"arr":[1001, 1002, 1003]}
router.post('/select.json', async function(req, res, next) {
    try{
        console.log(req.body.arr);
        const arr = req.body.arr;
        console.log('arr=>',arr);
        const query = {_id : {$in : arr}};
        console.log('query=>',query);
        const result = await Item.find(query).sort({_id:-1});
        if(result !== null){
            return res.send({status:200, rows:result});
        }

        return res.send({status:0});
    }

    catch(e){
        console.error(e);
        return res.send({status:-1, result:e});
    }
});

// 물품수정
// 127.0.0.1:3000/api/ex_item/update.json
// {"_id" : "", "name": "고등어", "price":"1000", "content": "나도잘;;", "quantity":"100", "categorycode":"AAA"}
router.put('/update.json', async function(req, res, next) {
    try{
        const query = { _id:Number(req.body._id) };
        const obj = await Item.findOne(query);

        // 항목추가 obj.모델변수명 = req.body.전송변수명
        obj.name = req.body.name;
        obj.price = Number(req.body.price);
        obj.quantity = Number(req.body.quantity);
        obj.content = req.body.content;
        obj.categorycode = req.body.categorycode;

        const result = await obj.save();
        if(result !== null){
            return res.send({status:200, result:result});
        }
    }

    catch(e){
        console.error(e);
        return res.send({status:-1, result:e});
    }
});

// 127.0.0.1:3000/api/ex_item/insert.json
// {"name": "고등어", "price":"1000", "content": "나도잘;;", "quantity":"100", "categorycode":"AAA"}
router.post('/insert.json', async function(req, res, next) {
    try{
        // 추가할 빈 객체 생성
        const obj = new Item();

        // 항목추가 obj.모델변수명 = req.body.전송변수명
        obj.name = req.body.name;
        obj.price = Number(req.body.price);
        obj.quantity = Number(req.body.quantity);
        obj.content = req.body.content;
        obj.categorycode = req.body.categorycode;
        obj.regdate  = moment().format('YYYY-MM-DD HH:mm:ss');

        const result = await obj.save();
        if(result !== null){
            return res.send({status:200, result:result});
        }
    }

    catch(e){
        console.error(e);
        return res.send({status:-1, result:e});
    }
});

module.exports = router;

 

 

오후 수업
ex_sell.js 만들어봄

var express = require('express');
var router = express.Router();

// 판매자 등록시 이메일 정보 확인
const ex_auth = require('../token/ex_auth');

// 커뮤니티
var Community = require('../models/ex_communitymodel');

// 커뮤니티 등록된 회원정보
var Register = require('../models/ex_registermodel');

// 물품
var Item = require('../models/ex_itemmodel');

//판매
var Sell = require('../models/ex_sellmodel');

// 판매등록
// 커뮤니티번호, 아이템번호
// 토큰 + {"communityno":10010, "itemno":1001}
// 127.0.0.1:3000/api/ex_sell/insert.json
router.post('/insert.json', ex_auth.checkToken, async function(req, res, next) {
    try{
        const email = req.body.TID;
        const communityno = Number(req.body.communityno);
        const itemno = Number(req.body.itemno);


        console.log(email);
        console.log(communityno);
        console.log(itemno);
        // 이메일이 커뮤니티에 가입된 회원인지 확인
        const query = { memberid : email, communityno:communityno};
        const result = await Register.findOne(query).select({_id:1});
        if(result !== null){
            //여기서 판매등록이 되어야함.
            const obj = new Sell();
            obj.communityno = communityno;
            obj.itemno      = itemno;
            obj.chk         = 1;

            console.log(obj);

            const result1 = await obj.save();
            console.log(result1);
            if(result1 !== null){
                return res.send({status:200, result:result1});
            }
        }


        return res.send({status:200, rows:result});
    }

    catch(e){
        console.error(e);
        return res.send({status:-1, result:e});
    }
});


// 판매해제
// 토큰 + {"communityno":10010, "_id":판매번호}
// 127.0.0.1:3000/api/ex_sell/delete.json
router.delete('/delete.json', async function(req, res, next) {
    try{
        const email = req.body.TID;
        const communityno = Number(req.body.communityno);

        // 이메일이 커뮤니티에 가입된 회원인지 확인
        const query  = { memberid : email, communityno:communityno};
        const result = await Register.findOne(query).select({_id:1});
        if(result !== null){
            // 여기서 삭제수행
            const query = {_id : Number(req.body._id)};
            const obj   = await Sell.findOne(query);
            obj.chk     = 0;
            const result1 = await Sell.save();

            if(result1 !== null){
                return res.send({status:200, result:result1});
            }
        }


        return res.send({status:200, rows:result});
    }

    catch(e){
        console.error(e);
        return res.send({status:-1, result:e});
    }
});

module.exports = router;


post insert
가입된 사람에 한해서만 판매등록을 할 수 있게해야함
(커뮤니티에 속하고 있는지 확인이 먼저임) 
이걸 레지스터에서 해줘야함(Register.findOne)
멤버아이디와 커뮤니티 넘버가 일치하는지 확인

판매등록은 아래 이프문에서 시작해야함(뷰에서 작업해줌)

판매해제
chk를 이용하여 거래내역은 남김

ItemCommunity.vue

<template>
    <div>
        <h3>물품관리</h3>
        {{state}}
        <br/>
        물품명: <input type="text" v-model="state.name" style="border:1px solid #cccccc"/><br/>
        내용: <input type="text" v-model="state.content" style="border:1px solid #cccccc"/><br/>
        가격: <input type="text" v-model="state.price" style="border:1px solid #cccccc"/><br/>
        수량: <input type="text" v-model="state.quantity" style="border:1px solid #cccccc"/><br/>
        분류: <select v-model="state.cate" style="border:1px solid #cccccc">
                <option v-for="tmp of state.category" :key="tmp" :value="tmp._id">{{tmp.name}}</option>
        
        </select><br/>
        <button
        style="border: 3px solid #cccccc"
        @click="handleItemInsert()">판매등록</button>

    </div>
</template>

<script>
import { reactive } from '@vue/reactivity'
import { useRoute } from 'vue-router';
import { onMounted } from '@vue/runtime-core';
import axios from 'axios';
export default {
    setup () {
        const route = useRoute();

        const state = reactive({
            category : [],
            cate : '',
            name :'',
            price :0,
            content :'',
            quantity : '',
            auth : sessionStorage.getItem("AUTH"),
            communityno : Number(route.query.cno),
            itemno : ''
        });

        const handleData = async() =>{
            const url = `/api/ex_category/selectlist.json`;
            const headers = {"Content-Type":"application/json"};
            const {data} = await axios.get(url, {headers});
            console.log(data);
            state.category = data.rows
            console.log(data.rows);
        }

        onMounted(()=>{
            handleData();
        });

        const handleItemInsert = async() =>{
            const url = `/api/ex_item/insert.json`;
            const headers = {"Content-Type":"application/json"}
            const body = {
                "name" : state.name,
                "price" : state.price,
                "content" : state.content,
                "quantity" : state.quantity,
                "categorycode" : state.cate
            }
            const {data} =  await axios.post(url, body, {headers});
            console.log(data);
            if(data.status === 200){
                const url1 = `/api/ex_sell/insert.json`;
                const headers1 = {"Content-Type":"application/json", "auth" : state.auth};
                const body1 = {
                    "communityno" : state.communityno,
                    "itemno" : data.result._id
                }
                console.log(body1);
                const response = await axios.post(url1, body1, {headers:headers1});
                console.log(response.data);
                if(response.data.status === 200){
                    alert('판매 물품이 등록되었습니다.');
                }
            }

        };


        return {state, handleItemInsert}
    }
}
</script>

<style lang="scss" scoped>

</style>

 

select박스 데이터 value값을 표기와 보여주는걸로 하는것

분류: <select v-model="state.cate" style="border:1px solid #cccccc">
        <option v-for="tmp of state.category" :key="tmp" :value="tmp._id">{{tmp.name}}</option>
</select><br/>

 

 


물품에는 물품만 올리고(소유없이 물건 먼저 올려줬고)
itemcommunity에 iteminsert를 해줘야 내가 올린 것이 됨 

그래서 물품을 올리고(item에 등록) data.status가 200이 출력되면서 같이 나오는 아이템 넘버를 바로 올려줌(sell에 등록)

커뮤니티 번호는 쿼리로 받아옴

        const handleItemInsert = async() =>{
            const url = `/api/ex_item/insert.json`;
            const headers = {"Content-Type":"application/json"}
            const body = {
                "name" : state.name,
                "price" : state.price,
                "content" : state.content,
                "quantity" : state.quantity,
                "categorycode" : state.cate
            }
            const {data} =  await axios.post(url, body, {headers});
            console.log(data);
            if(data.status === 200){
                const url1 = `/api/ex_sell/insert.json`;
                const headers1 = {"Content-Type":"application/json", "auth" : state.auth};
                const body1 = {
                    "communityno" : state.communityno,
                    "itemno" : data.result._id
                }
                console.log(body1);
                const response = await axios.post(url1, body1, {headers:headers1});
                console.log(response.data);
                if(response.data.status === 200){
                    alert('판매 물품이 등록되었습니다.');
                }
            }

        };