index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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">{{ form.id ? '编辑' : '新增' }}{{ selectDictLabel(new_type, form.newsType) }}</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. <template v-if="['23', '20'].includes(form.newsType)">
  17. <el-row :gutter="90">
  18. <el-col :span="8">
  19. <el-form-item label="中文名称:" prop="newsTitle" required :rules="[{ required: true, message: '请输入中文名称', trigger: 'blur' }]">
  20. <el-input v-model="form.newsTitle" clearable placeholder="请输入中文名称"></el-input>
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="8">
  24. <el-form-item label="英文名称:" prop="extraInfo.pinyin" required :rules="[{ required: true, message: '请输入英文名称', trigger: 'blur' }]">
  25. <el-input v-model="form.extraInfo.pinyin" clearable placeholder="请输入中文名称"></el-input>
  26. </el-form-item>
  27. </el-col>
  28. <el-col :span="8">
  29. <el-form-item label="序号:" prop="sort" required :rules="[{ required: true, message: '请输入序号', trigger: 'blur' }]">
  30. <el-input v-model="form.sort" clearable placeholder="请输入序号"></el-input>
  31. </el-form-item>
  32. </el-col>
  33. <el-col :span="8">
  34. <el-form-item label="发布时间:" prop="publishTime">
  35. <el-date-picker v-model="form.publishTime" type="datetime" placeholder="请选择发布时间" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
  36. </el-form-item>
  37. </el-col>
  38. </el-row>
  39. <el-row :gutter="90">
  40. <!-- <el-col :span="8">
  41. <el-form-item label="来源:" prop="newsOrigin">
  42. <el-input v-model="form.newsOrigin" clearable placeholder="请输入来源"></el-input>
  43. </el-form-item>
  44. </el-col> -->
  45. <el-col :span="8">
  46. <el-form-item label="封面图" prop="newsImg" required :rules="[{ required: true, message: '请上传封面图片', trigger: 'blur' }]">
  47. <imageUpload v-model="form.newsImg" :limit="1" isString :isShowTip="false"></imageUpload>
  48. </el-form-item>
  49. </el-col>
  50. </el-row>
  51. <el-row>
  52. <el-col :span="24">
  53. <el-form-item label="内容" prop="newsContent">
  54. <div class="flex1">
  55. <Editor v-model="form.newsContent" placeholder="请输入内容" :readOnly="disable"></Editor>
  56. </div>
  57. </el-form-item>
  58. </el-col>
  59. </el-row>
  60. </template>
  61. <template v-if="['24', '25'].includes(form.newsType)">
  62. <el-row :gutter="90">
  63. <el-col :span="8">
  64. <el-form-item label="标题:" prop="newsTitle" required :rules="[{ required: true, message: '请输入中文名称', trigger: 'blur' }]">
  65. <el-input v-model="form.newsTitle" clearable placeholder="请输入中文名称"></el-input>
  66. </el-form-item>
  67. </el-col>
  68. <el-col :span="8">
  69. <el-form-item label="发布时间:" prop="publishTime">
  70. <el-date-picker v-model="form.publishTime" type="datetime" placeholder="请选择发布时间" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
  71. </el-form-item>
  72. </el-col>
  73. </el-row>
  74. <el-row :gutter="90">
  75. <!-- <el-col :span="8">
  76. <el-form-item label="来源:" prop="newsOrigin">
  77. <el-input v-model="form.newsOrigin" clearable placeholder="请输入来源"></el-input>
  78. </el-form-item>
  79. </el-col> -->
  80. <el-col :span="8">
  81. <el-form-item label="封面图" prop="newsImg" required :rules="[{ required: true, message: '请上传封面图片', trigger: 'blur' }]">
  82. <imageUpload v-model="form.newsImg" :limit="1" isString :isShowTip="false"></imageUpload>
  83. </el-form-item>
  84. </el-col>
  85. </el-row>
  86. <el-row>
  87. <el-col :span="24">
  88. <el-form-item label="内容" prop="newsContent">
  89. <div class="flex1">
  90. <Editor v-model="form.newsContent" placeholder="请输入内容" :readOnly="disable"></Editor>
  91. </div>
  92. </el-form-item>
  93. </el-col>
  94. </el-row>
  95. </template>
  96. <template v-if="['21', '26'].includes(form.newsType)">
  97. <el-row :gutter="90">
  98. <el-col :span="8">
  99. <el-form-item label="年份:" prop="newsTitle" required :rules="[{ required: true, message: '请输入年份', trigger: 'blur' }]">
  100. <el-date-picker v-model="form.newsTitle" type="year" format="YYYY年" value-format="YYYY年" placeholder="请输入年份" />
  101. <!-- <el-input v-model="form.newsTitle" clearable placeholder="请输入年份"></el-input> -->
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="8">
  105. <el-form-item label="发布时间:" prop="publishTime">
  106. <el-date-picker v-model="form.publishTime" type="datetime" placeholder="请选择发布时间" format="YYYY-MM-DD" value-format="YYYY-MM-DD"></el-date-picker>
  107. </el-form-item>
  108. </el-col>
  109. </el-row>
  110. <template v-for="(item, index) in form.extraInfo?.dataList" :key="index">
  111. <el-row :gutter="90" class="mb-16">
  112. <el-col :span="8">
  113. <el-form-item label="月份:" :prop="'extraInfo.dataList.' + index + '.month'" required :rules="[{ required: true, message: '请输入月份', trigger: 'blur' }]">
  114. <el-input v-model="item.month" clearable placeholder="请输入月份"></el-input>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="8">
  118. <el-form-item label="副标题:" :prop="'extraInfo.dataList.' + index + '.subtitle'" required :rules="[{ required: true, message: '请输入副标题', trigger: 'blur' }]">
  119. <el-input v-model="item.subtitle" clearable placeholder="请输入副标题"></el-input>
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="8">
  123. <el-form-item label="是否标记:" prop="isMark">
  124. <el-radio-group v-model="item.isMark">
  125. <el-radio label="0">否</el-radio>
  126. <el-radio label="1">是</el-radio>
  127. </el-radio-group>
  128. </el-form-item>
  129. </el-col>
  130. <el-col :span="8">
  131. <el-form-item label="内容:" prop="content">
  132. <el-input v-model="item.content" clearable placeholder="请输入内容"></el-input>
  133. </el-form-item>
  134. </el-col>
  135. <el-col :span="8">
  136. <el-form-item label=" ">
  137. <el-button @click="deleteList(index)" type="danger">删除</el-button>
  138. </el-form-item>
  139. </el-col>
  140. </el-row>
  141. </template>
  142. <AddBtn content="新增历程" @click="addDataList"></AddBtn>
  143. </template>
  144. </div>
  145. </el-form>
  146. </div>
  147. <div class="d-flex a-c j-c pd-16" v-if="form.newsStatus !== '1'">
  148. <el-button @click="router.go(-1)">取消</el-button>
  149. <el-button @click="save" color="#0079fe" :disabled="disable">暂存</el-button>
  150. <el-button @click="submitGround" type="warning" :disabled="disable">立即上架</el-button>
  151. </div>
  152. </div>
  153. </div>
  154. </template>
  155. <script setup name="Brand-input" lang="ts">
  156. import { ref, reactive, onMounted } from 'vue';
  157. import { debounce } from 'lodash';
  158. import { addNews, editNews, publishNews, getNewsInfo } from '@/api/dgtmedicine/news';
  159. import { useRouter } from 'vue-router';
  160. import { AddBtn } from '@/views/models';
  161. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  162. const { new_type } = toRefs<any>(proxy?.useDict('new_type'));
  163. const router = useRouter();
  164. const form = ref<any>({
  165. id: undefined,
  166. newsTitle: '',
  167. newsContent: '',
  168. newsImg: '',
  169. publishTime: '',
  170. newsOrigin: '',
  171. newsType: '10',
  172. extraInfo: {
  173. pinyin: '',
  174. dataList: []
  175. }
  176. });
  177. const rules = reactive({
  178. // newsImg: [
  179. // { required: true, message: '请上传封面图片', trigger: 'blur' }
  180. // ],
  181. newsContent: [{ required: true, message: '请输入内容', trigger: 'blur' }]
  182. });
  183. const formRef = ref();
  184. const varietyOptions = ref([]);
  185. const save = debounce(async () => {
  186. await formRef.value.validate();
  187. const res = form.value.id ? await editNews(form.value) : await addNews(form.value);
  188. if (res && res.code === 200) {
  189. router.go(-1);
  190. }
  191. }, 500);
  192. const addDataList = () => {
  193. if (!form.value.extraInfo) {
  194. form.value.extraInfo = {
  195. dataList: [
  196. {
  197. month: '',
  198. subtitle: '',
  199. content: '',
  200. isMark: '0'
  201. }
  202. ]
  203. };
  204. } else {
  205. form.value.extraInfo.dataList.push({
  206. month: '',
  207. subtitle: '',
  208. content: '',
  209. isMark: '0'
  210. });
  211. }
  212. };
  213. const deleteList = (index) => {
  214. form.value.extraInfo.dataList.splice(index, 1);
  215. };
  216. const submitGround = debounce(async () => {
  217. await formRef.value.validate();
  218. const res = form.value.id ? await editNews(form.value) : await addNews(form.value);
  219. if (res && res.code === 200) {
  220. await publishNews(res.data.id);
  221. router.go(-1);
  222. }
  223. }, 500);
  224. const fetchDetail = async (id) => {
  225. const res = await getNewsInfo(id);
  226. if (res && res.code === 200) {
  227. console.log(res.data.publishTime);
  228. form.value = res.data;
  229. }
  230. };
  231. const disable = ref(false);
  232. const route = useRoute();
  233. onMounted(() => {
  234. form.value.newsType = route.query?.newsType;
  235. if (route.query?.id) {
  236. // 编辑
  237. fetchDetail(route.query?.id);
  238. }
  239. });
  240. </script>