106 lines
3.9 KiB
PHP
Executable File
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);
|
|
}
|