149 lines
5.3 KiB
HTML
149 lines
5.3 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html lang="zh-Hant">
|
||
|
<head>
|
||
|
<meta charset="UTF-8">
|
||
|
<title>緊急通報</title>
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||
|
</head>
|
||
|
<body>
|
||
|
<div class="container mt-4">
|
||
|
<h2 class="mb-4">警即通報</h2>
|
||
|
|
||
|
<form id="alertForm">
|
||
|
<div class="mb-3">
|
||
|
<label for="alert_type" class="form-label">通報類型</label>
|
||
|
<select id="alert_type" name="alert_type" class="form-select" required>
|
||
|
<option value="">-- 請選擇類型 --</option>
|
||
|
<option value="火災">🔥 火災</option>
|
||
|
<option value="地震">🌏 地震</option>
|
||
|
<option value="水災">💧 水災</option>
|
||
|
<option value="可疑人物">🕵️♂️ 可疑人物</option>
|
||
|
<option value="公共設施故障">⚠️ 公共設施故障</option>
|
||
|
<option value="其他">❓ 其他</option>
|
||
|
</select>
|
||
|
</div>
|
||
|
|
||
|
<div class="mb-3">
|
||
|
<label for="description" class="form-label">通報說明</label>
|
||
|
<textarea id="description" name="description" class="form-control" rows="4" placeholder="請簡要描述狀況..." required></textarea>
|
||
|
</div>
|
||
|
|
||
|
<button type="submit" class="btn btn-danger">送出通報</button>
|
||
|
</form>
|
||
|
|
||
|
<!-- 通報紀錄表格 -->
|
||
|
<h3 class="mt-5 mb-3">通報紀錄</h3>
|
||
|
<table class="table table-bordered table-hover">
|
||
|
<thead class="table-light">
|
||
|
<tr>
|
||
|
<th>#</th>
|
||
|
<th>通報類型</th>
|
||
|
<th>說明</th>
|
||
|
<th>時間</th>
|
||
|
</tr>
|
||
|
</thead>
|
||
|
<tbody id="alertTableBody"></tbody>
|
||
|
</table>
|
||
|
|
||
|
<!-- 分頁控制 -->
|
||
|
<div class="d-flex justify-content-between align-items-center">
|
||
|
<div>第 <span id="currentPage">1</span> 頁,共 <span id="totalPages">1</span> 頁</div>
|
||
|
<div>
|
||
|
<button class="btn btn-sm btn-outline-secondary me-1" id="prevPage">上一頁</button>
|
||
|
<button class="btn btn-sm btn-outline-secondary" id="nextPage">下一頁</button>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
<script>
|
||
|
const dataList = [];
|
||
|
const rowsPerPage = 5;
|
||
|
let currentPage = 1;
|
||
|
|
||
|
function seedData() {
|
||
|
const types = ["火災", "地震", "暴力事件", "系統異常", "其他"];
|
||
|
const descriptions = [
|
||
|
"地下室起火冒煙,請盡速避難", "感受到劇烈搖晃,請盡速避難", "住戶報警有打鬥聲,請盡速避難", "監控系統異常重啟,請盡速避難",
|
||
|
"不明人士闖入大門,請盡速避難", "火警偵測器誤報,請盡速避難", "有怪味從機房飄出,請盡速避難", "外部施工導致震動,請盡速避難",
|
||
|
"停車場燈光全滅,請盡速避難", "水塔洩漏造成樓梯積水,請盡速避難"
|
||
|
];
|
||
|
|
||
|
for (let i = 0; i < 10; i++) {
|
||
|
const type = types[i % types.length];
|
||
|
const desc = descriptions[i % descriptions.length];
|
||
|
const time = `2025-05-16 0${i % 10}:0${i + 1}`;
|
||
|
dataList.push({ type, desc, time });
|
||
|
}
|
||
|
}
|
||
|
|
||
|
seedData();
|
||
|
|
||
|
const alertForm = document.getElementById("alertForm");
|
||
|
const tbody = document.getElementById("alertTableBody");
|
||
|
|
||
|
alertForm.addEventListener("submit", function(event) {
|
||
|
event.preventDefault();
|
||
|
const type = document.getElementById("alert_type").value;
|
||
|
const desc = document.getElementById("description").value;
|
||
|
if (!type || !desc) return;
|
||
|
|
||
|
const confirmSend = confirm("確認要送出通報嗎?");
|
||
|
if (confirmSend) {
|
||
|
alert("已送出");
|
||
|
const now = new Date();
|
||
|
const timestamp = now.getFullYear() + "-" +
|
||
|
String(now.getMonth() + 1).padStart(2, '0') + "-" +
|
||
|
String(now.getDate()).padStart(2, '0') + " " +
|
||
|
String(now.getHours()).padStart(2, '0') + ":" +
|
||
|
String(now.getMinutes()).padStart(2, '0');
|
||
|
|
||
|
dataList.push({ type, desc, time: timestamp });
|
||
|
alertForm.reset();
|
||
|
renderTable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
function renderTable() {
|
||
|
tbody.innerHTML = "";
|
||
|
const start = (currentPage - 1) * rowsPerPage;
|
||
|
const end = start + rowsPerPage;
|
||
|
const pageData = dataList.slice(start, end);
|
||
|
|
||
|
pageData.forEach((data, index) => {
|
||
|
const row = tbody.insertRow();
|
||
|
row.innerHTML = `
|
||
|
<td>${start + index + 1}</td>
|
||
|
<td>${data.type}</td>
|
||
|
<td>${data.desc}</td>
|
||
|
<td>${data.time}</td>
|
||
|
`;
|
||
|
});
|
||
|
|
||
|
const totalPages = Math.ceil(dataList.length / rowsPerPage);
|
||
|
document.getElementById("currentPage").textContent = currentPage;
|
||
|
document.getElementById("totalPages").textContent = totalPages;
|
||
|
|
||
|
document.getElementById("prevPage").disabled = currentPage === 1;
|
||
|
document.getElementById("nextPage").disabled = currentPage >= totalPages;
|
||
|
}
|
||
|
|
||
|
document.getElementById("prevPage").addEventListener("click", () => {
|
||
|
if (currentPage > 1) {
|
||
|
currentPage--;
|
||
|
renderTable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
document.getElementById("nextPage").addEventListener("click", () => {
|
||
|
const totalPages = Math.ceil(dataList.length / rowsPerPage);
|
||
|
if (currentPage < totalPages) {
|
||
|
currentPage++;
|
||
|
renderTable();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
renderTable();
|
||
|
</script>
|
||
|
</body>
|
||
|
</html>
|