index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <template>
  2. <basic-container>
  3. <!-- 公告表单组件 -->
  4. <announcement-form
  5. :visible.sync="announcementFormVisible"
  6. :is-edit="isEditMode"
  7. :announcement-id="editAnnouncementId"
  8. @save-success="handleFormSaveSuccess"
  9. />
  10. <!-- 公告列表 -->
  11. <avue-crud
  12. v-if="!announcementFormVisible"
  13. :option="option"
  14. :data="data"
  15. ref="crud"
  16. v-model="form"
  17. :page.sync="page"
  18. :permission="permissionList"
  19. :before-open="beforeOpen"
  20. :table-loading="loading"
  21. @row-update="rowUpdate"
  22. @row-save="rowSave"
  23. @search-change="searchChange"
  24. @search-reset="searchReset"
  25. @selection-change="selectionChange"
  26. @current-change="currentChange"
  27. @size-change="sizeChange"
  28. @refresh-change="refreshChange"
  29. @on-load="onLoad"
  30. >
  31. <template slot="menu" slot-scope="{ row, index }">
  32. <el-button
  33. type="text"
  34. size="small"
  35. icon="el-icon-view"
  36. @click="handleDetail(row)"
  37. >预览</el-button>
  38. <el-button
  39. type="text"
  40. size="small"
  41. icon="el-icon-delete"
  42. @click="handleRowDelete(row)"
  43. >删除</el-button>
  44. </template>
  45. <!-- 客户黑名单字段自定义插槽 -->
  46. <template slot="customerBlacklistForm" slot-scope="{value, column}">
  47. <el-select
  48. v-model="form.customerBlacklist"
  49. multiple
  50. filterable
  51. remote
  52. reserve-keyword
  53. placeholder="请输入客户名称进行搜索"
  54. :remote-method="remoteSearchCustomers"
  55. :loading="customerOptionsLoading"
  56. value-key="id"
  57. @change="handleCustomerBlacklistChange"
  58. @clear="clearCustomerOptions"
  59. style="width: 100%;"
  60. clearable
  61. >
  62. <el-option
  63. v-for="customer in customerBlacklistOptions"
  64. :key="customer.id"
  65. :label="getCustomerDisplayName(customer)"
  66. :value="customer"
  67. >
  68. <span style="float: left">{{ customer.Customer_NAME }}</span>
  69. <span style="float: right; color: #8492a6; font-size: 13px">
  70. {{ customer.Customer_CODE }}
  71. </span>
  72. </el-option>
  73. </el-select>
  74. </template>
  75. <!-- 其他现有插槽 -->
  76. <template slot-scope="{row}" slot="categoryName">
  77. <el-tag type="primary">{{ row.categoryName }}</el-tag>
  78. </template>
  79. <template slot-scope="{row}" slot="status">
  80. <el-tag :type="getStatusTagType(row.status)">
  81. {{ getStatusLabel(row.status) }}
  82. </el-tag>
  83. </template>
  84. <template slot-scope="{row}" slot="visibleRoles">
  85. <span v-for="role in parseRolesMask(row.visibleRoles)" :key="role.value">
  86. <el-tag :type="getRoleTagType(role.value)" size="mini" style="margin-right: 4px;">
  87. {{ role.label }}
  88. </el-tag>
  89. </span>
  90. </template>
  91. </avue-crud>
  92. <!-- 详情对话框 -->
  93. <el-dialog title="公告详情" :visible.sync="detailVisible" append-to-body width="60%" :close-on-click-modal="false">
  94. <div class="detail-content" v-if="currentDetail.id">
  95. <!-- 仅展示富文本内容 -->
  96. <div class="detail-body" v-html="currentDetail.content"></div>
  97. </div>
  98. <span slot="footer" class="dialog-footer">
  99. <el-button @click="detailVisible = false">关 闭</el-button>
  100. </span>
  101. </el-dialog>
  102. </basic-container>
  103. </template>
  104. <script>
  105. import AnnouncementIndexMixin from './mixins/announcementIndex.js';
  106. import AnnouncementForm from '@/components/announcement/index.vue';
  107. /**
  108. * 公告管理组件
  109. * @component NoticeIndex
  110. */
  111. export default {
  112. name: 'NoticeIndex',
  113. components: {
  114. AnnouncementForm
  115. },
  116. mixins: [AnnouncementIndexMixin],
  117. mounted() {
  118. if (typeof this.onShow === 'function') {
  119. this.onShow();
  120. }
  121. },
  122. activated() {
  123. if (typeof this.onShow === 'function') {
  124. this.onShow();
  125. }
  126. }
  127. };
  128. </script>
  129. <style lang="scss" scoped>
  130. @import './index.scss';
  131. </style>