import {
getHistoryFromStorage,
saveHistoryToStorage,
formatDateTime,
isValid,
getRemainingTime,
generateCode,
generatePassword,
showMessage,
copyToClipboard
} from './utils.js';
import WeChatOAuth from './wechat-oauth.js';
import ApiClient from './api-client.js';
import { WECOM_CONFIG } from './wecom-config.js';
// 获取DOM元素
const phoneInput = document.getElementById('phone');
const getCodeBtn = document.getElementById('getCodeBtn');
const codeCountSpan = document.getElementById('code-count');
const historyBody = document.getElementById('historyBody');
// 初始化 OAuth 和 API 客户端
let oauth = null;
let apiClient = null;
// 页面初始化
export function initApp() {
// 初始化 OAuth 客户端
oauth = new WeChatOAuth(WECOM_CONFIG);
apiClient = new ApiClient(WECOM_CONFIG.apiBaseUrl);
// 检查是否有授权码(从企业微信重定向回来)
const authCode = oauth.getAuthCode();
if (authCode) {
handleAuthCallback(authCode);
} else if (oauth.isAuthorized()) {
// 已有用户信息,直接显示
displayUserInfo();
loadHistory();
setupEventListeners();
} else {
// 未授权,显示授权链接或自动跳转
handleUnauthorized();
}
}
/**
* 处理企业微信授权回调
*/
async function handleAuthCallback(code) {
try {
showMessage('正在获取用户信息...', 'info');
const userInfo = await oauth.exchangeCodeForUserInfo(code);
// 清除 URL 中的 code 参数
window.history.replaceState({}, document.title, window.location.pathname);
// 显示用户信息
displayUserInfo(userInfo);
// 初始化应用功能
loadHistory();
setupEventListeners();
showMessage('授权成功!', 'success');
} catch (error) {
console.error('授权处理失败:', error);
showMessage(`授权失败: ${error.message}`);
handleUnauthorized();
}
}
/**
* 处理未授权状态
*/
function handleUnauthorized() {
// 如果在企业微信环境中,使用企业微信 JSSDK
if (isInWeCom()) {
redirectToWeChatAuth();
} else {
// 非企业微信环境,显示提示或授权链接
showAuthPrompt();
}
}
/**
* 检查是否在企业微信环境中
*/
function isInWeCom() {
return /wxwork/i.test(navigator.userAgent);
}
/**
* 重定向到企业微信授权页面
*/
function redirectToWeChatAuth() {
const authUrl = oauth.getAuthUrl();
window.location.href = authUrl;
}
/**
* 显示授权提示
*/
function showAuthPrompt() {
const container = document.querySelector('.container');
const authPrompt = document.createElement('div');
authPrompt.className = 'auth-prompt';
authPrompt.innerHTML = `
需要授权
请使用企业微信打开此页面进行授权
或点击下方按钮进行授权
授权将获取您的基本信息,用于身份验证
`;
container.innerHTML = '';
container.appendChild(authPrompt);
document.getElementById('authBtn').addEventListener('click', () => {
redirectToWeChatAuth();
});
}
/**
* 显示用户信息
*/
function displayUserInfo(userInfo = null) {
const info = userInfo || oauth.getUserInfo();
if (!info) {
return;
}
// 更新页面显示的用户信息
const nameElement = document.querySelector('.company-name');
if (nameElement && info.name) {
nameElement.textContent = info.name || info.userid;
}
// 更新手机号(如果返回的话)
if (phoneInput && info.mobile) {
phoneInput.value = info.mobile;
}
// 存储完整用户信息用于后续使用
window.currentUser = info;
// 可以根据需要显示更多用户信息
console.log('当前用户信息:', info);
}
// 事件监听器
function setupEventListeners() {
getCodeBtn.addEventListener('click', handleGetCode);
phoneInput.addEventListener('input', function(e) {
// 只允许输入数字
this.value = this.value.replace(/[^\d]/g, '');
});
phoneInput.addEventListener('change', updateCodeCount);
phoneInput.addEventListener('blur', updateCodeCount);
}
// 获取验证码处理
function handleGetCode() {
const phone = phoneInput.value.trim();
// 验证手机号
if (!phone) {
showMessage('请输入手机号');
return;
}
if (!/^1[3-9]\d{9}$/.test(phone)) {
showMessage('请输入有效的手机号');
return;
}
// 检查申请次数
const history = getHistoryFromStorage();
const phoneRecords = history.filter(record => record.phone === phone && isValid(record.expiryTime));
if (phoneRecords.length >= 5) {
showMessage('该手机号本周期已达到申请次数限制(5次)');
return;
}
// 生成验证码和密码
const code = generateCode();
const password = generatePassword();
const currentTime = new Date();
const expiryTime = new Date(currentTime.getTime() + 72 * 60 * 60 * 1000);
// 创建新记录
const newRecord = {
phone: phone,
password: password,
requestTime: formatDateTime(currentTime),
expiryTime: expiryTime.toISOString(),
id: Date.now()
};
// 保存到历史记录
history.push(newRecord);
saveHistoryToStorage(history);
// 更新UI
updateCodeCount();
loadHistory();
phoneInput.value = '';
// 显示成功提示
showMessage(`密码已生成:${password}`, 'success');
}
// 更新申请次数
function updateCodeCount() {
const phone = phoneInput.value.trim();
if (!phone) {
codeCountSpan.textContent = '0';
return;
}
const history = getHistoryFromStorage();
const validRecords = history.filter(record =>
record.phone === phone && isValid(record.expiryTime)
);
codeCountSpan.textContent = validRecords.length;
}
// 加载历史记录到表格
function loadHistory() {
const history = getHistoryFromStorage();
// 过滤72小时内的记录
const recentHistory = history.filter(record => isValid(record.expiryTime));
if (recentHistory.length === 0) {
historyBody.innerHTML = '| 暂无记录 |
';
return;
}
// 按时间倒序排列
recentHistory.sort((a, b) => new Date(b.expiryTime) - new Date(a.expiryTime));
historyBody.innerHTML = recentHistory.map(record => `
| ${record.password} |
${record.requestTime} |
${formatDateTime(new Date(record.expiryTime))} |
${getRemainingTime(record.expiryTime)} |
|
`).join('');
// 为复制按钮添加事件监听
document.querySelectorAll('.btn-action').forEach(btn => {
btn.addEventListener('click', function() {
const password = this.dataset.password;
copyToClipboard(password).then(() => {
showMessage('密码已复制到剪贴板', 'success');
});
});
});
// 定期更新剩余时间
setInterval(() => {
const cells = document.querySelectorAll('.history-table tbody tr td:nth-child(4)');
let index = 0;
recentHistory.forEach(record => {
if (cells[index]) {
cells[index].textContent = getRemainingTime(record.expiryTime);
}
index += 5;
});
}, 60000); // 每分钟更新一次
}
// 页面加载时定期更新剩余时间
setInterval(() => {
const cells = document.querySelectorAll('.history-table tbody tr td:nth-child(4)');
cells.forEach(cell => {
const row = cell.closest('tr');
if (row && row.querySelector('td:nth-child(2)')) {
const expiryText = row.querySelector('td:nth-child(3)').textContent;
if (expiryText) {
cell.textContent = getRemainingTime(expiryText);
}
}
});
}, 60000); // 每分钟更新一次