From aa42e28173cf55d0732a201e8ebb3b62cd0d1143 Mon Sep 17 00:00:00 2001 From: jinchao <383321154@qq.com> Date: Wed, 30 Apr 2025 13:47:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=9E=84=E5=9E=8B?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=86=E6=95=B0=E6=8D=AE=E5=BA=93=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Release/database/XNSim.db | Bin 106496 -> 118784 bytes Release/database/users.csv | 2 - XNSimHtml/assets/icons/png/bell_b.png | Bin 0 -> 5123 bytes XNSimHtml/assets/icons/png/font_b.png | Bin 0 -> 2423 bytes XNSimHtml/assets/icons/png/palette_b.png | Bin 0 -> 3892 bytes XNSimHtml/assets/icons/png/search_b.png | Bin 0 -> 5519 bytes XNSimHtml/components/header-tools.js | 171 ++++++++++++++++++++ XNSimHtml/components/model-development.js | 28 ++-- XNSimHtml/components/service-development.js | 2 +- XNSimHtml/main.html | 13 +- XNSimHtml/routes/model-dev.js | 15 +- XNSimHtml/routes/products.js | 16 ++ XNSimHtml/server.js | 2 + XNSimHtml/utils/db-utils.js | 135 ++++++++++++---- 14 files changed, 336 insertions(+), 48 deletions(-) delete mode 100644 Release/database/users.csv create mode 100644 XNSimHtml/assets/icons/png/bell_b.png create mode 100644 XNSimHtml/assets/icons/png/font_b.png create mode 100644 XNSimHtml/assets/icons/png/palette_b.png create mode 100644 XNSimHtml/assets/icons/png/search_b.png create mode 100644 XNSimHtml/components/header-tools.js create mode 100644 XNSimHtml/routes/products.js diff --git a/Release/database/XNSim.db b/Release/database/XNSim.db index 351051f2db80d07d617cd0c2dcc4f0fcec914b04..2090c35b0af8cbacf4d6fd182b8faeef379f5992 100644 GIT binary patch delta 2879 zcmai#4^R`?9mjW*Y{G8x-V1~f{u9G7mH&(U-06+Dj@q7b;@xTM)q)pCPMw=Ndaa%IYU^~`&dDEdDgr0hSY+LsdBL{U`Q;w8g(+i;E*!&MuG89bu2Bb`$j?S2dxqwBo+QH`?Tm~MFYG?GaB^_|y<-czPA!b?nLl=5 zZuhxc{R4A5Cn86NFr5A1;{03hE{wf8d*Ni{=#Kdx56*sYdj74`^FMh#a&UZZc(LQng%tpMpOH&FcH=*>J4(FKV-n)F1WR-Xf3F=bBUO zI;+(h6GIOq^=&IArH7M`)Y6G{vN*jtE5)YEldPz>SF*lzbTysmrsMP$OG>4#K(ea0 zZIP^(N2+LUghH3l2>KL#isg9?u_~N)1(Tbi7tV|&awLa5gE8abwXpy z^^pVxF~2`f8?AU!0>@G)j9L(YzlX!H85+PeI0#%oueq+-si{#vR9{eURX@Xh%)P6aV`3kOn(E|Sxl0?v)IMU zn5>S8o^^FP7nG|oc~l`gQw&O!nCKjfYOJ5JfHH;<&m#HzOaUlUM3XI;G{`Z@_D~kF zo@Z{_L8A;4vxmwR$>y6iU;~XwmWwirxQOr;h4#Zc=%1(wFXk0=0^UML(I84d zThKJ>K;K0)szes}FLV)=px@#}9D~Blox{Q#cMWPzoDOGYE z-PBOY2v_c|6*FkgQt&wVo8~NfAC-a}z`_#n3T#H3;5{@6x1u5N5g66nK=Ba3Yrumu z^lQTJJxrDkBhc>UG6Z*&^ z>BKQz?f1365OM^%L&2U7J`f`QMZ_K_MR5{yH=$NSV+~9iPS+IT`JgY*PIw{V+GHjZ zbEh}ZhH(w=4L&jw5`XA`6VSKvn-j(GU!$6%^ro>C5zG85~rVs|*$ky~{5AMwv;o!X0Izf}&*m zhevnB%aqhP9RJZz#!&ALkG@0i9Uk2%%X0|V)v3M)Ty{@usJo?L=_!6dwO(aNOQQ$8 zA@BG6{1RWfvz3i@o7--5+bW!PqiG47j4L^IX;km+;7zRCzR_*0cj3$9bP8KliNXW} z^otWj7c*ymwo+;MmPOdhB?|vg#|SCvByKRhLTaiTH&v4yJ>iL%uP9T)X4Md_%UPBg zhs|4u+so1vZLF{BY~%giy1ca_ur7hvyk|vFxCFF$Wf5r{g%xxJLVWOfZ!6zYuxuDJ7*nJ&WM|X6T%yd&jLQb9<$^D> zNvb#Xc8B}#5(HT_8NQRV_P2<(a~)S2EDysVZ}z#)a3gi zmip@)3cuQ+zB9ykN1GZN9d)+GX5$8X^Gb&)O6TRvo?}|n$&_Of_gj=yIZsG~H>aQh z#WHK5uu79HoK|Rr98Iw>!~9k7YHZ>23KK0WHVc=ymBJaWO1K(xT*!xcf(`spXn~Ew Y?~o;Y2By;ZJW**G8o%7B`0;b}Uk_w4D*ylh delta 1868 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 literal 0 HcmV?d00001 diff --git a/XNSimHtml/assets/icons/png/palette_b.png b/XNSimHtml/assets/icons/png/palette_b.png new file mode 100644 index 0000000000000000000000000000000000000000..26d5b33145ec6fba578771b497a350ee070db803 GIT binary patch literal 3892 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 literal 0 HcmV?d00001 diff --git a/XNSimHtml/assets/icons/png/search_b.png b/XNSimHtml/assets/icons/png/search_b.png new file mode 100644 index 0000000000000000000000000000000000000000..2f0221f04bd4338cef4037ba5126e8522ba6a4ef GIT binary patch literal 5519 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 literal 0 HcmV?d00001 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 @@
+