mirror of
https://github.com/sergeyyarkov/digital-store.git
synced 2026-10-11 02:09:05 +03:00
readmd & secret session
This commit is contained in:
parent
c444ac2cfd
commit
8e79ce1e99
269
README.md
269
README.md
@ -1,16 +1,255 @@
|
||||
# Панель управления:
|
||||
Для входа в панель управления магазином используйте данные:
|
||||
```js
|
||||
Login: admin@support.ru
|
||||
Password: admin
|
||||
<p align="center">
|
||||
<a href="http://materializecss.com/">
|
||||
<img src="https://svgshare.com/i/HWW.svg" width="150">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<h3 align="center">Digital Store</h3>
|
||||
|
||||
<p align="center">
|
||||
Digital Store - это настраиваемый интернет-магазин на платформе NodeJS для продажи ваших цифровых товаров.<br>
|
||||
<a href="https://polar-peak-95205.herokuapp.com/">Демонстрания функционирования интернет-магазина.</a>
|
||||
<br>
|
||||
<br>
|
||||
<img alt="GitHub package.json version (branch)" src="https://img.shields.io/github/package-json/v/sergeyyarkov/digital-store/production?color=%2326a69a">
|
||||
<img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/sergeyyarkov/digital-store">
|
||||
<img alt="GitHub All Releases" src="https://img.shields.io/github/downloads/sergeyyarkov/digital-store/total">
|
||||
<img alt="GitHub top language" src="https://img.shields.io/github/languages/top/sergeyyarkov/digital-store?color=%23f9a825">
|
||||
<img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/sergeyyarkov/digital-store"><br>
|
||||
<a href="https://david-dm.org/sergeyyarkov/digital-store">
|
||||
<img src="https://david-dm.org/sergeyyarkov/digital-store/status.svg" alt="dependencies Status badge">
|
||||
</a>
|
||||
<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">
|
||||
</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>
|
||||
|
||||
## Содержание
|
||||
- [О проекте](#О-проекте)
|
||||
- [Структура репозитория](#Структура-репозитория)
|
||||
- [Установка и найстройка скрипта](#Установка-и-найстройка-скрипта)
|
||||
- [Запуск скрипта на локальном компьютере](#Запуск-скрипта-на-локальном-компьютере)
|
||||
- [Запуск скрипта на удаленном сервере](#Запуск-скрипта-на-удаленном-сервере)
|
||||
- [Переменные среды](#Переменные-среды)
|
||||
- [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=пароль от почты
|
||||
```
|
||||
|
||||
## 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)<br><br>
|
||||
|
||||
@ -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'));
|
||||
|
||||
31
package-lock.json
generated
31
package-lock.json
generated
@ -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": {
|
||||
|
||||
@ -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",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user