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 @@
+