feat(h5): add global app.js with utility functions

This commit is contained in:
2026-04-14 12:26:41 +08:00
parent 1c60401958
commit 47c8d92eef

166
h5/js/app.js Normal file
View File

@@ -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' ? '在线' : '离线';
}