├── cmscart ├── nbproject │ ├── private │ │ ├── private.properties │ │ └── private.xml │ ├── project.properties │ └── project.xml ├── config │ ├── database.js │ ├── auth.js │ └── passport.js ├── views │ ├── index.ejs │ ├── messages.ejs │ ├── _layouts │ │ ├── adminfooter.ejs │ │ ├── footer.ejs │ │ ├── adminheader.ejs │ │ └── header.ejs │ ├── admin │ │ ├── add_category.ejs │ │ ├── edit_category.ejs │ │ ├── categories.ejs │ │ ├── add_page.ejs │ │ ├── edit_page.ejs │ │ ├── pages.ejs │ │ ├── products.ejs │ │ ├── add_product.ejs │ │ └── edit_product.ejs │ ├── login.ejs │ ├── all_products.ejs │ ├── cat_products.ejs │ ├── register.ejs │ ├── product.ejs │ └── checkout.ejs ├── public │ ├── images │ │ ├── noimage.png │ │ └── ajax-loader.gif │ ├── product_images │ │ ├── 59897fa87f013f102ca1c1fa │ │ │ ├── bananas1.jpg │ │ │ └── gallery │ │ │ │ ├── bananas2.jpg │ │ │ │ ├── bananas3.jpg │ │ │ │ ├── bananas4.jpg │ │ │ │ ├── bananas5.jpg │ │ │ │ └── thumbs │ │ │ │ ├── bananas2.jpg │ │ │ │ ├── bananas3.jpg │ │ │ │ ├── bananas4.jpg │ │ │ │ └── bananas5.jpg │ │ ├── 59897fc57f013f102ca1c1fb │ │ │ ├── apples1.jpg │ │ │ └── gallery │ │ │ │ ├── apples2.jpg │ │ │ │ ├── apples3.jpg │ │ │ │ ├── apples4.jpg │ │ │ │ ├── apples5.jpg │ │ │ │ └── thumbs │ │ │ │ ├── apples2.jpg │ │ │ │ ├── apples3.jpg │ │ │ │ ├── apples4.jpg │ │ │ │ └── apples5.jpg │ │ ├── 598980931a2515032808eb4e │ │ │ ├── grapes1.jpg │ │ │ └── gallery │ │ │ │ ├── grapes2.jpg │ │ │ │ ├── grapes3.jpg │ │ │ │ ├── grapes4.png │ │ │ │ ├── grapes5.jpg │ │ │ │ └── thumbs │ │ │ │ ├── grapes2.jpg │ │ │ │ ├── grapes3.jpg │ │ │ │ ├── grapes4.png │ │ │ │ └── grapes5.jpg │ │ ├── 598ada0fa1089f19845be771 │ │ │ ├── redshirt1.jpg │ │ │ └── gallery │ │ │ │ ├── redshirt2.jpg │ │ │ │ ├── redshirt3.jpg │ │ │ │ ├── redshirt4.jpg │ │ │ │ ├── redshirt5.jpg │ │ │ │ └── thumbs │ │ │ │ ├── redshirt2.jpg │ │ │ │ ├── redshirt3.jpg │ │ │ │ ├── redshirt4.jpg │ │ │ │ └── redshirt5.jpg │ │ ├── 598ada43a1089f19845be773 │ │ │ ├── blueshirt1.jpg │ │ │ └── gallery │ │ │ │ ├── blueshirt2.jpg │ │ │ │ ├── blueshirt3.jpg │ │ │ │ ├── blueshirt4.jpg │ │ │ │ ├── blueshirt5.png │ │ │ │ └── thumbs │ │ │ │ ├── blueshirt2.jpg │ │ │ │ ├── blueshirt3.jpg │ │ │ │ ├── blueshirt4.jpg │ │ │ │ └── blueshirt5.png │ │ └── 598ada31a1089f19845be772 │ │ │ ├── greenshirt1.jpg │ │ │ └── gallery │ │ │ ├── greenshirt2.jpg │ │ │ ├── greenshirt3.jpg │ │ │ ├── greenshirt4.jpg │ │ │ ├── greenshirt5.jpg │ │ │ └── thumbs │ │ │ ├── greenshirt2.jpg │ │ │ ├── greenshirt3.jpg │ │ │ ├── greenshirt4.jpg │ │ │ └── greenshirt5.jpg │ ├── js │ │ └── main.js │ └── css │ │ ├── adminstyle.css │ │ └── style.css ├── models │ ├── category.js │ ├── page.js │ ├── user.js │ └── product.js ├── package.json ├── routes │ ├── pages.js │ ├── products.js │ ├── users.js │ ├── cart.js │ ├── admin_categories.js │ ├── admin_pages.js │ └── admin_products.js └── app.js ├── test.pdf ├── images ├── apples1.jpg ├── apples2.jpg ├── apples3.jpg ├── apples4.jpg ├── apples5.jpg ├── bananas1.jpg ├── bananas2.jpg ├── bananas3.jpg ├── bananas4.jpg ├── bananas5.jpg ├── grapes1.jpg ├── grapes2.jpg ├── grapes3.jpg ├── grapes4.png ├── grapes5.jpg ├── noimage.png ├── ajax-loader.gif ├── blueshirt1.jpg ├── blueshirt2.jpg ├── blueshirt3.jpg ├── blueshirt4.jpg ├── blueshirt5.png ├── greenshirt1.jpg ├── greenshirt2.jpg ├── greenshirt3.jpg ├── greenshirt4.jpg ├── greenshirt5.jpg ├── redshirt1.jpg ├── redshirt2.jpg ├── redshirt3.jpg ├── redshirt4.jpg └── redshirt5.jpg └── cmscart_dump ├── pages.bson ├── pages.metadata.json ├── users.bson ├── users.metadata.json ├── products.bson ├── products.metadata.json ├── categories.bson └── categories.metadata.json /cmscart/nbproject/private/private.properties: -------------------------------------------------------------------------------- 1 | browser=Chrome.INTEGRATED 2 | -------------------------------------------------------------------------------- /test.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/test.pdf -------------------------------------------------------------------------------- /cmscart/config/database.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | database: 'mongodb://localhost/cmscart' 3 | } -------------------------------------------------------------------------------- /images/apples1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/apples1.jpg -------------------------------------------------------------------------------- /images/apples2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/apples2.jpg -------------------------------------------------------------------------------- /images/apples3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/apples3.jpg -------------------------------------------------------------------------------- /images/apples4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/apples4.jpg -------------------------------------------------------------------------------- /images/apples5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/apples5.jpg -------------------------------------------------------------------------------- /images/bananas1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/bananas1.jpg -------------------------------------------------------------------------------- /images/bananas2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/bananas2.jpg -------------------------------------------------------------------------------- /images/bananas3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/bananas3.jpg -------------------------------------------------------------------------------- /images/bananas4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/bananas4.jpg -------------------------------------------------------------------------------- /images/bananas5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/bananas5.jpg -------------------------------------------------------------------------------- /images/grapes1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/grapes1.jpg -------------------------------------------------------------------------------- /images/grapes2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/grapes2.jpg -------------------------------------------------------------------------------- /images/grapes3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/grapes3.jpg -------------------------------------------------------------------------------- /images/grapes4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/grapes4.png -------------------------------------------------------------------------------- /images/grapes5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/grapes5.jpg -------------------------------------------------------------------------------- /images/noimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/noimage.png -------------------------------------------------------------------------------- /images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/ajax-loader.gif -------------------------------------------------------------------------------- /images/blueshirt1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/blueshirt1.jpg -------------------------------------------------------------------------------- /images/blueshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/blueshirt2.jpg -------------------------------------------------------------------------------- /images/blueshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/blueshirt3.jpg -------------------------------------------------------------------------------- /images/blueshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/blueshirt4.jpg -------------------------------------------------------------------------------- /images/blueshirt5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/blueshirt5.png -------------------------------------------------------------------------------- /images/greenshirt1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/greenshirt1.jpg -------------------------------------------------------------------------------- /images/greenshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/greenshirt2.jpg -------------------------------------------------------------------------------- /images/greenshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/greenshirt3.jpg -------------------------------------------------------------------------------- /images/greenshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/greenshirt4.jpg -------------------------------------------------------------------------------- /images/greenshirt5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/greenshirt5.jpg -------------------------------------------------------------------------------- /images/redshirt1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/redshirt1.jpg -------------------------------------------------------------------------------- /images/redshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/redshirt2.jpg -------------------------------------------------------------------------------- /images/redshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/redshirt3.jpg -------------------------------------------------------------------------------- /images/redshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/redshirt4.jpg -------------------------------------------------------------------------------- /images/redshirt5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/images/redshirt5.jpg -------------------------------------------------------------------------------- /cmscart/views/index.ejs: -------------------------------------------------------------------------------- 1 | <% include _layouts/header %> 2 | 3 | <%- content %> 4 | 5 | <% include _layouts/footer %> -------------------------------------------------------------------------------- /cmscart_dump/pages.bson: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart_dump/pages.bson -------------------------------------------------------------------------------- /cmscart_dump/pages.metadata.json: -------------------------------------------------------------------------------- 1 | {"options":{},"indexes":[{"v":2,"key":{"_id":1},"name":"_id_","ns":"cmscart.pages"}]} -------------------------------------------------------------------------------- /cmscart_dump/users.bson: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart_dump/users.bson -------------------------------------------------------------------------------- /cmscart_dump/users.metadata.json: -------------------------------------------------------------------------------- 1 | {"options":{},"indexes":[{"v":2,"key":{"_id":1},"name":"_id_","ns":"cmscart.users"}]} -------------------------------------------------------------------------------- /cmscart_dump/products.bson: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart_dump/products.bson -------------------------------------------------------------------------------- /cmscart_dump/products.metadata.json: -------------------------------------------------------------------------------- 1 | {"options":{},"indexes":[{"v":2,"key":{"_id":1},"name":"_id_","ns":"cmscart.products"}]} -------------------------------------------------------------------------------- /cmscart_dump/categories.bson: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart_dump/categories.bson -------------------------------------------------------------------------------- /cmscart_dump/categories.metadata.json: -------------------------------------------------------------------------------- 1 | {"options":{},"indexes":[{"v":2,"key":{"_id":1},"name":"_id_","ns":"cmscart.categories"}]} -------------------------------------------------------------------------------- /cmscart/public/images/noimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/images/noimage.png -------------------------------------------------------------------------------- /cmscart/public/images/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/images/ajax-loader.gif -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/bananas1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/bananas1.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/apples1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/apples1.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/grapes1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/grapes1.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/redshirt1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/redshirt1.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/blueshirt1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/blueshirt1.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/greenshirt1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/greenshirt1.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/apples2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/apples2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/apples3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/apples3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/apples4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/apples4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/apples5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/apples5.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/gallery/grapes2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/gallery/grapes2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/gallery/grapes3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/gallery/grapes3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/gallery/grapes4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/gallery/grapes4.png -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/gallery/grapes5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/gallery/grapes5.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/bananas2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/bananas2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/bananas3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/bananas3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/bananas4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/bananas4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/bananas5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/bananas5.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/gallery/redshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/gallery/redshirt2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/gallery/redshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/gallery/redshirt3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/gallery/redshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/gallery/redshirt4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/gallery/redshirt5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/gallery/redshirt5.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/gallery/blueshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/gallery/blueshirt2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/gallery/blueshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/gallery/blueshirt3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/gallery/blueshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/gallery/blueshirt4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/gallery/blueshirt5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/gallery/blueshirt5.png -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/gallery/greenshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/gallery/greenshirt2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/gallery/greenshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/gallery/greenshirt3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/gallery/greenshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/gallery/greenshirt4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/gallery/greenshirt5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/gallery/greenshirt5.jpg -------------------------------------------------------------------------------- /cmscart/nbproject/project.properties: -------------------------------------------------------------------------------- 1 | file.reference.cmscart-public_html=public_html 2 | file.reference.cmscart-test=test 3 | file.reference.vj-cmscart=. 4 | files.encoding=UTF-8 5 | site.root.folder=${file.reference.vj-cmscart} 6 | -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/thumbs/bananas2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/thumbs/bananas2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/thumbs/bananas3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/thumbs/bananas3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/thumbs/bananas4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/thumbs/bananas4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/thumbs/bananas5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fa87f013f102ca1c1fa/gallery/thumbs/bananas5.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/thumbs/apples2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/thumbs/apples2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/thumbs/apples3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/thumbs/apples3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/thumbs/apples4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/thumbs/apples4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/thumbs/apples5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/59897fc57f013f102ca1c1fb/gallery/thumbs/apples5.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/gallery/thumbs/grapes2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/gallery/thumbs/grapes2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/gallery/thumbs/grapes3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/gallery/thumbs/grapes3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/gallery/thumbs/grapes4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/gallery/thumbs/grapes4.png -------------------------------------------------------------------------------- /cmscart/public/product_images/598980931a2515032808eb4e/gallery/thumbs/grapes5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598980931a2515032808eb4e/gallery/thumbs/grapes5.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/gallery/thumbs/redshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/gallery/thumbs/redshirt2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/gallery/thumbs/redshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/gallery/thumbs/redshirt3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/gallery/thumbs/redshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/gallery/thumbs/redshirt4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada0fa1089f19845be771/gallery/thumbs/redshirt5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada0fa1089f19845be771/gallery/thumbs/redshirt5.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/gallery/thumbs/blueshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/gallery/thumbs/blueshirt2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/gallery/thumbs/blueshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/gallery/thumbs/blueshirt3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/gallery/thumbs/blueshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/gallery/thumbs/blueshirt4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada43a1089f19845be773/gallery/thumbs/blueshirt5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada43a1089f19845be773/gallery/thumbs/blueshirt5.png -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/gallery/thumbs/greenshirt2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/gallery/thumbs/greenshirt2.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/gallery/thumbs/greenshirt3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/gallery/thumbs/greenshirt3.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/gallery/thumbs/greenshirt4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/gallery/thumbs/greenshirt4.jpg -------------------------------------------------------------------------------- /cmscart/public/product_images/598ada31a1089f19845be772/gallery/thumbs/greenshirt5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EasyLearning97/Nodejs-Course-file/HEAD/cmscart/public/product_images/598ada31a1089f19845be772/gallery/thumbs/greenshirt5.jpg -------------------------------------------------------------------------------- /cmscart/views/messages.ejs: -------------------------------------------------------------------------------- 1 | <% Object.keys(messages).forEach(function (type) { %> 2 |
3 | <% messages[type].forEach(function (message) { %> 4 | <%= message %> 5 | <% }) %> 6 |
7 | <% }) %> -------------------------------------------------------------------------------- /cmscart/nbproject/project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | org.netbeans.modules.web.clientproject 4 | 5 | 6 | cmscart 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /cmscart/models/category.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | 3 | // Category Schema 4 | var CategorySchema = mongoose.Schema({ 5 | 6 | title: { 7 | type: String, 8 | required: true 9 | }, 10 | slug: { 11 | type: String 12 | } 13 | 14 | }); 15 | 16 | var Category = module.exports = mongoose.model('Category', CategorySchema); 17 | 18 | -------------------------------------------------------------------------------- /cmscart/views/_layouts/adminfooter.ejs: -------------------------------------------------------------------------------- 1 | 2 |


3 |
4 |

© CmsShoppingCart

5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /cmscart/public/js/main.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | 3 | if ($('textarea#ta').length) { 4 | CKEDITOR.replace('ta'); 5 | } 6 | 7 | $('a.confirmDeletion').on('click', function () { 8 | if (!confirm('Confirm deletion')) 9 | return false; 10 | }); 11 | 12 | if ($("[data-fancybox]").length) { 13 | $("[data-fancybox]").fancybox(); 14 | } 15 | 16 | }); 17 | 18 | 19 | -------------------------------------------------------------------------------- /cmscart/views/_layouts/footer.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |


5 |
6 |

© CmsShoppingCart

7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /cmscart/models/page.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | 3 | // Page Schema 4 | var PageSchema = mongoose.Schema({ 5 | 6 | title: { 7 | type: String, 8 | required: true 9 | }, 10 | slug: { 11 | type: String 12 | }, 13 | content: { 14 | type: String, 15 | required: true 16 | }, 17 | sorting: { 18 | type: Number 19 | } 20 | 21 | }); 22 | 23 | var Page = module.exports = mongoose.model('Page', PageSchema); 24 | 25 | -------------------------------------------------------------------------------- /cmscart/config/auth.js: -------------------------------------------------------------------------------- 1 | exports.isUser = function(req, res, next) { 2 | if (req.isAuthenticated()) { 3 | next(); 4 | } else { 5 | req.flash('danger', 'Please log in.'); 6 | res.redirect('/users/login'); 7 | } 8 | } 9 | 10 | exports.isAdmin = function(req, res, next) { 11 | if (req.isAuthenticated() && res.locals.user.admin == 1) { 12 | next(); 13 | } else { 14 | req.flash('danger', 'Please log in as admin.'); 15 | res.redirect('/users/login'); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cmscart/public/css/adminstyle.css: -------------------------------------------------------------------------------- 1 | .sorting tr:not(.home) { 2 | cursor: pointer; 3 | } 4 | 5 | .ui-state-hightlight { 6 | border: 1px dashed #ccc; 7 | } 8 | 9 | #imgPreview { 10 | margin: 20px; 11 | } 12 | 13 | #noimage { 14 | width: 100px; 15 | height: 100px; 16 | } 17 | 18 | ul.gallery { 19 | padding: 0; 20 | } 21 | 22 | ul.gallery li:first-child { 23 | margin-left: 0; 24 | } 25 | 26 | ul.gallery li { 27 | margin: 20px; 28 | display: inline-block; 29 | list-style: none; 30 | } 31 | 32 | table.alignmiddle td { 33 | vertical-align: middle !important; 34 | } -------------------------------------------------------------------------------- /cmscart/models/user.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | 3 | // User Schema 4 | var UserSchema = mongoose.Schema({ 5 | 6 | name: { 7 | type: String, 8 | required: true 9 | }, 10 | email: { 11 | type: String, 12 | required: true, 13 | }, 14 | username: { 15 | type: String, 16 | required: true 17 | }, 18 | password: { 19 | type: String, 20 | required: true 21 | }, 22 | admin: { 23 | type: Number 24 | } 25 | 26 | }); 27 | 28 | var User = module.exports = mongoose.model('User', UserSchema); 29 | 30 | -------------------------------------------------------------------------------- /cmscart/views/admin/add_category.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Add a category

4 | Back to all categories 5 |

6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 | 14 | 15 |
16 | 17 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/views/admin/edit_category.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Edit a category

4 | Back to all categories 5 |

6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 | 14 | 15 |
16 | 17 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/views/login.ejs: -------------------------------------------------------------------------------- 1 | <% include _layouts/header %> 2 | 3 |

<%= title %>

4 | 5 |
6 | 7 |
8 | 9 | 10 |
11 | 12 |
13 | 14 | 15 |
16 | 17 | 18 |
19 | 20 | <% include _layouts/footer %> -------------------------------------------------------------------------------- /cmscart/models/product.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | 3 | // Product Schema 4 | var ProductSchema = mongoose.Schema({ 5 | 6 | title: { 7 | type: String, 8 | required: true 9 | }, 10 | slug: { 11 | type: String 12 | }, 13 | desc: { 14 | type: String, 15 | required: true 16 | }, 17 | category: { 18 | type: String, 19 | required: true 20 | }, 21 | price: { 22 | type: Number, 23 | required: true 24 | }, 25 | image: { 26 | type: String 27 | } 28 | 29 | }); 30 | 31 | var Product = module.exports = mongoose.model('Product', ProductSchema); 32 | 33 | -------------------------------------------------------------------------------- /cmscart/views/all_products.ejs: -------------------------------------------------------------------------------- 1 | <% include _layouts/header %> 2 | 3 |
4 | 5 | <% products.forEach(function(p){ %> 6 |
7 | 8 | 9 | 10 |

<%= p.title %>

11 |

$<%= parseFloat(p.price).toFixed(2) %>

12 | View Details 13 |
14 | <% }); %> 15 | 16 |
17 | 18 | <% include _layouts/footer %> -------------------------------------------------------------------------------- /cmscart/views/cat_products.ejs: -------------------------------------------------------------------------------- 1 | <% include _layouts/header %> 2 | 3 |
4 | 5 | <% products.forEach(function(p){ %> 6 |
7 | 8 | 9 | 10 |

<%= p.title %>

11 |

$<%= parseFloat(p.price).toFixed(2) %>

12 | View Details 13 |
14 | <% }); %> 15 | 16 |
17 | 18 | <% include _layouts/footer %> -------------------------------------------------------------------------------- /cmscart/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cmscart", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "bcryptjs": "^2.4.3", 13 | "body-parser": "^1.17.2", 14 | "connect-flash": "^0.1.1", 15 | "ejs": "^2.5.7", 16 | "express": "^4.15.3", 17 | "express-fileupload": "^0.1.4", 18 | "express-messages": "^1.0.1", 19 | "express-session": "^1.15.5", 20 | "express-validator": "^3.2.1", 21 | "fs-extra": "^4.0.1", 22 | "mkdirp": "^0.5.1", 23 | "mongoose": "^4.11.5", 24 | "passport": "^0.3.2", 25 | "passport-local": "^1.0.0", 26 | "resize-img": "^1.1.2" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /cmscart/views/admin/categories.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Categories

4 | Add a new category 5 |

6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | <% categories.forEach(function(cat){ %> 18 | 19 | 20 | 21 | 22 | 23 | <% }); %> 24 | 25 |
CategoryEditDelete
<%= cat.title %>EditDelete
26 | 27 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/views/admin/add_page.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Add a page

4 | Back to all pages 5 |

6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 | 14 |
15 | 16 | 17 |
18 | 19 |
20 | 21 | 22 |
23 | 24 | 25 |
26 | 27 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/views/admin/edit_page.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Edit a page

4 | Back to all pages 5 |

6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 | 14 |
15 | 16 | 17 |
18 | 19 |
20 | 21 | 22 |
23 | 24 | 25 |
26 | 27 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/public/css/style.css: -------------------------------------------------------------------------------- 1 | img.pimage { 2 | width: 150px; 3 | } 4 | 5 | a.pa { 6 | display: inline-block; 7 | height: 160px; 8 | } 9 | 10 | .row.products .p { 11 | margin-top: 20px; 12 | margin-bottom: 20px; 13 | } 14 | 15 | img.spi { 16 | width: 100%; 17 | } 18 | 19 | ul.gallery li { 20 | display: inline-block; 21 | margin: 20px; 22 | list-style: none; 23 | } 24 | 25 | img.cpi { 26 | width: 100px; 27 | } 28 | 29 | table.alignmiddle td { 30 | vertical-align: middle !important; 31 | } 32 | 33 | .pp { 34 | position: absolute; 35 | left: -3000px; 36 | } 37 | 38 | .ajaxbg { 39 | position: absolute; 40 | width: 100%; 41 | height: 100%; 42 | background: rgba(255,255,255, .8); 43 | z-index: 2; 44 | display: none; 45 | } 46 | 47 | .ajaxinner { 48 | position: absolute; 49 | left: 50%; 50 | top: 50%; 51 | transform: translate(-50%, -50%); 52 | text-align: center; 53 | } 54 | 55 | .alert-error { 56 | color: #a94442; 57 | background-color: #f2dede; 58 | border-color: #ebccd1; 59 | } -------------------------------------------------------------------------------- /cmscart/routes/pages.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | // Get Page model 5 | var Page = require('../models/page'); 6 | 7 | /* 8 | * GET / 9 | */ 10 | router.get('/', function (req, res) { 11 | 12 | Page.findOne({slug: 'home'}, function (err, page) { 13 | if (err) 14 | console.log(err); 15 | 16 | res.render('index', { 17 | title: page.title, 18 | content: page.content 19 | }); 20 | }); 21 | 22 | }); 23 | 24 | /* 25 | * GET a page 26 | */ 27 | router.get('/:slug', function (req, res) { 28 | 29 | var slug = req.params.slug; 30 | 31 | Page.findOne({slug: slug}, function (err, page) { 32 | if (err) 33 | console.log(err); 34 | 35 | if (!page) { 36 | res.redirect('/'); 37 | } else { 38 | res.render('index', { 39 | title: page.title, 40 | content: page.content 41 | }); 42 | } 43 | }); 44 | 45 | 46 | }); 47 | 48 | // Exports 49 | module.exports = router; 50 | 51 | 52 | -------------------------------------------------------------------------------- /cmscart/views/register.ejs: -------------------------------------------------------------------------------- 1 | <% include _layouts/header %> 2 | 3 |

<%= title %>

4 | 5 |
6 | 7 |
8 | 9 | 10 |
11 | 12 |
13 | 14 | 15 |
16 | 17 |
18 | 19 | 20 |
21 | 22 |
23 | 24 | 25 |
26 | 27 |
28 | 29 | 30 |
31 | 32 | 33 |
34 | 35 | <% include _layouts/footer %> -------------------------------------------------------------------------------- /cmscart/views/product.ejs: -------------------------------------------------------------------------------- 1 | <% include _layouts/header %> 2 | 3 |
4 | 5 |

<%= p.title %>

6 | 7 |
8 | 9 |
10 |
11 |
12 |

<%= p.desc %>

13 |

$<%= parseFloat(p.price).toFixed(2) %>

14 | <% if (loggedIn) { %> 15 |

Add to cart

16 | <% } else {%> 17 |

You must be logged in to purchase items.

18 | <% } %> 19 |
20 |
21 | 32 |
33 |
34 | 35 | <% include _layouts/footer %> -------------------------------------------------------------------------------- /cmscart/config/passport.js: -------------------------------------------------------------------------------- 1 | var LocalStrategy = require('passport-local').Strategy; 2 | var User = require('../models/user'); 3 | var bcrypt = require('bcryptjs'); 4 | 5 | module.exports = function (passport) { 6 | 7 | passport.use(new LocalStrategy(function (username, password, done) { 8 | 9 | User.findOne({username: username}, function (err, user) { 10 | if (err) 11 | console.log(err); 12 | 13 | if (!user) { 14 | return done(null, false, {message: 'No user found!'}); 15 | } 16 | 17 | bcrypt.compare(password, user.password, function (err, isMatch) { 18 | if (err) 19 | console.log(err); 20 | 21 | if (isMatch) { 22 | return done(null, user); 23 | } else { 24 | return done(null, false, {message: 'Wrong password.'}); 25 | } 26 | }); 27 | }); 28 | 29 | })); 30 | 31 | passport.serializeUser(function (user, done) { 32 | done(null, user.id); 33 | }); 34 | 35 | passport.deserializeUser(function (id, done) { 36 | User.findById(id, function (err, user) { 37 | done(err, user); 38 | }); 39 | }); 40 | 41 | } 42 | 43 | -------------------------------------------------------------------------------- /cmscart/views/admin/pages.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Pages

4 | Add a new page 5 |

6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | <% pages.forEach(function(page){ %> 18 | 19 | 20 | 21 | <% if (page.slug == "home") { %> 22 | 23 | <% } else {%> 24 | 25 | <% }%> 26 | 27 | <% }); %> 28 | 29 |
TitleEditDelete
<%= page.title %>EditDelete
30 | 31 | 32 | 48 | 49 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/nbproject/private/private.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | routes/admin_products.js 6 | 7 | 8 | 60 9 | 10 | 11 | 12 | 13 | 127 14 | 15 | 16 | 17 | 18 | 194 19 | 20 | 21 | 22 | 23 | 24 | 25 | file:/C:/Users/Voja/Desktop/_/vj/cmscart/routes/products.js 26 | file:/C:/Users/Voja/Desktop/_/vj/cmscart/routes/admin_categories.js 27 | file:/C:/Users/Voja/Desktop/_/vj/cmscart/config/auth.js 28 | file:/C:/Users/Voja/Desktop/_/vj/cmscart/views/_layouts/header.ejs 29 | file:/C:/Users/Voja/Desktop/_/vj/cmscart/routes/admin_pages.js 30 | file:/C:/Users/Voja/Desktop/_/vj/cmscart/routes/admin_products.js 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /cmscart/views/admin/products.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Products

4 | Add a new product 5 |

6 | 7 | <% if (count > 0) { %> 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | <% products.forEach(function(product){ %> 23 | 24 | 25 | 26 | 27 | 34 | 35 | 36 | 37 | <% }); %> 38 | 39 |
ProductPriceCategoryProduct ImageEditDelete
<%= product.title %>$<%= parseFloat(product.price).toFixed(2) %><%= product.category %> 28 | <% if (product.image == "") { %> 29 | 30 | <% } else {%> 31 | 32 | <% }%> 33 | EditDelete
40 | 41 | <% } else {%> 42 |

There are no products.

43 | <% }%> 44 | 45 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/views/_layouts/adminheader.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Admin Area 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 39 | 40 |
41 | <%- messages('messages', locals) %> 42 | 43 | <% if (errors) {%> 44 | <% errors.forEach(function(error) { %> 45 |
46 | <%= error.msg %> 47 |
48 | <% });%> 49 | <% }%> 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /cmscart/views/admin/add_product.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Add a product

4 | Back to all products 5 |

6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 | 14 |
15 | 16 | 17 |
18 | 19 |
20 | 21 | 26 |
27 | 28 |
29 | 30 | 31 |
32 | 33 |
34 | 35 | 36 | 37 |
38 | 39 | 40 |
41 | 42 | 61 | 62 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/routes/products.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var fs = require('fs-extra'); 4 | var auth = require('../config/auth'); 5 | var isUser = auth.isUser; 6 | 7 | // Get Product model 8 | var Product = require('../models/product'); 9 | 10 | // Get Category model 11 | var Category = require('../models/category'); 12 | 13 | /* 14 | * GET all products 15 | */ 16 | router.get('/', function (req, res) { 17 | //router.get('/', isUser, function (req, res) { 18 | 19 | Product.find(function (err, products) { 20 | if (err) 21 | console.log(err); 22 | 23 | res.render('all_products', { 24 | title: 'All products', 25 | products: products 26 | }); 27 | }); 28 | 29 | }); 30 | 31 | 32 | /* 33 | * GET products by category 34 | */ 35 | router.get('/:category', function (req, res) { 36 | 37 | var categorySlug = req.params.category; 38 | 39 | Category.findOne({slug: categorySlug}, function (err, c) { 40 | Product.find({category: categorySlug}, function (err, products) { 41 | if (err) 42 | console.log(err); 43 | 44 | res.render('cat_products', { 45 | title: c.title, 46 | products: products 47 | }); 48 | }); 49 | }); 50 | 51 | }); 52 | 53 | /* 54 | * GET product details 55 | */ 56 | router.get('/:category/:product', function (req, res) { 57 | 58 | var galleryImages = null; 59 | var loggedIn = (req.isAuthenticated()) ? true : false; 60 | 61 | Product.findOne({slug: req.params.product}, function (err, product) { 62 | if (err) { 63 | console.log(err); 64 | } else { 65 | var galleryDir = 'public/product_images/' + product._id + '/gallery'; 66 | 67 | fs.readdir(galleryDir, function (err, files) { 68 | if (err) { 69 | console.log(err); 70 | } else { 71 | galleryImages = files; 72 | 73 | res.render('product', { 74 | title: product.title, 75 | p: product, 76 | galleryImages: galleryImages, 77 | loggedIn: loggedIn 78 | }); 79 | } 80 | }); 81 | } 82 | }); 83 | 84 | }); 85 | 86 | // Exports 87 | module.exports = router; 88 | 89 | 90 | -------------------------------------------------------------------------------- /cmscart/views/checkout.ejs: -------------------------------------------------------------------------------- 1 | <% include _layouts/header %> 2 | 3 | <% if (typeof cart !== "undefined") { %> 4 | 5 |

My Cart

6 |

7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | <% var total = 0; %> 20 | <% cart.forEach(function(product){ %> 21 | <% var sub = parseFloat(product.qty * product.price).toFixed(2) %> 22 | <% total += +sub %> 23 | 24 | 25 | 26 | 27 | 28 | 33 | 34 | 35 | <% }); %> 36 | 37 | 38 | 39 | 40 | 43 | 46 | 47 | 48 |
ImageTitlePriceQuantitySubtotal
<%= product.title %>$<%= product.price %><%= product.qty %> 29 | +  30 | -  31 | Clear  32 | $<%= sub %>
Total: $<%= parseFloat(total).toFixed(2) %>
41 | Clear cart 42 | 44 | Buy now 45 |
49 | 50 |
51 | 52 | 53 | 54 | <% var num = 0; %> 55 | <% cart.forEach(function(p){ %> 56 | <% num++ %> 57 | 58 | 59 | 60 | <% }); %> 61 | 62 | 63 | 64 |
65 | 66 | <% } else {%> 67 |

Your cart is empty.

68 | <% } %> 69 | 70 | 91 | 92 | <% include _layouts/footer %> -------------------------------------------------------------------------------- /cmscart/routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var passport = require('passport'); 4 | var bcrypt = require('bcryptjs'); 5 | 6 | // Get Users model 7 | var User = require('../models/user'); 8 | 9 | /* 10 | * GET register 11 | */ 12 | router.get('/register', function (req, res) { 13 | 14 | res.render('register', { 15 | title: 'Register' 16 | }); 17 | 18 | }); 19 | 20 | /* 21 | * POST register 22 | */ 23 | router.post('/register', function (req, res) { 24 | 25 | var name = req.body.name; 26 | var email = req.body.email; 27 | var username = req.body.username; 28 | var password = req.body.password; 29 | var password2 = req.body.password2; 30 | 31 | req.checkBody('name', 'Name is required!').notEmpty(); 32 | req.checkBody('email', 'Email is required!').isEmail(); 33 | req.checkBody('username', 'Username is required!').notEmpty(); 34 | req.checkBody('password', 'Password is required!').notEmpty(); 35 | req.checkBody('password2', 'Passwords do not match!').equals(password); 36 | 37 | var errors = req.validationErrors(); 38 | 39 | if (errors) { 40 | res.render('register', { 41 | errors: errors, 42 | user: null, 43 | title: 'Register' 44 | }); 45 | } else { 46 | User.findOne({username: username}, function (err, user) { 47 | if (err) 48 | console.log(err); 49 | 50 | if (user) { 51 | req.flash('danger', 'Username exists, choose another!'); 52 | res.redirect('/users/register'); 53 | } else { 54 | var user = new User({ 55 | name: name, 56 | email: email, 57 | username: username, 58 | password: password, 59 | admin: 0 60 | }); 61 | 62 | bcrypt.genSalt(10, function (err, salt) { 63 | bcrypt.hash(user.password, salt, function (err, hash) { 64 | if (err) 65 | console.log(err); 66 | 67 | user.password = hash; 68 | 69 | user.save(function (err) { 70 | if (err) { 71 | console.log(err); 72 | } else { 73 | req.flash('success', 'You are now registered!'); 74 | res.redirect('/users/login') 75 | } 76 | }); 77 | }); 78 | }); 79 | } 80 | }); 81 | } 82 | 83 | }); 84 | 85 | /* 86 | * GET login 87 | */ 88 | router.get('/login', function (req, res) { 89 | 90 | if (res.locals.user) res.redirect('/'); 91 | 92 | res.render('login', { 93 | title: 'Log in' 94 | }); 95 | 96 | }); 97 | 98 | /* 99 | * POST login 100 | */ 101 | router.post('/login', function (req, res, next) { 102 | 103 | passport.authenticate('local', { 104 | successRedirect: '/', 105 | failureRedirect: '/users/login', 106 | failureFlash: true 107 | })(req, res, next); 108 | 109 | }); 110 | 111 | /* 112 | * GET logout 113 | */ 114 | router.get('/logout', function (req, res) { 115 | 116 | req.logout(); 117 | 118 | req.flash('success', 'You are logged out!'); 119 | res.redirect('/users/login'); 120 | 121 | }); 122 | 123 | // Exports 124 | module.exports = router; 125 | 126 | 127 | -------------------------------------------------------------------------------- /cmscart/routes/cart.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | // Get Product model 5 | var Product = require('../models/product'); 6 | 7 | /* 8 | * GET add product to cart 9 | */ 10 | router.get('/add/:product', function (req, res) { 11 | 12 | var slug = req.params.product; 13 | 14 | Product.findOne({slug: slug}, function (err, p) { 15 | if (err) 16 | console.log(err); 17 | 18 | if (typeof req.session.cart == "undefined") { 19 | req.session.cart = []; 20 | req.session.cart.push({ 21 | title: slug, 22 | qty: 1, 23 | price: parseFloat(p.price).toFixed(2), 24 | image: '/product_images/' + p._id + '/' + p.image 25 | }); 26 | } else { 27 | var cart = req.session.cart; 28 | var newItem = true; 29 | 30 | for (var i = 0; i < cart.length; i++) { 31 | if (cart[i].title == slug) { 32 | cart[i].qty++; 33 | newItem = false; 34 | break; 35 | } 36 | } 37 | 38 | if (newItem) { 39 | cart.push({ 40 | title: slug, 41 | qty: 1, 42 | price: parseFloat(p.price).toFixed(2), 43 | image: '/product_images/' + p._id + '/' + p.image 44 | }); 45 | } 46 | } 47 | 48 | // console.log(req.session.cart); 49 | req.flash('success', 'Product added!'); 50 | res.redirect('back'); 51 | }); 52 | 53 | }); 54 | 55 | /* 56 | * GET checkout page 57 | */ 58 | router.get('/checkout', function (req, res) { 59 | 60 | if (req.session.cart && req.session.cart.length == 0) { 61 | delete req.session.cart; 62 | res.redirect('/cart/checkout'); 63 | } else { 64 | res.render('checkout', { 65 | title: 'Checkout', 66 | cart: req.session.cart 67 | }); 68 | } 69 | 70 | }); 71 | 72 | /* 73 | * GET update product 74 | */ 75 | router.get('/update/:product', function (req, res) { 76 | 77 | var slug = req.params.product; 78 | var cart = req.session.cart; 79 | var action = req.query.action; 80 | 81 | for (var i = 0; i < cart.length; i++) { 82 | if (cart[i].title == slug) { 83 | switch (action) { 84 | case "add": 85 | cart[i].qty++; 86 | break; 87 | case "remove": 88 | cart[i].qty--; 89 | if (cart[i].qty < 1) 90 | cart.splice(i, 1); 91 | break; 92 | case "clear": 93 | cart.splice(i, 1); 94 | if (cart.length == 0) 95 | delete req.session.cart; 96 | break; 97 | default: 98 | console.log('update problem'); 99 | break; 100 | } 101 | break; 102 | } 103 | } 104 | 105 | req.flash('success', 'Cart updated!'); 106 | res.redirect('/cart/checkout'); 107 | 108 | }); 109 | 110 | /* 111 | * GET clear cart 112 | */ 113 | router.get('/clear', function (req, res) { 114 | 115 | delete req.session.cart; 116 | 117 | req.flash('success', 'Cart cleared!'); 118 | res.redirect('/cart/checkout'); 119 | 120 | }); 121 | 122 | /* 123 | * GET buy now 124 | */ 125 | router.get('/buynow', function (req, res) { 126 | 127 | delete req.session.cart; 128 | 129 | res.sendStatus(200); 130 | 131 | }); 132 | 133 | // Exports 134 | module.exports = router; 135 | 136 | 137 | -------------------------------------------------------------------------------- /cmscart/views/admin/edit_product.ejs: -------------------------------------------------------------------------------- 1 | <%- include('../_layouts/adminheader') %> 2 | 3 |

Edit product

4 | Back to all products 5 |

6 | 7 |
8 | 9 |
10 | 11 | 12 |
13 | 14 |
15 | 16 | 17 |
18 | 19 |
20 | 21 | 30 |
31 | 32 |
33 | 34 | 35 |
36 | 37 |
38 | 39 |

40 | <% if (image == "") { %> 41 | 42 | <% } else {%> 43 | 44 | <% } %> 45 |

46 |
47 | 48 |
49 | 50 | 51 | 52 |
53 | 54 | 55 | 56 |
57 | 58 |
59 | 60 | 61 | 71 | 72 |

73 |
74 |
75 | 76 | 77 |
78 |
79 | 80 | 81 | 82 | 83 | 115 | 116 | <%- include('../_layouts/adminfooter') %> -------------------------------------------------------------------------------- /cmscart/views/_layouts/header.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= title %> 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 |

You are now being redirected to paypal...

19 | 20 |
21 |
22 | 67 | 68 |
69 | <%- messages('messages', locals) %> 70 | 71 | <% if (errors) {%> 72 | <% errors.forEach(function(error) { %> 73 |
74 | <%= error.msg %> 75 |
76 | <% });%> 77 | <% }%> 78 | 79 |
80 |
81 |

Categories

82 | 88 |
89 |
90 |
91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /cmscart/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var path = require('path'); 3 | var mongoose = require('mongoose'); 4 | var config = require('./config/database'); 5 | var bodyParser = require('body-parser'); 6 | var session = require('express-session'); 7 | var expressValidator = require('express-validator'); 8 | var fileUpload = require('express-fileupload'); 9 | var passport = require('passport'); 10 | 11 | // Connect to db 12 | mongoose.connect(config.database); 13 | var db = mongoose.connection; 14 | db.on('error', console.error.bind(console, 'connection error:')); 15 | db.once('open', function () { 16 | console.log('Connected to MongoDB'); 17 | }); 18 | 19 | // Init app 20 | var app = express(); 21 | 22 | // View engine setup 23 | app.set('views', path.join(__dirname, 'views')); 24 | app.set('view engine', 'ejs'); 25 | 26 | // Set public folder 27 | app.use(express.static(path.join(__dirname, 'public'))); 28 | 29 | // Set global errors variable 30 | app.locals.errors = null; 31 | 32 | // Get Page Model 33 | var Page = require('./models/page'); 34 | 35 | // Get all pages to pass to header.ejs 36 | Page.find({}).sort({sorting: 1}).exec(function (err, pages) { 37 | if (err) { 38 | console.log(err); 39 | } else { 40 | app.locals.pages = pages; 41 | } 42 | }); 43 | 44 | // Get Category Model 45 | var Category = require('./models/category'); 46 | 47 | // Get all categories to pass to header.ejs 48 | Category.find(function (err, categories) { 49 | if (err) { 50 | console.log(err); 51 | } else { 52 | app.locals.categories = categories; 53 | } 54 | }); 55 | 56 | // Express fileUpload middleware 57 | app.use(fileUpload()); 58 | 59 | // Body Parser middleware 60 | // 61 | // parse application/x-www-form-urlencoded 62 | app.use(bodyParser.urlencoded({extended: false})); 63 | // parse application/json 64 | app.use(bodyParser.json()); 65 | 66 | // Express Session middleware 67 | app.use(session({ 68 | secret: 'keyboard cat', 69 | resave: true, 70 | saveUninitialized: true 71 | // cookie: { secure: true } 72 | })); 73 | 74 | // Express Validator middleware 75 | app.use(expressValidator({ 76 | errorFormatter: function (param, msg, value) { 77 | var namespace = param.split('.') 78 | , root = namespace.shift() 79 | , formParam = root; 80 | 81 | while (namespace.length) { 82 | formParam += '[' + namespace.shift() + ']'; 83 | } 84 | return { 85 | param: formParam, 86 | msg: msg, 87 | value: value 88 | }; 89 | }, 90 | customValidators: { 91 | isImage: function (value, filename) { 92 | var extension = (path.extname(filename)).toLowerCase(); 93 | switch (extension) { 94 | case '.jpg': 95 | return '.jpg'; 96 | case '.jpeg': 97 | return '.jpeg'; 98 | case '.png': 99 | return '.png'; 100 | case '': 101 | return '.jpg'; 102 | default: 103 | return false; 104 | } 105 | } 106 | } 107 | })); 108 | 109 | // Express Messages middleware 110 | app.use(require('connect-flash')()); 111 | app.use(function (req, res, next) { 112 | res.locals.messages = require('express-messages')(req, res); 113 | next(); 114 | }); 115 | 116 | // Passport Config 117 | require('./config/passport')(passport); 118 | // Passport Middleware 119 | app.use(passport.initialize()); 120 | app.use(passport.session()); 121 | 122 | app.get('*', function(req,res,next) { 123 | res.locals.cart = req.session.cart; 124 | res.locals.user = req.user || null; 125 | next(); 126 | }); 127 | 128 | // Set routes 129 | var pages = require('./routes/pages.js'); 130 | var products = require('./routes/products.js'); 131 | var cart = require('./routes/cart.js'); 132 | var users = require('./routes/users.js'); 133 | var adminPages = require('./routes/admin_pages.js'); 134 | var adminCategories = require('./routes/admin_categories.js'); 135 | var adminProducts = require('./routes/admin_products.js'); 136 | 137 | app.use('/admin/pages', adminPages); 138 | app.use('/admin/categories', adminCategories); 139 | app.use('/admin/products', adminProducts); 140 | app.use('/products', products); 141 | app.use('/cart', cart); 142 | app.use('/users', users); 143 | app.use('/', pages); 144 | 145 | // Start the server 146 | var port = 3000; 147 | app.listen(port, function () { 148 | console.log('Server started on port ' + port); 149 | }); 150 | -------------------------------------------------------------------------------- /cmscart/routes/admin_categories.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var auth = require('../config/auth'); 4 | var isAdmin = auth.isAdmin; 5 | 6 | // Get Category model 7 | var Category = require('../models/category'); 8 | 9 | /* 10 | * GET category index 11 | */ 12 | router.get('/', isAdmin, function (req, res) { 13 | Category.find(function (err, categories) { 14 | if (err) 15 | return console.log(err); 16 | res.render('admin/categories', { 17 | categories: categories 18 | }); 19 | }); 20 | }); 21 | 22 | /* 23 | * GET add category 24 | */ 25 | router.get('/add-category', isAdmin, function (req, res) { 26 | 27 | var title = ""; 28 | 29 | res.render('admin/add_category', { 30 | title: title 31 | }); 32 | 33 | }); 34 | 35 | /* 36 | * POST add category 37 | */ 38 | router.post('/add-category', function (req, res) { 39 | 40 | req.checkBody('title', 'Title must have a value.').notEmpty(); 41 | 42 | var title = req.body.title; 43 | var slug = title.replace(/\s+/g, '-').toLowerCase(); 44 | 45 | var errors = req.validationErrors(); 46 | 47 | if (errors) { 48 | res.render('admin/add_category', { 49 | errors: errors, 50 | title: title 51 | }); 52 | } else { 53 | Category.findOne({slug: slug}, function (err, category) { 54 | if (category) { 55 | req.flash('danger', 'Category title exists, choose another.'); 56 | res.render('admin/add_category', { 57 | title: title 58 | }); 59 | } else { 60 | var category = new Category({ 61 | title: title, 62 | slug: slug 63 | }); 64 | 65 | category.save(function (err) { 66 | if (err) 67 | return console.log(err); 68 | 69 | Category.find(function (err, categories) { 70 | if (err) { 71 | console.log(err); 72 | } else { 73 | req.app.locals.categories = categories; 74 | } 75 | }); 76 | 77 | req.flash('success', 'Category added!'); 78 | res.redirect('/admin/categories'); 79 | }); 80 | } 81 | }); 82 | } 83 | 84 | }); 85 | 86 | /* 87 | * GET edit category 88 | */ 89 | router.get('/edit-category/:id', isAdmin, function (req, res) { 90 | 91 | Category.findById(req.params.id, function (err, category) { 92 | if (err) 93 | return console.log(err); 94 | 95 | res.render('admin/edit_category', { 96 | title: category.title, 97 | id: category._id 98 | }); 99 | }); 100 | 101 | }); 102 | 103 | /* 104 | * POST edit category 105 | */ 106 | router.post('/edit-category/:id', function (req, res) { 107 | 108 | req.checkBody('title', 'Title must have a value.').notEmpty(); 109 | 110 | var title = req.body.title; 111 | var slug = title.replace(/\s+/g, '-').toLowerCase(); 112 | var id = req.params.id; 113 | 114 | var errors = req.validationErrors(); 115 | 116 | if (errors) { 117 | res.render('admin/edit_category', { 118 | errors: errors, 119 | title: title, 120 | id: id 121 | }); 122 | } else { 123 | Category.findOne({slug: slug, _id: {'$ne': id}}, function (err, category) { 124 | if (category) { 125 | req.flash('danger', 'Category title exists, choose another.'); 126 | res.render('admin/edit_category', { 127 | title: title, 128 | id: id 129 | }); 130 | } else { 131 | Category.findById(id, function (err, category) { 132 | if (err) 133 | return console.log(err); 134 | 135 | category.title = title; 136 | category.slug = slug; 137 | 138 | category.save(function (err) { 139 | if (err) 140 | return console.log(err); 141 | 142 | Category.find(function (err, categories) { 143 | if (err) { 144 | console.log(err); 145 | } else { 146 | req.app.locals.categories = categories; 147 | } 148 | }); 149 | 150 | req.flash('success', 'Category edited!'); 151 | res.redirect('/admin/categories/edit-category/' + id); 152 | }); 153 | 154 | }); 155 | 156 | 157 | } 158 | }); 159 | } 160 | 161 | }); 162 | 163 | /* 164 | * GET delete category 165 | */ 166 | router.get('/delete-category/:id', isAdmin, function (req, res) { 167 | Category.findByIdAndRemove(req.params.id, function (err) { 168 | if (err) 169 | return console.log(err); 170 | 171 | Category.find(function (err, categories) { 172 | if (err) { 173 | console.log(err); 174 | } else { 175 | req.app.locals.categories = categories; 176 | } 177 | }); 178 | 179 | req.flash('success', 'Category deleted!'); 180 | res.redirect('/admin/categories/'); 181 | }); 182 | }); 183 | 184 | 185 | // Exports 186 | module.exports = router; 187 | 188 | 189 | -------------------------------------------------------------------------------- /cmscart/routes/admin_pages.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var auth = require('../config/auth'); 4 | var isAdmin = auth.isAdmin; 5 | 6 | // Get Page model 7 | var Page = require('../models/page'); 8 | 9 | /* 10 | * GET pages index 11 | */ 12 | router.get('/', isAdmin, function (req, res) { 13 | Page.find({}).sort({sorting: 1}).exec(function (err, pages) { 14 | res.render('admin/pages', { 15 | pages: pages 16 | }); 17 | }); 18 | }); 19 | 20 | /* 21 | * GET add page 22 | */ 23 | router.get('/add-page', isAdmin, function (req, res) { 24 | 25 | var title = ""; 26 | var slug = ""; 27 | var content = ""; 28 | 29 | res.render('admin/add_page', { 30 | title: title, 31 | slug: slug, 32 | content: content 33 | }); 34 | 35 | }); 36 | 37 | /* 38 | * POST add page 39 | */ 40 | router.post('/add-page', function (req, res) { 41 | 42 | req.checkBody('title', 'Title must have a value.').notEmpty(); 43 | req.checkBody('content', 'Content must have a value.').notEmpty(); 44 | 45 | var title = req.body.title; 46 | var slug = req.body.slug.replace(/\s+/g, '-').toLowerCase(); 47 | if (slug == "") 48 | slug = title.replace(/\s+/g, '-').toLowerCase(); 49 | var content = req.body.content; 50 | 51 | var errors = req.validationErrors(); 52 | 53 | if (errors) { 54 | res.render('admin/add_page', { 55 | errors: errors, 56 | title: title, 57 | slug: slug, 58 | content: content 59 | }); 60 | } else { 61 | Page.findOne({slug: slug}, function (err, page) { 62 | if (page) { 63 | req.flash('danger', 'Page slug exists, choose another.'); 64 | res.render('admin/add_page', { 65 | title: title, 66 | slug: slug, 67 | content: content 68 | }); 69 | } else { 70 | var page = new Page({ 71 | title: title, 72 | slug: slug, 73 | content: content, 74 | sorting: 100 75 | }); 76 | 77 | page.save(function (err) { 78 | if (err) 79 | return console.log(err); 80 | 81 | Page.find({}).sort({sorting: 1}).exec(function (err, pages) { 82 | if (err) { 83 | console.log(err); 84 | } else { 85 | req.app.locals.pages = pages; 86 | } 87 | }); 88 | 89 | req.flash('success', 'Page added!'); 90 | res.redirect('/admin/pages'); 91 | }); 92 | } 93 | }); 94 | } 95 | 96 | }); 97 | 98 | // Sort pages function 99 | function sortPages(ids, callback) { 100 | var count = 0; 101 | 102 | for (var i = 0; i < ids.length; i++) { 103 | var id = ids[i]; 104 | count++; 105 | 106 | (function (count) { 107 | Page.findById(id, function (err, page) { 108 | page.sorting = count; 109 | page.save(function (err) { 110 | if (err) 111 | return console.log(err); 112 | ++count; 113 | if (count >= ids.length) { 114 | callback(); 115 | } 116 | }); 117 | }); 118 | })(count); 119 | 120 | } 121 | } 122 | 123 | /* 124 | * POST reorder pages 125 | */ 126 | router.post('/reorder-pages', function (req, res) { 127 | var ids = req.body['id[]']; 128 | 129 | sortPages(ids, function () { 130 | Page.find({}).sort({sorting: 1}).exec(function (err, pages) { 131 | if (err) { 132 | console.log(err); 133 | } else { 134 | req.app.locals.pages = pages; 135 | } 136 | }); 137 | }); 138 | 139 | }); 140 | 141 | /* 142 | * GET edit page 143 | */ 144 | router.get('/edit-page/:id', isAdmin, function (req, res) { 145 | 146 | Page.findById(req.params.id, function (err, page) { 147 | if (err) 148 | return console.log(err); 149 | 150 | res.render('admin/edit_page', { 151 | title: page.title, 152 | slug: page.slug, 153 | content: page.content, 154 | id: page._id 155 | }); 156 | }); 157 | 158 | }); 159 | 160 | /* 161 | * POST edit page 162 | */ 163 | router.post('/edit-page/:id', function (req, res) { 164 | 165 | req.checkBody('title', 'Title must have a value.').notEmpty(); 166 | req.checkBody('content', 'Content must have a value.').notEmpty(); 167 | 168 | var title = req.body.title; 169 | var slug = req.body.slug.replace(/\s+/g, '-').toLowerCase(); 170 | if (slug == "") 171 | slug = title.replace(/\s+/g, '-').toLowerCase(); 172 | var content = req.body.content; 173 | var id = req.params.id; 174 | 175 | var errors = req.validationErrors(); 176 | 177 | if (errors) { 178 | res.render('admin/edit_page', { 179 | errors: errors, 180 | title: title, 181 | slug: slug, 182 | content: content, 183 | id: id 184 | }); 185 | } else { 186 | Page.findOne({slug: slug, _id: {'$ne': id}}, function (err, page) { 187 | if (page) { 188 | req.flash('danger', 'Page slug exists, choose another.'); 189 | res.render('admin/edit_page', { 190 | title: title, 191 | slug: slug, 192 | content: content, 193 | id: id 194 | }); 195 | } else { 196 | 197 | Page.findById(id, function (err, page) { 198 | if (err) 199 | return console.log(err); 200 | 201 | page.title = title; 202 | page.slug = slug; 203 | page.content = content; 204 | 205 | page.save(function (err) { 206 | if (err) 207 | return console.log(err); 208 | 209 | Page.find({}).sort({sorting: 1}).exec(function (err, pages) { 210 | if (err) { 211 | console.log(err); 212 | } else { 213 | req.app.locals.pages = pages; 214 | } 215 | }); 216 | 217 | 218 | req.flash('success', 'Page edited!'); 219 | res.redirect('/admin/pages/edit-page/' + id); 220 | }); 221 | 222 | }); 223 | 224 | 225 | } 226 | }); 227 | } 228 | 229 | }); 230 | 231 | /* 232 | * GET delete page 233 | */ 234 | router.get('/delete-page/:id', isAdmin, function (req, res) { 235 | Page.findByIdAndRemove(req.params.id, function (err) { 236 | if (err) 237 | return console.log(err); 238 | 239 | Page.find({}).sort({sorting: 1}).exec(function (err, pages) { 240 | if (err) { 241 | console.log(err); 242 | } else { 243 | req.app.locals.pages = pages; 244 | } 245 | }); 246 | 247 | req.flash('success', 'Page deleted!'); 248 | res.redirect('/admin/pages/'); 249 | }); 250 | }); 251 | 252 | 253 | // Exports 254 | module.exports = router; 255 | 256 | 257 | -------------------------------------------------------------------------------- /cmscart/routes/admin_products.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var mkdirp = require('mkdirp'); 4 | var fs = require('fs-extra'); 5 | var resizeImg = require('resize-img'); 6 | var auth = require('../config/auth'); 7 | var isAdmin = auth.isAdmin; 8 | 9 | // Get Product model 10 | var Product = require('../models/product'); 11 | 12 | // Get Category model 13 | var Category = require('../models/category'); 14 | 15 | /* 16 | * GET products index 17 | */ 18 | router.get('/', isAdmin, function (req, res) { 19 | var count; 20 | 21 | Product.count(function (err, c) { 22 | count = c; 23 | }); 24 | 25 | Product.find(function (err, products) { 26 | res.render('admin/products', { 27 | products: products, 28 | count: count 29 | }); 30 | }); 31 | }); 32 | 33 | /* 34 | * GET add product 35 | */ 36 | router.get('/add-product', isAdmin, function (req, res) { 37 | 38 | var title = ""; 39 | var desc = ""; 40 | var price = ""; 41 | 42 | Category.find(function (err, categories) { 43 | res.render('admin/add_product', { 44 | title: title, 45 | desc: desc, 46 | categories: categories, 47 | price: price 48 | }); 49 | }); 50 | 51 | 52 | }); 53 | 54 | /* 55 | * POST add product 56 | */ 57 | router.post('/add-product', function (req, res) { 58 | 59 | var imageFile = typeof req.files.image !== "undefined" ? req.files.image.name : ""; 60 | 61 | req.checkBody('title', 'Title must have a value.').notEmpty(); 62 | req.checkBody('desc', 'Description must have a value.').notEmpty(); 63 | req.checkBody('price', 'Price must have a value.').isDecimal(); 64 | req.checkBody('image', 'You must upload an image').isImage(imageFile); 65 | 66 | var title = req.body.title; 67 | var slug = title.replace(/\s+/g, '-').toLowerCase(); 68 | var desc = req.body.desc; 69 | var price = req.body.price; 70 | var category = req.body.category; 71 | 72 | var errors = req.validationErrors(); 73 | 74 | if (errors) { 75 | Category.find(function (err, categories) { 76 | res.render('admin/add_product', { 77 | errors: errors, 78 | title: title, 79 | desc: desc, 80 | categories: categories, 81 | price: price 82 | }); 83 | }); 84 | } else { 85 | Product.findOne({slug: slug}, function (err, product) { 86 | if (product) { 87 | req.flash('danger', 'Product title exists, choose another.'); 88 | Category.find(function (err, categories) { 89 | res.render('admin/add_product', { 90 | title: title, 91 | desc: desc, 92 | categories: categories, 93 | price: price 94 | }); 95 | }); 96 | } else { 97 | 98 | var price2 = parseFloat(price).toFixed(2); 99 | 100 | var product = new Product({ 101 | title: title, 102 | slug: slug, 103 | desc: desc, 104 | price: price2, 105 | category: category, 106 | image: imageFile 107 | }); 108 | 109 | product.save(function (err) { 110 | if (err) 111 | return console.log(err); 112 | 113 | mkdirp('public/product_images/' + product._id, function (err) { 114 | return console.log(err); 115 | }); 116 | 117 | mkdirp('public/product_images/' + product._id + '/gallery', function (err) { 118 | return console.log(err); 119 | }); 120 | 121 | mkdirp('public/product_images/' + product._id + '/gallery/thumbs', function (err) { 122 | return console.log(err); 123 | }); 124 | 125 | if (imageFile != "") { 126 | var productImage = req.files.image; 127 | var path = 'public/product_images/' + product._id + '/' + imageFile; 128 | 129 | productImage.mv(path, function (err) { 130 | return console.log(err); 131 | }); 132 | } 133 | 134 | req.flash('success', 'Product added!'); 135 | res.redirect('/admin/products'); 136 | }); 137 | } 138 | }); 139 | } 140 | 141 | }); 142 | 143 | /* 144 | * GET edit product 145 | */ 146 | router.get('/edit-product/:id', isAdmin, function (req, res) { 147 | 148 | var errors; 149 | 150 | if (req.session.errors) 151 | errors = req.session.errors; 152 | req.session.errors = null; 153 | 154 | Category.find(function (err, categories) { 155 | 156 | Product.findById(req.params.id, function (err, p) { 157 | if (err) { 158 | console.log(err); 159 | res.redirect('/admin/products'); 160 | } else { 161 | var galleryDir = 'public/product_images/' + p._id + '/gallery'; 162 | var galleryImages = null; 163 | 164 | fs.readdir(galleryDir, function (err, files) { 165 | if (err) { 166 | console.log(err); 167 | } else { 168 | galleryImages = files; 169 | 170 | res.render('admin/edit_product', { 171 | title: p.title, 172 | errors: errors, 173 | desc: p.desc, 174 | categories: categories, 175 | category: p.category.replace(/\s+/g, '-').toLowerCase(), 176 | price: parseFloat(p.price).toFixed(2), 177 | image: p.image, 178 | galleryImages: galleryImages, 179 | id: p._id 180 | }); 181 | } 182 | }); 183 | } 184 | }); 185 | 186 | }); 187 | 188 | }); 189 | 190 | /* 191 | * POST edit product 192 | */ 193 | router.post('/edit-product/:id', function (req, res) { 194 | 195 | var imageFile = typeof req.files.image !== "undefined" ? req.files.image.name : ""; 196 | 197 | req.checkBody('title', 'Title must have a value.').notEmpty(); 198 | req.checkBody('desc', 'Description must have a value.').notEmpty(); 199 | req.checkBody('price', 'Price must have a value.').isDecimal(); 200 | req.checkBody('image', 'You must upload an image').isImage(imageFile); 201 | 202 | var title = req.body.title; 203 | var slug = title.replace(/\s+/g, '-').toLowerCase(); 204 | var desc = req.body.desc; 205 | var price = req.body.price; 206 | var category = req.body.category; 207 | var pimage = req.body.pimage; 208 | var id = req.params.id; 209 | 210 | var errors = req.validationErrors(); 211 | 212 | if (errors) { 213 | req.session.errors = errors; 214 | res.redirect('/admin/products/edit-product/' + id); 215 | } else { 216 | Product.findOne({slug: slug, _id: {'$ne': id}}, function (err, p) { 217 | if (err) 218 | console.log(err); 219 | 220 | if (p) { 221 | req.flash('danger', 'Product title exists, choose another.'); 222 | res.redirect('/admin/products/edit-product/' + id); 223 | } else { 224 | Product.findById(id, function (err, p) { 225 | if (err) 226 | console.log(err); 227 | 228 | p.title = title; 229 | p.slug = slug; 230 | p.desc = desc; 231 | p.price = parseFloat(price).toFixed(2); 232 | p.category = category; 233 | if (imageFile != "") { 234 | p.image = imageFile; 235 | } 236 | 237 | p.save(function (err) { 238 | if (err) 239 | console.log(err); 240 | 241 | if (imageFile != "") { 242 | if (pimage != "") { 243 | fs.remove('public/product_images/' + id + '/' + pimage, function (err) { 244 | if (err) 245 | console.log(err); 246 | }); 247 | } 248 | 249 | var productImage = req.files.image; 250 | var path = 'public/product_images/' + id + '/' + imageFile; 251 | 252 | productImage.mv(path, function (err) { 253 | return console.log(err); 254 | }); 255 | 256 | } 257 | 258 | req.flash('success', 'Product edited!'); 259 | res.redirect('/admin/products/edit-product/' + id); 260 | }); 261 | 262 | }); 263 | } 264 | }); 265 | } 266 | 267 | }); 268 | 269 | /* 270 | * POST product gallery 271 | */ 272 | router.post('/product-gallery/:id', function (req, res) { 273 | 274 | var productImage = req.files.file; 275 | var id = req.params.id; 276 | var path = 'public/product_images/' + id + '/gallery/' + req.files.file.name; 277 | var thumbsPath = 'public/product_images/' + id + '/gallery/thumbs/' + req.files.file.name; 278 | 279 | productImage.mv(path, function (err) { 280 | if (err) 281 | console.log(err); 282 | 283 | resizeImg(fs.readFileSync(path), {width: 100, height: 100}).then(function (buf) { 284 | fs.writeFileSync(thumbsPath, buf); 285 | }); 286 | }); 287 | 288 | res.sendStatus(200); 289 | 290 | }); 291 | 292 | /* 293 | * GET delete image 294 | */ 295 | router.get('/delete-image/:image', isAdmin, function (req, res) { 296 | 297 | var originalImage = 'public/product_images/' + req.query.id + '/gallery/' + req.params.image; 298 | var thumbImage = 'public/product_images/' + req.query.id + '/gallery/thumbs/' + req.params.image; 299 | 300 | fs.remove(originalImage, function (err) { 301 | if (err) { 302 | console.log(err); 303 | } else { 304 | fs.remove(thumbImage, function (err) { 305 | if (err) { 306 | console.log(err); 307 | } else { 308 | req.flash('success', 'Image deleted!'); 309 | res.redirect('/admin/products/edit-product/' + req.query.id); 310 | } 311 | }); 312 | } 313 | }); 314 | }); 315 | 316 | /* 317 | * GET delete product 318 | */ 319 | router.get('/delete-product/:id', isAdmin, function (req, res) { 320 | 321 | var id = req.params.id; 322 | var path = 'public/product_images/' + id; 323 | 324 | fs.remove(path, function (err) { 325 | if (err) { 326 | console.log(err); 327 | } else { 328 | Product.findByIdAndRemove(id, function (err) { 329 | console.log(err); 330 | }); 331 | 332 | req.flash('success', 'Product deleted!'); 333 | res.redirect('/admin/products'); 334 | } 335 | }); 336 | 337 | }); 338 | 339 | // Exports 340 | module.exports = router; 341 | 342 | 343 | --------------------------------------------------------------------------------