Skip to content

Commit

Permalink
Merge branch 'release/v0.5.1'
Browse files Browse the repository at this point in the history
  • Loading branch information
RusovDmitriy committed May 15, 2018
2 parents b5a7ddf + 9bf170d commit 62bb55e
Show file tree
Hide file tree
Showing 79 changed files with 1,212 additions and 850 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ server/data/docker
server/datasources.json
server/config.json
server/storage/*
server/data/mysql/wb-model.mwb.bak
client/dist
test.js
docs/*
172 changes: 109 additions & 63 deletions README-ru.md
Original file line number Diff line number Diff line change
@@ -1,118 +1,147 @@
![OnePlace](/client/static/img/logo_hub.png)
# ![OnePlace](/client/static/img/logo_hub.png)

OnePlace - это web-приложение для взаимодействия с блокчейнами [Steem](https://github.com/steemit/steem) и [Golos](https://github.com/GolosChain/golos). В качестве основы были использованы такие технологии как [Vue](https://vuejs.org) с [SSR](https://ssr.vuejs.org/ru/) модулем для клиентской части проекта и [LoopBack](https://loopback.io/) для реализации серверной составляющей.
Oneplace - это web-приложение для взаимодействия с блокчейнами [Steem](https://github.com/steemit/steem) и [Golos](https://github.com/GolosChain/golos). В качестве основы были использованы такие технологии как [Vue](https://vuejs.org) с [SSR](https://ssr.vuejs.org/ru/) модулем для клиентской части проекта и [LoopBack](https://loopback.io/) для реализации серверной составляющей. Детально цели проекта описаны в [документе WhitePaper](./client/static/whitepaper_ru.pdf).

## Установка

#### Клонирование репозитория и установка npm модулей
## Начало работы

```bash
git clone git@github.com:OnePlace-media/oneplace.git
cd oneplace && npm i
```
Данная инструкция ориентирована на пользоватлей linux с debian дистрибутивами. Для запуска приложения потребуется установить следующие зависимости:

#### Установка зависимостей
Данная инструкция ориентирована на пользоватлей linux с debian дистрибутивами.
### NodeJS

##### NodeJS
Установите NodeJS, мы рекомендуем использовать [**LTS version**](https://nodejs.org/en/) и [**nvm**](https://github.com/creationix/nvm) для установки:

```bash
nvm install 8.9.4
nvm use 8.9.4
```

OnePlace является комплексным решением и имеет дополнительный функционал над обоими блокчейнами. Вам необходимо установить базы данных [mysql](https://www.mysql.com/) и [redis](https://redis.io/download). Используйте [Docker Compose](https://docs.docker.com/compose/) с нашим [docker-compose.yml](./docker-compose.yml) или установите в ручном режиме:
### Базы данных

##### MySQL
```bash
sudo apt-get update
sudo apt-get install mysql-server
```
OnePlace является комплексным решением и имеет дополнительный функционал над обоими блокчейнами, приложение имеет собственные хранилища. Вам необходимо установить базы данных [mysql](https://www.mysql.com/) и [redis](https://redis.io/download). Используйте [Docker Compose](https://docs.docker.com/compose/) с нашим [docker-compose.yml](./docker-compose.yml) или установите в ручном режиме, следуя интсрукции по [ссылке](./docs/ru/install-db.md). При использовании docker-compose данные будут сохранятся в директорию: **./server/data/docker/{DB_NAME}>**

В данном репозитории присутствует sql-скрипт для инициализации структуры БД. Используйте его для быстрого старта:
```bash
# Вставка sql-скрипта в mysql
mysql -u root < ./server/data/mysql/mysql-init.sql
# Логин Mysql
mysql -u root
# Создаем нового пользователя
CREATE USER 'oneplace'@'localhost' IDENTIFIED BY 'password';
# Настройка привилегий
GRANT ALL PRIVILEGES ON oneplace.* TO 'oneplace'@'localhost'
docker-compose up -d
```

Вы так же можете использовать [MySql WorkBench](https://www.mysql.com/products/workbench/) с нашим [model файлом](./server/data/mysql/wb-model.mwb) для расширения sql-схемы.
## Установка

##### Redis
### 1. Склонируйте репозиторий с github

```bash
sudo apt-get install redis
git clone git@github.com:OnePlace-media/oneplace.git && cd oneplace
```

#### Конфигурация

После установки сконфигурируйте redis-server для работы в качестве демона на локальном порту, для этого в стандартный конфиг (например, /etc/redis/redis.conf) внесите следующие изменения:
### 2. Установите npm зависимости

```bash
daemonise yes
bind 127.0.0.1
port 6379
npm install
```

После установки зависимостей необходимо создать конфигурационные файлы из шаблонов:
### 3. Создайте файлы конфигрураций

Скопируйте 2 файла json из готовых шаблонов:

```bash
cd server

# Главный config
cp config.sample.json config.json
# Параметры к источникам данных (mysql, redis и т.д.)
cp datasources.sample.json datasources.json
cp ./server/config.sample.json ./server/config.json

# Параметры к источникам данных (mysql, redis, email)
cp ./server/datasources.sample.json ./server/datasources.json
```

##### config.json
#### ./server/config.json

Более подробную информацию о config.json можно получить в официальной [документации к LoopBack](https://loopback.io/doc/en/lb3/config.json.html). Ниже описаны поля относящиеся непосредсвтенно к oneplace

```json
{
...,
"postingWrapper": {
"steemDomain": "URL до ноды STEEM с HTTP JSON-RPC протоколом",
"golosDomain": "URL до ноды GOLOS с HTTP JSON-RPC протоколом",
"steemDomain": "URL ноды STEEM с HTTP JSON-RPC протоколом",
"golosDomain": "URL ноды GOLOS с HTTP JSON-RPC протоколом",
"WIF": "Приватный постинг ключ аккаунта приложения в блокчейнах STEEM и GOLOS",
"username": "Имя аккаунта приложения в блокчейнах STEEM и GOLOS (без @)"
"username": "Имя аккаунта приложения в блокчейнах STEEM и GOLOS (без @)",
"beneficiarie" : "Имя аккаунта приложения в блокчейнах STEEM и GOLOS для функционала beneficiarie"
}
}
```

#### ./server/datasources.json

Более подробную информацию о datasources.json можно получить в официальной [документации к LoopBack](https://loopback.io/doc/en/lb3/Defining-data-sources.html). В случае использования docker-compose достаточно прописать параметры SMTP для в секции **email**.

```json
{
...,
"email": {
"name": "email",
"connector": "mail",
"transports": [
{
"type": "SMTP",
"host": "...",
"secure": true,
"port": 465,
"auth": {
"user": "...",
"pass": "..."
}
}
]
}
}
```

#### Сборка и запуск
Мы приготовили несколько команд для быстрой сборки и запуска всех сервисов. Для начала необходимо собрать рабочую версию клиента с готовым конфигом:
## Сборка и запуск

Мы приготовили несколько команд для быстрой сборки и запуска всех сервисов. Если вы проделали все шаги по установки, можете приступать к сборке и запуску процессов:

### Сборка VUE клиента

Для начала необходимо собрать рабочую версию клиента для этого используется [webpack](https://webpack.js.org/):

```bash
# Сборка фронт части проекта
npm run build
```
Для запуска демонов мы рекомендуем использовать [PM2](http://pm2.keymetrics.io/). Подробнее в [process.json](./process.json).

```bash
pm2 start process.json
### Запуск node.js процессов

# запуск мониторинг pm2
pm2 monit
```
Oneplace состоит из нескольких node.js приложений:

Но вы можете осуществить запуск вручную.
* VUE-SSR server - серверный рендер front части проекта
* LoopBack server - REST API для получения данных из БЧ и доп функционала
* CacheUpdater daemon - демон, кеширующий топовые посты по тэгам в базе redis, для быстрого формирования трендовых списков.

##### Запуск в ручном режиме
#### Режим разработки

```bash
# Запуск LoopBack-API сервера
npm start

# Запуск VueSSR сервера
npm run client
# Запуск VueSSR сервера в режиме наблюдения изменений
npm run client:dev
```

#### Режим боевой

Для запуска демонов мы рекомендуем использовать [PM2](http://pm2.keymetrics.io/). Для этого существует готовый [process.json](./process.json):

```bash
pm2 start process.json

# запуск мониторинг pm2
pm2 monit
```
Подробнее см. [package.json](./package.json).

Описание остальных скриптов NPM можно найти в [package.json](./package.json).

## После установки

На данный момент проект не является монолитным приложением, с помощью nginx вы легко можете объединить интерфейсы VUE с loopback, простой пример:

```nginx
location /api {
proxy_pass http://127.0.0.1:3001;
Expand All @@ -131,12 +160,29 @@ location / {
proxy_set_header X-Real-IP $remote_addr;
}
```
## В ближайшем будущем
- Запуск демонов в кластере и soft рестарт с нулевым простоем
- Полное покрытие Unit тестами (frontend) и BDD (API) тестами с Karma, Mocha и PhantomJS
- Непрерывная интеграция и автоматический деплой
- Git flow и релизы с change log
- Полная документация

## Тесты

Для тестов необходимо запустить тестовые базы данных, это можно сделать через специальные [docker-compose.yml](./server/test/docker-compose.yml). [config.test.json](./server/config.test.json) уже присутсвуют в репозитории:

```bash
docker-compose -f ./server/test/docker-compose.yml up -d
```

Запуск тестов:

```bash

# Тесты API
npm run test:api

# Тесты frontend чаcти
npm run test:client

# Все тесты по очереди
npm run test

```

## Вопросы

Expand Down
2 changes: 1 addition & 1 deletion client/src/components/chains/comment/Comment.vue
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
class="link link--op">
{{item.author}}
</a>
<span class="post-view__post-author-rep">{{item.author_rep}}</span> · <time-ago :time="item.created"></time-ago>
· <time-ago :time="item.created"></time-ago>
</div>
<div class="comment__body" >
<div class="markdown markdown--small" v-html="item.body" v-if="!editCommentShow"></div>
Expand Down
2 changes: 1 addition & 1 deletion client/src/components/chains/common/TagLabel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
@click.stop="add(tag)"
class="tags-list__item tags-list__item--filter"
:class="{'tags-list__item--selected': isInclude, 'tags-list__item--removed': isExclude}">
{{tag.text | unGolosTag | toLowerCase}}
<span>{{tag.text | unGolosTag | toLowerCase}}</span>
<span class="tags-list__remove-item" @click.stop="remove(tag)" :alt="$t('profile.removeTag')"></span>
</span>
</template>
Expand Down
49 changes: 37 additions & 12 deletions client/src/components/chains/post/DropdownVotes.vue
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
<script>
import moment from 'moment'
import Converter from '@oneplace/blockchains-api/converter'
const CONSTANTS = require('@oneplace/constants')
const MAX_COUNT_VOTES = 20
const NEED_COUNT_VOTES = 10
const sortByRshares = (a, b) => +b.rshares - +a.rshares
const sortByFiat = (a, b) => b.fiat.number - a.fiat.number
import Converter from '@oneplace/blockchains-api/converter'
const CONSTANTS = require('@oneplace/constants')
const sortByRshares = isDislike => {
return (a, b) => isDislike
? +a.rshares - +b.rshares
: +b.rshares - +a.rshares
}
const sortByFiat = isDislike => {
return (a, b) => isDislike
? a.fiat.number - b.fiat.number
: b.fiat.number - a.fiat.number
}
export default {
name: 'DropdownVotes',
Expand All @@ -19,6 +30,10 @@ export default {
default() {
return this.$router.params.chain
}
},
isDislike:{
type: Boolean,
default: false
}
},
methods: {
Expand Down Expand Up @@ -46,6 +61,7 @@ export default {
}
return {
isZero: !!prefix || payout == 0,
number: +payout,
string:
prefix +
Expand All @@ -57,9 +73,11 @@ export default {
computed: {
activeVotesLike() {
const active_votes = this.post.active_votes.filter(
vote => vote.weight > 0 || vote.percent > 0
vote => this.isDislike
? vote.weight < 0 || vote.percent < 0
: vote.weight > 0 || vote.percent > 0
)
active_votes.sort(sortByRshares)
active_votes.sort(sortByRshares(this.isDislike))
return active_votes
},
sortAndSliceVotes() {
Expand All @@ -70,11 +88,21 @@ export default {
vote.fiat = this.calcFiat(vote)
return vote
})
sortAndSliceVotes.sort(sortByFiat)
sortAndSliceVotes.sort(sortByFiat(this.isDislike))
return sortAndSliceVotes.slice(0, NEED_COUNT_VOTES)
},
sum(){
const sortAndSliceVotes = [...this.activeVotesLike].map(vote => {
vote.fiat = this.calcFiat(vote)
return vote
})
return sortAndSliceVotes.reduce((sum, vote)=> {sum += vote.fiat.number; return sum}, 0)
},
count() {
return this.activeVotesLike.length - NEED_COUNT_VOTES
},
hideFiat(){
return this.post.mode === 'archived' && moment(this.post.last_payout).unix() < moment('2018-04-01', 'YYYY-MM-DD').unix()
}
}
}
Expand All @@ -85,13 +113,10 @@ export default {
<div class="dropdown post-view__voters">
<ul class="post-view__voter-list">
<li class="post-view__voter" v-for="vote in votesWithFiatAndResort" :key="vote.voter">
<router-link tag="a" :to="{name:'chain-account-view', params:{chain, username:vote.voter}}" class="link">
<router-link tag="a" :to="{name:'chain-account-view', params:{chain, username:vote.voter}}" class="post-view__voter-name link">
{{vote.voter}}
</router-link>
<!-- <a tag="a" :href="`/@${chain}/${vote.voter}`" class="link">
{{vote.voter}}
</a> -->
<span class="post-view__voter-amount currency">{{vote.fiat.string}}</span>
<span class="post-view__voter-amount currency" v-if="!isDislike && !hideFiat && !vote.fiat.isZero">{{vote.fiat.string}}</span>
</li>
</ul>
<span class="post-view__voters-all" v-if="count > 0">{{$t('chains.andMore', {count})}}</span>
Expand Down
Loading

0 comments on commit 62bb55e

Please sign in to comment.