course.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. import GoodsItem from '../component/GoodsItem';
  2. import Utils from './Utils';
  3. import Consts from './Consts';
  4. import {CommandBus, CMD_TYPE} from './CommandBus';
  5. class Course {
  6. constructor() {}
  7. static renderList(data, auth) {
  8. let main = document.querySelector('#course-main');
  9. main.innerHTML = '';
  10. //先获取各课的下载状态
  11. let recs = []
  12. for (let idx in data){
  13. let item = data[idx];
  14. recs.push(item.id);
  15. }
  16. // 现在只按文字模板进行渲染
  17. main.innerHTML = this.textList(data, auth);
  18. }
  19. static textList(data, auth) {
  20. let content = '';
  21. function listItem(data, seq, isFree) {
  22. let btnClass = 'download-btn-lesson-list-ready';
  23. if (data.downloadStatus == Consts.DOWNLOAD_STATUS_ONGOING){
  24. btnClass = 'download-btn-lesson-list-ongoing';
  25. }
  26. else if (data.downloadStatus == Consts.DOWNLOAD_STATUS_SUCCESS) {
  27. btnClass = 'download-btn-lesson-list-success';
  28. } if ( data.downloadStatus == Consts.DOWNLOAD_STATUS_FAILED ) {
  29. btnClass = 'download-btn-lesson-list-failed';
  30. }
  31. return `
  32. <div data-seq="${seq}">
  33. <div id="lesson-btn-${seq}" data-id="${data.id}" data-name="${data.title}" data-dload="${data.downloadStatus}" data-seq="${seq}" fe-role="Widget" class="text-wrapper">
  34. ${Utils.fixOverflowStr(data.title, 32, '...')}
  35. <div class="free-flag" style="display: ${isFree ? "block" : "none"}"></div>
  36. </div>
  37. <div id="download-btn-${data.id}" fe-role="Widget" class="${btnClass}" data-id="${data.id}" data-name="${data.title}" data-seq="${seq}">
  38. </div>
  39. </div>
  40. `;
  41. }
  42. for (let i in data) {
  43. // 课程未购买的第一课加入free标记
  44. if (i == 0 && !auth) {
  45. content += listItem(data[i], i, true);
  46. } else {
  47. content += listItem(data[i], i, false);
  48. }
  49. }
  50. return `<div id="list-text-container" class="list-text-container" fe-role="Scroll" fe-cfg="scroll_dir:v,scroll_center:con,scroll_duration:0.2,scroll_easing:linear"><div class="scroll-list clearfix" id="course-main-list">${content}</div></div> `;
  51. }
  52. /**
  53. * 按钮工厂
  54. * @param {Number} location 在goods中的位置
  55. * @param {Object} goodsItem
  56. */
  57. static generateBuyButton(location, goodsItem) {
  58. const { id, terminalPrice, chargeUnit, isInCart } = goodsItem;
  59. const newPrice = Utils.twoDecimal_f(terminalPrice);
  60. const oldPrice = Utils.twoDecimal_f(terminalPrice*1.25);
  61. const newPriceStr = Utils.thousandthFormat(newPrice);
  62. const oldPriceStr = Utils.thousandthFormat(oldPrice);
  63. let btnStr = `
  64. <div fe-role="Widget" class="btn goods-${location}" id="goods-${id}">
  65. ${newPriceStr}元/${chargeUnit}
  66. <p>原价${oldPriceStr}</p>
  67. </div>`;
  68. if (isInCart) {
  69. btnStr = `<div fe-role="Widget" class="btn added" id="goods-${id}"></div>`;
  70. }
  71. return btnStr;
  72. }
  73. static renderDetail(data) {
  74. const { auth, detail, digest, beginTime, endTime } = data;
  75. let goods = data.goods;
  76. if (!goods) {
  77. goods = [];
  78. }
  79. let beginTimeStr = '';
  80. let endTimeStr = '';
  81. if (beginTime) {
  82. beginTimeStr = this.dateFormat(beginTime);
  83. }
  84. if (endTime) {
  85. endTimeStr = this.dateFormat(endTime);
  86. } else {
  87. endTimeStr = '永久';
  88. }
  89. let main = document.querySelector('#course-main');
  90. main.innerHTML = '';
  91. let duration = '';
  92. let btn = '';
  93. let buyedIcon = '';
  94. let desc = `<p class="desc" id="desc">${detail || ''}</p>`;
  95. if (auth) {
  96. duration = `
  97. <p class="use-duration" id="use-duration">
  98. 使用期限:${beginTimeStr}-${endTimeStr}
  99. </p>`;
  100. buyedIcon = '<div class="buy-icon"></div>';
  101. } else {
  102. duration = `<p class="use-duration" id="use-duration">${digest || ''}</p>`;
  103. }
  104. let btnContainer = [];
  105. for (let i in goods) {
  106. // 这里限制只选择goods列表里的前三个
  107. if (i >= 3) break;
  108. btnContainer.push(this.generateBuyButton(i, goods[i]));
  109. }
  110. btn = `<div class="btn-panel">${btnContainer.join('')}</div>`;
  111. const desc_wrapper = `<div class="desc-wrapper">${duration + desc + buyedIcon}</div>`;
  112. main.innerHTML = `<div class="detail-container" id="course-main-detail">${desc_wrapper + btn}</div>`;
  113. }
  114. static renderPeriphery(dataset) {
  115. let main = document.getElementById('course-main');
  116. main.innerHTML = '';
  117. let listHtml = '';
  118. for (let i in dataset) {
  119. const { title, subTitle, coverUrl, goods } = dataset[i];
  120. let price = '';
  121. if (goods && Array.isArray(goods) && goods.length >= 1) {
  122. price = goods[0].terminalPrice || '';
  123. }
  124. let data = {
  125. price,
  126. img: `${Consts.IMG_PATH}/${coverUrl}`,
  127. title: title || '',
  128. correlative: subTitle || ''
  129. };
  130. listHtml += `
  131. <div fe-role="Widget" data-index="${i}" id="periphery-wrapper-${dataset[i].id}" class="periphery-wrapper ">
  132. ${GoodsItem.createHTMLString(data)}
  133. </div>`;
  134. }
  135. if (dataset.length > 0) {
  136. main.innerHTML = `
  137. <div class="periphery-container" fe-role="Scroll" fe-cfg="scroll_dir:h">
  138. <div class="scroll-list" id="course-main-periphery">${listHtml}</div>
  139. </div>`;
  140. } else {
  141. main.innerHTML = `<div class="empty-periphery">暂无周边配套</div>`;
  142. }
  143. }
  144. static renderPeripheryDetail(data) {
  145. const { id, title, subTitle, detail, goods } = data;
  146. let price = 0;
  147. let goodsId;
  148. let isInCart;
  149. if (goods && goods.length >= 1) {
  150. price = goods[0].terminalPrice;
  151. goodsId = goods[0].id;
  152. isInCart = goods[0].isInCart;
  153. }
  154. let main = document.getElementById('course-main');
  155. let _detailContent = document.querySelector('#periphery-detail-content');
  156. if (_detailContent) {
  157. main.removeChild(_detailContent);
  158. }
  159. let detailContent = document.createElement('div');
  160. detailContent.setAttribute('class', 'periphery-detail-content');
  161. detailContent.setAttribute('id', 'periphery-detail-content');
  162. detailContent.setAttribute('fe-role', 'Switch');
  163. let icon = '';
  164. if (isInCart) {
  165. icon = '<div fe-role="Widget" class="periphery-icon added" id="periphery-add-cart"></div>';
  166. } else {
  167. icon = `<div fe-role="Widget" class="periphery-icon add-cart" id="periphery-add-cart" data-goodsId="${goodsId}"></div>`;
  168. }
  169. let list = '';
  170. list = `
  171. <div id="periphery-detail-wrapper-${id}" class="periphery-detail-wrapper">
  172. <div class="periphery-slide" id="slide-wrapper-${id}">
  173. <div></div>
  174. </div>
  175. <div class="periphery-detail">
  176. <p class="periphery-name">${title + '&nbsp;&nbsp;' + subTitle}</p>
  177. <p class="periphery-price">¥${Utils.twoDecimal_f(price)}</p>
  178. <p class="periphery-desc">${detail || ''}</p>
  179. ${icon}
  180. </div>
  181. </div>`;
  182. detailContent.innerHTML = `
  183. <div class="left" id="left"></div>
  184. ${list}
  185. <div class="right" id="right"></div>`;
  186. main.appendChild(detailContent);
  187. }
  188. static dateFormat(time) {
  189. let date = new Date(time);
  190. let year = date.getFullYear();
  191. let month = date.getMonth() + 1;
  192. let day = date.getDate();
  193. return [year, month, day].join('/');
  194. }
  195. }
  196. module.exports = Course;