Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

385 lignes
14 KiB

  1. {% extends "layout.html" %}
  2. {% block content %}
  3. <!-- Right Side Navigation Dots -->
  4. <div class="slide-labels" id="slideLabels">
  5. <div class="slide-label active" data-index="0"><span class="dot"></span><span class="txt">首页</span></div>
  6. <div class="slide-label" data-index="1"><span class="dot"></span><span class="txt">数据公示</span></div>
  7. <div class="slide-label" data-index="2"><span class="dot"></span><span class="txt">公益项目</span></div>
  8. <div class="slide-label" data-index="3"><span class="dot"></span><span class="txt">新闻动态</span></div>
  9. <div class="slide-label" data-index="4"><span class="dot"></span><span class="txt">合作伙伴</span></div>
  10. </div>
  11. <!-- Swiper Fullpage -->
  12. <div class="swiper swiper-fullpage" id="fullpageSwiper">
  13. <div class="swiper-wrapper">
  14. <!-- Slide 1: Banner -->
  15. <div class="swiper-slide">
  16. <div class="slide-banner">
  17. <div class="swiper banner-swiper" id="bannerSwiper">
  18. <div class="swiper-wrapper">
  19. {% for banner in banners %}
  20. <div class="swiper-slide">
  21. <div class="banner-slide-bg" style="background-image:url('{{banner.image}}')"></div>
  22. <div class="banner-slide-content pos-{{banner.position | default('left')}}{% if banner.glass %} glass-on{% endif %}">
  23. <h1>{{banner.title}}{% if banner.subtitle %}<br>{{banner.subtitle}}{% endif %}</h1>
  24. {% if banner.description %}
  25. <p class="desc">{{banner.description}}</p>
  26. {% endif %}
  27. <div class="btns">
  28. {% if banner.btn1_show %}
  29. <a href="{{banner.btn1_link}}" class="btn-primary">{{banner.btn1_text}}</a>
  30. {% endif %}
  31. {% if banner.btn2_show %}
  32. <a href="{{banner.btn2_link}}" class="btn-ghost">{{banner.btn2_text}}</a>
  33. {% endif %}
  34. </div>
  35. </div>
  36. </div>
  37. {% endfor %}
  38. </div>
  39. <div class="swiper-pagination"></div>
  40. </div>
  41. <div class="scroll-hint">
  42. <div class="mouse"></div>
  43. <span>SCROLL</span>
  44. </div>
  45. </div>
  46. </div>
  47. <!-- Slide 2: Donation Data -->
  48. <div class="swiper-slide">
  49. <div class="slide-donation">
  50. <div class="donation-wrap">
  51. <div class="section-head">
  52. <h2>捐赠及支出公示</h2>
  53. <div class="en">Every Penny, Tracked with Integrity</div>
  54. </div>
  55. <div class="data-cards">
  56. <div class="data-card">
  57. <div class="label">历年公益捐赠收入</div>
  58. <div class="amount"><span class="countup" data-target="{{donationStat.total_income | default(0)}}">0</span><span class="unit">元</span></div>
  59. <div class="note">截至今日</div>
  60. </div>
  61. <div class="data-card">
  62. <div class="label">本年度捐赠收入</div>
  63. <div class="amount"><span class="countup" data-target="{{donationStat.year_income | default(0)}}">0</span><span class="unit">元</span></div>
  64. <div class="note">本年度</div>
  65. </div>
  66. <div class="data-card">
  67. <div class="label">历年公益支出</div>
  68. <div class="amount"><span class="countup" data-target="{{donationStat.total_expense | default(0)}}">0</span><span class="unit">元</span></div>
  69. <div class="note">截至今日</div>
  70. </div>
  71. </div>
  72. <div class="donation-tables">
  73. <div class="dtable">
  74. <h3>捐赠收入明细</h3>
  75. <div class="dtable-table-wrap">
  76. <table>
  77. <thead><tr><th>捐赠方</th><th class="td-r" style="width:120px;">金额</th></tr></thead>
  78. </table>
  79. <div class="dtable-scroll-wrap">
  80. <div class="dtable-scroll-inner">
  81. <table>
  82. <tbody>
  83. {% for item in donationIncome %}
  84. <tr><td>{{item.name}}</td><td class="td-r">{{item.amount}}</td></tr>
  85. {% endfor %}
  86. {% for item in donationIncome %}
  87. <tr><td>{{item.name}}</td><td class="td-r">{{item.amount}}</td></tr>
  88. {% endfor %}
  89. </tbody>
  90. </table>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. <div class="dtable">
  96. <h3>公益支出明细</h3>
  97. <div class="dtable-table-wrap">
  98. <table>
  99. <thead><tr><th>支付对象</th><th class="td-r" style="width:120px;">金额</th></tr></thead>
  100. </table>
  101. <div class="dtable-scroll-wrap">
  102. <div class="dtable-scroll-inner">
  103. <table>
  104. <tbody>
  105. {% for item in donationExpense %}
  106. <tr><td>{{item.name}}</td><td class="td-r">{{item.amount}}</td></tr>
  107. {% endfor %}
  108. {% for item in donationExpense %}
  109. <tr><td>{{item.name}}</td><td class="td-r">{{item.amount}}</td></tr>
  110. {% endfor %}
  111. </tbody>
  112. </table>
  113. </div>
  114. </div>
  115. </div>
  116. </div>
  117. <div class="dtable dtable-drug">
  118. <h3>药品援助公示</h3>
  119. <div class="dtable-table-wrap">
  120. <table>
  121. <thead><tr><th>发放日期</th><th>患者姓名</th><th>地区</th><th>药品名称</th></tr></thead>
  122. </table>
  123. <div class="drug-scroll-wrap">
  124. <div class="drug-scroll-inner">
  125. <table>
  126. <tbody>
  127. {% for item in medicines %}
  128. <tr>
  129. <td>{{item.distribute_date}}</td>
  130. <td>{{item.person}}</td>
  131. <td>{{item.region}}</td>
  132. <td class="drug-name">{{item.name}}</td>
  133. </tr>
  134. {% endfor %}
  135. {% for item in medicines %}
  136. <tr>
  137. <td>{{item.distribute_date}}</td>
  138. <td>{{item.person}}</td>
  139. <td>{{item.region}}</td>
  140. <td class="drug-name">{{item.name}}</td>
  141. </tr>
  142. {% endfor %}
  143. </tbody>
  144. </table>
  145. </div>
  146. </div>
  147. </div>
  148. </div>
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. <!-- Slide 3: Projects -->
  154. <div class="swiper-slide">
  155. <div class="slide-projects" id="slideProjects">
  156. <!-- Background images -->
  157. {% for proj in projects %}
  158. <div class="proj-bg{% if loop.index == 1 %} active{% endif %}" style="background-image:url('{{proj.cover}}')"></div>
  159. {% endfor %}
  160. <!-- Info card -->
  161. <div class="proj-info-card" id="projInfoCard">
  162. <div class="card-label">项目介绍</div>
  163. <h3 id="projTitle">{% if projects[0] %}{{projects[0].title}}{% endif %}</h3>
  164. <div class="card-divider"></div>
  165. <p id="projDesc">{% if projects[0] %}{{projects[0].summary}}{% endif %}</p>
  166. <a href="#" class="card-btn" id="projLink">了解详情 →</a>
  167. </div>
  168. <!-- Bottom tabs -->
  169. <div class="proj-tabs" id="projTabs">
  170. {% for proj in projects %}
  171. <div class="proj-tab{% if loop.index == 1 %} active{% endif %}" data-index="{{loop.index0}}">{{proj.title}}</div>
  172. {% endfor %}
  173. </div>
  174. <a href="/project.html" class="proj-more-link">查看全部项目</a>
  175. </div>
  176. </div>
  177. <!-- Slide 4: News -->
  178. <div class="swiper-slide">
  179. <div class="slide-news">
  180. <div class="news-wrap">
  181. <div class="section-head">
  182. <h2>新闻 &amp; 动态</h2>
  183. <div class="en">Latest News and Updates</div>
  184. </div>
  185. <div class="news-grid">
  186. {% if newsList[0] %}
  187. <a href="/news/detail/{{newsList[0].id}}.html" class="news-featured">
  188. <img src="{{newsList[0].cover}}" alt="{{newsList[0].title}}">
  189. <div class="overlay">
  190. <h3>{{newsList[0].title}}</h3>
  191. <div class="date">{{newsList[0].publish_time}}</div>
  192. </div>
  193. </a>
  194. {% endif %}
  195. <div class="news-list">
  196. {% for news in newsList %}
  197. {% if loop.index > 1 %}
  198. <a href="/news/detail/{{news.id}}.html" class="news-item">
  199. <div class="date-box">
  200. <div class="day">{{loop.index}}</div>
  201. <div class="ym">{{news.publish_time}}</div>
  202. </div>
  203. <div class="text">
  204. <h4>{{news.title}}</h4>
  205. <p>{{news.summary}}</p>
  206. </div>
  207. </a>
  208. {% endif %}
  209. {% endfor %}
  210. <div style="text-align:right;padding-top:12px;">
  211. <a href="/news.html" class="more-link">更多新闻 →</a>
  212. </div>
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. </div>
  218. <!-- Slide 5: Partners + Footer -->
  219. <div class="swiper-slide">
  220. <div class="slide-footer">
  221. <div class="partners-section">
  222. <div class="section-head">
  223. <h2>合作伙伴</h2>
  224. <div class="en">Thank You for Your Cooperation on the Way to Charity</div>
  225. </div>
  226. <div class="partners-grid">
  227. {% for partner in partners %}
  228. <div class="partner-item">
  229. {% if partner.link %}
  230. <a href="{{partner.link}}" target="_blank"><img src="{{partner.image}}" alt="{{partner.title}}"></a>
  231. {% else %}
  232. <img src="{{partner.image}}" alt="{{partner.title}}">
  233. {% endif %}
  234. </div>
  235. {% endfor %}
  236. </div>
  237. </div>
  238. {% include "common/_footer.html" %}
  239. </div>
  240. </div>
  241. </div>
  242. </div>
  243. {% endblock %}
  244. {% block js %}
  245. <script>
  246. // Project data for tab switching
  247. var projData = [
  248. {% for proj in projects %}
  249. { title: '{{proj.title}}', desc: '{{proj.summary}}', link: '/project/detail/{{proj.id}}.html' }{% if not loop.last %},{% endif %}
  250. {% endfor %}
  251. ];
  252. (function(){
  253. var labels = document.getElementById('slideLabels');
  254. var labelItems = labels.querySelectorAll('.slide-label');
  255. function updateLabels(index) {
  256. labelItems.forEach(function(el, i) {
  257. el.classList.toggle('active', i === index);
  258. });
  259. var lightSlides = [1, 3, 4];
  260. labels.classList.toggle('light', lightSlides.indexOf(index) > -1);
  261. }
  262. // Project tab switching
  263. var projBgs = document.querySelectorAll('.proj-bg');
  264. var projTabs = document.querySelectorAll('.proj-tab');
  265. var projTitle = document.getElementById('projTitle');
  266. var projDesc = document.getElementById('projDesc');
  267. var projLink = document.getElementById('projLink');
  268. var currentProj = 0;
  269. function switchProject(idx) {
  270. projBgs.forEach(function(bg, i) { bg.classList.toggle('active', i === idx); });
  271. projTabs.forEach(function(tab, i) { tab.classList.toggle('active', i === idx); });
  272. if (projData[idx]) {
  273. projTitle.textContent = projData[idx].title;
  274. projDesc.textContent = projData[idx].desc;
  275. projLink.href = projData[idx].link;
  276. }
  277. }
  278. projTabs.forEach(function(tab) {
  279. tab.addEventListener('click', function() {
  280. currentProj = parseInt(this.dataset.index);
  281. switchProject(currentProj);
  282. startProjAuto();
  283. });
  284. });
  285. // Auto-rotate projects
  286. var projTimer = null;
  287. function startProjAuto() {
  288. stopProjAuto();
  289. projTimer = setInterval(function() {
  290. currentProj = (currentProj + 1) % projData.length;
  291. switchProject(currentProj);
  292. }, 5000);
  293. }
  294. function stopProjAuto() { if(projTimer){clearInterval(projTimer);projTimer=null;} }
  295. // Banner Swiper
  296. var bannerSwiper = new Swiper('#bannerSwiper', {
  297. direction: 'horizontal',
  298. loop: true,
  299. speed: 1000,
  300. autoplay: { delay: 5000, disableOnInteraction: false },
  301. effect: 'fade',
  302. fadeEffect: { crossFade: true },
  303. pagination: {
  304. el: '#bannerSwiper .swiper-pagination',
  305. clickable: true,
  306. },
  307. nested: true,
  308. });
  309. // Fullpage Swiper
  310. var fullpage = new Swiper('#fullpageSwiper', {
  311. direction: 'vertical',
  312. speed: 800,
  313. mousewheel: {
  314. sensitivity: 1,
  315. thresholdDelta: 30,
  316. },
  317. keyboard: { enabled: true },
  318. on: {
  319. slideChange: function() {
  320. updateLabels(this.activeIndex);
  321. if(this.activeIndex === 2) { startProjAuto(); } else { stopProjAuto(); }
  322. if(this.activeIndex === 0) { bannerSwiper.autoplay.start(); } else { bannerSwiper.autoplay.stop(); }
  323. if(this.activeIndex === 1) triggerCountUp();
  324. },
  325. init: function() {
  326. updateLabels(0);
  327. }
  328. }
  329. });
  330. // Click labels to navigate
  331. labelItems.forEach(function(el) {
  332. el.addEventListener('click', function() {
  333. fullpage.slideTo(parseInt(this.dataset.index));
  334. });
  335. });
  336. // CountUp animation
  337. function animateCountUp(el) {
  338. var target = parseFloat(el.dataset.target) || 0;
  339. var duration = 2000;
  340. var startTime = performance.now();
  341. var easeOut = function(t) { return 1 - Math.pow(1 - t, 3); };
  342. function update(now) {
  343. var elapsed = now - startTime;
  344. var progress = Math.min(elapsed / duration, 1);
  345. var value = Math.floor(easeOut(progress) * target);
  346. el.textContent = value.toLocaleString();
  347. if (progress < 1) requestAnimationFrame(update);
  348. }
  349. requestAnimationFrame(update);
  350. }
  351. var countUpDone = false;
  352. function triggerCountUp() {
  353. if (countUpDone) return;
  354. countUpDone = true;
  355. document.querySelectorAll('.countup').forEach(function(el) { animateCountUp(el); });
  356. }
  357. })();
  358. </script>
  359. {% endblock %}