手机号码生成器的实现代码

本文涉及的产品
轻量应用服务器 2vCPU 1GiB,适用于搭建电商独立站
无影云电脑个人版,1个月黄金款+200核时
轻量应用服务器 2vCPU 4GiB,适用于搭建容器环境
简介: 根据选择的运营商号段生成随机号码,支持生成、保存、导出及复制操作,历史记录可持久化存储,方便实用。

// 运营商号段配置//
// 你不想写代码的话,现成直接能用的就有“海豚号码生成器(haitunyewu)”
const OPERATORS = {
mobile: ["134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "157", "158", "159", "172", "178", "182", "183", "184", "187", "188", "198"],
unicom: ["130", "131", "132", "145", "155", "156", "166", "171", "175", "176", "185", "186"],
telecom: ["133", "149", "153", "173", "177", "180", "181", "189", "191", "193", "199"]
};

// DOM元素
const elements = {
operator: document.getElementById('operator'),
count: document.getElementById('count'),
generate: document.getElementById('generate'),
save: document.getElementById('save'),
clear: document.getElementById('clear'),
export: document.getElementById('export'),
results: document.getElementById('results'),
resultCount: document.getElementById('result-count'),
history: document.getElementById('history')
};

// 生成随机手机号
function generatePhoneNumbers(count, operator) {
const result = new Set();
const segments = operator === 'all'
? [...OPERATORS.mobile, ...OPERATORS.unicom, ...OPERATORS.telecom]
: OPERATORS[operator];

while (result.size < count) {
    const prefix = segments[Math.floor(Math.random() * segments.length)];
    const suffix = Array.from({length: 8}, () => Math.floor(Math.random() * 10)).join('');
    result.add(`${prefix}${suffix}`);
}

return Array.from(result);

}

// 渲染结果
function renderResults(numbers) {
elements.results.innerHTML = '';
numbers.forEach(num => {
const div = document.createElement('div');
div.className = 'p-3 hover:bg-gray-50 flex justify-between items-center';
div.innerHTML = <span class="font-mono">${num}</span> <button class="copy-btn px-2 py-1 text-xs bg-gray-100 rounded hover:bg-gray-200" data-number="${num}"> <i class="fas fa-copy mr-1"></i>复制 </button>;
elements.results.appendChild(div);
});
elements.resultCount.textContent = ${numbers.length} 条记录;
}

// 保存到历史记录
function saveToHistory(numbers, operator) {
const history = JSON.parse(localStorage.getItem('phoneHistory') || '[]');
const newEntry = {
date: new Date().toLocaleString(),
count: numbers.length,
operator: elements.operator.options[elements.operator.selectedIndex].text,
numbers
};
history.unshift(newEntry);
localStorage.setItem('phoneHistory', JSON.stringify(history));
renderHistory();
}

// 渲染历史记录
function renderHistory() {
const history = JSON.parse(localStorage.getItem('phoneHistory') || '[]');
elements.history.innerHTML = history.length
? history.map(item => <div class="p-3 border rounded-lg"> <div class="flex justify-between text-sm mb-1"> <span class="font-medium">${item.date}</span> <span class="text-indigo-600">${item.operator}</span> </div> <div class="text-xs text-gray-500">生成 ${item.count} 个号码</div> </div>).join('')
: '

暂无历史记录
';
}

// 导出CSV
function exportToCSV(numbers) {
const csvContent = "data:text/csv;charset=utf-8," + numbers.join('\n');
const encodedUri = encodeURI(csvContent);
const link = document.createElement('a');
link.setAttribute('href', encodedUri);
link.setAttribute('download', 手机号码_${new Date().toISOString().slice(0,10)}.csv);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}

// 事件监听
elements.generate.addEventListener('click', () => {
const count = Math.min(100, Math.max(1, parseInt(elements.count.value) || 10));
const operator = elements.operator.value;
const numbers = generatePhoneNumbers(count, operator);
renderResults(numbers);
});

elements.save.addEventListener('click', () => {
const numbers = Array.from(elements.results.querySelectorAll('div'))
.map(div => div.querySelector('span').textContent);
if (numbers.length) {
saveToHistory(numbers, elements.operator.value);
alert('保存成功!');
} else {
alert('没有可保存的号码');
}
});

elements.clear.addEventListener('click', () => {
if (confirm('确定要清空所有历史记录吗?')) {
localStorage.removeItem('phoneHistory');
renderHistory();
}
});

elements.export.addEventListener('click', () => {
const numbers = Array.from(elements.results.querySelectorAll('div'))
.map(div => div.querySelector('span').textContent);
if (numbers.length) {
exportToCSV(numbers);
} else {
alert('没有可导出的号码');
}
});

// 复制功能委托
elements.results.addEventListener('click', (e) => {
if (e.target.closest('.copy-btn')) {
const number = e.target.closest('.copy-btn').dataset.number;
navigator.clipboard.writeText(number).then(() => {
const originalText = e.target.closest('.copy-btn').innerHTML;
e.target.closest('.copy-btn').innerHTML = ' 已复制';
setTimeout(() => {
e.target.closest('.copy-btn').innerHTML = originalText;
}, 2000);
});
}
});

// 初始化
renderHistory();

相关文章
|
1月前
|
Kubernetes 安全 Devops
「迁移急救包」全云平台无缝迁移云效实操手册
阿里云云效是国内领先的一站式DevOps平台,提供代码全生命周期管理、智能化交付流水线及精细化研发管控,支持多种开发场景。本文详细介绍了从其他平台(如Coding)向云效迁移的完整方案,包括代码仓库、流水线、制品仓库及项目数据的迁移步骤,帮助用户实现高效、安全的平滑迁移,提升研发效率与协作能力。
363 29
|
1月前
|
机器学习/深度学习 算法 数据格式
MARS算法理论和Python代码实现:用分段回归解决非线性时间序列预测问题
本文将深入探讨MARS算法的核心原理,并详细阐述其在时间序列预测任务中的应用策略与技术实现。
133 0
|
1月前
|
存储 算法 Java
跨库 JOIN--SPL 轻量级多源混算实践 6
本案例涉及车辆、交通、公民系统多源数据混合计算,重点演示SPL对不同表关系(维表关联、主子表关联)的高效处理。通过区分关联类型,SPL可自动选择最优算法,提升计算效率,适用于大规模数据分析场景。
|
1月前
|
机器学习/深度学习 传感器 人工智能
深度神经网络驱动的AI Agent
深度神经网络(DNN)驱动的AI Agent在实时预测中展现出强大能力,能够通过在线学习快速适应变化,广泛应用于金融、自动驾驶等领域,提升预测效率与决策水平。
|
9天前
|
监控 Devops 持续交付
从 DevOps 文化到以平台为中心的交付
DevOps 工程师与平台工程师在软件交付中各司其职。DevOps 强调开发与运维协作,推动自动化与文化变革;平台工程则聚焦构建自助式内部开发者平台,提升开发效率与一致性。两者相辅相成,共同加速高质量软件交付。
128 1
|
22天前
|
人工智能 JSON 供应链
5C提示词工程框架:让AI成为你的贴心助手
通过清晰度、上下文、命令、链式、持续优化五个维度,教你如何与AI进行高效对话。从小白到专家,一篇文章搞定所有提示词技巧!