You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

272 lines
34 KiB

7 months ago
  1. <!-- 佣金排行榜 -->
  2. <template>
  3. <s-layout title="佣金排行榜">
  4. <view class="commission-rank">
  5. <view class="header">
  6. <view class="rank" v-if="state.position">
  7. 您目前的排名
  8. <text class="num">{{ state.position }}</text>
  9. </view>
  10. <view class="rank" v-else>您目前暂无排名</view>
  11. </view>
  12. <view class="wrapper">
  13. <view class="nav acea-row row-around" style="justify-content: space-around; display: flex">
  14. <view
  15. class="item"
  16. :class="state.currentTab === index ? 'font-color' : ''"
  17. v-for="(item, index) in tabMaps"
  18. :key="index"
  19. @click="switchTap(index)"
  20. >
  21. {{ item }}
  22. </view>
  23. </view>
  24. <view class="list">
  25. <view class="item" v-for="(item, index) in state.pagination.list" :key="index">
  26. <view class="num" v-if="index <= 2">
  27. <image :src="'/static/images/medal0' + (index + 1) + '.png'" />
  28. </view>
  29. <view class="num" v-else>
  30. {{ index + 1 }}
  31. </view>
  32. <view class="pictrue">
  33. <image :src="item.avatar" />
  34. </view>
  35. <view class="text">{{ item.nickname }}</view>
  36. <view class="people">{{ fen2yuan(item.brokeragePrice) }}</view>
  37. </view>
  38. </view>
  39. <view class="noCommodity" v-if="state.pagination.list.length === 0">
  40. <emptyPage title="暂无排行~" />
  41. </view>
  42. </view>
  43. </view>
  44. <uni-load-more
  45. v-if="state.pagination.total > 0"
  46. :status="state.loadStatus"
  47. :content-text="{
  48. contentdown: '上拉加载更多',
  49. }"
  50. @tap="loadMore"
  51. />
  52. </s-layout>
  53. </template>
  54. <script setup>
  55. import sheep from '@/sheep';
  56. import { onLoad, onReachBottom } from '@dcloudio/uni-app';
  57. import { reactive } from 'vue';
  58. import BrokerageApi from '@/sheep/api/trade/brokerage';
  59. import { fen2yuan } from '@/sheep/hooks/useGoods';
  60. import _ from 'lodash-es';
  61. import { resetPagination } from '@/sheep/util';
  62. const tabMaps = ['周排行', '月排行'];
  63. const state = reactive({
  64. currentTab: 0,
  65. position: 0, // 排名
  66. pagination: {
  67. list: [],
  68. total: 0,
  69. pageNo: 1,
  70. pageSize: 10,
  71. },
  72. loadStatus: '',
  73. });
  74. async function switchTap(index) {
  75. state.currentTab = index;
  76. resetPagination(state.pagination);
  77. calculateTimes();
  78. getBrokerageRankList();
  79. }
  80. async function getBrokerageRankList() {
  81. const { code, data } = await BrokerageApi.getBrokerageUserChildSummaryPageByPrice({
  82. pageNo: state.pagination.pageNo,
  83. pageSize: state.pagination.pageSize,
  84. 'times[0]': state.times[0],
  85. 'times[1]': state.times[1],
  86. });
  87. if (code !== 0) {
  88. return;
  89. }
  90. state.pagination.list = _.concat(state.pagination.list, data.list);
  91. state.pagination.total = data.total;
  92. state.loadStatus = state.pagination.list.length < state.pagination.total ? 'more' : 'noMore';
  93. if (state.pagination.pageNo === 1) {
  94. getBrokerageRankNumber();
  95. }
  96. }
  97. async function getBrokerageRankNumber() {
  98. const { code, data } = await BrokerageApi.getRankByPrice({
  99. times: state.times,
  100. });
  101. if (code !== 0) {
  102. return;
  103. }
  104. state.position = data;
  105. }
  106. function formatDate(date) {
  107. return sheep.$helper.timeFormat(date, 'yyyy-mm-dd hh:MM:ss');
  108. }
  109. function calculateTimes() {
  110. let times;
  111. if (state.currentTab === 0) {
  112. times = getWeekTimes();
  113. } else {
  114. times = getMonthTimes();
  115. }
  116. state.times = [formatDate(times[0]), formatDate(times[1])];
  117. }
  118. onLoad(function () {
  119. calculateTimes();
  120. getBrokerageRankList();
  121. });
  122. // TODO 芋艿:此处可考虑抽离
  123. /**
  124. * 获得当前周的开始和结束时间
  125. */
  126. function getWeekTimes() {
  127. const today = new Date();
  128. const dayOfWeek = today.getDay();
  129. return [
  130. new Date(today.getFullYear(), today.getMonth(), today.getDate() - dayOfWeek, 0, 0, 0),
  131. new Date(
  132. today.getFullYear(),
  133. today.getMonth(),
  134. today.getDate() + (6 - dayOfWeek),
  135. 23,
  136. 59,
  137. 59,
  138. ),
  139. ];
  140. }
  141. /**
  142. * 获得当前月的开始和结束时间
  143. */
  144. function getMonthTimes() {
  145. const today = new Date();
  146. const year = today.getFullYear();
  147. const month = today.getMonth();
  148. const startDate = new Date(year, month, 1, 0, 0, 0);
  149. const nextMonth = new Date(year, month + 1, 1);
  150. const endDate = new Date(nextMonth.getTime() - 1);
  151. return [startDate, endDate];
  152. }
  153. // 加载更多
  154. function loadMore() {
  155. if (state.loadStatus === 'noMore') {
  156. return;
  157. }
  158. state.pagination.pageNo++;
  159. getBrokerageRankList();
  160. }
  161. // 上拉加载更多
  162. onReachBottom(() => loadMore());
  163. </script>
  164. <style lang="scss" scoped>
  165. .commission-rank {
  166. .header {
  167. background: url('data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wgARCAFYAu4DAREAAhEBAxEB/8QAHAABAAIDAQEBAAAAAAAAAAAAAAIDAQQFBwYI/8QAGwEBAAIDAQEAAAAAAAAAAAAAAAECAwQFBgf/2gAMAwEAAhADEAAAAPnvKfaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAImAYRgGDBiYGAYAAAMgyZETkyZBlOQSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAImAYRgwYMTGDBgxMDAMAAyAZMwykZMmYnJkyZTkEgAAAAAAAAAAAAAAAAAAAAAAAAAAACIMGEYMGJiJgwYmMEQjEsGYXY6TrXJGZqvau9hkzE5MmTMTIyZicmTJlOSQAAAAAAAAAAAAAAAAAAAAAAAAAABEwYRgwYmImCMxgiYmMQ7WhqfScnR73N0+xo6/R1cF+KsoZRiJryTp58nM28/E6G38/wBTc+a629qZ8uYSTklE5JGYmRkykTAAAAAAAAAAAAAAAAAAAAAAAAAAImDCMETExEjMRMIjLr6Gr9t5/lfYcLm9DUxhIIAJAIBIYtHz3U3PjO90/ju71Kct8xMiUTIySicmSxIAAAAAAAAAAAAAAAAAAAAAAAAAiYMIiYmIkSMxEjMfQ8rR9F8vxfpuPpZgAAAAAAAABrZ7fDeh6vn/AKfs6mfLOJkSiZGYnJckAAAAAAAAAAAAAAAAAAAAAAAACJgijBGYiRmIkJjo6mD1DyHA+r4ehkAAAAAAAAAAA1s9vOfU9n4P0nZxMzTKJkZNiLAAAAAAAAAAAAAAAAAAAAAAAACJFGDBGYiQmIojL7nznH9M8lw7sMAAAAAAAASIkiIAABxOls+S+29Hyd7ZnEyJRO1FgAAAAAAAAMmSIAAAAAAAAAAAAAImCKIkZiJGYhMWY6eseK879dwuemUEwSiEyAgkgEiCUEwSAgmASgkEQmacryr2Xofju905xMjdrcAAD9Ddz5x8nrdjzbnen9w7XguDg6H3+75/yrm+r870PTfZbfE9b6njvznwPpf3m7576za5H0mxzPLOb6z5rX6lVcnsvX8TycW353oej+l2Ob97ved1KZvjdTufBaPf04zgAAAAAACJgijBCYiQmITG3r4fZPCeZ7fN1wAAAAABm8ZkRiJVnEAAAAAAEvOPV9nzv1PbkdCmQAAe69nwXqvS8ng+P1O19jt8XzDneo9L6HmZTH5+4X0P13q+N+a1+n4NxPoP7C9X8awZB+aPO/T/AEro+W9I6HmYRb4HS9D9lt8TSrmvmmE/mfzn1LlU2gAAAAAAImDCIkZiBCYhMbmth9p8D5fq6OEAAAACexW3ZpHMqvkrWhFkTKaytW6lLKVhrzXq3xSQAAAAPP8A1HW8z9b3enTKAAN+2D9M+i+WfH6va8J4n0D9Meh+X8DDv+l9DzPg/F995/o+i997nz3tZdDwDh/ROjk1gBrVy9bLp+rdPyenTJ8Xqd31jp+PzMXzTRpn/OPn/pvBxb4AAAAAAiYMIiRmIkJiuYuxY/a/AeX7HO11ioAADN125jhtTpV2NXBmjivOtZRGUARmYTbGRfmxbubBtYsNOjeGKyoAABYq899T0/ifU+lAAA/U3ovlHNrsfI6nZ9U6fkvgNH0XpfQ8zwcO74NxPoX6B7vzn5rX6vzGt1fRN7zg3smtvX1/h9PvfMa3W+73OAl8fq9j6TNzPlsHVJ+pz8nwrj++4GHoAAAAAACJFGCMxAhMQmIxHsnhPM/TcjSAAAAu3McNyeZg3K9bJbWltKTisojMQMmDEziZhM12tVbJDNPQ2tXdpr0c7JikgAAAeD/UPcAAD2rreG9g6vj9CmXwTifQ/aux4X5DU7XpfQ8z5jz/AE3lXM9d7J1vFdvLo/l3zv1YD13p+P8AWun4/wDJHmfsHs3V8V91ucFL5nX6X1+1yOtl0a4tzce5+cuB9K4eLeAAAAAAiYIoiRmITEEVy9G8rxPRPLcfIAAAvGx0sPLjd1tTNsY8dtMdlayRKIzEDIBgxM4IzMJtXa9GTJDPPW2tGelFWpkAAAHg/wBQ9uAAPr9njfoDu/O/P+f6P5PX6/tHX8P8fqdr0voeZ830PR+O8n2vpvQ8v91vcD8uec+rAeu9Px/rXT8f+SPM/YPZur4r7rc4KXl/O9R9Lscv1XpeV8v53qKoyeM8j22hXOAAAAABAwiJGYgQmK5jt83T9r8B5iVQAAE81bOlTjavQs1630x20pOK5iMgAAAAGLTBMJtTfJrZcu7u62/h19bn5QAAPCfqHtwAAP1N6L5R8Rp92y1fRuh5j4HR9F6X0PM/N4Oh4bxfffebvA+33eD+XPOfVgPXun4/1np+P/JHmfsHtHW8T9xt8JLyHlex9N6XlPo8/N5OLc+u2uT+SfL/AF/l02gAAAABEwRREhMQmK5jEV9u+feW7PO1wAALM9ZdGONp7+xgx30xWVrJGaxkwDIAAAMGTBi01zaq19bLmu3MXUrqavNygADwr6h7cAAegbvnf0L3vnHj3J9p43yva/pr0Hy/gYd/0voeZ8H4vvvMef6n27reE+13eJ+XPOfVvuNvg+0dbxPUzaevXJ+U/NfXPs9ri+vdXxvHxbnmnO9P+lvQ/MPJeX6/0Hf873c2j+RvLfYtCucAAAAARIoiRmK5iBXMfZ8Dleq+L4OJADMMSnki3p04mn0NnBi2MeOcVmggYAASQASQAMgimK1V76uXNduYunj1NXQyjMAPCvqHtwABu2wfR5+b8trdahf6XPy6K5enk1eBh3+bTa+lz8vYtj+S1uxuWwfS5+aONi3ePj3B9Hm5utXLzqbPbzaPIxbn0Gfm69cvzWDpgAAAACJgiiMoIhMVzGIr7r858p0dTEAAExt9XFwdbpbGvi2MeKytcoAwkYAmcAAyBEDIRkAhNqb31cufe3tbY0sVWtcAeF/T/bAAAAAAAAAAAAAAAAAAAAARIoiRmIIrlXMfW8Pmes+J4GQAAbO/h5Ft9qRs48VlaZgMTMZYTiZwnEiQAAQMxGSURmIkhBKEzTfJqZs/b3ufRyrqSB4X9P8AbAAAAAAAAAAAAAAAAAAAAAQIoiQmITFcxXL2bwPmPoeXqIAATyw6Tl6O5t4cNtceYlMRmYTaMzzOjuUZ8tsUnFcSzEgDExmEJmK1U37HL0LcWOcRKIlDBC06+TLXs27dufp87MB4b9P9sAAAAAAAAAAAAAAAAAAABgwYIohMQITFUxu62D3f5x5VEAAsN3pa/BxdK/XxbGPFKGJa+TJwt7pkzit+bHs2xXxjsimQAACKabZNa2XW1skFoTbfwa3W09CUMFdrambP1N/TxzEMcjw76d7YAAAAAAAAAAAAAAAAAAAARIoiQmITFaK5fbef5Pp3juKAAJZKz6kcrn7m3iwW1rghNuHv9LjbnQ39fWnFehfW6M6uxXFbFMxAAAJhM0Wyals/JxblLJRly6uXL9txPOyrEkRTr5MtW1ftufp6GceH/TvaAAAAAAAAAAAAAAAAAAAACBhECExCYrmKpet+I879XxdEAAbW7h5Ft6WrXYx4pREJmFr8Te6XO2NruaHNqvk2NnH0Wrt0wXRTKAAAK1te+bSvn5evt246a98vI3d/7DkcCdKTrXJTe+nm2O5u87W5OYeH/TfaAAAAAAAAAAAAAAAAAAAACBFEZishMVzFc194+b+V3tbGAANzqYPntXp7mHXvpjFc2rtk427v8/Y3Ozpc6m+TZ2MfTjT3KYL4x5iBtb+Dv+q5ny3hu2QK5vq3zaN9jlYdy3FSi+Tlbm99byODZWs60nEV2tq5c23u4tjSw14L+H/TfaAAAAAAAAAAAAAAAAAAAARMEUQmIFcxXMX4c
  168. no-repeat;
  169. width: 100%;
  170. height: 344rpx;
  171. background-size: 100% 100%;
  172. .rank {
  173. font-size: 33rpx;
  174. color: #fff;
  175. position: absolute;
  176. top: 160rpx;
  177. left: 48rpx;
  178. .num {
  179. font-size: 51rpx;
  180. font-weight: bold;
  181. margin: 0 10rpx;
  182. }
  183. }
  184. }
  185. .wrapper {
  186. width: 710rpx;
  187. background-color: #fff;
  188. border-radius: 14rpx;
  189. margin: -76rpx auto 0 auto;
  190. .nav {
  191. height: 99rpx;
  192. border-bottom: 2.5rpx solid #f3f3f3;
  193. font-size: 30rpx;
  194. font-weight: bold;
  195. color: #999;
  196. line-height: 99rpx;
  197. .item.font-color {
  198. border-bottom: 4rpx solid #e93323;
  199. margin-top: -2rpx;
  200. color: #e93323;
  201. }
  202. }
  203. .list {
  204. padding: 0 20rpx;
  205. .item {
  206. display: flex;
  207. justify-content: space-around;
  208. align-items: center;
  209. border-bottom: 1px solid #f3f3f3;
  210. height: 101rpx;
  211. font-size: 28rpx;
  212. .num {
  213. color: #666;
  214. flex: 0.08;
  215. display: flex;
  216. justify-content: flex-start;
  217. align-items: center;
  218. image {
  219. width: 50rpx;
  220. height: 50rpx;
  221. }
  222. }
  223. .pictrue {
  224. flex: 0.15;
  225. image {
  226. width: 68rpx;
  227. height: 68rpx;
  228. display: block;
  229. border-radius: 50%;
  230. margin: 0 auto;
  231. }
  232. }
  233. .text {
  234. color: #333;
  235. flex: 0.5;
  236. }
  237. .people {
  238. text-align: right;
  239. flex: 0.27;
  240. }
  241. }
  242. }
  243. }
  244. }
  245. </style>