|
@@ -0,0 +1,145 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <div class="vendor-review">
|
|
|
|
|
+ <div class="header">
|
|
|
|
|
+ <h2>服务商入驻审核</h2>
|
|
|
|
|
+ <el-select v-model="statusFilter" placeholder="审核状态" @change="loadList" style="width: 150px;">
|
|
|
|
|
+ <el-option label="全部" value="" />
|
|
|
|
|
+ <el-option label="待审核" value="pending" />
|
|
|
|
|
+ <el-option label="已通过" value="approved" />
|
|
|
|
|
+ <el-option label="已拒绝" value="rejected" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <el-table :data="list" v-loading="loading" border stripe>
|
|
|
|
|
+ <el-table-column prop="id" label="用户ID" width="80" />
|
|
|
|
|
+ <el-table-column prop="nickname" label="昵称" width="120" />
|
|
|
|
|
+ <el-table-column prop="realName" label="真实姓名" width="120" />
|
|
|
|
|
+ <el-table-column prop="phone" label="手机号" width="140" />
|
|
|
|
|
+ <el-table-column label="服务商类型" width="140">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ {{ vendorTypeLabel(row.vendorType) }}
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column prop="vendorInfo" label="资质说明" min-width="200" show-overflow-tooltip />
|
|
|
|
|
+ <el-table-column label="审核状态" width="100">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ <el-tag :type="statusType(row.vendorStatus)">{{ statusLabel(row.vendorStatus) }}</el-tag>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column prop="vendorRejectReason" label="拒绝原因" width="150" show-overflow-tooltip />
|
|
|
|
|
+ <el-table-column label="操作" width="200" fixed="right">
|
|
|
|
|
+ <template slot-scope="{ row }">
|
|
|
|
|
+ <el-button v-if="row.vendorStatus === 'pending'" type="success" size="small" @click="handleReview(row, 'approve')">通过</el-button>
|
|
|
|
|
+ <el-button v-if="row.vendorStatus === 'pending'" type="danger" size="small" @click="showRejectDialog(row)">拒绝</el-button>
|
|
|
|
|
+ <span v-else class="no-op">—</span>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+
|
|
|
|
|
+ <el-pagination
|
|
|
|
|
+ @size-change="onPageChange"
|
|
|
|
|
+ @current-change="onPageChange"
|
|
|
|
|
+ :current-page="page"
|
|
|
|
|
+ :page-size="size"
|
|
|
|
|
+ :total="total"
|
|
|
|
|
+ layout="total, prev, pager, next"
|
|
|
|
|
+ style="margin-top: 20px; text-align: right;"
|
|
|
|
|
+ />
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 拒绝弹窗 -->
|
|
|
|
|
+ <el-dialog title="填写拒绝原因" :visible.sync="rejectDialogVisible" width="400px">
|
|
|
|
|
+ <el-input v-model="rejectReason" type="textarea" :rows="3" placeholder="请输入拒绝原因" />
|
|
|
|
|
+ <span slot="footer">
|
|
|
|
|
+ <el-button @click="rejectDialogVisible = false">取消</el-button>
|
|
|
|
|
+ <el-button type="danger" @click="confirmReject">确认拒绝</el-button>
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </el-dialog>
|
|
|
|
|
+ </div>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script>
|
|
|
|
|
+import { getVendorList, reviewVendor } from '@/api/vendor'
|
|
|
|
|
+
|
|
|
|
|
+export default {
|
|
|
|
|
+ data() {
|
|
|
|
|
+ return {
|
|
|
|
|
+ list: [],
|
|
|
|
|
+ loading: false,
|
|
|
|
|
+ page: 1,
|
|
|
|
|
+ size: 20,
|
|
|
|
|
+ total: 0,
|
|
|
|
|
+ statusFilter: 'pending',
|
|
|
|
|
+ rejectDialogVisible: false,
|
|
|
|
|
+ rejectTarget: null,
|
|
|
|
|
+ rejectReason: ''
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ mounted() {
|
|
|
|
|
+ this.loadList()
|
|
|
|
|
+ },
|
|
|
|
|
+ methods: {
|
|
|
|
|
+ vendorTypeLabel(type) {
|
|
|
|
|
+ const map = { planner: '成长规划师', activity_provider: '活动提供商', product_supplier: '商品供应商' }
|
|
|
|
|
+ return map[type] || type
|
|
|
|
|
+ },
|
|
|
|
|
+ statusType(status) {
|
|
|
|
|
+ const map = { pending: 'warning', approved: 'success', rejected: 'danger' }
|
|
|
|
|
+ return map[status] || 'info'
|
|
|
|
|
+ },
|
|
|
|
|
+ statusLabel(status) {
|
|
|
|
|
+ const map = { pending: '待审核', approved: '已通过', rejected: '已拒绝' }
|
|
|
|
|
+ return map[status] || status
|
|
|
|
|
+ },
|
|
|
|
|
+ async loadList() {
|
|
|
|
|
+ this.loading = true
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await getVendorList({ page: this.page, size: this.size, status: this.statusFilter })
|
|
|
|
|
+ this.list = res.data.list || []
|
|
|
|
|
+ this.total = res.data.total || 0
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ this.$message.error('加载失败')
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ this.loading = false
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ onPageChange(val) {
|
|
|
|
|
+ this.page = val
|
|
|
|
|
+ this.loadList()
|
|
|
|
|
+ },
|
|
|
|
|
+ async handleReview(row, action) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await reviewVendor({ userId: row.id, action })
|
|
|
|
|
+ this.$message.success('审核完成')
|
|
|
|
|
+ this.loadList()
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ this.$message.error('操作失败')
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ showRejectDialog(row) {
|
|
|
|
|
+ this.rejectTarget = row
|
|
|
|
|
+ this.rejectReason = ''
|
|
|
|
|
+ this.rejectDialogVisible = true
|
|
|
|
|
+ },
|
|
|
|
|
+ async confirmReject() {
|
|
|
|
|
+ if (!this.rejectReason) {
|
|
|
|
|
+ this.$message.warning('请填写拒绝原因')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ await this.handleReview(this.rejectTarget, 'reject')
|
|
|
|
|
+ this.rejectDialogVisible = false
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+</script>
|
|
|
|
|
+
|
|
|
|
|
+<style scoped>
|
|
|
|
|
+.header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ margin-bottom: 20px;
|
|
|
|
|
+}
|
|
|
|
|
+.no-op {
|
|
|
|
|
+ color: #ccc;
|
|
|
|
|
+}
|
|
|
|
|
+</style>
|