<template> <view class="view_body"> <u-navbar :is-back="false" title='班级' title-color="#2E4975" :border-bottom="false" :background="bgc" id="navbar"> </u-navbar> <view class="nocont" v-show="shownocont"> <view class="nocont_tip"> <view class="nocont_tip_img"> <image src="https://file.langsi.online/yasiimg/web/static/uVcz1RzZi6US2NKa0ssl"></image> </view> <view class="nocont_tip_txt">暂无学生,快去添加吧!</view> </view> <view class="nocont_button"> 添加学生 </view> </view> <view class="student_page" v-show="shownocont == false"> <view class="student_page_top"> <view class="search_box"> <view class="check_search"> {{ checkindex == 1 ? '班级' : '学生' }} <!-- <view class="iconfont icon-arow_down"></view> --> </view> <view class="serchbox"> <view class="serchimg"> <image src="https://file.langsi.online/yasiimg/web/static/uVMACkynkipOxuTYDqm0" mode="scaleToFill"> </image> </view> <input type="text" v-model="searchKeyword" placeholder="搜索相关内容..." class="input" placeholder-style="color:#C7CDD3" @input="search()"> </view> </view> <view class="info_box"> <view class="info_cont" style="width:80rpx ;"> <view class="info_cont_top"> 学生人数 </view> <view class="info_cont_bot"> {{totalLastNum}} </view> </view> <view class="info_cont"> <view class="info_cont_top"> 平均成绩/分 </view> <view class="info_cont_bot"> {{totalAvgScore }} </view> </view> <view class="info_cont"> <view class="info_cont_top"> 作业完成度 </view> <view class="info_cont_bot"> {{totalWorkCompletionDegre}}% </view> </view> </view> <view class="chekbox"> <view class="check" :class="checkindex == 1 ? 'act1' : ''" @click="checkindex = 1"> 班级 </view> <view class="check" :class="checkindex == 0 ? 'act1' : ''" @click="checkindex = 0"> 学生 </view> <view class="add"> + 添加 </view> </view> </view> <view class="class_box" v-if="checkindex == 1"> <view class="class_box_top"> <view @click="changeclass()" class="class_box_top_cont"> 班级人数 <view class="iconfont icon-arow_down"></view> <view class="dropdown_box" v-show="classnum"> <view class="dropdown_item" :class="classnumindex == 0 ? 'act2' : ''" @click="chengclassnumindex(0)"> 降序 </view> <view class="dropdown_item" :class="classnumindex == 1 ? 'act2' : ''" @click="chengclassnumindex(1)"> 升序 </view> </view> </view> <view @click="changetext()" class="class_box_top_cont"> 标签文字 <view class="iconfont icon-arow_down"></view> <view class="dropdown_box" v-show="showtext"> <view class="dropdown_item" :class="textindex == 1 ? 'act2' : ''" @click="chengetextindex(1)"> 听力 </view> <view class="dropdown_item" :class="textindex == 2 ? 'act2' : ''" @click="chengetextindex(2)"> 阅读 </view> <view class="dropdown_item" :class="textindex == 3 ? 'act2' : ''" @click="chengetextindex(3)"> 写作 </view> <view class="dropdown_item" :class="textindex == 4 ? 'act2' : ''" @click="chengetextindex(4)"> 口语 </view> </view> </view> <!-- 下拉框内容 --> </view> <view class="class_card" v-for="(item, index) in classlist" v-if="isloding == false" :key="index" @click="toclassdetal(item)"> <view class="class_card_top"> <view class="class_card_left"> <image src=" https://file.langsi.online/yasiimg/web/static/udWNTRG6GulmTtgPRQ49"></image> </view> <view class="class_card_right"> <view class="class_card_right_top" v-html="highlightSearch(item.name)"> <!-- {{ item.name }} --> </view> <view class="class_card_right_bot" v-show="item.classify == 1"> 听力 </view> <view class="class_card_right_bot" v-show="item.classify == 2"> 阅读 </view> <view class="class_card_right_bot" v-show="item.classify == 3"> 写作 </view> <view class="class_card_right_bot" v-show="item.classify == 4"> 口语 </view> </view> </view> <view class="class_infobox"> <view class="class_info" style="width:80rpx ;"> <view class="class_info_top"> 班级人数 </view> <view class="class_info_bot"> {{ item.totalMembers }} </view> </view> <view class="class_info"> <view class="class_info_top"> 平均成绩/分 </view> <view class="class_info_bot"> {{ item.avgScore }} </view> </view> <view class="class_info"> <view class="class_info_top"> 作业完成度 </view> <view class="class_info_bot"> {{ item.workCompletionDegree }}% </view> </view> </view> </view> <view style="width: 100%;height: 50rpx;"> </view> </view> </view> <view class="overlay" v-if="false"> <view class="addstudent" v-show="false"> <view class="close"> <image src="https://file.langsi.online/yasiimg/web/static/uSzPsPoFgoVwcsl7pJ89"></image> </view> <view class="addstudent_tit"> 添加学生 </view> <view class="addstudent_input_box"> <view class="addstudent_input_tit"> 学员名称 </view> <view class="addstudent_input"> <input type="text" placeholder="搜索相关内容..." class="input" placeholder-style="color:#C7CDD3;font-size: 24rpx; "> </view> </view> <view class="addstudent_input_box"> <view class="addstudent_input_tit"> 学员ID </view> <view class="addstudent_input"> <input type="text" placeholder="搜索相关内容..." class="input" placeholder-style="color:#C7CDD3;font-size: 24rpx; "> </view> </view> <view class="addbtn"> 添加 </view> </view> <view class="addtip" v-show="false"> <view class="logo"> <image src="https://file.langsi.online/yasiimg/web/static/uxsaoHOpSUoxnX7lU3Fe"></image> </view> <view class="close"> <image src="https://file.langsi.online/yasiimg/web/static/uSzPsPoFgoVwcsl7pJ89"></image> </view> 已添加成功 </view> </view> <indexlist v-show="checkindex == 0" /> </view> </template> <script> import indexlist from "../compoents/indexList.vue" export default { components: { indexlist }, data() { return { shownocont: false, bgc: { backgroundColor: "#F6F9FC", }, checkindex: 1, isDropdownOpen: true, classlist: {}, isloding: true, changeclasslist: {}, classnum: false, classnumindex: -1, showtext: false, textindex: 0, searchKeyword: '', totalLastNum:'', totalAvgScore:'', totalWorkCompletionDegre:0, } }, onLoad(option) { this.getclassList() }, methods: { highlightSearch(name) { // 使用正则表达式替换匹配到的 searchKeyword 为带有颜色的文字 if (this.searchKeyword) { const regex = new RegExp(this.searchKeyword, 'gi'); return name.replace(regex, match => `<span style="color: #2D7CE6 ;">${match}</span>`); } return name; }, toclassdetal(item) { uni.navigateTo({ url: "/pages_teacher/teacher_class/class_detail?id=" + item.id }).then(res => { }).catch(err => { }); }, search() { // 根据关键字过滤 this.classlist if(this.searchKeyword!=''){ const filteredList = JSON.parse(JSON.stringify(this.changeclasslist)).filter(item => item.name.includes(this.searchKeyword)); // 更新 this.classlist 为过滤后的列表 this.classlist = filteredList; }else{ this.fuwei() } }, calculatePercentage(value1, value2) { if (value2 === 0) { return '0%'; // 或者返回其他默认值 } return ((value1 / value2) * 100).toFixed(0) + '%'; }, changeclass() { this.classnum = !this.classnum }, chengclassnumindex(num) { if (num == this.classnumindex) { this.classnumindex = -1 } else { this.classnumindex = num } if (this.classnumindex == 0) { this.classlist.sort((a, b) => b.totalMembers - a.totalMembers); } if (this.classnumindex == 1) { // 升序排列 classlist 数组,根据 totalMembers 属性 this.classlist.sort((a, b) => a.totalMembers - b.totalMembers); } if (this.classnumindex == -1) { this.fuwei() } }, fuwei() { this.classlist = JSON.parse(JSON.stringify(this.changeclasslist)); }, changetext() { this.showtext = !this.showtext }, chengetextindex(num) { if (num == this.textindex) { this.textindex = 0 } else { this.textindex = num } if (this.textindex !== 0 || this.classnumindex === 1) { this.classlist.sort((a, b) => { if (this.textindex !== 0 && a.classify === this.textindex) { return -1; // 将匹配的项放在前面 } if (this.textindex !== 0 && b.classify === this.textindex) { return 1; // 将匹配的项放在前面 } if (this.classnumindex === 0) { return b.totalMembers - a.totalMembers; // 对 totalMembers 进行降序排列 } if (this.classnumindex === 1) { return a.totalMembers - b.totalMembers; // 对 totalMembers 进行升序排列 } return 0; // 保持原有顺序 }); } else { this.fuwei(); } }, getclassList() { this.$u.get("https://api.admin-v2.langsi.online/admin-api/classroom/page").then(res => { if (res.code === 0) { this.classlist = res.data.list; this.changeclasslist = JSON.parse(JSON.stringify(this.classlist)); this.isloding = false; const list = res.data.list; if (list.length > 0) { // 计算 totalMembers 总和 const totalMembersSum = list.reduce((sum, item) => sum + item.totalMembers, 0); // 计算 workCompletionDegree 平均值 const workCompletionDegreeAvg = list.reduce((sum, item) => sum + item.workCompletionDegree, 0) / list.length; // 计算 avgScore 平均值 const avgScoreAvg = list.reduce((sum, item) => sum + item.avgScore, 0) / list.length; console.log(workCompletionDegreeAvg,'workCompletionDegreeworkCompletionDegree'); // 将计算结果赋值给对应的变量 this.totalLastNum = totalMembersSum; this.totalWorkCompletionDegre = workCompletionDegreeAvg; this.totalAvgScore = avgScoreAvg; // console.log(this.totalworkCompletionDegree,'totalworkCompletionDegreetotalworkCompletionDegree'); } else { // 处理空数组的情况,例如设置默认值或者给出提示 this.totalLastNum = 0; this.totalWorkCompletionDegre = 0; this.totalAvgScore = 0; } } }); }, getstuList() { this.$u.get("https://api.admin-v2.langsi.online/admin-api/classroom/page").then(res => { if (res.code == 0) { this.classlist = res.data.list this.isloding = false } }) } } } </script> <style lang="scss" > .view_body { width: 750rpx; background: #F6F9FC; .nocont { margin-top: 340rpx; margin-left: 216rpx; .nocont_tip { margin-left: 28rpx; width: 264rpx; display: flex; flex-wrap: wrap; justify-content: center; .nocont_tip_img { width: 213.36rpx; height: 220rpx; } .nocont_tip_txt { font-size: 24rpx; font-family: Microsoft YaHei, Microsoft YaHei; font-weight: 400; color: #0E3B77 } } .nocont_button { margin-top: 100rpx; display: flex; flex-wrap: wrap; justify-content: center; align-items: center; width: 320rpx; height: 80rpx; background: #2E7CE6; border-radius: 20rpx 20rpx 20rpx 20rpx; font-size: 24rpx; font-family: 'PingFang', 'PingFang'; font-weight: 800; color: #FFFFFF; } } .student_page { .student_page_top { padding: 32rpx; .search_box { width: 686rpx; height: 88rpx; background: #FFFFFF; border-radius: 20rpx 20rpx 20rpx 20rpx; display: flex; flex-wrap: nowrap; .check_search { display: flex; flex-wrap: nowrap; align-items: center; justify-content: center; width: 148rpx; height: 88rpx; background: #FFF2E4; border-radius: 20rpx 0rpx 0rpx 20rpx; font-size: 28rpx; font-family: 'PingFang', 'PingFang'; font-weight: 500; color: #F39852; .icon-arow_down { margin-left: 8rpx; font-size: 20rpx; } } .serchbox { // padding: 0 32rpx; display: flex; flex-wrap: nowrap; // margin-top: 30rpx; align-items: center; justify-content: space-between; width: 538rpx; height: 88rpx; background: #FFFFFF; border-radius: 20rpx 20rpx 20rpx 20rpx; .serchimg { margin-left: 32rpx; width: 32rpx; height: 32rpx; } .input { // margin-left: 24rpx; width: 452rpx; height: 88rpx; // border-radius: 30rpx; // background-color: #f5f8fc; // display: flex; // justify-content: center; // align-items: center; // text-align: center; font-size: 28rpx; font-family: Source Han Sans CN, Source Han Sans CN-Light; font-weight: 300; text-align: left; color: #a7b9cd; letter-spacing: 1.2rpx; line-height: 36rpx; // padding: 0 100rpx; // padding-right: 135rpx; box-sizing: border-box; } } } .info_box { display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-around; margin-top: 20rpx; width: 686rpx; height: 128rpx; background: linear-gradient(179deg, rgba(255, 237, 223, 0.65) 0%, #FFFFFF 100%); border-radius: 18rpx 18rpx 18rpx 18rpx; .info_cont { width: 110rpx; display: flex; justify-content: center; flex-wrap: wrap; .info_cont_top { font-size: 20rpx; font-family: 'PingFang', 'PingFang'; font-weight: 500; color: rgba(7, 47, 90, 0.5); line-height: 24rpx; } .info_cont_bot { margin-top: 12rpx; font-size: 28rpx; font-family: 'PingFang', 'PingFang'; font-weight: 800; color: #2D7CE6; } } } .chekbox { margin-top: 32rpx; display: flex; flex-wrap: nowrap; align-items: center; .check { margin-right: 84rpx; font-size: 28rpx; font-family: 'PingFang', 'PingFang'; font-weight: 500; color: rgba(7, 47, 90, 0.6); } .act1 { font-size: 32rpx; font-family: 'PingFang', 'PingFang'; font-weight: 800; color: #2D7CE6; } .add { margin-left: auto; display: flex; align-items: center; justify-content: center; width: 138rpx; height: 52rpx; background: #FFF2E4; border-radius: 26rpx 26rpx 26rpx 26rpx; font-size: 24rpx; font-family: 'PingFang', 'PingFang'; font-weight: 500; color: #F18F21; } } } .class_box { padding: 0 32rpx; display: flex; flex-wrap: wrap; .class_box_top { width: 100%; display: flex; flex-wrap: nowrap; align-items: center; // justify-content: space-around; .class_box_top_cont { position: relative; margin-right: 12rpx; display: flex; flex-wrap: nowrap; background: #FFFFFF; border-radius: 20rpx 20rpx 20rpx 20rpx; padding: 14rpx 30rpx; font-size: 20rpx; font-family: 'PingFang', 'PingFang'; font-weight: 500; color: rgba(7, 47, 90, 0.6); .icon-arow_down { margin-left: 8rpx; font-size: 18rpx; } .dropdown_box { left: 0; top: 100%; position: absolute; width: 160rpx; // height: 204rpx; background: #FFFFFF; box-shadow: 0rpx 4rpx 10rpx 0rpx rgba(0, 0, 0, 0.25); border-radius: 20rpx 20rpx 20rpx 20rpx; .dropdown_item:last-child { border-bottom: 0rpx solid #FFFFFF; } .dropdown_item { padding: 20rpx 40rpx; font-size: 20rpx; font-family: 'PingFang', 'PingFang'; font-weight: 500; color: rgba(46, 73, 117, 0.6); border-bottom: 2rpx solid #F3F3F3; } .act2 { color: #2D7CE6; } } } } .class_card { margin-top: 20rpx; width: 686rpx; height: 296rpx; background: #FFFFFF; border-radius: 20rpx 20rpx 20rpx 20rpx; padding: 32rpx; .class_card_top { display: flex; flex-wrap: nowrap; align-items: center; .class_card_left { width: 84rpx; height: 84rpx; } .class_card_right { margin-left: 12rpx; display: flex; flex-wrap: wrap; .class_card_right_top { width: 100%; font-size: 32rpx; font-family: 'PingFang', 'PingFang'; font-weight: bold; color: #072F5A; } .class_card_right_bot { margin-top: 8rpx; background: #EBF3FF; border-radius: 4rpx 4rpx 4rpx 4rpx; padding: 10rpx 20rpx; font-size: 20rpx; font-family: 'PingFang', 'PingFang'; font-weight: 500; color: #2D7CE6; } } } .class_infobox { margin-top: 20rpx; display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-around; width: 622rpx; height: 128rpx; background: #F9F9F9; border-radius: 20rpx 20rpx 20rpx 20rpx; .class_info { width: 110rpx; display: flex; flex-wrap: wrap; justify-content: center; .class_info_top { font-size: 20rpx; font-family: 'PingFang', 'PingFang'; font-weight: 500; color: rgba(7, 47, 90, 0.5); } .class_info_bot { margin-top: 12rpx; font-size: 28rpx; font-family: 'PingFang', 'PingFang'; font-weight: 800; color: #2D7CE6; } } } } } } .overlay { display: flex; justify-content: center; align-items: center; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); z-index: 100; // 设置遮罩层在上方 .addstudent { position: relative; padding: 40rpx; width: 600rpx; height: 632rpx; background: #FFFFFF; border-radius: 20rpx 20rpx 20rpx 20rpx; .close { top: 20rpx; right: 20rpx; position: absolute; width: 20rpx; height: 20rpx; } .addstudent_tit { width: 100%; text-align: center; font-size: 36rpx; font-family: 'PingFang'; font-weight: 800; color: #2E4975; line-height: 36rpx; } .addstudent_input_box { margin-top: 40rpx; .addstudent_input_tit { font-size: 28rpx; font-family: 'PingFang'; font-weight: 500; color: #2E4975; } .addstudent_input { margin-top: 16rpx; width: 520rpx; height: 80rpx; background: #FFFFFF; border-radius: 20rpx 20rpx 20rpx 20rpx; border: 2rpx solid #DDE2EE; .input { // margin-left: 24rpx; width: 520rpx; height: 80rpx; // border-radius: 30rpx; // background-color: #f5f8fc; // display: flex; // justify-content: center; // align-items: center; // text-align: center; font-size: 28rpx; font-family: Source Han Sans CN, Source Han Sans CN-Light; font-weight: 300; text-align: left; color: #a7b9cd; letter-spacing: 1.2rpx; line-height: 36rpx; padding-left: 32rpx; box-sizing: border-box; } } } .addbtn { display: flex; align-items: center; justify-content: center; margin-top: 76rpx; width: 520rpx; height: 88rpx; background: #2D7CE6; border-radius: 20rpx 20rpx 20rpx 20rpx; font-size: 28rpx; font-family: 'PingFang'; font-weight: 500; color: #FFFFFF; } } .addtip { position: relative; display: flex; align-items: center; justify-content: center; width: 440rpx; height: 138rpx; font-size: 32rpx; font-family: 'PingFang', 'PingFang'; font-weight: 800; color: #2D7CE6; background: linear-gradient(180deg, #C2DCFF 0%, #FFFFFF 100%); border-radius: 20rpx 20rpx 20rpx 20rpx; .logo { position: absolute; width: 182rpx; height: 244rpx; top: -244rpx; left: 130rpx; } .close { position: absolute; top: 10rpx; right: 20rpx; width: 20rpx; height: 20rpx; } } } }</style>