add.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <div class="p-3">
  3. <div class="bg-fff flex1 ov-hd d-flex flex-cln">
  4. <div class="d-flex a-c pd-16 border-bottom">
  5. <div class="f-s-20 c-333 f-w-7 mr-10">新增品种概况</div>
  6. <el-button @click="router.go(-1)" type="primary" text>
  7. <el-icon>
  8. <Back />
  9. </el-icon>
  10. 返回上一级
  11. </el-button>
  12. </div>
  13. <div class="flex1 over-auto">
  14. <el-form ref="formRef" label-width="auto" label-position="top" :model="form" :rules="rules" :disabled="disable">
  15. <div class="pd-16 border-bottom ov-hd">
  16. <el-row :gutter="90">
  17. <el-col :span="8">
  18. <el-form-item label="概况标题" prop="newsTitle">
  19. <el-input v-model="form.newsTitle" clearable placeholder="请输入概况标题"></el-input>
  20. </el-form-item>
  21. </el-col>
  22. <el-col :span="8">
  23. <el-form-item label="关联品种" prop="variety">
  24. <el-select v-model="form.variety" filterable multiple clearable placeholder="请选择关联品种">
  25. <el-option v-for="item in varietyOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
  26. </el-select>
  27. </el-form-item>
  28. </el-col>
  29. </el-row>
  30. <el-row>
  31. <el-col :span="16">
  32. <el-form-item label="概况内容" prop="newsContent">
  33. <div class="flex1">
  34. <Editor v-model="form.newsContent" placeholder="请输入概况内容" :readOnly="disable"></Editor>
  35. </div>
  36. </el-form-item>
  37. </el-col>
  38. </el-row>
  39. </div>
  40. </el-form>
  41. </div>
  42. <div class="d-flex a-c j-c pd-16">
  43. <el-button @click="router.go(-1)">取消</el-button>
  44. <el-button @click="save" color="#0079fe" :disabled="disable">暂存</el-button>
  45. <el-button @click="submitGround" type="primary" :disabled="disable">立即上架</el-button>
  46. </div>
  47. </div>
  48. </div>
  49. </template>
  50. <script setup name="MedicineNews-add" lang="ts">
  51. import { ref, reactive, onMounted } from 'vue';
  52. import { debounce } from 'lodash';
  53. import { addNews, editNews, publishNews, getNewsInfo } from '@/api/dgtmedicine/news';
  54. import { useRouter } from 'vue-router';
  55. import { getMedicineList } from '@/api/dgtmedicine/variety';
  56. const router = useRouter();
  57. const form = ref({
  58. id: undefined,
  59. newsTitle: '',
  60. variety: [],
  61. newsContent: '',
  62. newsImg: '',
  63. newsType: '0'
  64. });
  65. const rules = reactive({
  66. newsTitle: [{ required: true, message: '请输入概况标题', trigger: 'blur' }],
  67. content: [{ required: true, message: '请输入概况内容', trigger: 'blur' }]
  68. });
  69. const formRef = ref();
  70. const varietyOptions = ref([]);
  71. const fetchVarietyOptions = async () => {
  72. const res = await getMedicineList({});
  73. if (res && res.code === 200) {
  74. varietyOptions.value = res.data.map((item) => ({
  75. label: item.varietyName,
  76. value: item.id
  77. }));
  78. }
  79. };
  80. const save = debounce(async () => {
  81. await formRef.value.validate();
  82. const res = form.value.id ? await editNews(form.value) : await addNews(form.value);
  83. if (res && res.code === 200) {
  84. router.go(-1);
  85. }
  86. }, 500);
  87. const submitGround = debounce(async () => {
  88. await formRef.value.validate();
  89. const res = form.value.id ? await editNews(form.value) : await addNews(form.value);
  90. if (res && res.code === 200) {
  91. await publishNews(res.data.id);
  92. router.go(-1);
  93. }
  94. }, 500);
  95. const fetchDetail = async (id) => {
  96. const res = await getNewsInfo(id);
  97. if (res && res.code === 200) {
  98. form.value = res.data;
  99. }
  100. };
  101. const disable = ref(false);
  102. onMounted(() => {
  103. const id = router.currentRoute.value.query.id;
  104. disable.value = router.currentRoute.value.query.disable == '1';
  105. if (id) {
  106. // 编辑
  107. fetchDetail(id);
  108. }
  109. fetchVarietyOptions();
  110. });
  111. </script>