В последней части самое важное из кода проекта.
blockchainData.js
const config = require('./config.json');
const db = require("./database");
const viz = require("viz-world-js");
async function runActions() {
let result_create = await db.createTables();
console.log(result_create);
}
async function processCustom(timestamp, custom_body) {
let json = JSON.parse(custom_body.json);
const table_id = json.table;
const data = json.data;
let lactors = await db.getData("lactors", "login",
custom_body.required_regular_auths[0]);
if (lactors[0].login === custom_body.required_regular_auths[0] &&
table_id === 'assessments' || table_id === 'lesson_topics') {
let res = await db.addData(table_id, data);
console.log(res);
} else if (custom_body.required_regular_auths[0] ===
config.metodist) {
let res = await db.addData(table_id, data);
console.log(res);
}
}
async function processBlock(bn) {
console.log("обработка блока",bn)
const block = await viz.api.getBlockAsync(bn);
for(let tr of block.transactions) {
for(let operation of tr.operations) {
const [op, opbody] = operation;
switch(op) {
case "custom":
if(opbody.id === 'istr-i52') {
await processCustom(block.timestamp, opbody);
}
break;
default:
//неизвестная команда
}
}
}
}
let bn = 0;
async function run() {
const props = await viz.api.getDynamicGlobalPropertiesAsync();
bn = bn || props.last_irreversible_block_num;
for(; bn < props.last_irreversible_block_num; bn++){
await processBlock(bn);
}
}
runActions();
setInterval(() 😕> run(), 3000);
database.js
const config = require('./config.json');
const mysql = require('mysql');
let connection = mysql.createPool({
host : config.db_host,
user : config.db_login,
password : config.db_password,
database : config.db_name,
connectionLimit: 30
});
function addData(table_id, data) {
return new Promise((resolve, reject) 😕> {
connection.query('insert INTO ' + table_id + ' SET ?', data, (error,
result, fields) 😕> {
if(error) {
reject(error);
} else {
resolve(result);
}
});
});
}
function getData(table_id, filde, value) {
return new Promise((resolve, reject) 😕> {
connection.query('SELECT * FROM ' + table_id + '\ WHERE ' + filde
- '\ = ' + value, (error, results, fields) 😕> {
if(error) {
reject(error);
} else {
resolve(results);
}
});
});
}
function createTables() {
let sql = "CREATE TABLE IF NOT EXISTS [lactors] (id integer NOT NULL
AUTO_INCREMENT, login text); CREATE TABLE IF NOT EXISTS [disciples]
(id integer NOT NULL AUTO_INCREMENT, login text); CREATE TABLE IF NOT
EXISTS [lessons] (id integer NOT NULL AUTO_INCREMENT, name text,
lactors text); CREATE TABLE IF NOT EXISTS [lesson_topics] (id integer
NOT NULL AUTO_INCREMENT, date date, lesson text, topics text); CREATE
TABLE IF NOT EXISTS [assessments] (id integer NOT NULL
AUTO_INCREMENT, date date, lesson text, disciple text, assessment
integer).";
return new Promise((resolve, reject) 😕> {
connection.query(sql, (error, result) 😕> {
if(error) {
reject(error);
} else {
resolve(result);
}
});
});
}
module.exports.addData = addData;
module.exports.getData = getData;
module.exports.createTables = createTables;
index.php
<?php
require 'functions.php';
$page = homePage();
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]><script
src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script><![endif]-->
<title><?= $page; ?> | Электронный журнал с использованием
технологии Блокчейн</title>
<meta name="keywords" content="Журнал, journal, viz, блокчейн" />
<meta name="description" content="Электронный журнал с использованием
технологии Блокчейн." />
<link href="style.css" rel="stylesheet">
<script src="js/jquery.min.js"></script>
<script src="js/sjcl.min.js" type="text/javascript"></script>
<script
src="https://cdn.jsdelivr.net/npm/viz-js-lib@latest/dist/viz.min.js"
type="text/javascript"></script>
<script src="js/helper.js" type="text/
javascript"></script>
<style>
/* Eric Meyer's CSS Reset */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
display: block;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/* End of Eric Meyer's CSS Reset */
article, aside, details, figcaption, figure, footer, header, hgroup,
main, nav, section, summary {
display: block;
}
body {
font: 12px/18px Arial, sans-serif;
}
/* Begin of styles for the demo (you can remove them) */
a.expand {
width: 90px;
display: block;
margin: 10px 0 0;
}
a.expand:hover {
height: 500px;
}
/* End of of styles for the demo */
.wrapper {
min-width: 400px;
max-width: 1920px;
margin: 0 auto;
}
/* Header
-----------------------------------------------------------------------------*/
.header {
height: 150px;
background: #FFE680;
}
/* Middle
-----------------------------------------------------------------------------*/
.middle {
border-right: 250px solid #FFACAA;
position: relative;
}
.middle:after {
display: table;
clear: both;
content: '';
}
.container {
width: 100%;
float: left;
overflow: hidden;
margin-right: -100%;
}
.content {
padding: 0 20px;
}
/* Right Sidebar
-----------------------------------------------------------------------------*/
.right-sidebar {
float: right;
margin-right: -250px;
width: 250px;
position: relative;
background: #FFACAA;
}
/* Footer
-----------------------------------------------------------------------------*/
.footer {
height: 100px;
background: #BFF08E;
}
</style>
</head>
<body>
<div class="wrapper">
<header class="header">
<h1>Электронный журнал с использованием технологии Блокчейн</h1>
<h2><?= $page; ?></h2>
</header><!-- .header-->
<nav><ul>
<li><a href="/web">Главная</a></li>
<li><a href="index.php?page=lactors">Преподаватели</a></li>
<li><a href="index.php?page=lessons">Предметы</a></li>
<li><a href="index.php?page=disciples">Ученики</a></li>
<li><a href="index.php?page=lesson_topics">Темы
предметов</a></li>
<li><a href="index.php?page=assessments">Оценки
учеников</a></li>
<li>Добавление:
<ul><li><a href="add.php?data=lactors">Преподавателя</a></li>
<li><a href="add.php?data=lessons">Предмет</a></li>
<li><a href="add.php?data=disciples">Ученика</a></li>
<li><a href="add.php?data=lesson_topics">Темы
предметов</a></li>
<li><a href="add.php?data=assessments">Оценку
ученика</a></li></ul></li>
</ul></nav>
<div class="middle">
<!-- <a href="#" id="test">tsrt</a> -->
<div class="container">
<main class="content">
<h1 class="home-header">Электронный журнал с использованием технологии
Блокчейн.
Для отображения данных авторизуйтесь и перейдите на одну из страниц в
меню. Если вы уже авторизовались: есть ссылка "выйти", просто
выберите пункт меню для начала работы с журналом.</h1>
</main><!-- .content -->
</div><!-- .container-->
<aside class="right-sidebar">
<form id="unblock_form">
<p><label for="viz_login">Введите логин в VIZ: </label></p>
<p><input type="text" name="viz_login" id="th
is_login"></p>
<p><label for="posting">Введите приватный постинг ключ (Начинается с
5). Внимание: он никуда не передаётся, все операции выполняются у вас на
компьютере, в вашем браузере.</label></p>
<p><input type="password" name="posting" id="this_posting"></p>
<p><input type="checkbox" id="isSavePosting"> Сохранить логин и
Постинг ключ</p>
<p align="center"><input type="button" value="Войти"
onclick="userAuth(true)"></p>
</form>
<div id="delete_posting_key"></div>
</aside><!-- .right-sidebar -->
</div><!-- .middle-->
<footer class="footer">
<p align="center">Создатель сервиса: <a
href="https://viz.world/@denis-skripnik" target="_blank">Незрячий
программист Денис скрипник</a></p>
</footer><!-- .footer -->
</div><!-- .wrapper -->
<script>
if (localStorage.getItem('login') && localStorage.getItem('PostingKey'))
{
viz_login = localStorage.getItem('login');
posting_key = sjcl.decrypt(viz_login + '_postingKey',
localStorage.getItem('PostingKey'));
$('#unblock_form').css("display", "none");
$('#delete_posting_key').css("display", "block");
jQuery("#delete_posting_key").html('<p align="center"><a
onclick="localStorage.removeItem(\'login\'\);
localStorage.removeItem(\'PostingKey\'\);
location.reload();">Выйти</a></p>');
ajaxSend(viz_login);
} else if (sessionStorage.getItem('login') &&
sessionStorage.getItem('PostingKey')) {
viz_login = sessionStorage.getItem('login');
posting_key = sjcl.decrypt(viz_login + '_postingKey',
sessionStorage.getItem('PostingKey'));
$('#unblock_form').css("display", "none");
$('#delete_posting_key').css("display", "block");
jQuery("#delete_posting_key").html('<p align="center"><a
onclick="sessionStorage.removeItem(\'login\'\);
sessionStorage.removeItem(\'PostingKey\'\);
location.reload();">Выйти</a></p>');
ajaxSend(viz_login);
} else {
$('#delete_posting_key').css("display", "none");
$('#unblock_form').css("display", "block");
}
</script>
</body>
</html>
Послесловие:
Хочу обратить внимание на то, что код мог измениться, т.к. проектом занимался и после защиты диплома.
Всё
Благодарю за внимание. С вами был незрячий автор, программист и делегат @denis-skripnik. До встречи в новых постах.
Здравствуйте, @denis-skripnik. Вы получили 100% апвот от UPRomo за сожженные GBG. Продвигали сей пост в очереди: @denis-skripnik.
Сервис прибавил к вашему посту примерно 124.655 GBG.
Инструкция по сжиганию для продвижения или задвигания постов.
Соглашение об использовании UPRomo.
Делегируйте СГ сервису UPRomo и способствуйте уменьшению количества GBG, что поможет выйти из кризиса, возобновить GBG и восстановить его цену, равную 1 МГ золота.
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
boddhisattva, midnight, sterh, kudesnikaltay, optimist, d0z4t0r, anykeycheg, zaria, alexfisher, wallyt, olga-olga, student61, vp-cosmos, zlata777, volv, olgaxx, mamamasha, lilia, semitsvetik, katherina, shal891, denispavlov, verdon, apnigrich, chin, forbon21, pkrugloff, bumex2008, virt, naiger, massatela, mixtrum, sevaev, vitalist, marko44, denisya, vitalson, blange, goodnews, siddxa, jahspear, marigold, arhiopteriks, astrofilosof, makcl, m0ssa99, evgeniy73, samael27, yurij12, egoryana, esperos, osra111, lvivrugby, felicita, now, atvalevsky, andristrendnews, tapejara, wenderccc, alte, erased
Поэтому я тоже проголосовал за него!
Узнать подробности о сообществе можно тут:
Разрешите представиться - Кит Добрый
Правила
Инструкция по внесению Инвестиционного взноса
Вы тоже можете стать Инвестором и поддержать проект!!!
Если Вы хотите отказаться от поддержки Доброго Кита, то ответьте на этот комментарий командой "!нехочу"
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас:
Фонд БОД сделал репост.
Ваше творчество в ленте.
Наша лента в telegram.
:)
Вы являетесь участником проекта БОД, поэтому все ваши посты
размещаются в ленте репостов фонда. Если не желаете получать
апвот фонда и этот комментарий, ставьте тег nobod.