Files
UserclassFront/src/views/electiveClassManageDetail.vue
T
2026-08-12 17:19:37 +08:00

345 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="student-class-page">
<!-- 顶部标题栏 -->
<div class="page-top-bar">
<span class="current-class-txt">当前班级:{{ currentClassName }}</span>
<Button type="primary" @click="backPrevPage">返回上一级</Button>
</div>
<!-- 工具栏 -->
<div class="tool-bar">
<span class="list-title">学生列表</span>
<div class="btn-group">
<Button type="primary" @click="openTransferModal">调班</Button>
<Button type="success" @click="openStudentImportModal">学生导入</Button>
</div>
</div>
<!-- 表格区域 自适应高度滚动 -->
<div class="table-wrap">
<div class="table-scroll-box">
<Table
stripe
:columns="tableColumns"
:data="studentTableData"
height="100%"
:border="false"
@on-selection-change="onTableSelect"
></Table>
</div>
<!-- 底栏:批量删除 + 分页 -->
<div class="page-footer">
<Button type="error" @click="batchDelConfirm">删除</Button>
<div class="pagination-box">
<Page
:current.sync="pageNum"
:page-size.sync="pageSize"
:total="totalCount"
:page-size-opts="[10,20,50]"
show-sizer
show-total
@on-change="loadStudentData"
@on-page-size-change="loadStudentData"
></Page>
</div>
</div>
</div>
<!-- 弹窗1:调班弹窗 -->
<Modal v-model="transferModal" title="调班" width="680">
<Form label-width="100">
<FormItem label="当前班级">
<Input v-model="currentClassName" disabled></Input>
</FormItem>
<FormItem label="*目标班级">
<div class="transfer-search-row">
<Select v-model="transferQuery.grade" placeholder="请选择" style="width:140px">
<Option value="g1">高一</Option>
<Option value="g2">高二</Option>
<Option value="g3">高三</Option>
</Select>
<Input v-model="transferQuery.keyword" placeholder="请输入关键字" style="flex:1;margin:0 10px"></Input>
<Button type="primary" @click="queryTargetClassList">查询</Button>
</div>
<div class="class-btn-box">
<Button
v-for="item in targetClassList"
:key="item.id"
size="small"
:type="selectedTargetId === item.id ? 'primary' : 'default'"
style="margin:6px"
@click="selectedTargetId = item.id"
>
{{ item.name }}
</Button>
</div>
</FormItem>
</Form>
<div slot="footer" align="right">
<Button @click="transferModal = false" style="margin-right:10px">取消</Button>
<Button type="primary" @click="confirmTransferStudent">确定</Button>
</div>
</Modal>
<!-- 弹窗2:学生信息导入 -->
<Modal v-model="importModal" title="学生信息导入" width="460">
<div style="margin-bottom:16px;">
<a href="javascript:;" style="color:#2d78f4">点击链接下载[用户导入模板.xls]</a>
</div>
<Upload action="" :before-upload="()=>false">
<Button icon="ios-cloud-upload-outline">选择要上传的文件</Button>
</Upload>
<div slot="footer" align="right">
<Button @click="importModal = false" style="margin-right:10px">取消</Button>
<Button type="primary" @click="confirmImport">确定</Button>
</div>
</Modal>
<!-- 批量删除二次确认弹窗 -->
<Modal v-model="delConfirmModal" title="提示" width="360">
<Alert type="warning" show-icon>确认删除选中学生?删除后不可恢复</Alert>
<div slot="footer" align="right">
<Button @click="delConfirmModal=false" style="margin-right:10px">取消</Button>
<Button type="error" @click="doBatchDelete">确定删除</Button>
</div>
</Modal>
</div>
</template>
<script>
export default {
name: "ClassStudentManage",
props: {
// 父页面传入当前班级名称与班级ID
classId: {
type: String,
default: ""
},
className: {
type: String,
default: "高一化学培优班"
}
},
data() {
return {
// 班级信息
currentClassName: this.className,
// 分页
pageNum: 1,
pageSize: 10,
totalCount: 19,
// 表格多选
selectedStudentRows: [],
// 表格列配置
tableColumns: [
{ type: "selection", width: 50 },
{ title: "序号", type: "index", align: "center", width: 70 },
{ title: "姓名", key: "name", align: "left" },
{ title: "年级", key: "grade", align: "center" },
{ title: "班级", key: "originClass", align: "center" }
],
// 模拟学生列表数据
studentTableData: [
{ id: 1, name: "潘程", grade: "高一", originClass: "2班" },
{ id: 2, name: "张译匀", grade: "高一", originClass: "9班" },
{ id: 3, name: "宋浩扬", grade: "高一", originClass: "1班" },
{ id: 4, name: "裴劲丰", grade: "高一", originClass: "8班" },
{ id: 5, name: "余知新", grade: "高一", originClass: "8班" },
{ id: 6, name: "刘翰城", grade: "高一", originClass: "14班" },
{ id: 7, name: "于释涵", grade: "高一", originClass: "11班" },
{ id: 8, name: "王梦菡", grade: "高一", originClass: "13班" }
],
// 调班弹窗
transferModal: false,
transferQuery: {
grade: "",
keyword: ""
},
targetClassList: [],
selectedTargetId: null,
// 导入弹窗
importModal: false,
// 删除确认弹窗
delConfirmModal: false
}
},
mounted() {
this.loadStudentData()
},
methods: {
// 返回上一级(父级选修班列表页)
backPrevPage() {
this.$router.back()
},
// 加载学生分页列表
loadStudentData() {
console.log('请求参数', {
classId: this.classId,
page: this.pageNum,
size: this.pageSize
})
// 此处替换后端接口赋值 studentTableData、totalCount
},
// 表格多选事件
onTableSelect(rows) {
this.selectedStudentRows = rows
},
// 打开调班弹窗
openTransferModal() {
if (!this.selectedStudentRows.length) {
return this.$Message.warning("请先勾选需要调班的学生")
}
this.transferModal = true
this.transferQuery = { grade: "", keyword: "" }
this.selectedTargetId = null
this.targetClassList = []
},
// 查询目标可选班级
queryTargetClassList() {
// 模拟接口返回下拉班级列表
this.targetClassList = [
{ id: 1, name: "高三网球1班(2024学年)" },
{ id: 2, name: "高三排球1班(2024学年)" },
{ id: 3, name: "高三女篮1班 (2024学年)" },
{ id: 4, name: "高三男篮1班 (2024学年)" },
{ id: 5, name: "高三羽毛球1班 (2024学年)" },
{ id: 6, name: "高三足球1班 (2024学年)" },
{ id: 7, name: "高三乒乓球1班(2024学年)" },
{ id: 8, name: "高三网球2班(2024学年)" },
{ id: 9, name: "高三排球2班(2024学年)" },
{ id: 10, name: "高三足球2班(2024学年)" }
]
},
// 确认执行调班
confirmTransferStudent() {
if (!this.selectedTargetId) {
return this.$Message.warning("请选择目标班级")
}
this.$Message.success("学生调班完成")
this.transferModal = false
this.loadStudentData()
},
// 打开导入弹窗
openStudentImportModal() {
this.importModal = true
},
confirmImport() {
this.$Message.success("学生导入成功")
this.importModal = false
this.loadStudentData()
},
// 批量删除
batchDelConfirm() {
if (!this.selectedStudentRows.length) {
return this.$Message.warning("请勾选要删除的学生")
}
this.delConfirmModal = true
},
doBatchDelete() {
this.$Message.success("批量删除成功")
this.delConfirmModal = false
this.selectedStudentRows = []
this.loadStudentData()
}
}
}
</script>
<style scoped>
.student-class-page {
width: 100%;
height: 100%;
box-sizing: border-box;
display: flex;
flex-direction: column;
padding: 16px;
gap: 16px;
}
/* 顶部标题栏 */
.page-top-bar {
display: flex;
justify-content: space-between;
align-items: center;
}
.current-class-txt {
font-size: 16px;
font-weight: 500;
}
/* 工具栏 */
.tool-bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 12px;
background: #f7f8fa;
}
.list-title {
font-size: 15px;
font-weight: 500;
}
.btn-group {
display: flex;
gap: 10px;
}
/* 表格容器 自适应高度 */
.table-wrap {
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
.table-scroll-box {
flex: 1;
overflow: hidden;
}
/* 底部分页栏 */
.page-footer {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 12px;
flex-shrink: 0;
}
/* 调班弹窗查询行 */
.transfer-search-row {
display: flex;
align-items: center;
}
.class-btn-box {
max-height: 220px;
overflow-y: auto;
border: 1px solid #e5e7eb;
padding: 8px;
margin-top: 8px;
border-radius: 4px;
}
</style>
<style>
/* 全局穿透 表格样式 与截图一致:无外框无竖线,仅行底横线 */
/deep/ .ivu-table {
border: none !important;
}
/deep/ .ivu-table-header th {
border: none;
border-bottom: 1px solid #eee;
text-align: center;
background: #fff;
}
/deep/ .ivu-table td {
border-left: none !important;
border-right: none !important;
border-bottom: 1px solid #f0f0f0;
}
/deep/ .ivu-table-row {
border: none;
}
/deep/ .ivu-table-stripe .ivu-table-row:nth-child(even) {
background-color: #fafafa;
}
</style>