mirror of
https://github.com/sergeyyarkov/digital-store.git
synced 2026-10-11 18:29:11 +03:00
добавлена возможноть изменять название магазина через CP
This commit is contained in:
parent
ddd261081f
commit
a0b17bc5e1
@ -8,9 +8,10 @@ function checkNotAuthenticated(req, res, next) {
|
|||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
|
||||||
function loginRoute(req, res) {
|
async function loginRoute(req, res, db) {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('admin/admin', {
|
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)
|
id => result.find(user => user.id === id)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
loginRoute(req, res);
|
loginRoute(req, res, db);
|
||||||
});
|
});
|
||||||
// Отдача страницы с регистрацией
|
// Отдача страницы с регистрацией
|
||||||
//server.get('/register', checkNotAuthenticated, (req, res) => registerRoute(req, res));
|
//server.get('/register', checkNotAuthenticated, (req, res) => registerRoute(req, res));
|
||||||
|
|||||||
@ -6,14 +6,17 @@ function checkAuthenticated(req, res, next) {
|
|||||||
res.redirect('/admin');
|
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 {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('admin/control-panel', {
|
res.render('admin/control-panel', {
|
||||||
name: req.user.name,
|
name: req.user.name,
|
||||||
email: req.user.email,
|
email: req.user.email,
|
||||||
title: 'Digital-Store | Панель управления сайтом',
|
title: `${store.title} | Панель управления сайтом`,
|
||||||
host: req.headers.host,
|
host: req.headers.host,
|
||||||
pageName: ['Главная', 'main'],
|
pageName: ['Главная', 'main'],
|
||||||
});
|
});
|
||||||
@ -24,11 +27,12 @@ module.exports = function(server, db) {
|
|||||||
server.get('/control-panel/items', checkAuthenticated, async (req, res) => {
|
server.get('/control-panel/items', checkAuthenticated, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const items = await db.collection('items').find({}).toArray();
|
const items = await db.collection('items').find({}).toArray();
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
const count = items.length;
|
const count = items.length;
|
||||||
res.render('admin/items', {
|
res.render('admin/items', {
|
||||||
name: req.user.name,
|
name: req.user.name,
|
||||||
email: req.user.email,
|
email: req.user.email,
|
||||||
title: 'Digital-Store | Товары',
|
title: `${store.title} | Товары`,
|
||||||
host: req.headers.host,
|
host: req.headers.host,
|
||||||
pageName: ['Товары', 'items'],
|
pageName: ['Товары', 'items'],
|
||||||
count: count / 2
|
count: count / 2
|
||||||
@ -40,10 +44,11 @@ module.exports = function(server, db) {
|
|||||||
server.get('/control-panel/categories', checkAuthenticated, async (req, res) => {
|
server.get('/control-panel/categories', checkAuthenticated, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const categories = await db.collection('categories').find({}).toArray();
|
const categories = await db.collection('categories').find({}).toArray();
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('admin/categories', {
|
res.render('admin/categories', {
|
||||||
name: req.user.name,
|
name: req.user.name,
|
||||||
email: req.user.email,
|
email: req.user.email,
|
||||||
title: 'Digital-Store | Категории',
|
title: `${store.title} | Категории`,
|
||||||
host: req.headers.host,
|
host: req.headers.host,
|
||||||
pageName: ['Категории', 'categories'],
|
pageName: ['Категории', 'categories'],
|
||||||
categoriesCount: categories.length
|
categoriesCount: categories.length
|
||||||
@ -54,10 +59,11 @@ module.exports = function(server, db) {
|
|||||||
});
|
});
|
||||||
server.get('/control-panel/icons', checkAuthenticated, async (req, res) => {
|
server.get('/control-panel/icons', checkAuthenticated, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('admin/icons', {
|
res.render('admin/icons', {
|
||||||
name: req.user.name,
|
name: req.user.name,
|
||||||
email: req.user.email,
|
email: req.user.email,
|
||||||
title: 'Digital-Store | Категории',
|
title: `${store.title} | Категории`,
|
||||||
host: req.headers.host,
|
host: req.headers.host,
|
||||||
pageName: ['Иконки', 'icons']
|
pageName: ['Иконки', 'icons']
|
||||||
});
|
});
|
||||||
@ -65,25 +71,30 @@ module.exports = function(server, db) {
|
|||||||
res.render('main/404');
|
res.render('main/404');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
server.get('/control-panel/content', checkAuthenticated, (req, res) => {
|
server.get('/control-panel/content', checkAuthenticated, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('admin/content', {
|
res.render('admin/content', {
|
||||||
name: req.user.name,
|
name: req.user.name,
|
||||||
email: req.user.email,
|
email: req.user.email,
|
||||||
title: 'Digital-Store | Контент',
|
title: `${store.title} | Контент`,
|
||||||
host: req.headers.host,
|
host: req.headers.host,
|
||||||
pageName: ['Контент', 'content'],
|
pageName: ['Контент', 'content'],
|
||||||
|
store: {
|
||||||
|
title: store.title
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.render('main/404');
|
res.render('main/404');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
server.get('/control-panel/administrators', checkAuthenticated, (req, res) => {
|
server.get('/control-panel/administrators', checkAuthenticated, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('admin/administrators', {
|
res.render('admin/administrators', {
|
||||||
name: req.user.name,
|
name: req.user.name,
|
||||||
email: req.user.email,
|
email: req.user.email,
|
||||||
title: 'Digital-Store | Администраторы',
|
title: `${store.title} | Администраторы`,
|
||||||
host: req.headers.host,
|
host: req.headers.host,
|
||||||
pageName: ['Администраторы', 'administrators'],
|
pageName: ['Администраторы', 'administrators'],
|
||||||
});
|
});
|
||||||
@ -91,12 +102,13 @@ module.exports = function(server, db) {
|
|||||||
res.render('main/404');
|
res.render('main/404');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
server.get('/control-panel/database', checkAuthenticated, (req, res) => {
|
server.get('/control-panel/database', checkAuthenticated, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('admin/database', {
|
res.render('admin/database', {
|
||||||
name: req.user.name,
|
name: req.user.name,
|
||||||
email: req.user.email,
|
email: req.user.email,
|
||||||
title: 'Digital-Store | Настройка Базы Данных',
|
title: `${store.title} | Настройка Базы Данных`,
|
||||||
host: req.headers.host,
|
host: req.headers.host,
|
||||||
pageName: ['База данных', 'database'],
|
pageName: ['База данных', 'database'],
|
||||||
});
|
});
|
||||||
@ -221,4 +233,17 @@ module.exports = function(server, db) {
|
|||||||
res.render('main/404');
|
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');
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
@ -1,61 +1,82 @@
|
|||||||
const ObjectID = require('mongodb').ObjectID;
|
const ObjectID = require('mongodb').ObjectID;
|
||||||
|
|
||||||
module.exports = function (server, db) {
|
module.exports = function (server, db) {
|
||||||
server.get('/', (req, res) => {
|
server.get('/', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
db.collection('categories').find().toArray((err, result) => {
|
db.collection('categories').find().toArray((err, result) => {
|
||||||
const categories = result.map(category => category.title[0].toUpperCase() + category.title.slice(1));
|
const categories = result.map(category => category.title[0].toUpperCase() + category.title.slice(1));
|
||||||
res.render('main/index', {
|
res.render('main/index', {
|
||||||
pageName: 'index',
|
pageName: 'index',
|
||||||
title: 'Digital-Store | Главная',
|
title: `${store.title} | Главная`,
|
||||||
categories
|
categories,
|
||||||
|
store: {
|
||||||
|
title: store.title
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.render('main/404');
|
res.render('main/404');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
server.get('/how-to-buy', (req, res) => {
|
server.get('/how-to-buy', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('main/how-to-buy', {
|
res.render('main/how-to-buy', {
|
||||||
pageName: 'how-to-buy',
|
pageName: 'how-to-buy',
|
||||||
title: 'Digital-Store | Как купить товар'
|
title: `${store.title} | Как купить товар`,
|
||||||
|
store: {
|
||||||
|
title: store.title
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.send('main/404');
|
res.send('main/404');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
server.get('/contacts', (req, res) => {
|
server.get('/contacts', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('main/contacts', {
|
res.render('main/contacts', {
|
||||||
pageName: 'contacts',
|
pageName: 'contacts',
|
||||||
title: 'Digital-Store | Контакты'
|
title: `${store.title} | Контакты`,
|
||||||
|
store: {
|
||||||
|
title: store.title
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.send('main/404');
|
res.send('main/404');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
server.get('/comments', (req, res) => {
|
server.get('/comments', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('main/comments', {
|
res.render('main/comments', {
|
||||||
pageName: 'comments',
|
pageName: 'comments',
|
||||||
title: 'Digital-Store | Отзывы'
|
title: `${store.title} | Отзывы`,
|
||||||
|
store: {
|
||||||
|
title: store.title
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.render('main/404');
|
res.render('main/404');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
server.get('/my-orders', (req, res) => {
|
server.get('/my-orders', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const store = await db.collection('content').findOne({});
|
||||||
res.render('main/my-orders', {
|
res.render('main/my-orders', {
|
||||||
pageName: 'my-orders',
|
pageName: 'my-orders',
|
||||||
title: 'Digital-Store | Мои покупки'
|
title: `${store.title} | Мои покупки`,
|
||||||
|
store: {
|
||||||
|
title: store.title
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.render('main/404');
|
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) => {
|
const product = new Promise((resolve, reject) => {
|
||||||
db.collection('items').find({_id: ObjectID(req.params.id)}).toArray()
|
db.collection('items').find({_id: ObjectID(req.params.id)}).toArray()
|
||||||
.then((items) => {
|
.then((items) => {
|
||||||
@ -86,7 +107,10 @@ module.exports = function (server, db) {
|
|||||||
date: item.date,
|
date: item.date,
|
||||||
id: item._id,
|
id: item._id,
|
||||||
type: category.type,
|
type: category.type,
|
||||||
format: category.format
|
format: category.format,
|
||||||
|
store: {
|
||||||
|
title: store.title
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}))
|
}))
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
|||||||
@ -37,7 +37,7 @@ MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: t
|
|||||||
server.use(methodOverride('_method'));
|
server.use(methodOverride('_method'));
|
||||||
server.set('view engine', 'pug');
|
server.set('view engine', 'pug');
|
||||||
server.set('views', path.join(__dirname, '../dist/views'));
|
server.set('views', path.join(__dirname, '../dist/views'));
|
||||||
|
|
||||||
// Routes
|
// Routes
|
||||||
require('./routes/main')(server, db); // маршруты сайта
|
require('./routes/main')(server, db); // маршруты сайта
|
||||||
require('./routes/admin')(server, db); // маршрут с формой авторизации админа
|
require('./routes/admin')(server, db); // маршрут с формой авторизации админа
|
||||||
|
|||||||
4
dist/views/admin/categories.pug
vendored
4
dist/views/admin/categories.pug
vendored
@ -47,9 +47,9 @@ body.has-fixed-sidenav
|
|||||||
label Редактирование категории
|
label Редактирование категории
|
||||||
.category-delete
|
.category-delete
|
||||||
.row
|
.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
|
.input-field.col.s12
|
||||||
select#delete_select(name="category")
|
select#deleteCategory_select(name="category")
|
||||||
option(value="" disabled selected)
|
option(value="" disabled selected)
|
||||||
| Выберите категорию для удаления
|
| Выберите категорию для удаления
|
||||||
label Удаление категории
|
label Удаление категории
|
||||||
|
|||||||
16
dist/views/admin/content.pug
vendored
16
dist/views/admin/content.pug
vendored
@ -5,7 +5,21 @@ body.has-fixed-sidenav
|
|||||||
.container
|
.container
|
||||||
.row
|
.row
|
||||||
.col.s12
|
.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/templates/footer.pug
|
||||||
include ./assets/scripts.pug
|
include ./assets/scripts.pug
|
||||||
1
dist/views/admin/icons.pug
vendored
1
dist/views/admin/icons.pug
vendored
@ -6,6 +6,7 @@ body.has-fixed-sidenav
|
|||||||
.row
|
.row
|
||||||
.col.s12
|
.col.s12
|
||||||
h2 Редактирование иконок
|
h2 Редактирование иконок
|
||||||
|
p Загрузите иконку для нужной вам категории.
|
||||||
.col.s12
|
.col.s12
|
||||||
#icons.card
|
#icons.card
|
||||||
.card-content
|
.card-content
|
||||||
|
|||||||
2
dist/views/admin/items.pug
vendored
2
dist/views/admin/items.pug
vendored
@ -6,7 +6,7 @@ body.has-fixed-sidenav
|
|||||||
.row
|
.row
|
||||||
.col.s12
|
.col.s12
|
||||||
h2 Редактирование товаров
|
h2 Редактирование товаров
|
||||||
p Добавляйте новые товары или редактируйте старные.
|
p Добавляйте новые товары или редактируйте старые.
|
||||||
.col.s12
|
.col.s12
|
||||||
#items.card
|
#items.card
|
||||||
.card-content
|
.card-content
|
||||||
|
|||||||
9
dist/views/main/404.pug
vendored
9
dist/views/main/404.pug
vendored
@ -1,14 +1,9 @@
|
|||||||
//- Head HTML
|
//- Head HTML
|
||||||
include ./assets/head.pug
|
include ./assets/head.pug
|
||||||
//- Header Template
|
|
||||||
include ./assets/templates/header.pug
|
|
||||||
|
|
||||||
main.main-section
|
main.main-section
|
||||||
include ./assets/templates/modals/cart.pug
|
|
||||||
.container
|
.container
|
||||||
.row
|
.row
|
||||||
.col.s12
|
.col.s12
|
||||||
h1(style="margin-top: 5rem;font-size:70px;") Ошибка 404.
|
h1(style="margin-top: 2rem;font-size:70px;margin-bottom:2rem;") Ошибка 404.
|
||||||
|
a(href="/") Вернуться на главную.
|
||||||
//- Footer Template
|
|
||||||
include ./assets/templates/footer.pug
|
|
||||||
2
dist/views/main/assets/templates/footer.pug
vendored
2
dist/views/main/assets/templates/footer.pug
vendored
@ -1,5 +1,5 @@
|
|||||||
footer.main-footer
|
footer.main-footer
|
||||||
span © 2019 Digital Store | Все права защищены.
|
span © 2019 #{store.title} | Все права защищены.
|
||||||
.waves-effect.waves-light.pulse.cart-btn(id="cartOpen")
|
.waves-effect.waves-light.pulse.cart-btn(id="cartOpen")
|
||||||
i.material-icons shopping_cart
|
i.material-icons shopping_cart
|
||||||
span#counter.counter 0
|
span#counter.counter 0
|
||||||
|
|||||||
2
dist/views/main/assets/templates/header.pug
vendored
2
dist/views/main/assets/templates/header.pug
vendored
@ -7,7 +7,7 @@ header#header.main-header
|
|||||||
.nav-wrapper.container
|
.nav-wrapper.container
|
||||||
a.brand-logo.waves-effect.waves-light(href='/')
|
a.brand-logo.waves-effect.waves-light(href='/')
|
||||||
i.material-icons shop_two
|
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)
|
ul#desktop-nav.right.hide-on-med-and-down(data-current=currentPage)
|
||||||
li#page(data-page='index')
|
li#page(data-page='index')
|
||||||
a(href='/') Главная
|
a(href='/') Главная
|
||||||
|
|||||||
@ -11,12 +11,12 @@ export class CategoriesComponent extends Component {
|
|||||||
setElems() {
|
setElems() {
|
||||||
// селекты в которых рендерится контент
|
// селекты в которых рендерится контент
|
||||||
this.$editSelect = this.$el.querySelector('#editCategory_select'); // редактирование категории
|
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.$iconsSelect = this.$el.querySelector('#icons_select'); // выбор иконки
|
||||||
|
|
||||||
// обработка форм
|
// обработка форм
|
||||||
this.$addForm = this.$el.querySelector('#addCategory'); // добавление категории
|
this.$addForm = this.$el.querySelector('#addCategory');
|
||||||
this.$dellForm = this.$el.querySelector('#dellCategory'); // удаление категории
|
this.$dellForm = this.$el.querySelector('#deleteCategory');
|
||||||
|
|
||||||
// добавим ивенты на наши формы
|
// добавим ивенты на наши формы
|
||||||
this.$addForm.addEventListener('submit', this.addCategory.bind(this));
|
this.$addForm.addEventListener('submit', this.addCategory.bind(this));
|
||||||
|
|||||||
7
src/admin/components/content.component.js
Normal file
7
src/admin/components/content.component.js
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import { Component } from '../core/component';
|
||||||
|
|
||||||
|
export class ContentComponent extends Component {
|
||||||
|
constructor(id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -15,7 +15,6 @@ export class IconsComponent extends Component {
|
|||||||
|
|
||||||
async init() {
|
async init() {
|
||||||
const icons = await apiService.getIcons();
|
const icons = await apiService.getIcons();
|
||||||
|
|
||||||
this.$icons.insertAdjacentHTML('beforeend', renderIcons(icons));
|
this.$icons.insertAdjacentHTML('beforeend', renderIcons(icons));
|
||||||
M.FormSelect.init(this.$icons);
|
M.FormSelect.init(this.$icons);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user