MatchmakerAudit.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754
  1. <template>
  2. <div class="matchmaker-audit-container">
  3. <h2 class="page-title">红娘审核</h2>
  4. <el-card shadow="never" class="toolbar-card">
  5. <el-row :gutter="20">
  6. <el-col :span="10">
  7. <el-space>
  8. <el-button
  9. type="primary"
  10. :disabled="selectedRows.length === 0"
  11. @click="handleBatchAudit"
  12. >
  13. 批量审核{{ selectedRows.length > 0 ? ` (${selectedRows.length})` : '' }}
  14. </el-button>
  15. <el-button icon="Refresh" @click="resetFilters">重置</el-button>
  16. </el-space>
  17. </el-col>
  18. <el-col :span="14">
  19. <el-space style="justify-content: flex-end; width: 100%;">
  20. <el-input
  21. v-model="filters.name"
  22. placeholder="搜索姓名"
  23. clearable
  24. style="width: 140px"
  25. @keyup.enter="loadList"
  26. />
  27. <el-input
  28. v-model="filters.phone"
  29. placeholder="搜索手机号"
  30. clearable
  31. style="width: 140px"
  32. @keyup.enter="loadList"
  33. >
  34. <template #append>
  35. <el-button icon="Search" @click="loadList" />
  36. </template>
  37. </el-input>
  38. </el-space>
  39. </el-col>
  40. </el-row>
  41. </el-card>
  42. <el-card shadow="never" class="table-card">
  43. <el-table
  44. v-loading="loading"
  45. :data="list"
  46. stripe
  47. @selection-change="handleSelectionChange"
  48. >
  49. <template #empty>
  50. <div class="custom-empty-state">
  51. <el-icon class="empty-icon"><User /></el-icon>
  52. <div class="empty-text">暂无红娘申请</div>
  53. <div class="empty-hint">等待用户提交申请后在此审核</div>
  54. </div>
  55. </template>
  56. <el-table-column type="selection" width="55" :selectable="row => !isAudited(row)" />
  57. <el-table-column type="index" label="序号" width="60" />
  58. <el-table-column prop="name" label="姓名" min-width="100">
  59. <template #default="{ row }">
  60. <span class="data-highlight">{{ row.name || '-' }}</span>
  61. </template>
  62. </el-table-column>
  63. <el-table-column prop="phone" label="手机号" min-width="140" />
  64. <el-table-column prop="age" label="年龄" width="80" align="center" />
  65. <el-table-column prop="gender" label="性别" width="90" align="center">
  66. <template #default="{ row }">
  67. <el-tag size="small" effect="light">
  68. {{ row.gender === 1 ? '男' : row.gender === 2 ? '女' : '未知' }}
  69. </el-tag>
  70. </template>
  71. </el-table-column>
  72. <el-table-column prop="area" label="地区" min-width="140" />
  73. <el-table-column prop="experience" label="经验" min-width="140" show-overflow-tooltip />
  74. <el-table-column prop="introduction" label="简介" min-width="160" show-overflow-tooltip />
  75. <el-table-column prop="createTime" label="申请时间" width="180">
  76. <template #default="{ row }">
  77. <span class="text-muted">{{ row.createTime || row.create_time || '-' }}</span>
  78. </template>
  79. </el-table-column>
  80. <el-table-column label="审核原因" min-width="150" show-overflow-tooltip>
  81. <template #default="{ row }">
  82. <span class="text-muted">{{ row.reason || '-' }}</span>
  83. </template>
  84. </el-table-column>
  85. <el-table-column label="操作" width="250" fixed="right">
  86. <template #default="{ row }">
  87. <el-button
  88. type="info"
  89. size="small"
  90. link
  91. @click="handleViewDetail(row)"
  92. >
  93. 详情
  94. </el-button>
  95. <el-button
  96. v-if="!isAudited(row)"
  97. type="primary"
  98. size="small"
  99. @click="handleAudit(row)"
  100. :loading="approvingId === row.applyId"
  101. >
  102. 审核
  103. </el-button>
  104. <el-tag
  105. v-else-if="row.status === 0"
  106. type="success"
  107. size="small"
  108. effect="light"
  109. >
  110. 审核通过
  111. </el-tag>
  112. <el-tag
  113. v-else-if="row.status === 1"
  114. class="audit-rejected-tag"
  115. size="small"
  116. effect="light"
  117. >
  118. 审核未通过
  119. </el-tag>
  120. <el-button
  121. type="danger"
  122. size="small"
  123. link
  124. @click="handleDelete(row)"
  125. :loading="deletingId === row.applyId"
  126. >
  127. 删除
  128. </el-button>
  129. </template>
  130. </el-table-column>
  131. </el-table>
  132. <div class="pagination-container">
  133. <el-pagination
  134. v-model:current-page="currentPage"
  135. v-model:page-size="pageSize"
  136. :total="total"
  137. :page-sizes="[10, 20, 50, 100]"
  138. layout="total, sizes, prev, pager, next, jumper"
  139. @size-change="loadList"
  140. @current-change="loadList"
  141. />
  142. </div>
  143. </el-card>
  144. <!-- 详情对话框 -->
  145. <el-dialog
  146. v-model="detailDialogVisible"
  147. title="红娘申请详情"
  148. width="800px"
  149. :close-on-click-modal="false"
  150. >
  151. <div v-if="detailData" class="detail-content">
  152. <!-- 基本信息 -->
  153. <el-card shadow="never" class="detail-section">
  154. <template #header>
  155. <div class="section-header">
  156. <el-icon><User /></el-icon>
  157. <span>基本信息</span>
  158. </div>
  159. </template>
  160. <el-descriptions :column="2" border>
  161. <el-descriptions-item label="姓名">
  162. {{ detailData.name || '-' }}
  163. </el-descriptions-item>
  164. <el-descriptions-item label="手机号">
  165. {{ detailData.phone || '-' }}
  166. </el-descriptions-item>
  167. <el-descriptions-item label="邮箱">
  168. {{ detailData.email || '-' }}
  169. </el-descriptions-item>
  170. <el-descriptions-item label="年龄">
  171. {{ detailData.age || '-' }}
  172. </el-descriptions-item>
  173. <el-descriptions-item label="性别">
  174. <el-tag v-if="detailData.gender === 1" type="primary" size="small">男</el-tag>
  175. <el-tag v-else-if="detailData.gender === 2" type="danger" size="small">女</el-tag>
  176. <span v-else>-</span>
  177. </el-descriptions-item>
  178. <el-descriptions-item label="所在地区">
  179. {{ detailData.area || '-' }}
  180. </el-descriptions-item>
  181. <el-descriptions-item label="用户ID">
  182. {{ detailData.userId || '-' }}
  183. </el-descriptions-item>
  184. <el-descriptions-item label="申请ID">
  185. {{ detailData.applyId || '-' }}
  186. </el-descriptions-item>
  187. </el-descriptions>
  188. </el-card>
  189. <!-- 红娘信息 -->
  190. <el-card shadow="never" class="detail-section">
  191. <template #header>
  192. <div class="section-header">
  193. <el-icon><Star /></el-icon>
  194. <span>红娘信息</span>
  195. </div>
  196. </template>
  197. <el-descriptions :column="2" border>
  198. <el-descriptions-item label="婚姻介绍经验" :span="2">
  199. {{ detailData.experience || '-' }}
  200. </el-descriptions-item>
  201. <el-descriptions-item label="可服务时间" :span="2">
  202. {{ detailData.serverTime || '-' }}
  203. </el-descriptions-item>
  204. <el-descriptions-item label="个人简介" :span="2">
  205. <div class="introduction-content">
  206. {{ detailData.introduction || '-' }}
  207. </div>
  208. </el-descriptions-item>
  209. </el-descriptions>
  210. </el-card>
  211. <!-- 审核信息 -->
  212. <el-card shadow="never" class="detail-section" v-if="detailData.status !== null && detailData.status !== undefined">
  213. <template #header>
  214. <div class="section-header">
  215. <el-icon><Document /></el-icon>
  216. <span>审核信息</span>
  217. </div>
  218. </template>
  219. <el-descriptions :column="2" border>
  220. <el-descriptions-item label="审核状态">
  221. <el-tag
  222. v-if="detailData.status === 0"
  223. type="success"
  224. size="small"
  225. >
  226. 审核通过
  227. </el-tag>
  228. <el-tag
  229. v-else-if="detailData.status === 1"
  230. class="audit-rejected-tag"
  231. size="small"
  232. >
  233. 审核未通过
  234. </el-tag>
  235. <el-tag
  236. v-else
  237. type="info"
  238. size="small"
  239. >
  240. 待审核
  241. </el-tag>
  242. </el-descriptions-item>
  243. <el-descriptions-item label="审核原因">
  244. {{ detailData.reason || '-' }}
  245. </el-descriptions-item>
  246. <el-descriptions-item label="申请时间">
  247. {{ detailData.createTime || detailData.create_time || '-' }}
  248. </el-descriptions-item>
  249. <el-descriptions-item label="更新时间">
  250. {{ detailData.updateTime || detailData.update_time || '-' }}
  251. </el-descriptions-item>
  252. </el-descriptions>
  253. </el-card>
  254. </div>
  255. <template #footer>
  256. <el-button @click="detailDialogVisible = false">关闭</el-button>
  257. </template>
  258. </el-dialog>
  259. <!-- 审核弹框 -->
  260. <el-dialog
  261. v-model="auditDialogVisible"
  262. :title="auditDialogTitle"
  263. width="600px"
  264. :close-on-click-modal="false"
  265. >
  266. <!-- 批量审核进度显示 -->
  267. <div v-if="isBatchAudit && batchAuditList.length > 0" class="batch-audit-progress">
  268. 进度:{{ currentBatchIndex }} / {{ batchAuditList.length }}
  269. </div>
  270. <!-- 当前审核数据信息 -->
  271. <div v-if="isBatchAudit && currentBatchRow" class="current-audit-info">
  272. <el-descriptions :column="2" border size="small">
  273. <el-descriptions-item label="姓名">{{ currentBatchRow.name || '-' }}</el-descriptions-item>
  274. <el-descriptions-item label="手机号">{{ currentBatchRow.phone || '-' }}</el-descriptions-item>
  275. <el-descriptions-item label="年龄">{{ currentBatchRow.age || '-' }}</el-descriptions-item>
  276. <el-descriptions-item label="性别">
  277. {{ currentBatchRow.gender === 1 ? '男' : currentBatchRow.gender === 2 ? '女' : '未知' }}
  278. </el-descriptions-item>
  279. <el-descriptions-item label="地区" :span="2">{{ currentBatchRow.area || '-' }}</el-descriptions-item>
  280. </el-descriptions>
  281. </div>
  282. <el-form :model="auditForm" :rules="auditRules" ref="auditFormRef" label-width="100px" style="margin-top: 20px">
  283. <el-form-item label="审核结果" prop="approved">
  284. <el-radio-group v-model="auditForm.approved">
  285. <el-radio :label="true">同意</el-radio>
  286. <el-radio :label="false">不同意</el-radio>
  287. </el-radio-group>
  288. </el-form-item>
  289. <el-form-item label="审核原因" prop="reason">
  290. <el-input
  291. v-model="auditForm.reason"
  292. type="textarea"
  293. :rows="4"
  294. placeholder="请输入审核原因(必填)"
  295. maxlength="500"
  296. show-word-limit
  297. />
  298. </el-form-item>
  299. </el-form>
  300. <template #footer>
  301. <el-button @click="handleCancelBatchAudit">取消</el-button>
  302. <el-button
  303. type="primary"
  304. @click="submitAudit"
  305. :loading="auditSubmitting"
  306. >
  307. {{ isBatchAudit && currentBatchIndex < batchAuditList.length ? '提交并继续' : '确定' }}
  308. </el-button>
  309. </template>
  310. </el-dialog>
  311. </div>
  312. </template>
  313. <script setup>
  314. import { ref, reactive, computed, onMounted } from 'vue'
  315. import { ElMessage, ElMessageBox } from 'element-plus'
  316. import { User, Star, Document } from '@element-plus/icons-vue'
  317. import request from '@/utils/request'
  318. import { API_ENDPOINTS } from '@/config/api'
  319. const loading = ref(false)
  320. const list = ref([])
  321. const total = ref(0)
  322. const currentPage = ref(1)
  323. const pageSize = ref(10)
  324. const approvingId = ref(null)
  325. const deletingId = ref(null)
  326. const selectedRows = ref([])
  327. const auditDialogVisible = ref(false)
  328. const auditSubmitting = ref(false)
  329. const auditFormRef = ref(null)
  330. const currentAuditRow = ref(null)
  331. const isBatchAudit = ref(false)
  332. const batchAuditList = ref([]) // 批量审核的列表
  333. const currentBatchIndex = ref(1) // 当前审核的索引(从1开始)
  334. const currentBatchRow = ref(null) // 当前审核的行数据
  335. const auditDialogTitle = ref('审核') // 弹框标题
  336. // 详情对话框相关
  337. const detailDialogVisible = ref(false)
  338. const detailData = ref(null)
  339. const filters = reactive({
  340. name: '',
  341. phone: ''
  342. })
  343. const auditForm = reactive({
  344. approved: true,
  345. reason: ''
  346. })
  347. const auditRules = {
  348. approved: [
  349. { required: true, message: '请选择审核结果', trigger: 'change' }
  350. ],
  351. reason: [
  352. { required: true, message: '请输入审核原因', trigger: 'blur' },
  353. { min: 1, max: 500, message: '审核原因长度在 1 到 500 个字符', trigger: 'blur' }
  354. ]
  355. }
  356. const loadList = async () => {
  357. loading.value = true
  358. try {
  359. const params = {
  360. page: currentPage.value,
  361. pageSize: pageSize.value
  362. }
  363. if (filters.name && filters.name.trim()) {
  364. params.name = filters.name.trim()
  365. }
  366. if (filters.phone && filters.phone.trim()) {
  367. params.phone = filters.phone.trim()
  368. }
  369. const res = await request.get(API_ENDPOINTS.MATCHMAKER_AUDIT_LIST, { params })
  370. if (res.code === 200) {
  371. const data = res.data || {}
  372. list.value = data.list || data.records || []
  373. total.value = data.total || list.value.length
  374. }
  375. } catch (error) {
  376. console.error('加载审核列表失败:', error)
  377. ElMessage.error('加载审核列表失败')
  378. } finally {
  379. loading.value = false
  380. }
  381. }
  382. const resetFilters = () => {
  383. filters.name = ''
  384. filters.phone = ''
  385. currentPage.value = 1
  386. loadList()
  387. }
  388. // 判断是否已审核通过(根据status字段判断,status=0表示审核通过)
  389. const isApproved = (row) => {
  390. return row.status === 0
  391. }
  392. // 判断是否已审核(status=0或1都表示已审核)
  393. const isAudited = (row) => {
  394. return row.status === 0 || row.status === 1
  395. }
  396. // 表格选择变化
  397. const handleSelectionChange = (selection) => {
  398. selectedRows.value = selection
  399. }
  400. // 打开审核弹框(单个)
  401. const handleAudit = (row) => {
  402. if (!row.userId) {
  403. ElMessage.error('用户ID不存在,无法审核')
  404. return
  405. }
  406. if (isAudited(row)) {
  407. ElMessage.warning('该申请已审核,无需重复操作')
  408. return
  409. }
  410. currentAuditRow.value = row
  411. isBatchAudit.value = false
  412. auditForm.approved = true
  413. auditForm.reason = ''
  414. auditDialogTitle.value = `审核 - ${row.name || '该用户'}`
  415. auditDialogVisible.value = true
  416. }
  417. // 批量审核
  418. const handleBatchAudit = () => {
  419. if (selectedRows.value.length === 0) {
  420. ElMessage.warning('请至少选择一条记录')
  421. return
  422. }
  423. // 过滤掉已审核的记录
  424. const unapprovedRows = selectedRows.value.filter(row => !isAudited(row))
  425. if (unapprovedRows.length === 0) {
  426. ElMessage.warning('所选记录均已审核,无需重复操作')
  427. return
  428. }
  429. // 初始化批量审核列表
  430. batchAuditList.value = unapprovedRows
  431. currentBatchIndex.value = 1
  432. currentAuditRow.value = null
  433. isBatchAudit.value = true
  434. auditForm.approved = true
  435. auditForm.reason = ''
  436. // 设置标题
  437. const count = unapprovedRows.length
  438. auditDialogTitle.value = count > 0 ? `批量审核 (${count}条)` : '批量审核'
  439. // 设置当前审核的行数据
  440. updateCurrentBatchRow()
  441. auditDialogVisible.value = true
  442. }
  443. // 更新当前批量审核的行数据
  444. const updateCurrentBatchRow = () => {
  445. if (isBatchAudit.value && batchAuditList.value.length > 0) {
  446. const index = currentBatchIndex.value - 1
  447. if (index >= 0 && index < batchAuditList.value.length) {
  448. currentBatchRow.value = batchAuditList.value[index]
  449. } else {
  450. currentBatchRow.value = null
  451. }
  452. }
  453. }
  454. // 批量审核分页变化
  455. const handleBatchPageChange = (page) => {
  456. currentBatchIndex.value = page
  457. updateCurrentBatchRow()
  458. // 重置表单
  459. auditForm.approved = true
  460. auditForm.reason = ''
  461. // 清除表单验证状态
  462. if (auditFormRef.value) {
  463. auditFormRef.value.clearValidate()
  464. }
  465. }
  466. // 取消批量审核
  467. const handleCancelBatchAudit = () => {
  468. if (isBatchAudit.value && batchAuditList.value.length > 0) {
  469. ElMessageBox.confirm(
  470. `还有 ${batchAuditList.value.length - currentBatchIndex.value + 1} 条记录未审核,确定要取消吗?`,
  471. '确认取消',
  472. {
  473. confirmButtonText: '确定取消',
  474. cancelButtonText: '继续审核',
  475. type: 'warning'
  476. }
  477. ).then(() => {
  478. auditDialogVisible.value = false
  479. resetBatchAudit()
  480. }).catch(() => {
  481. // 用户选择继续审核,不做任何操作
  482. })
  483. } else {
  484. auditDialogVisible.value = false
  485. resetBatchAudit()
  486. }
  487. }
  488. // 重置批量审核状态
  489. const resetBatchAudit = () => {
  490. batchAuditList.value = []
  491. currentBatchIndex.value = 1
  492. currentBatchRow.value = null
  493. isBatchAudit.value = false
  494. auditDialogTitle.value = '审核'
  495. auditForm.approved = true
  496. auditForm.reason = ''
  497. }
  498. // 提交审核
  499. const submitAudit = async () => {
  500. if (!auditFormRef.value) return
  501. try {
  502. await auditFormRef.value.validate()
  503. auditSubmitting.value = true
  504. if (isBatchAudit.value) {
  505. // 批量审核 - 逐条审核
  506. const row = currentBatchRow.value
  507. if (!row) {
  508. ElMessage.error('当前审核数据不存在')
  509. return
  510. }
  511. approvingId.value = row.applyId
  512. // 使用单条审核接口
  513. const res = await request.post(
  514. `${API_ENDPOINTS.MATCHMAKER_AUDIT_APPROVE}/${row.applyId}`,
  515. null,
  516. {
  517. params: {
  518. userId: row.userId,
  519. approved: auditForm.approved,
  520. reason: auditForm.reason
  521. }
  522. }
  523. )
  524. if (res.code === 200) {
  525. ElMessage.success(
  526. `${row.name || '该用户'} ${auditForm.approved ? '审核通过' : '审核不通过'}成功`
  527. )
  528. // 从批量审核列表中移除已审核的项
  529. const index = currentBatchIndex.value - 1
  530. batchAuditList.value.splice(index, 1)
  531. // 如果还有未审核的记录,自动跳转到下一条
  532. if (batchAuditList.value.length > 0) {
  533. // 删除后,如果当前索引超出范围(说明删除的是最后一条),则跳转到新的最后一条
  534. // 否则保持当前索引不变,因为后面的记录会前移,当前索引对应的就是下一条
  535. if (currentBatchIndex.value > batchAuditList.value.length) {
  536. currentBatchIndex.value = batchAuditList.value.length
  537. }
  538. // 更新标题
  539. const count = batchAuditList.value.length
  540. auditDialogTitle.value = count > 0 ? `批量审核 (${count}条)` : '批量审核'
  541. updateCurrentBatchRow()
  542. // 重置表单
  543. auditForm.approved = true
  544. auditForm.reason = ''
  545. // 清除表单验证状态
  546. if (auditFormRef.value) {
  547. auditFormRef.value.clearValidate()
  548. }
  549. } else {
  550. // 所有记录都已审核完成
  551. ElMessage.success('批量审核完成')
  552. auditDialogVisible.value = false
  553. selectedRows.value = []
  554. resetBatchAudit()
  555. loadList()
  556. }
  557. } else {
  558. ElMessage.error(res.msg || '审核失败')
  559. }
  560. } else {
  561. // 单个审核
  562. const row = currentAuditRow.value
  563. approvingId.value = row.applyId
  564. const res = await request.post(
  565. `${API_ENDPOINTS.MATCHMAKER_AUDIT_APPROVE}/${row.applyId}`,
  566. null,
  567. {
  568. params: {
  569. userId: row.userId,
  570. approved: auditForm.approved,
  571. reason: auditForm.reason
  572. }
  573. }
  574. )
  575. if (res.code === 200) {
  576. ElMessage.success(res.msg || (auditForm.approved ? '审核通过成功' : '审核不通过成功'))
  577. auditDialogVisible.value = false
  578. loadList()
  579. } else {
  580. ElMessage.error(res.msg || '审核失败')
  581. }
  582. }
  583. } catch (error) {
  584. if (error !== false) { // validate 失败会返回 false
  585. console.error('审核失败:', error)
  586. ElMessage.error(error.response?.data?.msg || error.message || '审核失败')
  587. }
  588. } finally {
  589. auditSubmitting.value = false
  590. approvingId.value = null
  591. }
  592. }
  593. // 查看详情
  594. const handleViewDetail = (row) => {
  595. detailData.value = { ...row }
  596. detailDialogVisible.value = true
  597. }
  598. // 删除申请
  599. const handleDelete = async (row) => {
  600. try {
  601. await ElMessageBox.confirm(
  602. `确定要删除 ${row.name || '该用户'} 的红娘申请吗?\n删除后该申请将不再显示在列表中,此操作为逻辑删除。`,
  603. '确认删除',
  604. {
  605. confirmButtonText: '确定删除',
  606. cancelButtonText: '取消',
  607. type: 'warning',
  608. dangerouslyUseHTMLString: false
  609. }
  610. )
  611. deletingId.value = row.applyId
  612. const res = await request.delete(
  613. `${API_ENDPOINTS.MATCHMAKER_AUDIT_DELETE}/${row.applyId}`
  614. )
  615. if (res.code === 200) {
  616. ElMessage.success('删除成功')
  617. loadList()
  618. } else {
  619. ElMessage.error(res.msg || '删除失败')
  620. }
  621. } catch (error) {
  622. if (error !== 'cancel') {
  623. console.error('删除失败:', error)
  624. ElMessage.error(error.response?.data?.msg || error.message || '删除失败')
  625. }
  626. } finally {
  627. deletingId.value = null
  628. }
  629. }
  630. onMounted(loadList)
  631. </script>
  632. <style scoped>
  633. .matchmaker-audit-container {
  634. padding: 20px;
  635. }
  636. .page-title {
  637. margin: 0 0 20px 0;
  638. font-size: 24px;
  639. font-weight: 600;
  640. color: #303133;
  641. }
  642. .toolbar-card {
  643. margin-bottom: 20px;
  644. }
  645. .table-card {
  646. margin-bottom: 20px;
  647. }
  648. .batch-audit-progress {
  649. font-size: 14px;
  650. color: #606266;
  651. font-weight: 500;
  652. margin-bottom: 20px;
  653. padding: 10px 15px;
  654. background-color: #f5f7fa;
  655. border-radius: 4px;
  656. text-align: center;
  657. }
  658. .current-audit-info {
  659. margin-bottom: 20px;
  660. }
  661. .current-audit-info :deep(.el-descriptions__label) {
  662. font-weight: 500;
  663. }
  664. .audit-rejected-tag {
  665. background-color: #f4f4f5;
  666. border-color: #d3d4d6;
  667. color: #909399;
  668. }
  669. .detail-content {
  670. min-height: 200px;
  671. }
  672. .detail-section {
  673. margin-bottom: 20px;
  674. }
  675. .detail-section:last-child {
  676. margin-bottom: 0;
  677. }
  678. .section-header {
  679. display: flex;
  680. align-items: center;
  681. gap: 8px;
  682. font-weight: 500;
  683. }
  684. .introduction-content {
  685. white-space: pre-wrap;
  686. word-break: break-word;
  687. line-height: 1.6;
  688. }
  689. </style>