diff --git a/employee-app/weight-management/diet-advice-v2.html b/employee-app/weight-management/diet-advice-v2.html
index 37365a8..5b7a958 100644
--- a/employee-app/weight-management/diet-advice-v2.html
+++ b/employee-app/weight-management/diet-advice-v2.html
@@ -15,32 +15,46 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items:
.nav-bar { height: 44px; background: #fff; display: flex; align-items: center; padding: 0 16px; flex-shrink: 0; border-bottom: 1px solid #f0f0f0; }
.nav-back { width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; cursor: pointer; color: #1a1a1a; }
-.nav-title { flex: 1; text-align: center; font-size: 17px; font-weight: 600; color: #1a1a1a; }
-.nav-date { display: flex; align-items: center; gap: 3px; cursor: pointer; user-select: none; padding: 4px 6px; border-radius: 6px; transition: background .2s; }
-.nav-date:hover { background: #f5f5f5; }
-.nav-date__text { font-size: 13px; color: #666; font-weight: 500; }
-.nav-date__arrow { transition: transform .25s; color: #999; }
-.nav-date__arrow.open { transform: rotate(180deg); }
-
-/* Calendar dropdown */
-.calendar-dropdown { background: #fff; border-bottom: 1px solid #f0f0f0; overflow: hidden; max-height: 0; transition: max-height .3s ease, padding .3s ease; }
-.calendar-dropdown.show { max-height: 370px; padding: 8px 16px 12px; }
-.calendar-dropdown__header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
-.calendar-dropdown__nav { width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; cursor: pointer; color: #999; border-radius: 50%; font-size: 14px; user-select: none; }
-.calendar-dropdown__nav:hover { background: #f0f0f0; }
-.calendar-dropdown__month { font-size: 14px; font-weight: 700; color: #1a1a1a; }
-.calendar-dropdown__weekdays { display: grid; grid-template-columns: repeat(7, 1fr); text-align: center; font-size: 11px; color: #bbb; margin-bottom: 4px; }
-.calendar-dropdown__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 3px; text-align: center; }
-.calendar-dropdown__day { padding: 7px 0; font-size: 13px; color: #333; border-radius: 8px; cursor: pointer; font-weight: 500; position: relative; transition: background .15s; }
-.calendar-dropdown__day:hover { background: #f5f5f5; }
-.calendar-dropdown__day--other { color: #ddd; pointer-events: none; }
-.calendar-dropdown__day--today { border: 1.5px solid #36cfc9; color: #36cfc9; font-weight: 700; }
-.calendar-dropdown__day--selected { background: #36cfc9; color: #fff; font-weight: 700; }
-.calendar-dropdown__day--has-data::after { content: ''; position: absolute; bottom: 2px; left: 50%; transform: translateX(-50%); width: 4px; height: 4px; border-radius: 50%; background: #36cfc9; }
-.calendar-dropdown__day--selected.calendar-dropdown__day--has-data::after { background: #fff; }
-.calendar-dropdown__legend { display: flex; align-items: center; gap: 12px; margin-top: 8px; font-size: 11px; color: #bbb; }
-.calendar-dropdown__legend-dot { width: 5px; height: 5px; border-radius: 50%; background: #36cfc9; }
-.calendar-dropdown__legend-dot--none { background: #e0e0e0; }
+ .nav-title { flex: 1; text-align: center; font-size: 17px; font-weight: 600; color: #1a1a1a; }
+ .nav-placeholder { width: 28px; height: 28px; }
+
+ /* ===== 周日历(页面顶部) ===== */
+ .calendar-card { background: #fff; border-radius: 16px; margin: 10px 12px 0; padding: 12px 12px 8px; box-shadow: 0 4px 14px rgba(0,0,0,0.04); position: relative; }
+ .calendar-card__header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
+ .calendar-card__arrow { width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; cursor: pointer; color: #999; border-radius: 50%; transition: background .2s; user-select: none; }
+ .calendar-card__arrow:hover { background: #f0f0f0; color: #333; }
+ .calendar-card__range { font-size: 13px; font-weight: 600; color: #333; display: inline-flex; align-items: center; gap: 4px; cursor: pointer; user-select: none; }
+ .calendar-card__range svg { flex-shrink: 0; }
+ .calendar-card__date-arrow { transition: transform .2s; }
+ .calendar-card__date-arrow.open { transform: rotate(180deg); }
+
+ /* 月历弹窗 */
+ .month-picker { position: absolute; top: 38px; left: 12px; right: 12px; z-index: 20; background: #fff; border-radius: 14px; padding: 12px 14px; box-shadow: 0 8px 30px rgba(0,0,0,0.15); display: none; }
+ .month-picker.show { display: block; }
+ .month-picker__header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
+ .month-picker__title { font-size: 14px; font-weight: 700; color: #1a1a1a; }
+ .month-picker__nav { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; cursor: pointer; color: #999; border-radius: 50%; font-size: 13px; }
+ .month-picker__nav:hover { background: #f0f0f0; }
+ .month-picker__weekdays { display: grid; grid-template-columns: repeat(7, 1fr); text-align: center; font-size: 11px; color: #bbb; margin-bottom: 6px; }
+ .month-picker__grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; text-align: center; }
+ .month-picker__day { padding: 6px 0; font-size: 13px; color: #333; border-radius: 8px; cursor: pointer; font-weight: 500; }
+ .month-picker__day:hover { background: #f5f5f5; }
+ .month-picker__day--other { color: #ddd; }
+ .month-picker__day--today { background: #e8fbfa; color: #36cfc9; font-weight: 700; }
+ .month-picker__day--selected { background: #36cfc9; color: #fff; font-weight: 700; }
+
+ .cal-week { display: flex; gap: 4px; }
+ .cal-day { flex: 1; text-align: center; padding: 6px 0; border-radius: 10px; cursor: pointer; background: #f7f8fa; transition: background .2s; }
+ .cal-day.active { background: #e8fbfa; }
+ .cal-day.today .cal-day__num { color: #1a1a1a; font-weight: 800; }
+ .cal-day.active .cal-day__num { color: #36cfc9; font-weight: 800; }
+ .cal-day.active .cal-day__wd { color: #36cfc9; font-weight: 600; }
+ .cal-day__wd { font-size: 10px; color: #999; margin-bottom: 3px; }
+ .cal-day__date-wrap { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; margin: 0 auto; }
+ .cal-day__num { font-size: 14px; font-weight: 700; color: #333; position: relative; z-index: 2; }
+ .cal-day__ring { position: absolute; inset: 0; border-radius: 50%; border: 2.5px solid #36cfc9; z-index: 1; opacity: 0.35; }
+ .cal-day.active .cal-day__ring { opacity: 1; }
+ .cal-day.no-data { opacity: 0.4; }
/* Tabs */
.tab-bar { display: flex; background: #fff; margin: 10px 12px 0; border-radius: 12px; padding: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.03); }
@@ -260,35 +274,46 @@ body { background: #f0f2f5; display: flex; justify-content: center; align-items:
-
食谱建议
营养分析
@@ -398,9 +423,201 @@ function goBack() {
/* ===== Core data ===== */
var todayStr = '2026-07-23';
var selectedDate = todayStr;
+var todayDate = new Date(2026, 6, 23); // 2026-07-23
+
+/* ===== 周导航(页面顶部周日历) ===== */
+var WEEK_MS = 7 * 24 * 60 * 60 * 1000;
+var weekDayLabels = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
+var currentWeekStart = getMonday(todayDate);
+
+function getMonday(d) {
+ var m = new Date(d);
+ var day = m.getDay();
+ var diff = day === 0 ? -6 : 1 - day;
+ m.setDate(m.getDate() + diff);
+ m.setHours(0, 0, 0, 0);
+ return m;
+}
+
+function fmtDate(d) {
+ var y = d.getFullYear();
+ var m = ('0' + (d.getMonth() + 1)).slice(-2);
+ var day = ('0' + d.getDate()).slice(-2);
+ return y + '-' + m + '-' + day;
+}
+
+function isSameDay(a, b) {
+ return a.getFullYear() === b.getFullYear() &&
+ a.getMonth() === b.getMonth() &&
+ a.getDate() === b.getDate();
+}
+
+/* ===== 渲染周日历 ===== */
+function renderWeek() {
+ var container = document.getElementById('calWeek');
+ container.innerHTML = '';
+
+ var weekDayChars = ['日', '一', '二', '三', '四', '五', '六'];
+
+ for (var i = 0; i < 7; i++) {
+ var d = new Date(currentWeekStart);
+ d.setDate(d.getDate() + i);
+ var dateStr = fmtDate(d);
+ var wd = weekDayChars[d.getDay()];
+ var dayNum = d.getDate();
+ var isToday = isSameDay(d, todayDate);
+ var hasData = dayData[dateStr] && dayData[dateStr].intake > 0;
+
+ var dayEl = document.createElement('div');
+ dayEl.className = 'cal-day' + (isToday ? ' today' : '') + (!hasData ? ' no-data' : '');
+ dayEl.setAttribute('data-date', dateStr);
+ dayEl.onclick = function() { selectDay(this); };
+
+ dayEl.innerHTML =
+ '
' + wd + '
' +
+ '
' +
+ (hasData ? '
' : '') +
+ '
' + dayNum + '' +
+ '
';
+
+ container.appendChild(dayEl);
+ }
+
+ // 箭头状态:未来周禁止前进
+ var mondayOfThisWeek = getMonday(todayDate);
+ var nextArrow = document.getElementById('calNext');
+ if (currentWeekStart.getTime() >= mondayOfThisWeek.getTime()) {
+ nextArrow.style.opacity = '0.3';
+ nextArrow.style.pointerEvents = 'none';
+ } else {
+ nextArrow.style.opacity = '1';
+ nextArrow.style.pointerEvents = '';
+ }
+
+ // 选中当前日期(如果在本周内),否则 fallback
+ var selParts = selectedDate.split('-');
+ var selD = new Date(parseInt(selParts[0]), parseInt(selParts[1]) - 1, parseInt(selParts[2]));
+ var selMonday = getMonday(selD);
+ var target = null;
+ if (selMonday.getTime() === currentWeekStart.getTime()) {
+ target = container.querySelector('.cal-day[data-date="' + selectedDate + '"]');
+ }
+ if (!target) {
+ target = container.querySelector('.cal-day.today');
+ if (!target) target = container.querySelector('.cal-day:not(.no-data)');
+ if (!target) target = container.querySelector('.cal-day');
+ }
+ if (target) selectDay(target, true);
+}
+
+function prevWeek() {
+ currentWeekStart = new Date(currentWeekStart.getTime() - WEEK_MS);
+ renderWeek();
+}
+
+function nextWeek() {
+ var mondayOfThisWeek = getMonday(todayDate);
+ if (currentWeekStart.getTime() >= mondayOfThisWeek.getTime()) return;
+ currentWeekStart = new Date(currentWeekStart.getTime() + WEEK_MS);
+ renderWeek();
+}
+
+function selectDay(el, skipRender) {
+ document.querySelectorAll('.cal-day').forEach(function(d) { d.classList.remove('active'); });
+ el.classList.add('active');
+
+ var newDate = el.getAttribute('data-date');
+ if (newDate === selectedDate && !skipRender) return; // 同一日期不重复渲染
+
+ selectedDate = newDate;
+ var parts = selectedDate.split('-');
+ document.getElementById('calRange').textContent = parts[0] + '年' + parseInt(parts[1]) + '月' + parseInt(parts[2]) + '日';
+
+ renderAll();
+}
+
+/* ===== 月历弹窗 ===== */
+var pickerYear = 2026;
+var pickerMonth = 6;
+
+function toggleMonthPicker() {
+ var picker = document.getElementById('monthPicker');
+ var arrow = document.getElementById('dateArrow');
+ var show = !picker.classList.contains('show');
+ picker.classList.toggle('show', show);
+ arrow.classList.toggle('open', show);
+ if (show) {
+ pickerYear = todayDate.getFullYear();
+ pickerMonth = todayDate.getMonth();
+ renderMonthGrid();
+ }
+}
+
+function prevMonth() {
+ if (pickerMonth === 0) { pickerMonth = 11; pickerYear--; }
+ else { pickerMonth--; }
+ renderMonthGrid();
+}
+
+function nextMonth() {
+ if (pickerMonth === 11) { pickerMonth = 0; pickerYear++; }
+ else { pickerMonth++; }
+ renderMonthGrid();
+}
+
+function renderMonthGrid() {
+ document.getElementById('monthPickerTitle').textContent = pickerYear + '年' + (pickerMonth + 1) + '月';
+ var grid = document.getElementById('monthGrid');
+ grid.innerHTML = '';
+
+ var firstDay = new Date(pickerYear, pickerMonth, 1).getDay();
+ var daysInMonth = new Date(pickerYear, pickerMonth + 1, 0).getDate();
+
+ var prevDays = new Date(pickerYear, pickerMonth, 0).getDate();
+ for (var i = firstDay - 1; i >= 0; i--) {
+ var el = document.createElement('div');
+ el.className = 'month-picker__day month-picker__day--other';
+ el.textContent = prevDays - i;
+ grid.appendChild(el);
+ }
+
+ var todayDateStr = fmtDate(todayDate);
+
+ for (var d = 1; d <= daysInMonth; d++) {
+ var dateStr = pickerYear + '-' + ('0' + (pickerMonth + 1)).slice(-2) + '-' + ('0' + d).slice(-2);
+ var el = document.createElement('div');
+ var cls = 'month-picker__day';
+ if (dateStr === todayDateStr) cls += ' month-picker__day--today';
+ if (dateStr === selectedDate) cls += ' month-picker__day--selected';
+ el.className = cls;
+ el.textContent = d;
+ el.onclick = (function(ds) { return function(e) { e.stopPropagation(); pickDay(ds); }; })(dateStr);
+ grid.appendChild(el);
+ }
+}
+
+function pickDay(dateStr) {
+ document.getElementById('monthPicker').classList.remove('show');
+ document.getElementById('dateArrow').classList.remove('open');
+
+ var parts = dateStr.split('-');
+ var d = new Date(parseInt(parts[0]), parseInt(parts[1]) - 1, parseInt(parts[2]));
+ currentWeekStart = getMonday(d);
+ selectedDate = dateStr;
+ renderWeek();
+}
+
+document.addEventListener('click', function(e) {
+ var picker = document.getElementById('monthPicker');
+ if (!picker.classList.contains('show')) return;
+ if (!e.target.closest('.calendar-card__range') && !e.target.closest('#monthPicker')) {
+ picker.classList.remove('show');
+ document.getElementById('dateArrow').classList.remove('open');
+ }
+});
var dayData = {
- '2026-07-20': {
+ '2026-07-20': {
intake: 1050, summary: '今日热量摄入合理,营养素搭配均衡。早餐提供了充足蛋白质,午餐以碳水为主,晚餐清淡适中。',
meals: {
breakfast: { kcal: 280, time: '07:30', items: [
@@ -513,83 +730,6 @@ var dayData = {
'2026-07-26': null
};
-/* ===== Calendar logic ===== */
-var calYear = 2026;
-var calMonth = 6;
-
-function toggleCalendar() {
- var dd = document.getElementById('calendarDropdown');
- var arrow = document.getElementById('navDateArrow');
- var show = !dd.classList.contains('show');
- dd.classList.toggle('show', show);
- arrow.classList.toggle('open', show);
- if (show) {
- var parts = selectedDate.split('-');
- calYear = parseInt(parts[0]);
- calMonth = parseInt(parts[1]) - 1;
- renderCalGrid();
- }
-}
-
-function prevCalMonth() {
- if (calMonth === 0) { calMonth = 11; calYear--; }
- else calMonth--;
- renderCalGrid();
-}
-
-function nextCalMonth() {
- if (calMonth === 11) { calMonth = 0; calYear++; }
- else calMonth++;
- renderCalGrid();
-}
-
-function renderCalGrid() {
- document.getElementById('calMonthTitle').textContent = calYear + '年' + (calMonth + 1) + '月';
- var grid = document.getElementById('calMonthGrid');
- grid.innerHTML = '';
-
- var firstDay = new Date(calYear, calMonth, 1).getDay();
- var daysInMonth = new Date(calYear, calMonth + 1, 0).getDate();
-
- var prevDays = new Date(calYear, calMonth, 0).getDate();
- for (var i = firstDay - 1; i >= 0; i--) {
- var el = document.createElement('div');
- el.className = 'calendar-dropdown__day calendar-dropdown__day--other';
- el.textContent = prevDays - i;
- grid.appendChild(el);
- }
-
- for (var d = 1; d <= daysInMonth; d++) {
- var ds = calYear + '-' + ('0' + (calMonth + 1)).slice(-2) + '-' + ('0' + d).slice(-2);
- var el = document.createElement('div');
- var cls = 'calendar-dropdown__day';
- if (ds === todayStr) cls += ' calendar-dropdown__day--today';
- if (ds === selectedDate) cls += ' calendar-dropdown__day--selected';
- if (dayData[ds] && dayData[ds].intake > 0) cls += ' calendar-dropdown__day--has-data';
- el.className = cls;
- el.textContent = d;
- el.onclick = (function(ds) { return function(e) { e.stopPropagation(); pickCalDay(ds); }; })(ds);
- grid.appendChild(el);
- }
-}
-
-function pickCalDay(ds) {
- document.getElementById('calendarDropdown').classList.remove('show');
- document.getElementById('navDateArrow').classList.remove('open');
- selectedDate = ds;
- document.getElementById('navDateText').textContent = ds;
- renderAll();
-}
-
-document.addEventListener('click', function(e) {
- var dd = document.getElementById('calendarDropdown');
- if (!dd.classList.contains('show')) return;
- if (!e.target.closest('.nav-date') && !e.target.closest('#calendarDropdown')) {
- dd.classList.remove('show');
- document.getElementById('navDateArrow').classList.remove('open');
- }
-});
-
/* ===== Toggle summary collapse ===== */
function toggleSummary() {
var body = document.getElementById('summaryBody');
@@ -1130,7 +1270,9 @@ function renderNutrientIntake(data) {
}
/* ===== Init ===== */
-document.getElementById('navDateText').textContent = selectedDate;
+var initParts = selectedDate.split('-');
+document.getElementById('calRange').textContent = initParts[0] + '年' + parseInt(initParts[1]) + '月' + parseInt(initParts[2]) + '日';
+renderWeek();
renderAll();