尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【项目】【在线判题系统】c端:用户退出登陆与获取当前用户信息
目录一、退出登录1.1 controller1.2 service二、获取当前用户信息2.1 controller2.2 service三、修改3.1 token创建3.2 参数修改3.3 传参四、前端一、退出登录与前面的管理员的退出登录没有区别注销token即可。1.1 controlleroj-modules/oj-friend/src/main/java/com/yj/friend/controller/user/UserController.javaDeleteMapping(/logout)publicRVoidlogout(RequestHeader(HttpConstants.AUTHENTICATION)Stringtoken){returntoR(userService.logout(token));}1.2 serviceoj-modules/oj-friend/src/main/java/com/yj/friend/service/user/IUserService.javabooleanlogout(Stringtoken);oj-modules/oj-friend/src/main/java/com/yj/friend/service/user/impl/UserService.javaOverridepublicbooleanlogout(Stringtoken){if(StrUtil.isNotEmpty(token)token.startsWith(HttpConstants.PREFIX)){tokentoken.replaceFirst(HttpConstants.PREFIX,StrUtil.EMPTY);}returntokenService.deleteLoginUser(token,jwtSecret);}二、获取当前用户信息与管理员端获取用户信息只需要多加上一个头像字段即可。2.1 controlleroj-modules/oj-friend/src/main/java/com/yj/friend/controller/user/UserController.javaGetMapping(/info)publicRLoginUserVOinfo(RequestHeader(HttpConstants.AUTHENTICATION)Stringtoken){returnuserService.info(token);}2.2 serviceoj-modules/oj-friend/src/main/java/com/yj/friend/service/user/IUserService.javaRLoginUserVOinfo(Stringtoken);oj-modules/oj-friend/src/main/java/com/yj/friend/service/user/impl/UserService.javaOverridepublicRLoginUserVOinfo(Stringtoken){//添加前缀if(StrUtil.isNotEmpty(token)token.startsWith(HttpConstants.PREFIX)){tokentoken.replaceFirst(HttpConstants.PREFIX,StrUtil.EMPTY);}//在redis先行获取LoginUserloginUsertokenService.getLoginUser(token,jwtSecret);if(nullloginUser){returnR.fail();}LoginUserVOloginUserVOnewLoginUserVO();loginUserVO.setNickName(loginUser.getNickName());loginUserVO.setHeadImage(loginUser.getHeadImage());returnR.success(loginUserVO);}三、修改3.1 token创建oj-common/oj-common-security/src/main/java/com/yj/common/security/service/TokenService.java加上字段3.2 参数修改oj-common/oj-common-core/src/main/java/com/yj/common/core/domain/LoginUser.java加上字段packagecom.yj.common.core.domain;importlombok.Data;DatapublicclassLoginUser{privateStringnickName;//用户昵称privateIntegeridentity;//用户身份1-管理员 2-普通用户privateStringheadImage;//头像}3.3 传参oj-modules/oj-system/src/main/java/com/yj/system/service/sysuser/impl/SysUserServiceImpl.java传nulloj-modules/oj-friend/src/main/java/com/yj/friend/service/user/impl/UserService.java传入头像四、前端oj-vue\oj-fe-c\src\views\Login.vuetemplatedivclasslogin-pagedivclassorange/divdivclassblue/divdivclassblue small/divdivclasslogin-boxdivclasslogo-boximg src/assets/logo.pngdivdivclasssys-nameOJ/div/div/divdivclassform-box-titlespan验证码登录/span/divdivclassform-box!--邮箱输入框--divclassform-itemimg src/assets/images/shouji.pngel-input v-modelmobileForm.emailtypeemailplaceholder请输入QQ邮箱//div!--验证码输入框--divclassform-itemimg src/assets/images/yanzhengma.pngel-input stylewidth:134pxv-modelmobileForm.codetypetextplaceholder请输入验证码/divclasscode-btn-boxclickgetCodespan{{txt}}/span/div/divdivclasssubmit-boxclickloginFun登录/注册/div/divdivclassgray-botp注册或点击登录代表您同意span服务条款/span和span隐私协议/span/p/div/div/div/templatescript setupimport{ref,reactive}fromvueimport{ElMessage}from element-plusimport{setToken}from /utils/cookieimport{sendCodeService,codeLoginService}from /apis/userimportrouterfrom /routerimport{Pattern}from /utils/validate// 邮箱登录表单phone → emaillet mobileFormreactive({email:,code:})let txtref(获取验证码)let timernull// QQ邮箱正则校验constcheckQQEmail(email){constregex/^[1-9]\d{4,}qq\.com$/returnregex.test(email)}// 获取验证码async functiongetCode(){// 1. 邮箱非空校验if(!mobileForm.email){ElMessage.warning(请输入QQ邮箱)return}// 2. QQ邮箱格式校验if(!checkQQEmail(mobileForm.email)){ElMessage.warning(请输入正确的QQ邮箱格式)return}// 3. 防止重复点击if(txt.value!获取验证码txt.value!重新获取验证码){return}try{// 调用后端发送邮箱验证码接口awaitsendCodeService(mobileForm)ElMessage.success(验证码发送成功)// 倒计时逻辑let num59txt.value59stimersetInterval((){num--if(num1){txt.value重新获取验证码clearInterval(timer)}else{txt.valuenums}},1000)}catch(error){ElMessage.error(验证码发送失败)clearInterval(timer)txt.value重新获取验证码}}// 登录/注册async functionloginFun(){try{// 校验参数if(!mobileForm.email||!mobileForm.code){ElMessage.warning(请输入邮箱和验证码)return}// 调用登录接口constloginRefawaitcodeLoginService(mobileForm)setToken(loginRef.data)ElMessage.success(登录成功)router.push(/c-oj/home/question)}catch(error){ElMessage.error(登录失败)}}// 销毁定时器onUnmounted((){if(timer)clearInterval(timer)})/scriptstyle langscssscoped.login-page{width:100vw;height:100vh;position:relative;margin-top:-60px;margin-left:-20px;overflow:hidden;.login-box{width:600px;height:604px;background:#FFFFFF;box-shadow:0px0px6px0pxrgba(0,0,0,0.1);border-radius:10px;opacity:0.9;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:2;padding:072px;padding-top:50px;overflow:hidden;.logo-box{display:flex;align-items:center;.refister-logo{margin-bottom:56px;}img{width:68px;height:68px;margin-right:16px;}.sys-name{height:33px;font-family:PingFangSC,PingFangSC;font-weight:600;font-size:24px;color:#222222;line-height:33px;margin-bottom:13px;}.sys-sub-name{height:22px;font-family:PingFangSC,PingFangSC;font-size:16px;color:#222222;line-height:22px;}}.form-box-title{height:116px;display:flex;align-items:center;span{font-family:PingFangSC,PingFangSC;font-weight:400;font-size:24px;color:#000000;line-height:33px;display:block;height:33px;margin-right:40px;position:relative;letter-spacing:1px;cursor:pointer;.active{font-weight:bold;::before{position:absolute;content:;bottom:-13px;left:0;width:100%;height:5px;background:#32C5FF;border-radius:10px;}}}}.gray-bot{position:absolute;left:0;text-align:center;margin-top:56px;width:100%;height:50px;background:#FAFAFA;font-family:PingFangSC,PingFangSC;font-weight:400;font-size:14px;color:#666666;line-height:50px;p{margin:0;}span{color:#32C5FF;cursor:pointer;}}:deep(.form-box){.submit-box{margin-top:90px;width:456px;height:48px;background:#96E1FE;border-radius:8px;cursor:pointer;display:flex;justify-content:center;align-items:center;font-family:PingFangSC,PingFangSC;font-weight:600;font-size:16px;color:#FFFFFF;letter-spacing:1px;.refister-submit{margin-top:72px;}:hover{background:#32C5FF;}}.form-item{display:flex;align-items:center;width:456px;height:48px;background:#F8F8F8;border-radius:8px;margin-bottom:30px;position:relative;.code-btn-box{position:absolute;right:0;width:151px;height:48px;background:#32C5FF;border-radius:8px;top:0;display:flex;align-items:center;justify-content:center;cursor:pointer;span{font-family:PingFangSC,PingFangSC;font-weight:400;font-size:16px;color:#FFFFFF;}}.error-tip{position:absolute;width:140px;text-align:right;padding-right:12px;height:20px;font-family:PingFangSC,PingFangSC;font-weight:400;font-size:14px;color:#FD4C40;line-height:20px;right:0;.bottom{right:157px;}}.el-input{width:380px;font-family:PingFangSC,PingFangSC;font-weight:400;font-size:16px;color:#222222;}.el-input__wrapper{border:none;box-shadow:none;background:transparent;width:230px;padding-left:0;}img{width:24px;height:24px;margin:018px;}}}}::after{position:absolute;top:0;left:0;height:100vh;bottom:0;right:0;background:rgba(255,255,255,.8);z-index:1;content:;}.orange{background:#F0714A;width:498px;height:498px;border-radius:50%;opacity:0.67;filter:blur(50px);left:14.2%;top:41%;position:absolute;}.blue{width:334px;height:334px;background:#32C5FF;opacity:0.67;filter:blur(50px);left:14.2%;top:42%;position:absolute;top:16.3%;left:80.7%;.small{width:186px;height:186px;top:8.2%;left:58.2%;}}}/style
RELATED

相关推荐

【Android面试】RecylerView专题

【Android面试】RecylerView专题

文章目录一、基础原理与复用缓存1. RecyclerView 与 ListView 的核心区别是什么?2. 四级缓存(mAttachedScrap、mCachedViews、mViewCacheExtension、mRecyclerPool)各自作用、优先级与降级策略,不同滑动 / 刷新场景的命中逻辑&…

📅 2026/10/19 1:35:26
从数据到权重:Marigold V2两阶段训练全流程解析(SinkLoss、iREPA与单卡32GB训练秘诀)

从数据到权重:Marigold V2两阶段训练全流程解析(SinkLoss、iREPA与单卡32GB训练秘诀)

【免费下载链接】marigold-v2-0 项目地址: https://ai.gitcode.com/hf_mirrors/huawei-bayerlab/marigold-v2-0 点击查看 免费下载 Marigold V2 是由 HUAWEI Bayer Lab 联合 EPFL 与博洛尼亚大学发布的单目深度估计模型(SIGGRAPH Asia 2026)…

📅 2026/10/19 1:35:26
pythonWeb学习记录

pythonWeb学习记录

FastAPi入门web服务启功1 ——直接点击运行符号(不用重启就能更新代码)2 -——输入 uvicorn main:app --reload(pythonweb的热启动,不用重启就能更新代码)交互文档路径后加/docs路由(Java里的controller&…

📅 2026/10/19 1:35:26
MORE NEWS

更多资讯

📰

ABAP Cloud 的 OLTP 开发,从数据增删改查走向完整的业务事务

采购申请页面上的保存按钮,背后通常不只有一次数据库写入。申请抬头需要保存,行项目需要关联,金额需要计算,供应商需要校验,当前操作者还必须具备相应权限。只要其中一项没有满足业务要求,系统就不能把这张申请当成一份完整、有效的业务单据。 这类围绕业务数据开展读取…

📰

从业务模型到服务交付,读懂 ABAP Cloud 架构图中的开发逻辑与 Clean Core 边界

图里有两块同名的 Integration Services,一块位于顶部,另一块位于底部。它们的位置很有讲究。顶部表示我们的应用把业务能力提供给其他系统,底部表示我们的应用调用其他系统的业务能力。同一个应用既可以是服务提供者,也可以是服务消费者,而中间的业务模型和业务逻辑负责把…

📰

【码动四季·秋】从第一次 issue 到 Committer:一个普通开发者的开源参与路径(附真实晋升时间线)

本文为 AtomGit 码动四季开源同行征稿活动参与文章 摘要:从第一次 issue 到 Committer 的完整路径,恰好是教程最少、坑最多的部分。本文以本人 2024-2026 的真实晋升时间线为骨架,给出五阶段动作清单:选社区看三个健康指标&#x…

📰

Camera HAL 防抖—GME详解

Camera HAL 防抖—GME详解 文档定位:供开发、学习、问题定位使用。 本文与四篇 EIS 文档共享同一套「节点 + 算法库 + 陀螺仪」技术底座。GME 与 EISv3、GyroRNN 同源——三者都加载同一个算法共享库 com.qti.eisv3,但各自的节点封装、配置段、vendor tag 段、功能聚焦点各不…

📰

从数据交换到业务协同,理解 SAP ABAP 的集成应用场景

在 SAP 官方的差旅审批示例中,一条差旅记录的创建并不是业务流程的终点。运行在 SAP BTP ABAP environment 中的差旅应用创建记录后,需要启动 SAP Build Process Automation 中的审批流程,将差旅状态设置为待审批。审批人在任务收件箱中完成操作,审批结果再通过回调返回 AB…

📰

Spring Boot+MyBatis+Thymeleaf构建客栈管理系统:从建表到部署的全流程实践

做客栈管理系统这类项目,最怕的不是业务复杂,而是技术栈堆得花里胡哨,最后连部署都费劲。我最近给一家小型客栈做的后台,用的是一条很稳的路:Spring Boot 做应用骨架,MyBatis 管SQL,MySQL 存核心…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬