File manager - Edit - /home/webtrixia/democloud.webtrixia.com/users.php
Back
<?php require_once __DIR__ . '/includes/config.php'; require_once __DIR__ . '/includes/db.php'; require_once __DIR__ . '/includes/functions.php'; requireLogin(); if (!isAdmin()) redirect(APP_URL . '/dashboard.php'); $company = currentCompany(); $error = ''; $success = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (!verifyCsrf($_POST['csrf'] ?? '')) { $error = 'Невалидна заявка.'; } elseif (isset($_POST['add_user'])) { $name = trim($_POST['name'] ?? ''); $email = trim($_POST['email'] ?? ''); $pass = $_POST['password'] ?? ''; $role = in_array($_POST['role'] ?? '', ['admin','user','viewer']) ? $_POST['role'] : 'user'; if (!$name || !$email || !$pass) { $error = 'Попълнете всички полета.'; } else { $exists = DB::fetch("SELECT id FROM users WHERE email = ? AND company_id = ?", [$email, $company['id']]); if ($exists) { $error = 'Потребителят вече съществува.'; } else { $count = DB::fetch("SELECT COUNT(*) as c FROM users WHERE company_id = ?", [$company['id']])['c']; if ($count >= $company['max_users']) { $error = 'Достигнат лимит на потребителите.'; } else { DB::insert("INSERT INTO users (company_id, name, email, password, role) VALUES (?,?,?,?,?)", [$company['id'], $name, $email, password_hash($pass, PASSWORD_DEFAULT), $role]); $success = 'Потребителят е добавен.'; } } } } elseif (isset($_POST['toggle_user'])) { $uid = (int)$_POST['user_id']; $user = DB::fetch("SELECT * FROM users WHERE id = ? AND company_id = ?", [$uid, $company['id']]); if ($user && $user['id'] !== $_SESSION['user_id']) { $new = $user['status'] === 'active' ? 'suspended' : 'active'; DB::query("UPDATE users SET status = ? WHERE id = ?", [$new, $uid]); $success = 'Статусът е обновен.'; } } elseif (isset($_POST['delete_user'])) { $uid = (int)$_POST['user_id']; if ($uid !== $_SESSION['user_id']) { DB::query("DELETE FROM users WHERE id = ? AND company_id = ?", [$uid, $company['id']]); $success = 'Потребителят е изтрит.'; } } } $users = DB::fetchAll("SELECT * FROM users WHERE company_id = ? ORDER BY role DESC, name ASC", [$company['id']]); $user_me = currentUser(); ?> <!DOCTYPE html> <html lang="bg"> <head> <meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Потребители — <?= APP_NAME ?></title> <link href="https://fonts.googleapis.com/css2?family=Unbounded:wght@600&family=DM+Sans:wght@400;500&display=swap" rel="stylesheet"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/dist/tabler-icons.min.css"> <style> *{box-sizing:border-box;margin:0;padding:0}:root{--bg:#0d0f14;--s:#161921;--s2:#1e2230;--b:#252a3a;--a:#4f8fff;--t:#eaedf5;--m:#6b748f;--gr:#3ecf8e;--re:#f87171} body{font-family:'DM Sans',sans-serif;background:var(--bg);color:var(--t);min-height:100vh} .header{background:var(--s);border-bottom:1px solid var(--b);padding:13px 24px;display:flex;align-items:center;gap:12px} .logo{font-family:'Unbounded',sans-serif;font-size:12px;font-weight:600;background:linear-gradient(135deg,#fff,#a8bfff);-webkit-background-clip:text;-webkit-text-fill-color:transparent} .main{max-width:860px;margin:0 auto;padding:28px 20px} h2{font-family:'Unbounded',sans-serif;font-size:15px;margin-bottom:20px} .alert{padding:11px 14px;border-radius:8px;font-size:13px;margin-bottom:16px} .alert-s{background:rgba(62,207,142,0.08);border:1px solid rgba(62,207,142,0.2);color:var(--gr)} .alert-e{background:rgba(248,113,113,0.08);border:1px solid rgba(248,113,113,0.2);color:var(--re)} .panel{background:var(--s);border:1px solid var(--b);border-radius:12px;overflow:hidden;margin-bottom:20px} .panel-hdr{padding:13px 18px;border-bottom:1px solid var(--b);display:flex;align-items:center;gap:10px;font-size:13px;font-weight:500} .table{width:100%;border-collapse:collapse} .table th{font-size:10px;text-transform:uppercase;letter-spacing:0.7px;color:var(--m);padding:9px 18px;text-align:left;background:var(--s2)} .table td{padding:12px 18px;border-top:1px solid var(--b);font-size:13px;vertical-align:middle} .avatar{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0} .badge{font-size:10px;padding:2px 8px;border-radius:5px;font-weight:600} .b-admin{background:rgba(79,143,255,0.12);color:var(--a)} .b-user{background:rgba(62,207,142,0.12);color:var(--gr)} .b-viewer{background:rgba(107,116,143,0.15);color:var(--m)} .b-active{background:rgba(62,207,142,0.12);color:var(--gr)} .b-suspended{background:rgba(248,113,113,0.12);color:var(--re)} .btn{display:inline-flex;align-items:center;gap:5px;padding:6px 12px;border-radius:7px;border:none;cursor:pointer;font-size:12px;font-family:inherit;font-weight:500;transition:all 0.15s} .btn-primary{background:var(--a);color:#fff} .btn-warn{background:rgba(251,191,36,0.1);color:#fbbf24;border:1px solid rgba(251,191,36,0.2)} .btn-danger{background:rgba(248,113,113,0.1);color:var(--re);border:1px solid rgba(248,113,113,0.2)} label{font-size:11px;color:var(--m);display:block;margin-bottom:5px;margin-top:12px;font-weight:500} input,select{width:100%;background:var(--s2);border:1px solid var(--b);border-radius:8px;padding:9px 12px;color:var(--t);font-size:13px;font-family:inherit;outline:none;margin-bottom:2px} input:focus,select:focus{border-color:var(--a)} .grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px} </style> </head> <body> <div class="header"> <a href="<?= APP_URL ?>/dashboard.php" style="text-decoration:none;color:var(--m)"><i class="ti ti-arrow-left" style="font-size:16px"></i></a> <div class="logo">☁ <?= APP_NAME ?></div> <span style="color:var(--b)">|</span> <span style="font-size:13px;color:var(--m)"><?= e($company['name']) ?></span> </div> <div class="main"> <h2><i class="ti ti-users" style="font-size:16px;vertical-align:-2px;margin-right:6px;color:var(--a)"></i>Управление на потребители</h2> <?php if($error): ?><div class="alert alert-e"><?= e($error) ?></div><?php endif; ?> <?php if($success): ?><div class="alert alert-s"><?= e($success) ?></div><?php endif; ?> <div class="panel"> <div class="panel-hdr"><i class="ti ti-users" style="font-size:15px"></i> Потребители (<?= count($users) ?> / <?= $company['max_users'] ?>)</div> <table class="table"> <thead><tr><th>Потребител</th><th>Email</th><th>Роля</th><th>Последен вход</th><th>Статус</th><th>Действия</th></tr></thead> <tbody> <?php foreach ($users as $u): $colors = ['admin'=>'rgba(79,143,255,0.15)','user'=>'rgba(62,207,142,0.15)','viewer'=>'rgba(107,116,143,0.15)']; $tcolor = ['admin'=>'var(--a)','user'=>'var(--gr)','viewer'=>'var(--m)']; ?> <tr> <td><div style="display:flex;align-items:center;gap:9px"> <div class="avatar" style="background:<?= $colors[$u['role']] ?? $colors['user'] ?>;color:<?= $tcolor[$u['role']] ?? $tcolor['user'] ?>"><?= strtoupper(mb_substr($u['name'],0,1,'UTF-8')) ?></div> <span style="font-weight:500"><?= e($u['name']) ?></span> <?php if ($u['id'] === $_SESSION['user_id']): ?><span style="font-size:10px;color:var(--m)">(вие)</span><?php endif; ?> </div></td> <td style="color:var(--m)"><?= e($u['email']) ?></td> <td><span class="badge b-<?= $u['role'] ?>"><?= ['admin'=>'Администратор','user'=>'Потребител','viewer'=>'Наблюдател'][$u['role']] ?></span></td> <td style="color:var(--m);font-size:12px"><?= $u['last_login'] ? date('d.m.Y H:i', strtotime($u['last_login'])) : '—' ?></td> <td><span class="badge b-<?= $u['status'] ?>"><?= $u['status'] === 'active' ? 'Активен' : 'Спрян' ?></span></td> <td> <?php if ($u['id'] !== $_SESSION['user_id']): ?> <div style="display:flex;gap:5px"> <form method="POST" style="display:inline"> <input type="hidden" name="csrf" value="<?= csrfToken() ?>"> <input type="hidden" name="toggle_user" value="1"> <input type="hidden" name="user_id" value="<?= $u['id'] ?>"> <button class="btn btn-warn" type="submit"><?= $u['status']==='active' ? 'Спри' : 'Активирай' ?></button> </form> <form method="POST" style="display:inline" onsubmit="return confirm('Изтриване?')"> <input type="hidden" name="csrf" value="<?= csrfToken() ?>"> <input type="hidden" name="delete_user" value="1"> <input type="hidden" name="user_id" value="<?= $u['id'] ?>"> <button class="btn btn-danger" type="submit"><i class="ti ti-trash"></i></button> </form> </div> <?php endif; ?> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> <div class="panel"> <div class="panel-hdr"><i class="ti ti-user-plus" style="font-size:15px"></i> Добавяне на нов потребител</div> <div style="padding:20px"> <form method="POST"> <input type="hidden" name="csrf" value="<?= csrfToken() ?>"> <input type="hidden" name="add_user" value="1"> <div class="grid2"> <div><label>Пълно име</label><input name="name" placeholder="Иван Петров" required></div> <div><label>Email адрес</label><input name="email" type="email" placeholder="ivan@firma.bg" required></div> </div> <div class="grid2"> <div><label>Парола</label><input name="password" type="password" placeholder="мин. 6 символа" required minlength="6"></div> <div><label>Роля</label> <select name="role"> <option value="user">Потребител</option> <option value="admin">Администратор</option> <option value="viewer">Наблюдател (само четене)</option> </select> </div> </div> <button class="btn btn-primary" type="submit" style="margin-top:16px"><i class="ti ti-user-plus"></i> Добави потребител</button> </form> </div> </div> </div> </body> </html>
| ver. 1.4 |
Github
|
.
| PHP 8.2.31 | Generation time: 0.01 |
proxy
|
phpinfo
|
Settings