xiangyixiangqin/miniapp/utils/format.js
2026-01-02 18:00:49 +08:00

167 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 格式化工具模块
* 实现日期格式化、昵称生成、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<number>} 可选年份数组
*/
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
}