/** * 格式化工具模块 * 实现日期格式化、昵称生成、ID脱敏等功能 * Requirements: 4.2, 8.5, 12.4 */ /** * 格式化时间戳 * Property 16: Timestamp Formatting * - "今天 HH:mm" if same day * - "昨天" if 1 day ago * - "前天" if 2 days ago * - "M月D号" if more than 2 days ago * * @param {string|number|Date} timestamp 时间戳或日期字符串 * @param {Date} now 当前时间(用于测试) * @returns {string} 格式化后的时间字符串 */ export function formatTimestamp(timestamp, now = new Date()) { if (!timestamp) return '' const date = new Date(timestamp) if (isNaN(date.getTime())) return '' // 获取今天的开始时间(0点) const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate()) const yesterdayStart = new Date(todayStart.getTime() - 24 * 60 * 60 * 1000) const dayBeforeYesterdayStart = new Date(todayStart.getTime() - 2 * 24 * 60 * 60 * 1000) const dateStart = new Date(date.getFullYear(), date.getMonth(), date.getDate()) if (dateStart.getTime() === todayStart.getTime()) { // 今天 const hours = String(date.getHours()).padStart(2, '0') const minutes = String(date.getMinutes()).padStart(2, '0') return `今天 ${hours}:${minutes}` } else if (dateStart.getTime() === yesterdayStart.getTime()) { // 昨天 return '昨天' } else if (dateStart.getTime() === dayBeforeYesterdayStart.getTime()) { // 前天 return '前天' } else { // 更早的日期 const month = date.getMonth() + 1 const day = date.getDate() return `${month}月${day}号` } } /** * 生成昵称 * Property 8: Nickname Auto-Generation * 根据关系和姓氏生成昵称 * - 父亲: "{surname}家长(父亲)" * - 母亲: "{surname}家长(母亲)" * - 本人(男): "{surname}先生(本人)" * - 本人(女): "{surname}女士(本人)" * * @param {number} relationship 关系:1=父亲, 2=母亲, 3=本人 * @param {string} surname 姓氏 * @param {number} gender 性别:1=男, 2=女(仅本人时使用) * @returns {string} 生成的昵称 */ export function generateNickname(relationship, surname, gender = 1) { if (!surname) return '' switch (relationship) { case 1: // 父亲 return `${surname}家长(父亲)` case 2: // 母亲 return `${surname}家长(母亲)` case 3: // 本人 const title = gender === 2 ? '女士' : '先生' return `${surname}${title}(本人)` default: return surname } } /** * 脱敏姓名 * Property 21: ID Masking Format * 显示第一个和最后一个字符,中间用*代替 * * @param {string} name 姓名 * @returns {string} 脱敏后的姓名 */ export function maskName(name) { if (!name || name.length === 0) return '' if (name.length === 1) return name if (name.length === 2) return name[0] + '*' const first = name[0] const last = name[name.length - 1] const middle = '*'.repeat(name.length - 2) return first + middle + last } /** * 脱敏身份证号 * Property 21: ID Masking Format * 显示前3位和后4位,中间用*代替 * * @param {string} idNumber 身份证号 * @returns {string} 脱敏后的身份证号 */ export function maskIdNumber(idNumber) { if (!idNumber || idNumber.length === 0) return '' if (idNumber.length <= 7) return idNumber const first3 = idNumber.substring(0, 3) const last4 = idNumber.substring(idNumber.length - 4) const middleLength = idNumber.length - 7 const middle = '*'.repeat(middleLength) return first3 + middle + last4 } /** * 格式化手机号(脱敏) * @param {string} phone 手机号 * @returns {string} 脱敏后的手机号 */ export function maskPhone(phone) { if (!phone || phone.length < 7) return phone || '' return phone.substring(0, 3) + '****' + phone.substring(phone.length - 4) } /** * 获取年龄 * @param {number} birthYear 出生年份 * @returns {number} 年龄 */ export function getAge(birthYear) { if (!birthYear) return 0 const currentYear = new Date().getFullYear() return currentYear - birthYear } /** * 获取可选的出生年份范围 * Property 9: Birth Year Range * 年龄限制在18-50岁之间 * * @param {number} currentYear 当前年份 * @returns {Array} 可选年份数组 */ export function getBirthYearRange(currentYear = new Date().getFullYear()) { const minYear = currentYear - 50 // 最大50岁 const maxYear = currentYear - 18 // 最小18岁 const years = [] for (let year = maxYear; year >= minYear; year--) { years.push(year) } return years } export default { formatTimestamp, generateNickname, maskName, maskIdNumber, maskPhone, getAge, getBirthYearRange }