mirror of
https://github.com/kvazar-network/webapp.git
synced 2025-01-24 13:54:20 +00:00
initial commit
This commit is contained in:
commit
3fb244e4d3
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 kvazar-network
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# kvazar-network webapp
|
||||
Web-oriented content exploring platform for Kevacoin Blockchain
|
||||
|
||||
### demo
|
||||
https://kvazar.ml
|
18
config-default.php
Normal file
18
config-default.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
// Debug
|
||||
ini_set('display_errors', '1');
|
||||
ini_set('display_startup_errors', '1');
|
||||
error_reporting(E_ALL);
|
||||
|
||||
// Application
|
||||
define('BASE_URL', 'https://kvazar.ml');
|
||||
define('PAGE_LIMIT', 10);
|
||||
define('SEF_MODE', true);
|
||||
|
||||
// Database
|
||||
define('DB_HOST', 'localhost');
|
||||
define('DB_PORT', '3306');
|
||||
define('DB_NAME', '');
|
||||
define('DB_USERNAME', '');
|
||||
define('DB_PASSWORD', '');
|
209
library/icon.php
Executable file
209
library/icon.php
Executable file
@ -0,0 +1,209 @@
|
||||
<?php
|
||||
|
||||
final class Icon {
|
||||
|
||||
private $_width;
|
||||
|
||||
private $_height;
|
||||
|
||||
private $_hash;
|
||||
|
||||
private $_spriteZ = 800;
|
||||
|
||||
public function generateImageResource($hash, $width, $height, $filter = false) {
|
||||
|
||||
$this->_width = $width;
|
||||
$this->_height = $height;
|
||||
$this->_hash = $hash;
|
||||
|
||||
$csh = hexdec(substr($this->_hash, 0, 1)); // corner sprite shape
|
||||
$ssh = hexdec(substr($this->_hash, 1, 1)); // side sprite shape
|
||||
$xsh = hexdec(substr($this->_hash, 2, 1)) & 7; // center sprite shape
|
||||
|
||||
$cro = hexdec(substr($this->_hash, 3, 1)) & 3; // corner sprite rotation
|
||||
$sro = hexdec(substr($this->_hash, 4, 1)) & 3; // side sprite rotation
|
||||
$xbg = hexdec(substr($this->_hash, 5, 1)) % 2; // center sprite background
|
||||
|
||||
$cfr = hexdec(substr($this->_hash, 6, 2));
|
||||
$cfg = hexdec(substr($this->_hash, 8, 2));
|
||||
$cfb = hexdec(substr($this->_hash, 10, 2));
|
||||
|
||||
$sfr = hexdec(substr($this->_hash, 12, 2));
|
||||
$sfg = hexdec(substr($this->_hash, 14, 2));
|
||||
$sfb = hexdec(substr($this->_hash, 16, 2));
|
||||
|
||||
$identicon = imagecreatetruecolor($this->_spriteZ * 3, $this->_spriteZ * 3);
|
||||
if (function_exists('imageantialias')) {
|
||||
imageantialias($identicon, TRUE);
|
||||
}
|
||||
|
||||
$bg = imagecolorallocate($identicon, 255, 255, 255);
|
||||
imagefilledrectangle($identicon, 0, 0, $this->_spriteZ, $this->_spriteZ, $bg);
|
||||
|
||||
$corner = $this->_getSprite($csh, $cfr, $cfg, $cfb, $cro);
|
||||
imagecopy($identicon, $corner, 0, 0, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
$corner = imagerotate($corner, 90, $bg);
|
||||
imagecopy($identicon, $corner, 0, $this->_spriteZ * 2, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
$corner = imagerotate($corner, 90, $bg);
|
||||
imagecopy($identicon, $corner, $this->_spriteZ * 2, $this->_spriteZ * 2, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
$corner = imagerotate($corner, 90, $bg);
|
||||
imagecopy($identicon, $corner, $this->_spriteZ * 2, 0, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
|
||||
$side = $this->_getSprite($ssh, $sfr, $sfg, $sfb, $sro);
|
||||
imagecopy($identicon, $side, $this->_spriteZ, 0, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
$side = imagerotate($side, 90, $bg);
|
||||
imagecopy($identicon, $side, 0, $this->_spriteZ, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
$side = imagerotate($side, 90, $bg);
|
||||
imagecopy($identicon, $side, $this->_spriteZ, $this->_spriteZ * 2, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
$side = imagerotate($side, 90, $bg);
|
||||
imagecopy($identicon, $side, $this->_spriteZ * 2, $this->_spriteZ, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
|
||||
$center = $this->_getCenter($xsh, $cfr, $cfg, $cfb, $sfr, $sfg, $sfb, $xbg);
|
||||
imagecopy($identicon, $center, $this->_spriteZ, $this->_spriteZ, 0, 0, $this->_spriteZ, $this->_spriteZ);
|
||||
|
||||
imagecolortransparent($identicon, $bg);
|
||||
|
||||
$resized = imagecreatetruecolor($this->_width, $this->_height);
|
||||
if (function_exists('imageantialias')) {
|
||||
imageantialias($resized, TRUE);
|
||||
}
|
||||
|
||||
$bg = imagecolorallocate($resized, 255, 255, 255);
|
||||
|
||||
imagefilledrectangle($resized, 0, 0, $this->_width, $this->_height, $bg);
|
||||
|
||||
imagecopyresampled($resized, $identicon, 0, 0, (imagesx($identicon) - $this->_spriteZ * 3) / 2, (imagesx($identicon) - $this->_spriteZ * 3) / 2, $this->_width, $this->_height, $this->_spriteZ * 3, $this->_spriteZ * 3);
|
||||
|
||||
imagecolortransparent($resized, $bg);
|
||||
|
||||
if ($filter) {
|
||||
imagefilter($resized, $filter);
|
||||
}
|
||||
|
||||
ob_start();
|
||||
imagejpeg($resized, null, 100);
|
||||
imagedestroy($resized);
|
||||
return ob_get_clean();
|
||||
}
|
||||
|
||||
private function _getSprite($shape, $R, $G, $B, $rotation) {
|
||||
|
||||
$sprite = imagecreatetruecolor($this->_spriteZ, $this->_spriteZ);
|
||||
|
||||
if (function_exists('imageantialias')) {
|
||||
imageantialias($sprite, TRUE);
|
||||
}
|
||||
|
||||
$fg = imagecolorallocate($sprite, $R, $G, $B);
|
||||
$bg = imagecolorallocate($sprite, 255, 255, 255);
|
||||
|
||||
imagefilledrectangle($sprite, 0, 0, $this->_spriteZ, $this->_spriteZ, $bg);
|
||||
|
||||
switch ($shape) {
|
||||
case 0: // triangle
|
||||
$shape = array(0.5, 1, 1, 0, 1, 1);
|
||||
break;
|
||||
case 1: // parallelogram
|
||||
$shape = array(0.5, 0, 1, 0, 0.5, 1, 0, 1);
|
||||
break;
|
||||
case 2: // mouse ears
|
||||
$shape = array(0.5, 0, 1, 0, 1, 1, 0.5, 1, 1, 0.5);
|
||||
break;
|
||||
case 3: // ribbon
|
||||
$shape = array(0, 0.5, 0.5, 0, 1, 0.5, 0.5, 1, 0.5, 0.5);
|
||||
break;
|
||||
case 4: // sails
|
||||
$shape = array(0, 0.5, 1, 0, 1, 1, 0, 1, 1, 0.5);
|
||||
break;
|
||||
case 5: // fins
|
||||
$shape = array(1, 0, 1, 1, 0.5, 1, 1, 0.5, 0.5, 0.5);
|
||||
break;
|
||||
case 6: // beak
|
||||
$shape = array(0, 0, 1, 0, 1, 0.5, 0, 0, 0.5, 1, 0, 1);
|
||||
break;
|
||||
case 7: // chevron
|
||||
$shape = array(0, 0, 0.5, 0, 1, 0.5, 0.5, 1, 0, 1, 0.5, 0.5);
|
||||
break;
|
||||
case 8: // fish
|
||||
$shape = array(0.5, 0, 0.5, 0.5, 1, 0.5, 1, 1, 0.5, 1, 0.5, 0.5, 0, 0.5);
|
||||
break;
|
||||
case 9: // kite
|
||||
$shape = array(0, 0, 1, 0, 0.5, 0.5, 1, 0.5, 0.5, 1, 0.5, 0.5, 0, 1);
|
||||
break;
|
||||
case 10: // trough
|
||||
$shape = array(0, 0.5, 0.5, 1, 1, 0.5, 0.5, 0, 1, 0, 1, 1, 0, 1);
|
||||
break;
|
||||
case 11: // rays
|
||||
$shape = array(0.5, 0, 1, 0, 1, 1, 0.5, 1, 1, 0.75, 0.5, 0.5, 1, 0.25);
|
||||
break;
|
||||
case 12: // double rhombus
|
||||
$shape = array(0, 0.5, 0.5, 0, 0.5, 0.5, 1, 0, 1, 0.5, 0.5, 1, 0.5, 0.5, 0, 1);
|
||||
break;
|
||||
case 13: // crown
|
||||
$shape = array(0, 0, 1, 0, 1, 1, 0, 1, 1, 0.5, 0.5, 0.25, 0.5, 0.75, 0, 0.5, 0.5, 0.25);
|
||||
break;
|
||||
case 14: // radioactive
|
||||
$shape = array(0, 0.5, 0.5, 0.5, 0.5, 0, 1, 0, 0.5, 0.5, 1, 0.5, 0.5, 1, 0.5, 0.5, 0, 1);
|
||||
break;
|
||||
default: // tiles
|
||||
$shape = array(0, 0, 1, 0, 0.5, 0.5, 0.5, 0, 0, 0.5, 1, 0.5, 0.5, 1, 0.5, 0.5, 0, 1);
|
||||
break;
|
||||
}
|
||||
|
||||
for ($i = 0; $i < count($shape); $i++)
|
||||
$shape[$i] = $shape[$i] * $this->_spriteZ;
|
||||
imagefilledpolygon($sprite, $shape, count($shape) / 2, $fg);
|
||||
|
||||
for ($i = 0; $i < $rotation; $i++)
|
||||
$sprite = imagerotate($sprite, 90, $bg);
|
||||
|
||||
return $sprite;
|
||||
}
|
||||
|
||||
private function _getCenter($shape, $fR, $fG, $fB, $bR, $bG, $bB, $usebg) {
|
||||
$sprite = imagecreatetruecolor($this->_spriteZ, $this->_spriteZ);
|
||||
if (function_exists('imageantialias')) {
|
||||
imageantialias($sprite, TRUE);
|
||||
}
|
||||
$fg = imagecolorallocate($sprite, $fR, $fG, $fB);
|
||||
|
||||
if ($usebg > 0 && (abs($fR - $bR) > 127 || abs($fG - $bG) > 127 || abs($fB - $bB) > 127))
|
||||
$bg = imagecolorallocate($sprite, $bR, $bG, $bB); else
|
||||
$bg = imagecolorallocate($sprite, 255, 255, 255);
|
||||
imagefilledrectangle($sprite, 0, 0, $this->_spriteZ, $this->_spriteZ, $bg);
|
||||
|
||||
switch ($shape) {
|
||||
case 0: // empty
|
||||
$shape = array();
|
||||
break;
|
||||
case 1: // fill
|
||||
$shape = array(0, 0, 1, 0, 1, 1, 0, 1);
|
||||
break;
|
||||
case 2: // diamond
|
||||
$shape = array(0.5, 0, 1, 0.5, 0.5, 1, 0, 0.5);
|
||||
break;
|
||||
case 3: // reverse diamond
|
||||
$shape = array(0, 0, 1, 0, 1, 1, 0, 1, 0, 0.5, 0.5, 1, 1, 0.5, 0.5, 0, 0, 0.5);
|
||||
break;
|
||||
case 4: // cross
|
||||
$shape = array(0.25, 0, 0.75, 0, 0.5, 0.5, 1, 0.25, 1, 0.75, 0.5, 0.5, 0.75, 1, 0.25, 1, 0.5, 0.5, 0, 0.75, 0, 0.25, 0.5, 0.5);
|
||||
break;
|
||||
case 5: // morning star
|
||||
$shape = array(0, 0, 0.5, 0.25, 1, 0, 0.75, 0.5, 1, 1, 0.5, 0.75, 0, 1, 0.25, 0.5);
|
||||
break;
|
||||
case 6: // small square
|
||||
$shape = array(0.33, 0.33, 0.67, 0.33, 0.67, 0.67, 0.33, 0.67);
|
||||
break;
|
||||
case 7: // checkerboard
|
||||
$shape = array(0, 0, 0.33, 0, 0.33, 0.33, 0.66, 0.33, 0.67, 0, 1, 0, 1, 0.33, 0.67, 0.33, 0.67, 0.67, 1, 0.67, 1, 1, 0.67, 1, 0.67, 0.67, 0.33, 0.67, 0.33, 1, 0, 1, 0, 0.67, 0.33, 0.67, 0.33, 0.33, 0, 0.33);
|
||||
break;
|
||||
}
|
||||
|
||||
for ($i = 0; $i < count($shape); $i++)
|
||||
$shape[$i] = $shape[$i] * $this->_spriteZ;
|
||||
if (count($shape) > 0)
|
||||
imagefilledpolygon($sprite, $shape, count($shape) / 2, $fg);
|
||||
|
||||
return $sprite;
|
||||
}
|
||||
}
|
157
library/mysql.php
Executable file
157
library/mysql.php
Executable file
@ -0,0 +1,157 @@
|
||||
<?php
|
||||
|
||||
class MySQL {
|
||||
|
||||
public function __construct() {
|
||||
|
||||
try {
|
||||
|
||||
$this->_db = new PDO('mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';port=' . DB_PORT . ';charset=utf8', DB_USERNAME, DB_PASSWORD, [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8']);
|
||||
$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
$this->_db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
|
||||
$this->_db->setAttribute(PDO::ATTR_TIMEOUT, 600);
|
||||
|
||||
} catch(PDOException $e) {
|
||||
trigger_error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function getNamespaceName($namehash) {
|
||||
|
||||
try {
|
||||
|
||||
$query = $this->_db->prepare('SELECT `data`.`value` AS `value`
|
||||
|
||||
FROM `data`
|
||||
JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)
|
||||
|
||||
WHERE `namespace`.`hash` = ?
|
||||
AND `data`.`ns` = "1"
|
||||
AND `data`.`deleted` = "0"
|
||||
|
||||
ORDER BY `data`.`blockId` DESC
|
||||
|
||||
LIMIT 1');
|
||||
|
||||
$query->execute([$namehash]);
|
||||
|
||||
return $query->rowCount() ? $query->fetch()['value'] : [];
|
||||
|
||||
} catch(PDOException $e) {
|
||||
|
||||
trigger_error($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function getData($namehash = false, $txid = false, $search = false, $start = 0, $limit = 10) {
|
||||
|
||||
try {
|
||||
|
||||
if ($txid) {
|
||||
|
||||
$query = $this->_db->prepare('SELECT `block`.`blockId` AS `block`,
|
||||
`namespace`.`hash` AS `namehash`,
|
||||
`data`.`time` AS `time`,
|
||||
`data`.`key` AS `key`,
|
||||
`data`.`value` AS `value`,
|
||||
`data`.`txid` AS `txid`
|
||||
|
||||
FROM `data`
|
||||
JOIN `block` ON (`block`.`blockId` = `data`.`blockId`)
|
||||
JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)
|
||||
|
||||
WHERE `data`.`txid` = ?
|
||||
AND `data`.`ns` = "0"
|
||||
AND `data`.`deleted` = "0"
|
||||
|
||||
ORDER BY `block`.`blockId` DESC
|
||||
|
||||
LIMIT ' . (int) $start . ',' . (int) $limit);
|
||||
|
||||
$query->execute([$txid]);
|
||||
|
||||
} else if ($namehash) {
|
||||
|
||||
$query = $this->_db->prepare('SELECT `block`.`blockId` AS `block`,
|
||||
`namespace`.`hash` AS `namehash`,
|
||||
`data`.`time` AS `time`,
|
||||
`data`.`key` AS `key`,
|
||||
`data`.`value` AS `value`,
|
||||
`data`.`txid` AS `txid`
|
||||
|
||||
FROM `data`
|
||||
JOIN `block` ON (`block`.`blockId` = `data`.`blockId`)
|
||||
JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)
|
||||
|
||||
WHERE `namespace`.`hash` = ?
|
||||
AND `data`.`ns` = "0"
|
||||
AND `data`.`deleted` = "0"
|
||||
|
||||
ORDER BY `block`.`blockId` DESC
|
||||
|
||||
LIMIT ' . (int) $start . ',' . (int) $limit);
|
||||
|
||||
$query->execute([$namehash]);
|
||||
|
||||
} else if ($search) {
|
||||
|
||||
$query = $this->_db->prepare('SELECT `block`.`blockId` AS `block`,
|
||||
`namespace`.`hash` AS `namehash`,
|
||||
`data`.`time` AS `time`,
|
||||
`data`.`key` AS `key`,
|
||||
`data`.`value` AS `value`,
|
||||
`data`.`txid` AS `txid`
|
||||
|
||||
FROM `data`
|
||||
JOIN `block` ON (`block`.`blockId` = `data`.`blockId`)
|
||||
JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)
|
||||
|
||||
WHERE (`data`.`key` LIKE :search
|
||||
OR `data`.`value` LIKE :search
|
||||
OR `block`.`blockId` LIKE :search
|
||||
OR `namespace`.`hash` LIKE :search
|
||||
OR `data`.`txid` LIKE :search)
|
||||
|
||||
AND `data`.`ns` = "0"
|
||||
AND `data`.`deleted` = "0"
|
||||
|
||||
ORDER BY `block`.`blockId` DESC');
|
||||
|
||||
$query->bindValue(':search', '%' . $search . '%', PDO::PARAM_STR);
|
||||
|
||||
$query->execute();
|
||||
|
||||
} else {
|
||||
|
||||
$query = $this->_db->prepare('SELECT `block`.`blockId` AS `block`,
|
||||
`namespace`.`hash` AS `namehash`,
|
||||
`data`.`time` AS `time`,
|
||||
`data`.`key` AS `key`,
|
||||
`data`.`value` AS `value`,
|
||||
`data`.`txid` AS `txid`
|
||||
|
||||
FROM `data`
|
||||
JOIN `block` ON (`block`.`blockId` = `data`.`blockId`)
|
||||
JOIN `namespace` ON (`namespace`.`nameSpaceId` = `data`.`nameSpaceId`)
|
||||
|
||||
WHERE `data`.`ns` = "0"
|
||||
AND `data`.`deleted` = "0"
|
||||
|
||||
ORDER BY `block`.`blockId` DESC
|
||||
|
||||
LIMIT ' . (int) $start . ',' . (int) $limit);
|
||||
|
||||
$query->execute();
|
||||
}
|
||||
|
||||
|
||||
return $query->rowCount() ? $query->fetchAll() : [];
|
||||
|
||||
} catch(PDOException $e) {
|
||||
|
||||
trigger_error($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
199
public/css/app.css
Executable file
199
public/css/app.css
Executable file
@ -0,0 +1,199 @@
|
||||
button::-moz-focus-inner {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
margin-top:-2px;
|
||||
margin-bottom: -2px;
|
||||
}
|
||||
|
||||
* {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
input, button {
|
||||
opacity: 0.8;
|
||||
color: #5A526C;
|
||||
}
|
||||
|
||||
body {
|
||||
color: #E8E8E8;
|
||||
background-color: #000;
|
||||
font-family: Sans-Serif, Arial;
|
||||
font-size: 14px;
|
||||
font-weight: normal;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #BFBACC;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #BFBACC;
|
||||
text-decoration: none;
|
||||
-moz-transition: all .5s ease-in;
|
||||
-o-transition: all .5s ease-in;
|
||||
/* issue #2
|
||||
-webkit-transition: all .5s ease-in;
|
||||
transition: all .5s ease-in; */
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #E8E8E8;
|
||||
-webkit-transition: all .5s ease-in; /* issue #2 */
|
||||
}
|
||||
|
||||
img {
|
||||
opacity: 0.8;
|
||||
-moz-transition: all .5s ease-in;
|
||||
-o-transition: all .5s ease-in;
|
||||
-webkit-transition: all .5s ease-in;
|
||||
transition: all .5s ease-in;
|
||||
}
|
||||
|
||||
img.shine,
|
||||
img:hover {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-size: 20px;
|
||||
letter-spacing: .2em;
|
||||
margin-right:-.2em;
|
||||
}
|
||||
|
||||
.d-block {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.of-a {
|
||||
overflow: auto
|
||||
}
|
||||
|
||||
.f-s-12 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.f-s-16 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.f-s-20 {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.t-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.b-g::before {
|
||||
content: "";
|
||||
background-image: linear-gradient(to left, #9B94BF, #000);
|
||||
height: 1px;
|
||||
width: 360px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.b-g::after {
|
||||
content: "";
|
||||
background-image: linear-gradient(to right, #9B94BF, #000);
|
||||
height: 1px;
|
||||
width: 360px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.br-50 {
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.c-0,
|
||||
.c-0:active,
|
||||
.c-0:visited,
|
||||
.c-0:hover {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
.c-1,
|
||||
.c-1:active,
|
||||
.c-1:visited,
|
||||
.c-1:hover {
|
||||
color: #ABA6B7;
|
||||
}
|
||||
|
||||
.c-2,
|
||||
.c-2:active,
|
||||
.c-2:visited,
|
||||
.c-2:hover {
|
||||
color: #9ba5af;
|
||||
}
|
||||
|
||||
.cursor-pointer {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.p-8 {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
@-moz-document url-prefix() {
|
||||
.p-8 {
|
||||
padding: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.px-16 {
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
|
||||
.py-27 {
|
||||
padding-top: 27px;
|
||||
padding-bottom: 27px;
|
||||
}
|
||||
|
||||
.py-54 {
|
||||
padding-top: 54px;
|
||||
padding-bottom: 54px;
|
||||
}
|
||||
|
||||
.pt-27 {
|
||||
padding-top: 27px;
|
||||
}
|
||||
|
||||
.pt-54 {
|
||||
padding-top: 54px;
|
||||
}
|
||||
|
||||
.pb-16 {
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
|
||||
.pb-27 {
|
||||
padding-bottom: 27px;
|
||||
}
|
||||
|
||||
.pb-36 {
|
||||
padding-bottom: 36px;
|
||||
}
|
||||
|
||||
.mx-a {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.mb-16 {
|
||||
margin-bottom: 16px
|
||||
}
|
||||
|
||||
.mb-20 {
|
||||
margin-bottom: 20px
|
||||
}
|
||||
|
||||
.mb-36 {
|
||||
margin-bottom: 36px
|
||||
}
|
||||
|
||||
.mw-560 {
|
||||
max-width: 560px;
|
||||
}
|
11
public/image.php
Executable file
11
public/image.php
Executable file
@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
require_once('../library/icon.php');
|
||||
|
||||
if (isset($_GET['hash'])) {
|
||||
|
||||
$icon = new Icon();
|
||||
|
||||
header("Content-Type: image/jpeg");
|
||||
echo $icon->generateImageResource(md5($_GET['hash']), 60, 60, false);
|
||||
}
|
116
public/index.php
Executable file
116
public/index.php
Executable file
@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
require_once('../config.php');
|
||||
require_once('../library/icon.php');
|
||||
require_once('../library/mysql.php');
|
||||
|
||||
$query = isset($_GET['q']) && mb_strlen($_GET['q']) > 2 ? $_GET['q'] : false;
|
||||
$ns = isset($_GET['ns']) ? preg_replace('/[^a-zA-Z0-9]+/', '', $_GET['ns']) : false;
|
||||
$tx = isset($_GET['tx']) ? preg_replace('/[^a-zA-Z0-9]+/', '', $_GET['tx']) : false;
|
||||
$page = (int) isset($_GET['page']) ? $_GET['page'] : 0;
|
||||
|
||||
if (SEF_MODE && isset($_SERVER['QUERY_STRING'])) {
|
||||
|
||||
$q = explode('/', $_SERVER['QUERY_STRING']);
|
||||
|
||||
if (isset($q[1])) {
|
||||
if (strlen($q[1]) == 34) {
|
||||
$ns = preg_replace('/[^a-zA-Z0-9]+/', '', $q[1]);
|
||||
} else if (strlen($q[1]) > 34) {
|
||||
$tx = preg_replace('/[^a-zA-Z0-9]+/', '', $q[1]);
|
||||
} else {
|
||||
$page = (int) $q[1];
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($q[2])) {
|
||||
if (strlen($q[2]) == 34) {
|
||||
$ns = preg_replace('/[^a-zA-Z0-9]+/', '', $q[2]);
|
||||
} else {
|
||||
$page = (int) $q[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$limit = PAGE_LIMIT * $page;
|
||||
|
||||
$db = new MySQL();
|
||||
|
||||
if ($ns) {
|
||||
$namespaceValue = $db->getNamespaceName($ns);
|
||||
} else {
|
||||
$namespaceValue = false;
|
||||
}
|
||||
|
||||
$data = [];
|
||||
foreach ($db->getData($ns, $tx, $query, $limit, PAGE_LIMIT) as $value) {
|
||||
$data[] = [
|
||||
'namehash' => $value['namehash'],
|
||||
'block' => $value['block'],
|
||||
'txid' => $value['txid'],
|
||||
'time' => date('d-m-Y H:i', $value['time']),
|
||||
'key' => nl2br($value['key']),
|
||||
'value' => nl2br($value['value']),
|
||||
];
|
||||
}
|
||||
|
||||
if (SEF_MODE) {
|
||||
|
||||
if (in_array($page, [0, 1])) {
|
||||
$newer = false;
|
||||
} else {
|
||||
if ($page == 2) {
|
||||
$newer = ($ns ? $ns : '');
|
||||
} else {
|
||||
$newer = ($ns ? $ns . '/' . ($page - 1) : ($page - 1));
|
||||
}
|
||||
}
|
||||
|
||||
if ($data) {
|
||||
if (in_array($page, [0, 1])) {
|
||||
$older = ($ns ? $ns . '/2' : '/2');
|
||||
} else {
|
||||
$older = ($ns ? $ns . '/' . ($page + 1) : '/' . ($page + 1));
|
||||
}
|
||||
} else {
|
||||
$older = false;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if (in_array($page, [0, 1])) {
|
||||
$newer = false;
|
||||
} else {
|
||||
if ($page == 2) {
|
||||
$newer = ($ns ? '?ns=' . $ns : '');
|
||||
} else {
|
||||
$newer = ($ns ? '?ns=' . $ns . '&page=' . ($page - 1) : '?page=' . ($page - 1));
|
||||
}
|
||||
}
|
||||
|
||||
if ($data) {
|
||||
if (in_array($page, [0, 1])) {
|
||||
$older = ($ns ? '?ns=' . $ns . '&page=2' : '?page=2');
|
||||
} else {
|
||||
$older = ($ns ? '?ns=' . $ns . '&page=' . ($page + 1) : '?page=' . ($page + 1));
|
||||
}
|
||||
} else {
|
||||
$older = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ($ns) {
|
||||
if ($page) {
|
||||
$hrefThisPage = $ns . '/' . $page;
|
||||
} else {
|
||||
$hrefThisPage = $ns;
|
||||
}
|
||||
} else {
|
||||
if ($page) {
|
||||
$hrefThisPage = $page;
|
||||
} else {
|
||||
$hrefThisPage = '';
|
||||
}
|
||||
}
|
||||
|
||||
require_once('index.phtml');
|
98
public/index.phtml
Executable file
98
public/index.phtml
Executable file
@ -0,0 +1,98 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="/css/app.css" />
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="description" content="Open Source Content Exploring Platform for Kevacoin Blockchain" />
|
||||
<base href="<?php echo BASE_URL; ?>" />
|
||||
<?php if ($ns) { ?>
|
||||
<?php if ($page) { ?>
|
||||
<title>KVAZAR - NS - <?php echo $namespaceValue ? $namespaceValue : $ns; ?> - PART <?php echo $page; ?></title>
|
||||
<?php } else { ?>
|
||||
<title>KVAZAR - NS - <?php echo $namespaceValue ? $namespaceValue : $ns; ?></title>
|
||||
<?php } ?>
|
||||
<?php } else { ?>
|
||||
<?php if ($page) { ?>
|
||||
<title>KVAZAR - PART <?php echo $page; ?></title>
|
||||
<?php } else { ?>
|
||||
<title>KVAZAR - Observe Kevacoin Universe</title>
|
||||
<?php } ?>
|
||||
<?php } ?>
|
||||
</head>
|
||||
<body>
|
||||
<div class="t-center px-16 pt-54">
|
||||
<div class="mx-a mw-560 px-16">
|
||||
<div class="mb-20">
|
||||
<a class="logo f-s-20 c-0" href="/">KVAZAR</a>
|
||||
</div>
|
||||
<?php if ($ns) { ?>
|
||||
<div class="mx-a mw-560 px-16 pb-16">
|
||||
<img class="br-50 shine" src="image.php?hash=<?php echo $ns; ?>" alt="<?php echo $ns; ?>" />
|
||||
</div>
|
||||
<?php } ?>
|
||||
<div class="mb-36 c-1"><?php echo $namespaceValue ? $namespaceValue : 'Observe Kevacoin Universe'; ?></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="t-center px-16 pb-36">
|
||||
<div class="b-g"></div>
|
||||
</div>
|
||||
<?php foreach ($data as $item) { ?>
|
||||
<div class="t-center px-16">
|
||||
<div class="mx-a mw-560 px-16">
|
||||
<?php if (!$ns) { ?>
|
||||
<div class="mx-a mw-560 mb-16">
|
||||
<?php if (SEF_MODE) { ?>
|
||||
<a href="<?php echo $item['namehash']; ?>">
|
||||
<img class="br-50" src="image.php?hash=<?php echo $item['namehash']; ?>" alt="<?php echo $item['namehash']; ?>" />
|
||||
</a>
|
||||
<?php } else { ?>
|
||||
<a href="?ns=<?php echo $item['namehash']; ?>">
|
||||
<img class="br-50" src="image.php?hash=<?php echo $item['namehash']; ?>" alt="<?php echo $item['namehash']; ?>" />
|
||||
</a>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<?php if (!$tx) { ?>
|
||||
<a class="d-block" href="<?php echo (SEF_MODE ? $item['txid'] : '?tx=' . $item['txid']); ?>">
|
||||
<?php } ?>
|
||||
<div class="f-s-16 mb-16 of-a">
|
||||
<?php echo $item['key']; ?>
|
||||
</div>
|
||||
<div class="mb-20 of-a"><?php echo $item['value']; ?></div>
|
||||
<div class="f-s-12">
|
||||
<?php echo $item['time']; ?> in <?php echo $item['block']; ?>
|
||||
</div>
|
||||
<?php if (!$tx) { ?>
|
||||
</a>
|
||||
<?php } ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="t-center px-16 py-27">
|
||||
<div class="b-g"></div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<?php if (!$tx && ($newer !== false || $older !== false)) { ?>
|
||||
<div class="t-center pt-16 pb-27">
|
||||
<?php if ($newer !== false) { ?>
|
||||
<a href="<?php echo $newer; ?>">newer</a>
|
||||
<?php } ?>
|
||||
<?php if ($newer !== false && $older !== false) { ?>
|
||||
|
|
||||
<?php } ?>
|
||||
<?php if ($older !== false) { ?>
|
||||
<a href="<?php echo $older; ?>">older</a>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<?php } ?>
|
||||
<div class="t-center px-16 pb-27">
|
||||
<form name="namespace" action="/" method="GET">
|
||||
<input class="p-8" type="text" name="q" value="" placeholder="key, value, block, ns, txid" autocomplete="off" />
|
||||
<button class="p-8 cursor-pointer" type="submit">Search</button>
|
||||
</form>
|
||||
</div>
|
||||
<div class="t-center px-16 pb-27">
|
||||
<div class="pb-16 f-s-12 c-1"><a href="https://github.com/kvazar-network/webapp">KVAZAR Webapp</a> is the content exploring platform for <a href="https://kevacoin.org">Kevacoin Blockchain</a>.</div>
|
||||
<div class="f-s-12 c-1">Sources distributed under the MIT License. Ownership of all content belongs to the authors.</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Loading…
x
Reference in New Issue
Block a user