潘志宝
2024-09-09 ed81b7371e376df35448b81531d30dd9024bd44a
提交 | 用户 | 时间
e7c126 1 <template>
H 2   <!-- 列表 -->
3   <ContentWrap>
4     <el-button
5       type="primary"
6       plain
7       @click="openForm('create')"
8       v-hasPermi="['infra:student:create']"
9     >
10       <Icon icon="ep:plus" class="mr-5px" /> 新增
11     </el-button>
12     <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
13       <el-table-column label="编号" align="center" prop="id" />
14        <el-table-column label="名字" align="center" prop="name" />
15       <el-table-column label="简介" align="center" prop="description" />
16       <el-table-column
17         label="出生日期"
18         align="center"
19         prop="birthday"
20         :formatter="dateFormatter"
21         width="180px"
22       />
23       <el-table-column label="性别" align="center" prop="sex">
24         <template #default="scope">
25           <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.sex" />
26         </template>
27       </el-table-column>
28       <el-table-column label="是否有效" align="center" prop="enabled">
29         <template #default="scope">
30           <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.enabled" />
31         </template>
32       </el-table-column>
33       <el-table-column label="头像" align="center" prop="avatar" />
34       <el-table-column label="附件" align="center" prop="video" />
35       <el-table-column label="备注" align="center" prop="memo" />
36       <el-table-column
37         label="创建时间"
38         align="center"
39         prop="createTime"
40         :formatter="dateFormatter"
41         width="180px"
42       />
43       <el-table-column label="操作" align="center">
44         <template #default="scope">
45           <el-button
46             link
47             type="primary"
48             @click="openForm('update', scope.row.id)"
49             v-hasPermi="['infra:student:update']"
50           >
51             编辑
52           </el-button>
53           <el-button
54             link
55             type="danger"
56             @click="handleDelete(scope.row.id)"
57             v-hasPermi="['infra:student:delete']"
58           >
59             删除
60           </el-button>
61         </template>
62       </el-table-column>
63     </el-table>
64     <!-- 分页 -->
65     <Pagination
66       :total="total"
67       v-model:page="queryParams.pageNo"
68       v-model:limit="queryParams.pageSize"
69       @pagination="getList"
70     />
71   </ContentWrap>
72     <!-- 表单弹窗:添加/修改 -->
73     <StudentContactForm ref="formRef" @success="getList" />
74 </template>
75 <script setup lang="ts">
76 import { DICT_TYPE } from '@/utils/dict'
77 import { dateFormatter } from '@/utils/formatTime'
78 import * as StudentApi from '@/api/infra/demo'
79 import StudentContactForm from './StudentContactForm.vue'
80
81 const { t } = useI18n() // 国际化
82 const message = useMessage() // 消息弹窗
83
84 const props = defineProps<{
85   studentId: undefined // 学生编号(主表的关联字段)
86 }>()
87 const loading = ref(false) // 列表的加载中
88 const list = ref([]) // 列表的数据
89 const total = ref(0) // 列表的总页数
90 const queryParams = reactive({
91   pageNo: 1,
92   pageSize: 10,
93   studentId: undefined
94 })
95
96 /** 监听主表的关联字段的变化,加载对应的子表数据 */
97 watch(
98   () => props.studentId,
99   (val) => {
100     queryParams.studentId = val
101     handleQuery()
102   },
103   { immediate: false }
104 )
105
106 /** 查询列表 */
107 const getList = async () => {
108   loading.value = true
109   try {
110     const data = await StudentApi.getStudentContactPage(queryParams)
111     list.value = data.list
112     total.value = data.total
113   } finally {
114     loading.value = false
115   }
116 }
117
118 /** 搜索按钮操作 */
119 const handleQuery = () => {
120   queryParams.pageNo = 1
121   getList()
122 }
123
124 /** 添加/修改操作 */
125 const formRef = ref()
126 const openForm = (type: string, id?: number) => {
127   if (!props.studentId) {
128     message.error('请选择一个学生')
129     return
130   }
131   formRef.value.open(type, id, props.studentId)
132 }
133
134 /** 删除按钮操作 */
135 const handleDelete = async (id: number) => {
136   try {
137     // 删除的二次确认
138     await message.delConfirm()
139     // 发起删除
140     await StudentApi.deleteStudentContact(id)
141     message.success(t('common.delSuccess'))
142     // 刷新列表
143     await getList()
144   } catch {}
145 }
146 </script>