houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 <template>
H 2   <ContentWrap>
3     <!-- 搜索工作栏 -->
4     <el-form
5       ref="queryFormRef"
6       :inline="true"
7       :model="queryParams"
8       class="-mb-15px"
9       label-width="68px"
10     >
11       <el-form-item label="名字" prop="name">
12         <el-input
13           v-model="queryParams.name"
14           class="!w-240px"
15           clearable
16           placeholder="请输入名字"
17           @keyup.enter="handleQuery"
18         />
19       </el-form-item>
20       <el-form-item label="性别" prop="sex">
21         <el-select v-model="queryParams.sex" class="!w-240px" clearable placeholder="请选择性别">
22           <el-option
23             v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
24             :key="dict.value"
25             :label="dict.label"
26             :value="dict.value"
27           />
28         </el-select>
29       </el-form-item>
30       <el-form-item label="创建时间" prop="createTime">
31         <el-date-picker
32           v-model="queryParams.createTime"
33           :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
34           class="!w-240px"
35           end-placeholder="结束日期"
36           start-placeholder="开始日期"
37           type="daterange"
38           value-format="YYYY-MM-DD HH:mm:ss"
39         />
40       </el-form-item>
41       <el-form-item>
42         <el-button @click="handleQuery">
43           <Icon class="mr-5px" icon="ep:search" />
44           搜索
45         </el-button>
46         <el-button @click="resetQuery">
47           <Icon class="mr-5px" icon="ep:refresh" />
48           重置
49         </el-button>
50         <el-button
51           v-hasPermi="['infra:demo03-student:create']"
52           plain
53           type="primary"
54           @click="openForm('create')"
55         >
56           <Icon class="mr-5px" icon="ep:plus" />
57           新增
58         </el-button>
59         <el-button
60           v-hasPermi="['infra:demo03-student:export']"
61           :loading="exportLoading"
62           plain
63           type="success"
64           @click="handleExport"
65         >
66           <Icon class="mr-5px" icon="ep:download" />
67           导出
68         </el-button>
69       </el-form-item>
70     </el-form>
71   </ContentWrap>
72
73   <!-- 列表 -->
74   <ContentWrap>
75     <el-table
76       v-loading="loading"
77       :data="list"
78       :show-overflow-tooltip="true"
79       :stripe="true"
80       highlight-current-row
81       @current-change="handleCurrentChange"
82     >
83       <el-table-column align="center" label="编号" prop="id" />
84       <el-table-column align="center" label="名字" prop="name" />
85       <el-table-column align="center" label="性别" prop="sex">
86         <template #default="scope">
87           <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.sex" />
88         </template>
89       </el-table-column>
90       <el-table-column
91         :formatter="dateFormatter"
92         align="center"
93         label="出生日期"
94         prop="birthday"
95         width="180px"
96       />
97       <el-table-column align="center" label="简介" prop="description" />
98       <el-table-column
99         :formatter="dateFormatter"
100         align="center"
101         label="创建时间"
102         prop="createTime"
103         width="180px"
104       />
105       <el-table-column align="center" label="操作">
106         <template #default="scope">
107           <el-button
108             v-hasPermi="['infra:demo03-student:update']"
109             link
110             type="primary"
111             @click="openForm('update', scope.row.id)"
112           >
113             编辑
114           </el-button>
115           <el-button
116             v-hasPermi="['infra:demo03-student:delete']"
117             link
118             type="danger"
119             @click="handleDelete(scope.row.id)"
120           >
121             删除
122           </el-button>
123         </template>
124       </el-table-column>
125     </el-table>
126     <!-- 分页 -->
127     <Pagination
128       v-model:limit="queryParams.pageSize"
129       v-model:page="queryParams.pageNo"
130       :total="total"
131       @pagination="getList"
132     />
133   </ContentWrap>
134
135   <!-- 表单弹窗:添加/修改 -->
136   <Demo03StudentForm ref="formRef" @success="getList" />
137   <!-- 子表的列表 -->
138   <ContentWrap>
139     <el-tabs model-value="demo03Course">
140       <el-tab-pane label="学生课程" name="demo03Course">
141         <Demo03CourseList :student-id="currentRow?.id" />
142       </el-tab-pane>
143       <el-tab-pane label="学生班级" name="demo03Grade">
144         <Demo03GradeList :student-id="currentRow?.id" />
145       </el-tab-pane>
146     </el-tabs>
147   </ContentWrap>
148 </template>
149
150 <script lang="ts" setup>
151 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
152 import { dateFormatter } from '@/utils/formatTime'
153 import download from '@/utils/download'
154 import * as Demo03StudentApi from '@/api/infra/demo/demo03/erp'
155 import Demo03StudentForm from './Demo03StudentForm.vue'
156 import Demo03CourseList from './components/Demo03CourseList.vue'
157 import Demo03GradeList from './components/Demo03GradeList.vue'
158
159 defineOptions({ name: 'Demo03Student' })
160
161 const message = useMessage() // 消息弹窗
162 const { t } = useI18n() // 国际化
163
164 const loading = ref(true) // 列表的加载中
165 const list = ref([]) // 列表的数据
166 const total = ref(0) // 列表的总页数
167 const queryParams = reactive({
168   pageNo: 1,
169   pageSize: 10,
170   name: null,
171   sex: null,
172   description: null,
173   createTime: []
174 })
175 const queryFormRef = ref() // 搜索的表单
176 const exportLoading = ref(false) // 导出的加载中
177
178 /** 查询列表 */
179 const getList = async () => {
180   loading.value = true
181   try {
182     const data = await Demo03StudentApi.getDemo03StudentPage(queryParams)
183     list.value = data.list
184     total.value = data.total
185   } finally {
186     loading.value = false
187   }
188 }
189
190 /** 搜索按钮操作 */
191 const handleQuery = () => {
192   queryParams.pageNo = 1
193   getList()
194 }
195
196 /** 重置按钮操作 */
197 const resetQuery = () => {
198   queryFormRef.value.resetFields()
199   handleQuery()
200 }
201
202 /** 添加/修改操作 */
203 const formRef = ref()
204 const openForm = (type: string, id?: number) => {
205   formRef.value.open(type, id)
206 }
207
208 /** 删除按钮操作 */
209 const handleDelete = async (id: number) => {
210   try {
211     // 删除的二次确认
212     await message.delConfirm()
213     // 发起删除
214     await Demo03StudentApi.deleteDemo03Student(id)
215     message.success(t('common.delSuccess'))
216     // 刷新列表
217     await getList()
218   } catch {}
219 }
220
221 /** 导出按钮操作 */
222 const handleExport = async () => {
223   try {
224     // 导出的二次确认
225     await message.exportConfirm()
226     // 发起导出
227     exportLoading.value = true
228     const data = await Demo03StudentApi.exportDemo03Student(queryParams)
229     download.excel(data, '学生.xls')
230   } catch {
231   } finally {
232     exportLoading.value = false
233   }
234 }
235
236 /** 选中行操作 */
237 const currentRow = ref({}) // 选中行
238 const handleCurrentChange = (row) => {
239   currentRow.value = row
240 }
241
242 /** 初始化 **/
243 onMounted(() => {
244   getList()
245 })
246 </script>