diff --git a/h5/js/app.js b/h5/js/app.js new file mode 100644 index 0000000..fc3d1b3 --- /dev/null +++ b/h5/js/app.js @@ -0,0 +1,166 @@ +// ============================================= +// 全局 App 逻辑 - H5 原型工具函数层 +// ============================================= + +/** + * 获取 token + */ +function getToken() { + return localStorage.getItem('token'); +} + +/** + * 设置 token + * @param {string} token + */ +function setToken(token) { + localStorage.setItem('token', token); +} + +/** + * 清除 token + */ +function clearToken() { + localStorage.removeItem('token'); +} + +/** + * 检查是否已登录 + * @returns {boolean} + */ +function isLoggedIn() { + return !!getToken(); +} + +/** + * 检查登录状态,未登录则跳转登录页 + * @returns {boolean} + */ +function requireAuth() { + if (!isLoggedIn()) { + location.href = 'login.html'; + return false; + } + return true; +} + +/** + * 显示 Toast 消息 + * @param {string} message - 消息内容 + * @param {number} duration - 显示时长(ms),默认 2000 + */ +function showToast(message, duration = 2000) { + // 移除已有 toast + const existing = document.querySelector('.toast'); + if (existing) { + existing.remove(); + } + + const toast = document.createElement('div'); + toast.className = 'toast'; + toast.textContent = message; + document.body.appendChild(toast); + + setTimeout(() => { + toast.remove(); + }, duration); +} + +/** + * 初始化 TabBar 高亮 + */ +function initTabBar() { + const pathname = location.pathname; + const tabItems = document.querySelectorAll('.tab-item'); + + tabItems.forEach(item => { + const href = item.getAttribute('href'); + if (href && pathname.endsWith(href)) { + item.classList.add('active'); + } + }); +} + +/** + * 从 URL 解析查询参数 + * @param {string} key - 参数名 + * @returns {string|null} + */ +function getQueryParam(key) { + const params = new URLSearchParams(location.search); + return params.get(key); +} + +/** + * 格式化时间 + * @param {string} dateStr - 日期字符串 '2026-04-14 10:30:00' + * @returns {string} - '04-14 10:30' + */ +function formatTime(dateStr) { + if (!dateStr) return ''; + const d = new Date(dateStr); + const month = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + const hours = String(d.getHours()).padStart(2, '0'); + const minutes = String(d.getMinutes()).padStart(2, '0'); + return `${month}-${day} ${hours}:${minutes}`; +} + +/** + * 格式化日期 + * @param {string} dateStr - 日期字符串 + * @returns {string} - 'YYYY-MM-DD' + */ +function formatDate(dateStr) { + if (!dateStr) return ''; + const d = new Date(dateStr); + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + +/** + * 获取设备图标 + * @param {string} type - 设备类型 + * @returns {string} + */ +function getDeviceIcon(type) { + if (type === 'tower_crane') { + return '🏗️'; + } + return '🛗'; +} + +/** + * 获取告警图标 + * @param {string} level - 告警级别 + * @returns {string} + */ +function getAlertIcon(level) { + if (level === 'danger') { + return '🔴'; + } + if (level === 'warning') { + return '🟡'; + } + return '⚫'; +} + +/** + * 获取状态 CSS 类名 + * @param {string} status - 状态 + * @returns {string} + */ +function getStatusClass(status) { + return status === 'online' ? 'online' : 'offline'; +} + +/** + * 获取状态文本 + * @param {string} status - 状态 + * @returns {string} + */ +function getStatusText(status) { + return status === 'online' ? '在线' : '离线'; +}