list.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. <template>
  2. <div class="app-list-content">
  3. <cl-crud class="liu-crud-wrap" @load="onLoad">
  4. <template #slot-tabs="{ scope }">
  5. <el-tabs
  6. class="liu-tabs"
  7. type="border-card"
  8. v-model="tabIndex"
  9. @tab-click="handleClick"
  10. >
  11. <el-tab-pane
  12. v-for="(item, index) in tabsData"
  13. :key="index"
  14. :label="`${item.text}(${item.val})`"
  15. :name="item.key"
  16. ></el-tab-pane>
  17. </el-tabs>
  18. </template>
  19. <template #table-column-avatarUrl="{scope}">
  20. <cl-avatar
  21. shape="square"
  22. :size="40"
  23. :src="scope.row.avatarUrl | default_avatar"
  24. :style="{ margin: 'auto' }"
  25. ></cl-avatar>
  26. </template>
  27. <template #table-column-balance="{scope}">
  28. <span>{{ scope.row.userAsset.balance }}</span>
  29. </template>
  30. <template #table-column-growth="{scope}">
  31. <span>{{ scope.row.userAsset.growth }}</span>
  32. </template>
  33. <!-- 充值 -->
  34. <template #slot-recharge="{scope}">
  35. <el-button type="text" @click="rechargeDialog = true">充值</el-button>
  36. </template>
  37. <!-- 升级 -->
  38. <template #slot-upgrade="{scope}">
  39. <el-button type="text" @click="upgradeDialog = true">升级</el-button>
  40. </template>
  41. <!-- 发货 -->
  42. <template #slot-ship="{scope}">
  43. <el-button type="text" @click="$message('开发中...')">发货</el-button>
  44. </template>
  45. </cl-crud>
  46. <!-- 充值 -->
  47. <el-dialog
  48. title="充值"
  49. :visible.sync="rechargeDialog"
  50. :close-on-click-modal="false"
  51. width="400px"
  52. >
  53. <div class="recharge-modal-content">
  54. <el-form
  55. :model="rechargeForm"
  56. :rules="rechargeRules"
  57. ref="rechargeForm"
  58. label-width="80px"
  59. class="demo-form"
  60. >
  61. <el-form-item label="充值金额">
  62. <el-input
  63. v-model="rechargeForm.rechargeAmount"
  64. placeholder="充值金额"
  65. size="small"
  66. ></el-input>
  67. </el-form-item>
  68. <el-form-item label="确认密码">
  69. <el-input
  70. v-model="rechargeForm.confirmPassword"
  71. type="password"
  72. placeholder="确认密码"
  73. size="small"
  74. ></el-input>
  75. </el-form-item>
  76. </el-form>
  77. </div>
  78. <div slot="footer" class="dialog-footer">
  79. <el-button size="small" @click="resetForm">取 消</el-button>
  80. <el-button type="primary" size="small" @click="rechargeAmount">充值</el-button>
  81. </div>
  82. </el-dialog>
  83. <!-- 升级 -->
  84. <el-dialog
  85. title="升级"
  86. :visible.sync="upgradeDialog"
  87. :close-on-click-modal="false"
  88. width="400px"
  89. >
  90. <div class="recharge-modal-content">
  91. <el-form
  92. :model="upgradeForm"
  93. :rules="upgradeRules"
  94. ref="upgradeForm"
  95. label-width="100px"
  96. class="demo-form"
  97. >
  98. <el-form-item label="请选择等级">
  99. <el-select v-model="upgradeForm.member" size="small" placeholder="请选择">
  100. <el-option
  101. v-for="(item, index) in levelData.list"
  102. :key="index"
  103. :label="`${item.level}`"
  104. :value="item.level"
  105. >
  106. </el-option>
  107. </el-select>
  108. </el-form-item>
  109. <el-form-item label="确认密码">
  110. <el-input
  111. v-model="upgradeForm.confirmPassword"
  112. placeholder="确认密码"
  113. type="password"
  114. size="small"
  115. ></el-input>
  116. </el-form-item>
  117. </el-form>
  118. </div>
  119. <div slot="footer" class="dialog-footer">
  120. <el-button size="small" @click="resetForm">取 消</el-button>
  121. <el-button type="primary" size="small" @click="upgradeAmount">充值</el-button>
  122. </div>
  123. </el-dialog>
  124. </div>
  125. </template>
  126. <script>
  127. import { mapGetters } from 'vuex';
  128. export default {
  129. data() {
  130. return {
  131. // cl-crud
  132. app: null,
  133. tabIndex: '-1',
  134. tabsData: [
  135. {
  136. text: '全部',
  137. key: '-1',
  138. val: 0
  139. },
  140. {
  141. text: '粉丝',
  142. key: '1',
  143. val: 0
  144. },
  145. {
  146. text: '会员',
  147. key: '2',
  148. val: 0
  149. }
  150. ],
  151. // recharge
  152. rechargeDialog: false,
  153. rechargeForm: {
  154. rechargeAmount: '',
  155. confirmPassword: ''
  156. },
  157. rechargeRules: {},
  158. // upgrade
  159. upgradeDialog: false,
  160. upgradeForm: {
  161. member: '',
  162. confirmPassword: ''
  163. },
  164. upgradeRules: {}
  165. };
  166. },
  167. computed: {
  168. ...mapGetters({ levelData: 'level' })
  169. },
  170. created() {
  171. // this.$store.dispatch('getLevel');
  172. },
  173. mounted() {},
  174. methods: {
  175. handleClick(tab, e) {
  176. console.log(tab, e);
  177. this.app.refresh({ type: this.tabIndex });
  178. },
  179. // 充值
  180. rechargeAmount() {
  181. this.$service.member.recharge(this.rechargeForm).then(res => {
  182. console.log(res);
  183. this.resetForm();
  184. });
  185. },
  186. // 升级
  187. upgradeAmount() {
  188. this.$service.member.upgrade(this.upgradeForm).then(res => {
  189. console.log(res);
  190. this.resetForm();
  191. });
  192. },
  193. resetForm() {
  194. try {
  195. this.$refs['rechargeForm'].resetFields();
  196. } catch (e) {}
  197. try {
  198. this.$refs['upgradeForm'].resetFields();
  199. } catch (e) {}
  200. this.rechargeDialog = false;
  201. this.upgradeDialog = false;
  202. },
  203. // crud
  204. onLoad({ ctx, app }) {
  205. this.app = app;
  206. ctx.service(this.$service.member)
  207. .set('table', {
  208. columns: [
  209. {
  210. prop: 'id',
  211. label: 'ID',
  212. align: 'center'
  213. },
  214. {
  215. prop: 'avatarUrl',
  216. label: '头像',
  217. align: 'center'
  218. },
  219. {
  220. prop: 'userName',
  221. label: '来源 昵称',
  222. align: 'center'
  223. },
  224. {
  225. prop: 'mobile',
  226. label: '手机号',
  227. align: 'center'
  228. },
  229. {
  230. prop: 'actPrice',
  231. label: '会员级别',
  232. align: 'center',
  233. emptyText: '无',
  234. 'min-width': 150
  235. },
  236. {
  237. prop: 'balance',
  238. label: '余额',
  239. align: 'center'
  240. },
  241. {
  242. prop: 'growth',
  243. label: '成长值',
  244. align: 'center'
  245. },
  246. {
  247. prop: 'subscribe',
  248. label: '关注公众号',
  249. align: 'center',
  250. sortable: true,
  251. width: 150
  252. },
  253. {
  254. prop: 'visitTimeFormat',
  255. label: '最近访问',
  256. align: 'center'
  257. }
  258. ],
  259. // 操作列
  260. op: {
  261. visible: true, // 是否显示
  262. // 同 element-ui Table-column Attributes
  263. props: {
  264. width: 150,
  265. align: 'center',
  266. fixed: 'right',
  267. label: '操作'
  268. },
  269. // 布局,请移步 `layout`
  270. layout: ['slot-recharge', 'slot-upgrade', 'slot-ship']
  271. }
  272. })
  273. .set('upsert', {
  274. props: {
  275. width: '600px',
  276. 'label-width': '120px'
  277. },
  278. items: [
  279. {
  280. prop: 'mobile',
  281. label: '手机号码',
  282. span: 24,
  283. component: {
  284. name: 'el-input',
  285. attrs: {
  286. placeholder: '请填写手机号码'
  287. }
  288. },
  289. rules: {
  290. required: true,
  291. message: '请填写手机号码'
  292. }
  293. },
  294. {
  295. prop: 'confirmMobile',
  296. label: '确认手机号码',
  297. span: 24,
  298. component: {
  299. name: 'el-input',
  300. attrs: {
  301. placeholder: '请填写确认手机号码'
  302. }
  303. },
  304. rules: {
  305. required: true,
  306. message: '请填写确认手机号码'
  307. }
  308. },
  309. {
  310. prop: 'balance',
  311. label: '余额',
  312. span: 24,
  313. component: {
  314. name: 'el-input',
  315. attrs: {
  316. placeholder: '请填写余额'
  317. }
  318. },
  319. rules: {
  320. required: true,
  321. message: '请填写余额'
  322. }
  323. },
  324. {
  325. prop: 'memberLevel',
  326. label: '会员级别',
  327. span: 24,
  328. component: {
  329. name: 'el-select',
  330. attrs: {
  331. placeholder: '请选择'
  332. },
  333. options: this.$util.isEmpty(this.levelData)
  334. ? []
  335. : this.levelData.list.map(e => {
  336. e.label = e.level;
  337. e.value = e.level;
  338. return e;
  339. })
  340. },
  341. rules: {
  342. required: true,
  343. message: '级别不能为空'
  344. }
  345. },
  346. {
  347. prop: 'realName',
  348. label: '姓名',
  349. span: 24,
  350. component: {
  351. name: 'el-input',
  352. attrs: {
  353. placeholder: '选填'
  354. }
  355. }
  356. },
  357. {
  358. prop: 'confirmPassword',
  359. label: '确认密码',
  360. span: 24,
  361. component: {
  362. name: 'el-input',
  363. attrs: {
  364. placeholder: '请填写确认密码'
  365. },
  366. props: {
  367. placeholder: '请填写确认密码',
  368. type: 'password'
  369. }
  370. },
  371. rules: [
  372. {
  373. required: true,
  374. message: '密码不能为空'
  375. },
  376. {
  377. min: 6,
  378. max: 16,
  379. message: '密码长度在 6 到 16 个字符'
  380. }
  381. ]
  382. },
  383. {
  384. prop: 'tips',
  385. component: (
  386. <div>
  387. <i class="el-icon-warning"></i>
  388. <span style="margin-left: 6px">
  389. 添加后,申请会员时自动根据手机号识别客户,成长值、等级和余额会自动同步。
  390. </span>
  391. </div>
  392. )
  393. }
  394. ]
  395. })
  396. .set('layout', [
  397. ['slot-tabs'],
  398. ['search-key', 'flex1', 'refresh-btn', 'add-btn'],
  399. ['data-table'],
  400. ['flex1', 'pagination']
  401. ])
  402. .on('refresh', async (params, { next }) => {
  403. // 继续执行刷新
  404. let { asset } = await next(params);
  405. this.tabsData[0].val = asset.totalUser;
  406. this.tabsData[1].val = asset.totalMember;
  407. this.tabsData[2].val = asset.totalFans;
  408. })
  409. .done();
  410. app.refresh({ type: this.tabIndex });
  411. }
  412. }
  413. };
  414. </script>