diff --git a/config/routes/admin.js b/config/routes/admin.js index fe936c1..f2b5994 100644 --- a/config/routes/admin.js +++ b/config/routes/admin.js @@ -8,9 +8,10 @@ function checkNotAuthenticated(req, res, next) { next(); } -function loginRoute(req, res) { +async function loginRoute(req, res, db) { + const store = await db.collection('content').findOne({}); res.render('admin/admin', { - title: 'Digital-Store | Вход в панель управления сайтом' + title: `${store.title} | Вход в панель управления сайтом` }) } @@ -27,7 +28,7 @@ module.exports = function (server, db) { id => result.find(user => user.id === id) ); }); - loginRoute(req, res); + loginRoute(req, res, db); }); // Отдача страницы с регистрацией //server.get('/register', checkNotAuthenticated, (req, res) => registerRoute(req, res)); diff --git a/config/routes/control-panel.js b/config/routes/control-panel.js index 1be27d5..a7ae096 100644 --- a/config/routes/control-panel.js +++ b/config/routes/control-panel.js @@ -6,14 +6,17 @@ function checkAuthenticated(req, res, next) { res.redirect('/admin'); } -module.exports = function(server, db) { + + +module.exports = function (server, db) { // роуты - server.get('/control-panel', checkAuthenticated, (req, res) => { + server.get('/control-panel', checkAuthenticated, async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('admin/control-panel', { name: req.user.name, email: req.user.email, - title: 'Digital-Store | Панель управления сайтом', + title: `${store.title} | Панель управления сайтом`, host: req.headers.host, pageName: ['Главная', 'main'], }); @@ -24,11 +27,12 @@ module.exports = function(server, db) { server.get('/control-panel/items', checkAuthenticated, async (req, res) => { try { const items = await db.collection('items').find({}).toArray(); + const store = await db.collection('content').findOne({}); const count = items.length; res.render('admin/items', { name: req.user.name, email: req.user.email, - title: 'Digital-Store | Товары', + title: `${store.title} | Товары`, host: req.headers.host, pageName: ['Товары', 'items'], count: count / 2 @@ -40,10 +44,11 @@ module.exports = function(server, db) { server.get('/control-panel/categories', checkAuthenticated, async (req, res) => { try { const categories = await db.collection('categories').find({}).toArray(); + const store = await db.collection('content').findOne({}); res.render('admin/categories', { name: req.user.name, email: req.user.email, - title: 'Digital-Store | Категории', + title: `${store.title} | Категории`, host: req.headers.host, pageName: ['Категории', 'categories'], categoriesCount: categories.length @@ -54,10 +59,11 @@ module.exports = function(server, db) { }); server.get('/control-panel/icons', checkAuthenticated, async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('admin/icons', { name: req.user.name, email: req.user.email, - title: 'Digital-Store | Категории', + title: `${store.title} | Категории`, host: req.headers.host, pageName: ['Иконки', 'icons'] }); @@ -65,25 +71,30 @@ module.exports = function(server, db) { res.render('main/404'); } }); - server.get('/control-panel/content', checkAuthenticated, (req, res) => { + server.get('/control-panel/content', checkAuthenticated, async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('admin/content', { name: req.user.name, email: req.user.email, - title: 'Digital-Store | Контент', + title: `${store.title} | Контент`, host: req.headers.host, pageName: ['Контент', 'content'], + store: { + title: store.title + } }); } catch (error) { res.render('main/404'); } }); - server.get('/control-panel/administrators', checkAuthenticated, (req, res) => { + server.get('/control-panel/administrators', checkAuthenticated, async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('admin/administrators', { name: req.user.name, email: req.user.email, - title: 'Digital-Store | Администраторы', + title: `${store.title} | Администраторы`, host: req.headers.host, pageName: ['Администраторы', 'administrators'], }); @@ -91,12 +102,13 @@ module.exports = function(server, db) { res.render('main/404'); } }); - server.get('/control-panel/database', checkAuthenticated, (req, res) => { + server.get('/control-panel/database', checkAuthenticated, async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('admin/database', { name: req.user.name, email: req.user.email, - title: 'Digital-Store | Настройка Базы Данных', + title: `${store.title} | Настройка Базы Данных`, host: req.headers.host, pageName: ['База данных', 'database'], }); @@ -221,4 +233,17 @@ module.exports = function(server, db) { res.render('main/404'); } }); + + // контент + server.post('/control-panel/content/update', checkAuthenticated, (req, res) => { + try { + const data = { + title: req.body.title + } + db.collection('content').updateOne({}, {$set: {title: data.title}}); + res.redirect('/control-panel/content'); + } catch (error) { + res.render('main/404'); + } + }); } \ No newline at end of file diff --git a/config/routes/main.js b/config/routes/main.js index eb5f55a..e80d15b 100644 --- a/config/routes/main.js +++ b/config/routes/main.js @@ -1,61 +1,82 @@ const ObjectID = require('mongodb').ObjectID; module.exports = function (server, db) { - server.get('/', (req, res) => { + server.get('/', async (req, res) => { try { + const store = await db.collection('content').findOne({}); db.collection('categories').find().toArray((err, result) => { const categories = result.map(category => category.title[0].toUpperCase() + category.title.slice(1)); res.render('main/index', { pageName: 'index', - title: 'Digital-Store | Главная', - categories + title: `${store.title} | Главная`, + categories, + store: { + title: store.title + } }); }); } catch (error) { res.render('main/404'); } }); - server.get('/how-to-buy', (req, res) => { + server.get('/how-to-buy', async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('main/how-to-buy', { pageName: 'how-to-buy', - title: 'Digital-Store | Как купить товар' + title: `${store.title} | Как купить товар`, + store: { + title: store.title + } }); } catch (error) { res.send('main/404'); } }); - server.get('/contacts', (req, res) => { + server.get('/contacts', async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('main/contacts', { pageName: 'contacts', - title: 'Digital-Store | Контакты' + title: `${store.title} | Контакты`, + store: { + title: store.title + } }); } catch (error) { res.send('main/404'); } }); - server.get('/comments', (req, res) => { + server.get('/comments', async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('main/comments', { pageName: 'comments', - title: 'Digital-Store | Отзывы' + title: `${store.title} | Отзывы`, + store: { + title: store.title + } }); } catch (error) { res.render('main/404'); } }); - server.get('/my-orders', (req, res) => { + server.get('/my-orders', async (req, res) => { try { + const store = await db.collection('content').findOne({}); res.render('main/my-orders', { pageName: 'my-orders', - title: 'Digital-Store | Мои покупки' + title: `${store.title} | Мои покупки`, + store: { + title: store.title + } }); } catch (error) { res.render('main/404'); } }); - server.get('/product/:id', (req, res) => { + server.get('/product/:id', async (req, res) => { + const store = await db.collection('content').findOne({}); const product = new Promise((resolve, reject) => { db.collection('items').find({_id: ObjectID(req.params.id)}).toArray() .then((items) => { @@ -86,7 +107,10 @@ module.exports = function (server, db) { date: item.date, id: item._id, type: category.type, - format: category.format + format: category.format, + store: { + title: store.title + } }); })) .catch((error) => { diff --git a/config/server.js b/config/server.js index 310e6e2..8d6a558 100644 --- a/config/server.js +++ b/config/server.js @@ -37,7 +37,7 @@ MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: t server.use(methodOverride('_method')); server.set('view engine', 'pug'); server.set('views', path.join(__dirname, '../dist/views')); - + // Routes require('./routes/main')(server, db); // маршруты сайта require('./routes/admin')(server, db); // маршрут с формой авторизации админа diff --git a/dist/views/admin/categories.pug b/dist/views/admin/categories.pug index 30c3bf1..a47354c 100644 --- a/dist/views/admin/categories.pug +++ b/dist/views/admin/categories.pug @@ -47,9 +47,9 @@ body.has-fixed-sidenav label Редактирование категории .category-delete .row - form(id="dellCategory" action="/control-panel/categories/delete" method="POST") + form(id="deleteCategory" action="/control-panel/categories/delete" method="POST") .input-field.col.s12 - select#delete_select(name="category") + select#deleteCategory_select(name="category") option(value="" disabled selected) | Выберите категорию для удаления label Удаление категории diff --git a/dist/views/admin/content.pug b/dist/views/admin/content.pug index f46c207..6d2f978 100644 --- a/dist/views/admin/content.pug +++ b/dist/views/admin/content.pug @@ -5,7 +5,21 @@ body.has-fixed-sidenav .container .row .col.s12 - h2 Редактирование контента + h2 Редактирование контента + p Изменяйте текст на сайте магазина только через эту страницу. + .col.s12 + #content.card + .card-content + .content-update + h5 Редактировать контент + .row + form(action="/control-panel/content/update" method="POST") + .input-field.col.s12 + input(id="title" type="text" name="title" value=store.title) + label(for="title") Название вашего магазина + .edit_success.col.s12 + button(type="submit" class="btn waves-effect") Сохранить + include ./assets/templates/footer.pug include ./assets/scripts.pug \ No newline at end of file diff --git a/dist/views/admin/icons.pug b/dist/views/admin/icons.pug index f464ea5..8981517 100644 --- a/dist/views/admin/icons.pug +++ b/dist/views/admin/icons.pug @@ -6,6 +6,7 @@ body.has-fixed-sidenav .row .col.s12 h2 Редактирование иконок + p Загрузите иконку для нужной вам категории. .col.s12 #icons.card .card-content diff --git a/dist/views/admin/items.pug b/dist/views/admin/items.pug index b2983d8..c2f227c 100644 --- a/dist/views/admin/items.pug +++ b/dist/views/admin/items.pug @@ -6,7 +6,7 @@ body.has-fixed-sidenav .row .col.s12 h2 Редактирование товаров - p Добавляйте новые товары или редактируйте старные. + p Добавляйте новые товары или редактируйте старые. .col.s12 #items.card .card-content diff --git a/dist/views/main/404.pug b/dist/views/main/404.pug index c2c2c94..ed657fc 100644 --- a/dist/views/main/404.pug +++ b/dist/views/main/404.pug @@ -1,14 +1,9 @@ //- Head HTML include ./assets/head.pug -//- Header Template -include ./assets/templates/header.pug main.main-section - include ./assets/templates/modals/cart.pug .container .row .col.s12 - h1(style="margin-top: 5rem;font-size:70px;") Ошибка 404. - -//- Footer Template -include ./assets/templates/footer.pug \ No newline at end of file + h1(style="margin-top: 2rem;font-size:70px;margin-bottom:2rem;") Ошибка 404. + a(href="/") Вернуться на главную. \ No newline at end of file diff --git a/dist/views/main/assets/templates/footer.pug b/dist/views/main/assets/templates/footer.pug index f44b3bf..593edc1 100644 --- a/dist/views/main/assets/templates/footer.pug +++ b/dist/views/main/assets/templates/footer.pug @@ -1,5 +1,5 @@ footer.main-footer - span © 2019 Digital Store | Все права защищены. + span © 2019 #{store.title} | Все права защищены. .waves-effect.waves-light.pulse.cart-btn(id="cartOpen") i.material-icons shopping_cart span#counter.counter 0 diff --git a/dist/views/main/assets/templates/header.pug b/dist/views/main/assets/templates/header.pug index e8affef..5911714 100644 --- a/dist/views/main/assets/templates/header.pug +++ b/dist/views/main/assets/templates/header.pug @@ -7,7 +7,7 @@ header#header.main-header .nav-wrapper.container a.brand-logo.waves-effect.waves-light(href='/') i.material-icons shop_two - span#header-title Digital Store + span#header-title #{store.title} ul#desktop-nav.right.hide-on-med-and-down(data-current=currentPage) li#page(data-page='index') a(href='/') Главная diff --git a/src/admin/components/categories.component.js b/src/admin/components/categories.component.js index 62d1ccc..14cd401 100644 --- a/src/admin/components/categories.component.js +++ b/src/admin/components/categories.component.js @@ -11,12 +11,12 @@ export class CategoriesComponent extends Component { setElems() { // селекты в которых рендерится контент this.$editSelect = this.$el.querySelector('#editCategory_select'); // редактирование категории - this.$dellSelect = this.$el.querySelector('#delete_select'); // удаление категории + this.$dellSelect = this.$el.querySelector('#deleteCategory_select'); // удаление категории this.$iconsSelect = this.$el.querySelector('#icons_select'); // выбор иконки // обработка форм - this.$addForm = this.$el.querySelector('#addCategory'); // добавление категории - this.$dellForm = this.$el.querySelector('#dellCategory'); // удаление категории + this.$addForm = this.$el.querySelector('#addCategory'); + this.$dellForm = this.$el.querySelector('#deleteCategory'); // добавим ивенты на наши формы this.$addForm.addEventListener('submit', this.addCategory.bind(this)); diff --git a/src/admin/components/content.component.js b/src/admin/components/content.component.js new file mode 100644 index 0000000..8fcecc2 --- /dev/null +++ b/src/admin/components/content.component.js @@ -0,0 +1,7 @@ +import { Component } from '../core/component'; + +export class ContentComponent extends Component { + constructor(id) { + super(id); + } +} \ No newline at end of file diff --git a/src/admin/components/icons.component.js b/src/admin/components/icons.component.js index 1eaefd8..be8e7b0 100644 --- a/src/admin/components/icons.component.js +++ b/src/admin/components/icons.component.js @@ -15,7 +15,6 @@ export class IconsComponent extends Component { async init() { const icons = await apiService.getIcons(); - this.$icons.insertAdjacentHTML('beforeend', renderIcons(icons)); M.FormSelect.init(this.$icons); }