diff --git a/AES-front/src/api/user.js b/AES-front/src/api/user.js index c32ec68..9c4b3e7 100644 --- a/AES-front/src/api/user.js +++ b/AES-front/src/api/user.js @@ -24,6 +24,6 @@ export default { //×÷ҵÌâĿ²¿·Ö - getExamList: (data) =>request.post('/problem/getExamList')//ѧÉú»ñȡ×÷ҵÁбí + getExamList: (config) =>request.get('/problem/getExamList',config)//ѧÉú»ñȡ×÷ҵÁбí } diff --git a/AES-front/src/utils/common/common.js b/AES-front/src/utils/common/common.js index 4f6a50a..78e0116 100644 --- a/AES-front/src/utils/common/common.js +++ b/AES-front/src/utils/common/common.js @@ -19,7 +19,18 @@ export function formatDateTimeNoSecond(time = undefined, format = 'YYYY-MM-DD HH export function formatDate(date = undefined, format = 'YYYY-MM-DD') { return formatDateTime(date, format) } - +export function formatTimestamp(timestamp){ + if (timestamp) { + const date = new Date(timestamp); + return date.getFullYear() + '-' + + ('0' + (date.getMonth() + 1)).slice(-2) + '-' + + ('0' + date.getDate()).slice(-2) + ' ' + + ('0' + date.getHours()).slice(-2) + ':' + + ('0' + date.getMinutes()).slice(-2) + ':' + + ('0' + date.getSeconds()).slice(-2); + } + return ''; +} /** * @desc 函数节流 * @param {Function} fn diff --git a/AES-front/src/views/user/exam-list/index.vue b/AES-front/src/views/user/exam-list/index.vue index 58e57b6..10bbd30 100644 --- a/AES-front/src/views/user/exam-list/index.vue +++ b/AES-front/src/views/user/exam-list/index.vue @@ -18,7 +18,7 @@ import { ref, reactive, onMounted } from 'vue' import api from '@/api/user' import ExamActions from './components/exam-actions.vue' -import { formatDateTime, getToken } from '@/utils' +import {formatTimestamp, getToken} from '@/utils' import { useUserStore } from '@/store' import { useRouter } from 'vue-router' import { useCountdown } from '@/composables' @@ -92,7 +92,7 @@ const onViewScore = (exam) => {//点击成绩控件的逻辑 const columns = [ { - key: 'name', + key: 'title', title: '作业名称', fixed: 'left', width: 150, @@ -101,23 +101,24 @@ const columns = [ { key: 'description', title: '描述信息', + align: 'center', }, { - key: 'starttime', + key: 'startTime', title: '开始时间', width: '108', align: 'center', render: (row) => { - return row['starttime'] ? formatDateTime(row['starttime']) : '' + return row['startTime'] ? formatTimestamp(row['startTime']) : '' }, }, { - key: 'endtime', + key: 'endTime', title: '结束时间', width: '108', align: 'center', render: (row) => { - return row['endtime'] ? formatDateTime(row['endtime']) : '' + return row['endTime'] ? formatTimestamp(row['endTime']) : '' }, }, @@ -125,6 +126,7 @@ const columns = [ key: 'status', title: '状态', width: '116', + align: 'center', render: (row, idx) => { if (countdownControllers[row.id]) { const { leftTime, minute, second } = countdownControllers[row.id] @@ -151,8 +153,8 @@ const columns = [ }) }, }, -] +] const queryByPage = async (currentPage) => { @@ -163,8 +165,7 @@ const queryByPage = async (currentPage) => { } try { const res = await api.getExamList({ - pageNum: currentPage, - pageSize: paginationReactive.pageSize, + params: { pageNum: currentPage, pageSize: paginationReactive.pageSize }, }) examList.value = res.data // 假设返回的数据在 res.data 中 const { pageNum, pageSize, total, list } = res.data @@ -217,7 +218,4 @@ onBeforeUnmount(() => { } }) - - - diff --git a/AES/src/main/java/com/example/aes/global/config/HttpInterceptorConfig.java b/AES/src/main/java/com/example/aes/global/config/HttpInterceptorConfig.java index 47956bc..2145a1a 100644 --- a/AES/src/main/java/com/example/aes/global/config/HttpInterceptorConfig.java +++ b/AES/src/main/java/com/example/aes/global/config/HttpInterceptorConfig.java @@ -22,10 +22,12 @@ public class HttpInterceptorConfig extends WebMvcConfigurationSupport { .excludePathPatterns("/api/login/student","/api/login/admin","/api/login","/api/user/signUser", "/api/user" + "/findStudentByusername","/api/user/findStudentByStudentNo","/api/adminusers/findAdminuserByno","/api/adminusers/findAdminuserByAccountInRePwInfo", + "/api/problem/getExamList", "/api/adminusers" + "/signTeacher", "/api/adminusers" + - "/confirmQuestionAnswer","/api/adminusers/updatePasswordByAccount","/api/adminusers/findAdminuserByAccount"); + "/confirmQuestionAnswer","/api/adminusers/updatePasswordByAccount","/api/adminusers/findAdminuserByAccount" + ); } diff --git a/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java b/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java index 7e863fc..2da449d 100644 --- a/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java +++ b/AES/src/main/java/com/example/aes/problem/controller/ProblemController.java @@ -51,13 +51,12 @@ public class ProblemController { public RespBean getExamList(Integer pageNum,Integer pageSize, HttpServletRequest request) { if (pageNum < 1 || pageSize < 1) return RespBean.error("参数错误!"); - -// PMProblem pMproblem = new PMProblem(); -// pMproblem.setPageNum(pageNum); -// pMproblem.setPageSize(pageSize); - + PMProblem pMproblem = new PMProblem(); + pMproblem.setPageNum(pageNum); + pMproblem.setPageSize(pageSize); DecodeToken decodeToken = new DecodeToken(request); String userId = decodeToken.getUserId(); + pMproblem.setStudentId(Integer.parseInt(userId)); // 根据学生id查找班级id List classstudentsList = classesServiceI.findClassIdByStudentId(Integer.parseInt(userId)); @@ -67,10 +66,12 @@ public class ProblemController { classIds.add(classstudent.getClassId()); } - List pMproblems = problemServiceI.getProblemsByClassIds(classIds); + List pMproblems = problemServiceI.getProblemsByClassIds(classIds);//根据班级id查询所有作业 + //分页处理,左为已有的作业列表,右为从前端获取的作业类,包含分页信息 + DataGrid dataGrid = problemServiceI.dataGrid(pMproblems,pMproblem); - if (pMproblems != null) { - return RespBean.ok("获取作业列表成功!",pMproblems); + if (dataGrid != null) { + return RespBean.ok("获取作业列表成功!",dataGrid); } else { return RespBean.error("获取作业列表失败!"); } diff --git a/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java b/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java index 4729d0a..6ae86f8 100644 --- a/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java +++ b/AES/src/main/java/com/example/aes/problem/dao/impl/ProblemDaoImpl.java @@ -12,6 +12,7 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; +import java.util.Collections; import java.util.List; @Repository("ProblemDao") @@ -21,25 +22,34 @@ public class ProblemDaoImpl extends BaseDaoImpl implements ProblemDaoI{ private JdbcTemplate jdbcTemplate; @Override - public List findProblemsByClassIds(List classIds){ - // SQL查询,根据classIds获取problemId, startTime, endTime - String sql = "SELECT p.problem_id AS problemId, pp.start_time AS startTime, pp.end_time AS endTime " + - "FROM postproblem pp " + - "JOIN problem p ON pp.problem_id = p.id " + - "WHERE pp.class_id IN (?)"; + public List findProblemsByClassIds(List classIds) { + // 检查classIds是否为空或没有元素 + if (classIds == null || classIds.isEmpty()) { + return Collections.emptyList(); + } - // 将classIds转换为逗号分隔的字符串 - String classIdsStr = classIds.toString().replace("[", "").replace("]", ""); + String sql = "SELECT pr.id AS Id, pp.startTime AS startTime, pp.endTime AS endTime, " + + "pr.title AS title, pr.description AS description " + + "FROM postproblem pp " + + "JOIN problem pr ON pp.problemId = pr.id " + + "WHERE pp.classId IN (?)"; - // 执行查询 - List problems = jdbcTemplate.query( - sql, - new Object[]{classIdsStr}, - new BeanPropertyRowMapper<>(PMProblem.class) - ); + // 将classIds转换为逗号分隔的字符串,并用问号替换,因为jdbcTemplate会处理参数绑定 + String inSql = String.join(",", Collections.nCopies(classIds.size(), "?")); + + // 替换SQL中的问号 + sql = sql.replace("(?)", "(" + inSql + ")"); + + // 执行查询 + List problems = jdbcTemplate.query( + sql, + classIds.toArray(), // 将List转换为数组,因为jdbcTemplate.query接受数组或可变参数 + new BeanPropertyRowMapper<>(PMProblem.class) + ); + + return problems; + } - return problems; - } public void addScoringRubric(PMScoringRubric pmScoringRubric){ }; diff --git a/AES/src/main/java/com/example/aes/problem/model/DataGrid.java b/AES/src/main/java/com/example/aes/problem/model/DataGrid.java new file mode 100644 index 0000000..986dd46 --- /dev/null +++ b/AES/src/main/java/com/example/aes/problem/model/DataGrid.java @@ -0,0 +1,40 @@ +package com.example.aes.problem.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class DataGrid implements java.io.Serializable {//用于实现分页类 + + private static final long serialVersionUID = 1538274527426L; + + // 总的记录行数 +// private long totalLines; + private long total; // 原totalLines + + // 总的页数 + @JsonIgnore + private long totalPages; + + // 每页显示多少行 +// private long pageLines; + + // 每页显示的行数 + private long pageSize; + // 当前所在页 + private long pageNum; + + // 当前页的数据行数量,只有在最后一页时会和每页显示多少行可能不同 + @JsonIgnore + private long currentPageLineNum; + + // 当前页的所有数据行 + @SuppressWarnings("rawtypes") +// private List rows = new ArrayList(); + private List list = new ArrayList(); // 原rows + + +} diff --git a/AES/src/main/java/com/example/aes/problem/model/PMProblem.java b/AES/src/main/java/com/example/aes/problem/model/PMProblem.java index 71f2226..1318525 100644 --- a/AES/src/main/java/com/example/aes/problem/model/PMProblem.java +++ b/AES/src/main/java/com/example/aes/problem/model/PMProblem.java @@ -32,7 +32,7 @@ public class PMProblem extends Problem implements java.io.Serializable{//继承P private String status;//最后在页面显示的状态,取决于上面三个参数。 //(作业列表)页面需要的后台数据 - private int studentId;//学生id + private Integer studentId;//学生id private int classId;//班级id diff --git a/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java b/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java index 58eb9c8..a172a52 100644 --- a/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java +++ b/AES/src/main/java/com/example/aes/problem/service/Impl/ProblemServiceImpl.java @@ -7,6 +7,7 @@ import com.example.aes.problem.model.PMScoringRubric; import com.example.aes.problem.model.ScoringRubric; import com.example.aes.problem.model.UScoringRubric; import com.example.aes.problem.service.ProblemServiceI; +import com.example.aes.user.model.Classstudents; import com.example.aes.user.model.Course; import com.example.aes.user.model.DataGrid; import com.example.aes.user.model.PMCourse; @@ -15,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Collections; import java.util.List; @Service public class ProblemServiceImpl implements ProblemServiceI { @@ -53,7 +55,56 @@ public class ProblemServiceImpl implements ProblemServiceI { return uScoringRubricList; } - }; + } + + @Override + public DataGrid dataGrid(List pMproblems, PMProblem pMproblem) { + DataGrid dg = new DataGrid(); + long totalLines;// 总记录行数 + List pagedPMProblems; + + // 设置总记录行数 + totalLines = (long) pMproblems.size(); + + // 计算分页信息 + int pageSize = pMproblem.getPageSize(); + int pageNum = pMproblem.getPageNum(); + int fromIndex = (pageNum - 1) * pageSize; + int toIndex = fromIndex + pageSize; + + // 对问题列表进行分页处理 + if (fromIndex < pMproblems.size()) { + if (toIndex > pMproblems.size()) { + toIndex = pMproblems.size(); + } + pagedPMProblems = pMproblems.subList(fromIndex, toIndex); + } else { + pagedPMProblems = Collections.emptyList(); + } + + // 如果分页后的列表为空 + if (pagedPMProblems.isEmpty()) { + return null; + } else { + // 这里可以添加额外的处理逻辑,比如设置每个 PMProblem 的额外属性 + + // 设置总的记录行数 + dg.setTotal(totalLines); + // 设置每页显示多少行 + dg.setPageSize(pageSize); + // 设置总的页数,总页数 = (总行数 / 每页显示多少行) 向上取整 + dg.setTotalPages((long) Math.ceil((double) totalLines / (double) pageSize)); + // 设置当前显示第几页 + dg.setPageNum(pageNum); + // 设置当前页的数据行数量 + dg.setCurrentPageLineNum(pagedPMProblems.size()); + // 设置当前页的所有数据行 + dg.setList(pagedPMProblems); + return dg; + } + } + + ; private void changeModel1(List l, List nl) { if (l != null && l.size() > 0) { diff --git a/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java b/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java index 62c879f..26c555b 100644 --- a/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java +++ b/AES/src/main/java/com/example/aes/problem/service/ProblemServiceI.java @@ -14,4 +14,5 @@ public interface ProblemServiceI { public void addScoringRubric(PMScoringRubric pmscoringRubric); public List findScoringRubricNoStandardId(); + DataGrid dataGrid(List pMproblems, PMProblem pMproblem); }