index.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. <?php
  2. /**
  3. * 股东管理列表
  4. */
  5. ?>
  6. <div id="app" v-cloak>
  7. <el-card shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  8. <div slot="header">
  9. <span>股东列表</span>
  10. <el-form size="small" :inline="true" :model="search" style="float: right;margin-top: -5px;">
  11. <el-form-item>
  12. <!-- <com-export-dialog :field_list='exportList' :params="search" @selected="confirmSubmit"></com-export-dialog>-->
  13. </el-form-item>
  14. </el-form>
  15. </div>
  16. <div class="table-body">
  17. <div class="input-item">
  18. <el-input @keyup.enter.native="getList" size="small" placeholder="请输入搜索手机号" v-model="search.keyword"
  19. clearable @clear="toSearch">
  20. <el-button slot="append" icon="el-icon-search" @click="toSearch"></el-button>
  21. </el-input>
  22. </div>
  23. <!-- 批量设置 -->
  24. <div class="batch">
  25. <!-- <boss-batch :choose-list="choose_list" :boss-level-list="level_list" @to-search="getList"></boss-batch>-->
  26. </div>
  27. <div style="float: right">
  28. <el-button type="primary" size="small" style="padding: 9px 15px !important;" @click="bossDialog = true">添加股东</el-button>
  29. </div>
  30. <el-tabs v-model="activeName" @tab-click="handleClick">
  31. <el-table :data="list" stripe v-loading="loading" size="small" style="margin-bottom: 15px;"
  32. @selection-change="handleSelectionChange">
  33. <el-table-column align='center' type="selection" width="60" ></el-table-column>
  34. <el-table-column prop="user_id" width="80" label="用户ID" align="center"></el-table-column>
  35. <el-table-column label="基本信息">
  36. <template slot-scope="scope">
  37. <com-image style="float: left;margin-right: 5px;" mode="aspectFill" :src="scope.row.user.avatar_url?scope.row.user.avatar_url:'/resources/img/common/default-avatar.png'"></com-image>
  38. <div>{{scope.row.user.nickname}}</div>
  39. </template>
  40. </el-table-column>
  41. <el-table-column label="手机号" prop="mobile" align="center">
  42. <template slot-scope="scope">
  43. <div>{{scope.row.user.mobile}}</div>
  44. </template>
  45. </el-table-column>
  46. <el-table-column label="累计永久佣金" prop="commission" align="center">
  47. <template slot-scope="scope">
  48. <div>¥{{scope.row.commission}}</div>
  49. </template>
  50. </el-table-column>
  51. <el-table-column label="累计额外佣金" prop="extra_commission" align="center">
  52. <template slot-scope="scope">
  53. <div>¥{{scope.row.extra_commission}}</div>
  54. </template>
  55. </el-table-column>
  56. <el-table-column label="累计总佣金" prop="total_commission" align="center">
  57. <template slot-scope="scope">
  58. <div>¥{{scope.row.total_commission}}</div>
  59. </template>
  60. </el-table-column>
  61. <el-table-column label="推荐人" align="center">
  62. <template slot-scope="scope">
  63. <div>{{ parents[scope.row.user.parent_id] || '平台' }}</div>
  64. </template>
  65. </el-table-column>
  66. <!-- <el-table-column label="股东等级" prop="level" align="center">-->
  67. <!-- <template slot-scope="scope">-->
  68. <!-- <el-tag size="small" type="info" v-if="scope.row.level == 0">默认等级</el-tag>-->
  69. <!-- <el-tag size="small" v-else>{{level_arr[scope.row.level]}}</el-tag>-->
  70. <!-- <br />-->
  71. <!-- <span>{{ upgrade_type[scope.row.upgrade_status] }}</span>-->
  72. <!-- </template>-->
  73. <!-- </el-table-column>-->
  74. <el-table-column label="时间" align="center">
  75. <template slot-scope="scope">
  76. <div>成为股东时间:<br>{{scope.row.created_at|dateTimeFormat('Y-m-d H:i:s')}}</div>
  77. </template>
  78. </el-table-column>
  79. <el-table-column label="备注信息" prop="remark" align="center">
  80. <template slot-scope="scope">
  81. <com-ellipsis :line="1" :text="String(scope.row.remark)"></com-ellipsis>
  82. </template>
  83. </el-table-column>
  84. <el-table-column label="操作" align="center" width="250">
  85. <template slot-scope="scope">
  86. <el-button type="text" @click="handle('goods_handle',scope.row)">商品管理</el-button>
  87. <el-button type="text" @click="handle('remark_dialog',scope.row)">添加备注</el-button>
  88. <!-- <el-button type="text" @click="handle('upgrade_dialog',scope.row)">修改等级</el-button>-->
  89. <el-button type="text" @click="handle('destroy',scope.row)">删除</el-button>
  90. </template>
  91. </el-table-column>
  92. </el-table>
  93. <div style="text-align: right;margin: 20px 0;">
  94. <el-pagination @current-change="pagination" background layout="prev, pager, next" :page-count="pageCount"></el-pagination>
  95. </div>
  96. </el-tabs>
  97. </div>
  98. </el-card>
  99. <!-- 添加备注 -->
  100. <el-dialog title="添加备注" :visible.sync="remarkDialog">
  101. <el-form :model="remarkForm">
  102. <el-form-item label="备注">
  103. <el-input type="textboss" v-model="remarkForm.remark" autocomplete="off"></el-input>
  104. <el-input style="display: none" :readonly="true" v-model="remarkForm.user_id"></el-input>
  105. </el-form-item>
  106. </el-form>
  107. <div slot="footer" class="dialog-footer">
  108. <el-button @click="remarkDialog = false">取 消</el-button>
  109. <el-button type="primary" @click="handle('remark',remarkForm)" :loading="remarkLoading">确 定</el-button>
  110. </div>
  111. </el-dialog>
  112. <!-- 添加股东 -->
  113. <el-dialog title="添加股东" :visible.sync="bossDialog" >
  114. <div>
  115. <el-form :model="bossForm" size="small" label-width="150px">
  116. <el-form-item label="用户手机号">
  117. <el-autocomplete
  118. size="small"
  119. v-model="bossForm.mobile"
  120. :fetch-suggestions="querySearchAsync"
  121. placeholder="请输入会员手机号"
  122. @select="handleSelect">
  123. </el-autocomplete>
  124. </el-form-item>
  125. <!-- <el-form-item label="等级">-->
  126. <!-- <el-select v-model="bossForm.level" placeholder="请选择股东等级">-->
  127. <!-- <el-option-->
  128. <!-- v-for="item in level_list"-->
  129. <!-- :key="item.name"-->
  130. <!-- :label="item.name"-->
  131. <!-- :value="item.level">-->
  132. <!-- </el-option>-->
  133. <!-- </el-select>-->
  134. <!-- </el-form-item>-->
  135. </el-form>
  136. </div>
  137. <span slot="footer" class="dialog-footer">
  138. <el-button @click="bossDialog=false" type="default" size="small">取消</el-button>
  139. <el-button type="primary" :loading="btnBossLoading" style="margin-bottom: 10px;" size="small" @click="handle('add_boss',bossForm)">保存</el-button>
  140. </span>
  141. </el-dialog>
  142. <!-- 修改股东等级 -->
  143. <el-dialog title="修改股东等级" :visible.sync="upgradeDialog" @close="handle('upgrade_dialog_false')">
  144. <div>
  145. <el-form :model="upgradeForm" size="small" label-width="150px">
  146. <el-input style="display: none" :readonly="true" v-model="remarkForm.user_id"></el-input>
  147. <el-form-item label="等级">
  148. <el-select v-model="upgradeForm.level" :placeholder="bossLevelName">
  149. <el-option
  150. v-for="item in level_list"
  151. :key="item.name"
  152. :label="item.name"
  153. :disabled="item.level == disabledLevel ? true : false"
  154. :value="item.level">
  155. </el-option>
  156. </el-select>
  157. </el-form-item>
  158. </el-form>
  159. </div>
  160. <span slot="footer" class="dialog-footer">
  161. <el-button @click="upgradeDialog=false" type="default" size="small">取消</el-button>
  162. <el-button type="primary" :loading="upgradeLoading" style="margin-bottom: 10px;" size="small" @click="handle('upgrade',upgradeForm)">保存</el-button>
  163. </span>
  164. </el-dialog>
  165. <!-- <boss-edit v-model="edit.show"></boss-edit>-->
  166. <!-- <boss-level v-model="level.show" :boss="level.boss" @success="levelSuccess"></boss-level>-->
  167. </div>
  168. <script>
  169. const app = new Vue({
  170. el: '#app',
  171. data: {
  172. activeName: '',
  173. remarkDialog: false,
  174. upgradeDialog: false,
  175. bossDialog: false,
  176. loading: false,
  177. btnBossLoading: false,
  178. remarkLoading: false,
  179. upgradeLoading: false,
  180. page: 1,
  181. pageCount: 0,
  182. disabledLevel: 0,
  183. list: [],
  184. level_arr: [],
  185. level_list: [],
  186. exportList: [],
  187. choose_list: [],
  188. upgrade_type: [],
  189. parents: [],
  190. search: {},
  191. remarkForm: {},
  192. upgradeForm: {},
  193. bossLevelName: '',
  194. bossForm: {
  195. mobile: null,
  196. level: null,
  197. },
  198. },
  199. mounted() {
  200. this.getList();
  201. },
  202. methods: {
  203. down() {
  204. var alink = document.createElement("a");
  205. alink.href = this.qrimg;
  206. alink.download = this.nickname;
  207. alink.click();
  208. },
  209. // 操作处理
  210. handle(type, data = null) {
  211. let id = data ? parseInt(data.id) : '';
  212. let params = {};
  213. //return false;
  214. switch (type) {
  215. case 'remark_dialog':// 修改备注
  216. this.remarkDialog = true;
  217. this.remarkForm.user_id = data.user_id;
  218. break;
  219. case 'upgrade_dialog':// 修改股东等级
  220. this.disabledLevel = data.level;
  221. this.bossLevelName = this.level_arr[data.level];
  222. this.upgradeForm.user_id = data.user_id;
  223. this.upgradeDialog = true;
  224. break;
  225. case 'destroy':
  226. let params_destroy = {
  227. user_id: data.user_id, status: -1
  228. };
  229. this.$confirm('删除该条数据后不可以恢复, 是否继续?', '警告', {type: 'warning'}).then(() => {this.send(params_destroy,'boss-three/default/edit')})
  230. break;
  231. case 'remark':// 提交修改备注
  232. let params_remark = {
  233. 'user_id': data.user_id,
  234. 'remark': data.remark,
  235. };
  236. this.send(params_remark,'boss-three/default/edit');
  237. this.remarkDialog = false;
  238. break;
  239. case 'goods_handle':// 提交修改股东等级
  240. let params = {
  241. r: 'boss-three/default/goods',
  242. };
  243. if (id) params = Object.assign(params, {
  244. id: data.id
  245. });
  246. navigateTo(params);
  247. break;
  248. case 'add_boss':// 添加股东
  249. this.send(data,'boss-three/default/add-boss');
  250. this.bossDialog = false;
  251. break;
  252. }
  253. },
  254. send(params,url, callback) {
  255. let self = this;
  256. request({
  257. params: {
  258. r: url,
  259. },
  260. method: 'post',
  261. data: params
  262. }).then(e => {
  263. if (e.data.code == 0) {
  264. self.$message.success(e.data.msg);
  265. self.getList();
  266. } else {
  267. self.$message.error(e.data.msg);
  268. }
  269. if (callback) callback(e.data);
  270. }).catch(e => {
  271. console.log(e);
  272. });
  273. },
  274. getList() {
  275. let self = this;
  276. self.loading = true;
  277. let params = {
  278. r: 'boss-three/default/index',
  279. page: self.page
  280. };
  281. params = Object.assign(params, this.search);
  282. request({
  283. params: params,
  284. method: 'get',
  285. }).then(e => {
  286. self.loading = false;
  287. if (e.data.code == 0) {
  288. self.list = e.data.data.list.list;
  289. self.pageCount = e.data.data.list.page_count;
  290. self.upgrade_type = e.data.data.upgrade_type;
  291. self.parents = e.data.data.parents;
  292. if (e.data.data.level_list) {
  293. self.level_list = e.data.data.level_list;
  294. self.level_list.forEach(function (item) {
  295. self.level_arr[item.level] = item.name;
  296. });
  297. }
  298. } else {
  299. self.$message.error(e.data.msg);
  300. }
  301. }).catch(e => {
  302. self.loading = false;
  303. });
  304. },
  305. pagination(currentPage) {
  306. let self = this;
  307. self.page = currentPage;
  308. self.getList();
  309. },
  310. handleClick(tab, event) {
  311. this.search.page = 1;
  312. this.search.status = this.activeName;
  313. this.getList()
  314. },
  315. toSearch() {
  316. this.search.page = 1;
  317. this.getList();
  318. },
  319. handleSelectionChange(val) {
  320. let self = this;
  321. self.choose_list = [];
  322. val.forEach(function (item) {
  323. self.choose_list.push(item.id);
  324. })
  325. },
  326. querySearchAsync(queryString, cb) {
  327. if (!queryString) return;
  328. let self = this;
  329. request({
  330. params: {
  331. r: 'boss-three/default/select-user',
  332. },
  333. method: 'post',
  334. data: {
  335. keyword:queryString
  336. }
  337. }).then(e => {
  338. if (e.data.code == 0) {
  339. let select = [];
  340. e.data.data.forEach(function (item) {
  341. item.value = String(item.mobile);
  342. select.push(item);
  343. });
  344. cb(select);
  345. } else {
  346. self.$message.error(e.data.msg);
  347. }
  348. }).catch(e => {
  349. console.log(e);
  350. });
  351. },
  352. handleSelect(item){
  353. this.bossForm.mobile = item.value;
  354. },
  355. }
  356. });
  357. </script>
  358. <style>
  359. .el-tabs__header {
  360. font-size: 16px;
  361. }
  362. .table-body {
  363. padding: 20px;
  364. background-color: #fff;
  365. }
  366. .table-body .el-button {
  367. padding: 0 !important;
  368. border: 0;
  369. margin: 0 5px;
  370. }
  371. .input-item {
  372. width: 250px;
  373. margin: 0 0 20px;
  374. display: inline-block;
  375. }
  376. .input-item .el-input__inner {
  377. border-right: 0;
  378. }
  379. .input-item .el-input__inner:hover {
  380. border: 1px solid #dcdfe6;
  381. border-right: 0;
  382. outline: 0;
  383. }
  384. .input-item .el-input__inner:focus {
  385. border: 1px solid #dcdfe6;
  386. border-right: 0;
  387. outline: 0;
  388. }
  389. .input-item .el-input-group__append {
  390. background-color: #fff;
  391. border-left: 0;
  392. width: 10%;
  393. padding: 0;
  394. }
  395. .input-item .el-input-group__append .el-button {
  396. padding: 0;
  397. }
  398. .input-item .el-input-group__append .el-button {
  399. margin: 0;
  400. }
  401. .batch {
  402. margin: 0 0 20px;
  403. display: inline-block;
  404. }
  405. .batch .el-button {
  406. padding: 9px 15px !important;
  407. }
  408. .el-table th>.cell{
  409. color: #333;
  410. font-weight: bold;
  411. font-size: 14px;
  412. }
  413. .el-table__footer-wrapper, .el-table__header-wrapper{
  414. border-bottom: 1.4px solid #D6D6D6;
  415. }
  416. </style>