card.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. layui.define(['table', 'laypage','jquery', 'element'], function(exports) {
  2. "use strict";
  3. var MOD_NAME = 'card',
  4. $ = layui.jquery,
  5. element = layui.element,
  6. laypage = layui.laypage;
  7. var _instances = {}; // 记录所有实例
  8. var defaultOption = {
  9. elem: "#currentTableId",// 构建的模型
  10. url: "",// 数据 url 连接
  11. loading: true,//是否加载
  12. limit: 0, //每页数量默认是每行数量的双倍
  13. linenum: 4, //每行数量 2,3,4,6
  14. currentPage: 1,//当前页
  15. data:[], //静态数据
  16. limits:[], //页码
  17. page: true, //是否分页
  18. layout: ['count', 'prev', 'page', 'next','limit', 'skip'],//分页控件
  19. request: {
  20. pageName: 'page' //页码的参数名称,默认:page
  21. , limitName: 'limit' //每页数据量的参数名,默认:limit
  22. , idName: 'id' //主键名称,默认:id
  23. , titleName: 'title' //标题名称,默认:title
  24. , imageName: 'image' //图片地址,默认:image
  25. , remarkName: 'remark' //备注名称,默认:remark
  26. , timeName: 'time' //时间名称,默认:time
  27. },
  28. response: {
  29. statusName: 'code' //规定数据状态的字段名称,默认:code
  30. , statusCode: 0 //规定成功的状态码,默认:0
  31. , msgName: 'msg' //规定状态信息的字段名称,默认:msg
  32. , countName: 'count' //规定数据总数的字段名称,默认:count
  33. , dataName: 'data' //规定数据列表的字段名称,默认:data
  34. },
  35. clickItem: function(data){},
  36. done: function () {
  37. }
  38. };
  39. var card = function(opt) {
  40. _instances[opt.elem.substring(1)] = this;
  41. this.reload(opt);
  42. };
  43. card.prototype.initOptions = function (opt) {
  44. this.option = $.extend(true, {}, defaultOption, opt);
  45. if (!this.option.limit || this.option.limit == 0) {
  46. this.option.limit = this.option.linenum * 2;
  47. }
  48. if (!this.option.limits || this.option.limits.length == 0) {
  49. this.option.limits = [this.option.limit];
  50. }
  51. };
  52. card.prototype.init = function () {
  53. var option = this.option;
  54. var url = option.url;
  55. var html = "";
  56. html += option.loading == true ? '<div class="ew-table-loading">' : ' <div class="ew-table-loading layui-hide">';
  57. html += '<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>';
  58. html += '</div>';
  59. $(option.elem).html(html);
  60. html = "";
  61. if (!!url) {
  62. if (url.indexOf("?") >= 0) {
  63. url = url + '&v=1.0.0';
  64. }
  65. else {
  66. url = url + '?v=1.0.0';
  67. }
  68. if (!!option.page) {
  69. url = url + '&' + option.request.limitName + '=' + option.limit;
  70. url = url + '&' + option.request.pageName + '=' + option.currentPage;
  71. }
  72. if (!!option.where) {
  73. for (let key in option.where) {
  74. url = url + '&' + key + '=' + option.where[key];
  75. }
  76. }
  77. getData(url).then(function(data){
  78. data = initData(data, option);
  79. if (data.code != option.response.statusCode) {
  80. option.data = [];
  81. option.count = 0;
  82. } else {
  83. option.data = data.data;
  84. option.count = data.count;
  85. }
  86. if (!!option.data && option.data.length > 0) {
  87. html = createComponent(option.elem.substring(1), option.linenum, option.data);
  88. html += "<div id='cardpage'></div>";
  89. }
  90. else {
  91. html = "<p>没有数据</p>";
  92. }
  93. $(option.elem).html(html);
  94. if (option.page) {
  95. laypage.render({
  96. elem: 'cardpage'
  97. , count: option.count, limit: option.limit, limits: option.limits, curr: option.currentPage
  98. , layout: option.layout
  99. , jump: function (obj, first) {
  100. option.limit = obj.limit;
  101. option.currentPage = obj.curr;
  102. if (!first) {
  103. _instances[option.elem.substring(1)].reload(option);
  104. }
  105. }
  106. });
  107. }
  108. });
  109. }
  110. else {
  111. if (!option.alldata) {
  112. option.alldata = option.data;
  113. }
  114. if (option.page) {
  115. var data = [];
  116. option.count = option.alldata.length;
  117. for (var i = (option.currentPage - 1) * option.limit; i < option.currentPage * option.limit && i<option.alldata.length; i++) {
  118. data.push(option.alldata[i]);
  119. }
  120. option.data = data;
  121. }
  122. if (!!option.data && option.data.length > 0) {
  123. html = createComponent(option.elem.substring(1), option.linenum, option.data);
  124. html += "<div id='cardpage'></div>";
  125. }
  126. else {
  127. html = "<p>没有数据</p>";
  128. }
  129. $(option.elem).html(html);
  130. if (option.page) {
  131. laypage.render({
  132. elem: 'cardpage'
  133. , count: option.count, limit: option.limit, limits: option.limits, curr: option.currentPage
  134. , layout: option.layout
  135. , jump: function (obj, first) {
  136. option.limit = obj.limit;
  137. option.currentPage = obj.curr;
  138. if (!first) {
  139. _instances[option.elem.substring(1)].reload(option);
  140. }
  141. }
  142. });
  143. }
  144. }
  145. }
  146. card.prototype.reload = function (opt) {
  147. this.initOptions(this.option ? $.extend(true, this.option, opt) : opt);
  148. this.init(); // 初始化表格
  149. }
  150. function createComponent(elem,linenum,data) {
  151. var html = "<div class='cloud-card-component'>"
  152. var content = createCards(elem, linenum,data);
  153. var page = "";
  154. content = content + page;
  155. html += content + "</div>"
  156. return html;
  157. }
  158. function createCards(elem, linenum,data) {
  159. var content = "<div class='layui-row layui-col-space30'>";
  160. for (var i = 0; i < data.length; i++) {
  161. content += createCard(elem, linenum,data[i],i);
  162. }
  163. content += "</div>";
  164. return content;
  165. }
  166. function createCard(elem, linenum, item, no) {
  167. var line = 12 / linenum;
  168. var card =
  169. '<div id=' + item.id + ' onclick="cardTableCheckedCard(' + elem + ',this)" class="layui-col-md' + line + ' ew-datagrid-item" data-index="' + no+'" data-number="1"> <div class="project-list-item"> <img class="project-list-item-cover" src="' +item.image + '"> <div class="project-list-item-body"> <h2>' + item.title + '</h2> <div class="project-list-item-text layui-text">' + item.remark + '</div> <div class="project-list-item-desc"> <span class="time">' +item.time + '</span> <div class="ew-head-list"></div> </div> </div > </div > </div > '
  170. return card;
  171. }
  172. function initData(tempData, option) {
  173. var data = {};
  174. data.code = tempData[option.response.statusName];
  175. data.msg = tempData[option.response.msgName];
  176. data.count = tempData[option.response.countName];
  177. var dataList = tempData[option.response.dataName];
  178. data.data = [];
  179. for (var i = 0; i < dataList.length; i++) {
  180. var item = {};
  181. item.id = dataList[i][option.request.idName];
  182. item.image = dataList[i][option.request.imageName];
  183. item.title = dataList[i][option.request.titleName];
  184. item.remark = dataList[i][option.request.remarkName];
  185. item.time = dataList[i][option.request.timeName];
  186. data.data.push(item);
  187. }
  188. return data;
  189. }
  190. function getData(url) {
  191. var defer = $.Deferred();
  192. $.get(url + (url.indexOf("?") ? "&" : "?") + "fresh=" + Math.random(), function(result) {
  193. defer.resolve(result)
  194. });
  195. return defer.promise();
  196. }
  197. window.cardTableCheckedCard = function (elem,obj) {
  198. $(obj).addClass('layui-table-click').siblings().removeClass('layui-table-click');
  199. var item = {};
  200. item.id = obj.id;
  201. item.image = $(obj).find('.project-list-item-cover')[0].src;
  202. item.title = $(obj).find('h2')[0].innerHTML;
  203. item.remark = $(obj).find('.project-list-item-text')[0].innerHTML;
  204. item.time = $(obj).find('.time')[0].innerHTML;
  205. _instances[elem.id].option.checkedItem = item;
  206. _instances[elem.id].option.clickItem(item);
  207. }
  208. /** 对外提供的方法 */
  209. var tt = {
  210. render: function (options) {
  211. return new card(options);
  212. },
  213. reload: function (id, opt) {
  214. _instances[id].option.checkedItem = null;
  215. _instances[id].reload(opt);
  216. },
  217. getChecked: function (id) {
  218. var option = _instances[id].option;
  219. var data = option.checkedItem;
  220. var item = {};
  221. if (!data) {
  222. return null;
  223. }
  224. item[option.request.idName] = data.id;
  225. item[option.request.imageName] = data.image;
  226. item[option.request.titleName] = data.title;
  227. item[option.request.remarkName] = data.remark;
  228. item[option.request.timeName] = data.time;
  229. return item;
  230. },
  231. getAllData: function (id) {
  232. var option = _instances[id].option;
  233. var data = [];
  234. for (var i = 0; i < option.data.length; i++) {
  235. var item = {};
  236. item[option.request.idName] = option.data[i].id;
  237. item[option.request.imageName] = option.data[i].image;
  238. item[option.request.titleName] = option.data[i].title;
  239. item[option.request.remarkName] = option.data[i].remark;
  240. item[option.request.timeName] = option.data[i].time;
  241. data.push(item);
  242. }
  243. return data;
  244. },
  245. }
  246. exports(MOD_NAME, tt);
  247. })