요약정리
정적인걸 먼저 만들고 동적인것에 데이터 기입(데이터 관리가 쉬워짐)
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('판매 물품이 등록되었습니다.');
}
}
};
'mongoDB + Postman + vue' 카테고리의 다른 글
국비 코딩 풀스택 수업 30일차 result obj 병합, 주문내역 메뉴 불러오기(relationship 2번 찾아가기), build , 다음 우편 주소api (0) | 2022.08.02 |
---|---|
국비 코딩 풀스택 수업 28일차 배민같은 로직, 포트번호 수정, 뷰 폴더2개, 작업 폴더분류예정 (0) | 2022.07.29 |
국비 코딩 풀스택 수업 26일차 백엔드 반복문, 이전페이지 정보저장, table쿼리 다음페이지로 route활용 (0) | 2022.07.27 |
국비 코딩 풀스택 수업 25일차 커뮤니티, 레지스터, 뷰티파이 (0) | 2022.07.26 |
국비 코딩 풀스택 수업 24일차 첫 뷰 프로젝트 생성부터 설정까지 (0) | 2022.07.25 |