Просмотр исходного кода

feat(article-center): add audit workflow to web admin panel

Sisyphus 2 месяцев назад
Родитель
Сommit
138b84a2a0
2 измененных файлов с 74 добавлено и 2 удалено
  1. 6 0
      cfc-web/src/api/article.js
  2. 68 2
      cfc-web/src/views/admin/ArticleManage.vue

+ 6 - 0
cfc-web/src/api/article.js

@@ -55,6 +55,12 @@ export function adminArticleCategoryDelete(data) {
   return request({ url: '/api/admin/articles/categories/delete', method: 'post', data })
 }
 
+// ===== 文章审核 =====
+
+export function adminArticleAudit(data) {
+  return request({ url: '/api/admin/articles/audit', method: 'post', data })
+}
+
 // ===== 文章详情 =====
 
 export function adminArticleDetail(data) {

+ 68 - 2
cfc-web/src/views/admin/ArticleManage.vue

@@ -50,6 +50,14 @@
             <el-tag v-else size="small" type="warning">已归档</el-tag>
           </template>
         </el-table-column>
+        <el-table-column label="审核状态" width="120">
+          <template slot-scope="{ row }">
+            <el-tag v-if="row.auditStatus === 'approved'" size="small" type="success">已通过</el-tag>
+            <el-tag v-else-if="row.auditStatus === 'pending'" size="small" type="warning">待审核</el-tag>
+            <el-tag v-else-if="row.auditStatus === 'rejected'" size="small" type="danger">已驳回</el-tag>
+            <span v-else>-</span>
+          </template>
+        </el-table-column>
         <el-table-column prop="viewCount" label="阅读" width="70" />
         <el-table-column label="发布时间" width="160">
           <template slot-scope="{ row }">
@@ -59,6 +67,8 @@
         <el-table-column label="操作" width="280" fixed="right">
           <template slot-scope="{ row }">
             <el-button size="mini" type="primary" plain @click="$router.push('/article-edit?id=' + row.id)">编辑</el-button>
+            <el-button v-if="row.auditStatus === 'pending'" size="mini" type="success" @click="handleAudit(row, 'approved')">通过</el-button>
+            <el-button v-if="row.auditStatus === 'pending'" size="mini" type="danger" @click="showRejectDialog(row)">驳回</el-button>
             <el-button v-if="row.status === 'draft'" size="mini" type="success" @click="handlePublish(row)">发布</el-button>
             <el-button v-if="row.status === 'published'" size="mini" type="warning" @click="handleUnpublish(row)">下架</el-button>
             <el-button
@@ -85,6 +95,20 @@
       />
     </el-card>
   </div>
+
+  <!-- 驳回弹窗 -->
+  <el-dialog title="驳回原因" :visible.sync="rejectDialogVisible" width="400px">
+    <el-input
+      type="textarea"
+      :rows="4"
+      v-model="rejectReason"
+      placeholder="请输入驳回原因..."
+    ></el-input>
+    <span slot="footer">
+      <el-button @click="rejectDialogVisible = false">取消</el-button>
+      <el-button type="primary" @click="confirmReject">确认驳回</el-button>
+    </span>
+  </el-dialog>
 </template>
 
 <script>
@@ -93,7 +117,8 @@ import {
   adminArticlePublish,
   adminArticleToggleFeatured,
   adminArticleDelete,
-  adminArticleCategoriesList
+  adminArticleCategoriesList,
+  adminArticleAudit
 } from '@/api/article.js'
 
 export default {
@@ -110,7 +135,10 @@ export default {
         categoryId: '',
         keyword: ''
       },
-      categories: []
+      categories: [],
+      rejectDialogVisible: false,
+      rejectReason: '',
+      currentAuditRow: null
     }
   },
   created() {
@@ -195,6 +223,44 @@ export default {
           this.$message.error(e.message || '删除失败')
         }
       }).catch(() => {})
+    },
+    handleAudit(row, auditStatus) {
+      var self = this
+      this.$confirm('确定' + (auditStatus === 'approved' ? '通过' : '驳回') + '该文章吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(function() {
+        return self.$http.post('/api/admin/articles/audit', {
+          id: row.id,
+          auditStatus: auditStatus,
+          auditReason: auditStatus === 'rejected' ? self.rejectReason : ''
+        })
+      }).then(function(res) {
+        if (res.data && res.data.code === 200) {
+          self.$message.success('审核完成')
+          self.loadList()
+        } else {
+          self.$message.error(res.data && res.data.message || '审核失败')
+        }
+      }).catch(function(e) {
+        if (e !== 'cancel') {
+          self.$message.error('审核失败')
+        }
+      })
+    },
+    showRejectDialog(row) {
+      this.currentAuditRow = row
+      this.rejectReason = ''
+      this.rejectDialogVisible = true
+    },
+    confirmReject() {
+      if (!this.rejectReason.trim()) {
+        this.$message.warning('请填写驳回原因')
+        return
+      }
+      this.rejectDialogVisible = false
+      this.handleAudit(this.currentAuditRow, 'rejected')
     }
   }
 }