index.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <script setup lang="ts">
  2. import { onMounted, ref } from 'vue';
  3. import { useRoute } from 'vue-router';
  4. import type { FormInst, FormRules } from 'naive-ui';
  5. import { NForm, NInput, NSwitch, useMessage } from 'naive-ui';
  6. import E from 'wangeditor';
  7. import { router } from '@/router';
  8. import { fetchAddGoods, fetchEditGoods, fetchGoodsDetail } from '@/service/api/goods-center/health-goods';
  9. import ZUpload from '../../../components/zt/upload/z-upload.vue';
  10. const editor = ref();
  11. const route = useRoute();
  12. const formRef = ref<FormInst | null>(null);
  13. const message = useMessage();
  14. const disabled = ref(false);
  15. const useTime = ref<[string, string]>(['2026-01-06 00:00:00', '2026-01-06 23:59:59']);
  16. const loading = ref(false);
  17. const model = ref({
  18. createTime: '',
  19. updateTime: '',
  20. shopId: 0,
  21. goodsName: '',
  22. goodsImg: '',
  23. goodsCode: '',
  24. price: 0,
  25. shelfStatus: 0,
  26. effectiveTime: 0,
  27. advanceBookingTime: 0,
  28. useStartTime: '00:00:00',
  29. useEndTime: '00:00:00',
  30. usageProcess: '',
  31. buyNotice: '',
  32. content: '',
  33. shopName: '',
  34. tel: '',
  35. sales: 0
  36. });
  37. const rules: FormRules = {
  38. shopName: {
  39. required: true,
  40. trigger: ['blur', 'input'],
  41. message: '请输入'
  42. },
  43. goodsName: {
  44. required: true,
  45. trigger: ['blur', 'input'],
  46. message: '请输入'
  47. },
  48. goodsImg: {
  49. required: true,
  50. trigger: ['blur', 'change'],
  51. message: '请输入'
  52. },
  53. price: {
  54. type: 'number',
  55. required: true,
  56. trigger: ['blur', 'input'],
  57. message: '请输入'
  58. },
  59. effectiveTime: {
  60. type: 'number',
  61. required: true,
  62. trigger: ['blur', 'input'],
  63. message: '请输入'
  64. },
  65. advanceBookingTime: {
  66. type: 'number',
  67. required: true,
  68. trigger: ['blur', 'input'],
  69. message: '请输入'
  70. },
  71. usageProcess: {
  72. required: true,
  73. trigger: ['blur', 'input'],
  74. message: '请输入'
  75. },
  76. buyNotice: {
  77. required: true,
  78. trigger: ['blur', 'input'],
  79. message: '请输入'
  80. },
  81. content: {
  82. required: true,
  83. trigger: ['blur', 'input'],
  84. message: '请输入'
  85. },
  86. useStartTime: {
  87. type: 'string',
  88. required: true,
  89. trigger: ['blur', 'change'],
  90. message: '请输入'
  91. }
  92. };
  93. function handleValidateButtonClick(e: MouseEvent) {
  94. e.preventDefault();
  95. formRef.value?.validate(async errors => {
  96. if (!errors) {
  97. loading.value = true;
  98. model.value.content = editor.value.txt.html();
  99. model.value.useStartTime = useTime.value[0];
  100. model.value.useEndTime = useTime.value[1];
  101. let res;
  102. if (route.query.mode == 'edit') {
  103. res = await fetchEditGoods(model.value);
  104. } else {
  105. res = await fetchAddGoods(model.value);
  106. }
  107. loading.value = false;
  108. console.log(res);
  109. if (res.data === null) {
  110. router.push({
  111. path: '/goods-center/health-goods'
  112. });
  113. }
  114. } else {
  115. console.log(errors);
  116. message.error('验证失败');
  117. }
  118. });
  119. }
  120. async function getDetail() {
  121. // 获取详情接口
  122. const res = await fetchGoodsDetail(route.query.id);
  123. if (res.data) {
  124. model.value = res.data;
  125. editor.value.txt.html(res.data.content); // 重新设置编辑器内容
  126. useTime.value = [res.data.useStartTime, res.data.useEndTime];
  127. console.log(useTime.value);
  128. }
  129. }
  130. onMounted(() => {
  131. editor.value = new E('#div1');
  132. editor.value.create();
  133. if (route.query.id) {
  134. if (route.query.mode === 'detail') {
  135. disabled.value = true;
  136. editor.value.disable();
  137. }
  138. getDetail();
  139. }
  140. console.log(route.query);
  141. });
  142. </script>
  143. <template>
  144. <div class="edit-health-goods pl-20px pt-20px">
  145. <NForm
  146. ref="formRef"
  147. :model="model"
  148. :rules="rules"
  149. label-placement="left"
  150. label-width="auto"
  151. require-mark-placement="right-hanging"
  152. size="medium"
  153. class="max-w-640px"
  154. :disabled="disabled"
  155. >
  156. <NFormItem label="门店名称" path="shopName">
  157. <NInput v-model:value="model.shopName" placeholder="" />
  158. </NFormItem>
  159. <NFormItem label="商品名称" path="goodsName">
  160. <NInput v-model:value="model.goodsName" placeholder="" />
  161. </NFormItem>
  162. <NFormItem label="封面" path="goodsImg">
  163. <ZUpload :value="model.goodsImg" :max="1"></ZUpload>
  164. </NFormItem>
  165. <NFormItem label="商品价格" path="price">
  166. <NInputNumber v-model:value="model.price" />
  167. </NFormItem>
  168. <NFormItem label="有效期" path="effectiveTime">
  169. 购买之日起
  170. <NInputNumber v-model:value="model.effectiveTime" />
  171. 天有效
  172. </NFormItem>
  173. <NFormItem label="预约信息" path="advanceBookingTime">
  174. 提前
  175. <NInputNumber v-model:value="model.advanceBookingTime" />
  176. 天预订
  177. </NFormItem>
  178. <NFormItem label="可用时间">
  179. <NDatePicker
  180. v-model:formatted-value="useTime"
  181. value-format="yyyy-MM-dd HH:mm:ss"
  182. type="datetimerange"
  183. clearable
  184. />
  185. </NFormItem>
  186. <NFormItem label="消费流程" path="usageProcess">
  187. <NInput v-model:value="model.usageProcess" :maxlength="150" show-count placeholder="" type="textarea" />
  188. </NFormItem>
  189. <NFormItem label="购买人群" path="buyNotice">
  190. <NInput v-model:value="model.buyNotice" :maxlength="150" show-count placeholder="" type="textarea" />
  191. </NFormItem>
  192. <NFormItem label="图文说明" path="content">
  193. <div id="div1"></div>
  194. </NFormItem>
  195. <NFormItem label="上架状态" path="shelfStatus">
  196. <NSwitch v-model:value="model.shelfStatus" :unchecked-value="0" :checked-value="1" />
  197. </NFormItem>
  198. <div class="flex justify-end">
  199. <NButton round type="primary" :loading="loading" @click="handleValidateButtonClick">保存</NButton>
  200. </div>
  201. </NForm>
  202. </div>
  203. </template>
  204. <style lang="scss" scoped>
  205. ::v-deep .n-form-item-blank {
  206. z-index: 6 !important;
  207. }
  208. .edit-health-goods {
  209. background: #fff;
  210. }
  211. </style>