index.ejs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. <!doctype html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <title><%= title %></title>
  7. <link rel="stylesheet" href="/styles.css">
  8. </head>
  9. <body>
  10. <%- include('partials/nav') %>
  11. <main>
  12. <% if (message) { %><div class="notice"><%= message %></div><% } %>
  13. <% if (error) { %><div class="notice notice-error"><%= error %></div><% } %>
  14. <section class="hero tile-light home-status">
  15. <p class="eyebrow"><%= topicConfig.productKey %> · <%= topicConfig.deviceId %></p>
  16. <h1>办公室灯光</h1>
  17. <p class="lead">
  18. <span id="lightSummary"><%= states.filter((item) => item.state === 'ON').length %> 组开启,<%= states.filter((item) => item.state === 'OFF').length %> 组关闭。</span>
  19. <span id="nextOccurrenceText"><% if (nextOccurrence) { %>下一次:<%= actionLabel(nextOccurrence.action) %>,<%= nextOccurrence.at %>。<% } else { %>暂无后续计划。<% } %></span>
  20. </p>
  21. <div class="hero-actions">
  22. <form method="post" action="/control"><input type="hidden" name="channel" value="0"><button class="button-primary" name="action" value="open">全部打开</button></form>
  23. <form method="post" action="/control"><input type="hidden" name="channel" value="0"><button class="button-secondary" name="action" value="close">全部关闭</button></form>
  24. <form method="post" action="/control"><input type="hidden" name="channel" value="0"><button class="button-secondary" name="action" value="query">查询状态</button></form>
  25. </div>
  26. <p class="status-note">设备每 5 分钟主动上报,也可以手动查询。</p>
  27. <div class="state-grid home-state-grid">
  28. <% states.forEach((state) => { %>
  29. <article class="state-card" data-state-card="<%= state.channel %>">
  30. <p class="eyebrow"><%= state.name %></p>
  31. <h3 class="state-value state-<%= state.state.toLowerCase() %>" data-state-value><%= state.state %></h3>
  32. <p>最后更新:<span data-last-seen><%= state.last_seen_at ? dayjs(state.last_seen_at).format('YYYY-MM-DD HH:mm:ss') : '暂无' %></span></p>
  33. <div class="inline-actions">
  34. <form method="post" action="/control"><input type="hidden" name="channel" value="<%= state.channel %>"><button class="button-primary small" name="action" value="open">打开</button></form>
  35. <form method="post" action="/control"><input type="hidden" name="channel" value="<%= state.channel %>"><button class="button-secondary small" name="action" value="close">关闭</button></form>
  36. <form method="post" action="/control"><input type="hidden" name="channel" value="<%= state.channel %>"><button class="button-secondary small" name="action" value="query">查询</button></form>
  37. </div>
  38. </article>
  39. <% }) %>
  40. </div>
  41. </section>
  42. </main>
  43. </body>
  44. </html>