detail.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <template>
  2. <div>
  3. <el-row :gutter="16">
  4. <el-col :span="8">
  5. <div class="left_content dflex_c">
  6. <div class="detail_left center_just">
  7. <el-image class="headimg" :src="memberData.member_headimg || '/static/img/default.jpg'"
  8. :preview-src-list="memberData.imgs" fit="contain"></el-image>
  9. <div>{{ memberData.member_name }}</div>
  10. </div>
  11. <div class="detail_right">
  12. <div class="dflex margin_b_10">
  13. <div class="detail_title right_just">性别:</div>
  14. <div>{{ memberData.member_gender }}</div>
  15. </div>
  16. <div class="dflex margin_b_10">
  17. <div class="detail_title right_just">城市:</div>
  18. <div>{{ memberData.member_city }}</div>
  19. </div>
  20. <div class="dflex margin_b_10">
  21. <div class="detail_title right_just">登录ip:</div>
  22. <div>{{ memberData.member_login_current_ip }}</div>
  23. </div>
  24. <div class="dflex margin_b_10">
  25. <div class="detail_title right_just">注册时间:</div>
  26. <div>{{ memberData.create_time }}</div>
  27. </div>
  28. <div class="dflex">
  29. <div class="detail_title right_just">上次登录时间:</div>
  30. <div>{{ memberData.last_modify_time }}</div>
  31. </div>
  32. </div>
  33. </div>
  34. </el-col>
  35. <el-col :span="16">
  36. <div class="right_content dflex">
  37. <div class="dflex_vertical_c order">
  38. <div class="circle_txt dflex_c margin_r_20">券</div>
  39. <div>
  40. <div class="order_title">优惠券</div>
  41. <v-countup class="order_data" start-value="0" :end-value="memberData.member_coupon_cnt">
  42. </v-countup>
  43. </div>
  44. </div>
  45. <div class="dflex_vertical_c order">
  46. <div class="circle_txt dflex_c margin_r_20">金</div>
  47. <div>
  48. <div class="order_title">累计消费</div>
  49. <v-countup class="order_data" start-value="0" :end-value="memberData.member_monetary"
  50. decimals="2"></v-countup>
  51. </div>
  52. </div>
  53. <div class="dflex_vertical_c order">
  54. <div class="circle_txt dflex_c margin_r_20">登</div>
  55. <div>
  56. <div class="order_title">登录次数</div>
  57. <v-countup class="order_data" start-value="0" :end-value="memberData.member_login_cnt">
  58. </v-countup>
  59. </div>
  60. </div>
  61. <div class="dflex_vertical_c order">
  62. <div class="circle_txt dflex_c margin_r_20">充</div>
  63. <div>
  64. <div class="order_title">充值金额</div>
  65. <v-countup class="order_data" start-value="0" :end-value="memberData.member_amount">
  66. </v-countup>
  67. </div>
  68. </div>
  69. </div>
  70. </el-col>
  71. </el-row>
  72. <div class="detail pos_r">
  73. <el-tabs v-model="tab" @tab-click="cutTabs">
  74. <el-tab-pane :label="`订单 ${totalObj.order_cnt || 0}`" name="order">
  75. <order v-if="tab == 'order'"></order>
  76. </el-tab-pane>
  77. <el-tab-pane :label="`足迹 ${totalObj.footprint_cnt || 0}`" name="footprint">
  78. <footprint v-if="tab == 'footprint'"></footprint>
  79. </el-tab-pane>
  80. <el-tab-pane :label="`收藏 ${totalObj.collect_cnt || 0}`" name="collect">
  81. <collect v-if="tab == 'collect'"></collect>
  82. </el-tab-pane>
  83. <el-tab-pane :label="`地址 ${totalObj.address_cnt || 0}`" name="consigneeAddress">
  84. <consigneeAddress v-if="tab == 'consigneeAddress'"></consigneeAddress>
  85. </el-tab-pane>
  86. </el-tabs>
  87. <div class="btn pos_a">
  88. <el-button round icon="el-icon-back" @click="returnPage">返回列表</el-button>
  89. </div>
  90. </div>
  91. </div>
  92. </template>
  93. <script>
  94. import bus from '@/common/bus';
  95. import vCountup from 'vue-countupjs';
  96. import order from './order';
  97. import footprint from './footprint';
  98. import collect from './collect';
  99. import consigneeAddress from './consignee_address';
  100. const __name = 'usemall-member';
  101. export default {
  102. components: {
  103. vCountup,
  104. order,
  105. footprint,
  106. collect,
  107. consigneeAddress
  108. },
  109. data() {
  110. return {
  111. dataId: '',
  112. tab: '',
  113. req: {
  114. page: 1,
  115. rows: 10,
  116. orderby: 'sort asc'
  117. },
  118. memberData: {
  119. imgs: []
  120. },
  121. totalObj: {
  122. address_cnt: 0,
  123. collect_cnt: 0,
  124. footprint_cnt: 0,
  125. order_cnt: 0
  126. }
  127. };
  128. },
  129. methods: {
  130. cutTabs(res) {
  131. uni.setStorage({
  132. key: 'member_detail_tab',
  133. data: res.name
  134. });
  135. },
  136. async loadData() {
  137. await this.$db[__name].tofirst(this.dataId).then(res => {
  138. if (res.code == 200) {
  139. res.datas.imgs = [res.datas.member_headimg ||
  140. '/static/img/default.jpg'
  141. ];
  142. switch (res.datas.member_gender) {
  143. case 1:
  144. res.datas.member_gender = '男';
  145. break;
  146. case 2:
  147. res.datas.member_gender = '女';
  148. break;
  149. default:
  150. res.datas.member_gender = '未知';
  151. break;
  152. }
  153. if (res.datas.create_time) {
  154. res.datas.create_time = new Date(res.datas.create_time).format();
  155. }
  156. if (res.datas.last_modify_time) {
  157. res.datas.last_modify_time = new Date(res.datas.last_modify_time).format();
  158. }
  159. this.memberData = res.datas;
  160. }
  161. });
  162. let start = new Date().getTime();
  163. const totalDatas = await Promise.all([
  164. this.$db['usemall-order']
  165. .collection()
  166. .where({
  167. is_delete: 0,
  168. create_uid: this.dataId
  169. })
  170. .count(),
  171. this.$db['usemall-goods-history']
  172. .collection()
  173. .where({
  174. create_uid: this.dataId
  175. })
  176. .count(),
  177. this.$db['usemall-member-collect']
  178. .collection()
  179. .where({
  180. create_uid: this.dataId
  181. })
  182. .count(),
  183. this.$db['usemall-member-address']
  184. .collection()
  185. .where({
  186. create_uid: this.dataId
  187. })
  188. .count()
  189. ]);
  190. this.totalObj.order_cnt = totalDatas[0].result.total;
  191. this.totalObj.footprint_cnt = totalDatas[1].result.total;
  192. this.totalObj.collect_cnt = totalDatas[2].result.total;
  193. this.totalObj.address_cnt = totalDatas[3].result.total;
  194. },
  195. returnPage() {
  196. bus.$emit('tab-close');
  197. this.$router.push('/pages/member/list/member_list');
  198. }
  199. },
  200. created() {
  201. this.dataId = this.$route.query.id || '';
  202. this.loadData();
  203. },
  204. mounted() {
  205. this.tab = uni.getStorageSync('member_detail_tab') || 'order';
  206. }
  207. };
  208. </script>
  209. <style>
  210. .left_content,
  211. .right_content {
  212. background-color: #fff;
  213. height: 200px;
  214. border-radius: 10px;
  215. }
  216. .detail_left {
  217. margin: 0 80px 0 0;
  218. }
  219. .detail_title {
  220. color: #8a8a8a;
  221. width: 8.125rem;
  222. }
  223. .order {
  224. margin-left: 80px;
  225. }
  226. .circle_txt {
  227. font-size: 24px;
  228. color: #fff;
  229. width: 56px;
  230. height: 56px;
  231. border-radius: 50%;
  232. background-color: #ff6b6b;
  233. }
  234. .order_title {
  235. font-size: 14px;
  236. }
  237. .order_data {
  238. font-size: 28px;
  239. }
  240. .detail .btn {
  241. transform: translate(-0, -50%);
  242. top: 50%;
  243. right: 0;
  244. }
  245. </style>