From ff11ee0e1c08aaafeaf32ee0bc370cb5fec93ba1 Mon Sep 17 00:00:00 2001 From: fengpu <18691763612@163.com> Date: Tue, 14 Jul 2026 19:32:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=90=A5=E5=85=BB=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=8E=9F=E5=9E=8B=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=88=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=B4=AD?= =?UTF-8?q?=E4=B9=B0=E5=87=80=E8=8F=9C=E5=8C=85+=E5=81=A5=E5=BA=B7?= =?UTF-8?q?=E6=A1=A3=E6=A1=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- --full-page | Bin 39258 -> 0 bytes final.js | 224 ------ .../mini-program/nutrition/ask-home.html | 2 +- .../mini-program/nutrition/eat-cart.html | 135 +++- .../mini-program/nutrition/eat-home.html | 2 +- .../mini-program/nutrition/eat-nutrition.html | 2 +- .../nutrition/eat-order-confirm.html | 408 ++++++++++- .../mini-program/nutrition/eat-order.html | 155 +++- .../nutrition/eat-recipe-today.html | 2 +- .../mini-program/nutrition/eat-recipe.html | 4 +- .../mini-program/nutrition/make-home.html | 2 +- .../mini-program/nutrition/make-popular.html | 2 +- .../mini-program/nutrition/make-ranking.html | 2 +- .../mini-program/nutrition/me-health.html | 674 ++++++++++++++---- .../mini-program/nutrition/me-home.html | 12 +- .../nutrition/me-order-detail.html | 180 ++++- .../mini-program/nutrition/me-orders.html | 47 +- start-server.bat | 10 - web-admin/nutrition/din-dish-add.html | 38 +- web-admin/nutrition/din-dish-all.html | 32 +- web-admin/nutrition/din-user-mgmt.html | 2 - 21 files changed, 1514 insertions(+), 421 deletions(-) delete mode 100644 --full-page delete mode 100644 final.js delete mode 100644 start-server.bat diff --git a/--full-page b/--full-page deleted file mode 100644 index 73c43a1b51933367f120e6f716aca7d02854cedc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39258 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 zZVj{if(!s){console.log('FAIL: '+desc);process.exit(1);}console.log('OK: '+desc);}; - -// ═══ CSS changes (no Chinese text needed) ═══ -d=d.replace('grid-template-columns:1fr 1fr;gap:10px;','grid-template-columns:1fr 1fr 1fr;gap:8px;'); -d=d.replace('.stat-card{background:rgba(24,144,255,0.06);border:1px solid var(--panel-border);border-radius:8px;\r\n padding:12px;text-align:center;transition:all .2s;cursor:pointer;}', - '.stat-card{display:flex;flex-direction:column;justify-content:center;align-items:center;gap:3px;\r\n padding:10px 6px;min-height:66px;text-align:center;position:relative;overflow:hidden;cursor:pointer;\r\n background:linear-gradient(135deg,rgba(24,144,255,0.10),rgba(10,30,60,0.45));\r\n border:1px solid var(--panel-border);border-radius:8px;transition:all .25s;}\r\n .stat-card::before{content:\"\";position:absolute;left:0;top:20%;bottom:20%;width:3px;\r\n background:var(--primary);border-radius:0 2px 2px 0;box-shadow:0 0 8px rgba(24,144,255,0.55);}\r\n .stat-card::after{content:\"\";position:absolute;inset:0;pointer-events:none;\r\n background:radial-gradient(ellipse at 100% 0%,rgba(24,144,255,0.06),transparent 55%);}'); -d=d.replace('.stat-card:hover{border-color:rgba(24,144,255,0.35);box-shadow:0 0 12px rgba(24,144,255,0.1);}', - '.stat-card:hover{border-color:rgba(24,144,255,0.45);box-shadow:0 0 16px rgba(24,144,255,0.15);\r\n transform:translateY(-2px);background:linear-gradient(135deg,rgba(24,144,255,0.16),rgba(10,30,60,0.50));}'); -d=d.replace('.stat-card__num{font-size:24px;font-weight:700;color:#fff;line-height:1;text-shadow:0 0 8px rgba(255,255,255,0.2);}', - '.stat-card__num{font-size:20px;font-weight:700;color:#fff;line-height:1;\r\n text-shadow:0 0 10px rgba(24,144,255,0.35);font-variant-numeric:tabular-nums;letter-spacing:0.5px;}'); -d=d.replace('.stat-card__label{font-size:11px;color:var(--text-sub);margin-top:6px;}', - '.stat-card__label{font-size:10px;color:var(--text-sub);white-space:nowrap;letter-spacing:0.3px;}'); -for(const[old,nw] of[ - ['.stat-card--danger .stat-card__num{color:var(--danger);text-shadow:0 0 8px rgba(255,77,79,0.3);}', - '.stat-card--danger::before{background:var(--danger);box-shadow:0 0 8px rgba(255,77,79,0.55);}\r\n .stat-card--danger .stat-card__num{color:var(--danger);text-shadow:0 0 10px rgba(255,77,79,0.4);}\r\n .stat-card--danger::after{background:radial-gradient(ellipse at 100% 0%,rgba(255,77,79,0.06),transparent 55%);}\r\n .stat-card--danger:hover{border-color:rgba(255,77,79,0.3);box-shadow:0 0 16px rgba(255,77,79,0.15);}'], - ['.stat-card--warning .stat-card__num{color:var(--warning);text-shadow:0 0 8px rgba(250,173,20,0.3);}', - '.stat-card--warning::before{background:var(--warning);box-shadow:0 0 8px rgba(250,173,20,0.55);}\r\n .stat-card--warning .stat-card__num{color:var(--warning);text-shadow:0 0 10px rgba(250,173,20,0.4);}\r\n .stat-card--warning::after{background:radial-gradient(ellipse at 100% 0%,rgba(250,173,20,0.06),transparent 55%);}\r\n .stat-card--warning:hover{border-color:rgba(250,173,20,0.3);box-shadow:0 0 16px rgba(250,173,20,0.15);}'], - ['.stat-card--success .stat-card__num{color:var(--success);text-shadow:0 0 8px rgba(82,196,26,0.3);}', - '.stat-card--success::before{background:var(--success);box-shadow:0 0 8px rgba(82,196,26,0.55);}\r\n .stat-card--success .stat-card__num{color:var(--success);text-shadow:0 0 10px rgba(82,196,26,0.4);}\r\n .stat-card--success::after{background:radial-gradient(ellipse at 100% 0%,rgba(82,196,26,0.06),transparent 55%);}\r\n .stat-card--success:hover{border-color:rgba(82,196,26,0.3);box-shadow:0 0 16px rgba(82,196,26,0.15);}'] -]) d=d.replace(old,nw); -d=d.replace('/* ========== 左侧:服务详情 ========== */','/* ========== 左侧:应急事件统计卡片 ========== */'); - -// CSS: alarm-bars + radar -d=d.replace(' /* ========== 左侧:体检数据排行 ========== */', -` /* ========== 左侧:穿戴告警统计柱状图 ========== */ - .panel--alarm-bars .panel__body{padding:8px 10px 10px;overflow:hidden;} - .alarm-bars{display:flex;flex-direction:column;gap:7px;} - .alarm-bars__row{display:flex;align-items:center;gap:8px;min-height:22px;} - .alarm-bars__label{width:54px;font-size:10px;color:var(--text-sub);text-align:right;flex-shrink:0;white-space:nowrap;line-height:1.2;} - .alarm-bars__track{flex:1;height:12px;background:rgba(24,144,255,0.06);border-radius:6px;overflow:hidden;position:relative;} - .alarm-bars__bar{height:100%;border-radius:6px;transition:width .6s ease;position:relative;min-width:4px;} - .alarm-bars__bar::after{content:"";position:absolute;right:0;top:0;bottom:0;width:2px;background:rgba(255,255,255,0.25);border-radius:0 6px 6px 0;} - .alarm-bars__count{width:32px;font-size:11px;font-weight:700;color:#fff;text-align:right;flex-shrink:0;font-variant-numeric:tabular-nums;} - - /* ========== 右侧:体检数据雷达图 ========== */ - .panel--checkup-radar .panel__body{padding:6px 10px 8px;overflow:hidden;} - .checkup-radar{display:flex;align-items:center;justify-content:center;} - .checkup-radar svg{width:100%;max-width:280px;height:auto;display:block;} - .radar-dot{animation:radarPulse 2s ease-in-out infinite;filter:drop-shadow(0 0 4px rgba(24,144,255,0.6));} - @keyframes radarPulse{0%,100%{opacity:0.6;r:2.5;}50%{opacity:1;r:3.5;}} - - /* ========== 左侧:体检数据排行 ========== */`); - -// CSS: AI risk tooltip -d=d.replace('.ai-risk-col{min-width:0;display:flex;flex-direction:column;align-items:center;gap:4px;}', - '.ai-risk-col{min-width:0;display:flex;flex-direction:column;align-items:center;gap:4px;position:relative;}'); -d=d.replace('.ai-risk-stack{height:72px;width:32px;display:flex;flex-direction:column;justify-content:flex-end;\r\n border-radius:5px 5px 3px 3px;overflow:hidden;background:rgba(24,144,255,0.06);\r\n box-shadow:inset 0 0 0 1px rgba(24,144,255,0.12);}', - '.ai-risk-stack{height:72px;width:32px;display:flex;flex-direction:column;justify-content:flex-end;\r\n border-radius:5px 5px 3px 3px;overflow:hidden;background:rgba(24,144,255,0.06);\r\n box-shadow:inset 0 0 0 1px rgba(24,144,255,0.12);cursor:pointer;}\r\n .ai-risk-stack:hover{border-color:rgba(24,144,255,0.4);}\r\n .ai-risk-tip{position:absolute;bottom:80px;left:50%;transform:translateX(-50%);z-index:30;\r\n background:rgba(10,22,48,0.96);border:1px solid rgba(24,144,255,0.35);border-radius:8px;\r\n padding:8px 10px;white-space:nowrap;pointer-events:none;\r\n opacity:0;transition:opacity .2s,bottom .2s;\r\n box-shadow:0 4px 18px rgba(0,0,0,0.5),0 0 12px rgba(24,144,255,0.15);\r\n font-size:11px;color:var(--text-sub);line-height:1.7;text-align:left;}\r\n .ai-risk-tip::after{content:\"\";position:absolute;top:100%;left:50%;transform:translateX(-50%);\r\n width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;\r\n border-top:5px solid rgba(10,22,48,0.96);}\r\n .ai-risk-tip b{font-weight:600;}\r\n .ai-risk-col:hover .ai-risk-tip{opacity:1;bottom:84px;}'); -console.log('CSS all done'); - -// ═══ HTML: Read 4th stat-card directly from file ═══ -const ljsl=d.indexOf('累计受理次数'); -const cardBeg=d.lastIndexOf('
156
待处理工单
\r\n
3,232
已完成工单
'; -d=d.replace(card4,card4n); -ok(d.includes('待处理工单'),'6 stat cards'); - -// ═══ HTML: Replace help events with alarm bars ═══ -const helpBeg=d.indexOf(' '); -const healthBeg=d.indexOf(' '); -const helpBlock=d.substring(helpBeg,healthBeg); -const alarmBars=` -
-
-
- 穿戴告警统计 - -
-
-
-
心率异常
126
-
体温异常
54
-
血氧异常
38
-
压力异常
72
-
一键告警
18
-
摔倒
9
-
-
-
- -`; -d=d.replace(helpBlock,alarmBars); -ok(d.includes('alarmBarsChart')&&!d.includes('应急求助事件(自动滚动列表)'),'alarm bars + remove help'); - -// ═══ HTML: Move AI from right to left ═══ -const aiBeg=d.indexOf('a id="aiPanel"'); -const aiBlockStart=d.lastIndexOf(' ',aiBeg); -const rAside=d.lastIndexOf(' '); -const aiBlock=d.substring(aiBlockStart,rAside); -d=d.split(aiBlock).join('');// Remove from right -// Insert before 人员现状监测 on left -const healthPos=d.indexOf(' '); -d=d.substring(0,healthPos)+aiBlock+'\r\n'+d.substring(healthPos); -ok(d.includes('AI智能预警分析'),'AI moved to left'); - -// ═══ HTML: AI rename + dropdown + tooltips ═══ -d=d.replace('AI智能预警分析','心脑血管预警统计(历史记录)'); -d=d.replace(' ',' '); -// Remove old history link, add dropdown -const histBeg=d.indexOf('pan>历史记录'); -const linkLineStart=d.lastIndexOf(''); -const rpEnd=d.indexOf(' ',rpBeg); -const nrp=` - '),'right:',cnt(''),'left:',cnt('')); -console.log('6cards:',cnt('待处理工单'),'alarm:',cnt('alarmBarsChart'),'help:',cnt('应急求助事件(自动滚动列表)')); -console.log('CV:',cnt('心脑血管预警统计'),'radar:',cnt('checkupRadar'),'consult:',cnt('咨询数据')); -console.log('health:',cnt('人员现状监测(环形图)'),'renderAlarmBars:',cnt('renderAlarmBars'),'updateCvStats:',cnt('updateCvStats')); -fs.writeFileSync(f,d,'utf8'); -console.log('DONE. Size:',d.length); diff --git a/other-module/mini-program/nutrition/ask-home.html b/other-module/mini-program/nutrition/ask-home.html index 91a3cc7..3302b3e 100644 --- a/other-module/mini-program/nutrition/ask-home.html +++ b/other-module/mini-program/nutrition/ask-home.html @@ -112,7 +112,7 @@ 🍽️ 💬 🍳 - 👤 + 👤
diff --git a/other-module/mini-program/nutrition/eat-cart.html b/other-module/mini-program/nutrition/eat-cart.html index 02415f7..a10144e 100644 --- a/other-module/mini-program/nutrition/eat-cart.html +++ b/other-module/mini-program/nutrition/eat-cart.html @@ -42,6 +42,35 @@ content: ''; width: 120px; height: 5px; background: #1a1a1a; border-radius: 3px; opacity: 0.2; } + /* 订单类型 Tab */ + .type-tabs { display: flex; background: #fff; border-bottom: 0.5px solid #f0f0f0; padding: 0 16px; flex-shrink: 0; } + .type-tab { + flex: 1; text-align: center; padding: 12px 0; font-size: 14px; color: #666; + position: relative; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 4px; + } + .type-tab.active { color: #1677ff; font-weight: 600; } + .type-tab.active::after { + content: ''; position: absolute; bottom: 0; left: 30%; right: 30%; height: 2px; + background: #1677ff; border-radius: 1px; + } + .type-tab .tab-count { + font-size: 11px; min-width: 18px; height: 18px; line-height: 18px; padding: 0 5px; + background: #f0f0f0; color: #666; border-radius: 9px; font-weight: 600; + } + .type-tab.active .tab-count { background: #e6f4ff; color: #1677ff; } + .type-tab .presale-tag { + font-size: 10px; padding: 0 4px; background: #fff7e6; color: #fa8c16; + border-radius: 3px; font-weight: 600; + } + .cart-panel.hidden { display: none; } + /* 净菜包预售提示 */ + .presale-hint { + display: flex; align-items: flex-start; gap: 8px; + margin: 8px 12px; padding: 10px 12px; + background: #fff7e6; border-radius: 8px; font-size: 12px; color: #fa8c16; line-height: 1.5; + } + .presale-hint .hint-icon { font-size: 14px; flex-shrink: 0; } + .presale-hint b { font-weight: 600; } /* 购物车商品列表 */ .cart-section { background: #fff; margin-bottom: 8px; } .cart-section .sec-title { @@ -116,7 +145,14 @@ 购物车 + +
+
🍽️ 餐品 3
+
🥬 餐品净菜包 预售 2
+
+ +
已选菜品(3)
@@ -183,17 +219,110 @@
备注
+
+ + +
-
合计 ¥38.00
-
已享员工餐补优惠
+
合计 ¥38.00
+
已享员工餐补优惠
- 提交订单 + 提交订单
+ diff --git a/other-module/mini-program/nutrition/eat-home.html b/other-module/mini-program/nutrition/eat-home.html index 21be0d1..51d4068 100644 --- a/other-module/mini-program/nutrition/eat-home.html +++ b/other-module/mini-program/nutrition/eat-home.html @@ -165,7 +165,7 @@ 🍽️ 💬 🍳 - 👤 + 👤
diff --git a/other-module/mini-program/nutrition/eat-nutrition.html b/other-module/mini-program/nutrition/eat-nutrition.html index f0e0bca..d5803c8 100644 --- a/other-module/mini-program/nutrition/eat-nutrition.html +++ b/other-module/mini-program/nutrition/eat-nutrition.html @@ -327,7 +327,7 @@ 🍽️ 💬 🍳 - 👤 + 👤
diff --git a/other-module/mini-program/nutrition/eat-order-confirm.html b/other-module/mini-program/nutrition/eat-order-confirm.html index 27d499d..a1e5eed 100644 --- a/other-module/mini-program/nutrition/eat-order-confirm.html +++ b/other-module/mini-program/nutrition/eat-order-confirm.html @@ -51,6 +51,146 @@ .order-total { display: flex; justify-content: space-between; padding-top: 12px; border-top: 1px solid #f0f0f0; margin-top: 8px; } .order-total .label { font-size: 14px; font-weight: 600; } .order-total .amount { font-size: 18px; font-weight: 800; color: #f5222d; } + /* 净菜包履约信息卡 */ + .fulfill-card { + margin: 0 16px 12px; background: #fff; border-radius: 12px; padding: 16px; + } + .fulfill-title { + font-size: 14px; font-weight: 600; margin-bottom: 12px; + display: flex; align-items: center; gap: 6px; + } + .fulfill-row { + display: flex; padding: 8px 0; border-bottom: 0.5px solid #f5f5f5; + font-size: 13px; + } + .fulfill-row:last-of-type { border-bottom: none; } + .fr-label { width: 80px; color: #999; flex-shrink: 0; } + .fr-value { flex: 1; color: #333; line-height: 1.5; } + .fr-value.highlight { color: #fa8c16; font-weight: 600; } + .fulfill-tip { + margin-top: 10px; padding: 8px 10px; background: #fff7e6; border-radius: 6px; + font-size: 11px; color: #fa8c16; line-height: 1.5; + } + .presale-tip { + padding: 8px 10px; background: #fff7e6; border-radius: 6px; + font-size: 11px; color: #fa8c16; line-height: 1.5; margin-bottom: 12px; + } + .presale-tip b { font-weight: 600; } + /* 表单组 */ + .form-group { padding: 10px 0; border-bottom: 0.5px solid #f5f5f5; } + .form-group:last-child { border-bottom: none; } + .fg-label { font-size: 13px; font-weight: 600; color: #333; margin-bottom: 8px; } + .fg-label .required { color: #f5222d; margin-left: 2px; } + /* 取货方式 */ + .pickup-methods { display: flex; gap: 8px; } + .pickup-method { + flex: 1; padding: 10px 6px; border-radius: 10px; border: 1.5px solid #e8e8e8; + text-align: center; cursor: pointer; background: #fff; + } + .pickup-method.active { border-color: #1677ff; background: #e6f4ff; } + .pickup-method .pm-icon { font-size: 20px; } + .pickup-method .pm-name { font-size: 13px; font-weight: 600; margin-top: 4px; color: #333; } + .pickup-method .pm-desc { font-size: 10px; color: #999; margin-top: 2px; } + .pickup-method.active .pm-name { color: #1677ff; } + /* 日期/时段 chip */ + .chip-label { font-size: 11px; color: #999; margin: 8px 0 6px; } + .date-chips, .time-chips { display: flex; gap: 6px; flex-wrap: wrap; } + .date-chip, .time-chip { + padding: 6px 10px; border-radius: 14px; background: #f5f5f5; + font-size: 11px; color: #666; cursor: pointer; line-height: 1.4; + } + .date-chip.active, .time-chip.active { + background: #1677ff; color: #fff; font-weight: 600; + } + /* 地址卡片 */ + .address-card, .pickup-card { + padding: 12px; border-radius: 8px; border: 1px solid #e8e8e8; background: #fafafa; + position: relative; + } + .addr-top { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; flex-wrap: wrap; } + .addr-name { font-size: 14px; font-weight: 600; color: #333; } + .addr-phone { font-size: 12px; color: #666; } + .addr-default { font-size: 10px; padding: 1px 6px; border-radius: 8px; background: #fff7e6; color: #fa8c16; font-weight: 600; } + .addr-detail { font-size: 13px; color: #444; line-height: 1.5; padding-right: 56px; } + .addr-edit { display: inline-block; font-size: 12px; color: #1677ff; margin-top: 6px; text-decoration: none; } + .addr-switch { + position: absolute; right: 10px; bottom: 10px; font-size: 12px; color: #1677ff; + background: none; border: none; cursor: pointer; padding: 4px 6px; + } + /* 地址选择列表 */ + .addr-list { margin-top: 10px; display: none; } + .addr-list.show { display: block; } + .addr-option { + padding: 10px 12px; border: 1px solid #e8e8e8; border-radius: 8px; background: #fff; + margin-bottom: 8px; cursor: pointer; position: relative; + } + .addr-option.active { border-color: #1677ff; background: #f0f7ff; } + .addr-option .opt-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 4px; } + .addr-option .opt-name { font-size: 14px; font-weight: 600; color: #333; } + .addr-option .opt-phone { font-size: 12px; color: #666; } + .addr-option .opt-default { font-size: 10px; padding: 1px 6px; border-radius: 8px; background: #fff7e6; color: #fa8c16; font-weight: 600; } + .addr-option .opt-detail { font-size: 12px; color: #555; line-height: 1.5; padding-right: 28px; } + .addr-option .opt-check { + position: absolute; right: 10px; top: 50%; transform: translateY(-50%); + width: 18px; height: 18px; border-radius: 50%; border: 1.5px solid #d9d9d9; + display: flex; align-items: center; justify-content: center; font-size: 12px; color: #fff; + background: #fff; + } + .addr-option.active .opt-check { background: #1677ff; border-color: #1677ff; } + .addr-option .opt-edit { + position: absolute; right: 36px; top: 50%; transform: translateY(-50%); + font-size: 11px; color: #1677ff; background: none; border: none; cursor: pointer; + } + .addr-add-btn { + width: 100%; padding: 10px 0; border-radius: 8px; border: 1px dashed #1677ff; + background: #fff; color: #1677ff; font-size: 13px; font-weight: 600; cursor: pointer; + display: flex; align-items: center; justify-content: center; gap: 4px; + } + /* 新增地址表单 */ + .addr-form { margin-top: 10px; padding: 12px; border-radius: 8px; background: #fff; border: 1px solid #e8e8e8; display: none; } + .addr-form.show { display: block; } + .addr-form .form-row { padding: 8px 0; border-bottom: 0.5px solid #f5f5f5; } + .addr-form .form-row:last-of-type { border-bottom: none; } + .addr-form .form-label { font-size: 12px; color: #666; margin-bottom: 6px; } + .addr-form .form-label .required { color: #f5222d; } + .addr-form .form-input { + width: 100%; height: 34px; border-radius: 6px; border: 1px solid #e8e8e8; + padding: 0 10px; font-size: 13px; background: #f8f9fa; outline: none; + } + .addr-form .form-input:focus { border-color: #1677ff; background: #fff; } + .addr-form .form-textarea { + width: 100%; min-height: 60px; border-radius: 6px; border: 1px solid #e8e8e8; + padding: 8px 10px; font-size: 13px; background: #f8f9fa; outline: none; resize: none; font-family: inherit; + } + .addr-form .form-textarea:focus { border-color: #1677ff; background: #fff; } + .addr-form .form-switch { + display: flex; align-items: center; justify-content: space-between; font-size: 13px; color: #333; + } + .switch-toggle { + width: 36px; height: 20px; border-radius: 10px; background: #d9d9d9; position: relative; + cursor: pointer; transition: background 0.2s; border: none; + } + .switch-toggle::after { + content: ''; position: absolute; left: 2px; top: 2px; width: 16px; height: 16px; + border-radius: 50%; background: #fff; transition: left 0.2s; + } + .switch-toggle.on { background: #1677ff; } + .switch-toggle.on::after { left: 18px; } + .addr-form-actions { display: flex; gap: 8px; margin-top: 12px; } + .addr-form-actions .btn { + flex: 1; height: 36px; border-radius: 18px; border: none; font-size: 13px; + font-weight: 600; cursor: pointer; + } + .addr-form-actions .btn-cancel { background: #f5f5f5; color: #666; } + .addr-form-actions .btn-save { background: #1677ff; color: #fff; } + .pickup-name { font-size: 14px; font-weight: 600; color: #333; } + .pickup-addr { font-size: 12px; color: #666; margin-top: 4px; } + .pickup-time { font-size: 11px; color: #1677ff; margin-top: 4px; } + .presale-status { + font-size: 11px; padding: 2px 8px; border-radius: 8px; + background: #fff7e6; color: #fa8c16; font-weight: 600; + } + .hidden { display: none !important; } .action-btns { padding: 16px; display: flex; gap: 12px; } .action-btns .btn { flex: 1; height: 44px; border-radius: 22px; border: none; font-size: 15px; @@ -73,28 +213,278 @@
-
-
下单成功
-
请凭取餐码到窗口取餐
+
+
下单成功
+
请凭取餐码到窗口取餐
-
+ +
取餐码
A086
请在 30 分钟内取餐,超时将自动取消
+ +
订单详情
-
宫保鸡丁 ×1¥12
-
炒西兰花 ×1¥8
-
清蒸鱼 ×1¥18
-
合计¥38.00
+
+
宫保鸡丁 ×1¥12
+
炒西兰花 ×1¥8
+
清蒸鱼 ×1¥18
+
+
合计¥38.00
-
+ diff --git a/other-module/mini-program/nutrition/eat-order.html b/other-module/mini-program/nutrition/eat-order.html index a71d64f..561415f 100644 --- a/other-module/mini-program/nutrition/eat-order.html +++ b/other-module/mini-program/nutrition/eat-order.html @@ -32,7 +32,23 @@ .page-content { flex: 1; overflow-y: auto; background: #f5f5f5; } .page-content::-webkit-scrollbar { display: none; } /* 业务样式 */ + /* 订单类型 Tab:餐品 / 餐品净菜包 */ + .type-tabs { display: flex; background: #fff; border-bottom: 0.5px solid #f0f0f0; padding: 0 16px; flex-shrink: 0; } + .type-tab { + flex: 1; text-align: center; padding: 12px 0; font-size: 14px; color: #666; + position: relative; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 4px; + } + .type-tab.active { color: #1677ff; font-weight: 600; } + .type-tab.active::after { + content: ''; position: absolute; bottom: 0; left: 30%; right: 30%; height: 2px; + background: #1677ff; border-radius: 1px; + } + .type-tab .presale-tag { + font-size: 10px; padding: 0 4px; background: #fff7e6; color: #fa8c16; + border-radius: 3px; font-weight: 600; + } .order-layout { display: flex; height: 100%; } + .order-layout.hidden { display: none; } .category-sidebar { width: 80px; background: #f8f8f8; overflow-y: auto; flex-shrink: 0; } @@ -113,8 +129,14 @@ 订餐
+ +
+
🍽️ 餐品
+
🥬 餐品净菜包 预售
+
-
+ +
热菜
@@ -200,10 +222,95 @@
+ +
- + 🛒 3 @@ -211,18 +318,36 @@
¥38.00
已选 3 个餐品
- +
diff --git a/other-module/mini-program/nutrition/eat-recipe-today.html b/other-module/mini-program/nutrition/eat-recipe-today.html index 6282b4d..1249fc9 100644 --- a/other-module/mini-program/nutrition/eat-recipe-today.html +++ b/other-module/mini-program/nutrition/eat-recipe-today.html @@ -402,7 +402,7 @@ 🍽️ 💬 🍳 - 👤 + 👤
diff --git a/other-module/mini-program/nutrition/eat-recipe.html b/other-module/mini-program/nutrition/eat-recipe.html index 6cdf851..3cab97e 100644 --- a/other-module/mini-program/nutrition/eat-recipe.html +++ b/other-module/mini-program/nutrition/eat-recipe.html @@ -151,7 +151,7 @@ @@ -190,7 +190,7 @@ 🍽️ 💬 🍳 - 👤 + 👤
diff --git a/other-module/mini-program/nutrition/make-home.html b/other-module/mini-program/nutrition/make-home.html index 62e26b9..8bbc489 100644 --- a/other-module/mini-program/nutrition/make-home.html +++ b/other-module/mini-program/nutrition/make-home.html @@ -192,7 +192,7 @@ 🍽️ 💬 🍳 - 👤 + 👤
diff --git a/other-module/mini-program/nutrition/make-popular.html b/other-module/mini-program/nutrition/make-popular.html index cb57146..6215e61 100644 --- a/other-module/mini-program/nutrition/make-popular.html +++ b/other-module/mini-program/nutrition/make-popular.html @@ -235,7 +235,7 @@ 🍽️ 💬 🍳 - 👤 + 👤
diff --git a/other-module/mini-program/nutrition/make-ranking.html b/other-module/mini-program/nutrition/make-ranking.html index ea788b5..d1d9769 100644 --- a/other-module/mini-program/nutrition/make-ranking.html +++ b/other-module/mini-program/nutrition/make-ranking.html @@ -224,7 +224,7 @@ 🍽️ 💬 🍳 - 👤 + 👤
diff --git a/other-module/mini-program/nutrition/me-health.html b/other-module/mini-program/nutrition/me-health.html index 109c60c..1230da9 100644 --- a/other-module/mini-program/nutrition/me-health.html +++ b/other-module/mini-program/nutrition/me-health.html @@ -23,19 +23,27 @@ .home-indicator { height: 20px; display: flex; align-items: center; justify-content: center; background: #fff; flex-shrink: 0; } .home-indicator::after { content: ''; width: 120px; height: 5px; background: #1a1a1a; border-radius: 3px; opacity: 0.2; } /* 用户卡片 */ - .profile-card { background: #fff; padding: 20px 16px; margin-bottom: 8px; display: flex; align-items: center; gap: 14px; } - .profile-card .avatar { width: 56px; height: 56px; border-radius: 50%; background: linear-gradient(135deg,#e6f4ff,#bae0ff); display: flex; align-items: center; justify-content: center; font-size: 28px; } + .profile-card { background: #fff; padding: 16px; margin-bottom: 8px; display: flex; align-items: center; gap: 12px; } + .profile-card .avatar { width: 48px; height: 48px; border-radius: 50%; background: linear-gradient(135deg,#e6f4ff,#bae0ff); display: flex; align-items: center; justify-content: center; font-size: 24px; } + .profile-card .info { flex: 1; } .profile-card .info .name { font-size: 16px; font-weight: 600; margin-bottom: 4px; } .profile-card .info .meta { font-size: 12px; color: #999; } + .profile-card .cat { font-size: 11px; padding: 3px 8px; border-radius: 10px; background: #fff7e6; color: #fa8c16; } /* 通用分区 */ - .section { background: #fff; margin-bottom: 8px; padding: 16px; } - .sec-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; } - .sec-header .sec-title { font-size: 14px; font-weight: 600; color: #333; } - /* 身体指标 - 列表行 */ - .body-row { - display: flex; align-items: center; justify-content: space-between; - padding: 13px 0; border-bottom: 0.5px solid #f5f5f5; cursor: pointer; - } + .section { background: #fff; margin-bottom: 8px; padding: 14px 16px; } + .sec-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; } + .sec-header .sec-title { font-size: 14px; font-weight: 600; color: #333; display: flex; align-items: center; gap: 6px; } + .sec-header .sec-title .sec-icon { font-size: 16px; } + .sec-header .sec-action { font-size: 12px; color: #1677ff; cursor: pointer; } + .sec-header .sec-action.readonly { color: #999; } + /* 只读信息行 */ + .info-row { display: flex; align-items: center; justify-content: space-between; padding: 9px 0; border-bottom: 0.5px solid #f5f5f5; } + .info-row:last-child { border-bottom: none; } + .info-row .i-label { font-size: 13px; color: #666; } + .info-row .i-value { font-size: 13px; color: #333; font-weight: 500; } + .info-row .i-value .i-unit { font-size: 11px; color: #999; margin-left: 2px; } + /* 身体指标 - 列表行(可编辑) */ + .body-row { display: flex; align-items: center; justify-content: space-between; padding: 11px 0; border-bottom: 0.5px solid #f5f5f5; cursor: pointer; } .body-row:last-child { border-bottom: none; } .body-row .b-label { font-size: 14px; color: #333; } .body-row .b-right { display: flex; align-items: center; gap: 4px; } @@ -48,29 +56,52 @@ .tag { padding: 5px 12px; border-radius: 14px; font-size: 12px; background: #f0f7ff; color: #1677ff; } .tag.warn { background: #fff7e6; color: #fa8c16; } .tag.danger { background: #fff1f0; color: #f5222d; } - .tag-add { padding: 5px 12px; border-radius: 14px; font-size: 12px; background: #fafafa; color: #999; border: 1px dashed #d9d9d9; cursor: pointer; } - /* 疾病信息列表 */ - .disease-list { } - .disease-item { padding: 12px 0; border-bottom: 0.5px solid #f0f0f0; } + .tag.orange { background: #fff7e6; color: #fa8c16; } + /* 疾病信息 */ + .disease-item { padding: 10px 0; border-bottom: 0.5px solid #f0f0f0; } .disease-item:last-child { border-bottom: none; } .disease-item .d-label { font-size: 12px; color: #999; margin-bottom: 6px; } .disease-item .d-tags { display: flex; flex-wrap: wrap; gap: 6px; } .disease-item .d-tag { padding: 4px 10px; border-radius: 12px; font-size: 12px; background: #fff1f0; color: #f5222d; } .disease-item .d-tag.med { background: #f0f7ff; color: #1677ff; } .disease-item .d-empty { font-size: 12px; color: #ccc; } + /* 菜品偏好 */ + .dish-block { padding: 10px 0; border-bottom: 0.5px solid #f0f0f0; } + .dish-block:last-child { border-bottom: none; } + .dish-block .d-label { font-size: 12px; color: #999; margin-bottom: 8px; } + .dish-block .dish-tags { display: flex; flex-wrap: wrap; gap: 6px; } + .dish-block .dish-tag { padding: 4px 10px; border-radius: 12px; font-size: 12px; background: #f0f7ff; color: #1677ff; } + .dish-block .dish-tag.rec { background: #f6ffed; color: #52c41a; } + .dish-block .dish-big { font-size: 13px; color: #fa8c16; font-weight: 600; } + .dish-block .dish-big.green { color: #52c41a; } + .dish-block .dish-text { font-size: 13px; color: #666; } + /* 妈妈味道 */ + .mom-hero { display: flex; align-items: center; gap: 10px; padding: 8px 0; } + .mom-hero .mom-icon { width: 36px; height: 36px; border-radius: 10px; background: #fff7e6; display: flex; align-items: center; justify-content: center; font-size: 18px; } + .mom-hero .mom-info .mom-title { font-size: 14px; font-weight: 600; color: #333; } + .mom-hero .mom-info .mom-sub { font-size: 11px; color: #999; margin-top: 2px; } + .mom-tags { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; } + .mom-tags .mom-tag { padding: 4px 10px; border-radius: 12px; font-size: 12px; background: #fff7e6; color: #fa8c16; } + .mom-block { padding: 8px 0; border-bottom: 0.5px solid #f0f0f0; } + .mom-block:last-child { border-bottom: none; } + .mom-block .m-label { font-size: 12px; color: #999; margin-bottom: 6px; } + .mom-block .m-text { font-size: 13px; color: #333; line-height: 1.5; } + .mom-block .m-text.green { color: #52c41a; font-weight: 600; } /* 营养目标 */ .goal-item { display: flex; align-items: center; justify-content: space-between; padding: 10px 0; border-bottom: 0.5px solid #f0f0f0; } .goal-item:last-child { border-bottom: none; } .goal-item .g-label { font-size: 13px; color: #333; } .goal-item .g-value { font-size: 13px; color: #1677ff; font-weight: 600; } + /* 体检报告入口 */ + .exam-entry { margin-top: 12px; padding: 10px 12px; background: #f5f5f5; border-radius: 10px; display: flex; align-items: center; justify-content: space-between; cursor: pointer; } + .exam-entry .e-left { display: flex; align-items: center; gap: 6px; font-size: 13px; color: #333; } + .exam-entry .e-arrow { font-size: 14px; color: #ccc; } /* ========== 编辑弹窗通用样式 ========== */ - /* 遮罩层:覆盖整个 phone-shell */ .modal-mask { position: absolute; inset: 0; background: rgba(0,0,0,0.45); display: none; align-items: flex-end; justify-content: center; z-index: 50; } .modal-mask.active { display: flex; } - /* 弹窗容器:底部弹出 */ .modal-panel { width: 100%; max-height: 80%; background: #fff; border-top-left-radius: 16px; border-top-right-radius: 16px; @@ -85,9 +116,9 @@ .modal-header .m-save { font-size: 14px; color: #1677ff; font-weight: 600; cursor: pointer; } .modal-body { padding: 12px 16px 8px; overflow-y: auto; flex: 1; } .modal-body::-webkit-scrollbar { display: none; } - /* 弹窗中分组 */ .m-group { margin-bottom: 16px; } .m-group .m-g-label { font-size: 13px; color: #666; font-weight: 500; margin-bottom: 8px; } + .m-group .m-g-hint { font-size: 11px; color: #bbb; margin-top: 4px; } /* 可编辑的标签列表(带 × 删除) */ .m-tag-list { display: flex; flex-wrap: wrap; gap: 8px; } .m-tag { @@ -96,13 +127,13 @@ background: #fff1f0; color: #f5222d; } .m-tag.med { background: #f0f7ff; color: #1677ff; } + .m-tag.warn { background: #fff7e6; color: #fa8c16; } .m-tag .m-del { width: 16px; height: 16px; border-radius: 50%; background: rgba(0,0,0,0.08); color: #666; display: flex; align-items: center; justify-content: center; font-size: 12px; line-height: 1; cursor: pointer; font-weight: 700; } - /* 添加输入区 */ .m-add-row { display: flex; gap: 8px; margin-top: 10px; } .m-add-row input { flex: 1; height: 32px; border: 1px solid #e5e5e5; border-radius: 16px; @@ -128,6 +159,19 @@ } .m-goal-row input:focus { border-color: #1677ff; } .m-goal-row .mg-unit { font-size: 12px; color: #999; min-width: 36px; } + /* 通用文本输入(妈妈味道/菜品偏好) */ + .m-input { + width: 100%; height: 36px; border: 1px solid #e5e5e5; border-radius: 8px; + padding: 0 12px; font-size: 13px; outline: none; background: #fafafa; + margin-top: 6px; + } + .m-input:focus { border-color: #1677ff; background: #fff; } + .m-textarea { + width: 100%; min-height: 64px; border: 1px solid #e5e5e5; border-radius: 8px; + padding: 8px 12px; font-size: 13px; outline: none; background: #fafafa; + margin-top: 6px; resize: none; line-height: 1.5; font-family: inherit; + } + .m-textarea:focus { border-color: #1677ff; background: #fff; } @@ -146,55 +190,64 @@
👤
张三
-
男 · 32岁 · 172cm · 68kg
+
男 · 32岁 · 公司机关/研发部
+ 会员用户 - -
-
身体指标
-
+ + +
+
+ 📏身体指标 + 编辑 › +
+
身高 - 172cm + 172cm
-
+
体重 - 68kg + 68kg
-
+
BMI - 23.0正常 + 23.0正常
-
+
体脂率 - 18.5%标准 + 18.5%标准
-
+
活动水平 - 中等每周3-5次 + 中度活动每周3-5次
- -
-
过敏信息
-
- 🥜 花生过敏 - 🦐 海鲜过敏 - + 添加 + + +
+
+ 🩺体检信息 + 只读 +
+
体检日期2026-03-15
+
血压125/80mmHg
+
空腹血糖5.2mmol/L
+
血脂正常
+
尿酸380μmol/L
+
肝功能正常
+
肾功能正常
+
+ 📎 查看体检报告 +
- -
-
饮食禁忌
-
- 🌶️ 少辣 - 🧂 低盐 - 🍬 控糖 - + 添加 -
-
- + +
-
疾病信息
+
+ 🏥疾病信息 + 编辑 › +
疾病史
@@ -203,6 +256,12 @@ 高尿酸
+
+
用药情况
+
+ 别嘌醇片依那普利 +
+
家族病史
@@ -210,17 +269,124 @@ 糖尿病
-
-
用药情况
-
- 别嘌醇片依那普利 -
+
+
+ + +
+
+ 👅口味偏好 + 编辑 › +
+
+
口味偏好
+
+ 偏辣 +
+
+
+
地域菜系
+
+ 川菜 + 湘菜
- + + +
+
+ 🚫禁忌关联 + 编辑 › +
+
+
饮食禁忌
+
+ 🌶️ 少辣 + 🧂 低盐 + 🍬 控糖 +
+
+
+
过敏原
+
+ 🥜 花生 + 🦐 海鲜 +
+
+
+ + +
+
+ 📊动态生理 + 只读 +
+
日均运动量6000步/日
+
静息心率68bpm
+
平均睡眠7.5h
+
压力指数
+
数据来源智能手环
+
+ + +
+
+ 🍲菜品偏好 + 编辑 › +
+
+
常点菜品
+
+ 宫保鸡丁 + 清炒西兰花 + 杂粮饭 +
+
+
+
忌口菜品
+
油炸花生
+
+
+ + +
+
+ 🏡妈妈味道 + 编辑 › +
+
+
🏠
+
+
家乡:四川成都
+
从童年记忆中沉淀的味觉偏好
+
+
+
+ 麻辣 + 红油 + 鲜香 +
+
+
思乡菜清单
+
+ 回锅肉 + 麻婆豆腐 + 水煮鱼 +
+
+
+
关联记忆
+
从小常吃妈妈做的回锅肉,奠定了麻辣口味偏好。
+
+
+ +
-
营养目标
+
+ 🎯营养目标 + 编辑 › +
每日热量2000 kcal
蛋白质≥60g
膳食纤维≥25g
@@ -229,42 +395,192 @@
+ + + + + + + + + + + + + + + @@ -273,7 +589,7 @@ - \ No newline at end of file + diff --git a/other-module/mini-program/nutrition/me-home.html b/other-module/mini-program/nutrition/me-home.html index 71e7d7c..d920ebe 100644 --- a/other-module/mini-program/nutrition/me-home.html +++ b/other-module/mini-program/nutrition/me-home.html @@ -88,6 +88,14 @@ font-size: 15px; font-weight: 500; text-align: center; cursor: pointer; border: 1px solid #fde2e2; letter-spacing: 1px; } + /* 模拟登录按钮(原型演示用) */ + .simulate-login-btn { + display: block; width: calc(100% - 32px); margin: 20px auto 0; padding: 13px 0; + border: none; border-radius: 22px; background: #07c160; color: #fff; + font-size: 15px; font-weight: 600; text-align: center; cursor: pointer; + letter-spacing: 1px; box-shadow: 0 6px 16px rgba(7, 193, 96, 0.24); + text-decoration: none; + } @@ -132,13 +140,15 @@ 📝操作日志 ⚙️设置
+ +
diff --git a/other-module/mini-program/nutrition/me-order-detail.html b/other-module/mini-program/nutrition/me-order-detail.html index 5c020b8..d343d9a 100644 --- a/other-module/mini-program/nutrition/me-order-detail.html +++ b/other-module/mini-program/nutrition/me-order-detail.html @@ -61,6 +61,41 @@ .advice-card { background: #fff; border-radius: 12px; padding: 12px 14px; margin: 0 16px 24px; } .advice-title { font-size: 12px; font-weight: 600; color: #333; margin-bottom: 8px; } .advice-text { font-size: 12px; color: #fa8c16; line-height: 1.7; } + /* 净菜包订单详情专属样式 */ + .fulfill-section { padding: 12px 16px 0; } + .sec-card { background: #fff; border-radius: 12px; padding: 14px; margin-bottom: 12px; box-shadow: 0 1px 4px rgba(0,0,0,0.06); } + .sec-card .sec-title { font-size: 13px; font-weight: 600; color: #333; margin-bottom: 10px; } + .info-row { display: flex; padding: 6px 0; font-size: 13px; border-bottom: 0.5px solid #f5f5f5; } + .info-row:last-child { border-bottom: none; } + .ir-label { width: 80px; color: #999; flex-shrink: 0; } + .ir-value { flex: 1; color: #333; line-height: 1.5; } + /* 时间线 */ + .timeline { padding: 4px 0 0; } + .tl-item { display: flex; gap: 12px; padding: 0 0 20px; position: relative; } + .tl-item:last-child { padding-bottom: 0; } + .tl-item::before { + content: ''; position: absolute; left: 5px; top: 14px; bottom: -4px; + width: 2px; background: #e8e8e8; + } + .tl-item:last-child::before { display: none; } + .tl-item.done::before { background: #52c41a; } + .tl-dot { + width: 12px; height: 12px; border-radius: 50%; background: #e8e8e8; + flex-shrink: 0; margin-top: 4px; position: relative; z-index: 1; + border: 2px solid #fff; + } + .tl-item.done .tl-dot { background: #52c41a; } + .tl-item.active .tl-dot { background: #1677ff; box-shadow: 0 0 0 3px rgba(22,119,255,0.2); } + .tl-content { flex: 1; } + .tl-title { font-size: 13px; font-weight: 600; color: #999; } + .tl-item.done .tl-title { color: #52c41a; } + .tl-item.active .tl-title { color: #1677ff; } + .tl-time { font-size: 11px; color: #999; margin-top: 2px; } + .presale-tag { + font-size: 10px; padding: 1px 6px; border-radius: 6px; + background: #fff7e6; color: #fa8c16; font-weight: 600; + } + .hidden { display: none !important; } @@ -75,7 +110,7 @@
-
+
2026-04-28 午餐
@@ -95,8 +130,70 @@ 余额支付
+ + -
+
菜品明细 · 食材 · 溯源
@@ -188,5 +285,84 @@
+ \ No newline at end of file diff --git a/other-module/mini-program/nutrition/me-orders.html b/other-module/mini-program/nutrition/me-orders.html index 5d01bf4..5a38ff6 100644 --- a/other-module/mini-program/nutrition/me-orders.html +++ b/other-module/mini-program/nutrition/me-orders.html @@ -24,11 +24,22 @@ .order-tabs .ot.active { color: #1677ff; font-weight: 600; } .order-tabs .ot.active::after { content: ''; position: absolute; bottom: 0; left: 30%; right: 30%; height: 2px; background: #1677ff; border-radius: 1px; } .order-card { margin: 0 12px 10px; background: #fff; border-radius: 10px; padding: 14px; text-decoration: none; color: inherit; display: block; } - .order-card .card-top { display: flex; justify-content: space-between; margin-bottom: 10px; } + .order-card .card-top { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 10px; } + .order-card .shop-row { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; } .order-card .shop { font-size: 14px; font-weight: 600; } + .order-card .type-tag { font-size: 10px; padding: 1px 6px; border-radius: 8px; font-weight: 600; line-height: 16px; } + .order-card .type-tag.meal { background: #e6f4ff; color: #1677ff; } + .order-card .type-tag.clean { background: #fff7e6; color: #fa8c16; } .order-card .status { font-size: 12px; color: #52c41a; font-weight: 500; } .order-card .status.pending { color: #fa8c16; } + .order-card .status.shipping { color: #1677ff; } + .order-card .status.processing { color: #722ed1; } .order-card .items { font-size: 12px; color: #666; margin-bottom: 8px; line-height: 1.6; } + .order-card .fulfill-meta { + font-size: 11px; color: #fa8c16; margin-bottom: 8px; padding: 4px 8px; + background: #fff7e6; border-radius: 6px; display: flex; align-items: center; gap: 4px; + } + .order-card .fulfill-meta.done { color: #52c41a; background: #f6ffed; } .order-card .card-bottom { display: flex; justify-content: space-between; align-items: center; } .order-card .total { font-size: 14px; font-weight: 700; color: #f5222d; } .order-card .time { font-size: 11px; color: #999; } @@ -48,20 +59,48 @@
全部 待取餐 + 待配送 已完成
-
🍽️ 阳光食堂 · 午餐待取餐
+
+
🍽️ 阳光食堂 · 午餐餐品
+ 待取餐 +
低脂鸡胸肉沙拉 ×1、杂粮饭 ×1、紫菜蛋花汤 ×1
¥ 28.5今天 11:32
+ +
+
🥬 阳光食堂 · 净菜包订单净菜包
+ 待配送 +
+
宫保鸡丁净菜包 ×2、低脂控糖套餐净菜包 ×1
+
🚚 配送到家 · 明日(4月29日)11:00-12:00
+
¥ 79.0今天 14:23 下单
+
-
🍽️ 阳光食堂 · 早餐已完成
+
+
🍽️ 阳光食堂 · 早餐餐品
+ 已完成 +
全麦三明治 ×1、鲜榨橙汁 ×1
¥ 15.0今天 07:45
+ +
+
🥬 阳光食堂 · 净菜包订单净菜包
+ 已完成 +
+
红烧肉净菜包 ×1、番茄炒蛋净菜包 ×1
+
🏪 食堂自提 · 已取货
+
¥ 36.0昨天 12:15
+
-
🍽️ 健康轻食 · 午餐已完成
+
+
🍽️ 健康轻食 · 午餐餐品
+ 已完成 +
三文鱼牛油果碗 ×1、蔬菜汁 ×1
¥ 42.0昨天 12:15
diff --git a/start-server.bat b/start-server.bat deleted file mode 100644 index 628bc5f..0000000 --- a/start-server.bat +++ /dev/null @@ -1,10 +0,0 @@ -@echo off -echo ============================================ -echo 健康CQ原型 - 本地预览服务器 -echo ============================================ -echo. -echo 打开浏览器访问: http://localhost:3000/ -echo 按 Ctrl+C 停止服务器 -echo. -node server.js -pause diff --git a/web-admin/nutrition/din-dish-add.html b/web-admin/nutrition/din-dish-add.html index 1d268de..923d8d1 100644 --- a/web-admin/nutrition/din-dish-add.html +++ b/web-admin/nutrition/din-dish-add.html @@ -88,6 +88,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .spec-toggle.active .spec-toggle__switch::after{transform:translateX(14px);} .spec-toggle__label{font-size:11px;color:var(--text-placeholder);} .spec-toggle.active .spec-toggle__label{color:var(--primary);font-weight:500;} +/* 外售净菜包胶囊开关 */ +.sale-toggle{display:inline-flex;align-items:center;gap:6px;cursor:pointer;user-select:none;} +.sale-toggle__switch{width:32px;height:18px;background:#D9D9D9;border-radius:9px;position:relative;transition:background .2s;flex-shrink:0;} +.sale-toggle__switch::after{content:'';position:absolute;left:2px;top:2px;width:14px;height:14px;background:#fff;border-radius:50%;transition:transform .2s;box-shadow:0 1px 2px rgba(0,0,0,0.15);} +.sale-toggle.active .sale-toggle__switch{background:var(--success);} +.sale-toggle.active .sale-toggle__switch::after{transform:translateX(14px);} +.sale-toggle__label{font-size:11px;color:var(--text-placeholder);} +.sale-toggle.active .sale-toggle__label{color:var(--success);font-weight:500;} .btn-text{background:none;border:none;cursor:pointer;font-size:12px;padding:2px 6px;border-radius:var(--radius-sm);transition:all .15s;} .btn-text--primary{color:var(--primary);}.btn-text--primary:hover{background:var(--primary-light);} .btn-text--danger{color:var(--danger);}.btn-text--danger:hover{background:#FFF1F0;} @@ -361,11 +369,11 @@ var STEP_HTML = [
📐 餐品规格
- + - - - + + +
规格单位重量(g)售价(元/份)默认操作
规格单位重量(g)餐品售价(元/份)净菜包售价(元/份)外售净菜包默认操作
标准份35015.00
默认
小份20010.00
默认
+ 添加规格
标准份35015.0010.00
下架
默认
小份20010.007.00
下架
默认
+ 添加规格
📷 菜品展示
@@ -517,7 +525,7 @@ function addSpecRow(addRow){ if(document.querySelector('.spec-edit-row')) return; var tr=document.createElement('tr'); tr.className='spec-edit-row'; - tr.innerHTML=' '; + tr.innerHTML='
下架
'; addRow.parentNode.insertBefore(tr,addRow); } function confirmSpec(btn){ @@ -525,10 +533,18 @@ function confirmSpec(btn){ var sel=row.querySelector('select'); var inputs=row.querySelectorAll('input'); var name=sel?sel.value:''; - var weight=inputs[0].value.trim(),price=inputs[1].value.trim(); + var weight=inputs[0].value.trim(),price=inputs[1].value.trim(),cleanPrice=inputs[2].value.trim(); if(!name||name==='请选择'||!weight||!price){alert('请填写完整信息');return;} + var cleanPriceText = cleanPrice ? parseFloat(cleanPrice).toFixed(2) : '—'; + var saleActive = !!row.querySelector('.sale-toggle.active'); + var saleHtml = '
'+(saleActive?'上架':'下架')+'
'; row.className=''; - row.innerHTML=''+name+''+weight+''+parseFloat(price).toFixed(2)+'
默认
'; + row.innerHTML=''+name+''+weight+''+parseFloat(price).toFixed(2)+''+cleanPriceText+''+saleHtml+'
默认
'; +} +function toggleCleanSale(el){ + var active = el.classList.toggle('active'); + var label = el.querySelector('.sale-toggle__label'); + if(label) label.textContent = active ? '上架' : '下架'; } function cancelSpec(btn){btn.closest('tr').remove();} function toggleDefault(el){ @@ -678,7 +694,7 @@ var EDIT_DATA = { name:'红烧肉', category:'荤菜', method:'炖', meal:'午/晚', pyramid:'畜禽肉蛋水产', allergen:'无', tag:'高蛋白', status:'上架', crowd:[{name:'成人',level:'推荐'},{name:'高血脂人群',level:'慎食'},{name:'高血压人群',level:'适量'}], - specs:[{spec:'标准份',weight:200,price:12,isDefault:true},{spec:'小份',weight:120,price:8,isDefault:false},{spec:'大份',weight:300,price:18,isDefault:false}], + specs:[{spec:'标准份',weight:200,price:12,cleanPrice:9,cleanSale:false,isDefault:true},{spec:'小份',weight:120,price:8,cleanPrice:6,cleanSale:false,isDefault:false},{spec:'大份',weight:300,price:18,cleanPrice:13,cleanSale:false,isDefault:false}], composition:[{name:'五花肉',netType:'红烧块',amount:150,pct:'60%',type:'主材',allergen:'无',note:'—'},{name:'冰糖',netType:'糖浆',amount:20,pct:'8%',type:'调料',allergen:'无',note:'上色'},{name:'酱油',netType:'调味汁',amount:15,pct:'6%',type:'调料',allergen:'含大豆',note:'调味'},{name:'料酒',netType:'料酒汁',amount:10,pct:'4%',type:'调料',allergen:'无',note:'去腥'}], cook:{mainMethod:'炖',subMethod:'煎',heat:'中火→小火',duration:45,oil:15,salt:3,temp:100,output:200,steps:6,desc:'1.五花肉切块焯水;2.锅中煎至金黄;3.加冰糖炒色;4.加酱油料酒;5.加水小火炖40分钟;6.大火收汁'}, nutri:{calorie:385,protein:18.2,carb:12.4,fat:28.6,vitC:2.1,mineral:45,fiber:1.8,sodium:486}, @@ -720,7 +736,7 @@ if(pageMode==='convert' && INNOV){ EDIT_DATA.tag = INNOV.tag; EDIT_DATA.status = '上架'; EDIT_DATA.crowd = []; - EDIT_DATA.specs = [{spec:'标准份',weight:350,price:15,isDefault:true},{spec:'小份',weight:200,price:10,isDefault:false}]; + EDIT_DATA.specs = [{spec:'标准份',weight:350,price:15,cleanPrice:10,cleanSale:false,isDefault:true},{spec:'小份',weight:200,price:10,cleanPrice:7,cleanSale:false,isDefault:false}]; EDIT_DATA.composition = INNOV.composition; EDIT_DATA.cook = INNOV.cook; EDIT_DATA.nutri = INNOV.nutri; @@ -762,7 +778,9 @@ function fillEditData(){ specBody.innerHTML = ''; d.specs.forEach(function(s){ var tr = document.createElement('tr'); - tr.innerHTML = '删除'; + var saleActive = s.cleanSale === true; + var saleHtml = '
'+(saleActive?'上架':'下架')+'
'; + tr.innerHTML = ''+saleHtml+'删除'; specBody.appendChild(tr); }); } diff --git a/web-admin/nutrition/din-dish-all.html b/web-admin/nutrition/din-dish-all.html index 90235c0..5b4ebae 100644 --- a/web-admin/nutrition/din-dish-all.html +++ b/web-admin/nutrition/din-dish-all.html @@ -115,6 +115,14 @@ body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei .info-table tr:hover{background:#F8FBFF;} .spec-detail-table th{padding:6px 12px;font-size:12px;} .spec-detail-table td{padding:6px 12px;font-size:12px;} +/* 外售净菜包胶囊开关 */ +.sale-toggle{display:inline-flex;align-items:center;gap:6px;cursor:pointer;user-select:none;} +.sale-toggle__switch{width:32px;height:18px;background:#D9D9D9;border-radius:9px;position:relative;transition:background .2s;flex-shrink:0;} +.sale-toggle__switch::after{content:'';position:absolute;left:2px;top:2px;width:14px;height:14px;background:#fff;border-radius:50%;transition:transform .2s;box-shadow:0 1px 2px rgba(0,0,0,0.15);} +.sale-toggle.active .sale-toggle__switch{background:var(--success);} +.sale-toggle.active .sale-toggle__switch::after{transform:translateX(14px);} +.sale-toggle__label{font-size:11px;color:var(--text-placeholder);} +.sale-toggle.active .sale-toggle__label{color:var(--success);font-weight:500;} /* 图片/视频网格 */ .media-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;} @@ -274,7 +282,7 @@ tbody tr:hover td.td-actions{background:#F8FBFF;}