UI 打磨与功能调整:中国生长标准、日历合并、弹窗去框、轮播记忆位置、小环居中、后台补卡与重置保留
This commit is contained in:
+42
-34
@@ -21,18 +21,18 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<button type="button" class="mini" onclick="openBadges()">🏅 全部徽章</button>
|
||||
<button type="button" class="link-btn" onclick="openBadges()">🏅 点击查看全部徽章 ›</button>
|
||||
</div>
|
||||
<div class="hero-right">
|
||||
<div class="nowbox">
|
||||
<div class="now-date" id="nowDate">—</div>
|
||||
<div class="now-week" id="nowWeek">—</div>
|
||||
<div class="now-time" id="nowTime">--:--:--</div>
|
||||
<div class="now-left" id="nowLeft">{{ days_left_str }}</div>
|
||||
</div>
|
||||
<div class="termcal">
|
||||
<div class="termcal-title">📅 学期日历</div>
|
||||
<div class="termcal-range">{{ term_start_str }} ~ {{ term_end_str }}</div>
|
||||
<div class="termcal-scroll">{{ term_calendar_svg(active_counts, term_start, term_end) | safe }}</div>
|
||||
<div class="termcal-title">📅 日历 <span class="termcal-range-inline" id="calRange">{{ cal_start_str }} ~ {{ cal_end_str }}</span></div>
|
||||
<div class="termcal-scroll">{{ term_calendar_svg(active_counts, cal_start, cal_end) | safe }}</div>
|
||||
<div class="termcal-legend">
|
||||
<span><i class="lg tc-act3"></i>多项</span>
|
||||
<span><i class="lg tc-act1"></i>有打卡</span>
|
||||
@@ -42,14 +42,13 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-ring">
|
||||
{{ ring_svg(yprog, '#3b82f6', 130, '学年总进度') | safe }}
|
||||
{{ ring_svg(yprog, '#3b82f6', 130, '总进度') | safe }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid-2">
|
||||
<section class="card">
|
||||
<h2>🎡 各学科进度一览</h2>
|
||||
<div class="ring-wrap">
|
||||
<div class="ringcar" id="ringCar" data-interval="{{ ring_sec }}">
|
||||
{% for grp in ring_slides %}
|
||||
@@ -68,42 +67,41 @@
|
||||
</section>
|
||||
|
||||
<section class="card">
|
||||
<h2>💗 健康综合</h2>
|
||||
<div class="hstats">
|
||||
<div class="hstat">
|
||||
<div class="hs-label">当前身高</div>
|
||||
<div class="hs-val" style="color:#10b981">{{ cur_h if cur_h is not none else '—' }}<em>cm</em></div>
|
||||
<div class="hs-std">标准 {{ std_h }} cm
|
||||
{%- if cur_h is not none %}
|
||||
<span class="hs-diff {{ 'up' if cur_h >= std_h else 'down' }}">
|
||||
{{ '+' if cur_h >= std_h else '' }}{{ (cur_h - std_h) | round(1) }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
<div class="hstat" onclick="openHealth()" title="点击查看健康图表详情">
|
||||
<div class="hs-label">身高</div>
|
||||
<div class="hs-main">
|
||||
<div class="hs-val" style="color:#10b981">{{ cur_h if cur_h is not none else '—' }}<em>cm</em></div>
|
||||
<div class="hs-std">标准 {{ std_h }} cm
|
||||
{%- if cur_h is not none %}
|
||||
<span class="hs-diff {{ 'up' if cur_h >= std_h else 'down' }}">
|
||||
{{ '+' if cur_h >= std_h else '' }}{{ (cur_h - std_h) | round(1) }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hstat">
|
||||
<div class="hs-label">当前体重</div>
|
||||
<div class="hs-val" style="color:#f59e0b">{{ cur_w if cur_w is not none else '—' }}<em>kg</em></div>
|
||||
<div class="hs-std">标准 {{ std_w }} kg
|
||||
{%- if cur_w is not none %}
|
||||
<span class="hs-diff {{ 'up' if cur_w >= std_w else 'down' }}">
|
||||
{{ '+' if cur_w >= std_w else '' }}{{ (cur_w - std_w) | round(1) }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
<div class="hstat" onclick="openHealth()" title="点击查看健康图表详情">
|
||||
<div class="hs-label">体重</div>
|
||||
<div class="hs-main">
|
||||
<div class="hs-val" style="color:#f59e0b">{{ cur_w if cur_w is not none else '—' }}<em>kg</em></div>
|
||||
<div class="hs-std">标准 {{ std_w }} kg
|
||||
{%- if cur_w is not none %}
|
||||
<span class="hs-diff {{ 'up' if cur_w >= std_w else 'down' }}">
|
||||
{{ '+' if cur_w >= std_w else '' }}{{ (cur_w - std_w) | round(1) }}
|
||||
</span>
|
||||
{%- endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-foot">
|
||||
<button type="button" class="mini" onclick="openHealth()">📈 图表详情</button>
|
||||
<p class="sub tiny">按 {{ age }} 岁{{ '男孩' if (child.gender or 'M') == 'M' else '女孩' }}的生长参考中位数估算,仅供参考。</p>
|
||||
</div>
|
||||
<p class="sub tiny">按中国儿童生长标准(WS/T 612-2018){{ age }} 岁{{ '男孩' if (child.gender or 'M') == 'M' else '女孩' }}同龄中位数估算,仅供参考。</p>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="grid-2">
|
||||
<section class="card">
|
||||
<h2>📚 学科进度</h2>
|
||||
<p class="sub">按任务顺序显示:完成 3 个 · 进行中 1 个 · 待完成 3 个。点一下就完成,下一个自动接上。</p>
|
||||
<div class="carousel" id="subjCarousel" data-interval="{{ carousel_sec }}">
|
||||
{% for grp in slides %}
|
||||
<div class="slide" style="display:{% if loop.first %}block{% else %}none{% endif %}">
|
||||
@@ -113,7 +111,7 @@
|
||||
<span class="subject-icon">{{ s.icon }}</span>
|
||||
<span class="subject-name">{{ s.name }}</span>
|
||||
<span class="subject-pct">{{ s.done }}/{{ s.total }} · {{ s.progress }}%</span>
|
||||
<button type="button" class="mini detail-btn" onclick="openDetail({{ s.id }})">详情</button>
|
||||
<button type="button" class="link-btn" onclick="openDetail({{ s.id }})">点击查看详情 ›</button>
|
||||
</div>
|
||||
{{ bar_svg(s.progress, s.color) | safe }}
|
||||
<ul class="tasklist">
|
||||
@@ -162,9 +160,8 @@
|
||||
|
||||
<section class="card">
|
||||
<h2>📖 我的书架墙
|
||||
<button type="button" class="mini detail-btn" onclick="openShelf()">详情</button>
|
||||
<button type="button" class="link-btn" onclick="openShelf()">点击查看详情 ›</button>
|
||||
</h2>
|
||||
<p class="sub">共读完 {{ shelf|length }} 本 · 上排最近读完,下排随机回顾</p>
|
||||
{% if shelf %}
|
||||
<div class="shelf-mini">
|
||||
<div class="shelf-row-label">🆕 最近读完</div>
|
||||
@@ -294,17 +291,20 @@
|
||||
if (!root) return { next: function () {}, prev: function () {} };
|
||||
var slides = Array.prototype.slice.call(root.querySelectorAll(slideSel));
|
||||
var iv = (parseInt(root.dataset.interval, 10) || 8) * 1000;
|
||||
var LS = 'carIdx_' + rootId;
|
||||
var idx = 0, timer = null;
|
||||
try { var sv = parseInt(localStorage.getItem(LS), 10); if (!isNaN(sv)) idx = sv; } catch (e) {}
|
||||
var info = infoId ? document.getElementById(infoId) : null;
|
||||
function show(i) {
|
||||
if (!slides.length) return;
|
||||
idx = (i + slides.length) % slides.length;
|
||||
slides.forEach(function (el, k) { el.style.display = (k === idx) ? display : 'none'; });
|
||||
if (info) info.textContent = (idx + 1) + ' / ' + slides.length + (unit || '');
|
||||
try { localStorage.setItem(LS, idx); } catch (e) {}
|
||||
clearTimeout(timer);
|
||||
if (slides.length > 1) timer = setTimeout(function () { show(idx + 1); }, iv);
|
||||
}
|
||||
show(0);
|
||||
show(idx);
|
||||
return { next: function () { show(idx + 1); }, prev: function () { show(idx - 1); } };
|
||||
}
|
||||
|
||||
@@ -314,6 +314,14 @@
|
||||
function carouselNext() { subjCar.next(); }
|
||||
function carouselPrev() { subjCar.prev(); }
|
||||
|
||||
/* ---------- 学期 / 假期 日历:仪表盘只显示当前所在时段 ---------- */
|
||||
|
||||
/* ---------- 书架墙封面点击打开详情 ---------- */
|
||||
document.querySelectorAll('.shelf-mini .book-cover').forEach(function (el) {
|
||||
el.style.cursor = 'pointer';
|
||||
el.addEventListener('click', openShelf);
|
||||
});
|
||||
|
||||
/* ---------- 弹窗 ---------- */
|
||||
function openDetail(id) {
|
||||
var src = document.getElementById('detail-' + id);
|
||||
|
||||
Reference in New Issue
Block a user