someone-oa/pc/common.js
2025-12-11 19:04:46 +08:00

172 lines
6.7 KiB
JavaScript
Raw Permalink 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.

// 通用工具函数库
window.CommonUtils = {
// 显示消息提示(美化版)
showMessage: function(message, type = 'success') {
const messageDiv = document.createElement('div');
messageDiv.className = 'common-message ' + (type === 'success' ? 'message-success' : 'message-error');
const icon = type === 'success' ? '✓' : '✕';
messageDiv.innerHTML = `
<div style="display: flex; align-items: center; gap: 10px;">
<span style="font-size: 18px; font-weight: bold;">${icon}</span>
<span>${message}</span>
</div>
`;
const bgColor = type === 'success' ? '#67c23a' : '#f56c6c';
messageDiv.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
padding: 12px 24px;
background: ${bgColor};
color: white;
border-radius: 4px;
z-index: 10000;
box-shadow: 0 2px 12px rgba(0,0,0,0.15);
animation: slideInRight 0.3s;
font-size: 14px;
min-width: 200px;
`;
document.body.appendChild(messageDiv);
setTimeout(() => {
messageDiv.style.animation = 'slideOutRight 0.3s cubic-bezier(0.4, 0, 0.2, 1)';
setTimeout(() => messageDiv.remove(), 300);
}, 3000);
// 添加动画样式
if (!document.getElementById('message-animation-style')) {
const style = document.createElement('style');
style.id = 'message-animation-style';
style.textContent = `
@keyframes slideInRight {
from { transform: translateX(400px); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes slideOutRight {
from { transform: translateX(0); opacity: 1; }
to { transform: translateX(400px); opacity: 0; }
}
`;
document.head.appendChild(style);
}
},
// 创建弹窗
createModal: function(title, content, onConfirm, onCancel) {
const modal = document.createElement('div');
modal.className = 'common-modal';
modal.innerHTML = `
<div class="modal-overlay"></div>
<div class="modal-content">
<div class="modal-header">
<h3>${title}</h3>
<span class="modal-close">&times;</span>
</div>
<div class="modal-body">
${content}
</div>
<div class="modal-footer">
${onCancel ? '<button class="btn btn-default modal-cancel">取消</button>' : ''}
<button class="btn btn-primary modal-confirm">确定</button>
</div>
</div>
`;
// 添加样式
if (!document.getElementById('common-modal-style')) {
const style = document.createElement('style');
style.id = 'common-modal-style';
style.textContent = `
.common-modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 9999; }
.modal-overlay { position: absolute; width: 100%; height: 100%; background: rgba(0,0,0,0.5); }
.modal-content { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
background: white; border-radius: 4px; min-width: 500px; max-width: 800px; max-height: 80vh;
overflow-y: auto; box-shadow: 0 2px 12px rgba(0,0,0,0.3); }
.modal-header { padding: 16px 20px; border-bottom: 1px solid #e6e6e6; display: flex;
justify-content: space-between; align-items: center; }
.modal-header h3 { margin: 0; font-size: 16px; font-weight: 500; }
.modal-close { cursor: pointer; font-size: 24px; color: #909399; }
.modal-close:hover { color: #303133; }
.modal-body { padding: 20px; max-height: 60vh; overflow-y: auto; }
.modal-footer { padding: 16px 20px; border-top: 1px solid #e6e6e6; text-align: right; }
.modal-footer .btn { margin-left: 12px; }
`;
document.head.appendChild(style);
}
document.body.appendChild(modal);
// 关闭事件
const close = () => {
modal.style.opacity = '0';
setTimeout(() => modal.remove(), 300);
};
modal.querySelector('.modal-close').onclick = close;
if (onCancel) {
modal.querySelector('.modal-cancel').onclick = close;
}
modal.querySelector('.modal-overlay').onclick = close;
modal.querySelector('.modal-confirm').onclick = () => {
if (onConfirm && onConfirm() !== false) {
close();
}
};
return modal;
},
// 文件上传
uploadFile: function(accept, onSuccess, maxSizeMB = 50) {
const input = document.createElement('input');
input.type = 'file';
if (accept) input.accept = accept;
input.onchange = (e) => {
const file = e.target.files[0];
if (file) {
if (file.size > maxSizeMB * 1024 * 1024) {
this.showMessage(`文件大小不能超过 ${maxSizeMB}MB`, 'error');
return;
}
if (onSuccess) onSuccess(file);
this.showMessage('文件上传成功');
}
};
input.click();
},
// 文件下载(模拟)
downloadFile: function(fileName, fileId) {
// 实际项目中应该从服务器下载
this.showMessage('文件下载:' + fileName);
// 这里可以触发实际的下载逻辑
console.log('下载文件:', fileId, fileName);
},
// 文件删除(模拟)
deleteFile: function(fileId, fileName, onSuccess) {
this.createModal('确认删除', `确定要删除文件"${fileName}"吗?删除后无法恢复。`, () => {
if (onSuccess) onSuccess();
this.showMessage('文件已删除');
return true;
});
},
// 确认对话框
confirm: function(message, onConfirm, onCancel) {
return this.createModal('确认', message, onConfirm, onCancel);
},
// 导出Excel模拟
exportExcel: function(fileName, data) {
this.showMessage('正在导出Excel...');
setTimeout(() => {
this.showMessage('Excel导出成功' + (fileName || 'data.xlsx'));
console.log('导出数据:', data);
}, 1000);
}
};