details.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <template>
  2. <div>
  3. <el-dialog :title="exData.id ? '编辑': '新增'"
  4. :visible.sync="dialog"
  5. width="50%"
  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="storage_name"-->
  13. <!-- :rules="formRules.required"-->
  14. <!-- label="酒名:">-->
  15. <!-- <el-input v-model="form.storage_name"-->
  16. <!-- placeholder="请输入酒名"-->
  17. <!-- clearable></el-input>-->
  18. <!-- </el-form-item>-->
  19. <el-form-item prop="storage_name" :rules="formRules.required" label="酒名:">
  20. <el-select
  21. v-model="form.storage_name"
  22. filterable
  23. remote
  24. reserve-keyword
  25. :remote-method="myFilterOfRule"
  26. @visible-change="getDropdownOfRule($event)"
  27. :loading="loading">
  28. <el-option
  29. v-for="item in getMyFilterGoodsInfo"
  30. :key="item.index"
  31. :label="item.storage_name"
  32. :value="item.id">
  33. <p>商品名称</p>
  34. </el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item prop="storage_img_url"
  38. :rules="formRules.uploadImgs"
  39. label="实物图:">
  40. <el-upload :on-remove="handleRemove"
  41. :on-success="handleAvatarSuccess"
  42. :before-upload="beforeAvatarUpload"
  43. :on-exceed="hadnleExceed"
  44. :accept="'image/*'"
  45. :limit="1"
  46. :file-list="fileList"
  47. list-type="picture-card"
  48. action="/api/admin/v1/upload/file"
  49. multiple>
  50. <i class="el-icon-plus"></i>
  51. <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过5M</div>
  52. </el-upload>
  53. </el-form-item>
  54. <el-form-item prop="user_phone"
  55. :rules="formRules.mobile"
  56. label="用户手机号:">
  57. <el-input v-model="form.user_phone"
  58. placeholder="请输入用户手机号"
  59. @input="form.user_phone = form.user_phone.replace(/[^\d]/g, '').slice(0, 11)"
  60. clearable></el-input>
  61. </el-form-item>
  62. <el-form-item prop="user_name"
  63. :rules="formRules.required"
  64. label="用户昵称:">
  65. <el-input v-model="form.user_name"
  66. placeholder="请输入用户昵称"
  67. clearable></el-input>
  68. </el-form-item>
  69. <el-form-item prop="storage_status"
  70. :rules="formRules.required"
  71. label="状态:">
  72. <el-radio v-model="form.storage_status"
  73. label="0">存酒中
  74. </el-radio>
  75. <el-radio v-model="form.storage_status"
  76. label="1">已取
  77. </el-radio>
  78. </el-form-item>
  79. <el-form-item prop="storage_remark"
  80. label="备注:">
  81. <el-input v-model="form.storage_remark"
  82. type="textarea"
  83. rows="6">
  84. </el-input>
  85. </el-form-item>
  86. </el-form>
  87. <div slot="footer" class="dialog-footer text-center">
  88. <el-button @click="dialog = false">取 消</el-button>
  89. <el-button type="primary" :disabled="booLock" @click="handleSubmit">确 定</el-button>
  90. </div>
  91. </el-dialog>
  92. </div>
  93. </template>
  94. <script>
  95. import getCode from '@/views/ums/mixin/getCode'
  96. export default {
  97. mixins: [getCode],
  98. components: {},
  99. props: {
  100. value: {
  101. type: Boolean,
  102. default: true
  103. },
  104. exData: {
  105. type: Object,
  106. default: function () {
  107. return {}
  108. }
  109. }
  110. },
  111. data () {
  112. return {
  113. dialog: !!this.value,
  114. form: {
  115. storage_name: '', // 酒名
  116. storage_img_url: [], // 存酒图片
  117. user_phone: '', // 用户手机号码
  118. user_name: '', // 用户姓名
  119. storage_status: '1', // 存酒状态(0存酒中1已取出)
  120. storage_remark: '' // 存酒备注
  121. },
  122. fileList: [],
  123. booLock: false,
  124. getMySearchInfo: '',
  125. getMyFilterGoodsInfo: [],
  126. loading: false
  127. }
  128. },
  129. methods: {
  130. beforeAvatarUpload (file) {
  131. const isLt2M = file.size / 1024 / 1024 < 5
  132. if (!isLt2M) {
  133. this.$message.error('上传图片大小不能超过 5MB!')
  134. }
  135. return isLt2M
  136. },
  137. handleRemove (file) {
  138. let path = file.url
  139. if (file.response && file.response.data) {
  140. path = file.response.data.path
  141. }
  142. this.form.storage_img_url = this.form.storage_img_url.filter(item => item !== path)
  143. },
  144. handleAvatarSuccess (res) {
  145. if (res.code === 200) {
  146. const { path } = res.data
  147. this.form.storage_img_url.push(path)
  148. } else {
  149. this.$message.error('图片上传失败')
  150. }
  151. },
  152. hadnleExceed (files, fileList) {
  153. this.$message({
  154. message: '商品图最多上传一张',
  155. type: 'warning'
  156. })
  157. },
  158. handleSubmit () {
  159. const url = this.exData.id ? '/v1/user/storage/modify' : ''
  160. this.$refs.form.validate(async valid => {
  161. if (valid) {
  162. this.booLock = true
  163. const data = await this.$fetch(url, {
  164. ...this.form,
  165. storage_img_url: this.form.storage_img_url[0]
  166. })
  167. this.booLock = false
  168. if (data.code === 200) {
  169. this.$message.success('提交成功')
  170. this.$emit('success')
  171. this.dialog = false
  172. }
  173. }
  174. })
  175. },
  176. getDropdownOfRule (e) {
  177. if (e === true) {
  178. this.myFilterOfRule(this.getMySearchInfo)
  179. } else {
  180. const _result = this.getMyFilterGoodsInfo.filter(item => item.id === this.form.id || item.storage_name === this.getMySearchInfo)
  181. if (_result.length) {
  182. this.getMySearchInfo = _result[0].id
  183. this.form.storage_name = _result[0].storage_name
  184. } else {
  185. this.getMySearchInfo = ''
  186. this.form.id = ''
  187. }
  188. this.getMyFilterGoodsInfo = []
  189. }
  190. },
  191. myFilterOfRule (query) {
  192. this.getMySearchInfo = query
  193. if (query !== '') {
  194. this.loading = true
  195. this.$set(this.form, 'storage_name', query)
  196. setTimeout(async () => {
  197. this.loading = false
  198. const data = await this.$fetch('', {
  199. storage_name: '商品名称'
  200. })
  201. this.getMyFilterGoodsInfo = res.data
  202. }, 200)
  203. } else {
  204. this.getMyFilterGoodsInfo = []
  205. }
  206. },
  207. },
  208. mounted () {
  209. if (this.exData.id) {
  210. this.$set(this.form, 'id', this.exData.id)
  211. this.fileList = [
  212. {
  213. name: '',
  214. url: this.exData.storage_img_url
  215. }
  216. ]
  217. for (const key in this.exData) {
  218. if (this.form.hasOwnProperty(key)) {
  219. let value = this.exData[key]
  220. if ((Array.isArray(value) && value.length >= 1) || (Object.prototype.toString.call(value) === '[object Object]') || (typeof value === 'string' && value) || typeof value === 'number') {
  221. if (key === 'storage_img_url') {
  222. value = [value]
  223. }
  224. if (key === 'storage_status') {
  225. value = value.toString()
  226. }
  227. this.$set(this.form, key, value)
  228. }
  229. }
  230. }
  231. }
  232. },
  233. watch: {
  234. dialog (val) {
  235. if (!val) this.$emit('input', val)
  236. }
  237. }
  238. }
  239. </script>
  240. <style lang="scss" scoped>
  241. .top-tip {
  242. margin-top: -20px;
  243. margin-bottom: 20px;
  244. }
  245. </style>