Skip to content
Snippets Groups Projects
Commit 50b6241d authored by LeeYongJae's avatar LeeYongJae
Browse files

Merge branch 'sell_YJ' into 'master'

Sell 기능 (일부) 추가

See merge request !16
parents 272dc6e5 0b61497a
No related branches found
No related tags found
1 merge request!16Sell 기능 (일부) 추가
...@@ -19,7 +19,9 @@ mongoose.Promise = global.Promise; ...@@ -19,7 +19,9 @@ mongoose.Promise = global.Promise;
var mongoDB = "mongodb+srv://dragonash:team202@cluster0-sgfno.mongodb.net/test"; var mongoDB = "mongodb+srv://dragonash:team202@cluster0-sgfno.mongodb.net/test";
var promise = mongoose.connect(mongoDB, { var promise = mongoose.connect(mongoDB, {
useMongoClient: true useNewUrlParser: true,
useUnifiedTopology: true,
useCreateIndex: true
}); });
//mongoose.connect(mongoDB); //mongoose.connect(mongoDB);
......
var mongoose = require('mongoose'); var mongoose = require("mongoose");
var Schema = mongoose.Schema; var Schema = mongoose.Schema;
var autoInc = require("mongoose-auto-increment");
const BookSchema = mongoose.Schema({ const BookSchema = new Schema({
title: {typr :String}, _id: { type: Number },
grade: { type: Number }, title: { type: String },
major: { type: String}, grade: { type: Number },
type: { type: String}, major: { type: String },
src: { type: String}, type: { type: String },
seller :[{ src: { type: String },
seller_id: { type: String}, seller: [
on_transaction : {type: Boolean} {
}], seller_id: { type: String },
on_transaction: { type: Boolean }
stock: {type: Number} }
],
stock: { type: Number }
}); });
BookSchema.statics.create = function(Book_info) { BookSchema.statics.create = function(Book_info) {
const { const {
title, title,
grade, grade,
major, major,
type, type,
src, src,
} = Book_info; stock,
seller: []
} = Book_info;
const Book = new this({
title,
grade,
major,
type,
src,
stock,
seller: []
});
// return the Promise
return Book.save();
};
const Book = new this({ autoInc.initialize(mongoose.connection);
title, BookSchema.plugin(autoInc.plugin, "Book");
grade,
major,
type,
src,
})
// return the Promise
return Book.save()
}
module.exports = mongoose.model('Book', BookSchema); module.exports = mongoose.model("Book", BookSchema);
\ No newline at end of file
var mongoose = require('mongoose'); var mongoose = require("mongoose");
var Schema = mongoose.Schema; var Schema = mongoose.Schema;
var autoInc = require("mongoose-auto-increment");
const TransactionSchema = mongoose.Schema({ const TransactionSchema = new Schema({
buyerid : {type:String}, _id: Number,
sellerid : {type:String}, buyerid: { type: String },
ontransaction :{type:Boolean} sellerid: { type: String },
ontransaction: { type: Boolean }
}); });
autoInc.initialize(mongoose.connection);
TransactionSchema.plugin(autoInc.plugin, "transaction");
module.exports = mongoose.model("transaction", TransactionSchema);
module.exports = mongoose.model('transaction', TransactionSchema);
\ No newline at end of file
var mongoose = require("mongoose"); var mongoose = require("mongoose");
var Schema = mongoose.Schema; var Schema = mongoose.Schema;
var autoInc = require("mongoose-auto-increment");
var userSchema = new Schema({ var userSchema = new Schema({
_id: Number,
user: String, user: String,
name: String, name: String,
id: String, id: String,
...@@ -11,4 +13,7 @@ var userSchema = new Schema({ ...@@ -11,4 +13,7 @@ var userSchema = new Schema({
create_date: { type: Date, default: Date.now } create_date: { type: Date, default: Date.now }
}); });
autoInc.initialize(mongoose.connection);
userSchema.plugin(autoInc.plugin, "user");
module.exports = mongoose.model("user", userSchema); module.exports = mongoose.model("user", userSchema);
...@@ -14,9 +14,10 @@ ...@@ -14,9 +14,10 @@
"express-session": "^1.17.0", "express-session": "^1.17.0",
"http-errors": "~1.6.3", "http-errors": "~1.6.3",
"mongoose": "^5.7.12", "mongoose": "^5.7.12",
"mongoose-auto-increment": "^5.0.1",
"morgan": "~1.9.1", "morgan": "~1.9.1",
"nodemailer": "^6.4.0",
"pug": "2.0.0-beta11", "pug": "2.0.0-beta11",
"session-file-store": "^1.3.1", "session-file-store": "^1.3.1"
"nodemailer": "^6.4.0"
} }
} }
var express = require('express'); var express = require("express");
var router = express.Router(); var router = express.Router();
var fs = require('fs'); var fs = require("fs");
var path = require('path'); var path = require("path");
var User = require('../models/user'); var User = require("../models/user");
var Book = require('../models/Book'); var Book = require("../models/Book");
router.get('/', function(req, res) { // 책 목록 불러오기
console.log("Get start") router.get("/", function(req, res) {
Book.find({}, function(err, Books){ console.log("Get start");
if(err) res.json({result: false, message: "not found Books"}) Book.find({}, function(err, Books) {
res.json(Books); if (err) res.json({ result: false, message: "not found Books" });
}) res.json(Books);
});
});
// 특정 책 불러오기(id값으로 불러옴)
router.get("/:id", function(req, res) {
Book.findById(req.params.id, function(err, book) {
if (err) {
console.error(err);
return;
}
if (!book) {
res.json({ result: false, message: "Cannot find book" });
}
res.send(book);
});
}); });
router.post('/', function(req, res) { // 책 추가
console.log("Post start") router.post("/", function(req, res) {
const Book_info = req.body; console.log("Post start");
const Book_info = req.body;
Book.create(Book_info) Book.create(Book_info)
.then(result => { .then(result => {
if(result) res.json({result:true}); if (result) res.json({ result: true });
else res.json({result:false}); else res.json({ result: false });
})
.catch(function(error) {
console.log(error);
}); });
}); });
module.exports = router; // 책 판매
\ No newline at end of file router.post("/:id", function(req, res) {
Book.findById(req.params.id, function(err, book) {
if (err) {
console.error(err);
return;
}
console.log(req.body.userId);
book.seller.push({ seller_id: req.body.userId, on_transaction: false });
book.stock++;
book.save();
res.json({ result: true });
});
});
module.exports = router;
...@@ -43,7 +43,7 @@ router.get("/logout", function(req, res) { ...@@ -43,7 +43,7 @@ router.get("/logout", function(req, res) {
if (err) { if (err) {
console.log(err); console.log(err);
} else { } else {
res.redirect("/"); // 수정해야 할 듯 res.redirect("/");
} }
}); });
} else { } else {
...@@ -59,4 +59,13 @@ router.get("/checkSession", function(req, res) { ...@@ -59,4 +59,13 @@ router.get("/checkSession", function(req, res) {
} }
}); });
router.get("/getUserId", function(req, res) {
console.log("getUserId start");
var sess = req.session;
console.log(sess.userid);
if (sess.userid) {
res.json(sess.userid);
}
});
module.exports = router; module.exports = router;
...@@ -22,29 +22,34 @@ ...@@ -22,29 +22,34 @@
color="#999" color="#999"
style="float: left; marginLeft: 1%; width: 2%; marginTop:0.1%" style="float: left; marginLeft: 1%; width: 2%; marginTop:0.1%"
v-on:click="Search" v-on:click="Search"
>검색</md-button> >검색</md-button
>
<!-- ==================================================================== --> <!-- ==================================================================== -->
<div v-if="SearchResult === true"> <div v-if="SearchResult === true">
<div v-for="Book in Books" :key="Book.id"> <div v-for="Book in Books" :key="Book._id">
<md-card <md-card
style="width: 50%; margin: 4px;marginTop:100px; display: inline-block; vertical-align: top;" style="width: 50%; margin: 4px;marginTop:100px; display: inline-block; vertical-align: top;"
> >
<md-card-header> <md-card-header>
<md-card-header-text> <md-card-header-text>
<div class="md-title"> <div class="md-title">
{{Book.title}} {{ Book.title }}
<br /> <br />
<br /> <br />
</div> </div>
<div class="md-subhead" style="text-align:left;font-weight: bold;"> <div
# 학년: {{Book.grade}} class="md-subhead"
style="text-align:left;font-weight: bold;"
>
# 학년: {{ Book.grade }}
<br /> <br />
# 전공: {{Book.major}} # 전공: {{ Book.major }}
<br /> <br />
# 세부사항: {{Book.type}} # 세부사항: {{ Book.type }}
<br />
# 매물: {{ Book.stock }}
<br /> <br />
# 매물: {{Book.stock}}
</div> </div>
</md-card-header-text> </md-card-header-text>
<md-card-media md-medium> <md-card-media md-medium>
...@@ -52,7 +57,11 @@ ...@@ -52,7 +57,11 @@
</md-card-media> </md-card-media>
</md-card-header> </md-card-header>
<md-card-actions> <md-card-actions>
<md-button class="md-raised md-accent">Sell</md-button> <md-button
class="md-raised md-accent"
v-on:click="goSellPage(Book._id)"
>Sell</md-button
>
<md-button class="md-raised md-primary">Buy Now</md-button> <md-button class="md-raised md-primary">Buy Now</md-button>
</md-card-actions> </md-card-actions>
</md-card> </md-card>
...@@ -60,15 +69,21 @@ ...@@ -60,15 +69,21 @@
</div> </div>
<!-- ============================================= --> <!-- ============================================= -->
<div> <div>
<md-speed-dial :class="bottomPosition" style="marginRight:20%; marginBottom:8%"> <md-speed-dial
:class="bottomPosition"
style="marginRight:20%; marginBottom:8%"
>
<md-button class="md-fab md-primary" v-on:click="active = true"> <md-button class="md-fab md-primary" v-on:click="active = true">
<img src="../assets/icon-add.svg" /> <img src="../assets/icon-add.svg" />
</md-button> </md-button>
</md-speed-dial> </md-speed-dial>
</div> </div>
<!-- =============서포터즈 submit 양식 ================== --> <!-- ============= 판매도서 submit 양식 ================== -->
<div> <div>
<md-dialog :md-active.sync="active" style="width : 500px; height: 1000px "> <md-dialog
:md-active.sync="active"
style="width : 500px; height: 1000px "
>
<md-dialog-title>판매도서 등록</md-dialog-title> <md-dialog-title>판매도서 등록</md-dialog-title>
<md-field class="select"> <md-field class="select">
<label>책제목</label> <label>책제목</label>
...@@ -87,7 +102,9 @@ ...@@ -87,7 +102,9 @@
<md-input v-model="submit.src"></md-input> <md-input v-model="submit.src"></md-input>
</md-field> </md-field>
<md-dialog-actions> <md-dialog-actions>
<md-button class="md-primary" v-on:click="active = false">Close</md-button> <md-button class="md-primary" v-on:click="active = false"
>Close</md-button
>
<md-button class="md-primary" v-on:click="Register">Submit</md-button> <md-button class="md-primary" v-on:click="Register">Submit</md-button>
</md-dialog-actions> </md-dialog-actions>
</md-dialog> </md-dialog>
...@@ -96,98 +113,91 @@ ...@@ -96,98 +113,91 @@
</div> </div>
</template> </template>
<script> <script>
import Vue from 'vue' import Vue from "vue";
import VueMaterial from 'vue-material' import VueMaterial from "vue-material";
import Multiselect from 'vue-multiselect' import Multiselect from "vue-multiselect";
import 'vue-material/dist/vue-material.min.css' import "vue-material/dist/vue-material.min.css";
import 'vue-material/dist/theme/default.css' import "vue-material/dist/theme/default.css";
Vue.use(VueMaterial) Vue.use(VueMaterial);
export default { export default {
components: { Multiselect }, components: { Multiselect },
name: 'MaterialIcons', name: "MaterialIcons",
data() { data() {
return { return {
bottomPosition: 'md-bottom-right', bottomPosition: "md-bottom-right",
active : false, active: false,
SearchResult : false, SearchResult: false,
grade: null, grade: null,
major: null, major: null,
type: null, type: null,
option1: ['1학년','2학년','3학년','4학년'], option1: ["1학년", "2학년", "3학년", "4학년"],
option2: ['소프트웨어학과','미디어학과','경제학과'], option2: ["소프트웨어학과", "미디어학과", "경제학과"],
option3: ['전공 필수', '전공 선택', '교양선택','기초과목'], option3: ["전공 필수", "전공 선택", "교양선택", "기초과목"],
Books : [ Books: [],
], submit: {
submit:{ title: "",
title : "", grade: "",
grade: "", major: "",
major : "", src: "",
src : "", stock: 0,
} seller: []
}; }
};
},
created() {
this.$http.get("/api/books").then(response => {
this.Books = response.data;
console.log("Success");
console.log(this.Books);
});
},
methods: {
Search: function() {
if (this.grade !== null && this.major !== null && this.type !== null) {
this.SearchResult = true;
console.log(this.SearchResult);
} else {
alert("검색할 카테고리를 전부 입력해주세요");
}
}, },
created() { Register() {
this this.$http
.$http .post("/api/books", this.submit)
.get('/api/books') .then(res => {
.then(response => { console.log("Submit Success");
this.Books = response.data; })
console.log("Success") .catch(err => {
console.log(this.Books) console.log("Submit failed");
}) });
}, this.active = false;
methods:{ },
Search: function(){ goSellPage(bookId) {
if(this.grade !== null && this.major !== null && this.type !== null) this.$router.push({ name: "BookSearchPageSell", params: { id: bookId } });
{
this.SearchResult = true;
console.log(this.SearchResult);
}
else
{
alert("검색할 카테고리를 전부 입력해주세요")
}
},
Register(){
this.$http
.post("/api/books", this.submit)
.then(res => {
console.log("Sumit Success");
})
.catch(err => {
console.log("Submit failed");
});
this.active = false;
} }
} }
}; };
</script> </script>
<style lang="css">
<style lang='css'> html,
html,body { body {
text-align: center; text-align: center;
margin:0; margin: 0;
width:100%; width: 100%;
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
justify-content: center; justify-content: center;
} }
.search { .search {
margin-Bottom: 0.5%; margin-bottom: 0.5%;
} }
.select { .select {
margin: 15px;
text-align: center; text-align: center;
margin-Top: 2%; margin-top: 2%;
} }
.button{ .button {
margin-top: 70px; margin-top: 70px;
} }
</style> </style>
<style src="vue-multiselect/dist/vue-multiselect.min.css"> <style src="vue-multiselect/dist/vue-multiselect.min.css"></style>
</style>
\ No newline at end of file
<template>
<div>
<md-card
style="width: 50%; margin: 4px; marginTop:100px; display: inline-block; vertical-align: top;"
>
<md-card-header>
<md-card-header-text>
<div class="md-title">
{{ book.title }}
<br />
<br />
</div>
<div class="md-subhead" style="text-align:left; font-weight:bold;">
# 학년: {{ book.grade }}
<br />
# 전공: {{ book.major }}
<br />
# 세부사항: {{ book.type }}
<br />
# 매물: {{ book.stock }}
<br />
</div>
</md-card-header-text>
<md-card-media md-medium>
<img v-bind:src="book.src" />
</md-card-media>
</md-card-header>
</md-card>
<md-card
style="width: 50%; margin: 4px; marginTop:100px; display: inline-block; vertical-align: top;"
>
<md-card-header>
<div class="md-title">
이 책을 판매하시겠습니까?
</div>
</md-card-header>
<md-card-actions>
<md-button class="md-raised md-primary" v-on:click="sellBook"
>판매</md-button
>
</md-card-actions>
</md-card>
</div>
</template>
<script>
import Vue from "vue";
import VueMaterial from "vue-material";
import Multiselect from "vue-multiselect";
import "vue-material/dist/vue-material.min.css";
import "vue-material/dist/theme/default.css";
Vue.use(VueMaterial);
export default {
data() {
return {
book: {},
userId: ""
};
},
created() {
var id = this.$route.params.id;
this.$http.get(`/api/books/${id}`).then(response => {
this.book = response.data;
});
// this.$http.get("/api/login/getUserId").then(response => {
// console.log("getUserIDstart");
// this.userId = response.data;
// });
},
methods: {
getId() {
this.$http.get("/api/login/getUserId").then(response => {
console.log("rd" + response.data);
this.userId = response.data;
});
},
sellBook() {
var id = this.$route.params.id;
this.getId();
console.log("user:" + this.userId);
this.$http
.post(`/api/books/${id}`, {
userId: this.userId
})
.then(
response => {
alert("판매 대기열에 등록하였습니다.");
//this.$router.push("home");
},
error => {
alert(error.response.data.error);
}
)
.catch(error => {
alert(error);
});
}
}
};
</script>
<template> <template>
<div id="login"> <div id="login">
<md-button class="md-primary" v-on:click="active = true">Login</md-button> <md-button class="md-primary" v-on:click="active = true">Login</md-button>
<md-dialog :md-active.sync="active" style="width: 500px; height: 1000px"> <md-dialog :md-active.sync="active" style="width: 500px; height: 500px">
<md-dialog-title>Login</md-dialog-title> <md-dialog-title>Login</md-dialog-title>
<md-field class="select"> <md-field class="select">
<label>ID</label> <label>ID</label>
...@@ -47,7 +47,6 @@ export default { ...@@ -47,7 +47,6 @@ export default {
response => { response => {
//로그인 성공 //로그인 성공
alert("success login"); alert("success login");
//this.$router.push("Logout");
this.active = false; this.active = false;
location.reload(); location.reload();
}, },
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
</div> </div>
</template> </template>
<style> <style scoped>
.select { .select {
margin: 15px; margin: 15px;
display: inline-flex; display: inline-flex;
......
...@@ -8,6 +8,8 @@ import BookSearchPage from "@/components/BookSearchPage"; ...@@ -8,6 +8,8 @@ import BookSearchPage from "@/components/BookSearchPage";
import Login from "@/components/login/Login"; import Login from "@/components/login/Login";
import Logout from "@/components/login/Logout"; import Logout from "@/components/login/Logout";
import SignUp from "@/components/login/SignUp"; import SignUp from "@/components/login/SignUp";
import Buy from "@/components/Buy";
import Sell from "@/components/Sell";
export default new Router({ export default new Router({
mode: "history", mode: "history",
...@@ -47,6 +49,26 @@ export default new Router({ ...@@ -47,6 +49,26 @@ export default new Router({
path: "/signUp", path: "/signUp",
name: "SignUp", name: "SignUp",
component: SignUp component: SignUp
},
{
path: "/BookSearchPage/buy/:id",
name: "BookSearchPageBuy",
component: Buy
},
{
path: "/home/buy/:id",
name: "HomeBuy",
component: Buy
},
{
path: "/BookSearchPage/sell/:id",
name: "BookSearchPageSell",
component: Sell
},
{
path: "/home/sell/:id",
name: "HomeSell",
component: Sell
} }
] ]
}); });
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment