SeasonalFoods.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. <template>
  2. <div class="seasonal-foods admin-page">
  3. <el-card>
  4. <div slot="header" class="admin-page-header">
  5. <span class="admin-page-title">应季食材配置</span>
  6. <div class="flex items-center gap-sm">
  7. <el-select
  8. v-model="monthFilter"
  9. placeholder="选择月份"
  10. size="mini"
  11. @change="loadList"
  12. >
  13. <el-option v-for="m in 12" :key="m" :label="m + '月'" :value="m" />
  14. </el-select>
  15. <el-input v-model="keyword" placeholder="搜索..." prefix-icon="el-icon-search" clearable @keyup.enter.native="handleSearch" @clear="handleSearch" />
  16. <el-button type="primary" size="mini" @click="openCreate">新增应季映射</el-button>
  17. </div>
  18. </div>
  19. <div class="table-scroll-wrap">
  20. <el-table :data="list" v-loading="loading" border stripe>
  21. <el-table-column prop="id" label="ID" width="80" />
  22. <el-table-column prop="foodId" label="食材ID" width="80" />
  23. <el-table-column label="月份" width="80">
  24. <template slot-scope="{ row }">{{ row.month }}月</template>
  25. </el-table-column>
  26. <el-table-column label="推荐等级" width="100">
  27. <template slot-scope="{ row }">
  28. <el-tag :type="row.peak >= 3 ? 'danger' : row.peak >= 2 ? 'warning' : 'info'" size="mini">
  29. {{ row.peak }}
  30. </el-tag>
  31. </template>
  32. </el-table-column>
  33. <el-table-column label="操作" width="200" fixed="right">
  34. <template slot-scope="{ row }">
  35. <el-dropdown trigger="hover" @command="(cmd) => handleActionCmd(row, cmd)">
  36. <el-button size="mini">
  37. 更多<i class="el-icon-arrow-down el-icon--right"></i>
  38. </el-button>
  39. <el-dropdown-menu slot="dropdown">
  40. <el-dropdown-item command="delete" icon="el-icon-delete">删除</el-dropdown-item>
  41. </el-dropdown-menu>
  42. </el-dropdown>
  43. </template>
  44. </el-table-column>
  45. </el-table></div>
  46. </el-card>
  47. <el-dialog title="新增应季映射" :visible.sync="dialogVisible" width="400px">
  48. <el-form label-width="100px">
  49. <el-form-item label="食材ID">
  50. <el-input-number v-model="form.foodId" :min="1" style="width:100%" />
  51. </el-form-item>
  52. <el-form-item label="月份">
  53. <el-select v-model="form.month" style="width:100%">
  54. <el-option v-for="m in 12" :key="m" :label="m + '月'" :value="m" />
  55. </el-select>
  56. </el-form-item>
  57. <el-form-item label="推荐等级">
  58. <el-select v-model="form.peak" style="width:100%">
  59. <el-option label="1-普通" :value="1" />
  60. <el-option label="2-推荐" :value="2" />
  61. <el-option label="3-强烈推荐" :value="3" />
  62. </el-select>
  63. </el-form-item>
  64. </el-form>
  65. <div slot="footer">
  66. <el-button @click="dialogVisible = false">取消</el-button>
  67. <el-button type="primary" @click="saveItem">保存</el-button>
  68. </div>
  69. </el-dialog>
  70. </div>
  71. </template>
  72. <script>
  73. export default {
  74. name: 'SeasonalFoods',
  75. data() {
  76. const now = new Date()
  77. return {
  78. loading: false,
  79. list: [],
  80. dialogVisible: false,
  81. keyword: '',
  82. monthFilter: now.getMonth() + 1,
  83. form: {
  84. foodId: null,
  85. month: now.getMonth() + 1,
  86. peak: 1
  87. }
  88. }
  89. },
  90. created() {
  91. this.loadList()
  92. },
  93. methods: {
  94. async loadList() {
  95. this.loading = true
  96. try {
  97. const baseURL = process.env.VUE_APP_BASE_API || ''
  98. const token = localStorage.getItem('token')
  99. const axios = this.$axios || (await import('axios')).default
  100. const res = await axios.post(baseURL + '/api/admin/seasonal/list', { month: this.monthFilter, keyword: this.keyword }, {
  101. headers: { Authorization: 'Bearer ' + token }
  102. })
  103. this.list = res.data && res.data.data || []
  104. } catch (e) {
  105. this.$message && this.$message.error && this.$message.error('加载失败')
  106. } finally {
  107. this.loading = false
  108. }
  109. },
  110. handleSearch() {
  111. this.loadList()
  112. },
  113. openCreate() {
  114. this.form = { foodId: null, month: new Date().getMonth() + 1, peak: 1 }
  115. this.dialogVisible = true
  116. },
  117. async saveItem() {
  118. if (!this.form.foodId) {
  119. this.$message && this.$message.warning && this.$message.warning('请输入食材ID')
  120. return
  121. }
  122. try {
  123. const baseURL = process.env.VUE_APP_BASE_API || ''
  124. const token = localStorage.getItem('token')
  125. const axios = this.$axios || (await import('axios')).default
  126. await axios.post(baseURL + '/api/admin/seasonal/create', this.form, {
  127. headers: { Authorization: 'Bearer ' + token }
  128. })
  129. this.$message && this.$message.success && this.$message.success('创建成功')
  130. this.dialogVisible = false
  131. this.loadList()
  132. } catch (e) {
  133. this.$message && this.$message.error && this.$message.error('保存失败')
  134. }
  135. },
  136. async deleteItem(row) {
  137. this.$confirm('确定删除该应季映射吗?', '提示', { type: 'warning' }).then(async () => {
  138. try {
  139. const baseURL = process.env.VUE_APP_BASE_API || ''
  140. const token = localStorage.getItem('token')
  141. const axios = this.$axios || (await import('axios')).default
  142. await axios.post(baseURL + '/api/admin/seasonal/delete', { id: row.id }, {
  143. headers: { Authorization: 'Bearer ' + token }
  144. })
  145. this.$message && this.$message.success && this.$message.success('删除成功')
  146. this.loadList()
  147. } catch (e) {
  148. this.$message && this.$message.error && this.$message.error('删除失败')
  149. }
  150. }).catch(() => {})
  151. },
  152. handleActionCmd(row, cmd) {
  153. switch (cmd) {
  154. case 'delete':
  155. this.deleteItem(row)
  156. break
  157. }
  158. }
  159. }
  160. }
  161. </script>