details.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. <template>
  2. <div>
  3. <el-dialog :title="exData.id ? '编辑': '新增'"
  4. :visible.sync="dialog"
  5. width="800px"
  6. :close-on-click-modal="false"
  7. top="50px">
  8. <el-form ref="form"
  9. :model="form"
  10. :rules="formRules"
  11. label-width="120px">
  12. <el-form-item prop="bar_name"
  13. :rules="formRules.required"
  14. label="门店名称:">
  15. <el-input v-model="form.bar_name"
  16. placeholder="请输入门店名称"
  17. clearable></el-input>
  18. </el-form-item>
  19. <el-form-item prop="bar_address"
  20. :rules="formRules.required"
  21. label="门店地址:">
  22. <el-input v-model="form.bar_address"
  23. placeholder="请输入门店地址"
  24. clearable></el-input>
  25. </el-form-item>
  26. <el-form-item prop="bar_img_url"
  27. :rules="formRules.uploadImgs"
  28. label="门店图片:">
  29. <el-upload :on-remove="handleRemove"
  30. :on-success="handleAvatarSuccess"
  31. :before-upload="beforeAvatarUpload"
  32. :accept="'image/*'"
  33. :file-list="fileList"
  34. list-type="picture-card"
  35. action="/api/admin/v1/upload/file"
  36. multiple>
  37. <i class="el-icon-plus"></i>
  38. <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过5M</div>
  39. </el-upload>
  40. </el-form-item>
  41. <el-form-item prop="bar_status"
  42. :rules="formRules.required"
  43. label="门店状态:">
  44. <el-radio v-model="form.bar_status"
  45. label="1">有效
  46. </el-radio>
  47. <el-radio v-model="form.bar_status"
  48. label="0">无效
  49. </el-radio>
  50. </el-form-item>
  51. <el-form-item prop="bar_song_start_time"
  52. :rules="formRules.required"
  53. label="点歌时间:">
  54. <el-time-select style="width: 45%;"
  55. placeholder="起始时间"
  56. v-model="form.bar_song_start_time"
  57. :picker-options="{start: '00:00', step: '00:05', end: '23:59'}">
  58. </el-time-select>
  59. <span style="display:inline-block;width: 10%; text-align: center"></span>
  60. <el-time-select style="width: 45%;"
  61. placeholder="结束时间"
  62. v-model="form.bar_song_end_time"
  63. :picker-options="{start: '00:00', step: '00:05', end: '23:59', minTime: form.bar_song_start_time}">
  64. </el-time-select>
  65. </el-form-item>
  66. <el-form-item prop="bar_place_reserve_start_time"
  67. :rules="formRules.required"
  68. label="座位预定时间:">
  69. <el-time-select style="width: 45%;"
  70. placeholder="起始时间"
  71. v-model="form.bar_place_reserve_start_time"
  72. :picker-options="{start: '00:00', step: '00:05', end: '23:59'}">
  73. </el-time-select>
  74. <span style="display:inline-block;width: 10%; text-align: center"></span>
  75. <el-time-select style="width: 45%;"
  76. placeholder="结束时间"
  77. v-model="form.bar_place_reserve_end_time"
  78. :picker-options="{start: '00:00', step: '00:05', end: '23:59', minTime: form.bar_place_reserve_start_time}">
  79. </el-time-select>
  80. </el-form-item>
  81. </el-form>
  82. <div slot="footer" class="dialog-footer text-center">
  83. <el-button @click="dialog = false">取 消</el-button>
  84. <el-button type="primary" :disabled="booLock" @click="handleSubmit">确 定</el-button>
  85. </div>
  86. </el-dialog>
  87. </div>
  88. </template>
  89. <script>
  90. export default {
  91. components: {},
  92. props: {
  93. value: {
  94. type: Boolean,
  95. default: true
  96. },
  97. exData: {
  98. type: Object,
  99. default: function () {
  100. return {}
  101. }
  102. }
  103. },
  104. data () {
  105. return {
  106. dialog: !!this.value,
  107. form: {
  108. bar_name: '', // 门店名称
  109. bar_address: '', // 门店地址
  110. bar_status: '1', // 门店状态(0无效1有效)
  111. bar_img_url: [], // 门店图片
  112. bar_song_start_time: '', // 点歌开始时间
  113. bar_song_end_time: '', // 点歌结束时间
  114. bar_place_reserve_start_time: '', // 座位预定开始时间
  115. bar_place_reserve_end_time: '' // 座位预定结束时间
  116. },
  117. fileList: [],
  118. booLock: false
  119. }
  120. },
  121. methods: {
  122. beforeAvatarUpload (file) {
  123. const isLt2M = file.size / 1024 / 1024 < 5
  124. if (!isLt2M) {
  125. this.$message.error('上传图片大小不能超过 5MB!')
  126. }
  127. return isLt2M
  128. },
  129. handleRemove (file) {
  130. let path = file.url
  131. if (file.response && file.response.data) {
  132. path = file.response.data.path
  133. }
  134. this.form.bar_img_url = this.form.bar_img_url.filter(item => item !== path.replace(/^\/\//, ''))
  135. },
  136. handleAvatarSuccess (res) {
  137. if (res.code === 200) {
  138. const { path } = res.data
  139. this.form.bar_img_url.push(path)
  140. } else {
  141. this.$message.error('图片上传失败')
  142. }
  143. },
  144. handleSubmit () {
  145. const url = this.exData.id ? '/v1/bar/modify' : '/v1/bar/add'
  146. this.$refs.form.validate(async valid => {
  147. if (valid) {
  148. this.booLock = true
  149. const data = await this.$fetch(url, {
  150. ...this.form
  151. })
  152. this.booLock = false
  153. if (data.code === 200) {
  154. this.$message.success('提交成功')
  155. this.$emit('success')
  156. this.$store.dispatch('common/fetchOutletList')
  157. this.dialog = false
  158. }
  159. }
  160. })
  161. }
  162. },
  163. mounted () {
  164. if (this.exData.id) {
  165. this.$set(this.form, 'id', this.exData.id)
  166. this.fileList = this.exData.bar_img_url.map(item => {
  167. return {
  168. name: '',
  169. url: item
  170. }
  171. })
  172. for (const key in this.exData) {
  173. if (this.form.hasOwnProperty(key)) {
  174. let value = this.exData[key]
  175. if ((Array.isArray(value) && value.length >= 1) || (Object.prototype.toString.call(value) === '[object Object]') || (typeof value === 'string' && value) || typeof value === 'number') {
  176. if (key === 'bar_status') {
  177. value = value.toString()
  178. }
  179. this.$set(this.form, key, value)
  180. }
  181. }
  182. }
  183. }
  184. },
  185. watch: {
  186. dialog (val) {
  187. if (!val) this.$emit('input', val)
  188. }
  189. }
  190. }
  191. </script>
  192. <style lang="scss" scoped>
  193. .top-tip {
  194. margin-top: -20px;
  195. margin-bottom: 20px;
  196. }
  197. </style>