/** 将接口 msg / 异常对象转为可展示的字符串,避免 [object Object] */ export function formatUserMessage(msg, fallback = '') { if (msg == null || msg === '') return fallback if (typeof msg === 'string') return msg if (typeof msg === 'number' || typeof msg === 'boolean') return String(msg) if (Array.isArray(msg)) { const parts = msg.map((item) => { if (item == null) return '' if (typeof item === 'string') return item if (typeof item === 'number' || typeof item === 'boolean') return String(item) if (typeof item === 'object') { return item.msg || item.message || item.error || item.title || item.label || '' } return String(item) }).filter(Boolean) return parts.length ? parts.join(';') : fallback } if (typeof msg === 'object') { return msg.msg || msg.message || msg.error || msg.title || msg.label || fallback } return String(msg) } export function showUserToast(title, options = {}) { const text = formatUserMessage(title, '') if (!text) return uni.showToast({ title: text, icon: options.icon || 'none', duration: options.duration }) } export function formatDate(date) { const y = date.getFullYear() const m = String(date.getMonth() + 1).padStart(2, '0') const d = String(date.getDate()).padStart(2, '0') return `${y}-${m}-${d}` } export function parseDate(str) { if (!str) return new Date() const [y, m, d] = str.split('-').map(Number) return new Date(y, (m || 1) - 1, d || 1) } export function toNumber(v) { if (v === null || v === undefined || v === '') return null const n = Number(v) return Number.isFinite(n) && n !== 0 ? n : null } export function getWeekday(dateStr) { const w = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] return w[parseDate(dateStr).getDay()] }