61 lines
9.4 KiB
PHP
Executable File
61 lines
9.4 KiB
PHP
Executable File
<?php
|
|
$pdo=new PDO("pgsql:host=localhost;dbname=adx_system","admin","admin123");
|
|
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
|
|
$pdo->exec("DROP TABLE IF EXISTS wevads_permissions CASCADE");
|
|
$pdo->exec("DROP TABLE IF EXISTS wevads_users CASCADE");
|
|
$pdo->exec("DROP TABLE IF EXISTS wevads_roles CASCADE");
|
|
$pdo->exec("DROP TABLE IF EXISTS wevads_menus CASCADE");
|
|
$pdo->exec("CREATE TABLE wevads_roles(id SERIAL PRIMARY KEY,role_name VARCHAR(100) UNIQUE,description TEXT,is_system BOOLEAN DEFAULT false)");
|
|
$pdo->exec("CREATE TABLE wevads_users(id SERIAL PRIMARY KEY,username VARCHAR(100) UNIQUE,password_hash VARCHAR(255),email VARCHAR(255),full_name VARCHAR(255),role VARCHAR(50) DEFAULT 'user',is_active BOOLEAN DEFAULT true,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)");
|
|
$pdo->exec("CREATE TABLE wevads_menus(id SERIAL PRIMARY KEY,menu_key VARCHAR(100) UNIQUE,menu_name VARCHAR(255),menu_url VARCHAR(500),menu_order INT DEFAULT 0)");
|
|
$pdo->exec("CREATE TABLE wevads_permissions(id SERIAL PRIMARY KEY,role_id INT,menu_id INT,can_view BOOLEAN DEFAULT false,can_edit BOOLEAN DEFAULT false,can_delete BOOLEAN DEFAULT false,UNIQUE(role_id,menu_id))");
|
|
$pdo->exec("INSERT INTO wevads_roles(role_name,description,is_system) VALUES('CEO','Full access',true),('Admin','Administration',true),('Manager','Management',false),('Operator','Operations',false),('Viewer','View only',false)");
|
|
$msg='';
|
|
if($_POST){
|
|
$act=$_POST['action']??'';
|
|
if($act=='add_user'){$pdo->prepare("INSERT INTO wevads_users(username,password_hash,email,full_name,role) VALUES(?,?,?,?,?)")->execute([$_POST['username'],password_hash($_POST['password'],PASSWORD_DEFAULT),$_POST['email'],$_POST['full_name'],$_POST['role']]);$msg='User created!';}
|
|
if($act=='add_role'){$pdo->prepare("INSERT INTO wevads_roles(role_name,description,is_system) VALUES(?,?,false)")->execute([$_POST['role_name'],$_POST['description']]);$msg='Role created!';}
|
|
if($act=='del_user'){$pdo->prepare("DELETE FROM wevads_users WHERE id=?")->execute([$_POST['id']]);$msg='User deleted!';}
|
|
if($act=='save_perms'){$pdo->prepare("DELETE FROM wevads_permissions WHERE role_id=?")->execute([$_POST['role_id']]);foreach($_POST['perm']??[] as $mid=>$p){$pdo->prepare("INSERT INTO wevads_permissions(role_id,menu_id,can_view,can_edit,can_delete) VALUES(?,?,?,?,?)")->execute([$_POST['role_id'],$mid,isset($p['v']),isset($p['e']),isset($p['d'])]);} $msg='Permissions saved!';}
|
|
}
|
|
$roles=$pdo->query("SELECT * FROM wevads_roles ORDER BY is_system DESC,role_name")->fetchAll(PDO::FETCH_ASSOC);
|
|
$users=$pdo->query("SELECT * FROM wevads_users ORDER BY id DESC")->fetchAll(PDO::FETCH_ASSOC);
|
|
$menus=$pdo->query("SELECT * FROM wevads_menus ORDER BY menu_order")->fetchAll(PDO::FETCH_ASSOC);
|
|
$sel=$_GET['role']??($roles[0]['id']??0);
|
|
$perms=[];foreach($pdo->query("SELECT * FROM wevads_permissions WHERE role_id=$sel")->fetchAll(PDO::FETCH_ASSOC) as $p)$perms[$p['menu_id']]=$p;
|
|
?><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Permissions</title>
|
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
|
|
<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui;background:#f0f4f8;min-height:100vh}.header{background:linear-gradient(135deg,#1e3a5f,#2d5a87);padding:20px;color:#fff}.container{max-width:1400px;margin:0 auto;padding:20px}.tabs{display:flex;gap:8px;margin-bottom:20px}.tab{padding:12px 20px;background:#fff;border:none;border-radius:8px;cursor:pointer}.tab.active{background:#0891b2;color:#fff}.panel{display:none;background:#fff;border-radius:12px;padding:20px}.panel.active{display:block}.grid{display:grid;grid-template-columns:300px 1fr;gap:20px}.card{background:#fff;border-radius:12px;padding:20px;margin-bottom:20px;box-shadow:0 2px 10px rgba(0,0,0,.08)}table{width:100%;border-collapse:collapse}th,td{padding:12px;text-align:left;border-bottom:1px solid #eee}th{background:#f8fafc;font-size:12px;color:#64748b}.form-group{margin-bottom:15px}.form-group label{display:block;font-size:13px;font-weight:600;margin-bottom:5px}.form-group input,.form-group select,.form-group textarea{width:100%;padding:10px;border:2px solid #e2e8f0;border-radius:8px}.btn{padding:10px 20px;border:none;border-radius:8px;cursor:pointer;font-weight:600}.btn-primary{background:#0891b2;color:#fff}.btn-success{background:#10b981;color:#fff}.btn-danger{background:#ef4444;color:#fff}.btn-sm{padding:6px 12px;font-size:12px}.alert{padding:12px;border-radius:8px;margin-bottom:15px;background:#d1fae5;color:#065f46}.role-item{display:block;padding:12px;border-radius:8px;margin-bottom:6px;text-decoration:none;color:#475569}.role-item:hover{background:#f1f5f9}.role-item.active{background:#0891b2;color:#fff}.badge{padding:4px 10px;border-radius:12px;font-size:11px}.badge-green{background:#d1fae5;color:#065f46}.badge-blue{background:#dbeafe;color:#1d4ed8}input[type=checkbox]{width:18px;height:18px;accent-color:#0891b2}</style>
|
|
</head>
|
|
<body><div class="header"><h1><i class="fas fa-shield-alt"></i> Admin Permissions</h1></div>
|
|
<div class="container">
|
|
<?php if($msg):?><div class="alert"><?=$msg?></div><?php endif;?>
|
|
<div class="tabs"><button class="tab active" onclick="showTab(0)"><i class="fas fa-lock"></i> Permissions</button><button class="tab" onclick="showTab(1)"><i class="fas fa-users"></i> Users</button><button class="tab" onclick="showTab(2)"><i class="fas fa-user-tag"></i> Roles</button></div>
|
|
<div class="panel active" id="p0"><div class="grid"><div class="card"><h3 style="margin-bottom:15px">Roles</h3>
|
|
<?php foreach($roles as $r):?><a href="?role=<?=$r['id']?>" class="role-item <?=$r['id']==$sel?'active':''?>"><i class="fas fa-<?=$r['is_system']?'crown':'user-shield'?>"></i> <?=$r['role_name']?></a><?php endforeach;?></div>
|
|
<div class="card"><form method="POST"><input type="hidden" name="action" value="save_perms"><input type="hidden" name="role_id" value="<?=$sel?>">
|
|
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:15px"><h3>Menu Permissions</h3><button type="submit" class="btn btn-primary"><i class="fas fa-save"></i> Save</button></div>
|
|
<table><tr><th>Menu</th><th>View</th><th>Edit</th><th>Delete</th></tr>
|
|
<?php foreach($menus as $m):$p=$perms[$m['id']]??[];?><tr><td><?=$m['menu_name']?></td><td><input type="checkbox" name="perm[<?=$m['id']?>][v]" <?=($p['can_view']??0)?'checked':''?>></td><td><input type="checkbox" name="perm[<?=$m['id']?>][e]" <?=($p['can_edit']??0)?'checked':''?>></td><td><input type="checkbox" name="perm[<?=$m['id']?>][d]" <?=($p['can_delete']??0)?'checked':''?>></td></tr><?php endforeach;?>
|
|
<?php if(empty($menus)):?><tr><td colspan="4" style="text-align:center;color:#999">No menus defined</td></tr><?php endif;?></table></form></div></div></div>
|
|
<div class="panel" id="p1"><div class="grid"><div class="card"><h3 style="margin-bottom:15px">New User</h3><form method="POST"><input type="hidden" name="action" value="add_user">
|
|
<div class="form-group"><label>Username</label><input name="username" required></div>
|
|
<div class="form-group"><label>Password</label><input type="password" name="password" required></div>
|
|
<div class="form-group"><label>Email</label><input type="email" name="email"></div>
|
|
<div class="form-group"><label>Full Name</label><input name="full_name"></div>
|
|
<div class="form-group"><label>Role</label><select name="role"><?php foreach($roles as $r):?><option><?=$r['role_name']?></option><?php endforeach;?></select></div>
|
|
<button class="btn btn-success" style="width:100%"><i class="fas fa-plus"></i> Create User</button></form></div>
|
|
<div class="card"><h3 style="margin-bottom:15px">Users</h3><table><tr><th>User</th><th>Email</th><th>Role</th><th>Actions</th></tr>
|
|
<?php foreach($users as $u):?><tr><td><strong><?=$u['username']?></strong><br><small style="color:#64748b"><?=$u['full_name']?></small></td><td><?=$u['email']?:'-'?></td><td><span class="badge badge-blue"><?=$u['role']?></span></td><td><form method="POST" style="display:inline" onsubmit="return confirm('Delete?')"><input type="hidden" name="action" value="del_user"><input type="hidden" name="id" value="<?=$u['id']?>"><button class="btn btn-danger btn-sm"><i class="fas fa-trash"></i></button></form></td></tr><?php endforeach;?>
|
|
<?php if(empty($users)):?><tr><td colspan="4" style="text-align:center;color:#999">No users</td></tr><?php endif;?></table></div></div></div>
|
|
<div class="panel" id="p2"><div class="grid"><div class="card"><h3 style="margin-bottom:15px">New Role</h3><form method="POST"><input type="hidden" name="action" value="add_role">
|
|
<div class="form-group"><label>Role Name</label><input name="role_name" required></div>
|
|
<div class="form-group"><label>Description</label><textarea name="description" rows="3"></textarea></div>
|
|
<button class="btn btn-success" style="width:100%"><i class="fas fa-plus"></i> Create Role</button></form></div>
|
|
<div class="card"><h3 style="margin-bottom:15px">Existing Roles</h3>
|
|
<?php foreach($roles as $r):?><div style="padding:15px;background:#f8fafc;border-radius:10px;margin-bottom:10px"><strong><?=$r['role_name']?></strong><?php if($r['is_system']):?> <span class="badge badge-green">System</span><?php endif;?><p style="color:#64748b;font-size:13px;margin-top:5px"><?=$r['description']?></p></div><?php endforeach;?></div></div></div>
|
|
</div>
|
|
<script>function showTab(n){document.querySelectorAll('.tab').forEach((t,i)=>{t.classList.toggle('active',i==n)});document.querySelectorAll('.panel').forEach((p,i)=>{p.classList.toggle('active',i==n)})}</script><?php include("includes/chatbot-widget.php"); ?>
|
|
|
|
</body></html>
|