news.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template>
  2. <div class="lite">
  3. <el-card class="right list" size="mini" v-if="view == 'list'">
  4. <div slot="header">
  5. <span>{{ columnName }} - 信息列表</span>
  6. <el-button icon="el-icon-plus" style="float: right; padding: 3px 0" type="text" @click="handleNew">发布信息</el-button>
  7. </div>
  8. <data-grid
  9. :data="items"
  10. :meta="fields"
  11. :operation="listOper"
  12. :paging="true"
  13. :total="total"
  14. @query="handleQuery"
  15. @edit="handleEdit"
  16. @delete="handleDelete"
  17. @restore="handleRestore"
  18. @preview="handlePreview"
  19. >
  20. <template slot="post">
  21. <el-table-column width="48" label="..." align="center">
  22. <div slot-scope="scope">
  23. <el-tooltip content="包含附件" class="icon" v-if="scope.row.attachment &amp;&amp; scope.row.attachment.length &gt; 0">
  24. <span><i class="naf-icons naf-icon-attachment"></i></span>
  25. </el-tooltip>
  26. </div>
  27. </el-table-column>
  28. </template>
  29. </data-grid>
  30. </el-card>
  31. <el-card class="right details" size="mini" v-else-if="view == 'form'">
  32. <div slot="header">
  33. <span>{{ columnName }} - {{ form.isNew ? '发布信息' : '修改信息' }}</span>
  34. <el-button icon="el-icon-arrow-left" style="float: right; padding: 3px 10px;" type="text" @click="view = 'list'">返回</el-button>
  35. </div>
  36. <news-form :data="form.data" :is-new="form.isNew" @save="handleSave" @cancel="view = 'list'"> </news-form>
  37. </el-card>
  38. <el-card class="right details" size="mini" v-else>
  39. <div slot="header">
  40. <span>{{ columnName }} - 信息预览</span>
  41. <el-button icon="el-icon-arrow-left" style="float: right; padding: 3px 10px;" type="text" @click="view = 'list'">返回</el-button>
  42. </div>
  43. <preview :data="current" />
  44. </el-card>
  45. </div>
  46. </template>
  47. <script>
  48. import DataGrid from '@naf/data/filter-grid';
  49. // import NewsForm from '@/components/news-form';
  50. import Preview from '@/components/preview';
  51. import { createNamespacedHelpers } from 'vuex';
  52. import config from '@frame/config';
  53. const { pageSize = 10 } = config;
  54. const { mapState, mapActions } = createNamespacedHelpers('news');
  55. const { mapActions: mapDict } = createNamespacedHelpers('naf/dict');
  56. export default {
  57. components: {
  58. // NewsForm,
  59. DataGrid,
  60. Preview,
  61. },
  62. metaInfo: {
  63. title: '信息管理',
  64. },
  65. created() {
  66. this.loadDict('column');
  67. },
  68. mounted() {
  69. this.handleQuery();
  70. },
  71. data() {
  72. return {
  73. view: 'list',
  74. form: {},
  75. fields: [
  76. { name: 'column', label: '栏目', formatter: 'dict:column' },
  77. { name: 'title', label: '标题', listOpts: { width: 200 } },
  78. { name: 'meta.state', label: '状态', formatter: this.statusLabel },
  79. { name: 'meta.createdAt', label: '创建时间', formatter: ['date', 'YYYY-MM-DD HH:mm'] },
  80. { name: 'meta.updatedAt', label: '修改时间', formatter: ['date', 'YYYY-MM-DD HH:mm'] },
  81. ],
  82. listOper: [
  83. ['preview', '预览', 'el-icon-view'],
  84. ['edit', '编辑', 'el-icon-edit'],
  85. ['delete', '删除', 'el-icon-delete', true],
  86. ['restore', '恢复', 'el-icon-refresh', true],
  87. ] /* 操作类型 */,
  88. };
  89. },
  90. methods: {
  91. ...mapActions(['query', 'create', 'delete', 'restore', 'update', 'fetch']),
  92. ...mapDict({ loadDict: 'load' }),
  93. async handleEdit({ id }) {
  94. const res = await this.fetch({ id });
  95. this.$checkRes(res, () => {
  96. this.form = { data: res.data, isNew: false };
  97. this.view = 'form';
  98. });
  99. },
  100. async handlePreview({ id }) {
  101. const res = await this.fetch({ id });
  102. this.$checkRes(res, () => {
  103. this.view = 'preview';
  104. });
  105. },
  106. handleNew() {
  107. this.form = { data: {}, isNew: true };
  108. this.view = 'form';
  109. },
  110. async handleSave(payload) {
  111. let res, msg;
  112. if (payload.isNew) {
  113. res = await this.create({ column: this.column, ...payload });
  114. msg = '信息添加成功';
  115. } else {
  116. const { id } = payload.data;
  117. res = await this.update({ id, ...payload });
  118. msg = '信息修改成功';
  119. }
  120. if (this.$checkRes(res, msg)) {
  121. this.view = 'list';
  122. }
  123. },
  124. async handleDelete({ id }) {
  125. const res = await this.delete({ id });
  126. this.$checkRes(res, '删除数据成功');
  127. },
  128. async handleRestore({ id }) {
  129. const res = await this.restore({ id });
  130. this.$checkRes(res, '恢复数据成功');
  131. },
  132. async handlePost({ id }) {
  133. this.view = 'list';
  134. const res = await this.post({ id });
  135. this.$checkRes(res, '递送公文成功');
  136. },
  137. async handleQuery({ filter, paging } = {}) {
  138. this.view = 'list';
  139. const res = await this.query({ column: this.column, paging });
  140. this.$checkRes(res);
  141. },
  142. statusLabel: (row, column, cellValue, index) => {
  143. switch (cellValue) {
  144. case 0:
  145. return '正常';
  146. case 1:
  147. return '删除';
  148. default:
  149. return cellValue;
  150. }
  151. },
  152. },
  153. computed: {
  154. ...mapState(['items', 'current', 'total']),
  155. column() {
  156. return this.$route.params.column;
  157. },
  158. columnName() {
  159. if (this.column) return this.$dict('column', this.column);
  160. return '';
  161. },
  162. },
  163. watch: {
  164. // call again the method if the route changes
  165. column: 'handleQuery',
  166. },
  167. };
  168. </script>
  169. <style lang="less" scoped>
  170. @import '~@lib/style/lite.less';
  171. </style>