222 lines
7.4 KiB
JavaScript
222 lines
7.4 KiB
JavaScript
// 组件加载器类
|
||
class ComponentLoader {
|
||
static async loadComponent(elementSelector, componentPath) {
|
||
try {
|
||
const response = await fetch(componentPath);
|
||
const html = await response.text();
|
||
document.querySelector(elementSelector).innerHTML = html;
|
||
|
||
const componentName = componentPath.split('/').slice(-2)[0];
|
||
const scriptPath = componentPath.replace('.html', '.js');
|
||
const scriptExists = await fetch(scriptPath).then(() => true).catch(() => false);
|
||
|
||
if (scriptExists) {
|
||
const script = document.createElement('script');
|
||
script.src = scriptPath;
|
||
document.body.appendChild(script);
|
||
}
|
||
} catch (error) {
|
||
console.error(`Error loading component ${componentPath}:`, error);
|
||
}
|
||
}
|
||
|
||
static init() {
|
||
const pathDepth = window.location.pathname.split('/').length - 2;
|
||
const basePath = '../'.repeat(pathDepth);
|
||
|
||
this.loadComponent('header', `${basePath}components/header/header.html`);
|
||
this.loadComponent('footer', `${basePath}components/footer/footer.html`);
|
||
}
|
||
}
|
||
|
||
// 图片模态框功能
|
||
function showImageModal(imgElement) {
|
||
const modal = document.getElementById('imageModal');
|
||
const modalImg = document.getElementById('modalImage');
|
||
modalImg.src = imgElement.src;
|
||
modalImg.alt = imgElement.alt;
|
||
|
||
const bsModal = new bootstrap.Modal(modal);
|
||
bsModal.show();
|
||
}
|
||
|
||
// 页面加载完成后的初始化
|
||
document.addEventListener('DOMContentLoaded', () => {
|
||
// 初始化组件
|
||
ComponentLoader.init();
|
||
|
||
// 初始化工具提示
|
||
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
|
||
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
||
return new bootstrap.Tooltip(tooltipTriggerEl)
|
||
});
|
||
|
||
// 案例切换功能初始化
|
||
initCaseTabs();
|
||
|
||
// 表单步骤功能初始化
|
||
initFormSteps();
|
||
});
|
||
|
||
// 案例切换功能
|
||
function initCaseTabs() {
|
||
document.querySelectorAll('.case-tab').forEach(tab => {
|
||
tab.addEventListener('click', function() {
|
||
document.querySelector('.case-tab.active').classList.remove('active');
|
||
this.classList.add('active');
|
||
|
||
const type = this.textContent;
|
||
document.querySelectorAll('.case-item').forEach(item => {
|
||
item.style.display = item.dataset.type === type ? 'block' : 'none';
|
||
});
|
||
});
|
||
});
|
||
|
||
// 初始化显示政府案例
|
||
document.querySelectorAll('.case-item').forEach(item => {
|
||
if(item.dataset.type !== '政府案例') {
|
||
item.style.display = 'none';
|
||
}
|
||
});
|
||
}
|
||
|
||
// 表单步骤功能
|
||
function initFormSteps() {
|
||
const form = document.getElementById('dataAccessForm');
|
||
if (!form) return; // 如果页面上没有表单,直接返回
|
||
|
||
const steps = document.querySelectorAll('.form-step');
|
||
const progressSteps = document.querySelectorAll('.step');
|
||
const prevBtn = document.getElementById('prevBtn');
|
||
const nextBtn = document.getElementById('nextBtn');
|
||
let currentStep = 0;
|
||
|
||
function updateSteps() {
|
||
steps.forEach((step, index) => {
|
||
step.classList.toggle('d-none', index !== currentStep);
|
||
});
|
||
|
||
progressSteps.forEach((step, index) => {
|
||
if (index === currentStep) {
|
||
step.classList.add('active');
|
||
} else if (index < currentStep) {
|
||
step.classList.add('completed');
|
||
step.classList.remove('active');
|
||
} else {
|
||
step.classList.remove('active', 'completed');
|
||
}
|
||
});
|
||
|
||
prevBtn.disabled = currentStep === 0;
|
||
nextBtn.textContent = currentStep === steps.length - 1 ? '提交' : '下一步';
|
||
}
|
||
|
||
function validateCurrentStep() {
|
||
const currentStepElement = steps[currentStep];
|
||
const inputs = currentStepElement.querySelectorAll('input, select');
|
||
let isValid = true;
|
||
|
||
inputs.forEach(input => {
|
||
if (input.hasAttribute('required') && !input.value) {
|
||
isValid = false;
|
||
input.classList.add('is-invalid');
|
||
} else {
|
||
input.classList.remove('is-invalid');
|
||
}
|
||
});
|
||
|
||
return isValid;
|
||
}
|
||
|
||
// 初始化接入方式选择
|
||
initAccessMethodSelect();
|
||
|
||
// 按钮事件监听
|
||
prevBtn?.addEventListener('click', () => {
|
||
if (currentStep > 0) {
|
||
currentStep--;
|
||
updateSteps();
|
||
}
|
||
});
|
||
|
||
nextBtn?.addEventListener('click', () => {
|
||
if (!validateCurrentStep()) return;
|
||
|
||
if (currentStep < steps.length - 1) {
|
||
currentStep++;
|
||
updateSteps();
|
||
} else if (form.checkValidity()) {
|
||
alert('表单提交成功!');
|
||
// 这里添加实际的表单提交逻辑
|
||
}
|
||
});
|
||
|
||
updateSteps();
|
||
}
|
||
|
||
// 接入方式选择功能
|
||
function initAccessMethodSelect() {
|
||
const accessMethodSelect = document.querySelector('select');
|
||
const accessMethodForms = document.getElementById('accessMethodForms');
|
||
|
||
if (!accessMethodSelect || !accessMethodForms) return;
|
||
|
||
accessMethodSelect.addEventListener('change', function(e) {
|
||
const method = e.target.value;
|
||
accessMethodForms.innerHTML = getAccessMethodHTML(method);
|
||
});
|
||
}
|
||
|
||
function getAccessMethodHTML(method) {
|
||
const templates = {
|
||
file: `
|
||
<div class="mb-3">
|
||
<label class="form-label">选择文件</label>
|
||
<input type="file" class="form-control" required>
|
||
<div class="form-text">支持的格式:CSV, Excel, JSON</div>
|
||
</div>
|
||
`,
|
||
api: `
|
||
<div class="mb-3">
|
||
<label class="form-label">API 地址</label>
|
||
<input type="url" class="form-control" required>
|
||
</div>
|
||
<div class="mb-3">
|
||
<label class="form-label">认证令牌</label>
|
||
<input type="text" class="form-control" required>
|
||
</div>
|
||
<button type="button" class="btn btn-outline-primary" onclick="testConnection()">测试连接</button>
|
||
`,
|
||
database: `
|
||
<div class="mb-3">
|
||
<label class="form-label">数据库类型</label>
|
||
<select class="form-select" required>
|
||
<option value="mysql">MySQL</option>
|
||
<option value="postgresql">PostgreSQL</option>
|
||
<option value="sqlserver">SQL Server</option>
|
||
</select>
|
||
</div>
|
||
<div class="mb-3">
|
||
<label class="form-label">连接字符串</label>
|
||
<input type="text" class="form-control" required>
|
||
</div>
|
||
<button type="button" class="btn btn-outline-primary" onclick="testConnection()">测试连接</button>
|
||
`
|
||
};
|
||
|
||
return templates[method] || '';
|
||
}
|
||
|
||
// 测试连接功能
|
||
window.testConnection = function() {
|
||
const btn = event.target;
|
||
const originalText = btn.textContent;
|
||
btn.disabled = true;
|
||
btn.innerHTML = '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> 测试中...';
|
||
|
||
setTimeout(() => {
|
||
btn.disabled = false;
|
||
btn.textContent = originalText;
|
||
alert('连接测试成功!');
|
||
}, 2000);
|
||
};
|