정소현

new file: app.js

	new file:   bin/www
	new file:   models/boardsSchema.js
	new file:   package.json
	new file:   public/images/noImage.jpg
	new file:   "public/images/\352\263\240\354\247\204\353\247\216\353\217\204\354\213\234\353\235\2751\355\216\270.jpg"
	new file:   "public/images/\352\263\240\354\266\224\354\260\270\354\271\230\354\202\274\352\260\201\352\271\200\353\260\245.jpg"
	new file:   "public/images/\353\215\224\355\201\260)\353\266\210\352\263\240\352\270\260\354\243\274\353\250\271\353\260\2451\355\216\270.jpg"
	new file:   "public/images/\353\215\224\355\201\260)\353\266\210\355\203\200\353\212\224\353\252\205\353\236\200\353\247\210\354\232\2241\355\216\270.jpg"
	new file:   "public/images/\353\221\220\355\210\274\355\225\234\353\223\261\354\213\254\353\217\210\352\260\200\354\212\244.jpg"
	new file:   "public/images/\353\247\245\354\225\244\354\271\230\354\246\210\355\225\240\353\235\274\355\224\274\353\207\250\354\203\214\353\223\2341\355\216\270.jpg"
	new file:   "public/images/\353\260\224\353\262\240\355\201\220\355\217\255\353\246\275\353\217\204\354\213\234\353\235\275.jpg"
	new file:   "public/images/\353\271\204\353\271\224\355\226\204\354\260\270\354\271\230\354\243\274\353\250\271\353\260\245.jpg"
	new file:   "public/images/\354\212\244\355\214\270\354\203\214\353\223\234\354\234\204\354\271\230.jpg"
	new file:   "public/images/\354\225\274\354\261\204\354\260\270\354\271\230\354\202\274\352\260\201\352\271\200\353\260\245.jpg"
	new file:   "public/images/\354\226\221\353\205\220\354\210\257\353\266\210\352\260\210\353\271\204\353\247\233.jpg"
	new file:   "public/images/\354\230\254\355\217\254\354\234\2401\355\216\270.jpg"
	new file:   "public/images/\354\260\270\354\271\230\352\271\200\354\271\230\353\263\266\354\235\214.jpg"
	new file:   "public/images/\354\271\230\354\246\210\352\260\220\355\212\200\354\203\214\353\223\234\354\234\204\354\271\230.jpg"
	new file:   "public/images/\355\206\265\354\203\210\354\232\260&\354\227\220\352\267\270\354\203\220\353\237\254\353\223\234\354\203\214\353\223\234.jpg"
	new file:   "public/images/\355\230\234\353\246\254)New11\354\260\254\353\217\204\354\213\234\353\235\275.jpg"
	new file:   "public/images/\355\230\234\353\246\254)\353\202\250\353\217\204\353\226\241\352\260\210\353\271\204\353\217\204\354\213\234\353\235\275.jpg"
	new file:   "public/images/\355\230\234\353\246\254)\354\255\210\352\276\270\353\257\270\353\266\210\352\263\240\352\270\260\353\271\204\353\271\224\353\260\245.jpg"
	new file:   public/stylesheets/style.css
	new file:   routes/contents.js
	new file:   routes/index.js
	new file:   views/.DS_Store
	new file:   views/board.ejs
	new file:   views/boardDetail.ejs
	new file:   views/error.ejs
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose'); //**** mongodb를 연결하기 위함 ****/
var routes = require('./routes/index'); // 기본 설정
var boards = require('./routes/contents'); //**** board는 contents.js 파일로 연결하여 라우팅 ****/
var app = express();
//***** connect mongodb *****/
mongoose.connect('mongodb://2014104145:pw@ds163301.mlab.com:63301/foodrank/food');
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("connected");
});
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
app.use('/boards', boards); //*** '/boards' 주소로 들어오면 var boards = require('./routes/contents');에서 설정한 주소로 넘어가게 됨 ***/
// file upload multer
//app.use(upload.array('UploadFile',10));
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('foodrank:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
/*** 게시물 db 스키마 ***/
var mongoose = require('mongoose');
var boardSchema = mongoose.Schema({
name: String,
company: String,
category: String,
price: String,
average:Number,
comments: [{
grade: Number,
memo: String
}]
});
module.exports = mongoose.model('BoardContents', boardSchema);
{
"name": "foodrank",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.17.1",
"cookie-parser": "~1.4.3",
"debug": "~2.6.3",
"ejs": "~2.5.6",
"express": "~4.15.2",
"mongoose": "^4.10.5",
"morgan": "~1.8.1",
"multer": "^1.3.0",
"serve-favicon": "~2.4.2"
}
}
/*
••••••••••••••••••••••••
Powered by Type & Grids™
www.typeandgrids.com
••••••••••••••••••••••••
*/
/*
Responsive grid is from Skeleton by Dave Gamache
www.getskeleton.com
*/
/*===================================================================================================
Contents
=====================================================================================================
1) Reset & basics
2) Basic styles
3) Typography
4) Links
5) Lists
6) Images
7) Buttons
8) Forms
9) Misc
10) Base 960 grid
11) Tablet (Portrait)
12) Mobile (Portrait)
13) Mobile (Landscape)
14) Clearing
15) Portfolio slider
16) Site styles
17) Media queries
18) Print styles
*/
/*===================================================================================================
1) Reset & basics
===================================================================================================*/
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline; }
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
display: block; }
body {
line-height: 1; }
ol, ul {
list-style: none; }
blockquote, q {
quotes: none; }
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none; }
table {
border-collapse: collapse;
border-spacing: 0; }
/*===================================================================================================
2) Basic styles
===================================================================================================*/
body {
background: #fff;
font: 14px/21px Arial, sans-serif;
color: #444;
-webkit-font-smoothing: antialiased; /* Fix for webkit rendering */
-webkit-text-size-adjust: 100%;
-webkit-transition: background-color 0.8s ease-out;
-moz-transition: background-color 0.8s ease-out;
-o-transition: background-color 0.8s ease-out;
transition: background-color 0.8s ease-out;
}
/*===================================================================================================
3) Typography
===================================================================================================*/
h1, h2, h3, h4, h5, h6 {
color: #222;
font-family: Georgia, Arial, sans-serif;
font-weight: normal; }
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; }
h1 { font-size: 46px; line-height: 50px; margin-bottom: 14px;}
h2 { font-size: 35px; line-height: 40px; margin-bottom: 10px; }
h3 { font-size: 28px; line-height: 34px; margin-bottom: 6px; }
h4 { font-size: 21px; line-height: 30px; margin-bottom: 6px; }
h5 { font-size: 17px; line-height: 24px; }
h6 { font-size: 14px; line-height: 21px; }
.subheader { color: #777; }
p { margin: 0 0 20px 0; }
p img { margin: 0; }
p.lead { font-size: 21px; line-height: 27px; color: #777; }
em { font-style: italic; }
strong { font-weight: bold; color: #333; }
small { font-size: 80%; }
blockquote, blockquote p { font-family: Georgia, Arial, sans-serif; font-size: 14px; line-height: 1.5; font-style: italic; }
blockquote { margin: 0 0 20px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; }
blockquote cite { font-family: Arial, sans-serif; font-style: normal; font-weight: bold; display: block; padding-top: 8px; }
blockquote cite:before { content: "\2014"; }
/*blockquote cite a, blockquote cite a:visited, blockquote cite a:visited { color: #555; }*/
hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 10px 0 30px; height: 0; }
/*===================================================================================================
4) Links
===================================================================================================*/
a, a:visited { color: #333; text-decoration: underline; outline: 0; }
a:hover, a:focus { color: #777; }
p a, p a:visited { line-height: inherit; }
/*===================================================================================================
5) Lists
===================================================================================================*/
ul, ol { margin-bottom: 20px; }
ul { list-style: none outside; }
ol { list-style: decimal; }
ol, ul.square, ul.circle, ul.disc { margin-left: 30px; }
ul.square { list-style: square outside; }
ul.circle { list-style: circle outside; }
ul.disc { list-style: disc outside; }
ul ul, ul ol,
ol ol, ol ul { margin: 4px 0 5px 30px; font-size: 90%; }
ul ul li, ul ol li,
ol ol li, ol ul li { margin-bottom: 6px; }
li { line-height: 18px; margin-bottom: 12px; }
ul.large li { line-height: 21px; }
li p { line-height: 21px; }
/*===================================================================================================
6) Images
===================================================================================================*/
img.scale-with-grid {
max-width: 100%;
height: auto; }
/*===================================================================================================
7) Buttons
===================================================================================================*/
.button,
button,
input[type="submit"],
input[type="reset"],
input[type="button"] {
background: #eee; /* Old browsers */
background: #eee -moz-linear-gradient(top, rgba(255,255,255,.2) 0%, rgba(0,0,0,.2) 100%); /* FF3.6+ */
background: #eee -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.2)), color-stop(100%,rgba(0,0,0,.2))); /* Chrome,Safari4+ */
background: #eee -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */
background: #eee -o-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Opera11.10+ */
background: #eee -ms-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* IE10+ */
background: #eee linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* W3C */
border: 1px solid #aaa;
border-top: 1px solid #ccc;
border-left: 1px solid #ccc;
padding: 4px 12px;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
color: #444;
display: inline-block;
font-size: 11px;
font-weight: bold;
text-decoration: none;
text-shadow: 0 1px rgba(255, 255, 255, .75);
cursor: pointer;
/*margin-bottom: 20px;*/
line-height: normal;
padding: 8px 10px;
font-family: Arial, sans-serif; }
.button:hover,
button:hover,
input[type="submit"]:hover,
input[type="reset"]:hover,
input[type="button"]:hover {
color: #222;
background: #ddd; /* Old browsers */
background: #ddd -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); /* FF3.6+ */
background: #ddd -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.3)), color-stop(100%,rgba(0,0,0,.3))); /* Chrome,Safari4+ */
background: #ddd -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Chrome10+,Safari5.1+ */
background: #ddd -o-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Opera11.10+ */
background: #ddd -ms-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* IE10+ */
background: #ddd linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* W3C */
border: 1px solid #888;
border-top: 1px solid #aaa;
border-left: 1px solid #aaa; }
.button:active,
button:active,
input[type="submit"]:active,
input[type="reset"]:active,
input[type="button"]:active {
border: 1px solid #666;
background: #ccc; /* Old browsers */
background: #ccc -moz-linear-gradient(top, rgba(255,255,255,.35) 0%, rgba(10,10,10,.4) 100%); /* FF3.6+ */
background: #ccc -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.35)), color-stop(100%,rgba(10,10,10,.4))); /* Chrome,Safari4+ */
background: #ccc -webkit-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Chrome10+,Safari5.1+ */
background: #ccc -o-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Opera11.10+ */
background: #ccc -ms-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* IE10+ */
background: #ccc linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* W3C */ }
.button.full-width,
button.full-width,
input[type="submit"].full-width,
input[type="reset"].full-width,
input[type="button"].full-width {
width: 100%;
padding-left: 0 !important;
padding-right: 0 !important;
text-align: center; }
/* Fix for odd Mozilla border & padding issues */
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/*===================================================================================================
8) Forms
===================================================================================================*/
form {
margin-bottom: 20px; }
fieldset {
margin-bottom: 20px; }
input[type="text"],
input[type="password"],
input[type="email"],
textarea,
select {
border: 1px solid #ccc;
padding: 6px 4px;
outline: none;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
font: 13px Arial, sans-serif;
color: #444;
margin: 0;
width: 210px;
max-width: 100%;
display: block;
margin-bottom: 20px;
background: #fff; }
select {
padding: 0; }
input[type="text"]:focus,
input[type="password"]:focus,
input[type="email"]:focus,
textarea:focus {
border: 1px solid #aaa;
color: #444;
-moz-box-shadow: 0 0 3px rgba(0,0,0,.2);
-webkit-box-shadow: 0 0 3px rgba(0,0,0,.2);
box-shadow: 0 0 3px rgba(0,0,0,.2); }
textarea {
min-height: 60px; }
label,
legend {
display: block;
font-weight: bold;
font-size: 13px; }
select {
width: 220px; }
input[type="checkbox"] {
display: inline; }
label span,
legend span {
font-weight: normal;
font-size: 13px;
color: #444; }
/*===================================================================================================
9) Misc
===================================================================================================*/
.remove-bottom { margin-bottom: 0 !important; }
.half-bottom { margin-bottom: 10px !important; }
.add-bottom { margin-bottom: 20px !important; }
/*===================================================================================================
10) Base 960 grid
===================================================================================================*/
.container { position: relative; width: 960px; margin: 0 auto; padding: 0; }
.container .column,
.container .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; }
.row { margin-bottom: 20px; }
/* Nested Column Classes */
.column.alpha, .columns.alpha { margin-left: 0; }
.column.omega, .columns.omega { margin-right: 0; }
/* Base Grid */
.container .one.column,
.container .one.columns { width: 40px; }
.container .two.columns { width: 100px; }
.container .three.columns { width: 160px; }
.container .four.columns { width: 220px; }
.container .five.columns { width: 280px; }
.container .six.columns { width: 340px; }
.container .seven.columns { width: 400px; }
.container .eight.columns { width: 460px; }
.container .nine.columns { width: 520px; }
.container .ten.columns { width: 580px; }
.container .eleven.columns { width: 640px; }
.container .twelve.columns { width: 700px; }
.container .thirteen.columns { width: 760px; }
.container .fourteen.columns { width: 820px; }
.container .fifteen.columns { width: 880px; }
.container .sixteen.columns { width: 940px; }
.container .one-third.column { width: 300px; }
.container .two-thirds.column { width: 620px; }
/* Offsets */
.container .offset-by-one { padding-left: 60px; }
.container .offset-by-two { padding-left: 120px; }
.container .offset-by-three { padding-left: 180px; }
.container .offset-by-four { padding-left: 240px; }
.container .offset-by-five { padding-left: 300px; }
.container .offset-by-six { padding-left: 360px; }
.container .offset-by-seven { padding-left: 420px; }
.container .offset-by-eight { padding-left: 480px; }
.container .offset-by-nine { padding-left: 540px; }
.container .offset-by-ten { padding-left: 600px; }
.container .offset-by-eleven { padding-left: 660px; }
.container .offset-by-twelve { padding-left: 720px; }
.container .offset-by-thirteen { padding-left: 780px; }
.container .offset-by-fourteen { padding-left: 840px; }
.container .offset-by-fifteen { padding-left: 900px; }
/*===================================================================================================
11) Tablet (Portrait)
===================================================================================================*/
/* Note: Design for a width of 768px */
@media only screen and (min-width: 768px) and (max-width: 959px) {
.container { width: 768px; }
.container .column,
.container .columns { margin-left: 10px; margin-right: 10px; }
.column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; }
.column.omega, .columns.omega { margin-right: 0; margin-left: 10px; }
.alpha.omega { margin-left: 0; margin-right: 0; }
.container .one.column,
.container .one.columns { width: 28px; }
.container .two.columns { width: 76px; }
.container .three.columns { width: 124px; }
.container .four.columns { width: 172px; }
.container .five.columns { width: 220px; }
.container .six.columns { width: 268px; }
.container .seven.columns { width: 316px; }
.container .eight.columns { width: 364px; }
.container .nine.columns { width: 412px; }
.container .ten.columns { width: 460px; }
.container .eleven.columns { width: 508px; }
.container .twelve.columns { width: 556px; }
.container .thirteen.columns { width: 604px; }
.container .fourteen.columns { width: 652px; }
.container .fifteen.columns { width: 700px; }
.container .sixteen.columns { width: 748px; }
.container .one-third.column { width: 236px; }
.container .two-thirds.column { width: 492px; }
/* Offsets */
.container .offset-by-one { padding-left: 48px; }
.container .offset-by-two { padding-left: 96px; }
.container .offset-by-three { padding-left: 144px; }
.container .offset-by-four { padding-left: 192px; }
.container .offset-by-five { padding-left: 240px; }
.container .offset-by-six { padding-left: 288px; }
.container .offset-by-seven { padding-left: 336px; }
.container .offset-by-eight { padding-left: 384px; }
.container .offset-by-nine { padding-left: 432px; }
.container .offset-by-ten { padding-left: 480px; }
.container .offset-by-eleven { padding-left: 528px; }
.container .offset-by-twelve { padding-left: 576px; }
.container .offset-by-thirteen { padding-left: 624px; }
.container .offset-by-fourteen { padding-left: 672px; }
.container .offset-by-fifteen { padding-left: 720px; }
}
/*===================================================================================================
12) Mobile (Portrait)
===================================================================================================*/
/* Note: Design for a width of 320px */
@media only screen and (max-width: 767px) {
.container { width: 300px; }
.container .columns,
.container .column { margin: 0; }
.container .one.column,
.container .one.columns,
.container .two.columns,
.container .three.columns,
.container .four.columns,
.container .five.columns,
.container .six.columns,
.container .seven.columns,
.container .eight.columns,
.container .nine.columns,
.container .ten.columns,
.container .eleven.columns,
.container .twelve.columns,
.container .thirteen.columns,
.container .fourteen.columns,
.container .fifteen.columns,
.container .sixteen.columns,
.container .one-third.column,
.container .two-thirds.column { width: 300px; }
/* Offsets */
.container .offset-by-one,
.container .offset-by-two,
.container .offset-by-three,
.container .offset-by-four,
.container .offset-by-five,
.container .offset-by-six,
.container .offset-by-seven,
.container .offset-by-eight,
.container .offset-by-nine,
.container .offset-by-ten,
.container .offset-by-eleven,
.container .offset-by-twelve,
.container .offset-by-thirteen,
.container .offset-by-fourteen,
.container .offset-by-fifteen { padding-left: 0; }
}
/*===================================================================================================
13) Mobile (Landscape)
===================================================================================================*/
/* Note: Design for a width of 480px */
@media only screen and (min-width: 480px) and (max-width: 767px) {
.container { width: 420px; }
.container .columns,
.container .column { margin: 0; }
.container .one.column,
.container .one.columns,
.container .two.columns,
.container .three.columns,
.container .four.columns,
.container .five.columns,
.container .six.columns,
.container .seven.columns,
.container .eight.columns,
.container .nine.columns,
.container .ten.columns,
.container .eleven.columns,
.container .twelve.columns,
.container .thirteen.columns,
.container .fourteen.columns,
.container .fifteen.columns,
.container .sixteen.columns,
.container .one-third.column,
.container .two-thirds.column { width: 420px; }
}
/*===================================================================================================
14) Clearing
===================================================================================================*/
/* Self clearing goodness */
.container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; }
/* Use clearfix class on parent to clear nested columns, or wrap each row of columns in a <div class="row"> */
.clearfix:before,
.clearfix:after,
.row:before,
.row:after {
content: '\0020';
display: block;
overflow: hidden;
visibility: hidden;
width: 0;
height: 0; }
.row:after,
.clearfix:after {
clear: both; }
.row,
.clearfix {
zoom: 1; }
/* You can also use a <br class="clear" /> to clear columns */
.clear {
clear: both;
display: block;
overflow: hidden;
visibility: hidden;
width: 0;
height: 0;
}
/*===================================================================================================
15) Portfolio slider
===================================================================================================*/
.portfolioSlider {
position:relative;
/* Set width and height of slider here, in px, % or em */
width: 600px;
height: 300px;
/* Used to prevent content "jumping" on page load - this property is removed when JavaScript is loaded and slider is instantiated */
overflow: hidden;
}
/* Slides area */
.portfolioSlider .portfolioWrapper {
overflow:hidden;
position:relative;
width:100%;
height:100%;
}
.portfolioSlider .portfolioSlide,
.portfolioSlider .portfolioWrapper {
/* Bakground behind slides */
background: #000000;
/*
background: -moz-linear-gradient(top, #111111 0%, #242424 100%);
background: -webkit-linear-gradient(top, #111111 0%,#242424 100%);
background: -o-linear-gradient(top, #111111 0%,#242424 100%);
background: -ms-linear-gradient(top, #111111 0%,#242424 100%);
background: linear-gradient(top, #111111 0%,#242424 100%);
*/
}
/* Slides holder, grabbing container */
.portfolioSlider .portfolioSlidesContainer {
position: relative;
left: 0;
top: 0 !important;
list-style:none !important;
margin:0 !important;
padding:0 !important;
border: 0 !important;
}
/* Slide item */
.portfolioSlider .portfolioSlide {
padding: 0 !important;
margin: 0 !important;
border: 0 !important;
list-style: none !important;
position:relative;
float:left;
overflow:hidden;
}
/* Arrow navigation */
.portfolioSlider .arrow {
/*background:url(../img/controlsSprite.png) no-repeat 0 0;*/
background-color: #C00;
background-repeat: no-repeat;
background-position: 0 0;
/* Change arrow size here */
width: 45px;
height: 90px;
top:50%;
margin-top:-45px;
cursor: pointer;
display: block;
position: absolute;
z-index:25;
}
.portfolioSlider .arrow:hover {
}
.portfolioSlider .arrow.disabled {
}
/* Left arrow */
.portfolioSlider .arrow.left {
background-position: top left;
left: 0;
}
/* Right arrow */
.portfolioSlider .arrow.right {
background-position: top right;
right: 0;
}
/* Control navigation container (bullets or thumbs) */
.portfolioSlider .portfolioControlNavOverflow {
width:100%;
overflow:hidden;
position:absolute;
margin-top:-20px;
z-index:25;
}
/* This container is inside ".portfolioControlNavContainer"
and is used for auto horizontal centering */
.portfolioSlider .portfolioControlNavCenterer {
float: left;
position: relative;
left: -50%;
}
/* Control navigation container*/
.portfolioSlider .portfolioControlNavContainer {
float: left;
position: relative;
left: 50%;
}
/* Scrollable thumbnails containers */
.portfolioSlider .portfolioControlNavThumbsContainer {
left:0;
position:relative;
}
.portfolioSlider .thumbsAndArrowsContainer {
overflow:hidden;
width: 100%;
position: relative;
}
.portfolioSlider .portfolioControlNavOverflow.portfolioThumbs {
width: auto;
position: relative;
overflow: hidden;
margin-top:4px;
}
.portfolioSlider .portfolioControlNavOverflow a{
background:#0C0 none no-repeat scroll 0 0;
width:20px;
height:20px;
float:left;
cursor:pointer;
position:relative;
display:block;
text-indent: -9999px;
}
/* Current control navigation item */
.portfolioSlider .portfolioControlNavOverflow a.current {
background-color: #C00;
}
/* Hover state navigation item */
.portfolioSlider .portfolioControlNavOverflow a:hover {
background-color: #00C;
}
/* Thumbnails */
.portfolioSlider .portfolioControlNavOverflow a.portfolioThumb{
/*background: none no-repeat 0 0;*/
/*background-color: ;*/
width:144px;
height:60px;
/* thumbnails spacing, use margin-right only */
margin-right:4px;
}
.portfolioSlider .portfolioControlNavOverflow a.portfolioThumb.current {
background-position: -3px -3px !important;
border:3px solid #C00 !important;
width:138px;
height:54px;
}
.portfolioSlider .portfolioControlNavOverflow a.portfolioThumb:hover {
background-position: -3px -3px;
border:3px solid #00C;
width:138px;
height:54px;
}
.portfolioSlider .thumbsArrow {
width: 38px;
height: 68px;
cursor: pointer;
display: block;
position: relative;
z-index: 25;
background: #C99;
}
.portfolioSlider .thumbsArrow.left {
float: left;
}
.portfolioSlider .thumbsArrow.right {
float: right;
}
.portfolioSlider .thumbsArrow:hover {
}
.portfolioSlider .thumbsArrow.disabled {
}
/* Captions container */
.portfolioSlider .portfolioCaption {
z-index:20;
display:block;
position:absolute;
left:0;
top:0;
/*font: normal normal normal 1em/1.5em Georgia, serif;
color:#FFF; */
}
/* Caption item */
.portfolioSlider .portfolioCaptionItem {
position:absolute;
left:0;
top:0;
margin: 0;
padding: 0;
}
/* Loading screen */
.portfolioSlider .portfolioLoadingScreen {
background:#FFF;
width:100%;
height:100%;
position:absolute;
z-index:99;
}
/* Loading screen text ("Loading...") */
.portfolioSlider .portfolioLoadingScreen p {
width:100%;
position:absolute;
margin:0 auto;
top: 45%;
text-align:center;
}
/* Single slide image preloader */
.portfolioSlider .portfolioPreloader {
position: absolute;
width: 30px;
height: 30px;
left: 50%;
top: 50%;
margin-left: -12px;
margin-top: -12px;
z-index: 0;
background-image: url(slider_assets/preloader.gif);
}
.portfolioSlider .grab-cursor{cursor:move;}
.portfolioSlider .grab-cursor{cursor:url("slider_assets/grab.png") 8 8,-moz-grab;}
.portfolioSlider .grab-cursor{*cursor:url(slider_assets/grab.cur);}
.portfolioSlider .grab-cursor{cursor:move\0/;} /* ie8 hack */
.portfolioSlider .grabbing-cursor{cursor:move;}
.portfolioSlider .grabbing-cursor{cursor:url("slider_assets/grabbing.png") 8 8,-moz-grabbing;}
.portfolioSlider .grabbing-cursor{*cursor:url(slider_assets/grabbing.cur);}
/* Cursor used if mouse dragging is disabled */
.portfolioSlider .auto-cursor{cursor:auto;}
.portfolioSlider .portfolioHtmlContent {
position: absolute;
top: 0;
left: 0;
}
.portfolioSlider .non-draggable {
cursor: auto;
}
.portfolioSlider .fade-container .portfolioSlide{
position: absolute;
left: 0;
top: 0;
list-style-type: none;
margin: 0;
padding: 0;
z-index: 10;
}
.portfolioSlider .portfolioImage {
max-width:none;
margin:0;
padding: 0 !important;
border: 0 !important;
}
/* Customization */
.projectThumbnail {
cursor: pointer;
}
.project img.thumbnailImage {
max-width: 100%;
height: auto;
cursor: pointer;
}
.portfolioSlider {
width: 100%;
position: absolute;
left: 0;
top: 0;
overflow: hidden;
z-index: 10;
}
.portfolioSliderData {
display: none;
overflow: hidden;
}
.portfolioSlidesContainer {
display: block;
}
.first-img-preloader {
position: absolute;
left: 0;
top: 0;
z-index: 12;
background: #000;
/*background: rgba(0,0,0,1.0);*/
/*filter:inherit;*/
}
.preloader-graphics {
position: relative;
width: 30px;
height: 30px;
left: 50%;
top: 50%;
margin-left: -12px;
margin-top: -12px;
z-index: 0;
background-image: url(slider_assets/preloader.gif);
}
/*===================================================================================================
16) Site styles
===================================================================================================*/
h1 { font-size: 48px; line-height: 1.2; }
h2 { font-size: 36px; line-height: 1.2; }
h3 { font-size: 24px; line-height: 1.2; }
h4 { font-size: 18px; line-height: 1.2; }
h5 { font-size: 14px; line-height: 1.2; }
h6 { font-size: 12px; line-height: 1.2; }
.currentPage, button.currentPage:hover {
color: #bbb;
cursor: default;
}
button.currentPage:hover {
cursor: auto;
}
#sitePreloader {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: #000;
z-index: 2;
}
#preloaderImage {
width: 30px;
margin: 100px auto;
}
header {
padding-top: 80px;
border-top: 3px solid #000;
}
#logo, #logoDetailView {
float: left;
cursor: pointer;
}
#logo img, #logoDetailView img {
margin-top: 28px;
}
#logo h1, #logoDetailView h1 {
font-family: Georgia, Arial, sans-serif;
font-weight: normal;
font-style: normal;
font-size: 36px;
line-height: 1.5;
letter-spacing: -0.05em;
text-rendering: optimizeLegibility;
}
#logo h2, #logoDetailView h2 {
font-family: Georgia, Arial, sans-serif;
font-weight: normal;
font-style: italic;
font-size: 16px;
line-height: 1.2;
letter-spacing: -0.07em;
text-rendering: optimizeLegibility;
margin-top: -23px;
}
a, button {
-webkit-transition: color 0.2s ease-out;
-moz-transition: color 0.2s ease-out;
-o-transition: color 0.2s ease-out;
transition: color 0.2s ease-out;
}
a, a:visited {
color: #333;
}
a:hover, a:active, a:focus, #heroNav a:hover, #heroNav a:visited:hover, #heroNav a:active, #heroNav a:focus, #formSubmit:hover, .contentModule a:hover, .contentModule a:visited:hover, .contentModule a:active, .contentModule a:focus { color: #777777; } {
color: #888;
}
nav {
list-style: none;
float: right;
padding-top: 45px;
margin-bottom: -30px;
padding-bottom: 20px;
}
nav ul li {
display: inline;
padding-left: 26px;
}
nav ul li:first-child {
padding-left: 0px;
}
nav ul li a, nav ul li a:visited, nav ul li button, nav ul li span {
font-family: Arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 12px;
line-height: 1.5;
letter-spacing: 0;
text-rendering: auto;
text-decoration: none;
}
nav ul li button, .projectNav button {
background: none;
border: none;
text-shadow: none;
padding: 0;
}
nav ul li button {
margin-bottom: 0px;
}
nav ul li button:hover, .projectNav button:hover {
background: none;
border: none;
}
nav ul li button:hover, nav ul li button:active, nav ul li button:focus, nav ul li a:hover, nav ul li a:active, nav ul li a:focus {
color: #888;
outline: 0;
}
#overview {
padding-bottom: 10px;
}
#overview h3 {
font-family: Georgia, Arial, sans-serif;
font-weight: normal;
font-style: normal;
font-size: 36px;
line-height: 1.2;
letter-spacing: -0.04em;
text-rendering: auto;
color: #333;
margin-top: -7px;
margin-bottom: 22px;
}
.project {
margin-bottom: 40px;
position: relative;
overflow: hidden;
}
.projectThumbnail {
max-width: 100%;
height: 100%;
}
.projectThumbnail img {
display: block;
}
.projectThumbnailHover {
background-color: #000;
background-color: rgba(0, 0, 0, 0.8);
position: absolute;
width: 100%;
height: 100%;
display: none;
z-index: 10;
}
.projectThumbnailHover h4 {
font-family: Georgia, Arial, sans-serif;
font-weight: normal;
font-style: normal;
font-size: 24px;
line-height: 1.2;
letter-spacing: -0.05em;
text-rendering: auto;
color: #fff;
position: absolute;
margin-top: 40px;
display: none;
}
.projectThumbnailHover h5 {
font-family: Arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 12px;
line-height: 1.2;
letter-spacing: 0;
text-rendering: auto;
color: #fff;
position: absolute;
padding-top: 69px;
display: none;
}
.projectInfo {
overflow: hidden;
}
.projectInfo h4 {
font-family: Arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 14px;
line-height: 1.2;
letter-spacing: -0.05em;
text-rendering: auto;
color: #444;
padding-top: 12px;
padding-bottom: 8px;
margin-bottom: 4px;
float: left;
}
.projectNav {
font-family: Arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 11px;
line-height: 1.2;
letter-spacing: 0;
text-rendering: auto;
color: #444;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
height: 29px;
margin-bottom: 9px;
padding-top: 4px;
margin-top: 38px;
}
.projectNavCounter {
font-family: Arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 12px;
letter-spacing: 0;
text-rendering: auto;
color: #444;
font-size: 12px;
padding-top: 11px;
float: right;
text-align: right;
}
.projectNavClose button, .projectNavButtons button, .projectNavEnlarge button {
font-family: Arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 11px;
line-height: 1.2;
text-rendering: auto;
color: #444;
cursor: pointer;
text-transform: uppercase;
letter-spacing: 0.07em;
text-decoration: none;
}
.projectNav button:hover, .projectNav button:active, .projectNav button:focus {
color: #777;
outline: 0;
}
.projectNavInactive, button.projectNavInactive, button.projectNavInactive:hover, button.projectNavInactive:active {
color: #ccc;
text-decoration: none;
cursor: auto;
}
.projectNavEnlarge {
float: left;
/*padding-left: 1px;*/
padding-top: 5px;
padding-top: 7px\9; /* IE adjustment */
width: auto;
}
.projectNavClose {
float: right;
padding-top: 5px;
padding-top: 7px\9; /* IE adjustment */
}
.projectNavButtons {
padding-top: 5px;
padding-top: 7px\9; /* IE adjustment */
text-align: center;
}
/* Tweak positioning slightly in Firefox */
@-moz-document url-prefix() {
.projectNavEnlarge, .projectNavClose, .projectNavButtons {
padding-top: 7px;
}
}
.projectInfo, .linedList {
border-bottom: 3px solid #ddd;
}
.projectInfo p:nth-of-type(1) {
margin-top: 9px;
}
.projectInfo p:nth-last-child(2) {
padding-bottom: 10px;
border-bottom: 1px solid #ddd;
}
#about p, #about blockquote {
margin-bottom: 24px;
}
p strong, .projectInfo strong {
color: #444;
}
p, .projectInfo p, .projectInfo li {
font-family: Arial, sans-serif;
font-weight: normal;
font-style: normal;
font-size: 14px;
line-height: 1.3;
letter-spacing: 0;
text-rendering: auto;
}
.projectInfo ul {
margin-top: -8px;
margin-bottom: 7px;
}
.projectInfo p + ul {
margin-top: -20px;
}
.projectInfo li, .linedList li {
border-top: 1px solid #ddd;
margin-top: 6px;
margin-bottom: -1px;
padding-top: 6px;
padding-bottom: 0px;
}
.projectInfo li:first-child {
border-top: none;
}
.projectInfo li:last-child {
margin-bottom: -2px;
}
.linedList {
padding-bottom: 7px;
}
#about img, #detailView img {
max-width: 100%;
height: auto;
}
#detailView img {
padding-bottom: 12px;
}
#detailViewImages {
text-align: center;
}
#detailViewBack {
font-size: 12px;
font-weight: bold;
margin-top: -18px;
}
#detailViewBack a {
text-decoration: none;
}
footer {
margin-top: 0px;
margin-bottom: 40px;
}
footer p {
font-family: Arial, sans-serif;
font-weight: normal;
font-style: normal;
font-size: 12px;
line-height: 1.4;
letter-spacing: 0;
text-rendering: auto;
color: #333;
}
.video {
margin-bottom: 30px;
}
#faq p:first-child, #heroNav a, #heroNav a:visited, .contentModule a, .contentModule a:visited {
color: #333333;
}
#formField {
border: 1px solid #555555;
margin: 0;
width: 200px;
height: 20px;
display: inline;
font-family: Arial, sans-serif;
font-weight: normal;
font-style: normal;
font-size: 14px;
line-height: 1.2;
letter-spacing: 0;
text-decoration: none;
text-transform: none;
text-rendering: auto;
}
#formSubmit {
display: inline;
padding-bottom: 0;
margin-bottom: 0;
border: none;
background: none;
padding-left: 5px;
font-family: Arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 12px;
line-height: 1.2;
letter-spacing: 0.09em;
text-decoration: none;
text-transform: uppercase;
text-rendering: auto;
text-shadow: none;
-webkit-transition: color 0.2s ease-out;
-moz-transition: color 0.2s ease-out;
-o-transition: color 0.2s ease-out;
transition: color 0.2s ease-out;
}
#formField, #content #heroNav ul li, #footerLinks li, #heroNav, .contentModule {
border-color: #dddddd;
}
#formSubmit, #formField {
color: #444444;
}
#formField {
background: #fff;
}
#formField:focus {
background: #fff;
}
#content img {
max-width: 100%;
height: auto;
}
#hero {
margin-top: -15px;
margin-bottom: -1px;
}
#heroNav {
margin-top: 20px;
padding-top: 18px;
border-top: 1px solid;
border-bottom: 1px solid;
margin-bottom: 26px;
}
#content #heroNav ul li {
display: inline;
padding-left: 12px;
margin-left: 0;
border-right: 1px solid;
padding-right: 15px;
}
#content #heroNav ul li:last-child {
border-right: none;
padding-right: 0;
margin-right: 0;
}
#heroNav ul li:first-child {
padding-left: 0;
margin-left: 0;
}
#heroNav ul {
text-align: center;
margin-bottom: 18px;
}
#heroNav a {
font-family: Arial, sans-serif;
font-weight: bold;
font-style: normal;
font-size: 16px;
line-height: 1.2;
letter-spacing: 0;
text-decoration: underline;
text-transform: none;
text-rendering: auto;
}
#content ul li {
list-style-type: disc;
margin-left: 30px;
margin-bottom: 10px;
}
.contentModule ul, .contentModule ol {
padding-top: 8px;
}
#footerLinks li {
font-weight: bold;
font-size: 12px;
display: inline;
padding-left: 12px;
margin-left: 0;
border-right: 1px solid;
padding-right: 15px;
}
#footerLinks li:first-child {
padding-left: 0;
}
#footerLinks li:last-child {
border-right: none;
}
.contentModule {
margin-bottom: 22px;
padding-bottom: 6px;
border-bottom: 1px solid;
}
.contentModule p {
margin-top: 10px;
margin-bottom: 15px;
line-height: 1.4;
}
.contentModule li:first-child, .contentModule p:first-child {
margin-top: -3px;
}
.contentModule:last-child {
border-bottom: none;
}
#faq p {
margin-top: -5px;
}
#faq p:first-child {
font-weight: bold;
margin-top: 0px;
line-height: 1.2;
}
code {
font-family: "Courier New", Courier, monospace;
font-size: 12px;
background: #fff;
color: #000;
text-shadow: none;
padding-top: 5px;
padding-bottom: 5px;
}
.thumbnailMask {
/*background-image: url("../images/masks/rounded.png");*/
/*
Disable pointer events to allow swipe navigation - needed to use a svg instead of a div since no versions of IE support pointer events on divs
*/
pointer-events: none;
width: 460px;
height: 284px;
position: absolute;
z-index: 24;
}
/*===================================================================================================
17) Media queries
===================================================================================================*/
/* Smaller than standard 960 (devices and browsers) */
@media only screen and (max-width: 959px) {
nav ul li a, nav ul li button, nav ul li span, #detailViewBack {
font-size: 14px;
}
nav {
padding-top: 45px;
}
.thumbnailMask {
background-size: 364px 224px;
}
}
/* Tablet portrait size to standard 960 (devices and browsers) */
@media only screen and (min-width: 768px) and (max-width: 959px) {
.projectThumbnailHover h4 {
font-size: 18px;
}
.projectThumbnailHover h5 {
font-size: 11px;
padding-top: 63px;
}
#heroNav a {
font-size: 14px;
}
#footerLinks li {
font-size: 13px;
}
}
/* All mobile sizes (devices and browser) */
@media only screen and (max-width: 767px) {
#logo h1, #logoDetailView h1 {
font-size: 30px;
line-height: 1.1;
}
#logo h2, #logoDetailView h2 {
margin-top: -12px;
}
header {
padding-top: 40px;
}
nav {
float: left;
clear: both;
width: 100%;
border-top: 1px solid #ddd;
padding-top: 10px;
padding-bottom: 0px;
margin-bottom: -10px;
}
#overview {
padding-bottom: 0px;
}
.project {
margin-bottom: 30px;
}
footer p {
font-size: 14px;
}
#content #heroNav ul li {
display: block;
padding-left: 0;
margin-left: 0;
border-right: none;
line-height: 2.0;
}
#heroNav ul {
text-align: left;
}
#footerLinks li {
display: block;
padding-left: 0;
margin-left: 0;
border-right: none;
padding-bottom: 8px;
}
#footerLinks ul {
text-align: left;
}
/* Add back border to last child of first column */
.eight:nth-child(4n) .contentModule:last-child, .eight:nth-of-type(1) .contentModule:last-child {
border-bottom: 1px solid #dddddd;
}
.thumbnailMask {
background-size: 420px 259px;
}
}
/* Mobile landscape size to tablet portrait (devices and browsers) */
@media only screen and (min-width: 480px) and (max-width: 767px) {
}
/* Mobile portrait size to mobile landscape size (devices and browsers) */
@media only screen and (max-width: 479px) {
#logo h1, #logoDetailView h1 {
font-size: 30px;
}
#logo h2, #logoDetailView h2 {
font-size: 14px;
margin-top: -10px;
}
#overview h3 {
font-size: 24px;
}
.projectThumbnailHover h4 {
font-size: 14px;
}
.projectThumbnailHover h5 {
font-size: 11px;
padding-top: 58px;
}
.thumbnailMask {
background-size: 300px 185px;z
}
}
/*===================================================================================================
18) Print
===================================================================================================*/
@media print {
* { background: transparent !important; color: black !important; box-shadow:none !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } /* Black prints faster: h5bp.com/s */
a, a:visited { text-decoration: underline; }
a[href]:after { content: " (" attr(href) ")"; }
abbr[title]:after { content: " (" attr(title) ")"; }
.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } /* Don't show links for images, or javascript/internal links */
pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
thead { display: table-header-group; } /* h5bp.com/t */
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
@page { margin: 0.5cm; }
p, h2, h3 { orphans: 3; widows: 3; }
h2, h3 { page-break-after: avoid; }
}
.board_list table {
width:100%;
margin:15px 0;
border:0;
}
.board_list th {
font-weight:bold;
background-color:#d8f1fe;
color:#20a0fe
}
.board_list,.board_list th,.board_list td {
font-size:0.95em;
text-align:center;
padding:4px;
border-collapse:collapse;
}
.board_list th {
border: 1px solid #d8f1fe;
border-width:1px
}
.board_list td {
border: 1px solid #d8f1fe;
border-width:1px
}
.board_list tr {
border: 1px solid #ffffff;
}
.board_list tr:nth-child(odd){
background-color:#f7f7f7;
}
.board_list tr:nth-child(even){
background-color:#ffffff;
}
var express = require('express');
var BoardContents = require('../models/boardsSchema'); //db를 사용하기 위한 변수
var fs = require('fs');
var router = express.Router();
router.get('/', function(req,res){
// 처음 index로 접속 했을시 나오는 부분
// db에서 게시글 리스트 가져와서 출력
// pagination 추가 -> 11/17
// page는 1-5까지 보여줌 -> db에서 총 갯수 잡아와서 10으로 나눠서 올림해야함
// 한페이지에 10개의 게시글: limit: 10, skip: (page-1)*10 이면 될 듯
// page number는 param으로 받아오기 가장 처음엔 param 없으니까 그땐 자동 1로 설정
var page = req.param('page');
if(page == null) {page = 1;}
var skipSize = (page-1)*10;
var limitSize = 10;
var pageNum = 1;
BoardContents.count({},function(err, totalCount){
// db에서 날짜 순으로 데이터들을 가져옴
if(err) throw err;
pageNum = Math.ceil(totalCount/limitSize);
BoardContents.find({}).sort({average:-1}).skip(skipSize).limit(limitSize).exec(function(err, pageContents) {
if(err) throw err;
res.render('board', {title: "Board", page : page, contents: pageContents, pagination: pageNum, searchWord: ''});
});
});
});
router.get('/search', function(req, res){
// 글 검색하는 부분
var search_word = req.param('searchWord');
var search_company = req.param('company');
var search_category = req.param('category');
var searchCondition = {$regex:''};
var searchCompany = {$regex:''};
var searchCategory = {$regex:''};
if(search_word!='')
searchCondition = {$regex:search_word};
if(search_company!='all')
searchCompany = {$regex:search_company};
if(search_category!='all')
searchCategory = {$regex:search_category};
var page = req.param('page');
if(page == null) {page = 1;}
var skipSize = (page-1)*10;
var limitSize = 10;
var pageNum = 1;
BoardContents.count({$and:[{name:searchCondition},{company:searchCompany},{category:searchCategory}]},function(err, searchCount){
if(err) throw err;
pageNum = Math.ceil(searchCount/limitSize);
BoardContents.find({$and:[{name:searchCondition},{company:searchCompany},{category:searchCategory}]}).sort({average:-1}).skip(skipSize).limit(limitSize).exec(function(err, searchContents){
if(err) throw err;
res.render('board', {title: "Board", page : page,contents: searchContents, pagination: pageNum, searchWord: search_word});
});
});
});
router.post('/', function(req, res){
//field name은 form의 input file의 name과 같아야함
// 글 작성하고 submit하게 되면 저장이 되는 부분
// 글 수정하고 submit하면 수정된 결과가 저장되는 부분
var mode = req.param('mode');
var addNewName = req.body.addContentName;
var addNewCompany = req.body.addContentCompany;
var addNewCategory = req.body.addContentCategory;
var addNewPrice = req.body.addContentPrice;
if(mode == 'add') {
addBoard(addNewName, addNewCompany, addNewCategory, addNewPrice);
res.redirect('/boards');
}
});
router.post('/reply', function(req, res){
// 댓글 다는 부분
var reply_grade = req.body.replyGrade;
var reply_comment= req.body.replyComment;
var reply_id = req.body.replyId;
addComment(reply_id, reply_grade, reply_comment,function(){
res.redirect('/boards/view?id='+reply_id);
});
});
router.get('/view', function(req, res){
// 글 보는 부분. 글 내용을 출력하고 조회수를 늘려줘야함
// 댓글 페이지 추가 해줌, 5개씩 출력함
var contentId = req.param('id');
BoardContents.findOne({_id:contentId}, function(err, rawContent){
if(err) throw err;
rawContent.save(function(err){
if(err) throw err;
res.render('boardDetail',{title: "Board", content:rawContent});
});
})
});
module.exports = router;
function addComment(id, grade, comment,callback) {
BoardContents.findOne({_id: id}, function(err, rawContent){
if(err) throw err;
var sum = 0;
rawContent.comments.unshift({grade:grade, memo: comment});
for(var j = 0;j<rawContent.comments.length;j++)
{
sum += rawContent.comments[j].grade;
}
rawContent.average = sum/rawContent.comments.length;
rawContent.save(function(err){
if(err) throw err;
else callback();
});
});
}
function addBoard(name, company, category, price){
var newBoardContents = new BoardContents;
newBoardContents.name = name;
newBoardContents.company = company;
newBoardContents.category = category;
newBoardContents.price = price;
newBoardContents.average = 0;
newBoardContents.save(function (err) {
if (err) throw err;
BoardContents.findOne({_id: newBoardContents._id}, {_id: 1}, function (err, newBoardId) {
if (err) throw err;
})
});
}
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
No preview for this file type
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
$(function(){ // pagination 현재 페이지 활성화 시킴
var page = location.href.split("page=")[1]; // url에 page 넘버로 구분
var index = page-1; // 0부터 시작이므로 1 빼줌
if(page == null) { // 메인화면에서는 page 쿼리가 없으므로 빈값일 때
$(".pagination a:eq(0)").attr('class', 'current-page');
}
$(".pagination a:eq(" + index + ")").attr('class', 'current-page');
});
function searchContent() {
if($('#searchWord').val == ''){
alert("검색어를 입력해주세요!!!");
} else {
$('#searchAction').submit();
}
}
function submitContents() {
var name = $('#addContentName').val();
var company = $('#addContentCompany').val();
var category = $('#addContentCategory').val();
var price = $('#addContentPrice').val();
// 새 글 등록 시
if(name == '' || company == '' || category == '' || price == '') {
alert("이름, 회사, 카테고리, 가격 모두 있어야합니다.");
return;
} else {
$('#writeAction').submit();
}
}
</script>
</head>
<body>
<div class="main">
<a href="/boards"><h2>게시판</h2></a>
<table class="board_list">
<tr>
<th>Rank</th>
<th>Name</th>
<th>Company</th>
<th>Category</th>
<th>Price</th>
</tr>
<%if(contents.length>0){%>
<%var i = 0;%>
<%contents.forEach(function(item){%>
<%i++;%>
<tr>
<td class="number"><%=(page-1)*10+i%></td>
<td class="name"><a href="/boards/view?id=<%=item._id%>"><%=item.name%> [<%=item.comments.length%>]&nbsp;&nbsp;</a></td>
<td class="company"><%=item.company%></td>
<td class="category"><%=item.category%></td>
<td class="average"><%=item.average%></td>
</tr>
<%})%>
<%} else {%>
<tr>
<td colspan="5">게시물이 없습니다.</td>
</tr>
<%}%>
</table>
<div class="pagination">
<%
if(searchWord != '') {
for(var i=1; i<=pagination; i++){
%>
<a href="/boards/search?searchWord=<%=searchWord%>&page=<%=i%>" class="next-page"><%=i%></a>
<%
}
} else {
for(var i=1; i<=pagination; i++){
%>
<a href="/boards?page=<%=i%>" class="next-page"><%=i%></a>
<%}}%>
</div>
<div class="btn_group">
<div class="search">
<form action="/boards/search" method="get" id="searchAction" name="searchAction">
<input type="text" class="search_word" id="searchWord" name="searchWord">
<input type="radio" name="company" value="CU">CU</input>
<input type="radio" name="company" value="GS25">GS25</input>
<input type="radio" name="company" value="SevenEleven">SevenEleven</input>
<input type="radio" name="company" value="all" style="visibility:hidden" checked="true"></input>
<br>
<input type="radio" name="category" value="주먹밥">주먹밥</input>
<input type="radio" name="category" value="샌드위치">샌드위치</input>
<input type="radio" name="category" value="도시락">도시락</input>
<input type="radio" name="category" value="all" style="visibility:hidden" checked="true"></input>
<a href="#" onclick="searchContent();"><div class="search_btn">검색</div></a>
</form>
</div>
</div>
<!-- new content write form-->
<div class="write_form">
<form id="writeAction" action="/boards?mode=add" method="post">
<input type="text" class="inputName" id="addContentName" name="addContentName" placeholder="name">
<input type="text" class="inputCompany" id="addContentCompany" name="addContentCompany" placeholder="company">
<input type="text" class="inputCategory" id="addContentCategory" name="addContentCategory" placeholder="category">
<input type="text" class="inputPrice" id="addContentPrice" name="addContentPrice" placeholder="price"></textarea>
<div id = "new" class="addBtngroup">
<a onclick="submitContents();"><div>SUBMIT</div></a>
<a onclick="cancelWriteForm('cancel');"><div>CANCEL</div></a>
</div>
</form>
</div>
<!-- write form end-->
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title><%=title%></title>
<link rel='stylesheet' href='/stylesheets/style.css' />
<body>
<div class="main">
<a href="/boards"><h2>게시판</h2></a>
<div class="content_box">
<!-- content box-->
<div class="content_detail">
<div class="content-pic"><img src='../images/<%=content.name%>.jpg' width="340" height="340" onError="this.src='../images/noImage.jpg';"></div>
<div class="content-title"><%=content.name%></div>
<div class="content-info">
<%=content.company%> / <%=content.category%>
</div>
<div class="content-text">
<%=content.price%>
</div>
<div class="addBtngroup" style="margin-left:450px;">
<a href="/boards">확인</a>
</div>
</div>
<!-- content box end -->
<!-- 혁신의 끝을 달리는 옆에서 달아주는 댓글 창-->
<div class="reply">
<div class="reply_form">
<form id="replyAction" action="/boards/reply" method="post">
<div class="reply_grade">
<SELECT size=1 class="replyGrade" id="replyGrade" name="replyGrade">
<OPTION VALUE=1>1</OPTION>
<OPTION VALUE=2>2</OPTION>
<OPTION VALUE=3>3</OPTION>
<OPTION VALUE=4>4</OPTION>
<OPTION VALUE=5>5</OPTION>
</SELECT></div>
<div class="reply_comment">
<textarea class="replyComment" id="replyComment" name="replyComment" rows="3" cols="30"></textarea>
</div>
<input type="hidden" name="replyId" id="replyId" value="<%=content._id%>">
<button type="submit">댓글 작성</button>
</form>
</div>
<div class="reply_list">
<%if(content.comments.length>0){%>
<%var commentsList = content.comments;%>
<%for(var i=0; i<commentsList.length; i++){%>
%>
<div class="reply_content">
<div class="reply_info"><%=commentsList[i].grade%> / <%=commentsList[i].memo%></div>
</div>
<%}%>
<%} else {%>
<div class="reply_content">
<div class="reply_info">댓글이 없습니다</div>
</div>
<%}%>
</div>
</div>
<!-- end -->
</div>
</body>
</html>
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>