myworks.ejs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <!DOCTYPE html>
  2. <html lang="<%= lang %>">
  3. <head>
  4. <%- include('common-meta') %>
  5. <link rel="stylesheet" href="/stylesheets/styles.css">
  6. <link rel="stylesheet" href="/stylesheets/header.css">
  7. <link rel="stylesheet" href="/stylesheets/myworks.css">
  8. </head>
  9. <!-- Google tag (gtag.js) -->
  10. <script async src="https://www.googletagmanager.com/gtag/js?id=G-JBGGVGLHTP"></script>
  11. <script>
  12. window.dataLayer = window.dataLayer || [];
  13. function gtag() { dataLayer.push(arguments); }
  14. gtag('js', new Date());
  15. gtag('config', 'G-JBGGVGLHTP');
  16. </script>
  17. <body>
  18. <%- include('header') %>
  19. <div class="tab-container">
  20. <!-- 标签导航 -->
  21. <nav class="tab-nav">
  22. <button class="tab-button active" data-tab="ongoing"><%= translate.inProgress[lang] %></button>
  23. <button class="tab-button" data-tab="completed"><%= translate.completed[lang] %></button>
  24. <button class="tab-button" data-tab="favorite"><%= translate.favorite[lang] %></button>
  25. </nav>
  26. <!-- 进行中内容 -->
  27. <div id="ongoing" class="tab-content active">
  28. <div class="image-grid">
  29. </div>
  30. </div>
  31. <!-- 已完成内容 -->
  32. <div id="completed" class="tab-content">
  33. <div class="image-grid">
  34. </div>
  35. </div>
  36. <!-- 收藏内容 -->
  37. <div id="favorite" class="tab-content">
  38. <div class="image-grid">
  39. </div>
  40. </div>
  41. </div>
  42. <script>
  43. const host = '<%= host %>';
  44. const lang = '<%= lang %>';
  45. // 标签切换功能
  46. const tabButtons = document.querySelectorAll('.tab-button');
  47. const tabContents = document.querySelectorAll('.tab-content');
  48. tabButtons.forEach(button => {
  49. button.addEventListener('click', () => {
  50. const targetTab = button.dataset.tab;
  51. // 移除所有激活状态
  52. tabButtons.forEach(btn => btn.classList.remove('active'));
  53. tabContents.forEach(content => content.classList.remove('active'));
  54. // 添加当前激活状态
  55. button.classList.add('active');
  56. document.getElementById(targetTab).classList.add('active');
  57. });
  58. });
  59. // 加载
  60. const loadWorks = (tabType) => {
  61. let data = {};
  62. if (tabType === 'favorite') {
  63. const raw = localStorage.getItem('_storage_collection__') || '{}';
  64. data = JSON.parse(raw);
  65. } else {
  66. const rawMeta = localStorage.getItem('__storage_metadata__') || '{}';
  67. const metaData = JSON.parse(rawMeta);
  68. data = Object.entries(metaData).filter(([_, item]) =>
  69. tabType === 'ongoing' ? item.progress < 100 : item.progress >= 100
  70. ).reduce((acc, [id, item]) => ({ ...acc, [id]: item }), {});
  71. }
  72. return Object.entries(data).map(([id, item]) => ({
  73. id,
  74. uri: `/${lang}/coloring-page/${id}`,
  75. thumbnail: `${host}/thumbs/coloring-page/page/480/${id}.png`, // 缩略图拼接规则‌:ml-citation{ref="7" data="citationList"}
  76. progress: item.progress,
  77. timestamp: item.timestamp
  78. })).sort((a, b) => b.timestamp - a.timestamp); // 时间倒序排列
  79. };
  80. // 动态渲染
  81. const renderWorks = (container, items) => {
  82. container.innerHTML = '';
  83. items.forEach(item => {
  84. const card = document.createElement('div');
  85. card.className = 'image-card';
  86. card.innerHTML = `
  87. <a href="${item.uri}"><img src="${item.thumbnail}"></a>
  88. `;
  89. if (item.progress) {
  90. card.innerHTML += `
  91. <div class="progress-badge" style="background-color: ${item.progress >= 100 ? '#4CAF50' : '#FF5252'}; transition: background-color 0.3s ease; ">
  92. <span>${item.progress >= 100 ? '✓' : item.progress + '%'}</span>
  93. </div>
  94. `
  95. }
  96. container.appendChild(card);
  97. });
  98. };
  99. document.querySelectorAll('.tab-content').forEach(container => {
  100. const tabType = container.id;
  101. const works = loadWorks(tabType);
  102. const grid = container.querySelector('.image-grid');
  103. renderWorks(grid, works);
  104. });
  105. </script>
  106. </body>
  107. </html>