From 8e79ce1e990c8a58612aa6728af99d062cd727dc Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Sat, 25 Jan 2020 17:05:13 +0300 Subject: [PATCH] readmd & secret session --- README.md | 269 +++++++++++++++++++++++++++++++++++++++++++--- config/server.js | 3 +- package-lock.json | 31 +++--- package.json | 6 +- 4 files changed, 278 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index db89f34..89f76da 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,255 @@ -# Панель управления: -Для входа в панель управления магазином используйте данные: -```js -Login: admin@support.ru -Password: admin +

+ + + +

+ +

Digital Store

+ +

+ Digital Store - это настраиваемый интернет-магазин на платформе NodeJS для продажи ваших цифровых товаров.
+ Демонстрания функционирования интернет-магазина. +
+
+ GitHub package.json version (branch) + GitHub release (latest by date) + GitHub All Releases + GitHub top language + GitHub repo size
+ + dependencies Status badge + + + devDependency Status badge + + + GitHub + +

+ +## Содержание +- [О проекте](#О-проекте) +- [Структура репозитория](#Структура-репозитория) +- [Установка и найстройка скрипта](#Установка-и-найстройка-скрипта) +- [Запуск скрипта на локальном компьютере](#Запуск-скрипта-на-локальном-компьютере) +- [Запуск скрипта на удаленном сервере](#Запуск-скрипта-на-удаленном-сервере) +- [Переменные среды](#Переменные-среды) +- [API](#API) +- [Требования](#Требования) +- [Лицензия](#Лицензия) + +## О проекте: +Этот проект представляет из себя интернет-магазин на платформе NodeJS, вы можете продавать свои цифровые товары именно скачав этот репозиторий, в [панели управления](#Панель-управления) вы сможете создавать, удалять и редактировать товары или категории . В проекте используется концепция REST API, поэтому для отдачи информации клиенту существует отдельный API. Информация о покупателях, товарах, категориях и т.д хранится в БД MongoDB (используется нативный драйвер). +### Функционал покупателя: +- Возможность выбирать интересующие категории, переход по одиночным страницам конкретного товара. +- Возможность комментировать как отдельный товар, так и весь магазин на отдельной странице через виджет [Commento.io](https://commento.io/) +- Возможность фильтровать интересующую категорию или все товары через фильтр. +- Покупатель может совершать одну или несколько покупок через корзину или через кнопку "Купить". +- Оплата осуществляется через сервис QIWI API. +- Результатом оплаты будут данные одного или нескольких товаров, все данные отсылаются на почту покупателя, которую он указывал при создании заказа. +- Покупатель может узнать все свои совершенные покупки в магазине на отдельной странице. +### Функционал администратора: +Для входа в админ-панель необходимо дописать в адресной строке `/admin`, после вы попадете на страницу авторизации где нужно вписать данные `email:password`. По умолчанию `admin@support.ru:admin` +- Пароль админа хэшируется через `bcrypt` для безопасности и записывается в БД. +- На главной странице есть небольшая статистика, где можно посмотреть: сумму проданных товаров, кол-во проданных товаров, кол-во товаров в наличии. +- На главной странце так же можно узнать подробные данные о покупателях: номер заказа, почта покупателя, способ оплаты, дата покупки, сумма и данные которые были высланы по почте. +- Возможность находить конкретного покупателя через поле (нужно знать номер заказа). +- Возможность добавлять, удалять или редактировать товары на странице "Товары", так же можно посмотреть и информацию о товаре. +- Поиск товаров через поле поиска (нужно знать частичное или полное название товара). +- Добавление, удаление и редактирование категорий через страницу "Категории", каждой категории присваивается собственная иконка, которую можно загрузить через страницу "Иконки". +- Возможность править контент, изменять общее оформление магазина (только цвет). +- Возможность изменять данные администратора: почта, пароль, имя. + +## Структура репозитория: +В основе всего репозитория существуют две ветки. Ветка master предназначена для разработки приложения, для выгрузки готового приложения на сервер используйте ветку production. + +## Установка и найстройка скрипта: +### Запуск скрипта на локальном компьютере: +- [Установите последний релиз Digital Store](https://github.com/sergeyyarkov/digital-store/releases) из GitHub репозитория. +- Или клонировать репозиторий `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. +- Для работоспособности интернет-магазина необходимо установить зависимости. Выполните комманду `npm install`. +- Далле необходимо настроить переменные среды. Создайте файл `.env` в корне вашего интернет-магазина и запишите туда [значения для переменных](#Переменные-среды). Обратите внимание, что для выгрузки скрипта на production сервер, нужно устанавливать переменные среды для вашего сервера, файл `.env` создавать не нужно. +- После этого, введите `npm run start` и перейдите по адресу `localhost:3000`, вы увидите уже рабочий интернет-магазин который работает у вас на локальном компьютере. + +### Запуск скрипта на удаленном сервере: +В данном примере на удаленном сервере будет использоваться связка ``Ubuntu 18.04, Nginx, MongoDB, PM2, NodeJS.`` +- ... + +## Переменные среды: +Перменные среды нужны для работоспособности всего приложения, очень важно вписать верные данные для избежания возможных ошибок. +### Описание переменных: +| Переменная | Описание | +| --------------- | -------------------------------------------------------- | +| DATABASE_URI | Подключение к БД MongoDB | +| DATABASE_NAME | Имя БД | +| EMAIL_LOGIN | Логин от почты для отправки данных покупателю | +| EMAIL_PASSWORD | Пароль от почты | +| QIWI_SECRET_KEY | Секретный ключ QIWI для работоспособности системы оплаты | + +`.env` файл: +```bash +DATABASE_URI= +DATABASE_NAME= +QIWI_SECRET_KEY= +EMAIL_LOGIN= +EMAIL_PASSWORD= ``` -# Переменные среды: -Установите на вашем сервере переменные среды: -```js -SESSION_SECRET=secret -DATABASE_URI=подключение к БД MONGODB -DATABASE_NAME=имя БД -QIWI_SECRET_KEY=секретный ключ QIWI API -EMAIL_LOGIN=логин от почты -EMAIL_PASSWORD=пароль от почты -``` \ No newline at end of file + +## API: +### API представляет из себя различные URL, которые отвечают данными только в формате JSON. Здесь описаны основные `GET` запросы на сервер для получения данных: +#### Для просмотра всех товаров которые существуют в магазине отправляется запрос: +```bash +https://store-name.com/api/items +``` +Ответ: +```javascript + [ + { + _id: "5e15dbc415303a1980cd77a0", + title: "Тестовый товар №1", + count: 0, + price: 1, + category: "steam", + description: "-", + date: "2020-01-08T13:40:20.353Z" + }, + { + _id: "5e15dcb4138c3339bcbc3719", + title: "Тестовый товар №2", + count: 0, + price: 1, + category: "uplay", + description: "-", + date: "2020-01-08T13:44:20.940Z" + }, + ] +``` + +### Для просмотра товаров в интересующей категории отправляется запрос: +```bash +https://store-name.com/api/items/{category} +``` +Ответ: +```javascript +[ + { + _id: "5e15dbc415303a1980cd77a0", + title: "Тестовый товар №1", + count: 0, + price: 1, + category: "steam", + description: "-", + date: "2020-01-08T13:40:20.353Z" + }, + { + _id: "5e1ccf30d5b894228c86385a", + title: "Тестовый товар №2", + count: 10, + price: 1, + category: "steam", + description: "-", + date: "2020-01-13T20:12:32.814Z" + } +] +``` + +### Для просмотра информации о всех категориях отправляется запрос: +```bash +https://store-name.com/api/categories +``` +Ответ: +```javascript +[ + { + _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} +``` +Ответ: +```javascript +[ + { + _id: "5df64563309e691f2c33d400", + title: "uplay", + img: "img-1576349954743.svg", + type: "type", + format: "format" + } +] +``` + +### Для просмотра данных всех товаров отправляется запрос: **Нужна авторизация для адмимистатора.** +```bash +https://store-name.com/api/items/data +``` +Ответ: +```javascript +[ + { + _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 +``` +Ответ: +```javascript +[ + { + _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 +``` +Ответ: +```javascript +[ + "img-1576349954743.svg", + "img-1576349989720.svg", + "img-1576420937629.svg", + "img-1576421960189.svg" +] +``` + +## Требования: +- Node.js v7.6.0 или выше + +## Лицензия: +[MIT](https://github.com/sergeyyarkov/digital-store/blob/master/LICENSE)

diff --git a/config/server.js b/config/server.js index 3c98bb7..e5ac628 100644 --- a/config/server.js +++ b/config/server.js @@ -11,7 +11,6 @@ const path = require('path'); const passport = require('passport'); const flash = require('express-flash'); const session = require('express-session'); -const MongoStore = require('connect-mongo')(session); const methodOverride = require('method-override'); const multer = require('multer'); 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.json()); 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.session()); server.use(methodOverride('_method')); diff --git a/package-lock.json b/package-lock.json index f04bcf1..0a6c421 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2246,14 +2246,6 @@ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "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": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -2453,10 +2445,12 @@ } }, "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 + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.1.0.tgz", + "integrity": "sha512-Tip3yGB+bA7B0W8E4K4mNf2rZhu5r2G5Tb89/utEl5tP1QuLjTF/S9a1b8ifDrR4ORc9Utf6tscpSEtBY3YcPQ==", + "requires": { + "type-fest": "^0.8.1" + } }, "cyclist": { "version": "1.0.1", @@ -7666,6 +7660,11 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "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": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -7823,6 +7822,14 @@ "dev": true, "requires": { "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": { diff --git a/package.json b/package.json index 995809b..0836ef7 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "description": "", "main": "index.js", "scripts": { - "start": "node config/server.js" + "start": "node config/server.js", + "build": "webpack --mode production", + "wp-server": "webpack-dev-server --mode development" }, "repository": { "type": "git", @@ -21,8 +23,8 @@ "@qiwi/bill-payments-node-js-sdk": "^3.1.3", "axios": "^0.19.0", "bcryptjs": "^2.4.3", - "connect-mongo": "^3.2.0", "cors": "^2.8.5", + "crypto-random-string": "^3.1.0", "express": "^4.17.1", "express-flash": "0.0.2", "express-session": "^1.17.0",