diff --git a/Release/database/XNSim.db b/Release/database/XNSim.db index 351051f..2090c35 100644 Binary files a/Release/database/XNSim.db and b/Release/database/XNSim.db differ diff --git a/Release/database/users.csv b/Release/database/users.csv deleted file mode 100644 index 26a13b2..0000000 --- a/Release/database/users.csv +++ /dev/null @@ -1,2 +0,0 @@ -USER_ID,USER_NAME,USER_PASSWORD,USER_ACCESS -0,admin,4a0f4f90ee7c4bcfe1aaed38f83270c2e04d24250bf4370617f4cb792a9e5a3b,4 diff --git a/XNSimHtml/assets/icons/png/bell_b.png b/XNSimHtml/assets/icons/png/bell_b.png new file mode 100644 index 0000000..202bdb2 Binary files /dev/null and b/XNSimHtml/assets/icons/png/bell_b.png differ diff --git a/XNSimHtml/assets/icons/png/font_b.png b/XNSimHtml/assets/icons/png/font_b.png new file mode 100644 index 0000000..3ceb750 Binary files /dev/null and b/XNSimHtml/assets/icons/png/font_b.png differ diff --git a/XNSimHtml/assets/icons/png/palette_b.png b/XNSimHtml/assets/icons/png/palette_b.png new file mode 100644 index 0000000..26d5b33 Binary files /dev/null and b/XNSimHtml/assets/icons/png/palette_b.png differ diff --git a/XNSimHtml/assets/icons/png/search_b.png b/XNSimHtml/assets/icons/png/search_b.png new file mode 100644 index 0000000..2f0221f Binary files /dev/null and b/XNSimHtml/assets/icons/png/search_b.png differ diff --git a/XNSimHtml/components/header-tools.js b/XNSimHtml/components/header-tools.js new file mode 100644 index 0000000..d6086bf --- /dev/null +++ b/XNSimHtml/components/header-tools.js @@ -0,0 +1,171 @@ +class HeaderTools extends HTMLElement { + constructor() { + super(); + this.attachShadow({ mode: 'open' }); + this.render(); + this.addEventListeners(); + } + + // 添加getter方法 + get selectedProduct() { + return this.shadowRoot.getElementById('productSelect').value; + } + + render() { + this.shadowRoot.innerHTML = ` + +
+ 构型: + +
+ +
+ 字体 +
+
+ 主题 +
+
+ 通知 +
+
+ 在线用户 +
+ `; + } + + addEventListeners() { + // 加载构型列表 + this.loadProducts(); + + // 字体大小调整 + this.shadowRoot.getElementById('fontSizeBtn').addEventListener('click', () => { + this.dispatchEvent(new CustomEvent('font-size-click')); + }); + + // 主题调整 + this.shadowRoot.getElementById('themeBtn').addEventListener('click', () => { + this.dispatchEvent(new CustomEvent('theme-click')); + }); + + // 通知 + this.shadowRoot.getElementById('notificationBtn').addEventListener('click', () => { + this.dispatchEvent(new CustomEvent('notification-click')); + }); + + // 在线用户 + this.shadowRoot.getElementById('onlineUsersBtn').addEventListener('click', () => { + this.dispatchEvent(new CustomEvent('online-users-click')); + }); + + // 构型选择 + this.shadowRoot.getElementById('productSelect').addEventListener('change', (e) => { + this.dispatchEvent(new CustomEvent('product-change', { + detail: { product: e.target.value } + })); + }); + } + + async loadProducts() { + try { + const response = await fetch('/api/products'); + if (!response.ok) { + throw new Error('获取构型列表失败'); + } + const products = await response.json(); + const select = this.shadowRoot.getElementById('productSelect'); + + // 清空现有选项 + select.innerHTML = ''; + + products.forEach(product => { + const option = document.createElement('option'); + option.value = product.ProductName; + option.textContent = product.ProductName; + select.appendChild(option); + }); + } catch (error) { + console.error('加载构型列表失败:', error); + // 可以在这里添加错误提示UI + } + } +} + +customElements.define('header-tools', HeaderTools); \ No newline at end of file diff --git a/XNSimHtml/components/model-development.js b/XNSimHtml/components/model-development.js index 4e19346..de2c705 100644 --- a/XNSimHtml/components/model-development.js +++ b/XNSimHtml/components/model-development.js @@ -393,10 +393,14 @@ class ModelDevelopment extends HTMLElement { async fetchModels(chapterId) { try { - const response = await fetch(`/api/chapter-models/${chapterId}`); + const headerTools = document.querySelector('header-tools'); + const productName = headerTools.selectedProduct; + const response = await fetch(`/api/chapter-models/${chapterId}?productName=${encodeURIComponent(productName)}`); + if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } + this.currentModels = await response.json(); this.currentChapter = this.chapters.find(chapter => chapter.ID === chapterId); this.renderModels(); @@ -408,7 +412,10 @@ class ModelDevelopment extends HTMLElement { async fetchModelVersions(className, modelName) { try { - const response = await fetch(`/api/model-versions/${encodeURIComponent(className)}`); + const headerTools = document.querySelector('header-tools'); + const productName = headerTools.selectedProduct; + + const response = await fetch(`/api/model-versions/${encodeURIComponent(className)}?productName=${encodeURIComponent(productName)}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } @@ -423,6 +430,10 @@ class ModelDevelopment extends HTMLElement { async saveModelVersion(versionData) { try { + const headerTools = document.querySelector('header-tools'); + const productName = headerTools.selectedProduct; + versionData.ProductName = productName; + const response = await fetch('/api/model-versions', { method: 'POST', headers: { @@ -430,14 +441,12 @@ class ModelDevelopment extends HTMLElement { }, body: JSON.stringify(versionData) }); - + if (!response.ok) { - const errorData = await response.json(); - throw new Error(errorData.error || `HTTP error! status: ${response.status}`); + throw new Error(`HTTP error! status: ${response.status}`); } - - const result = await response.json(); - return result; + + return await response.json(); } catch (error) { console.error('保存模型版本失败:', error); throw error; @@ -532,7 +541,7 @@ class ModelDevelopment extends HTMLElement { backButton.innerHTML = `← 返回章节列表`; backButton.addEventListener('click', () => this.renderChapters()); container.appendChild(backButton); - + if (this.currentModels.length === 0) { const emptyState = document.createElement('div'); emptyState.className = 'empty-state'; @@ -1753,7 +1762,6 @@ class ModelDevelopment extends HTMLElement { // 组件被重新激活时调用 reactivate() { - console.log('组件被重新激活'); if (this.currentView === 'chapters') { this.init(); } else if (this.currentView === 'models' && this.currentChapter) { diff --git a/XNSimHtml/components/service-development.js b/XNSimHtml/components/service-development.js index b71561a..9c1a528 100644 --- a/XNSimHtml/components/service-development.js +++ b/XNSimHtml/components/service-development.js @@ -720,7 +720,7 @@ class ServiceDevelopment extends HTMLElement { // 组件被重新激活时调用 reactivate() { - console.log('服务开发组件被重新激活'); + } showVersionEditor(versionData) { diff --git a/XNSimHtml/main.html b/XNSimHtml/main.html index 13eb3fb..da8a01b 100644 --- a/XNSimHtml/main.html +++ b/XNSimHtml/main.html @@ -142,6 +142,13 @@ height: 20px; } + /* 添加新的样式 */ + .header-right { + display: flex; + align-items: center; + gap: 16px; + } + /* 重置body样式 */ body { margin: 0; @@ -185,7 +192,10 @@ 主页 / 概览 主页 / 概览 - +
+ + +
@@ -195,6 +205,7 @@
+