This commit is contained in:
lijing
2026-08-24 15:37:43 +08:00
parent ec5ca29207
commit 35deb3b115
4 changed files with 281 additions and 235 deletions
+11
View File
@@ -21,6 +21,7 @@ export default {
getselectBySchIdAndGradeId:BaseUrl + "/api/schclass/selectBySchIdAndGradeId",//通过学校ID、年级ID获取班级下拉
getselectBySchsystemId:BaseUrl + "/api/grade/selectBySchsystemId",//通过学制ID获取年级下拉
getTeacherTree:BaseUrl + "/api/tree/getTeacherTree",//获取教师选人树
getClassHistoryTree:BaseUrl + "/api/tree/getClassHistoryTree",//获取历年班级树
//学制选择
getschsystemlist: BaseUrl + "/api/schsystem/list",//获取学校绑定学制列表
@@ -105,6 +106,10 @@ export default {
getsearchTransferOut: BaseUrl + "/api/teacher/searchTransferOut",//教师转出教师列表
teacherdownloadTemplate: BaseUrl + "/api/teacher/downloadTemplate",//下载教师模版
teacherImport: BaseUrl + "/api/teacher/Import",//教师导入
addGroup: BaseUrl + "/api/usergroup/addGroup",//同步添加子组
editGroup: BaseUrl + "/api/usergroup/editGroup",//同步编辑子组
deleteGroup: BaseUrl + "/api/usergroup/deleteGroup",//同步删除子组
moveGroup: BaseUrl + "/api/usergroup/moveGroup",//同步移动子组
// 教师任教
getteachssearch: BaseUrl + "/api/teachs/search",//获取任教列表
@@ -150,6 +155,12 @@ export default {
getbaseSchAbnormalSearch: BaseUrl + "/api/student/baseSchAbnormalSearch",//获取K12学生异动列表
gethigherSchAbnormalSearch: BaseUrl + "/api/student/higherSchAbnormalSearch",//获取高校学生异动列表
//历史查询
getClass: BaseUrl + "/api/history/getClass",//获取班级信息
getHistoryClassTeach: BaseUrl + "/api/history/getHistoryClassTeach",//获取历史任教信息
getHistoryClassStudent: BaseUrl + "/api/history/getHistoryClassStudent",//获取历史班级信息
getHistoryClassTeachByStuId: BaseUrl + "/api/history/getHistoryClassTeachByStuId",//通过学生id获取历史任教信息
//日志管理
getlogsearch: BaseUrl + "/api/log/search",//获取日志列表
+172 -178
View File
@@ -2,22 +2,17 @@
<div class="class-history-wrap">
<!-- 左侧树形区域:固定高度纵向滚动、单选、默认首班级选中 -->
<div class="left-tree-box">
<Tree
:data="treeData"
ref="tree"
single
:selected.sync="selectedTreeNode"
@on-select="treeNodeChange"
></Tree>
<my-tree :treeData="treeData" :selectId="selectnodeid" @on-tree-click="treeLink"></my-tree>
</div>
<!-- 右侧主内容区域 -->
<div class="right-main">
<!-- 顶部基础信息栏 -->
<div class="top-info-bar">
<span class="info-item">学级:{{ currentGrade }}</span>
<span class="info-item">班级:{{ currentClassName }}</span>
<span class="info-item">入学时间:{{ enrollDate }}</span>
<span v-if="ClassMap.schType==2" class="info-item">专业:{{ ClassMap.majorsName }}</span>
<span class="info-item"><b>学级:</b>{{ ClassMap.gradeName }}</span>
<span class="info-item"><b>班级:</b>{{ ClassMap.name }}</span>
<span class="info-item"><b>入学时间:</b>{{ ClassMap.createDate }}</span>
</div>
<!-- 标签页切换:历史任教 / 历史学生 -->
@@ -25,143 +20,76 @@
<TabPane label="历史任教" name="teach"></TabPane>
<TabPane label="历史学生" name="student"></TabPane>
</Tabs>
<!-- 筛选头部行 -->
<div class="filter-bar">
<span>日期:{{ dateRange }} &nbsp;&nbsp;年级:{{ currentGradeShort }}</span>
<span v-if="activeTab === 'student'" style="margin-left:20px">学生数:{{ studentTotal }}</span>
</div>
<!-- 滚动内容容器:高度自适应溢出滚动 -->
<div class="scroll-content-box">
<!-- 历史任教布局 -->
<div v-if="activeTab === 'teach'" class="teach-wrap">
<div class="item-card" v-for="(item,idx) in teachList" :key="idx">
<div class="card-title">{{ item.subject }}</div>
<div class="card-value">{{ item.teacher }}</div>
<div v-if="activeTab === 'teach'" v-for="(item,index) in HistoryClassTeachList" :key="index">
<!-- 筛选头部行 -->
<div class="filter-bar">
<span>日期:{{ item.yearDate }}</span>
<span v-if="ClassMap.schType==2" style="margin-left:20px">学年:{{ item.gradeName }}</span>
<span v-else style="margin-left:20px">年级:{{ item.gradeName }}</span>
</div>
<!-- 历史任教布局 -->
<div class="teach-wrap">
<div class="item-card" v-for="(itt,idx) in item.teach" :key="idx">
<div class="card-title">{{ itt.subName }}</div>
<div class="card-value">{{ itt.teacherName }}</div>
</div>
</div>
</div>
<!-- 历史学生布局 -->
<div v-if="activeTab === 'student'" class="student-wrap">
<div class="item-card student-card" style="cursor: pointer;" v-for="(item,idx) in studentList" :key="idx" @click="tolink(item)">
{{ item.name }}<span v-if="item.idCard">({{ item.idCard }})</span>
<div v-if="activeTab === 'student'" v-for="(item,index) in HistoryClassStudentList" :key="index">
<!-- 筛选头部行 -->
<div class="filter-bar">
<span>日期:{{ item.yearDate }}</span>
<span v-if="ClassMap.schType==2" style="margin-left:20px">学年:{{ item.gradeName }}</span>
<span v-else style="margin-left:20px">年级:{{ item.gradeName }}</span>
<span style="margin-left:20px">学生数:{{ item.student.length }}</span>
</div>
<!-- 历史学生布局 -->
<div class="student-wrap">
<div class="item-card student-card" style="cursor: pointer;" v-for="(itt,idx) in item.student" :key="idx" @click="tolink(item)">
{{ itt.StuName }}
<!-- <span v-if="itt.teacherName">({{ itt.teacherName }})</span> -->
</div>
</div>
</div>
</div>
<!-- 底部分页固定区域(预留分页逻辑) -->
<div class="page-bottom-bar">
<span>共 {{ activeTab === 'teach' ? teachList.length : studentTotal }} 条</span>
<Page
v-if="needPage"
:current.sync="pageNum"
:page-size="pageSize"
:total="activeTab === 'teach' ? teachList.length : studentTotal"
:page-size-opts="[20,40,60]"
show-sizer
@on-change="pageChange"
@on-page-size-change="sizeChange"
></Page>
</div>
</div>
</div>
</template>
</template>
<script>
import myTree from "../components/my_tree";
export default {
name: 'ClassHistoryPage',
components: { myTree },
data() {
return {
// 树形配置
treeData: [
{
title: '上海市进才中学北校',
expand: true,
children: [
{
title: '2025级(预备)',
expand: true,
children: [
{ title: '1班' },{ title: '2班' },{ title: '3班' },{ title: '4班' },{ title: '5班' },
{ title: '6班' },{ title: '7班' },{ title: '8班' },{ title: '9班' },{ title: '10班' },
{ title: '11班' },{ title: '12班' },{ title: '13班' },{ title: '14班' },{ title: '15班' },
{ title: '16班' },{ title: '17班' },{ title: '18班' },{ title: '19班' },{ title: '20班' },
{ title: '21班' },{ title: '22班' },{ title: '23班' },
]
},
{ title: '2024级(初一)', expand: true, children: [] },
{ title: '2023级(初二)', expand: true, children: [] },
]
}
],
selectedTreeNode: null,
currentClassName: '1班',
currentGrade: '2025级',
currentGradeShort: '预备',
enrollDate: '2025-07-11',
dateRange: '2025-07-11 - 2026-07-15',
treeData: [],
ClassMap:{
gradeName:'',
name:'',
createDate:'',
graduate:'',
majorsName:'',
schType:'',
},
selectnodeid:'',
schsystemId:'',
gradeId:'',
classId:'',
// 标签页
activeTab: 'teach',
// 任教数据
teachList: [
{ subject: '班主任', teacher: '伍芳芳' },
{ subject: '语文', teacher: '卫红' },
{ subject: '数学', teacher: '伍芳芳' },
{ subject: '英语', teacher: '俞莉玉' },
{ subject: '体育', teacher: '郑浩淼' },
{ subject: '美术', teacher: '蔡婷婷' },
{ subject: '科学', teacher: '游宝玲' },
{ subject: '劳技', teacher: '牛乐' },
{ subject: '地理', teacher: '沈晓燕' },
{ subject: '音乐', teacher: '李海昆' },
{ subject: '心理', teacher: '展望' },
{ subject: '道德与法治', teacher: '郭雨佳' },
{ subject: '班主任', teacher: '伍芳芳' },
{ subject: '劳动', teacher: '牛乐' },
{ subject: '信息科技', teacher: '张颖' },
{ subject: '副班主任', teacher: '展望' },
{ subject: '校本(劳动教育)', teacher: '牛乐' },
{ subject: '体育与健康', teacher: '郑浩淼' },
{ subject: '二外', teacher: '季思飞' },
{ subject: '校本(心理+二外)', teacher: '数字化中心09' },
],
HistoryClassTeachList:[],
// 学生数据
studentTotal: 48,
studentList: [
{ name: '金俊辰', idCard: '' },
{ name: '周泽恒', idCard: '310115201404031836' },
{ name: '杨城宁', idCard: '310115201406110407' },
{ name: '李琪琪', idCard: '310115201403072281' },
{ name: '浦森隽', idCard: '310115201311290011' },
{ name: '沈奕欣', idCard: '310115201402286384' },
{ name: '李赛乐', idCard: '31011520131110037X' },
{ name: '林欣宜', idCard: '310109201403261560' },
{ name: '胡艺涵', idCard: '310115201403251167' },
{ name: '周维哲', idCard: '310115201311182221' },
{ name: '曹维德', idCard: '310115201311182213' },
{ name: '陈茂萌', idCard: '310115201406020516' },
{ name: '施锐朗', idCard: '31011520140412491X' },
{ name: '袁唯格', idCard: '310115201401270022' },
{ name: '徐睿辰', idCard: '310115201406284490' },
{ name: '姚欣蕊', idCard: '310115201402161848' },
{ name: '王立仁', idCard: '310115201312030377' },
{ name: '朱思媛', idCard: '310115201407220026' },
{ name: '李文心', idCard: '310115201312165167' },
{ name: '刘烁恒', idCard: '310115201407273873' },
{ name: '严潇宇', idCard: '310115201312120372' },
{ name: '唐羿', idCard: '310107201401013958' },
{ name: '于楚涵', idCard: '230110201408063729' },
{ name: '肖梦晞', idCard: '340102201401081524' },
{ name: '郑聿铭', idCard: '310114201401071633' },
{ name: '宗柠', idCard: '310115201310094481' },
{ name: '张子煜', idCard: '310115201401292619' },
{ name: '刘孜宸', idCard: '430602201312280205' },
{ name: '潘思羽', idCard: '310115201312310280' },
],
HistoryClassStudentList: [],
// 分页配置
needPage: false,
@@ -170,66 +98,132 @@
total: 0
}
},
watch: {
// 切换标签页重新初始化拖拽
activeTab(val) {
if (val === 'teach') {
this.getHistoryClassTeach();
}else{
this.getHistoryClassStudent();
}
}
},
created() {
// 页面初始化:自动选中最后一级第一个班级(2025级(预备) -> 1班)
this.initDefaultSelectTree()
this.loadClassDetail()
this.getClassTree()
},
methods: {
// 默认选中叶子第一个班级
initDefaultSelectTree() {
const schoolNode = this.treeData[0]
const targetGrade = schoolNode.children.find(g => g.title === '2025级(预备)')
if (targetGrade && targetGrade.children.length) {
this.selectedTreeNode = targetGrade.children[0]
this.currentClassName = this.selectedTreeNode.title
this.currentGrade = '2025级'
this.currentGradeShort = '预备'
}
//获取班级树
getClassTree:function(){
const _this = this;
var item={};
_this.$api.get(APIConfig.BschClassSystem.getClassHistoryTree, item, resp => {
if(resp.code==0)
{
this.treeData=resp.data;
if(resp.data.children.length>0){
// 起始节点为 data
const pathArr = _this.getFirstPath(resp.data);
_this.schsystemId=pathArr[pathArr.length-1].schsystemId;
_this.gradeId=pathArr[pathArr.length-1].gradeId+'';
_this.classId=pathArr[pathArr.length-1].classId+'';
_this.selectnodeid=pathArr[pathArr.length-1].id;
_this.getClass();
_this.getHistoryClassTeach();
}
}
});
},
// 树节点点击切换
treeNodeChange(node) {
// 只响应叶子班级节点,过滤年级、学校父节点
if (!node.children || node.children.length === 0) {
this.currentClassName = node.title
this.pageNum = 1
this.loadClassDetail()
}
},
// 加载班级对应任教/学生数据
loadClassDetail() {
console.log('当前选中班级:', this.currentGrade + this.currentClassName)
// 此处可替换后端接口请求
/*
this.$axios.get('/api/class/history', {
params: {
grade: this.currentGrade,
className: this.currentClassName,
tabType: this.activeTab
//获取最后一级的map
getFirstPath(rootNode) {
const path = [];
let cur = rootNode;
while (cur) {
// 存入当前层级关键信息
path.push({
id: cur.id,
name: cur.name,
type: cur.type,
schsystemId:cur.schsystemId,
gradeId:cur.gradeId,
classId:cur.classId,
});
// 有子节点就取第一个,没有就终止
if (cur.children && cur.children.length > 0) {
cur = cur.children[0];
} else {
cur = null;
}
}).then(res => {
this.teachList = res.data.teachList
this.studentList = res.data.studentList
this.studentTotal = res.data.studentTotal
this.total = this.activeTab === 'teach' ? this.teachList.length : this.studentTotal
})
*/
}
return path;
},
// 树形选中切换
treeLink(treeNode) {
this.schsystemId=treeNode.schsystemId;
this.gradeId=treeNode.gradeId?treeNode.gradeId+'':'';
this.classId=treeNode.classId?treeNode.classId+'':'';
this.selectnodeid=treeNode.id;
this.pageNum = 1;
this.getClass();
if (this.activeTab === 'teach') {
this.getHistoryClassTeach();
}else{
this.getHistoryClassStudent();
}
},
//获取班级信息
getClass:function(){
const _this = this;
var item={
gradeId:_this.gradeId,
classId:_this.classId
};
_this.$api.get(APIConfig.BschClassSystem.getClass, item, resp => {
if(resp.code==0)
{
this.ClassMap={
gradeName:resp.data.gradeName,
name:resp.data.name,
createDate:resp.data.createDate,
graduate:resp.data.graduate,
majorsName:resp.data.majorsName,
schType:resp.data.schType
};
}
});
},
//获取历史任教信息
getHistoryClassTeach:function(){
const _this = this;
var item={
gradeId:_this.gradeId,
classId:_this.classId
};
_this.$api.get(APIConfig.BschClassSystem.getHistoryClassTeach, item, resp => {
if(resp.code==0)
{
this.HistoryClassTeachList=resp.data;
}
});
},
//获取历史学生信息
getHistoryClassStudent:function(){
const _this = this;
var item={
gradeId:_this.gradeId,
classId:_this.classId
};
_this.$api.get(APIConfig.BschClassSystem.getHistoryClassStudent, item, resp => {
if(resp.code==0)
{
this.HistoryClassStudentList=resp.data;
}
});
},
//跳转详情
tolink(item){
this.$router.push({path:'/historySearchDetail'});
this.$router.push({path:'/historySearchDetail?stuId='+item.stuId+'&studentName='+item.studentName+'&className='+item.className});
},
// 分页切换
pageChange(p) {
this.pageNum = p
this.loadClassDetail()
},
sizeChange(size) {
this.pageSize = size
this.pageNum = 1
this.loadClassDetail()
}
}
}
</script>
@@ -262,9 +256,9 @@
/* 顶部班级信息行 */
.top-info-bar {
font-size: 20px;
font-size: 18px;
font-weight: 500;
padding: 8px 0 12px;
padding: 0px 0 12px;
}
.info-item {
margin-right: 30px;
@@ -282,7 +276,7 @@
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 10px 0;
/* padding: 10px 0; */
}
/* 任教方块流式布局 */
+38 -46
View File
@@ -4,70 +4,62 @@
<div class="top-header-bar">
<div class="left-info">
<span class="label">当前学生:</span>
<span class="text">{{ studentName }}</span>
<span class="text">{{ $route.query.studentName }}</span>
<span class="label" style="margin-left: 24px;">当前班级:</span>
<span class="text">{{ className }}</span>
<span class="text">{{ $route.query.className }}</span>
</div>
<Button type="primary" @click="goBack">返回上一级</Button>
</div>
<!-- 时间段+学校班级栏 -->
<div class="time-school-bar">
<span>日期:{{ dateRange }}</span>
<span style="margin-left: 20px;">{{ schoolName }} &nbsp;&nbsp;{{ className }}</span>
</div>
<!-- 科目教师卡片流式容器,超出纵向滚动 -->
<div class="card-scroll-wrap">
<div class="card-container">
<div class="subject-card" v-for="(item, index) in subjectList" :key="index">
<div class="card-title">{{ item.subject }}</div>
<div class="card-teacher">{{ item.teacher }}</div>
<div v-for="(item,index) in HistoryClassTeachByStuIdList" :key="index">
<!-- 时间段+学校班级栏 -->
<div class="time-school-bar">
<span>日期:{{ item.yearDate }}</span>
<span style="margin-left: 20px;">{{ item.schoolName }} &nbsp;&nbsp;{{ item.className }}</span>
</div>
<!-- 科目教师卡片流式容器,超出纵向滚动 -->
<div class="card-scroll-wrap">
<div class="card-container">
<div class="subject-card" v-for="(itt, index) in item.teach" :key="index">
<div class="card-title">{{ itt.subName }}</div>
<div class="card-teacher">{{ itt.teacherName }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
</template>
<script>
export default {
name: 'StudentTeachDetail',
data() {
return {
// 头部信息
studentName: '朱思媛',
className: '预备1班',
schoolName: '上海市进才中学北校',
dateRange: '2025-07-11~2026-07-15',
// 科目+教师数据源(完全匹配截图)
subjectList: [
{ subject: '班主任', teacher: '伍芳芳' },
{ subject: '副班主任', teacher: '未设置' },
{ subject: '语文', teacher: '卫红' },
{ subject: '数学', teacher: '伍芳芳' },
{ subject: '英语', teacher: '俞莉玉' },
{ subject: '体育', teacher: '郑浩淼' },
{ subject: '美术', teacher: '蔡婷婷' },
{ subject: '科学', teacher: '游宝玲' },
{ subject: '劳技', teacher: '牛乐' },
{ subject: '地理', teacher: '沈晓燕' },
{ subject: '音乐', teacher: '李海昆' },
{ subject: '心理', teacher: '展望' },
{ subject: '道德与法治', teacher: '郭雨佳' },
{ subject: '班主任', teacher: '伍芳芳' },
{ subject: '劳动', teacher: '牛乐' },
{ subject: '信息科技', teacher: '张颖' },
{ subject: '副班主任', teacher: '展望' },
{ subject: '校本(劳动教育)', teacher: '牛乐' },
{ subject: '体育与健康', teacher: '郑浩淼' },
{ subject: '二外', teacher: '季思飞' },
{ subject: '校本(心理+二外)', teacher: '数字化中心09' }
]
HistoryClassTeachByStuIdList: []
}
},
created(){
if(this.$route.query.stuId){
this.getHistoryClassTeachByStuId();
}
},
methods: {
//通过学生Id获取历史任教信息
getHistoryClassTeachByStuId:function(){
const _this = this;
var item={
stuId:_this.$route.query.stuId
};
_this.$api.get(APIConfig.BschClassSystem.getHistoryClassTeachByStuId, item, resp => {
if(resp.code==0)
{
this.HistoryClassTeachByStuIdList=resp.data;
}
});
},
// 返回上一页
goBack() {
this.$router.go(-1)
+60 -11
View File
@@ -231,7 +231,7 @@
</div>
<div style="margin-top:10px">
<span>移动至:</span>
<Tree :data="treeData" ref="moveGroupTreeRef"></Tree>
<my-tree :treeData="treeData" @on-tree-click="movetreeLink"></my-tree>
</div>
<div slot="footer" align="right">
<Button @click="moveGroupModal = false" style="margin-right:10px">取消</Button>
@@ -339,6 +339,8 @@ export default {
selectnodetitle: '',
selectnodetype:7,
searchKeyword: '',
selectparentId:0,
moveselectnodeid:0,
selectedRows: [],
pageNum: 1,
pageSize: 20,
@@ -499,6 +501,7 @@ export default {
_this.selectnodeid=resp.data.id;
_this.selectnodetitle=resp.data.name;
_this.selectnodetype=resp.data.type;
_this.selectparentId=resp.data.parentId;
_this.loadData();
}
});
@@ -508,6 +511,8 @@ export default {
this.selectnodeid=treeNode.id;
this.selectnodetitle=treeNode.name;
this.selectnodetype=treeNode.type;
this.editGroupFormData.sort=treeNode.sort;
this.selectparentId=treeNode.parentId;
this.pageNum = 1
this.loadData()
},
@@ -814,8 +819,21 @@ export default {
submitAddGroup() {
this.$refs.addGroupForm.validate(valid => {
if (!valid) return;
this.$Message.success('新增分组成功');
this.addGroupModal = false;
let item={
name:this.addGroupFormData.groupName,
parentId:this.selectnodeid,
sort:this.addGroupFormData.sort
};
const url = APIConfig.BschClassSystem.addGroup;
this.$api.post(url,JSON.stringify(item), resp => {
if (resp.code == 0) {
this.$Message.success('新增分组成功');
this.addGroupModal = false;
this.getTeaTree();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
}
});
})
},
@@ -823,15 +841,27 @@ export default {
if (!this.selectnodeid) return this.$Message.warning('请先选择分组')
this.editGroupIndex = this.selectnodeid;
this.editGroupFormData.groupName = this.selectnodetitle;
this.editGroupFormData.sort = '';
this.editGroupModal = true;
},
submitEditGroup() {
this.$refs.editGroupForm.validate(valid => {
if (!valid) return;
this.selectedTreeNode.title = this.editGroupFormData.groupName;
this.editGroupModal = false;
this.$Message.success('修改分组成功')
let item={
name:this.editGroupFormData.groupName,
id:this.selectnodeid,
parentId:this.selectparentId,
sort:this.editGroupFormData.sort
};
const url = APIConfig.BschClassSystem.editGroup;
this.$api.post(url,JSON.stringify(item), resp => {
if (resp.code == 0) {
this.$Message.success('修改分组成功');
this.editGroupModal = false;
this.getTeaTree();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
}
});
})
},
@@ -840,18 +870,37 @@ export default {
this.moveGroupTargetName = this.selectnodetitle;
this.moveGroupModal = true;
},
// 移动组树形选中切换
movetreeLink(treeNode) {
this.moveselectnodeid=treeNode.id;
},
confirmMoveGroup() {
this.moveGroupModal = false;
this.$Message.success('移动分组成功');
let item={
moveId:this.selectnodeid,
pid:this.moveselectnodeid
};
var url=APIConfig.BschClassSystem.moveGroup;
this.$api.post(url,JSON.stringify(item),(resp)=>{
this.moveGroupModal = false;
this.$Message.success('移动分组成功!');
this.getTeaTree();
});
},
delCurrentGroup() {
if (!this.selectnodeid) return this.$Message.warning('请先选择分组');
this.$Modal.confirm({
title: '提示',
content: `确定删除分组【${this.selectedTreeNode.title}】?`,
content: `确定删除分组【${this.selectnodetitle}】?`,
onOk: () => {
this.$Message.success('删除分组成功');
let item={
id:this.selectnodeid
};
var url=APIConfig.BschClassSystem.deleteGroup;
this.$api.post(url,item,(resp)=>{
this.$Message.success('删除分组成功!');
this.getTeaTree();
});
}
})
}