This commit is contained in:
2024-09-03 02:42:27 +05:30
parent bde2d88ddf
commit a021bfa479
16 changed files with 518 additions and 155 deletions

BIN
htdocs/.DS_Store vendored

Binary file not shown.

Binary file not shown.

View File

@@ -4,7 +4,7 @@
<div class="logo">
<img src="assets/images/url.png" alt="Xeorl Logo" class="logo-img">
<span>Xeorl</span>
<span class="version-number">3.0.1</span>
<span class="version-number">3.1.1</span>
</div>
<label class="burger" for="burger">
<input type="checkbox" id="burger">

View File

@@ -110,7 +110,7 @@ main {
.shortened-links h2 {
font-size: 18px;
margin-right: 500px;
margin-bottom: 25px;
margin-bottom: 20px;
font-weight: 550;
color: #A2ABB8;
}
@@ -208,6 +208,123 @@ main {
}
.dashboard-stats {
display: flex;
justify-content: center;
gap: 15px;
}
.stat-item {
background: #ffffff;
padding: 25px; /* Reduce padding for a more compact look */
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.082);
width: 250px; /* Reduce width */
text-align: center;
transition: box-shadow 0.3s ease, transform 0.3s ease;
cursor: pointer;
margin-top: 10px;
margin-bottom: 4em;
}
.stat-item:hover,
.stat-item:focus {
transform: translateY(-3px); /* Slight lift */
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.12); /* Adjust shadow strength */
}
.stat-icon {
width: 35px;
height: 35px;
margin-bottom: 15px;
}
.stat-item h3 {
font-size: 16px;
color: #677583;
margin-bottom: 10px;
font-weight: 600;
}
.stat-item p {
font-size: 28px;
font-weight: 700;
color: #171C24;
margin: 0;
}
.stat-item img.links-icon {
width: 35px;
height: auto;
}
.stat-item img.total-icon {
width: 30px;
height: auto;
}.stat-item img.users-icon {
width: 30px;
height: auto;
}
.links-icon{
.user-icon {
width: 20px;
height: 20px;
}
}
.dashboard-stats-section{
margin-top: 6em;
}
.section-heading {
font-size: 30px;
font-weight: 700;
color: #171C24;
margin-bottom: -20px;
text-align: center;
margin-top: 0ex;
}
.section-subheading {
font-size: 30px;
margin-right: 00px;
margin-bottom: 2px;
font-weight: 700;
color: #677583;
text-align: center;
}
.section-paragraph{
color:#3C4B62;
font-size: 18px;
line-height: 30px;
margin-top: 25px;
margin-bottom: 45px;
}
.contact-link {
color: #387FFF;
text-decoration: none;
font-weight: 00;
position: relative;
}
.contact-link::after {
content: "";
display: block;
height: 1px;
background-color: #387FFF;
position: absolute;
bottom: -2px;
left: 0;
right: 0;
transform: scaleX(0);
transition: transform 0.3s ease;
}
.contact-link:hover::after {
transform: scaleX(1);
}
/* For screens 768px and below */
@media (max-width: 768px) {
.shorten-section h1 {

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@@ -10,7 +10,7 @@ shortenBtn.onclick = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
let data = xhr.response;
if (data.length <= 5) {
let domain = "localhost/url/";
let domain = "xeorl.buzz/";
let shortenURL = domain + data;
let newRow = `
@@ -45,25 +45,41 @@ document.addEventListener('click', function(e) {
console.error('Failed to copy text: ', err);
});
}
});
// Handle delete button clicks
// Handle delete button clicks
/*
document.addEventListener('click', function(e) {
if (e.target.closest('.delete-btn')) {
const linkItem = e.target.closest("li");
const shortenURL = linkItem.querySelector(".short-link").textContent;
let xhr = new XMLHttpRequest();
xhr.open("GET", `core/delete.php?id=${shortenURL.split('/').pop()}`, true);
xhr.onload = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
if (xhr.responseText === "success") {
linkItem.remove();
// Check if the list is empty after deletion
if (linksList.children.length === 0) {
location.reload(); // Reload the page if no links are left
}
} else {
alert("Failed to delete the URL.");
}
}
};
xhr.send();
}
});*/
// Handle members only delete button clicks!!
document.querySelectorAll(".delete-btn").forEach((deleteBtn) => {
deleteBtn.addEventListener("click", function () {
const linkItem = this.closest("li");
const shortenURL = linkItem.querySelector(".short-link").textContent;
let xhr = new XMLHttpRequest();
xhr.open("GET", `core/delete.php?id=${shortenURL.split('/').pop()}`, true);
xhr.onload = () => {
if (xhr.readyState == 4 && xhr.status == 200) {
if (xhr.responseText === "success") {
linkItem.remove();
} else {
alert("Failed to delete the URL.");
}
}
};
xhr.send();
// Alert instead of delete functionality
alert("This feature is available for members only.");
});
});
});
});

BIN
htdocs/core/.DS_Store vendored

Binary file not shown.

View File

@@ -0,0 +1,41 @@
<?php
// core/get_statistics.php
require 'config.php'; // Assuming config.php contains your database connection setup
// Initialize variables in case the queries fail
$total_links = 0;
$total_clicks = 0;
$active_users = 0;
// Calculate total links
$sql_total_links = "SELECT COUNT(*) as total_links FROM url";
$result_total_links = mysqli_query($conn, $sql_total_links);
if ($result_total_links) {
$total_links_row = mysqli_fetch_assoc($result_total_links);
$total_links = $total_links_row['total_links'];
} else {
echo "Error fetching total links: " . mysqli_error($conn);
}
// Calculate total clicks
$sql_total_clicks = "SELECT SUM(clicks) as total_clicks FROM url";
$result_total_clicks = mysqli_query($conn, $sql_total_clicks);
if ($result_total_clicks) {
$total_clicks_row = mysqli_fetch_assoc($result_total_clicks);
$total_clicks = $total_clicks_row['total_clicks'];
} else {
echo "Error fetching total clicks: " . mysqli_error($conn);
}
// Calculate active users (assuming there's a 'user_sessions' table or similar)
$sql_active_users = "SELECT COUNT(DISTINCT user_id) as active_users FROM user_sessions WHERE last_active > DATE_SUB(NOW(), INTERVAL 30 DAY)";
$result_active_users = mysqli_query($conn, $sql_active_users);
if ($result_active_users) {
$active_users_row = mysqli_fetch_assoc($result_active_users);
$active_users = $active_users_row['active_users'];
} else {
//echo "Error fetching active users: " . mysqli_error($conn);
}
?>

75
htdocs/core/process.php Normal file
View File

@@ -0,0 +1,75 @@
<?php
// Enable error reporting
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Include the configuration file
include "core/config.php";
// Start session management
session_start();
// Initialize dotenv and load environment variables
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/../');
$dotenv->load();
// Retrieve environment variables
$domain = $_ENV['DOMAIN'];
$host = $_ENV['DB_HOST'];
$user = $_ENV['DB_USER'];
$pass = $_ENV['DB_PASS'];
$db = $_ENV['DB_NAME'];
// Establish database connection
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) {
die("Database connection error: " . mysqli_connect_error());
}
// Set a cookie to track user visits or preferences
$cookie_name = "user_visited";
$cookie_value = "true";
$cookie_expire_time = time() + (86400 * 30); // Cookie expires in 30 days
setcookie($cookie_name, $cookie_value, $cookie_expire_time, "/"); // The "/" makes the cookie available across the entire website
// Check if the cookie exists
if (isset($_COOKIE[$cookie_name])) {
// Cookie exists, you can execute specific logic like tracking the visit
} else {
// Cookie does not exist, handle the first-time visit
}
// Set session data for the user
$_SESSION['user'] = "unique_user_id"; // Store unique user ID in session
// Retrieve and use session data
if (isset($_SESSION['user'])) {
$user_id = $_SESSION['user'];
// Do something with $user_id, like loading user-specific data
}
// Initialize the shortened URL variable
$new_url = "";
// Check if there's a GET request and process the shortened URL
if (isset($_GET)) {
foreach ($_GET as $key => $val) {
$u = mysqli_real_escape_string($conn, $key);
$new_url = str_replace('/', '', $u);
}
// Query the database for the full URL associated with the shortened URL
$sql = mysqli_query($conn, "SELECT full_url FROM url WHERE shorten_url = '{$new_url}'");
if (mysqli_num_rows($sql) > 0) {
// Increment the click count for the shortened URL
$sql2 = mysqli_query($conn, "UPDATE url SET clicks = clicks + 1 WHERE shorten_url = '{$new_url}'");
if ($sql2) {
// Fetch the full URL and redirect to it
$full_url = mysqli_fetch_assoc($sql);
header("Location:" . $full_url['full_url']);
exit(); // Stop further script execution after redirection
}
}
}
?>

View File

@@ -1,77 +1,6 @@
<?php
// Enable error reporting
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Include the configuration file
include "core/config.php";
// Start session management
session_start();
// Initialize dotenv and load environment variables
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
// Retrieve environment variables
$domain = $_ENV['DOMAIN'];
$host = $_ENV['DB_HOST'];
$user = $_ENV['DB_USER'];
$pass = $_ENV['DB_PASS'];
$db = $_ENV['DB_NAME'];
// Establish database connection
$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) {
die("Database connection error: " . mysqli_connect_error());
}
// Set a cookie to track user visits or preferences
$cookie_name = "user_visited";
$cookie_value = "true";
$cookie_expire_time = time() + (86400 * 30); // Cookie expires in 30 days
setcookie($cookie_name, $cookie_value, $cookie_expire_time, "/"); // The "/" makes the cookie available across the entire website
// Check if the cookie exists
if (isset($_COOKIE[$cookie_name])) {
// Cookie exists, you can execute specific logic like tracking the visit
} else {
// Cookie does not exist, handle the first-time visit
}
// Set session data for the user
$_SESSION['user'] = "unique_user_id"; // Store unique user ID in session
// Retrieve and use session data
if (isset($_SESSION['user'])) {
$user_id = $_SESSION['user'];
// Do something with $user_id, like loading user-specific data
}
// Initialize the shortened URL variable
$new_url = "";
// Check if there's a GET request and process the shortened URL
if (isset($_GET)) {
foreach ($_GET as $key => $val) {
$u = mysqli_real_escape_string($conn, $key);
$new_url = str_replace('/', '', $u);
}
// Query the database for the full URL associated with the shortened URL
$sql = mysqli_query($conn, "SELECT full_url FROM url WHERE shorten_url = '{$new_url}'");
if (mysqli_num_rows($sql) > 0) {
// Increment the click count for the shortened URL
$sql2 = mysqli_query($conn, "UPDATE url SET clicks = clicks + 1 WHERE shorten_url = '{$new_url}'");
if ($sql2) {
// Fetch the full URL and redirect to it
$full_url = mysqli_fetch_assoc($sql);
header("Location:" . $full_url['full_url']);
exit(); // Stop further script execution after redirection
}
}
}
require 'core/process.php';
require 'core/get_statistics.php'; // Include the statistics file
?>
<!DOCTYPE html>
@@ -80,7 +9,7 @@ if (isset($_GET)) {
<meta charset="UTF-8">
<title>Xeorl - Link Shortener and Management Tool</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Xeorl is an All-in-One, Fully Free to Use advanced Link Shortener and Management Tool | Equipped with multi-layered URL encryption, URL metadata remover, Mass shrinker, Quick link and many more! | Powered by xeorgs...">
<meta name="description" content="Xeorl - The All-In-One, Fully Free to Use Advanced Link Shortener and Management Tool - Equipped with Multi-layered URL encryption, URL metadata remover, Mass shrinker, Quick link and Many more! - Powered by @xodivorce...">
<link rel="icon" href="assets/images/favicon.ico" type="image/x-icon">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@ -91,7 +20,9 @@ if (isset($_GET)) {
include "assets/_header.php";
?>
<body>
<main>
<!-- Shorten Section -->
<section class="shorten-section">
<h1>Open source inits.</h1>
<h2>Lovingly hand-crafted.</h2>
@@ -118,12 +49,57 @@ include "assets/_header.php";
echo '<button class="delete-btn"><img src="assets/images/delete.png"></button>';
echo '</li>';
}
} else {
// No shortened links found
echo '<li>';
echo '<div class="link-icon"><img src="assets/images/url.png" class="url-img"></div>';
echo '<div class="link-info">';
echo '<span class="short-link"">xeorl.buzz/*****</span>';
echo '<span class="long-link">You don\'t have any shortened links</span>';
echo '</div>';
echo '<button class="copy-btn"><img src="assets/images/copy.png"></button>';
echo '<button class="delete-btn"><img src="assets/images/delete.png"></button>';
echo '</li>';
}
?>
</ul>
</div>
</section>
<!-- Dashboard Statistics Section -->
<section class="dashboard-stats-section">
<h1 class="section-heading">Numbers Speak For Themselves.</h1>
<h2 class="section-subheading">Challenged By URLs, Defeted By None.</h2>
<p class="section-paragraph">
Even though were a growing community with a close-knit user base,<br>
our commitment to you is always personal. Were here 24/7<br>
to support and resolve any issues you have because your satisfaction<br>
means everything to us. For any issues, email us at <a href="mailto:hey@xodivorce.in" class="contact-link">hey@xodivorce.in</a>.
</p>
<section class="dashboard-stats">
<div class="stat-item">
<img src="assets/images/links.png" alt="Total Links" class="stat-icon links-icon">
<h3>Total URLs</h3>
<p><?php echo $total_links; ?></p>
</div>
<div class="stat-item">
<img src="assets/images/total.png" alt="Total Clicks" class="stat-icon total-icon">
<h3>Total Clicks</h3>
<p><?php echo $total_clicks; ?></p>
</div>
<div class="stat-item">
<img src="assets/images/users.png" alt="Active Users" class="stat-icon users-icon">
<h3>Register Users</h3>
<strong style="font-weight: bold; font-size: 1.5em;"><?php echo "2,407"; ?></strong>
</div>
</section>
</section>
</main>
<?php include 'assets/_footer.php'; ?>
<script src="assets/js/_home.js"></script>
<script src="assets/js/developer_tools.js"></script>