edit.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <template>
  2. <div id="edit">
  3. <el-row>
  4. <el-col :span="24" class="main">
  5. <el-col :span="24" class="top">
  6. <van-nav-bar :title="pageTitle" left-text="取消" @click-left="toCancel" :right-text="id ? '修改' : '发表'" @click-right="toSubmit" />
  7. </el-col>
  8. <el-col :span="24">
  9. <van-form ref="form" style="margin-top:30px">
  10. <van-field v-model="form.title" name="title" label="标题" placeholder="请输入标题" :rules="[{ required: true, message: '请填写标题' }]" />
  11. <van-field v-model="form.website" name="website" label="网址" placeholder="请输入标题" />
  12. <van-field name="uploader" label="封面上传">
  13. <template #input>
  14. <van-uploader
  15. :fileList="form.imgUrl"
  16. :max-count="1"
  17. :after-read="file => toUpload(file, 'imgUrl')"
  18. @delete="file => toDelete(file, 'imgUrl')"
  19. />
  20. </template>
  21. </van-field>
  22. <van-field name="uploader" label="文章视频">
  23. <template #input>
  24. <van-uploader
  25. :fileList="form.fileUrl"
  26. :max-count="1"
  27. @delete="file => toDelete(file, 'fileUrl')"
  28. :after-read="file => toUpload(file, 'fileUrl')"
  29. />
  30. </template>
  31. </van-field>
  32. <van-field v-model="form.content" rows="2" autosize type="textarea" placeholder="请输入本文内容" />
  33. </van-form>
  34. </el-col>
  35. <el-col :span="24" class="foot">
  36. <foot></foot>
  37. </el-col>
  38. </el-col>
  39. </el-row>
  40. </div>
  41. </template>
  42. <script>
  43. const _ = require('lodash');
  44. import foot from '@/layout/common/foot.vue';
  45. const moment = require('moment');
  46. import { mapState, createNamespacedHelpers } from 'vuex';
  47. const { mapActions: upload } = createNamespacedHelpers('upload');
  48. const { mapActions: refute } = createNamespacedHelpers('refute');
  49. export default {
  50. name: 'edit',
  51. props: {},
  52. components: { foot },
  53. data: function() {
  54. return {
  55. form: {},
  56. };
  57. },
  58. created() {
  59. if (this.id) this.search();
  60. },
  61. methods: {
  62. ...upload(['upload']),
  63. ...refute(['create', 'fetch', 'update']),
  64. async search() {
  65. const res = await this.fetch(this.id);
  66. if (this.$checkRes(res, null, res.errmsg || '未找到指定数据')) {
  67. let dup = _.cloneDeep(res.data);
  68. if (_.get(dup, 'imgUrl')) dup.imgUrl = [{ url: dup.imgUrl }];
  69. if (_.get(dup, 'fileUrl')) dup.fileUrl = [{ url: dup.fileUrl }];
  70. this.$set(this, `form`, dup);
  71. }
  72. },
  73. async toSubmit() {
  74. let dup = _.cloneDeep(this.form);
  75. let res;
  76. // 需要处理imgUrl和fileUrl
  77. if (_.get(dup, 'imgUrl')) dup.imgUrl = _.get(dup.imgUrl, '0.url');
  78. if (_.get(dup, 'fileUrl')) dup.fileUrl = _.get(dup.fileUrl, '0.url');
  79. if (this.id) {
  80. dup.renew_time = moment().format('YYYY-MM-DD HH:mm:ss');
  81. res = await this.update(dup);
  82. } else {
  83. // user_id,origin需要加进数据中
  84. dup.user_id = this.user._id;
  85. res = await this.create(dup);
  86. }
  87. if (this.$checkRes(res, '保存成功', res.errmsg || '保存失败')) {
  88. this.toCancel();
  89. }
  90. },
  91. async toUpload({ file }, model) {
  92. // 上传,赋值
  93. const res = await this.upload({ file, dir: 'refute' });
  94. if (this.$checkRes(res)) {
  95. this.$set(this.form, model, [{ url: res.uri }]);
  96. }
  97. },
  98. toCancel() {
  99. this.$router.push('/adminRefute');
  100. },
  101. toDelete(file, model) {
  102. const index = this.form[model].findIndex(f => _.isEqual(f, file));
  103. this.form[model].splice(index, 1);
  104. },
  105. },
  106. computed: {
  107. ...mapState(['user', 'menuParams']),
  108. pageTitle() {
  109. return `${this.$route.meta.title}`;
  110. },
  111. id() {
  112. return this.$route.query.id;
  113. },
  114. },
  115. metaInfo() {
  116. return { title: this.$route.meta.title };
  117. },
  118. };
  119. </script>
  120. <style lang="less" scoped>
  121. .main {
  122. .top {
  123. height: 40px;
  124. overflow: hidden;
  125. border-bottom: 1px solid #f1f1f1;
  126. }
  127. .info {
  128. overflow-x: hidden;
  129. overflow-y: auto;
  130. }
  131. .foot {
  132. height: 50px;
  133. overflow: hidden;
  134. border-top: 1px solid #f1f1f1;
  135. }
  136. }
  137. </style>