index.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <?php
  2. use yii\grid\GridView;
  3. use common\helpers\Html;
  4. use common\helpers\ImageHelper;
  5. use common\helpers\MemberHelper;
  6. use kartik\daterange\DateRangePicker;
  7. $this->title = '会员信息';
  8. $this->params['breadcrumbs'][] = ['label' => $this->title, 'url' => ['index']];
  9. ?>
  10. <div class="row">
  11. <div class="col-12 col-xs-12">
  12. <div class="box">
  13. <div class="box-header">
  14. <h3 class="box-title"><?= $this->title; ?></h3>
  15. <div class="box-tools">
  16. <?= Html::linkButton(['import-member'], '导入会员', [
  17. 'data-toggle' => 'modal',
  18. 'data-target' => '#ajaxModal',
  19. 'class' => 'btn btn-white',
  20. ]) ?>
  21. <?= Html::create(['ajax-edit'], '创建', [
  22. 'data-toggle' => 'modal',
  23. 'data-target' => '#ajaxModal',
  24. ]) ?>
  25. </div>
  26. </div>
  27. <div class="box-body table-responsive">
  28. <?= GridView::widget([
  29. 'dataProvider' => $dataProvider,
  30. 'filterModel' => $searchModel,
  31. // 重新定义分页样式
  32. 'tableOptions' => [
  33. 'class' => 'table table-hover rf-table',
  34. 'fixedNumber' => 2,
  35. 'fixedRightNumber' => 1,
  36. ],
  37. 'columns' => [
  38. [
  39. 'class' => 'yii\grid\SerialColumn',
  40. 'visible' => false, // 不显示#
  41. ],
  42. [
  43. 'attribute' => 'id',
  44. 'filter' => Html::activeTextInput($searchModel, 'id', [
  45. 'class' => 'form-control',
  46. 'style' => 'width: 50px'
  47. ]
  48. ),
  49. 'footer' => '合计',
  50. ],
  51. [
  52. 'attribute' => 'head_portrait',
  53. 'headerOptions' => ['style' => 'width: 100px'],
  54. 'value' => function ($model) {
  55. return Html::img(ImageHelper::defaultHeaderPortrait(Html::encode($model->head_portrait)), [
  56. 'class' => 'img-circle rf-img-md elevation-1',
  57. ]);
  58. },
  59. 'filter' => false,
  60. 'format' => 'raw',
  61. ],
  62. [
  63. 'attribute' => 'nickname',
  64. 'format' => 'raw',
  65. 'value' => function ($model) {
  66. $tagsHtml = '';
  67. $tagsTitle = [];
  68. $i = 1;
  69. foreach ($model->tag as $item) {
  70. $tagsTitle[]= Html::encode($item['title']);
  71. if ($i <= 3) {
  72. $tagsHtml .= '<span class="label label-outline-default">' . Html::encode($item['title']) . '</span>';
  73. }
  74. $i++;
  75. }
  76. $tagMore = count($model->tag) > 3 ? "<span title='" . implode(', ', $tagsTitle) ."'>...</span>" : '';
  77. return Html::encode($model->nickname) . "<br>" . $tagsHtml . $tagMore;
  78. },
  79. ],
  80. [
  81. 'attribute' => 'mobile',
  82. 'headerOptions' => ['class' => 'col-md-1'],
  83. ],
  84. [
  85. 'attribute' => 'memberLevel.name',
  86. 'filter' => Html::activeDropDownList($searchModel, 'current_level', $levelMap, [
  87. 'prompt' => '全部',
  88. 'class' => 'form-control'
  89. ]
  90. ),
  91. 'value' => function ($model) {
  92. return Html::tag('span', $model->memberLevel->name ?? '', [
  93. 'class' => 'label label-outline-primary'
  94. ]);
  95. },
  96. 'format' => 'raw',
  97. ],
  98. [
  99. 'label' => '邀请人',
  100. 'attribute' => 'pid',
  101. 'headerOptions' => ['class' => 'col-md-1 text-align-center'],
  102. 'contentOptions' => ['class' => 'text-align-center'],
  103. 'filter' => Html::activeTextInput($searchModel, 'pid', [
  104. 'class' => 'form-control',
  105. 'placeholder' => '邀请用户 ID'
  106. ]
  107. ),
  108. 'format' => 'raw',
  109. 'value' => function ($model) {
  110. if ($model->pid === 0 || empty($model->parent)) {
  111. return '---';
  112. }
  113. return MemberHelper::html($model->parent);
  114. },
  115. ],
  116. [
  117. 'label' => '账户金额',
  118. 'filter' => false, //不显示搜索框
  119. 'value' => function ($model) {
  120. return "剩余:" . $model->account->user_money . '<br>' .
  121. "累计:" . $model->account->accumulate_money . '<br>' .
  122. "累计消费:" . abs($model->account->consume_money);
  123. },
  124. 'format' => 'raw',
  125. 'footer' => $pageAccountTotal['user_money'],
  126. ],
  127. [
  128. 'label' => '账户积分',
  129. 'filter' => false, //不显示搜索框
  130. 'value' => function ($model) {
  131. return "剩余:" . $model->account->user_integral . '<br>' .
  132. "累计:" . $model->account->accumulate_integral . '<br>' .
  133. "累计消费:" . abs($model->account->consume_integral);
  134. },
  135. 'format' => 'raw',
  136. 'footer' => $pageAccountTotal['user_integral'],
  137. ],
  138. [
  139. 'label' => '账户成长值',
  140. 'filter' => false, //不显示搜索框
  141. 'value' => function ($model) {
  142. return "当前:" . $model->account->user_growth . '<br>' .
  143. "累计:" . $model->account->accumulate_growth . '<br>';
  144. },
  145. 'format' => 'raw',
  146. 'footer' => $pageAccountTotal['user_growth'],
  147. ],
  148. [
  149. 'label' => '最后登录 / 注册时间',
  150. 'filter' => DateRangePicker::widget([
  151. 'language' => 'zh-CN',
  152. 'name' => 'queryDate',
  153. 'value' => (!empty($startTime) && !empty($endTime)) ? ($startTime . '-' . $endTime) : '',
  154. 'readonly' => 'readonly',
  155. 'useWithAddon' => false,
  156. 'convertFormat' => true,
  157. 'startAttribute' => 'start_time',
  158. 'endAttribute' => 'end_time',
  159. 'startInputOptions' => ['value' => $startTime],
  160. 'endInputOptions' => ['value' => $endTime],
  161. 'presetDropdown' => true,
  162. 'containerTemplate' => <<< HTML
  163. <div class="kv-drp-dropdown">
  164. <span class="left-ind">{pickerIcon}</span>
  165. <input type="text" readonly class="form-control range-value" value="{value}">
  166. </div>
  167. {input}
  168. HTML,
  169. 'pluginOptions' => [
  170. 'locale' => ['format' => 'Y-m-d H:i:s'],
  171. 'timePicker' => true,
  172. 'timePicker24Hour' => true,
  173. 'timePickerSeconds' => true,
  174. 'timePickerIncrement' => 1
  175. ]
  176. ]),
  177. 'value' => function ($model) {
  178. return "最后访问IP:" . $model->last_ip . '<br>' .
  179. "最后访问:" . (!empty($model->last_time) ? Yii::$app->formatter->asDatetime($model->last_time) : '---') . '<br>' .
  180. "登录次数:" . $model->visit_count . '<br>' .
  181. "注册时间:" . Yii::$app->formatter->asDatetime($model->created_at) . '<br>';
  182. },
  183. 'format' => 'raw',
  184. ],
  185. [
  186. 'header' => "操作",
  187. 'contentOptions' => ['class' => 'text-align-center'],
  188. 'class' => 'yii\grid\ActionColumn',
  189. 'template' => '{ajax-edit} {address} {update-level} {recharge} {edit} {status} {blacklist} {destroy}',
  190. 'buttons' => [
  191. 'ajax-edit' => function ($url, $model, $key) {
  192. return Html::a('账号密码', ['ajax-edit', 'id' => $model->id], [
  193. 'data-toggle' => 'modal',
  194. 'data-target' => '#ajaxModal',
  195. 'class' => 'blue'
  196. ]) . '<br>';
  197. },
  198. 'address' => function ($url, $model, $key) {
  199. return Html::a('收货地址', ['address/index', 'member_id' => $model->id], [
  200. 'class' => 'cyan'
  201. ]) . '<br>';
  202. },
  203. 'update-level' => function ($url, $model, $key) {
  204. return Html::a('更换等级', ['update-level', 'id' => $model->id], [
  205. 'data-toggle' => 'modal',
  206. 'data-target' => '#ajaxModal',
  207. 'class' => 'green'
  208. ]) . '<br>';
  209. },
  210. 'recharge' => function ($url, $model, $key) {
  211. return Html::a('充值', ['recharge', 'id' => $model->id], [
  212. 'data-toggle' => 'modal',
  213. 'data-target' => '#ajaxModal',
  214. 'class' => 'orange'
  215. ]) . '<br>';
  216. },
  217. 'edit' => function ($url, $model, $key) {
  218. return Html::a('编辑', ['edit', 'id' => $model->id], [
  219. 'class' => 'purple'
  220. ]) . '<br>';
  221. },
  222. 'blacklist' => function ($url, $model, $key) {
  223. return Html::a('黑名单', ['blacklist', 'id' => $model->id], [
  224. 'class' => 'gray-dark',
  225. 'onclick' => "rfTwiceAffirm(this, '确认拉入黑名单吗?', '请谨慎操作');return false;"
  226. ]) . '<br>';
  227. },
  228. 'destroy' => function ($url, $model, $key) {
  229. return Html::a('删除', ['destroy', 'id' => $model->id], [
  230. 'class' => 'red',
  231. 'onclick' => "rfTwiceAffirm(this, '确认删除吗?', '请谨慎操作');return false;"
  232. ]) . '<br>';
  233. },
  234. ],
  235. ],
  236. ],
  237. 'showFooter' => true,
  238. ]); ?>
  239. </div>
  240. </div>
  241. </div>
  242. </div>
粤ICP备19079148号