myworks.ejs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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">
  23. <%= translate.inProgress[lang] %>
  24. </button>
  25. <button class="tab-button" data-tab="completed">
  26. <%= translate.completed[lang] %>
  27. </button>
  28. <button class="tab-button" data-tab="favorite">
  29. <%= translate.favorite[lang] %>
  30. </button>
  31. </nav>
  32. <!-- 进行中内容 -->
  33. <div id="ongoing" class="tab-content active">
  34. <div class="image-grid">
  35. </div>
  36. </div>
  37. <!-- 已完成内容 -->
  38. <div id="completed" class="tab-content">
  39. <div class="image-grid">
  40. </div>
  41. </div>
  42. <!-- 收藏内容 -->
  43. <div id="favorite" class="tab-content">
  44. <div class="image-grid">
  45. </div>
  46. </div>
  47. </div>
  48. <script>
  49. const host = '<%= host %>';
  50. const lang = '<%= lang %>';
  51. // 标签切换功能
  52. const tabButtons = document.querySelectorAll('.tab-button');
  53. const tabContents = document.querySelectorAll('.tab-content');
  54. tabButtons.forEach(button => {
  55. button.addEventListener('click', () => {
  56. const targetTab = button.dataset.tab;
  57. // 移除所有激活状态
  58. tabButtons.forEach(btn => btn.classList.remove('active'));
  59. tabContents.forEach(content => content.classList.remove('active'));
  60. // 添加当前激活状态
  61. button.classList.add('active');
  62. document.getElementById(targetTab).classList.add('active');
  63. });
  64. });
  65. // 加载
  66. const loadWorks = (tabType) => {
  67. let data = {};
  68. if (tabType === 'favorite') {
  69. const raw = localStorage.getItem('_storage_collection__') || '{}';
  70. data = JSON.parse(raw);
  71. } else {
  72. const rawMeta = localStorage.getItem('__storage_metadata__') || '{}';
  73. const metaData = JSON.parse(rawMeta);
  74. data = Object.entries(metaData).filter(([_, item]) =>
  75. tabType === 'ongoing' ? item.progress < 100 : item.progress >= 100
  76. ).reduce((acc, [id, item]) => ({ ...acc, [id]: item }), {});
  77. }
  78. return Object.entries(data).map(([id, item]) => ({
  79. id,
  80. uri: `/${lang}/coloring-page/${id}`,
  81. thumbnail: `${host}/thumbs/coloring-page/${item.progress >= 100 ? 'work' : 'page'}/480/${id}.png`, // 缩略图拼接规则‌:ml-citation{ref="7" data="citationList"}
  82. progress: item.progress,
  83. timestamp: item.timestamp
  84. })).sort((a, b) => b.timestamp - a.timestamp); // 时间倒序排列
  85. };
  86. // 动态渲染
  87. const renderWorks = (container, items) => {
  88. container.innerHTML = '';
  89. items.forEach(item => {
  90. const card = document.createElement('div');
  91. card.className = 'image-card';
  92. card.innerHTML = `
  93. <a href="${item.uri}"><img src="${item.thumbnail}"></a>
  94. `;
  95. if (item.progress) {
  96. card.innerHTML += `
  97. <div class="progress-badge" style="background-color: ${item.progress >= 100 ? '#4CAF50' : '#FF5252'}; transition: background-color 0.3s ease; ">
  98. <span>${item.progress >= 100 ? '✓' : item.progress + '%'}</span>
  99. </div>
  100. `
  101. }
  102. container.appendChild(card);
  103. });
  104. };
  105. document.querySelectorAll('.tab-content').forEach(container => {
  106. const tabType = container.id;
  107. const works = loadWorks(tabType);
  108. const grid = container.querySelector('.image-grid');
  109. renderWorks(grid, works);
  110. });
  111. </script>
  112. </body>
  113. </html>