index.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. ;
  2. layui.config({
  3. base: "../../../admin/js/layuiPlugins/"
  4. }).use(['form', 'layer', 'jquery', 'laypage', 'element', 'table', 'laydate', 'laytpl', 'cascade'], function() {
  5. var form = layui.form,
  6. layer = layui.layer,
  7. laytpl = layui.laytpl,
  8. laypage = layui.laypage,
  9. $ = layui.jquery,
  10. table = layui.table,
  11. element = layui.element,
  12. laydate = layui.laydate,
  13. cascade = layui.cascade;
  14. //自定义验证
  15. form.verify({
  16. namelength: [
  17. /^.{0,18}$/,
  18. "长度限制在0-18个字符噢"
  19. ]
  20. });
  21. //监听一级Tab切换
  22. element.on('tab(productTabBrief)', function(obj) {
  23. switch (obj.index) {
  24. case 0:
  25. tableVm.reload();
  26. break;
  27. }
  28. });
  29. var vm = function(obj) {
  30. var _this = this;
  31. _this.dataId = obj.dataId || 'dataListId'; //数据表ID
  32. _this.elem = obj.elem || 'dataListBox'; //数据表容器
  33. _this.toolbar = obj.toolbar || '';
  34. _this.url = obj.url || ''; //数据表接口URL
  35. _this.page = obj.page; //分页
  36. _this.limit = obj.limit;
  37. _this.cols = obj.cols || []; //表头
  38. _this.done = obj.done || ''; //表头
  39. _this.formObj = {}; //当前表单对象
  40. _this.searchParameter = {
  41. timeType: '1'
  42. }; //搜索参数
  43. _this.config = {};
  44. _this.where = obj.where;
  45. _this.config.dateTime = obj.dateTime;
  46. _this.dateTime = {
  47. year: 365 * 1 * 24 * 3600 * 1000,
  48. month: 30 * 1 * 24 * 3600 * 1000,
  49. day: 24 * 3600 * 1000,
  50. }
  51. _this.main();
  52. };
  53. //入口函数
  54. vm.prototype.main = function() {
  55. var _this = this;
  56. var ins1 = laydate.render({
  57. elem: '#test6',
  58. range: true,
  59. btns: [],
  60. change: function(value, date, endDate) {
  61. let arr = value.split(" ");
  62. if (((new Date(arr[2]) - new Date(arr[0])) / (24 * 60 * 60 * 1000) + 1) > 30) {
  63. ins1.hint("最大只能选择30天");
  64. return;
  65. }
  66. if (date.month < 10) {
  67. date.month = '0' + date.month
  68. }
  69. if (date.date < 10) {
  70. date.date = '0' + date.date
  71. }
  72. if (endDate.month < 10) {
  73. endDate.month = '0' + endDate.month
  74. }
  75. if (endDate.date < 10) {
  76. endDate.date = '0' + endDate.date
  77. }
  78. _this.searchParameter.timeType = '';
  79. _this.searchParameter.beginTime = date.year + '-' + date.month + '-' + date.date;
  80. _this.searchParameter.endTime = endDate.year + '-' + endDate.month + '-' + endDate.date;
  81. _this.barChartShow();
  82. _this.pieChartShow();
  83. }
  84. });
  85. _this.initializationData();
  86. _this.barChartShow();
  87. _this.pieChartShow();
  88. };
  89. //初始化表格
  90. vm.prototype.initializationData = function() {
  91. var _this = this;
  92. _this.dataListObj = table.render({
  93. id: _this.dataId,
  94. elem: _this.elem,
  95. toolbar: _this.toolbar,
  96. defaultToolbar: ['filter'],
  97. url: _this.url,
  98. page: _this.page,
  99. even: true,
  100. cols: _this.cols,
  101. done: _this.done,
  102. where: $.extend(_this.where, _this.searchParameter),
  103. limit: _this.limit,
  104. });
  105. };
  106. //重新加载数据表
  107. vm.prototype.reload = function() {
  108. var _this = this;
  109. _this.dataListObj = table.reload(_this.dataId, { //执行重载数据表
  110. where: _this.searchParameter,
  111. page: {
  112. curr: 1
  113. }
  114. });
  115. };
  116. //初始化事件监听
  117. vm.prototype.eventMonitor = function(id) {
  118. var _this = this;
  119. //监听搜索表单事件
  120. if (typeof(_this.formEvent) == "object") {
  121. for (let i = 0; i < _this.formEvent.length; i++) {
  122. form.on('submit(' + _this.formEvent[i] + ')', function(obj) {
  123. _this.formInfoSearch(_this.formEvent[i], obj);
  124. return false;
  125. });
  126. }
  127. }
  128. return _this;
  129. };
  130. //搜索处理函数
  131. vm.prototype.formInfoSearch = function(id, obj) {
  132. var _this = this;
  133. $(obj.elem).removeClass('layui-btn-primary').siblings().addClass('layui-btn-primary');
  134. if (obj.elem.id == 4) {
  135. return false
  136. }
  137. obj.field.timeType = obj.elem.id || 1;
  138. _this.searchParameter = obj.field;
  139. _this.barChartShow();
  140. _this.pieChartShow();
  141. };
  142. //渲染时间选择器
  143. vm.prototype.showTimeSelect = function(obj) {
  144. laydate.render({
  145. elem: obj.elem,
  146. type: "month",
  147. value: ((new Date().getMonth() + 1) < 10) ? new Date().getFullYear() + '-0' + (new Date().getMonth() + 1) : new Date()
  148. .getFullYear() + '-' + (new Date().getMonth() + 1)
  149. });
  150. };
  151. //jquer事件绑定
  152. vm.prototype.$event = function() {
  153. var _this = this;
  154. $(_this.dataExportBtn).on("click", function(e) {
  155. _this.dataExport();
  156. });
  157. };
  158. //数据导出处理函数
  159. vm.prototype.dataExport = function() {
  160. var _this = this;
  161. _this.downloadParameter = '?';
  162. for (var i in _this.dataListObj.config.where) {
  163. _this.downloadParameter += "&" + i + '=' + _this.dataListObj.config.where[i];
  164. }
  165. _this.startDownload();
  166. };
  167. //启动下载
  168. vm.prototype.startDownload = function() {
  169. var _this = this;
  170. window.open(window.hywa.config.href + window.hywa.config.port[_this.dataDownload] + _this.downloadParameter);
  171. };
  172. vm.prototype.barChartShow = function() {
  173. var _this = this;
  174. $.ajax({
  175. url: "viewsVolumeUrl",
  176. data: {
  177. timeType: _this.searchParameter.timeType,
  178. beginTime: _this.searchParameter.beginTime,
  179. endTime: _this.searchParameter.endTime,
  180. },
  181. success: function(res) {
  182. console.log(res)
  183. if (res.code == 0) {
  184. let seriesData1 = [],
  185. seriesData2 = [],
  186. xAxisData = []
  187. for (let i = 0; i < res.data.length; i++) {
  188. xAxisData.push(res.data[i].time);
  189. seriesData1.push(res.data[i].views);
  190. seriesData2.push(res.data[i].orders);
  191. }
  192. _this.barChart = echarts.init(document.getElementById('viewsChart'));
  193. var option = {
  194. tooltip: {
  195. trigger: 'axis'
  196. },
  197. color: ['#5FB878', '#1E9FFF'],
  198. legend: {
  199. data: ['浏览量', '下单量']
  200. },
  201. grid: {
  202. left: '1%',
  203. right: '3%',
  204. bottom: '8%',
  205. top: '15%',
  206. containLabel: true
  207. },
  208. calculable: true,
  209. xAxis: [{
  210. type: 'category',
  211. data: xAxisData,
  212. axisLabel: {
  213. interval: 0, //横轴信息全部显示
  214. rotate: 30, //-30度角倾斜显示
  215. }
  216. }],
  217. yAxis: [{
  218. type: 'value'
  219. }],
  220. dataZoom: [{
  221. type: 'slider',
  222. filterMode: 'none',
  223. height: 20,
  224. bottom: 5,
  225. borderColor: 'transparent',
  226. backgroundColor: '#e2e2e2',
  227. handleSize: 20,
  228. handleStyle: {
  229. shadowBlur: 6,
  230. shadowOffsetX: 1,
  231. shadowOffsetY: 2,
  232. shadowColor: '#aaa'
  233. }
  234. }, {
  235. type: 'inside',
  236. filterMode: 'none'
  237. }],
  238. series: [{
  239. name: '浏览量',
  240. type: 'bar',
  241. barMaxWidth: 40,
  242. barGap: 0,
  243. data: seriesData1
  244. },
  245. {
  246. name: '下单量',
  247. type: 'bar',
  248. barMaxWidth: 40,
  249. data: seriesData2
  250. }
  251. ]
  252. };
  253. _this.barChart.setOption(option);
  254. window.addEventListener("resize", () => {
  255. _this.barChart.resize();
  256. });
  257. }
  258. }
  259. });
  260. };
  261. vm.prototype.pieChartShow = function() {
  262. var _this = this;
  263. $.ajax({
  264. url: "visitorTableUrl",
  265. data: {
  266. timeType: _this.searchParameter.timeType,
  267. beginTime: _this.searchParameter.beginTime,
  268. endTime: _this.searchParameter.endTime,
  269. },
  270. success: function(res) {
  271. let tableData = [{
  272. customerType: '新客户',
  273. customerVisits: res.data[0].newCustomerVisits,
  274. customerPercent: res.data[0].newCustomerPercent
  275. }, {
  276. customerType: '老客户',
  277. customerVisits: res.data[0].oldCustomerVisits,
  278. customerPercent: res.data[0].oldCustomerPercent
  279. }];
  280. table.reload(tableId, {
  281. data: tableData,
  282. });
  283. if (res.code == 0) {
  284. _this.pieChart = echarts.init(document.getElementById('visitorChart'));
  285. var option = {
  286. backgroundColor: '#ffffff',
  287. tooltip: {
  288. trigger: 'item',
  289. formatter: "{a} <br/>{b} : {c} ({d}%)"
  290. },
  291. color: ['#009688', '#5FB878', '#1E9FFF', '#01AAED', '#2F4056', '#393D49'],
  292. series: [{
  293. name: '客户类型',
  294. type: 'pie',
  295. radius: '55%',
  296. center: ["50%", "50%"],
  297. radius: ["45%", "80%"],
  298. data: [{
  299. value: res.data[0].newCustomerVisits,
  300. name: '新客户'
  301. },
  302. {
  303. value: res.data[0].oldCustomerVisits,
  304. name: '老客户'
  305. }
  306. ],
  307. itemStyle: {
  308. emphasis: {
  309. shadowBlur: 10,
  310. shadowOffsetX: 0,
  311. shadowColor: 'rgba(0, 0, 0, 0.5)'
  312. }
  313. },
  314. itemStyle: {
  315. normal: {
  316. label: {
  317. show: true,
  318. formatter: '{b} : {c} ({d}%)'
  319. },
  320. borderColor: '#ffffff',
  321. borderWidth: 10,
  322. },
  323. labelLine: {
  324. show: true
  325. }
  326. }
  327. }]
  328. };
  329. _this.pieChart.setOption(option);
  330. window.addEventListener("resize", () => {
  331. _this.pieChart.resize();
  332. });
  333. }
  334. }
  335. });
  336. };
  337. //模板引擎
  338. function typeTpl(obj) {
  339. laytpl(selectTpl.innerHTML).render(obj, function(html) {
  340. $(obj.elem).html(html);
  341. form.render();
  342. });
  343. }
  344. // 表格列表
  345. let tableId = "tableData";
  346. var tableVm = new vm({
  347. dataId: 'tableData',
  348. elem: '#tableData',
  349. data: [],
  350. page: false,
  351. cols: [
  352. [{
  353. field: 'customerType',
  354. title: '客户类型'
  355. }, {
  356. field: 'customerVisits',
  357. title: '访问数',
  358. align: 'center'
  359. }, {
  360. field: 'customerPercent',
  361. title: '占比',
  362. align: 'center'
  363. }]
  364. ]
  365. });
  366. //初始化事件监听
  367. tableVm.formEvent = ['tableSearch'];
  368. tableVm.formEvent = ['day', 'month', 'week', 'range'];
  369. tableVm.eventMonitor();
  370. tableVm.$event();
  371. });