edit.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <view style="height:100vh;padding:20px">
  3. <u--form labelPosition="left" :model="model" :rules="rules" ref="form" errorType="toast">
  4. <u-form-item label="名称" prop="formData.name" borderBottom required>
  5. <u--input v-model="model.formData.name"></u--input>
  6. </u-form-item>
  7. <u-form-item label="品牌" prop="formData.brand" borderBottom required>
  8. <u--input v-model="model.formData.brand"></u--input>
  9. </u-form-item>
  10. <u-form-item label="规格" prop="formData.spec" borderBottom required>
  11. <u--input v-model="model.formData.spec"></u--input>
  12. </u-form-item>
  13. <u-form-item label="是否购买" prop="formData.is_buy" borderBottom>
  14. <u-radio-group v-model="model.formData.is_buy" placement="column">
  15. <u-radio label="已购买" :name="true"></u-radio>
  16. <u-radio label="未购买" :name="false"></u-radio>
  17. </u-radio-group>
  18. </u-form-item>
  19. <u-form-item label="图片">
  20. <u-upload :fileList="model.formData.files" @afterRead="afterRead" @delete="deletePic" multiple></u-upload>
  21. </u-form-item>
  22. <u-form-item borderBottom>
  23. <up-button type="primary" shape="circle" @click="onSave()" text="保存"></up-button>
  24. </u-form-item>
  25. </u--form>
  26. </view>
  27. </template>
  28. <script setup>
  29. import {
  30. ref,
  31. onMounted,
  32. computed,
  33. getCurrentInstance,
  34. } from 'vue'
  35. const $api = getCurrentInstance()?.appContext.config.globalProperties.$api;
  36. const $upload = getCurrentInstance()?.appContext.config.globalProperties.$upload;
  37. const $fileDomain = getCurrentInstance()?.appContext.config.globalProperties.$fileDomain;
  38. let id
  39. const search = async () => {
  40. const res = await $api(`/perfume/${id}`)
  41. if (res.errcode == 0) {
  42. if (res.data) model.value.formData = res.data
  43. }
  44. }
  45. onMounted(() => {
  46. form.value.setRules(rules);
  47. const crs = getCurrentPages()
  48. const params = crs[crs.length - 1].options
  49. if (params.id) {
  50. id = params.id
  51. search()
  52. }
  53. })
  54. const form = ref()
  55. const model = ref({
  56. formData: {
  57. is_buy: true,
  58. files: []
  59. }
  60. })
  61. const rules = {
  62. 'formData.name': {
  63. type: 'string',
  64. required: true,
  65. message: "请填写产品名称",
  66. trigger: ['blur']
  67. },
  68. 'formData.brand': {
  69. type: 'string',
  70. required: true,
  71. message: "请填写品牌",
  72. trigger: ['blur']
  73. },
  74. 'formData.spec': {
  75. type: 'string',
  76. required: true,
  77. message: "请填写规格",
  78. trigger: ['blur']
  79. }
  80. }
  81. // #region 图片上传
  82. const afterRead = async (e) => {
  83. const uri = '/files/perfume/upload'
  84. const list = []
  85. for (const i of e.file) {
  86. const res = await $upload(uri, i.url)
  87. const obj = { url: `${$fileDomain}${res.uri}`, upload: true }
  88. list.push(obj)
  89. }
  90. model.value.formData.files = list;
  91. }
  92. const deletePic = async (e) => {
  93. const res = await $api('/perfume/deleteImg', 'DELETE', { url: e.file.url });
  94. if (res.errcode === 0) {
  95. // 前端
  96. model.value.formData.files.splice(e.index)
  97. }
  98. }
  99. // #endregion
  100. // #region 验证与保存
  101. const onSave = () => {
  102. form.value.validate().then(res => {
  103. save()
  104. }).catch(errors => {
  105. console.log(errors)
  106. })
  107. }
  108. const save = async () => {
  109. const data = model.value.formData;
  110. let openid = uni.getStorageSync('openid');
  111. let res;
  112. if (!id) {
  113. res = await $api('/perfume', 'POST', { ...data, openid })
  114. } else {
  115. res = await $api(`/perfume/${id}`, 'POST', { ...data, openid })
  116. }
  117. if (res.errcode == 0) {
  118. uni.showToast({
  119. title: '保存成功',
  120. icon: 'succcess',
  121. });
  122. uni.navigateBack()
  123. } else {
  124. uni.showToast({
  125. title: res.errmsg || '保存失败',
  126. icon: 'fail',
  127. });
  128. }
  129. }
  130. // #endregion
  131. </script>
  132. <style></style>