167 lines
4.6 KiB
JavaScript
167 lines
4.6 KiB
JavaScript
/**
|
||
* 格式化工具模块
|
||
* 实现日期格式化、昵称生成、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
|
||
}
|