readme & session secret

This commit is contained in:
Sergey Yarkov 2020-01-25 16:36:02 +03:00
parent 21833480c8
commit 618f044976
4 changed files with 182 additions and 61 deletions

167
README.md
View File

@ -22,6 +22,9 @@
<a href="https://david-dm.org/sergeyyarkov/digital-store#info=devDependencies"> <a href="https://david-dm.org/sergeyyarkov/digital-store#info=devDependencies">
<img src="https://david-dm.org/sergeyyarkov/digital-store/dev-status.svg" alt="devDependency Status badge"> <img src="https://david-dm.org/sergeyyarkov/digital-store/dev-status.svg" alt="devDependency Status badge">
</a> </a>
<a href="https://github.com/sergeyyarkov/digital-store/blob/master/LICENSE">
<img alt="GitHub" src="https://img.shields.io/github/license/sergeyyarkov/digital-store">
</a>
</p> </p>
## Содержание ## Содержание
@ -37,7 +40,7 @@
## О проекте: ## О проекте:
Этот проект представляет из себя интернет-магазин на платформе NodeJS, вы можете продавать свои цифровые товары именно скачав этот репозиторий, в [панели управления](#Панель-управления) вы сможете создавать, удалять и редактировать товары или категории . В проекте используется концепция REST API, поэтому для отдачи информации клиенту существует отдельный API. Информация о покупателях, товарах, категориях и т.д хранится в БД MongoDB (используется нативный драйвер). Этот проект представляет из себя интернет-магазин на платформе NodeJS, вы можете продавать свои цифровые товары именно скачав этот репозиторий, в [панели управления](#Панель-управления) вы сможете создавать, удалять и редактировать товары или категории . В проекте используется концепция REST API, поэтому для отдачи информации клиенту существует отдельный API. Информация о покупателях, товарах, категориях и т.д хранится в БД MongoDB (используется нативный драйвер).
### Функционал пользователя: ### Функционал покупателя:
- Возможность выбирать интересующие категории, переход по одиночным страницам конкретного товара. - Возможность выбирать интересующие категории, переход по одиночным страницам конкретного товара.
- Возможность комментировать как отдельный товар, так и весь магазин на отдельной странице через виджет [Commento.io](https://commento.io/) - Возможность комментировать как отдельный товар, так и весь магазин на отдельной странице через виджет [Commento.io](https://commento.io/)
- Возможность фильтровать интересующую категорию или все товары через фильтр. - Возможность фильтровать интересующую категорию или все товары через фильтр.
@ -46,7 +49,7 @@
- Результатом оплаты будут данные одного или нескольких товаров, все данные отсылаются на почту покупателя, которую он указывал при создании заказа. - Результатом оплаты будут данные одного или нескольких товаров, все данные отсылаются на почту покупателя, которую он указывал при создании заказа.
- Покупатель может узнать все свои совершенные покупки в магазине на отдельной странице. - Покупатель может узнать все свои совершенные покупки в магазине на отдельной странице.
### Функционал администратора: ### Функционал администратора:
Для входа в админ-панель необходимо дописать в адресной строке `/admin`, после вы попадете на страницу авторизации где необходимо вписать данные `email:password`. По умолчанию `admin@support.ru:admin` Для входа в админ-панель необходимо дописать в адресной строке `/admin`, после вы попадете на страницу авторизации где нужно вписать данные `email:password`. По умолчанию `admin@support.ru:admin`
- Пароль админа хэшируется через `bcrypt` для безопасности и записывается в БД. - Пароль админа хэшируется через `bcrypt` для безопасности и записывается в БД.
- На главной странице есть небольшая статистика, где можно посмотреть: сумму проданных товаров, кол-во проданных товаров, кол-во товаров в наличии. - На главной странице есть небольшая статистика, где можно посмотреть: сумму проданных товаров, кол-во проданных товаров, кол-во товаров в наличии.
- На главной странце так же можно узнать подробные данные о покупателях: номер заказа, почта покупателя, способ оплаты, дата покупки, сумма и данные которые были высланы по почте. - На главной странце так же можно узнать подробные данные о покупателях: номер заказа, почта покупателя, способ оплаты, дата покупки, сумма и данные которые были высланы по почте.
@ -66,27 +69,36 @@
- Или клонировать репозиторий `git clone https://github.com/sergeyyarkov/digital-store.git -b production`. - Или клонировать репозиторий `git clone https://github.com/sergeyyarkov/digital-store.git -b production`.
- Установите [Node.js](https://nodejs.org/ru/) не ниже версии 7.6.0, в процессе установки Node.js установите Node Package Manager. - Установите [Node.js](https://nodejs.org/ru/) не ниже версии 7.6.0, в процессе установки Node.js установите Node Package Manager.
- Для работоспособности интернет-магазина необходимо установить зависимости. Выполните комманду `npm install`. - Для работоспособности интернет-магазина необходимо установить зависимости. Выполните комманду `npm install`.
- Далле необходимо настроить переменные среды. Создайте файл `.env` в корне вашего интернет - магазина и запишите туда [значения для переменных](#Переменные-среды). Обратите внимание, что для выгрузки скрипта на production сервер, нужно устанавливать переменные среды для вашего сервера, файл `.env` создавать не нужно. - Далле необходимо настроить переменные среды. Создайте файл `.env` в корне вашего интернет-магазина и запишите туда [значения для переменных](#Переменные-среды). Обратите внимание, что для выгрузки скрипта на production сервер, нужно устанавливать переменные среды для вашего сервера, файл `.env` создавать не нужно.
- После этого, введите `npm run start` и перейдите по адресу `localhost:3000`, вы увидите уже рабочий интернет магазин который работает у вас на локальном компьютере. - После этого, введите `npm run start` и перейдите по адресу `localhost:3000`, вы увидите уже рабочий интернет-магазин который работает у вас на локальном компьютере.
### Запуск скрипта на удаленном сервере: ### Запуск скрипта на удаленном сервере:
В данном примере на удаленном сервере будет использоваться связка ``Ubuntu 18.04, Nginx, MongoDB, PM2, NodeJS.`` В данном примере на удаленном сервере будет использоваться связка ``Ubuntu 18.04, Nginx, MongoDB, PM2, NodeJS.``
- ... - ...
## Переменные среды: ## Переменные среды:
Перменные среды нужны для работоспособности всего приложения, очень важно вписать верные данные для избежания возможных ошибок.
### Описание переменных: ### Описание переменных:
| Переменная | Описание |
| --------------- | -------------------------------------------------------- |
| DATABASE_URI | Подключение к БД MongoDB |
| DATABASE_NAME | Имя БД |
| EMAIL_LOGIN | Логин от почты для отправки данных покупателю |
| EMAIL_PASSWORD | Пароль от почты |
| QIWI_SECRET_KEY | Секретный ключ QIWI для работоспособности системы оплаты |
`.env` файл:
```bash ```bash
SESSION_SECRET=случайная сгенерированная строка DATABASE_URI=
DATABASE_URI=подключение к БД MONGODB DATABASE_NAME=
DATABASE_NAME=имя БД QIWI_SECRET_KEY=
QIWI_SECRET_KEY=секретный ключ QIWI API EMAIL_LOGIN=
EMAIL_LOGIN=логин от почты EMAIL_PASSWORD=
EMAIL_PASSWORD=пароль от почты
``` ```
## API: ## API:
### API предствляет собой ряд URL, которые в качестве ответа возвращают только данные в формате JSON. ### API представляет из себя различные URL, которые отвечают данными только в формате JSON. Здесь описаны основные `GET` запросы на сервер для получения данных:
#### Для просмотра всех товаров которые существуют в магазине отправляется GET запрос: #### Для просмотра всех товаров которые существуют в магазине отправляется запрос:
```bash ```bash
https://store-name.com/api/items https://store-name.com/api/items
``` ```
@ -99,42 +111,145 @@ https://store-name.com/api/items
count: 0, count: 0,
price: 1, price: 1,
category: "steam", category: "steam",
description: "Тестовый товар №1 описание", description: "-",
date: "2020-01-08T13:40:20.353Z" date: "2020-01-08T13:40:20.353Z"
}, },
{ {
_id: "5e15dcb4138c3339bcbc3719", _id: "5e15dcb4138c3339bcbc3719",
title: "Тестовый товар №3", title: "Тестовый товар №2",
count: 0, count: 0,
price: 1, price: 1,
category: "uplay", category: "uplay",
description: "Тестовый товар №3 fdsfd", description: "-",
date: "2020-01-08T13:44:20.940Z" date: "2020-01-08T13:44:20.940Z"
}, },
]
```
### Для просмотра товаров в интересующей категории отправляется запрос:
```bash
https://store-name.com/api/items/{category}
```
Ответ:
```bash
[
{ {
_id: "5e175c63b479600ac493ce88", _id: "5e15dbc415303a1980cd77a0",
title: "Тестовый товар №4", title: "Тестовый товар №1",
count: 0, count: 0,
price: 1, price: 1,
category: "fortnite", category: "steam",
description: "Тестовый товар №4 opis", description: "-",
date: "2020-01-09T17:01:23.446Z" date: "2020-01-08T13:40:20.353Z"
}, },
{ {
_id: "5e1ccf30d5b894228c86385a", _id: "5e1ccf30d5b894228c86385a",
title: "Тестовый товар №5", title: "Тестовый товар №2",
count: 10, count: 10,
price: 1, price: 1,
category: "origin", category: "steam",
description: "sdsdsds", description: "-",
date: "2020-01-13T20:12:32.814Z" date: "2020-01-13T20:12:32.814Z"
} }
] ]
```
### Для просмотра информации о всех категориях отправляется запрос:
```bash
https://store-name.com/api/categories
```
Ответ:
```bash
[
{
_id: "5df64563309e691f2c33d400",
title: "uplay",
img: "img-1576349954743.svg",
type: "type",
format: "format"
},
{
_id: "5e04ea023625771abc75fd14",
title: "fortnite",
img: "img-1576349989720.svg",
type: "type",
format: "format"
},
]
```
### Для просмотра информации о интересующей категории отправляется запрос:
```bash
https://store-name.com/api/category/{category}
```
Ответ:
```bash
[
{
_id: "5df64563309e691f2c33d400",
title: "uplay",
img: "img-1576349954743.svg",
type: "type",
format: "format"
}
]
```
### Для просмотра данных всех товаров отправляется запрос: `Нужна авторизация для адмимистатора.`
```bash
https://store-name.com/api/items/data
```
Ответ:
```bash
[
{
_id: "5e15dbc415303a1980cd77a0",
title: "Тестовый товар №1",
data: ["login:pass", "login:pass", "login:pass"]
},
{
_id: "5e175c63b479600ac493ce88",
title: "Тестовый товар №2",
data: ["login:pass", "login:pass", "login:pass"]
}
]
```
### Для просмотра покупателей отправляется запрос: `Нужна авторизация для адмимистатора.`
```bash
https://store-name.com/api/buyers
```
Ответ:
```bash
[
{
_id: "5e1c97701b619a31f010062c",
bill_id: "9244e5ae-560a-432a-9882-bc1b941c8cca",
email: "test-email@mail.com",
method: "qiwi",
date: "2020-01-13T18:13:38.623+03:00",
amount: 2,
data: ["login:pass", "login:pass"]
}
]
```
### Для просмотра списка иконок отправляется запрос: `Нужна авторизация для адмимистатора.`
```bash
https://store-name.com/api/icons
```
Ответ:
```bash
[
"img-1576349954743.svg",
"img-1576349989720.svg",
"img-1576420937629.svg",
"img-1576421960189.svg"
]
``` ```
...
## Требования: ## Требования:
- Node.js v7.6.0 или выше - Node.js v7.6.0 или выше
## Лицензия: ## Лицензия:
[MIT](https://github.com/sergeyyarkov/digital-store/blob/master/LICENSE) [MIT](https://github.com/sergeyyarkov/digital-store/blob/master/LICENSE)<br><br>

View File

@ -11,7 +11,6 @@ const path = require('path');
const passport = require('passport'); 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 MongoStore = require('connect-mongo')(session);
const methodOverride = require('method-override'); const methodOverride = require('method-override');
const multer = require('multer'); const multer = require('multer');
const QiwiBillPaymentsAPI = require('@qiwi/bill-payments-node-js-sdk'); const QiwiBillPaymentsAPI = require('@qiwi/bill-payments-node-js-sdk');
@ -35,7 +34,7 @@ MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: t
server.use(express.urlencoded({ extended: false })); server.use(express.urlencoded({ extended: false }));
server.use(express.json()); server.use(express.json());
server.use(flash()); server.use(flash());
server.use(session({secret: process.env.SESSION_SECRET,resave: false,saveUninitialized: false})); server.use(session({secret: require('crypto-random-string')({length: 64, type: 'base64'}), resave: false,saveUninitialized: false}));
server.use(passport.initialize()); server.use(passport.initialize());
server.use(passport.session()); server.use(passport.session());
server.use(methodOverride('_method')); server.use(methodOverride('_method'));

31
package-lock.json generated
View File

@ -2246,14 +2246,6 @@
"integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
"dev": true "dev": true
}, },
"connect-mongo": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-3.2.0.tgz",
"integrity": "sha512-0Mx88079Z20CG909wCFlR3UxhMYGg6Ibn1hkIje1hwsqOLWtL9HJV+XD0DAjUvQScK6WqY/FA8tSVQM9rR64Rw==",
"requires": {
"mongodb": "^3.1.0"
}
},
"console-browserify": { "console-browserify": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
@ -2453,10 +2445,12 @@
} }
}, },
"crypto-random-string": { "crypto-random-string": {
"version": "1.0.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.1.0.tgz",
"integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "integrity": "sha512-Tip3yGB+bA7B0W8E4K4mNf2rZhu5r2G5Tb89/utEl5tP1QuLjTF/S9a1b8ifDrR4ORc9Utf6tscpSEtBY3YcPQ==",
"dev": true "requires": {
"type-fest": "^0.8.1"
}
}, },
"cyclist": { "cyclist": {
"version": "1.0.1", "version": "1.0.1",
@ -7666,6 +7660,11 @@
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
}, },
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
},
"type-is": { "type-is": {
"version": "1.6.18", "version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@ -7823,6 +7822,14 @@
"dev": true, "dev": true,
"requires": { "requires": {
"crypto-random-string": "^1.0.0" "crypto-random-string": "^1.0.0"
},
"dependencies": {
"crypto-random-string": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
"integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
"dev": true
}
} }
}, },
"universalify": { "universalify": {

View File

@ -23,8 +23,8 @@
"@qiwi/bill-payments-node-js-sdk": "^3.1.3", "@qiwi/bill-payments-node-js-sdk": "^3.1.3",
"axios": "^0.19.0", "axios": "^0.19.0",
"bcryptjs": "^2.4.3", "bcryptjs": "^2.4.3",
"connect-mongo": "^3.2.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto-random-string": "^3.1.0",
"express": "^4.17.1", "express": "^4.17.1",
"express-flash": "0.0.2", "express-flash": "0.0.2",
"express-session": "^1.17.0", "express-session": "^1.17.0",