RongshuProductDialog.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <template>
  2. <el-dialog
  3. title="选择荣数商品"
  4. :visible.sync="dialogVisible"
  5. width="900px"
  6. @open="onOpen"
  7. >
  8. <el-form :model="filter" inline>
  9. <el-form-item label="商品名称">
  10. <el-input
  11. v-model="filter.name"
  12. placeholder="请输入"
  13. clearable
  14. style="width: 220px"
  15. @keyup.enter.native="handleSearch"
  16. />
  17. </el-form-item>
  18. <el-form-item>
  19. <el-button type="primary" @click="handleSearch">查询</el-button>
  20. <el-button @click="handleReset">重置</el-button>
  21. </el-form-item>
  22. </el-form>
  23. <el-table :data="pagedData" border stripe size="small" style="width: 100%">
  24. <el-table-column prop="name" label="商品名称" min-width="180" show-overflow-tooltip />
  25. <el-table-column prop="merchant" label="商户名称" width="160" show-overflow-tooltip />
  26. <el-table-column label="银行结算价" width="120" align="right">
  27. <template slot-scope="{ row }">¥{{ row.settlePrice.toFixed(2) }}</template>
  28. </el-table-column>
  29. <el-table-column prop="stock" label="库存数" width="100" align="right" />
  30. <el-table-column label="操作" width="80" align="center" fixed="right">
  31. <template slot-scope="{ row }">
  32. <el-button type="text" size="small" @click="handleSelect(row)">选择</el-button>
  33. </template>
  34. </el-table-column>
  35. </el-table>
  36. <div class="pagination-bar">
  37. <el-pagination
  38. background
  39. layout="total, prev, pager, next"
  40. :page-size="10"
  41. :current-page.sync="currentPage"
  42. :total="filteredData.length"
  43. />
  44. </div>
  45. </el-dialog>
  46. </template>
  47. <script>
  48. const MOCK_PRODUCTS = [
  49. { name: '荣数机场贵宾厅', merchant: '环亚机场贵宾', settlePrice: 88, stock: 200, mainImage: [{ name: 'rongshu-a.png', url: 'https://placehold.co/200x200/4096ff/ffffff?text=A' }] },
  50. { name: '荣数高尔夫体验', merchant: '尊享高尔夫俱乐部', settlePrice: 388, stock: 50, mainImage: [{ name: 'rongshu-b.png', url: 'https://placehold.co/200x200/52c41a/ffffff?text=B' }] },
  51. { name: '荣数洗车服务', merchant: '车之家精洗', settlePrice: 48, stock: 800, mainImage: [{ name: 'rongshu-c.png', url: 'https://placehold.co/200x200/faad14/ffffff?text=C' }] },
  52. { name: '荣数体检套餐', merchant: '美年大健康', settlePrice: 988, stock: 120, mainImage: [{ name: 'rongshu-d.png', url: 'https://placehold.co/200x200/eb2f96/ffffff?text=D' }] },
  53. { name: '荣数咖啡券', merchant: 'Starbucks', settlePrice: 28, stock: 1000, mainImage: [] },
  54. { name: '荣数视频会员月卡', merchant: '腾讯视频', settlePrice: 25, stock: 500, mainImage: [] },
  55. { name: '荣数音乐会员季卡', merchant: 'QQ音乐', settlePrice: 45, stock: 600, mainImage: [] },
  56. { name: '荣数电影票券', merchant: '猫眼电影', settlePrice: 38, stock: 300, mainImage: [] },
  57. { name: '荣数家政服务券', merchant: '58到家', settlePrice: 158, stock: 200, mainImage: [] },
  58. { name: '荣数美甲服务券', merchant: '河狸家', settlePrice: 88, stock: 100, mainImage: [] },
  59. { name: '荣数车辆保养券', merchant: '途虎养车', settlePrice: 268, stock: 80, mainImage: [] },
  60. { name: '荣数读书会员', merchant: '微信读书', settlePrice: 18, stock: 600, mainImage: [] },
  61. { name: '荣数花艺礼盒', merchant: '花点时间', settlePrice: 199, stock: 50, mainImage: [] },
  62. { name: '荣数瑜伽课程券', merchant: 'Keep', settlePrice: 128, stock: 90, mainImage: [] },
  63. { name: '荣数智能家居体验', merchant: '小米之家', settlePrice: 358, stock: 30, mainImage: [] }
  64. ]
  65. export default {
  66. name: 'RongshuProductDialog',
  67. props: {
  68. visible: { type: Boolean, default: false }
  69. },
  70. data() {
  71. return {
  72. filter: { name: '' },
  73. currentPage: 1,
  74. products: MOCK_PRODUCTS
  75. }
  76. },
  77. computed: {
  78. dialogVisible: {
  79. get() { return this.visible },
  80. set(v) { this.$emit('update:visible', v) }
  81. },
  82. filteredData() {
  83. if (!this.filter.name) return this.products
  84. const kw = this.filter.name.trim()
  85. return this.products.filter(p => p.name.includes(kw))
  86. },
  87. pagedData() {
  88. const start = (this.currentPage - 1) * 10
  89. return this.filteredData.slice(start, start + 10)
  90. }
  91. },
  92. methods: {
  93. onOpen() {
  94. this.filter = { name: '' }
  95. this.currentPage = 1
  96. },
  97. handleSearch() {
  98. this.currentPage = 1
  99. },
  100. handleReset() {
  101. this.filter = { name: '' }
  102. this.currentPage = 1
  103. },
  104. handleSelect(row) {
  105. this.$emit('select', { ...row })
  106. this.dialogVisible = false
  107. }
  108. }
  109. }
  110. </script>
  111. <style scoped>
  112. .pagination-bar {
  113. margin-top: 12px;
  114. display: flex;
  115. justify-content: flex-end;
  116. }
  117. </style>