HealthCheckins.vue 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <template>
  2. <div class="health-checkins page-container">
  3. <el-card>
  4. <div slot="header"><span>健康打卡</span></div>
  5. <el-table :data="checkins" v-loading="loading" border stripe :max-height="tableHeight">
  6. <el-table-column prop="id" label="ID" width="80">
  7. <template slot="header">
  8. <span class="sort-header" @click.stop="onSortClick('id', $event)">ID<span v-if="sortIndex('id') !== null" class="sort-index" :class="sortClass('id') === 'sort-asc' ? 'sort-asc-badge' : 'sort-desc-badge'">{{ sortIndex('id') }}</span>{{ sortIcon('id') }}</span>
  9. </template>
  10. </el-table-column>
  11. <el-table-column prop="childName" label="孩子" width="120">
  12. <template slot="header">
  13. <span class="sort-header" @click.stop="onSortClick('childName', $event)">孩子<span v-if="sortIndex('childName') !== null" class="sort-index" :class="sortClass('childName') === 'sort-asc' ? 'sort-asc-badge' : 'sort-desc-badge'">{{ sortIndex('childName') }}</span>{{ sortIcon('childName') }}</span>
  14. </template>
  15. </el-table-column>
  16. <el-table-column prop="checkinType" label="打卡类型" width="120">
  17. <template slot="header">
  18. <span class="sort-header" @click.stop="onSortClick('checkinType', $event)">打卡类型<span v-if="sortIndex('checkinType') !== null" class="sort-index" :class="sortClass('checkinType') === 'sort-asc' ? 'sort-asc-badge' : 'sort-desc-badge'">{{ sortIndex('checkinType') }}</span>{{ sortIcon('checkinType') }}</span>
  19. </template>
  20. </el-table-column>
  21. <el-table-column prop="note" label="备注">
  22. <template slot="header">
  23. <span class="sort-header" @click.stop="onSortClick('note', $event)">备注<span v-if="sortIndex('note') !== null" class="sort-index" :class="sortClass('note') === 'sort-asc' ? 'sort-asc-badge' : 'sort-desc-badge'">{{ sortIndex('note') }}</span>{{ sortIcon('note') }}</span>
  24. </template>
  25. </el-table-column>
  26. <el-table-column prop="createdAt" label="打卡时间" width="180">
  27. <template slot="header">
  28. <span class="sort-header" @click.stop="onSortClick('createdAt', $event)">打卡时间<span v-if="sortIndex('createdAt') !== null" class="sort-index" :class="sortClass('createdAt') === 'sort-asc' ? 'sort-asc-badge' : 'sort-desc-badge'">{{ sortIndex('createdAt') }}</span>{{ sortIcon('createdAt') }}</span>
  29. </template>
  30. </el-table-column>
  31. </el-table>
  32. </el-card>
  33. </div>
  34. </template>
  35. <script>
  36. import SortMixin from '@/mixins/SortMixin'
  37. export default {
  38. mixins: [SortMixin],
  39. name: 'HealthCheckins',
  40. computed: {
  41. tableHeight() {
  42. return window.innerHeight - 280
  43. }
  44. },
  45. data() { return { loading: false, checkins: [], sortableColumns: { id: 'ID', createdAt: '打卡时间', childName: '孩子', checkinType: '打卡类型', note: '备注' } } },
  46. created() { this.loadCheckins() },
  47. methods: {
  48. loadList() { this.loadCheckins() },
  49. async loadCheckins() {
  50. this.loading = true
  51. try {
  52. const baseURL = process.env.VUE_APP_BASE_API || ''
  53. const token = localStorage.getItem('token')
  54. const axios = this.$axios || (await import('axios')).default
  55. const params = {}
  56. if (this.sortState.length > 0) params.sort = this.sortState
  57. const res = await axios.post(baseURL + '/api/health/checkin/list', params, {
  58. headers: { Authorization: 'Bearer ' + token }
  59. })
  60. this.checkins = res.data?.data || []
  61. } catch (e) {
  62. this.$message?.error?.('加载健康打卡失败')
  63. } finally {
  64. this.loading = false
  65. }
  66. }
  67. }
  68. }
  69. </script>
  70. <style scoped>
  71. .sort-header {
  72. cursor: pointer;
  73. user-select: none;
  74. font-weight: 500;
  75. font-size: 12px;
  76. }
  77. .sort-header:hover {
  78. color: #409eff;
  79. }
  80. </style>