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

Buy with email

parent ba43b423
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,7 @@ var FileStore = require("session-file-store")(session);
var bookRouter = require("./routes/books");
var loginRouter = require("./routes/login");
var emailRouter = require("./routes/emails");
var transactionRouter = require("./routes/transaction");
var app = express();
......@@ -49,6 +50,7 @@ app.use(express.static(path.join(__dirname, "public")));
app.use("/api/books", bookRouter);
app.use("/api/login", loginRouter);
app.use("/api/emails", emailRouter);
app.use("/api/transaction", transactionRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
......
......@@ -4,9 +4,10 @@ var autoInc = require("mongoose-auto-increment");
const TransactionSchema = new Schema({
_id: Number,
buyerid: { type: String },
sellerid: { type: String },
ontransaction: { type: Boolean }
bookTitle: { type: String },
buyerId: { type: String },
sellerId: { type: String },
on_transaction: { type: Boolean }
});
autoInc.initialize(mongoose.connection);
......
......@@ -9,7 +9,7 @@ var userSchema = new Schema({
id: String,
password: String,
email: String,
isLoggedIn: Boolean,
phonenumber: String,
create_date: { type: Date, default: Date.now }
});
......
......@@ -43,7 +43,7 @@ router.post("/", function(req, res) {
});
});
// 책 판매
// 책 구매 및 판매
router.post("/:id", function(req, res) {
Book.findById(req.params.id, function(err, book) {
if (err) {
......@@ -51,6 +51,19 @@ router.post("/:id", function(req, res) {
return;
}
console.log(req.body.userId);
if (req.body.isBuyer === true) {
// var soldbook = book.seller.shift();
// book.stock--;
// book.save();
console.log(book.seller);
var temp = book.seller.find(element => element.on_transaction === false);
// book.seller.find(
// element => element.on_transaction === false
// ).on_transaction = true;
// book.save();
res.json({ result: temp });
return;
}
book.seller.push({ seller_id: req.body.userId, on_transaction: false });
book.stock++;
book.save();
......
const express = require('express');
const nodemailer = require('nodemailer');
const express = require("express");
const nodemailer = require("nodemailer");
const router = express.Router();
router.get("", function(req, res, next){
let email = "hj950000@ajou.ac.kr"
router.post("/", function(req, res, next) {
console.log("email backend start");
let sellerEmail = req.body.sellerEmail;
let bookTitle = req.body.bookTitle;
let buyerPhoneNumber = req.body.buyerPhoneNumber;
let transporter = nodemailer.createTransport({
service: 'gmail',
service: "gmail",
auth: {
user: 'majorbook202@gmail.com', // gmail 계정 아이디를 입력
pass: 'dnjfdydlf' // gmail 계정의 비밀번호를 입력
user: "majorbook202@gmail.com", // gmail 계정 아이디를 입력
pass: "dnjfdydlf" // gmail 계정의 비밀번호를 입력
}
});
let mailOptions = {
from: 'majorbook202@gmail.com', // 발송 메일 주소 (위에서 작성한 gmail 계정 아이디)
to: "hj950000@ajou.ac.kr", // 수신 메일 주소
subject: 'MajorBook구매요청이 들어왔습니다.', // 제목
text: '올리신 책 ~~에 대한 구매요청이 도착했습니다. 해당 구매자의 전화번호는 ~~입니다.' // 내용
from: "majorbook202@gmail.com", // (위에서 작성한 gmail 계정 아이디)
to: sellerEmail, // selleremail
subject: "MajorBook구매요청이 들어왔습니다.", // 제목
text:
"올리신 책" +
bookTitle +
"에 대한 구매요청이 도착했습니다. 해당 구매자의 전화번호는" +
buyerPhoneNumber +
"입니다." // 내용
};
transporter.sendMail(mailOptions, function(error, info){
transporter.sendMail(mailOptions, function(error, info) {
if (error) {
console.log(error);
}
else {
console.log('Email sent: ' + info.response);
} else {
console.log("Email sent: " + info.response);
}
});
})
});
module.exports = router;
\ No newline at end of file
module.exports = router;
......@@ -8,7 +8,7 @@ router.post("/signUp", function(req, res, next) {
user.password = req.body.user.password;
user.name = req.body.user.name;
user.email = req.body.user.email;
user.isLoggedIn = req.body.user.isLoggedIn;
user.phonenumber = req.body.user.phonenumber;
user.save(function(err) {
if (err) {
......@@ -68,4 +68,19 @@ router.get("/getUserId", function(req, res) {
}
});
router.post("/getUserInfo", function(req, res) {
console.log("getUserInfo start");
var getInfoId = req.body.userId;
console.log(getInfoId);
User.findOne({ id: getInfoId }, function(err, user) {
if (err) {
res.send(err);
}
if (!user) {
return res.status(404).json({ error: "user not found" });
}
res.json(user);
});
});
module.exports = router;
const express = require("express");
const router = express.Router();
const Transaction = require("../models/transaction");
router.get("/", function(req, res) {
console.log("Get transaction start");
Transaction.find({}, function(err, transactions) {
if (err) {
res.json({ result: false, message: "Not found transactions" });
return;
}
res.json(transactions);
});
});
router.post("/", function(req, res) {
console.log("Post transaction start");
var transaction = new Transaction();
transaction.buyerId = req.body.buyerId;
console.log(req.body.buyerId);
transaction.sellerId = req.body.sellerId;
console.log(req.body.sellerId);
transaction.bookTitle = req.body.bookTitle;
transaction.on_transaction = true;
transaction.save(function(err) {
if (err) {
console.error(err);
res.json({ result: 0 });
return;
}
res.json({ result: 1 });
});
});
module.exports = router;
......@@ -22,8 +22,7 @@
color="#999"
style="float: left; marginLeft: 1%; width: 2%; marginTop:0.1%"
v-on:click="Search"
>검색</md-button
>
>검색</md-button>
<!-- ==================================================================== -->
<div v-if="SearchResult === true ">
......@@ -38,10 +37,7 @@
<br />
<br />
</div>
<div
class="md-subhead"
style="text-align:left;font-weight: bold;"
>
<div class="md-subhead" style="text-align:left;font-weight: bold;">
# 학년: {{ Book.grade }}
<br />
# 전공: {{ Book.major }}
......@@ -57,22 +53,15 @@
</md-card-media>
</md-card-header>
<md-card-actions>
<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-accent" v-on:click="goSellPage(Book._id)">Sell</md-button>
<md-button class="md-raised md-primary" v-on:click="goBuyPage(Book._id)">Buy Now</md-button>
</md-card-actions>
</md-card>
</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">
<img src="../assets/icon-add.svg" />
</md-button>
......@@ -80,10 +69,7 @@
</div>
<!-- ============= 판매도서 submit 양식 ================== -->
<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-field class="select">
<label>책제목</label>
......@@ -102,9 +88,7 @@
<md-input v-model="submit.src"></md-input>
</md-field>
<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-dialog-actions>
</md-dialog>
......@@ -168,6 +152,9 @@ export default {
});
this.active = false;
},
goBuyPage(bookId) {
this.$router.push({ name: "BookSearchPageBuy", params: { id: bookId } });
},
goSellPage(bookId) {
this.$router.push({ name: "BookSearchPageSell", params: { id: bookId } });
}
......
<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="buyBook">구매</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 {
buyer: {},
seller: {},
book: {},
userId: "",
sellerId: ""
};
},
created() {
var id = this.$route.params.id;
this.$http.get(`/api/books/${id}`).then(response => {
this.book = response.data;
});
},
methods: {
buyBook() {
this.$http.get("/api/login/getUserId").then(response => {
console.log("rd" + response.data);
this.userId = response.data;
var id = this.$route.params.id;
console.log("user:" + this.userId);
this.$http
.post(`/api/books/${id}`, {
userId: this.userId,
isBuyer: true
})
.then(
res => {
console.log(res.data);
this.sellerId = res.data.result.seller_id;
this.$http
.post("/api/transaction", {
buyerId: this.userId,
sellerId: this.sellerId,
bookTitle: this.book.title
})
.then(response => {
console.log("buy.vue-transaction post");
alert("구매에 성공하였습니다. 판매자에게 메일을 보냅니다.");
this.sendEmail();
});
},
error => {
alert(error.response.data.error);
}
)
.catch(error => {
alert(error);
});
});
},
sendEmail() {
console.log("sendEmail start");
this.$http
.post("/api/login/getUserInfo", {
userId: this.userId // buyer
})
.then(response => {
this.buyer = response.data;
});
this.$http
.post("/api/login/getUserInfo", {
userId: this.sellerId
})
.then(response => {
this.seller = response.data;
});
this.$http
.post("/api/emails", {
sellerEmail: this.seller.email,
bookTitle: this.book.title,
buyerPhoneNumber: this.buyer.phonenumber
})
.then(response => {
alert("이메일 전송 완료");
}),
error => {
alert(error.response.data.error);
};
}
}
};
</script>
\ No newline at end of file
......@@ -31,14 +31,10 @@
style="width: 50%; margin: 4px; marginTop:100px; display: inline-block; vertical-align: top;"
>
<md-card-header>
<div class="md-title">
이 책을 판매하시겠습니까?
</div>
<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-button class="md-raised md-primary" v-on:click="sellBook">판매</md-button>
</md-card-actions>
</md-card>
</div>
......@@ -64,38 +60,31 @@ export default {
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() {
sellBook() {
this.$http.get("/api/login/getUserId").then(response => {
console.log("rd" + response.data);
this.userId = response.data;
var id = this.$route.params.id;
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);
});
});
},
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);
});
}
}
};
......
......@@ -23,12 +23,13 @@
<md-input name="email" v-model="user.email" />
</md-field>
<md-button class="md-raised md-primary" v-on:click="signUp"
>Sign Up</md-button
>
<md-button class="md-primary" v-on:click="active = false"
>Close</md-button
>
<md-field class="select">
<label for="phonenumber">Phone Number</label>
<md-input name="phonenumber" v-model="user.phonenumber" />
</md-field>
<md-button class="md-raised md-primary" v-on:click="signUp">Sign Up</md-button>
<md-button class="md-primary" v-on:click="active = false">Close</md-button>
</md-dialog>
</div>
</template>
......@@ -60,7 +61,7 @@ export default {
password: "",
name: "",
email: "",
isLoggedIn: false
phonenumber: ""
},
sending: false,
active: false
......@@ -79,7 +80,7 @@ export default {
this.active = false;
}
if (response.data.result === 1) {
alert("Success");
alert("Success Sign Up !");
this.active = false;
}
})
......
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