coupon/includes/functions.php

106 lines
3.9 KiB
PHP
Executable File

<?php
function h(?string $str): string {
return htmlspecialchars($str ?? '', ENT_QUOTES, 'UTF-8');
}
function redirect(string $url): void {
header("Location: $url");
exit;
}
function csrfToken(): string {
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
return $_SESSION['csrf_token'];
}
function verifyCsrf(string $token): bool {
return hash_equals($_SESSION['csrf_token'] ?? '', $token);
}
function statusBadge(int $status): string {
switch ($status) {
case 1: return '<span class="badge badge-warning">未使用</span>';
case 2: return '<span class="badge badge-success">已使用</span>';
case 3: return '<span class="badge badge-danger">已过期</span>';
default: return '<span class="badge">未知</span>';
}
}
function claimStatusBadge(int $status): string {
switch ($status) {
case 1: return '<span class="badge badge-info">未领取</span>';
case 2: return '<span class="badge badge-success">已领取</span>';
default: return '<span class="badge">未知</span>';
}
}
function workOrderStatusBadge(string $status): string {
switch ($status) {
case '未处理': return '<span class="badge badge-warning">未处理</span>';
case '已处理': return '<span class="badge badge-success">已处理</span>';
case '已驳回': return '<span class="badge badge-danger">已驳回</span>';
default: return '<span class="badge">未知</span>';
}
}
function formatDateTime(?string $datetime): string {
if (!$datetime || $datetime === '0000-00-00 00:00:00') return '-';
return date('Y-m-d H:i:s', strtotime($datetime));
}
function renderPagination(int $current, int $total, array $extra = []): void {
if ($total <= 1) return;
$buildUrl = function(int $page) use ($extra): string {
$params = $extra;
$params['p'] = $page;
return '?' . http_build_query($params);
};
?>
<div class="pagination">
<?php if ($current > 1): ?>
<a href="<?= h($buildUrl($current - 1)) ?>">上一页</a>
<?php else: ?>
<span class="disabled">上一页</span>
<?php endif; ?>
<?php
$range = [];
$range[] = 1;
$start = max(2, $current - 2);
$end = min($total - 1, $current + 2);
if ($start > 2) $range[] = '...';
for ($i = $start; $i <= $end; $i++) $range[] = $i;
if ($end < $total - 1) $range[] = '...';
if ($total > 1) $range[] = $total;
foreach ($range as $p):
if ($p === '...'): ?>
<span class="ellipsis">…</span>
<?php else: ?>
<a href="<?= h($buildUrl($p)) ?>" class="<?= $p === $current ? 'active' : '' ?>"><?= $p ?></a>
<?php endif;
endforeach; ?>
<?php if ($current < $total): ?>
<a href="<?= h($buildUrl($current + 1)) ?>">下一页</a>
<?php else: ?>
<span class="disabled">下一页</span>
<?php endif; ?>
<form method="get" class="page-jump" onsubmit="return (function(f){var p=f.querySelector('[name=p]');if(p.value<1||p.value><?= $total ?>){alert('页数超出范围');return false;}return true;})(this)">
<span>跳转</span>
<input type="number" name="p" value="<?= $current ?>" min="1" max="<?= $total ?>">
<?php foreach ($extra as $k => $v): ?>
<input type="hidden" name="<?= h($k) ?>" value="<?= h($v) ?>">
<?php endforeach; ?>
<button type="submit">GO</button>
</form>
</div>
<?php
}
function maskCode(string $code): string {
$len = mb_strlen($code);
if ($len <= 6) return mb_substr($code, 0, 1) . str_repeat('*', $len - 1);
$show = max(3, intval($len / 4));
return mb_substr($code, 0, $show) . str_repeat('*', $len - $show * 2) . mb_substr($code, -$show);
}