纳入范围: - backend/ Spring Boot 多模块后端(iot-common/device/rule/data/alarm/auth) - frontend/admin/ Vue3 + Element Plus 管理后台 - Android/ 涂鸦原生 APP (com.xhai.iot) - backend/sql/ Flyway 风格迁移脚本(V2~V21) - docs/ 对接文档与设计文档 排除范围: - 构建产物: node_modules/ target/ build/ dist/ .gradle/ - 签名密钥: *.jks *.keystore (严禁入库) - 本机配置: Android/local.properties - 运行日志: logs/ *.log - AI 协作本地数据 .codebuddy/ 与第三方 demo tuya-demo/ .gitattributes 统一以 LF 存储, Windows 批处理保留 CRLF
101 lines
7.1 KiB
CSS
101 lines
7.1 KiB
CSS
|
|
:root{
|
|
--bg:#eef2f7; --contentbg:#ffffff; --sidebar:#0f172a; --sidebar2:#15233f;
|
|
--text:#1e293b; --muted:#64748b; --line:#e2e8f0; --line2:#cbd5e1;
|
|
--accent:#2563eb; --accent2:#1d4ed8;
|
|
--get:#16a34a; --post:#2563eb; --put:#d97706; --del:#dc2626;
|
|
--req:#dc2626; --opt:#0891b2; --none:#64748b;
|
|
--codebg:#0f172a; --codefg:#cbd5e1;
|
|
}
|
|
*{box-sizing:border-box}
|
|
html,body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;color:var(--text);}
|
|
body{background:var(--bg);}
|
|
a{color:var(--accent);text-decoration:none}
|
|
a:hover{text-decoration:underline}
|
|
|
|
.layout{display:flex;min-height:100vh}
|
|
/* ===== 左侧导航 ===== */
|
|
aside#sidebar{width:264px;flex:0 0 264px;background:var(--sidebar);color:#cbd5e1;position:sticky;top:0;height:100vh;overflow-y:auto;padding:0 0 30px}
|
|
#sidebar .brand{padding:20px 22px 16px;border-bottom:1px solid #1e293b;margin-bottom:8px}
|
|
#sidebar .brand h2{margin:0;font-size:16px;color:#fff;letter-spacing:.02em}
|
|
#sidebar .brand p{margin:5px 0 0;font-size:12px;color:#94a3b8}
|
|
#sidebar .grp{font-size:11px;text-transform:uppercase;letter-spacing:.07em;color:#5b6b85;padding:16px 22px 5px}
|
|
#sidebar a.nav{display:block;padding:8px 22px;font-size:13.5px;color:#cbd5e1;text-decoration:none;border-left:3px solid transparent}
|
|
#sidebar a.nav:hover{background:var(--sidebar2);color:#fff}
|
|
#sidebar a.nav.active{background:var(--sidebar2);color:#fff;border-left-color:var(--accent)}
|
|
#sidebar .ft{padding:18px 22px 0;font-size:11px;color:#5b6b85;border-top:1px solid #1e293b;margin-top:18px}
|
|
|
|
/* ===== 主区域 ===== */
|
|
main{flex:1;min-width:0;display:flex;flex-direction:column}
|
|
#topbar{position:sticky;top:0;z-index:5;background:rgba(255,255,255,.92);backdrop-filter:blur(8px);border-bottom:1px solid var(--line);padding:13px 30px;display:flex;gap:14px;align-items:center;flex-wrap:wrap}
|
|
#topbar .ptitle{font-size:18px;font-weight:700;margin-right:auto;white-space:nowrap}
|
|
#topbar input.search{flex:1;min-width:170px;max-width:300px;padding:9px 12px;border:1px solid var(--line);border-radius:9px;font-size:13px;outline:none;background:#fff}
|
|
#topbar input.search:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(37,99,235,.12)}
|
|
.basebox{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--muted);white-space:nowrap}
|
|
.basebox input{padding:8px 10px;border:1px solid var(--line);border-radius:9px;font-size:12.5px;width:280px;max-width:46vw;background:#fff}
|
|
#content{padding:26px 30px 90px;max-width:1100px;width:100%}
|
|
|
|
/* ===== 概览页 ===== */
|
|
.ov-hero{background:linear-gradient(120deg,#0ea5e9,#6366f1);color:#fff;border-radius:14px;padding:26px 28px;margin-bottom:22px}
|
|
.ov-hero h1{margin:0 0 8px;font-size:24px}
|
|
.ov-hero p{margin:0;opacity:.92;font-size:14px;line-height:1.7}
|
|
.ov-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px;margin-bottom:26px}
|
|
.ov-card{background:var(--contentbg);border:1px solid var(--line);border-radius:12px;padding:16px 18px;transition:.15s}
|
|
.ov-card:hover{border-color:var(--accent);box-shadow:0 4px 16px rgba(37,99,235,.1)}
|
|
.ov-card h3{margin:0 0 6px;font-size:15px}
|
|
.ov-card p{margin:0 0 10px;font-size:12.5px;color:var(--muted);line-height:1.6}
|
|
.ov-card .cnt{font-size:12px;color:var(--accent);font-weight:600}
|
|
.ov-note{background:#fff7ed;border:1px solid #fed7aa;border-radius:12px;padding:16px 18px;font-size:13px;line-height:1.8;margin-bottom:22px}
|
|
.ov-note b{color:#c2410c}
|
|
.ov-note code{background:#fff;border:1px solid var(--line);border-radius:5px;padding:1px 6px;font-size:12px}
|
|
|
|
/* ===== 分组 / 章节 ===== */
|
|
.sec{margin:0 0 30px}
|
|
.sec>.h2{font-size:19px;border-left:4px solid var(--accent);padding-left:11px;margin:0 0 4px}
|
|
.sec>.sub{color:var(--muted);font-size:13px;margin:0 0 14px}
|
|
.toc{background:var(--contentbg);border:1px solid var(--line);border-radius:10px;padding:10px 14px;margin:0 0 20px;font-size:13px;display:flex;flex-wrap:wrap;gap:8px 14px}
|
|
.toc a{padding:2px 10px;border:1px solid var(--line);border-radius:20px;color:var(--muted)}
|
|
.toc a:hover{border-color:var(--accent);color:var(--accent);text-decoration:none}
|
|
|
|
/* ===== 接口卡片 ===== */
|
|
.ep{background:var(--contentbg);border:1px solid var(--line);border-radius:12px;padding:15px 17px;margin:0 0 13px;scroll-margin-top:80px}
|
|
.ep.hidden{display:none}
|
|
.ep .row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
|
|
.badge{font-weight:700;font-size:11.5px;padding:3px 9px;border-radius:6px;color:#fff}
|
|
.m-GET{background:var(--get)} .m-POST{background:var(--post)} .m-PUT{background:var(--put)} .m-DELETE{background:var(--del)}
|
|
.path{font-family:"SFMono-Regular",Consolas,monospace;font-size:13.5px;color:#0f172a;word-break:break-all;font-weight:600}
|
|
.tag{font-size:11px;padding:2px 9px;border-radius:20px;border:1px solid var(--line)}
|
|
.t-req{color:var(--req);border-color:var(--req)} .t-opt{color:var(--opt);border-color:var(--opt)} .t-none{color:var(--none);border-color:var(--none)}
|
|
.ep .desc{margin:9px 0 6px;font-size:14px}
|
|
.ep .params{font-size:12.5px;color:var(--muted)}
|
|
.ep .params b{color:var(--text)}
|
|
.ep .mlink{font-size:12.5px;margin-top:8px}
|
|
.ep .mlink a{color:var(--accent)}
|
|
.ex{margin-top:8px}
|
|
.ex summary{cursor:pointer;font-size:12.5px;color:var(--accent);user-select:none;outline:none}
|
|
.ex pre{background:var(--codebg);border:1px solid #1e293b;border-radius:9px;padding:12px 14px;overflow:auto;
|
|
font-family:"SFMono-Regular",Consolas,monospace;font-size:12px;color:var(--codefg);margin:8px 0 0;white-space:pre;line-height:1.55}
|
|
.ex pre .c{color:#64748b}
|
|
.empty{color:var(--muted);text-align:center;padding:40px;display:none}
|
|
|
|
/* ===== 模型 ===== */
|
|
.model{background:var(--contentbg);border:1px solid var(--line);border-radius:12px;padding:16px 18px;margin:0 0 16px;scroll-margin-top:80px}
|
|
.model h3{margin:0 0 4px;font-size:16px;color:#0f172a}
|
|
.model .mtag{font-size:11px;color:var(--muted);margin:0 0 10px}
|
|
.model .mtag .q{color:var(--accent);background:#eff6ff;border:1px solid #bfdbfe;border-radius:5px;padding:1px 6px;margin-right:6px}
|
|
.model .exjson{margin-top:8px}
|
|
table.ft{width:100%;border-collapse:collapse;font-size:12.5px;margin:6px 0 10px}
|
|
table.ft th{background:#f1f5f9;text-align:left;color:var(--muted);font-weight:600;padding:7px 9px;border-bottom:2px solid var(--line)}
|
|
table.ft td{padding:7px 9px;border-bottom:1px solid #eef2f7;vertical-align:top}
|
|
table.ft td .ty{color:#0369a1;font-family:Consolas,monospace;font-size:12px}
|
|
table.ft td .rq{color:var(--req);font-weight:700}
|
|
table.ft td .op{color:var(--muted)}
|
|
.model .exjson summary{cursor:pointer;font-size:12.5px;color:var(--accent);outline:none}
|
|
.model .exjson pre{background:var(--codebg);border-radius:9px;padding:12px 14px;overflow:auto;font-family:Consolas,monospace;font-size:12px;color:var(--codefg);margin:8px 0 0;white-space:pre}
|
|
.baseblk{background:#f8fafc;border:1px solid var(--line);border-radius:8px;padding:10px 12px;font-size:12px;margin:6px 0 10px}
|
|
.baseblk b{color:#0f172a}
|
|
.resp-note{font-size:12.5px;color:var(--muted);margin-top:6px}
|
|
code.inl{background:#f1f5f9;border:1px solid var(--line);border-radius:5px;padding:1px 6px;font-size:12px;font-family:Consolas,monospace;color:#0f172a}
|
|
footer{color:var(--muted);font-size:12px;text-align:center;padding:24px;border-top:1px solid var(--line);margin-top:20px}
|
|
|