index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <template>
  2. <view class="operateData">
  3. <view class="operate-box">
  4. <view class="operate-item border">
  5. <view class="item-icon">
  6. <tui-icon name="seen" :size="16" color="#FFFFFF"></tui-icon>
  7. </view>
  8. <view class="item-text">
  9. <text>店铺访问次数</text>
  10. <text>{{ operateData.total }}</text>
  11. </view>
  12. </view>
  13. <view class="operate-item">
  14. <view class="item-icon">
  15. <tui-icon name="time" :size="16" color="#FFFFFF"></tui-icon>
  16. </view>
  17. <view class="item-text">
  18. <text>待处理订单</text>
  19. <text>{{ operateData.stayOrders }}</text>
  20. </view>
  21. </view>
  22. <view class="operate-item border">
  23. <view class="item-icon">
  24. <tui-icon name="wealth" :size="16" color="#FFFFFF"></tui-icon>
  25. </view>
  26. <view class="item-text">
  27. <text>成交金额</text>
  28. <text>{{ operateData.money || 0 }}</text>
  29. </view>
  30. </view>
  31. <view class="operate-item">
  32. <view class="item-icon">
  33. <tui-icon name="order" :size="16" color="#FFFFFF"></tui-icon>
  34. </view>
  35. <view class="item-text">
  36. <text>售后订单</text>
  37. <text>{{ operateData.stayAfters }}</text>
  38. </view>
  39. </view>
  40. </view>
  41. <view class="list-container">
  42. <view class="list-title">用户访问趋势</view>
  43. <view class="list-box">
  44. <tui-charts-line
  45. ref="tui_line_1"
  46. tooltip
  47. :width="588"
  48. :xAxis="options1.xAxis"
  49. :dataset="options1.dataset"
  50. :max="options1.max"
  51. :splitNumber="options1.splitNumber"
  52. @click="dotClick"
  53. ></tui-charts-line>
  54. </view>
  55. </view>
  56. <view class="list-container">
  57. <view class="list-title">订单转换漏斗</view>
  58. <view class="list-box">
  59. <tui-charts-line
  60. ref="tui_line_2"
  61. tooltip
  62. :width="588"
  63. :xAxis="options2.xAxis"
  64. :dataset="options2.dataset"
  65. :max="options2.max"
  66. :splitNumber="options2.splitNumber"
  67. @click="dotClick"
  68. ></tui-charts-line>
  69. </view>
  70. </view>
  71. <view class="custom-container">
  72. <view class="custom-title">客户列表</view>
  73. <view class="custom-list">
  74. <view class="item" v-for="item in buyerList" :key="item.buyerUserId">
  75. <view class="item-top">
  76. <text>{{ item.name }}</text>
  77. <text>{{ item.phone }}</text>
  78. </view>
  79. <view class="item-bottom">
  80. <view class="text-box">
  81. <text>消费次数</text>
  82. <text>{{ item.frequency || 0 }}</text>
  83. </view>
  84. <view class="text-box">
  85. <text>累计消费金额</text>
  86. <text>{{ item.total || 0 }}元</text>
  87. </view>
  88. <view class="text-box">
  89. <text>上次消费时间</text>
  90. <text>{{ item.lastTime }}</text>
  91. </view>
  92. <view class="text-box">
  93. <text>成为客户时间</text>
  94. <text>{{ item.time }}</text>
  95. </view>
  96. <view class="text-box">
  97. <text>客户等级</text>
  98. <text>{{ item.userGrade }}</text>
  99. </view>
  100. </view>
  101. </view>
  102. </view>
  103. </view>
  104. </view>
  105. </template>
  106. <script>
  107. import { getOperateData, getCustomerList } from "@/config/index";
  108. export default {
  109. created() {
  110. // 获取客户列表
  111. this.getBuyerAll();
  112. },
  113. async onReady() {
  114. this.getBusinessData();
  115. },
  116. data() {
  117. return {
  118. // 总体数据
  119. operateData: {},
  120. options1: {
  121. xAxis: ["一月", "二月", "三月", "四月", "五月", "六月"],
  122. dataset: [
  123. {
  124. name: "访问量",
  125. color: "#EA5C1E",
  126. source: [1, 2, 3, 4, 5, 6],
  127. },
  128. ],
  129. max: 10,
  130. splitNumber: 2,
  131. },
  132. options2: {
  133. xAxis: ["一月", "二月", "三月", "四月", "五月", "六月"],
  134. dataset: [
  135. {
  136. name: "转化率(%)",
  137. color: "#EA5C1E",
  138. source: [],
  139. },
  140. ],
  141. max: 100,
  142. splitNumber: 25,
  143. },
  144. // 获取客户列表的参数
  145. queryData: {
  146. dates: [],
  147. labelId: null,
  148. lastTimes: [],
  149. page: 1,
  150. pageSize: 20,
  151. phone: "",
  152. },
  153. // 客户列表
  154. buyerList: [],
  155. };
  156. },
  157. methods: {
  158. // 获取经营数据
  159. async getBusinessData() {
  160. let res = await getOperateData({ condition: 3 });
  161. this.operateData = res.data;
  162. this.handleData();
  163. this.orderData();
  164. },
  165. // 获取客户数据
  166. async getBuyerAll() {
  167. let { data } = await getCustomerList(this.queryData);
  168. this.buyerList = [...this.buyerList, ...data.list];
  169. },
  170. // 对数据进行处理
  171. handleData() {
  172. let { visitWeek } = this.operateData;
  173. let list = visitWeek.time.reduce((prev, item, index) => {
  174. if (index == 0) return prev;
  175. let arr = item.split("-");
  176. prev.push(`${arr[1]}.${arr[2]}`);
  177. return prev;
  178. }, []);
  179. this.options1.xAxis = list;
  180. // 删除第一个
  181. visitWeek.total.shift();
  182. this.options1.dataset[0].source = visitWeek.total;
  183. let max = Math.max(...visitWeek.total);
  184. // 设置最大值和最小值
  185. this.options1.max = max + 4;
  186. this.options1.splitNumber = Math.ceil(max / 4) + 1;
  187. this.$nextTick(() => {
  188. this.$refs.tui_line_1.draw(this.options1.dataset);
  189. });
  190. },
  191. // 订单转化率画图
  192. orderData() {
  193. let { conversion } = this.operateData;
  194. this.options2.xAxis = conversion.names;
  195. this.options2.dataset[0].source = conversion.rates;
  196. this.$nextTick(() => {
  197. this.$refs.tui_line_2.draw(this.options2.dataset);
  198. });
  199. },
  200. dotClick(e) {
  201. console.log(e);
  202. },
  203. },
  204. // 触底加载
  205. onReachBottom() {
  206. this.queryData.page++;
  207. this.getBuyerAll();
  208. },
  209. };
  210. </script>
  211. <style lang="scss" scoped>
  212. @import "./index.scss";
  213. </style>