目录一、controller二、service三、mapper四、缓存修改五、前端一、controller这个跟前面的竞赛列表展示逻辑一样只是需要加上userId的筛选条件即可。oj-modules/oj-friend/src/main/java/com/yj/friend/controller/user/UserExamController.javaGetMapping(/list)publicTableDataInforedisList(ExamQueryDTOexamQueryDTO){returnuserExamService.list(examQueryDTO);}二、serviceoj-modules/oj-friend/src/main/java/com/yj/friend/service/user/IUserExamService.java接口方法TableDataInfolist(ExamQueryDTOexamQueryDTO);oj-modules/oj-friend/src/main/java/com/yj/friend/service/user/impl/UserExamServiceImpl.java实现方法OverridepublicTableDataInfolist(ExamQueryDTOexamQueryDTO){LonguserIdThreadLocalUtil.get(Constants.USER_ID,Long.class);examQueryDTO.setType(examListTypeEnum.USER_EXAM_LIST.getValue());//从redis当中获取 竞赛列表的数据LongtotalexamCacheManager.getListSize(examQueryDTO.getType(),userId);ListExamVOexamVOList;if(totalnull||total0){//缓存没有PageHelper.startPage(examQueryDTO.getPageNum(),examQueryDTO.getPageSize());examVOListuserExamMapper.selectUserExamList(userId);examCacheManager.refreshCache(examQueryDTO.getType(),userId);totalnewPageInfo(examVOList).getTotal();}else{//缓存有examVOListexamCacheManager.getExamVOList(examQueryDTO,userId);totalexamCacheManager.getListSize(examQueryDTO.getType(),userId);}if(CollectionUtil.isEmpty(examVOList)){returnTableDataInfo.empty();}returnTableDataInfo.success(examVOList,total);}三、mapperoj-modules/oj-friend/src/main/java/com/yj/friend/mapper/user/UserExamMapper.javaListExamVOselectUserExamList(LonguserId);xml写自定义sql联表查询?xml version1.0encodingUTF-8?!DOCTYPEmapperPUBLIC-//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.yj.friend.mapper.user.UserExamMapper!--竞赛列表查询--select idselectUserExamListresultTypecom.yj.friend.domain.exam.vo.ExamVOSELECTe.exam_id,e.title,e.start_time,e.end_timeFROMtb_user_exam ueJOINtb_exam eONue.exam_ide.exam_idWHEREue.user_id#{userId}ORDERBYue.create_timeDESC/select/mapper四、缓存修改oj-modules/oj-friend/src/main/java/com/yj/friend/manage/ExamCacheManager.java刷新缓存方法添加我的竞赛。数据库查询逻辑和获取缓存头也添加//刷新缓存逻辑publicvoidrefreshCache(IntegerexamListType,LonguserId){ListExamDOexamListnewArrayList();if(examListTypeEnum.EXAM_UN_FINISH_LIST.getValue().equals(examListType)){//查询未完赛的竞赛列表examListexamMapper.selectList(newLambdaQueryWrapperExamDO().select(ExamDO::getExamId,ExamDO::getTitle,ExamDO::getStartTime,ExamDO::getEndTime).gt(ExamDO::getEndTime,LocalDateTime.now()).eq(ExamDO::getStatus,Constants.TRUE).orderByDesc(ExamDO::getCreateTime));}elseif(examListTypeEnum.EXAM_HISTORY_LIST.getValue().equals(examListType)){//查询历史竞赛examListexamMapper.selectList(newLambdaQueryWrapperExamDO().select(ExamDO::getExamId,ExamDO::getTitle,ExamDO::getStartTime,ExamDO::getEndTime).le(ExamDO::getEndTime,LocalDateTime.now()).eq(ExamDO::getStatus,Constants.TRUE).orderByDesc(ExamDO::getCreateTime));}elseif(examListTypeEnum.USER_EXAM_LIST.getValue().equals(examListType)){//查询用户报名的竞赛列表ListExamVOexamVOSuserExamMapper.selectUserExamList(userId);examListBeanUtil.copyToList(examVOS,ExamDO.class);}if(CollectionUtil.isEmpty(examList)){return;}privateListExamVOgetExamListByDB(ExamQueryDTOexamQueryDTO,LonguserId){PageHelper.startPage(examQueryDTO.getPageNum(),examQueryDTO.getPageSize());if(examListTypeEnum.USER_EXAM_LIST.getValue().equals(examQueryDTO.getType())){//查询用户报名的竞赛列表returnuserExamMapper.selectUserExamList(userId);}else{//查询C端的竞赛列表returnexamMapper.selectExamList(examQueryDTO);}}privateStringgetExamListKey(IntegerexamListType,LonguserId){if(examListTypeEnum.EXAM_UN_FINISH_LIST.getValue().equals(examListType)){returnCacheConstants.EXAM_UNFINISHED_LIST;}elseif(examListTypeEnum.EXAM_HISTORY_LIST.getValue().equals(examListType)){returnCacheConstants.EXAM_HISTORY_LIST;}else{returnCacheConstants.USER_EXAM_LISTuserId;}}五、前端oj-vue\oj-fe-c\src\views\UserExam.vuetemplatedivclassmy-exam-pagedivclassexam-list-blockdivclassexam-list-headerspanclassex-title我的竞赛/spanspanclassexam-list-backclickgoBack返回/span/divdivclassexam-list-contentv-for(exam, index) in myExamList:keyindeximgsrc/assets/ide/jingsai.pngclassimage/divclassexam-contentdivclasstitle{{ exam.title }}/divdivclassdatespan比赛时间:/span{{ exam.startTime }} ~ {{ exam.endTime }}/div/divdivdivclassexam-end-lable-listv-ifisHistoryExam(exam)spanclassexam-end-lable已完赛/spanel-buttonclassexam-rank-labletypetextclicktogglePopover(exam.examId)查看排名/el-buttonel-buttonclassexam-rank-labletypetextclickgoHistoryExam(exam)竞赛练习/el-button/divdivclassexam-status-lable exam-end-lable-listv-else-ifisNotStart(exam)未开赛/divdivclassexam-end-lable-listv-elseel-buttonclassexam-rank-labletypetextplainclickgoExam(exam)开始答题/el-button/div/div/divdivclassmy-exam-pagination!-- 增加分页展示器 --el-paginationbackgroundlayouttotal, sizes, prev, pager, next, jumper:totaltotalv-model:current-pageparams.pageNumv-model:page-sizeparams.pageSize:page-sizes[5, 10, 15, 20]size-changehandleSizeChangecurrent-changehandleCurrentChange//div/div/div/templatescriptsetupimport{reactive,ref}fromvueimport{getMyExamListService,}from/apis/examimportrouterfrom/routerconstmyExamListref([])//消息列表consttotalref(0)constparamsreactive({pageNum:1,pageSize:10,})// 分页functionhandleSizeChange(newSize){params.pageNum1getMyExamList()}functionhandleCurrentChange(newPage){getMyExamList()}//消息列表asyncfunctiongetMyExamList(){constrefawaitgetMyExamListService(params.value)myExamList.valueref.rows total.valueref.total}getMyExamList()functionisHistoryExam(exam){constnownewDate();returnnewDate(exam.endTime)now;}constisNotStart(exam){constnownewDate();//当前时间returnnewDate(exam.startTime)now;}constgoBack(){router.go(-1)}/scriptstylelangscss.my-exam-page{max-width:1520px;margin:0 auto;background-color:rgba(247,247,247,1);position:relative;overflow:hidden;display:flex;justify-content:center;}.exam-list-block{width:100%;display:flex;flex-wrap:wrap;}.exam-list-header{background-color:rgba(255,255,255,1);border-radius:10px;width:100%;/* 设置宽度为100%以确保水平居中 */height:60px;font-size:25px;text-indent:20px;display:flex;align-items:center;margin-top:20px;.ex-title{font-family:PingFangSC,PingFang SC;font-weight:600;font-size:18px;color:#222222;}.exam-list-back{cursor:pointer;color:#999999;font-size:15px;margin-left:auto;padding-right:20px;}}.exam-list-content{height:110px;width:100%;background:#FFFFFF;border-radius:10px;margin:0 auto;display:flex;align-items:center;margin-top:20px;justify-content:space-between;cursor:pointer;:hover{box-shadow:0px 0px 6px 0pxrgba(0,0,0,0.1);}img{width:50px;height:50px;margin:0 20px;}}.exam-list-content .exam-content{max-width:calc(100% - 320px);width:100%;}.exam-list-content .title{font-weight:bold;font-size:16px;margin-bottom:10px;}.exam-list-content .date{font-weight:400;color:#000;line-height:20px;margin-left:auto;font-size:14px;span{color:#999;}/* 将日期推至行尾 */}.exam-list-content .exam-status-lable{color:#999999;}.exam-end-lable-list{padding-right:20px;min-width:228px;text-align:right;.exam-end-lable{margin-right:10px;font-family:MicrosoftYaHei;font-size:16px;color:#999999;}.exam-rank-lable{font-size:16px;}}.my-exam-pagination{width:100%;display:flex;justify-content:flex-end;padding-bottom:20px;}/style