member_list.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <template>
  2. <div>
  3. <use-table ref="tbl"></use-table>
  4. <div class="container padding_b_0">
  5. <div class="dflex_wrap">
  6. <div class="dflex_vertical_c margin_r_40 margin_b_20">
  7. <div class="search_name">会员名称:</div>
  8. <el-input v-model="req.member_name" placeholder="请输入" class="search_input" @input="search"
  9. clearable></el-input>
  10. </div>
  11. <div class="dflex_vertical_c margin_r_40 margin_b_20" v-if="advancedSearch">
  12. <div class="search_name">性别:</div>
  13. <el-select v-model="req.member_gender" class="search_input" @change="search">
  14. <el-option v-for="(item, idx) in genderOptions" :key="idx" :label="item.label"
  15. :value="item.value"></el-option>
  16. </el-select>
  17. </div>
  18. <div class="dflex_vertical_c margin_r_40 margin_b_20" v-if="advancedSearch">
  19. <div class="search_name">注册时间:</div>
  20. <el-date-picker v-model="searchTime" type="daterange" align="right" unlink-panels
  21. range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd"
  22. :picker-options="pickerOptions" class="search_start_end_time" @change="search"></el-date-picker>
  23. </div>
  24. <el-button size="mini" class="search_btn margin_b_20 margin_r_40" @click="loadData">搜索</el-button>
  25. <div class="search_advanced margin_b_20" @click="advancedSearch = !advancedSearch"
  26. v-if="!advancedSearch">高级筛选</div>
  27. <div class="search_common margin_b_20" @click="advancedSearch = !advancedSearch" v-if="advancedSearch">
  28. 常用筛选</div>
  29. </div>
  30. </div>
  31. <div class="container use-table">
  32. <el-table :height="tblHeight" :data="tableDatas" highlight-current-row>
  33. <el-table-column label="会员" align="center">
  34. <template slot-scope="scope">
  35. <div class="dflex_vertical_c">
  36. <el-image class="headimg_small"
  37. :src="scope.row.member_headimg || '/static/img/default.jpg'"
  38. :preview-src-list="scope.row.imgs" fit="cover"></el-image>
  39. <div class="margin_l_5">{{ scope.row.member_name || '用云会员' }}</div>
  40. </div>
  41. </template>
  42. </el-table-column>
  43. <el-table-column property="is_plus" label="是否会员" align="center"></el-table-column>
  44. <el-table-column property="member_gender" label="性别" align="center"></el-table-column>
  45. <el-table-column property="member_login_cnt" label="登录次数" width="100" align="center"></el-table-column>
  46. <el-table-column property="member_mobile" label="手机号" align="center"></el-table-column>
  47. <el-table-column property="member_city" label="城市" align="center"></el-table-column>
  48. <el-table-column property="member_monetary" label="累计消费" align="center"></el-table-column>
  49. <el-table-column property="create_time" label="注册时间" align="center"></el-table-column>
  50. <el-table-column label="操作" align="center" fixed="right">
  51. <template slot-scope="scope">
  52. <el-tooltip content="详情" placement="top" :hide-after="1000" :enterable="false" effect="light">
  53. <el-button type="text" icon="iconfont iconxiangqing1" class="bbb"
  54. @click="toDetail(scope.row._id)"></el-button>
  55. </el-tooltip>
  56. </template>
  57. </el-table-column>
  58. </el-table>
  59. <el-pagination :current-page="req.page" :page-sizes="[10, 20, 30, 50, 100]" :page-size="req.rows"
  60. layout="total, sizes, prev, pager, next, jumper" :total="tableTotal" @size-change="sizeChange"
  61. @current-change="currentChange"></el-pagination>
  62. </div>
  63. </div>
  64. </template>
  65. <script>
  66. const __name = 'usemall-member';
  67. export default {
  68. data() {
  69. return {
  70. advancedSearch: false,
  71. searchTime: [],
  72. genderOptions: [{
  73. value: '',
  74. label: '全部'
  75. },
  76. {
  77. value: '男',
  78. label: '男'
  79. },
  80. {
  81. value: '女',
  82. label: '女'
  83. }
  84. ],
  85. req: {
  86. page: 1,
  87. rows: 10,
  88. orderby: 'sort asc',
  89. member_name: '',
  90. member_gender: '',
  91. begin_time: '',
  92. end_time: ''
  93. },
  94. tblHeight: 0,
  95. tableDatas: [],
  96. tableTotal: 0,
  97. pickerOptions: {
  98. disabledDate(time) {
  99. return time.getTime() > Date.now();
  100. },
  101. shortcuts: [{
  102. text: '最近一周',
  103. onClick(picker) {
  104. const end = new Date();
  105. const start = new Date();
  106. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  107. picker.$emit('pick', [start, end]);
  108. }
  109. },
  110. {
  111. text: '最近一个月',
  112. onClick(picker) {
  113. const end = new Date();
  114. const start = new Date();
  115. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  116. picker.$emit('pick', [start, end]);
  117. }
  118. },
  119. {
  120. text: '最近三个月',
  121. onClick(picker) {
  122. const end = new Date();
  123. const start = new Date();
  124. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  125. picker.$emit('pick', [start, end]);
  126. }
  127. }
  128. ]
  129. }
  130. };
  131. },
  132. methods: {
  133. async loadData() {
  134. this.req.begin_time = '';
  135. this.req.end_time = '';
  136. if (this.searchTime && this.searchTime.length > 0) {
  137. this.req.begin_time = this.searchTime[0].getTime();
  138. this.req.end_time = this.searchTime[1].getTime();
  139. }
  140. await this.$db[__name]
  141. .whereif(this.req.member_name, {
  142. member_name: new RegExp(this.req.member_name)
  143. })
  144. .whereif(this.req.member_gender || this.req.member_gender === 0, {
  145. member_gender: this.req.member_gender
  146. })
  147. .whereif(this.searchTime && this.searchTime.length > 0, {
  148. create_time: this.$db.$cmd.gte(this.req.begin_time).and(this.$db.$cmd.lte(this.req
  149. .end_time))
  150. })
  151. .totable(this.req)
  152. .then(res => {
  153. if (res.code == 200) {
  154. res.datas.rows.forEach((row, idx) => {
  155. row.imgs = [row.member_headimg ||
  156. '/static/img/default.jpg'
  157. ];
  158. row.create_time = new Date(row.create_time).format();
  159. });
  160. this.tableDatas = res.datas.rows;
  161. this.tableTotal = res.datas.total;
  162. }
  163. });
  164. },
  165. toDetail(id) {
  166. uni.navigateTo({
  167. url: `/pages/member/list/detail?id=${id}&tab=会员详情`,
  168. events: {
  169. refreshData: () => {
  170. this.loadData();
  171. }
  172. }
  173. });
  174. },
  175. sizeChange(size) {
  176. this.req.rows = size;
  177. this.loadData();
  178. },
  179. currentChange(current) {
  180. this.req.page = current;
  181. this.loadData();
  182. }
  183. },
  184. created() {
  185. this.loadData();
  186. },
  187. updated() {
  188. if (!this.tblHeight) {
  189. this.tblHeight = this.$refs.tbl.tblHeight;
  190. }
  191. }
  192. };
  193. </script>
  194. <style></style>