前 动态枚举 k*_v2 和 study_duration_* key,渲染三块新看板。 不修改现有 v1 进度条逻辑。 */ (function(){ 'use strict'; function rd(k){ try{ return localStorage.getItem(k); }catch(e){ return null; } } function todayStr(){ var d=new Date(); return d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0'); } // 1. 注入看板CSS var css = document.createElement('style'); css.textContent = ` .se-dash{margin:16px 0;padding:18px 20px;background:#fff;border-radius:14px;box-shadow:0 2px 10px rgba(0,0,0,.06);font-family:"PingFang SC","Microsoft YaHei",sans-serif;} .se-dash h3{margin:0 0 12px;font-size:16px;color:#1f2937;display:flex;align-items:center;gap:6px;} .se-dash .se-sub{font-size:12px;color:#6b7280;margin-bottom:10px;} .se-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px;} .se-cell{padding:10px 12px;background:#f8fafc;border-radius:8px;border-left:3px solid #3b82f6;} .se-cell .se-k{font-size:12px;color:#6b7280;} .se-cell .se-n{font-size:22px;font-weight:700;color:#1f2937;} .se-cell.warn{border-left-color:#f59e0b;} .se-cell.danger{border-left-color:#ef4444;} .se-cell.ok{border-left-color:#10b981;} .se-reasons{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px;} .se-reason{padding:6px 14px;background:#fff7e6;border:1px solid #ffd591;border-radius:14px;font-size:13px;color:#ad6800;} .se-reason b{color:#d46b08;font-size:15px;margin-left:4px;} .se-heat{display:flex;gap:3px;align-items:flex-end;height:80px;margin-top:10px;} .se-heat .se-bar{flex:1;background:#dbeafe;border-radius:3px 3px 0 0;min-height:2px;position:relative;} .se-heat .se-bar.today{background:#3b82f6;} .se-heat .se-bar:hover{background:#60a5fa;} .se-heat .se-bar .se-tip{position:absolute;bottom:100%;left:50%;transform:translateX(-50%);background:#1f2937;color:#fff;font-size:11px;padding:2px 6px;border-radius:4px;white-space:nowrap;display:none;} .se-heat .se-bar:hover .se-tip{display:block;} .se-empty{color:#9ca3af;font-size:13px;padding:8px 0;} `; document.head.appendChild(css); // 2. 注入看板容器(插在 .note 前面) var dash = document.createElement('div'); dash.innerHTML = `
`;
var note = document.querySelector('.note');
if(note && note.parentNode){ note.parentNode.insertBefore(dash, note); }
else { document.body.appendChild(dash); }
// 3. 枚举所有 k*_v2 key
function enumerateV2(){
var out = {}; // {K1: {stid: rec, ...}, ...}
try{
for(var i=0;i