} catch (error) {
console.error('加载职位数据失败:', error);
this.renderEmptyTable('jobsTableBody', '职位数据');
}
}
renderApplicationsTable(applications) {
const tbody = document.getElementById('applicationsTableBody');
if (!tbody) return;
if (!applications || applications.length === 0) {
this.renderEmptyTable('applicationsTableBody', '申请记录');
return;
}
tbody.innerHTML = '';
// 只显示前10条记录
const displayApplications = applications.slice(0, 10);
displayApplications.forEach(app => {
const row = document.createElement('tr');
// 格式化时间
const applyTime = new Date(app.applyTime || Date.now());
const timeStr = applyTime.toLocaleDateString('zh-CN', {
month: 'short',
day: 'numeric',
hour: '2-digit',
minute: '2-digit'
});
// 状态标签
let statusClass = 'info';
let statusText = '待处理';
if (app.status === 'accepted') {
statusClass = 'success';
statusText = '已接受';
} else if (app.status === 'rejected') {
statusClass = 'error';
statusText = '已拒绝';
} else if (app.status === 'interviewing') {
statusClass = 'warning';
statusText = '面试中';
}
row.innerHTML = `
${app.applicantName || '匿名用户'} |
${app.jobTitle || '未知职位'} |
${app.companyName || '未知企业'} |
${timeStr} |
${statusText} |
`;
tbody.appendChild(row);
});
// 更新分页信息
document.getElementById('applicationsInfo').textContent =
`显示 ${displayApplications.length} 条记录`;
}
renderJobsTable(jobs) {
const tbody = document.getElementById('jobsTableBody');
if (!tbody) return;
if (!jobs || jobs.length === 0) {
this.renderEmptyTable('jobsTableBody', '职位数据');
return;
}
tbody.innerHTML = '';
// 只显示前10条记录
const displayJobs = jobs.slice(0, 10);
displayJobs.forEach(job => {
const row = document.createElement('tr');
// 格式化时间
const publishTime = new Date(job.publishTime || Date.now());
const timeStr = publishTime.toLocaleDateString('zh-CN', {
month: 'short',
day: 'numeric'
});
// 格式化薪资
const salary = job.salary || '面议';
const applicants = job.applicants || 0;
row.innerHTML = `
${job.title || '未知职位'} |
${job.company || '未知企业'} |
${salary} |
${timeStr} |
${applicants}人 |
`;
tbody.appendChild(row);
});
// 更新分页信息
document.getElementById('jobsInfo').textContent =
`显示 ${displayJobs.length} 条记录`;
}
renderEmptyTable(elementId, dataType) {
const tbody = document.getElementById(elementId);
if (!tbody) return;
tbody.innerHTML = `
|
📊
暂无${dataType}
当前没有可显示的${dataType}记录
|
`;
}
refreshData() {
if (this.isLoading) return;
const refreshBtn = document.getElementById('refreshBtn');
const refreshIcon = document.getElementById('refreshIcon');
const refreshText = document.getElementById('refreshText');
// 显示加载状态
refreshIcon.textContent = '';
refreshIcon.classList.add('loading');
refreshText.textContent = '加载中...';
refreshBtn.disabled = true;
// 加载数据
this.loadData().finally(() => {
// 恢复按钮状态
setTimeout(() => {
refreshIcon.textContent = '🔄';
refreshIcon.classList.remove('loading');
refreshText.textContent = '刷新数据';
refreshBtn.disabled = false;
}, 500);
});
}
exportData() {
// 模拟导出功能
this.showSuccess('数据导出功能开发中...');
// 实际实现时,这里可以调用导出API
// const exportUrl = `${this.apiBaseUrl}/export?range=${this.currentTimeRange}`;
// window.open(exportUrl, '_blank');
}
viewAllApplications() {
this.showInfo('正在跳转到申请管理页面...');
// 实际实现时,这里可以跳转到专门的申请管理页面
// window.location.href = 'applications-management.html';
}
viewAllJobs() {
this.showInfo('正在跳转到职位管理页面...');
// 实际实现时,这里可以跳转到专门的职位管理页面
// window.location.href = 'jobs-management.html';
}
updateApiStatus(isConnected) {
const apiStatus = document.getElementById('apiStatus');
const apiStatusIcon = document.getElementById('apiStatusIcon');
const apiStatusText = document.getElementById('apiStatusText');
if (isConnected) {
apiStatus.className = 'status-badge success';
apiStatusIcon.textContent = '✅';
apiStatusText.textContent = 'API连接正常';
} else {
apiStatus.className = 'status-badge error';
apiStatusIcon.textContent = '❌';
apiStatusText.textContent = 'API连接失败';
}
}
updateLastUpdateTime() {
const now = new Date();
const timeStr = now.toLocaleTimeString('zh-CN', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
document.getElementById('lastUpdate').textContent = `最后更新: ${timeStr}`;
}
setupAutoRefresh() {
// 每5分钟自动刷新一次
this.autoRefreshInterval = setInterval(() => {
if (this.autoRefreshEnabled && !this.isLoading) {
this.loadData();
}
}, 5 * 60 * 1000); // 5分钟
// 默认启用自动刷新
this.autoRefreshEnabled = true;
}
adaptToDevice() {
const isMobile = window.innerWidth < 768;
const isTablet = window.innerWidth >= 768 && window.innerWidth < 1024;
// 根据设备类型优化显示
if (isMobile) {
this.optimizeForMobile();
} else if (isTablet) {
this.optimizeForTablet();
} else {
this.optimizeForDesktop();
}
}
optimizeForMobile() {
// 移动端优化
document.body.classList.add('device-mobile');
// 隐藏不必要的元素
const elementsToHide = document.querySelectorAll('.desktop-only');
elementsToHide.forEach(el => {
el.style.display = 'none';
});
// 显示移动端优化元素
const elementsToShow = document.querySelectorAll('.mobile-only');
elementsToShow.forEach(el => {
el.style.display = 'block';
});
}
optimizeForTablet() {
// 平板优化
document.body.classList.add('device-tablet');
}
optimizeForDesktop() {
// 桌面端优化
document.body.classList.add('device-pc');
}
optimizeTouchInteractions() {
// 优化触摸交互
const touchElements = document.querySelectorAll('.stat-card, .btn, .navbar-link');
touchElements.forEach(element => {
element.addEventListener('touchstart', () => {
element.style.opacity = '0.7';
});
element.addEventListener('touchend', () => {
element.style.opacity = '1';
});
element.addEventListener('touchcancel', () => {
element.style.opacity = '1';
});
});
// 防止双击缩放
let lastTouchEnd = 0;
document.addEventListener('touchend', (event) => {
const now = Date.now();
if (now - lastTouchEnd <= 300) {
event.preventDefault();
}
lastTouchEnd = now;
}, { passive: false });
}
useMockData() {
// 使用模拟数据
const mockData = {
users: 156,
companies: 42,
jobs: 89,
applications: 324,
resumes: 567,
conversionRate: 3.2,
revenue: 125000,
growthRate: 12.5
};
// 更新统计卡片
this.updateStatCard('statUsers', mockData.users);
this.updateStatCard('statCompanies', mockData.companies);
this.updateStatCard('statJobs', mockData.jobs);
this.updateStatCard('statApplications', mockData.applications);
this.updateStatCard('statResumes', mockData.resumes);
document.getElementById('statConversion').textContent = `${mockData.conversionRate.toFixed(1)}%`;
document.getElementById('statRevenue').textContent = `¥${mockData.revenue.toLocaleString()}`;
document.getElementById('statGrowth').textContent = `${mockData.growthRate.toFixed(1)}%`;
// 使用模拟的申请记录
const mockApplications = [
{ applicantName: '张三', jobTitle: '前端工程师', companyName: '科技公司', applyTime: Date.now() - 3600000, status: 'interviewing' },
{ applicantName: '李四', jobTitle: '产品经理', companyName: '互联网公司', applyTime: Date.now() - 7200000, status: 'accepted' },
{ applicantName: '王五', jobTitle: 'UI设计师', companyName: '设计公司', applyTime: Date.now() - 10800000, status: 'pending' }
];
this.renderApplicationsTable(mockApplications);
// 使用模拟的职位数据
const mockJobs = [
{ title: '高级Java开发', company: '金融科技公司', salary: '25-40K', publishTime: Date.now() - 86400000, applicants: 15 },
{ title: 'React前端工程师', company: '电商平台', salary: '20-35K', publishTime: Date.now() - 172800000, applicants: 28 },
{ title: '数据分析师', company: '大数据公司', salary: '18-30K', publishTime: Date.now() - 259200000, applicants: 12 }
];
this.renderJobsTable(mockJobs);
}
showLoading() {
// 显示加载状态
document.body.style.cursor = 'wait';
const loadingOverlay = document.createElement('div');
loadingOverlay.id = 'loadingOverlay';
loadingOverlay.style.cssText = `
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(255, 255, 255, 0.8);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
backdrop-filter: blur(2px);
`;
loadingOverlay.innerHTML = `
`;
document.body.appendChild(loadingOverlay);
}
hideLoading() {
// 隐藏加载状态
document.body.style.cursor = 'default';
const loadingOverlay = document.getElementById('loadingOverlay');
if (loadingOverlay) {
loadingOverlay.remove();
}
}
showSuccess(message) {
this.showNotification(message, 'success');
}
showError(message) {
this.showNotification(message, 'error');
}
showInfo(message) {
this.showNotification(message, 'info');
}
showNotification(message, type = 'info') {
// 创建通知元素
const notification = document.createElement('div');
notification.className = `notification notification-${type}`;
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
padding: 1rem 1.5rem;
background: ${type === 'success' ? 'var(--color-success)' :
type === 'error' ? 'var(--color-danger)' :
'var(--color-info)'};
color: white;
border-radius: var(--radius-md);
box-shadow: var(--shadow-lg);
z-index: 10000;
animation: slideIn 0.3s ease;
max-width: 300px;
`;
notification.textContent = message;
document.body.appendChild(notification);
// 3秒后自动移除
setTimeout(() => {
notification.style.animation = 'slideOut 0.3s ease';
setTimeout(() => {
if (notification.parentNode) {
notification.parentNode.removeChild(notification);
}
}, 300);
}, 3000);
// 添加动画样式
if (!document.getElementById('notificationStyles')) {
const style = document.createElement('style');
style.id = 'notificationStyles';
style.textContent = `
@keyframes slideIn {
from { transform: translateX(100%); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes slideOut {
from { transform: translateX(0); opacity: 1; }
to { transform: translateX(100%); opacity: 0; }
}
`;
document.head.appendChild(style);
}
}
// 设备检测
detectDevice() {
const userAgent = navigator.userAgent.toLowerCase();
if (/harmonyos/i.test(userAgent)) {
return 'harmonyos';
} else if (/android/i.test(userAgent)) {
return 'android';
} else if (/iphone|ipad|ipod/i.test(userAgent)) {
return 'ios';
} else {
return 'desktop';
}
}
}
// 页面加载完成后初始化
document.addEventListener('DOMContentLoaded', () => {
// 初始化业务仪表板
const dashboard = new BusinessDashboard();
// 将dashboard实例挂载到window,方便调试
window.businessDashboard = dashboard;
// 设备特定优化
const device = dashboard.detectDevice();
console.log(`检测到设备: ${device}`);
// 根据设备类型进行特定优化
switch (device) {
case 'harmonyos':
// 鸿蒙系统优化
document.body.classList.add('harmonyos-optimized');
break;
case 'android':
// 安卓系统优化
document.body.classList.add('android-optimized');
break;
case 'ios':
// iOS系统优化
document.body.classList.add('ios-optimized');
break;
}
// 性能监控
const perfObserver = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.entryType === 'largest-contentful-paint') {
console.log(`最大内容绘制时间: ${entry.startTime}ms`);
if (entry.startTime > 2500) {
console.warn('页面加载性能需要优化');
}
}
}
});
perfObserver.observe({ entryTypes: ['largest-contentful-paint'] });
// 错误监控
window.addEventListener('error', (event) => {
console.error('页面错误:', event.error);
// 可以在这里将错误发送到监控服务器
// fetch('/api/log-error', {
// method: 'POST',
// body: JSON.stringify({
// message: event.error.message,
// stack: event.error.stack,
// url: window.location.href,
// timestamp: new Date().toISOString()
// })
// });
});
// 离线检测
window.addEventListener('offline', () => {
dashboard.showError('网络连接已断开,部分功能可能无法使用');
});
window.addEventListener('online', () => {
dashboard.showSuccess('网络连接已恢复');
dashboard.refreshData();
});
});
// 页面可见性变化
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
// 页面重新可见时刷新数据
if (window.businessDashboard) {
window.businessDashboard.refreshData();
}
}
});