delete and add categories
@ -1,4 +1,5 @@
|
|||||||
const ObjectID = require('mongodb').ObjectID;
|
const ObjectID = require('mongodb').ObjectID;
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
function checkAuthenticated(req, res, next) {
|
function checkAuthenticated(req, res, next) {
|
||||||
if (req.isAuthenticated()) {
|
if (req.isAuthenticated()) {
|
||||||
@ -112,21 +113,25 @@ function onePageItemRoute(req, res, dbo) {
|
|||||||
try {
|
try {
|
||||||
dbo.collection('items').find({_id: ObjectID(req.params.id)}).toArray((err, result) => {
|
dbo.collection('items').find({_id: ObjectID(req.params.id)}).toArray((err, result) => {
|
||||||
const item = result[0];
|
const item = result[0];
|
||||||
dbo.collection('categories').find({title: item.category}).toArray((err, result) => {
|
try {
|
||||||
const category = result[0];
|
dbo.collection('categories').find({title: item.category}).toArray((err, result) => {
|
||||||
res.render('main/product', {
|
const category = result[0];
|
||||||
title: item.title,
|
res.render('main/product', {
|
||||||
image: category.img,
|
title: item.title,
|
||||||
count: item.count,
|
image: category.img,
|
||||||
category: item.category[0].toUpperCase() + item.category.slice(1),
|
count: item.count,
|
||||||
price: item.price,
|
category: item.category[0].toUpperCase() + item.category.slice(1),
|
||||||
description: item.description,
|
price: item.price,
|
||||||
date: item.date,
|
description: item.description,
|
||||||
id: item._id,
|
date: item.date,
|
||||||
type: category.type,
|
id: item._id,
|
||||||
format: category.format
|
type: category.type,
|
||||||
})
|
format: category.format
|
||||||
});
|
})
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
res.render('main/404');
|
||||||
|
}
|
||||||
})
|
})
|
||||||
} catch {
|
} catch {
|
||||||
res.render('main/404');
|
res.render('main/404');
|
||||||
@ -221,6 +226,41 @@ function controlPanelDatabaseRoute(req, res) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function controlPanelAddCategory(req, res, db) {
|
||||||
|
try {
|
||||||
|
const filedata = req.file;
|
||||||
|
const data = {
|
||||||
|
title: req.body.title.toLowerCase().trim(),
|
||||||
|
img: filedata.filename,
|
||||||
|
type: req.body.type,
|
||||||
|
format: req.body.format
|
||||||
|
}
|
||||||
|
db.collection('categories').insertOne(data);
|
||||||
|
res.redirect('/control-panel/categories');
|
||||||
|
} catch {
|
||||||
|
res.render('main/404');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function controlPanelDellCategory(req, res, db) {
|
||||||
|
try {
|
||||||
|
const data = JSON.parse(req.body.category);
|
||||||
|
db.collection('categories').deleteOne({"_id": ObjectID(data.id)});
|
||||||
|
|
||||||
|
// Удаляем иконку
|
||||||
|
const path = `./dist/public/img/service-icons/${data.img}`
|
||||||
|
try {
|
||||||
|
fs.unlinkSync(path);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
res.redirect('/control-panel/categories');
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
res.render('main/404');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = function (server, db) {
|
module.exports = function (server, db) {
|
||||||
server.get('/', (req, res) => indexRoute(req, res, db));
|
server.get('/', (req, res) => indexRoute(req, res, db));
|
||||||
server.get('/api', (req, res) => getItemsRoute(req, res, db));
|
server.get('/api', (req, res) => getItemsRoute(req, res, db));
|
||||||
@ -235,4 +275,7 @@ module.exports = function (server, db) {
|
|||||||
server.get('/control-panel/content', checkAuthenticated, (req, res) => controlPanelContentRoute(req, res));
|
server.get('/control-panel/content', checkAuthenticated, (req, res) => controlPanelContentRoute(req, res));
|
||||||
server.get('/control-panel/administrators', checkAuthenticated, (req, res) => controlPanelAdministratorsRoute(req, res));
|
server.get('/control-panel/administrators', checkAuthenticated, (req, res) => controlPanelAdministratorsRoute(req, res));
|
||||||
server.get('/control-panel/database', checkAuthenticated, (req, res) => controlPanelDatabaseRoute(req, res));
|
server.get('/control-panel/database', checkAuthenticated, (req, res) => controlPanelDatabaseRoute(req, res));
|
||||||
|
|
||||||
|
server.post('/control-panel/categories/create', checkAuthenticated, (req, res) => controlPanelAddCategory(req, res, db));
|
||||||
|
server.post('/control-panel/categories/delete', checkAuthenticated, (req, res) => controlPanelDellCategory(req, res, db));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,14 +12,23 @@ const passport = require('passport');
|
|||||||
const flash = require('express-flash');
|
const flash = require('express-flash');
|
||||||
const session = require('express-session');
|
const session = require('express-session');
|
||||||
const methodOverride = require('method-override');
|
const methodOverride = require('method-override');
|
||||||
|
const multer = require('multer');
|
||||||
|
|
||||||
MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: true}, (err, client) => {
|
MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: true}, (err, client) => {
|
||||||
if (err) return console.log(err)
|
if (err) return console.log(err)
|
||||||
const db = client.db(db_config.name);
|
const db = client.db(db_config.name);
|
||||||
|
|
||||||
|
const storage = multer.diskStorage({
|
||||||
|
destination: 'dist/public/img/service-icons',
|
||||||
|
filename: function(req, file, cb) {
|
||||||
|
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
server.use(cors())
|
server.use(cors())
|
||||||
server.use(express.static(path.join(__dirname, '../dist/public')));
|
server.use(express.static(path.join(__dirname, '../dist/public')));
|
||||||
|
server.use(multer({storage: storage}).single('img'));
|
||||||
server.use(express.urlencoded({ extended: false }));
|
server.use(express.urlencoded({ extended: false }));
|
||||||
server.use(flash());
|
server.use(flash());
|
||||||
server.use(session({
|
server.use(session({
|
||||||
|
|||||||
6
dist/public/css/style.css
vendored
@ -753,3 +753,9 @@ div.table > table > tbody > tr > td:nth-child(7) > button.btn.orange {
|
|||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
}
|
}
|
||||||
|
.select-dropdown {
|
||||||
|
max-height: 200px;
|
||||||
|
}
|
||||||
|
#categories .under-block {
|
||||||
|
margin-top: 3rem;
|
||||||
|
}
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1021 B After Width: | Height: | Size: 1021 B |
|
Before Width: | Height: | Size: 443 B After Width: | Height: | Size: 443 B |
|
Before Width: | Height: | Size: 675 B After Width: | Height: | Size: 675 B |
6
dist/views/admin/assets/head.pug
vendored
@ -5,11 +5,11 @@ html(lang='ru')
|
|||||||
meta(http-equiv='Cоntent-Type' cоntent='text/html;' charset='utf-8')
|
meta(http-equiv='Cоntent-Type' cоntent='text/html;' charset='utf-8')
|
||||||
title #{title}
|
title #{title}
|
||||||
// Materialize CSS
|
// Materialize CSS
|
||||||
link(rel="stylesheet", href="../css/materialize.min.css")
|
link(rel="stylesheet", href="/css/materialize.min.css")
|
||||||
// Style CSS
|
// Style CSS
|
||||||
link(rel="stylesheet", href="../css/style.css")
|
link(rel="stylesheet", href="/css/style.css")
|
||||||
// Media CSS
|
// Media CSS
|
||||||
link(rel="stylesheet", href="../css/media.css")
|
link(rel="stylesheet", href="/css/media.css")
|
||||||
// Material Icons
|
// Material Icons
|
||||||
link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
|
link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
|
||||||
body
|
body
|
||||||
4
dist/views/admin/assets/templates/header.pug
vendored
@ -10,10 +10,10 @@ header.admin-header
|
|||||||
li
|
li
|
||||||
.user-view
|
.user-view
|
||||||
.background
|
.background
|
||||||
img(src="../img/admin/background-user.jpg", alt="#")
|
img(src="/img/admin/background-user.jpg", alt="#")
|
||||||
span(style="padding-top: 5px;padding-bottom:10px;display:block;").white-text Control Panel v1.0.0
|
span(style="padding-top: 5px;padding-bottom:10px;display:block;").white-text Control Panel v1.0.0
|
||||||
a(href="#")
|
a(href="#")
|
||||||
img(class="circle" src="../img/admin/avatar-user.jpg", alt="alt")
|
img(class="circle" src="/img/admin/avatar-user.jpg", alt="alt")
|
||||||
a(href="#")
|
a(href="#")
|
||||||
span.white-text.name #{name}
|
span.white-text.name #{name}
|
||||||
a(href="#")
|
a(href="#")
|
||||||
|
|||||||
41
dist/views/admin/categories.pug
vendored
@ -7,19 +7,12 @@ body.has-fixed-sidenav
|
|||||||
.col.s12
|
.col.s12
|
||||||
h2 Редактирование категорий
|
h2 Редактирование категорий
|
||||||
.col.s12
|
.col.s12
|
||||||
.card
|
#categories.card
|
||||||
.card-content
|
.card-content
|
||||||
.input-field
|
|
||||||
select
|
|
||||||
option(value="" disabled selected)
|
|
||||||
| Выберите категорию
|
|
||||||
option(value="1" data-icon="../img/service-icons/origin.svg") Origin
|
|
||||||
option(value="2" data-icon="../img/service-icons/steam.svg") Steam
|
|
||||||
label Редактирование
|
|
||||||
.category-add
|
.category-add
|
||||||
h5 Добавить категорию
|
h5 Добавить категорию
|
||||||
.row
|
.row
|
||||||
form(action="/" method="POST")
|
form(id="categoryAdd" action="/control-panel/categories/create" method="POST" enctype="multipart/form-data")
|
||||||
.input-field.col.l6.s12
|
.input-field.col.l6.s12
|
||||||
input(id="title" name="title" type="text" data-length="20" required)
|
input(id="title" name="title" type="text" data-length="20" required)
|
||||||
label(for="title") Название категории
|
label(for="title") Название категории
|
||||||
@ -36,22 +29,26 @@ body.has-fixed-sidenav
|
|||||||
input(type="text" id="format" name="format" required)
|
input(type="text" id="format" name="format" required)
|
||||||
label(for="format") Формат аккаунтов
|
label(for="format") Формат аккаунтов
|
||||||
.col.s12
|
.col.s12
|
||||||
button(type="submit" class="btn") Добавить категорию
|
button(type="submit" class="btn green") Добавить категорию
|
||||||
button(class="orange btn hide" style="margin-left:5px;") Редактировать
|
|
||||||
.divider
|
.divider
|
||||||
.category-delete
|
.under-block
|
||||||
h5 Удалить категорию
|
.category-edit
|
||||||
.row
|
.row
|
||||||
form(action="/")
|
#edit.input-field.col.s12
|
||||||
.input-field.col.s12
|
|
||||||
select
|
select
|
||||||
option(value="" disabled selected)
|
option(value="" disabled selected)
|
||||||
| Выберите категорию для удаления
|
| Выберите категорию для редактирования
|
||||||
option(value="1" data-icon="../img/service-icons/origin.svg") Origin
|
label Редактирование
|
||||||
option(value="2" data-icon="../img/service-icons/steam.svg") Steam
|
.category-delete
|
||||||
label Удаление
|
.row
|
||||||
.col.s6
|
form(id="categoryDelete" action="/control-panel/categories/delete" method="POST")
|
||||||
button(type="submit" class="btn red") Удалить
|
#delete.input-field.col.s12
|
||||||
|
select(name="category")
|
||||||
|
option(value="" disabled selected)
|
||||||
|
| Выберите категорию для удаления
|
||||||
|
label Удаление
|
||||||
|
.col.s6
|
||||||
|
button(type="submit" class="btn red") Удалить
|
||||||
|
|
||||||
|
|
||||||
include ./assets/templates/footer.pug
|
include ./assets/templates/footer.pug
|
||||||
|
|||||||
6
dist/views/main/assets/head.pug
vendored
@ -5,11 +5,11 @@ html(lang='ru')
|
|||||||
meta(http-equiv='Cоntent-Type' cоntent='text/html;' charset='utf-8')
|
meta(http-equiv='Cоntent-Type' cоntent='text/html;' charset='utf-8')
|
||||||
title #{title}
|
title #{title}
|
||||||
// Materialize CSS
|
// Materialize CSS
|
||||||
link(rel="stylesheet", href="../css/materialize.min.css")
|
link(rel="stylesheet", href="/css/materialize.min.css")
|
||||||
// Style CSS
|
// Style CSS
|
||||||
link(rel="stylesheet", href="../css/style.css")
|
link(rel="stylesheet", href="/css/style.css")
|
||||||
// Media CSS
|
// Media CSS
|
||||||
link(rel="stylesheet", href="../css/media.css")
|
link(rel="stylesheet", href="/css/media.css")
|
||||||
// Material Icons
|
// Material Icons
|
||||||
link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
|
link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
|
||||||
body
|
body
|
||||||
120
package-lock.json
generated
@ -1190,6 +1190,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"append-field": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
|
||||||
|
"integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
|
||||||
|
},
|
||||||
"aproba": {
|
"aproba": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
||||||
@ -1694,8 +1699,7 @@
|
|||||||
"buffer-from": {
|
"buffer-from": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||||
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
|
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"buffer-indexof": {
|
"buffer-indexof": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
@ -1715,6 +1719,38 @@
|
|||||||
"integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
|
"integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"busboy": {
|
||||||
|
"version": "0.2.14",
|
||||||
|
"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
|
||||||
|
"integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
|
||||||
|
"requires": {
|
||||||
|
"dicer": "0.2.5",
|
||||||
|
"readable-stream": "1.1.x"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"isarray": {
|
||||||
|
"version": "0.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
|
||||||
|
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
|
||||||
|
},
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "1.1.14",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
|
||||||
|
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
|
||||||
|
"requires": {
|
||||||
|
"core-util-is": "~1.0.0",
|
||||||
|
"inherits": "~2.0.1",
|
||||||
|
"isarray": "0.0.1",
|
||||||
|
"string_decoder": "~0.10.x"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "0.10.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
|
||||||
|
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"bytes": {
|
"bytes": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
|
||||||
@ -2048,7 +2084,6 @@
|
|||||||
"version": "1.6.2",
|
"version": "1.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
|
||||||
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
|
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"buffer-from": "^1.0.0",
|
"buffer-from": "^1.0.0",
|
||||||
"inherits": "^2.0.3",
|
"inherits": "^2.0.3",
|
||||||
@ -2168,8 +2203,7 @@
|
|||||||
"core-util-is": {
|
"core-util-is": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
|
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"cors": {
|
"cors": {
|
||||||
"version": "2.8.5",
|
"version": "2.8.5",
|
||||||
@ -2404,6 +2438,38 @@
|
|||||||
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
|
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"dicer": {
|
||||||
|
"version": "0.2.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
|
||||||
|
"integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
|
||||||
|
"requires": {
|
||||||
|
"readable-stream": "1.1.x",
|
||||||
|
"streamsearch": "0.1.2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"isarray": {
|
||||||
|
"version": "0.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
|
||||||
|
"integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
|
||||||
|
},
|
||||||
|
"readable-stream": {
|
||||||
|
"version": "1.1.14",
|
||||||
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
|
||||||
|
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
|
||||||
|
"requires": {
|
||||||
|
"core-util-is": "~1.0.0",
|
||||||
|
"inherits": "~2.0.1",
|
||||||
|
"isarray": "0.0.1",
|
||||||
|
"string_decoder": "~0.10.x"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"string_decoder": {
|
||||||
|
"version": "0.10.31",
|
||||||
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
|
||||||
|
"integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"diffie-hellman": {
|
"diffie-hellman": {
|
||||||
"version": "5.0.3",
|
"version": "5.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
|
||||||
@ -4072,8 +4138,7 @@
|
|||||||
"inherits": {
|
"inherits": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"ini": {
|
"ini": {
|
||||||
"version": "1.3.5",
|
"version": "1.3.5",
|
||||||
@ -4350,8 +4415,7 @@
|
|||||||
"isarray": {
|
"isarray": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
|
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"isexe": {
|
"isexe": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
@ -4731,8 +4795,7 @@
|
|||||||
"minimist": {
|
"minimist": {
|
||||||
"version": "0.0.8",
|
"version": "0.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
|
||||||
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
|
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"mississippi": {
|
"mississippi": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
@ -4777,7 +4840,6 @@
|
|||||||
"version": "0.5.1",
|
"version": "0.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
|
||||||
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"minimist": "0.0.8"
|
"minimist": "0.0.8"
|
||||||
}
|
}
|
||||||
@ -4813,6 +4875,21 @@
|
|||||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"multer": {
|
||||||
|
"version": "1.4.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz",
|
||||||
|
"integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==",
|
||||||
|
"requires": {
|
||||||
|
"append-field": "^1.0.0",
|
||||||
|
"busboy": "^0.2.11",
|
||||||
|
"concat-stream": "^1.5.2",
|
||||||
|
"mkdirp": "^0.5.1",
|
||||||
|
"object-assign": "^4.1.1",
|
||||||
|
"on-finished": "^2.3.0",
|
||||||
|
"type-is": "^1.6.4",
|
||||||
|
"xtend": "^4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"multicast-dns": {
|
"multicast-dns": {
|
||||||
"version": "6.2.3",
|
"version": "6.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
|
||||||
@ -5351,8 +5428,7 @@
|
|||||||
"process-nextick-args": {
|
"process-nextick-args": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
|
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"promise": {
|
"promise": {
|
||||||
"version": "7.3.1",
|
"version": "7.3.1",
|
||||||
@ -5617,7 +5693,6 @@
|
|||||||
"version": "2.3.6",
|
"version": "2.3.6",
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"core-util-is": "~1.0.0",
|
"core-util-is": "~1.0.0",
|
||||||
"inherits": "~2.0.3",
|
"inherits": "~2.0.3",
|
||||||
@ -6471,6 +6546,11 @@
|
|||||||
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
|
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"streamsearch": {
|
||||||
|
"version": "0.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
|
||||||
|
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
|
||||||
|
},
|
||||||
"string-width": {
|
"string-width": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
|
||||||
@ -6502,7 +6582,6 @@
|
|||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"safe-buffer": "~5.1.0"
|
"safe-buffer": "~5.1.0"
|
||||||
}
|
}
|
||||||
@ -6700,8 +6779,7 @@
|
|||||||
"typedarray": {
|
"typedarray": {
|
||||||
"version": "0.0.6",
|
"version": "0.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
||||||
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
|
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"uglify-js": {
|
"uglify-js": {
|
||||||
"version": "2.8.29",
|
"version": "2.8.29",
|
||||||
@ -6933,8 +7011,7 @@
|
|||||||
"util-deprecate": {
|
"util-deprecate": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
|
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"utils-merge": {
|
"utils-merge": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
@ -7417,8 +7494,7 @@
|
|||||||
"xtend": {
|
"xtend": {
|
||||||
"version": "4.0.2",
|
"version": "4.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
|
||||||
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
|
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"y18n": {
|
"y18n": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
"express-session": "^1.17.0",
|
"express-session": "^1.17.0",
|
||||||
"method-override": "^3.0.0",
|
"method-override": "^3.0.0",
|
||||||
"mongodb": "^3.3.4",
|
"mongodb": "^3.3.4",
|
||||||
|
"multer": "^1.4.2",
|
||||||
"passport": "^0.4.0",
|
"passport": "^0.4.0",
|
||||||
"passport-local": "^1.0.0",
|
"passport-local": "^1.0.0",
|
||||||
"pug": "^2.0.4",
|
"pug": "^2.0.4",
|
||||||
|
|||||||
44
src/admin/components/categories.component.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import { Component } from "../core/component";
|
||||||
|
import { apiService } from "../services/api.service";
|
||||||
|
import { renderCategories } from "../templates/categories.template";
|
||||||
|
|
||||||
|
export class CategoriesComponent extends Component {
|
||||||
|
constructor(id) {
|
||||||
|
super(id);
|
||||||
|
if (this.$el) {
|
||||||
|
this.$editSelect = this.$el.querySelector('#edit select');
|
||||||
|
this.$deleteSelect = this.$el.querySelector('#delete select');
|
||||||
|
this.$addForm = this.$el.querySelector('#categoryAdd');
|
||||||
|
this.$deleteForm = this.$el.querySelector('#categoryDelete');
|
||||||
|
|
||||||
|
this.$addForm.addEventListener('submit', this.addCategory.bind(this));
|
||||||
|
this.$deleteForm.addEventListener('submit', this.deleteCategory.bind(this));
|
||||||
|
this.$editSelect.addEventListener('change', this.insertData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init() {
|
||||||
|
const categories = await apiService.getCategories();
|
||||||
|
const html = renderCategories(categories);
|
||||||
|
|
||||||
|
this.$editSelect.insertAdjacentHTML('beforeend', html);
|
||||||
|
this.$deleteSelect.insertAdjacentHTML('beforeend', html);
|
||||||
|
M.FormSelect.init(document.querySelectorAll('select')); // Инициализируем все селекты только после их рендера!
|
||||||
|
}
|
||||||
|
|
||||||
|
async addCategory(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const categories = await apiService.getCategories();
|
||||||
|
const title = this.$addForm.elements[0].value.toLowerCase().trim();
|
||||||
|
const index = categories.map((category) => {return category.title}).indexOf(title);
|
||||||
|
index != -1 ? alert('Такая категория уже существует, придумайте другое название.') : this.$addForm.submit();
|
||||||
|
}
|
||||||
|
|
||||||
|
async deleteCategory(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
const categories = await apiService.getCategories();
|
||||||
|
const title = this.$deleteForm.elements[0].value.toLowerCase().trim();
|
||||||
|
const index = categories.map((category) => {return category.title}).indexOf(title);
|
||||||
|
index != -1 ? this.$deleteForm.submit() : alert('Выберите категорию.');
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -29,7 +29,6 @@ export class MaterializeConfig {
|
|||||||
M.Sidenav.init(document.querySelectorAll('.sidenav'));
|
M.Sidenav.init(document.querySelectorAll('.sidenav'));
|
||||||
M.Collapsible.init(document.querySelectorAll('.collapsible'));
|
M.Collapsible.init(document.querySelectorAll('.collapsible'));
|
||||||
M.Modal.init(document.querySelectorAll('.modal'));
|
M.Modal.init(document.querySelectorAll('.modal'));
|
||||||
M.FormSelect.init(document.querySelectorAll('select'));
|
|
||||||
document.querySelector('#type') ? M.textareaAutoResize(document.querySelector('#type')) : false
|
document.querySelector('#type') ? M.textareaAutoResize(document.querySelector('#type')) : false
|
||||||
M.updateTextFields();
|
M.updateTextFields();
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
export class Component {
|
export class Component {
|
||||||
constructor(id) {
|
constructor(id) {
|
||||||
this.$el = document.getElementById(id);
|
this.$el = document.getElementById(id);
|
||||||
this.init();
|
this.$el ? this.init() : false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init() {}
|
init() {}
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
import { MaterializeConfig } from "./config/materialize.config.js";
|
import { MaterializeConfig } from "./config/materialize.config.js";
|
||||||
|
import { CategoriesComponent } from "./components/categories.component.js";
|
||||||
|
|
||||||
|
const categories = new CategoriesComponent('categories');
|
||||||
const materialize = new MaterializeConfig();
|
const materialize = new MaterializeConfig();
|
||||||
console.log('Control-Panel v1.0.0');
|
console.log('Control-Panel v1.0.0');
|
||||||
62
src/admin/services/api.service.js
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
const axios = require('axios');
|
||||||
|
const API_TOKEN = 'yYNfW8ynVO18L1TW5qIkILM1WtWgrVZz';
|
||||||
|
|
||||||
|
class ApiService {
|
||||||
|
constructor(baseUrl) {
|
||||||
|
this.url = baseUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCategory(category) {
|
||||||
|
try {
|
||||||
|
const request = `${this.url}api?token=${API_TOKEN}&category=${encodeURIComponent(category)}`;
|
||||||
|
return useRequest(request);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getCategories() {
|
||||||
|
try {
|
||||||
|
const request = `${this.url}api?token=${API_TOKEN}&categories=all`;
|
||||||
|
return useRequest(request);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getItems(sorting) {
|
||||||
|
try {
|
||||||
|
if (sorting) {
|
||||||
|
const request = `${this.url}api?token=${API_TOKEN}&items=all&sorting=${sorting}`;
|
||||||
|
return useRequest(request);
|
||||||
|
} else {
|
||||||
|
const request = `${this.url}api?token=${API_TOKEN}&items=all`;
|
||||||
|
return useRequest(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getItemsOne(category, sorting) {
|
||||||
|
try {
|
||||||
|
if (sorting) {
|
||||||
|
const request = `${this.url}api?token=${API_TOKEN}&items=all&category=${encodeURIComponent(category.toLowerCase())}&sorting=${sorting}`;
|
||||||
|
return useRequest(request);
|
||||||
|
} else {
|
||||||
|
const request = `${this.url}api?token=${API_TOKEN}&items=all&category=${encodeURIComponent(category.toLowerCase())}`;
|
||||||
|
return useRequest(request);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function useRequest(request) {
|
||||||
|
const response = await axios.get(request);
|
||||||
|
return await JSON.parse(response.request.response);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const apiService = new ApiService('http://localhost:3000/', API_TOKEN);
|
||||||
7
src/admin/templates/categories.template.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
export function renderCategories(categories) {
|
||||||
|
let html = '';
|
||||||
|
categories.forEach(category => {
|
||||||
|
html += `<option value='{"id": "${category._id}", "title": "${category.title}", "img": "${category.img}", "type": "${category.type}", "format": "${category.format}"}' data-icon="../img/service-icons/${category.img}">${category.title[0].toUpperCase() + category.title.slice(1)}</option>`;
|
||||||
|
});
|
||||||
|
return html;
|
||||||
|
}
|
||||||