feat: add admin panel

This commit is contained in:
2026-06-15 20:54:05 +03:30
parent 7dadb23fbe
commit 02060a4dc0
16 changed files with 698 additions and 108 deletions
+16
View File
@@ -0,0 +1,16 @@
<!doctype html>
<html dir="rtl" lang="fa">
{{template "head" .}}
<body>
{{template "nav" .}}
<div class="wrap">
<h1>داشبورد</h1>
<div class="stats">
<div class="stat">کاربران<b>{{.Users}}</b></div>
<div class="stat">خریدهای موفق<b>{{.Purchases}}</b></div>
<div class="stat">بازی‌های ثبت‌شده<b>{{.Games}}</b></div>
<div class="stat">مجموع سکه‌ی کاربران<b>{{.Coins}}</b></div>
</div>
</div>
</body>
</html>
+38
View File
@@ -0,0 +1,38 @@
{{define "head"}}
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>حکم‌شو — پنل ادمین</title>
<style>
:root { --bg:#240108; --panel:#3a0a12; --gold:#e9b949; --text:#f5e9d0; --accent:#b81d2a; }
* { box-sizing: border-box; }
body { margin:0; background:var(--bg); color:var(--text); font-family: Tahoma, sans-serif; }
nav { background:#1a0106; padding:12px 18px; display:flex; gap:16px; border-bottom:2px solid var(--gold); }
nav a { color:#caa; text-decoration:none; font-weight:bold; padding:6px 10px; border-radius:8px; }
nav a.active, nav a:hover { color:var(--gold); background:rgba(233,185,73,.12); }
.wrap { padding:20px; max-width:1100px; margin:0 auto; }
h1 { color:var(--gold); }
h2 { color:var(--gold); border-bottom:1px solid #5a0e1a; padding-bottom:6px; margin-top:28px; }
.stats { display:flex; gap:16px; flex-wrap:wrap; }
.stat { background:var(--panel); border:1px solid #5a0e1a; border-radius:14px; padding:18px 26px; text-align:center; }
.stat b { color:var(--gold); font-size:26px; display:block; margin-top:6px; }
table { width:100%; border-collapse:collapse; background:var(--panel); border-radius:12px; overflow:hidden; }
th, td { padding:8px 10px; text-align:right; border-bottom:1px solid #5a0e1a; font-size:13px; }
th { color:var(--gold); }
input { background:#1a0106; color:var(--text); border:1px solid #6b4; border-radius:6px; padding:5px 7px; width:90px; }
input[type=text] { width:130px; }
button { background:var(--accent); color:var(--text); border:1px solid var(--gold); border-radius:8px; padding:6px 14px; font-weight:bold; cursor:pointer; }
button:hover { filter:brightness(1.15); }
.saved { background:#2e7d32; color:#fff; padding:8px 14px; border-radius:8px; display:inline-block; margin:10px 0; }
.search { margin:12px 0; }
</style>
</head>
{{end}}
{{define "nav"}}
<nav>
<a href="/admin" class="{{if eq .Nav "dashboard"}}active{{end}}">داشبورد</a>
<a href="/admin/shop" class="{{if eq .Nav "shop"}}active{{end}}">فروشگاه</a>
<a href="/admin/users" class="{{if eq .Nav "users"}}active{{end}}">کاربران</a>
</nav>
{{end}}
+96
View File
@@ -0,0 +1,96 @@
<!doctype html>
<html dir="rtl" lang="fa">
{{template "head" .}}
<body>
{{template "nav" .}}
<div class="wrap">
<h1>فروشگاه</h1>
{{if .Saved}}<div class="saved">تغییرات ذخیره شد ✓</div>{{end}}
<h2>بسته‌های سکه</h2>
<table>
<tr><th>شناسه</th><th>عنوان</th><th>سکه</th><th>VIP (روز)</th><th>قیمت (تومان)</th><th>بونوس٪</th><th>ترتیب</th><th>فعال</th><th></th></tr>
{{range .Coins}}
<tr><form method="post" action="/admin/shop/coin">
<td>{{.id}}<input type="hidden" name="id" value="{{.id}}"></td>
<td><input type="text" name="title" value="{{.title}}"></td>
<td><input name="coins" value="{{.coins}}"></td>
<td><input name="vip_days" value="{{.vip_days}}"></td>
<td><input name="price_toman" value="{{.price_toman}}"></td>
<td><input name="bonus_pct" value="{{.bonus_pct}}"></td>
<td><input name="sort" value="{{.sort}}"></td>
<td><input type="checkbox" name="enabled" {{if .enabled}}checked{{end}}></td>
<td><button>ذخیره</button></td>
</form></tr>
{{end}}
</table>
<h2>بسته‌های بلیط</h2>
<table>
<tr><th>شناسه</th><th>عنوان</th><th>بلیط</th><th>قیمت (تومان)</th><th>ترتیب</th><th>فعال</th><th></th></tr>
{{range .Tickets}}
<tr><form method="post" action="/admin/shop/ticket">
<td>{{.id}}<input type="hidden" name="id" value="{{.id}}"></td>
<td><input type="text" name="title" value="{{.title}}"></td>
<td><input name="tickets" value="{{.tickets}}"></td>
<td><input name="price_toman" value="{{.price_toman}}"></td>
<td><input name="sort" value="{{.sort}}"></td>
<td><input type="checkbox" name="enabled" {{if .enabled}}checked{{end}}></td>
<td><button>ذخیره</button></td>
</form></tr>
{{end}}
</table>
<h2>اسکین کارت‌ها</h2>
<table>
<tr><th>شناسه</th><th>عنوان</th><th>قیمت (سکه)</th><th>ترتیب</th><th>فعال</th><th></th></tr>
{{range .Cards}}
<tr><form method="post" action="/admin/shop/card">
<td>{{.id}}<input type="hidden" name="id" value="{{.id}}"></td>
<td><input type="text" name="title" value="{{.title}}"></td>
<td><input name="price_coins" value="{{.price_coins}}"></td>
<td><input name="sort" value="{{.sort}}"></td>
<td><input type="checkbox" name="enabled" {{if .enabled}}checked{{end}}></td>
<td><button>ذخیره</button></td>
</form></tr>
{{end}}
</table>
<h2>بوسترها</h2>
<table>
<tr><th>شناسه</th><th>عنوان</th><th>ضریب</th><th>ساعت</th><th>قیمت (تومان)</th><th>ترتیب</th><th>فعال</th><th></th></tr>
{{range .Boosters}}
<tr><form method="post" action="/admin/shop/booster">
<td>{{.id}}<input type="hidden" name="id" value="{{.id}}"></td>
<td><input type="text" name="title" value="{{.title}}"></td>
<td><input name="multiplier" value="{{.multiplier}}"></td>
<td><input name="hours" value="{{.hours}}"></td>
<td><input name="price_toman" value="{{.price_toman}}"></td>
<td><input name="sort" value="{{.sort}}"></td>
<td><input type="checkbox" name="enabled" {{if .enabled}}checked{{end}}></td>
<td><button>ذخیره</button></td>
</form></tr>
{{end}}
</table>
<h2>انواع میز</h2>
<table>
<tr><th>شناسه</th><th>عنوان</th><th>دست</th><th>ورودی</th><th>جایزه</th><th>XP</th><th>جام</th><th>ترتیب</th><th>فعال</th><th></th></tr>
{{range .Tiers}}
<tr><form method="post" action="/admin/shop/tier">
<td>{{.id}}<input type="hidden" name="id" value="{{.id}}"></td>
<td><input type="text" name="title" value="{{.title}}"></td>
<td><input name="hands" value="{{.hands}}"></td>
<td><input name="entry" value="{{.entry}}"></td>
<td><input name="prize" value="{{.prize}}"></td>
<td><input name="xp" value="{{.xp}}"></td>
<td><input name="trophy" value="{{.trophy}}"></td>
<td><input name="sort" value="{{.sort}}"></td>
<td><input type="checkbox" name="enabled" {{if .enabled}}checked{{end}}></td>
<td><button>ذخیره</button></td>
</form></tr>
{{end}}
</table>
</div>
</body>
</html>
+38
View File
@@ -0,0 +1,38 @@
<!doctype html>
<html dir="rtl" lang="fa">
{{template "head" .}}
<body>
{{template "nav" .}}
<div class="wrap">
<h1>کاربران</h1>
{{if .Saved}}<div class="saved">انجام شد ✓</div>{{end}}
<form class="search" method="get" action="/admin/users">
<input type="text" name="q" value="{{.Q}}" placeholder="جستجوی شماره موبایل">
<button>جستجو</button>
</form>
<table>
<tr><th>#</th><th>موبایل</th><th>سکه</th><th>بلیط</th><th>سطح</th><th>جام</th><th>ادمین</th><th>تغییر سکه (+/-)</th></tr>
{{range .Users}}
<tr>
<td>{{.ID}}</td>
<td>{{.Mobile}}</td>
<td>{{.Coins}}</td>
<td>{{.Tickets}}</td>
<td>{{.Level}}</td>
<td>{{.Trophy}}</td>
<td>{{if .IsAdmin}}✓{{end}}</td>
<td>
<form method="post" action="/admin/users/coins" style="display:flex;gap:6px">
<input type="hidden" name="user_id" value="{{.ID}}">
<input name="amount" placeholder="مثلاً 500 یا -200">
<button>اعمال</button>
</form>
</td>
</tr>
{{end}}
</table>
</div>
</body>
</html>