20.项目开发之量化交易QuantTrade(二)

news2025/2/22 22:22:15

项目开发之量化交易QuantTrade(二)

前后端业务:用户登录

业务实现

MemberController

/**
* 登录用户
* @param member
* @return
*/
@ApiOperation("登录接口")
@PostMapping("/login")
public @ResponseBody RestObject login(@RequestBody Member member, @ApiIgnore HttpSession httpSession){
   RestObject restObject = memberService.login(member,httpSession);
   return restObject;
}

MemberService

import com.quanttrade.member.javabean.Member;
import com.quanttrade.member.mapper.MemberMapper;
import com.quanttrade.utils.javabean.RestObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.servlet.http.HttpSession;

@Service
public class MemberService {
   @Autowired
   private MemberMapper memberMapper;

   /**
    * 注册用户信息
    * @param param 用户名、密码、确认密码
    * @return 注册结果
    */
   public RestObject register(Member param) {
       //1、合法性校验
       String serviceMsg = "注册";
       RestObject serviceMsg1 = legitimacyVerification(param, serviceMsg);
       if (serviceMsg1 != null) return serviceMsg1;
       //1.3、确认密码必须存在
       if(param.getRepeat()==null || "".equals(param.getRepeat().trim())){
           return RestObject.ERROR(serviceMsg+"失败,请先填写确认密码!");
       }
       //1.4、密码和确认密码必须保持一致
       if(!param.getAuthstring().equals(param.getRepeat())){
           return RestObject.ERROR(serviceMsg+"失败,密码和确认密码必须保持一致!");
       }
       //2、先对密码进行MD5加密,替换未加密密码
       param.setAuthstring(
               DigestUtils.md5DigestAsHex(
                       param.getAuthstring().getBytes()
               )
       );
       //3、调用mapper层保存数据
       int rows = 0;
       try {
           rows = memberMapper.saveMemberInfo(param);
       } catch (Exception e) {
           String errorMsg = e.getMessage();
           System.out.println(errorMsg);
           if(errorMsg.contains("Duplicate entry")&& errorMsg.contains("tb_member.account")){
               //判断如果是用户名重复了,抛出用户名重复的问题
               return RestObject.ERROR("注册失败,该用户名已注册,请更换一个新的用户名!");
           }
           return RestObject.ERROR("注册失败,请联系管理员");
       }
       //4、返回业务结果
       if(rows>0){
           return RestObject.OK("注册成功!");
       }else{
           return RestObject.ERROR("注册失败,请联系管理员");
       }
   }

   /**
    * 用户名和密码的合法性校验
    * @param param
    * @param serviceMsg
    * @return
    */
   private static RestObject legitimacyVerification(Member param, String serviceMsg) {
       //1.0、防止空指针异常
       if(param == null){
           return RestObject.ERROR(serviceMsg + "失败,请联系管理员");
       }
       //1.1、用户名必须存在
       if(param.getAccount()==null || "".equals(param.getAccount().trim())){
           return RestObject.ERROR(serviceMsg + "失败,请先填写用户名!");
       }
       //1.2、密码必须存在
       if(param.getAuthstring()==null || "".equals(param.getAuthstring().trim())){
           return RestObject.ERROR(serviceMsg + "失败,请先填写密码!");
       }
       return null;
   }

   /**
    * 用户登录业务
    * @param param     用户名、密码
    * @param session   session对象
    * @return              业务结果
    */
   public RestObject login(Member param, HttpSession session) {
       //1、合法性校验
       String serviceMsg = "登录";
       RestObject serviceMsg1 = legitimacyVerification(param, serviceMsg);
       if (serviceMsg1 != null) return serviceMsg1;
       //2、对密码进行一次MD5加密
       param.setAuthstring(
               DigestUtils.md5DigestAsHex(
                       param.getAuthstring().getBytes()
               )
       );
       //3、根据用户名和密码对用户信息进行查询
       Member member = null;
       try {
           member = memberMapper.searchAccountByUserNameAndPassWord(param);
       } catch (Exception e) {
           System.out.println(e.getMessage());
           return RestObject.ERROR("登录失败,请联系管理员!");
       }
       //4、登录业务判断
       if(member!=null && member.getAccount()!=null && !"".equals(member.getAccount())){
           //登录成功
           session.setAttribute("member",member);      //session中保存了用户信息,登录成功的标志
           return RestObject.OK("登录成功");
       }else{
           //登录失败
           return RestObject.ERROR("登录失败,用户名或密码错误!");
       }
   }
}

MemberMapper

/**
* 根据用户名和密码查询用户信息
* @param param
* @return
*/
Member searchAccountByUserNameAndPassWord(@Param("member") Member param);

MemberMapper.xml

<select id="searchAccountByUserNameAndPassWord" resultType="com.quanttrade.member.javabean.Member">
   SELECT ACCOUNT FROM tb_member WHERE ACCOUNT=#{member.account} AND authstring=#{member.authstring}
</select>

测试:
01
02
03
04
05

前端整合

06

后端业务:登录权限校验(自定义注解定制化过程)

需求说明

07

自定义一个注解,要求哪个方法加入@RequireLogin注解,该方法只有登录用户才能执行,非登录用户执行会报错

业务实现

构建自定义注解:
08

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface RequireLogin {
   boolean value() default true;
}

编写拦截器:
09

import com.alibaba.fastjson.JSON;
import com.quanttrade.utils.annotation.RequireLogin;
import com.quanttrade.utils.javabean.RestObject;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

@Component
public class LoginInterceptor implements HandlerInterceptor {
   /**
    * 在请求指定的 控制器业务方法之前,进行拦截,判断是否有登录权限。
    * 有权限,放行
    * 没有权限,拦截
    * @param request
    * @param response
    * @param handler
    * @return    true 放行   false 拦截
    * @throws Exception
    */
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       if(handler instanceof HandlerMethod){
           //1、判断当前执行的业务方法 是否被注解修饰了
           //1.1、对Handler进行强转
           HandlerMethod handlerMethod = (HandlerMethod) handler;
           //1.2、判断当前方法是否被注解修饰
           RequireLogin requireLogin = handlerMethod.getMethodAnnotation(RequireLogin.class);
           //2、判断当前方法是否需要进行权限校验
           if(requireLogin!=null && requireLogin.value()){
               //3、如果需要进行校验,判断是否有权限,有权限就放行,没有权限就拦截
               //3.1、获取session中的member对象
               Object member = request.getSession().getAttribute("member");
               //3.2、判断member对象是否存在
               if(member==null){
                   //3.3、如果Member不存在,说明没有登录权限,拦截,返回错误信息
                   //处理中文
                   response.setContentType("application/json;charset=utf-8");
                   //向前写出信息
                   PrintWriter writer = response.getWriter();
                   writer.write(JSON.toJSONString(RestObject.ERROR("请先登录!")));
                   //拦截
                   return false;
               }
               //3.4、如果member存在,说明有登录权限直接放行
           }
           //4、如果不需要权限校验,直接放行即可
       }
       //如果不是要拦截的业务方法系列,直接放行
       return true;
   }
}


注册拦截器:
10

import com.quanttrade.utils.interceptor.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MVCConfig implements WebMvcConfigurer {
   @Autowired
   private LoginInterceptor loginInterceptor;

   /**
    * 注册拦截器,为拦截器配置拦截路径
    * @param registry
    */
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       //注册拦截器,并为该拦截器添加拦截路径
       registry.addInterceptor(loginInterceptor).addPathPatterns("/member/**");
   }
}


编写一个测试用的控制器方法:
MemberController:

/**
* 测试登录权限校验的接口
* @return
*/
@ApiOperation("测试登录权限校验的接口")
@PostMapping("/testRequireLogin")
@RequireLogin
public @ResponseBody RestObject testRequireLogin(){
   return RestObject.OK("测试成功!您已登录");
}

分别测试未登录 和 登录状态即可!!!
至此前后端业务实现成功,接下来将数据数据获取阶段

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈弧光保护在中低压电力系统中的重要性

【摘要】&#xff1a; 中低压电力系统由于无母线保护、出线多&#xff0c;操作频繁、三相导体线间距离和与大地的距离比较近、易受小动物危害、设备制造质量比高压设备差&#xff0c;使其弧光事故的易发性大大高于高压。基于此&#xff0c;本文首先阐述弧光产生的原因及危害&am…

yolov5 + openvino + c++测试

1.拉取最新yolov5代码&#xff0c;训练自己数据或者直接用官方pt模型来进行转为openvino的格式&#xff0c;当前已经支持直接把pt模型转为openvino。 我拉取的是&#xff1a;2023-10-03 21:46 dd9e3382c9af9697fb071d26f1fd1698e9be3e04 在export.py代码中把default中加…

MySQL高级-01.Linux系统下安装MySQL

1.环境配置 首先要准备好两台centos虚拟机&#xff0c;在高级篇部分可能有数据库主从复制&#xff0c;所以暂时先开两台虚拟机。 两台虚拟机需要更改&#xff1a; mac地址主机名ip地址UUID 1.更改主机名 更改虚拟机的主机名 vim /etc/hostname2.更改静态ip地址 /etc/sysc…

PyQt 问题记录

1.现成的组件不一定线程安全&#xff0c;&#xff08;包括且不限于数据的修改竞争,和一些组件的崩溃 ) 对于PyQt 的线程使用&#xff0c;可能还需要更谨慎些 保存逻辑 QuestionBox("保存/Save")def Save(self):okFlagFalseerrFlagFalseWriteCmd{}for it in self.Mode…

RAII与智能指针

RAII与智能指针 1.RAII1.1RAII理解1.2RAII的原理1.2.1简单的例子说明局部对象的自动销毁的特性 1.2.2 RAII 过程 2.智能指针2.1 auto_ptr2.1.1auto_ptr的使用构造函数与析构函数拷贝构造函数与赋值提领操作auto ptr其它函数 2.1.2autoptr使用的注意事项 2.2 unique_ptr2.2.1uni…

一元函数极值问题

一元函数极值问题 0 引言 在高等数学课程中&#xff0c;我们应该都学习过一元函数的极值问题&#xff0c;这篇文章我们再来回顾一下相关知识点。为什么要对一元函数的极值问题进行回顾&#xff1f;因为后面我会出一篇非线性规划问题的极值问题&#xff0c;其中会涉及到多元函…

【视觉算法系列1】使用 KerasCV YOLOv8 进行红绿灯检测(下)

提示&#xff1a;免费获取本文涉及的完整代码与数据集&#xff0c;请联系助理老师peaeci122 使用最新“KerasCV YOLOv8”模型进行红绿灯检测的综合指南 YOLO目标检测模型已经进入了无数的应用领域&#xff0c;从监控系统到自动驾驶汽车。那么&#xff0c;如果在KerasCV框架下…

4.DApp-MetaMask怎么连接本地Ganache

题记 用metamask连接本地ganache&#xff0c;以下是全部操作流程 下载Ganache ganache是一个以太坊的个人开发环境&#xff0c;可以在上面部署合约、开发程序和进行测试。 ganache官网&#xff1a;Ganache - Truffle Suite 可以点击下面的按钮直接下载 &#xff0c;下载速度…

怎样自动开始播放网页视频?

有些视频网站&#xff0c;网页打开后&#xff0c;并不会自动播放视频&#xff0c;需要人工点击视频或者播放器的播放按钮&#xff0c;才能进入视频播放状态。有没有办法一打开页面就自动播放视频呢&#xff1f;下面我们就来分析研究一下。 首先使用浏览器的开发者工具查看&am…

MybatisPlus多表关联分页返回结果异常

1. 按照该博客进行多表关联分页查询&#xff1a; https://blog.csdn.net/code_ang/article/details/116448694 2.在实际测试过程中&#xff0c;发现异常&#xff0c;分页返回的结果时而正确&#xff0c;时而错误。 count函数满足预期 count函数不满足预期 只是count了主表的…

pytorch 入门(二)

本文为&#x1f517;小白入门Pytorch内部限免文章 &#x1f368; 本文为&#x1f517;小白入门Pytorch中的学习记录博客&#x1f366; 参考文章&#xff1a;【小白入门Pytorch】教案二&#x1f356; 原作者&#xff1a;K同学啊 目录 一、神经网络的组成部分1. 神经元2. 神经网络…

热成像仪的工作原理及在工业设备状态监测中的应用

前面我们介绍过>>热分析技术在工业设备状态监测中的应用&#xff0c;下面我们将深入探讨热成像仪的工作原理及在工业设备状态监测中的应用。 近年来&#xff0c;热成像仪作为一种先进的检测工具&#xff0c;在工业设备状态监测领域得到了广泛的应用。热成像仪能够通过探测…

oauth2和knife4j结合

1.先说knife4j是个什么东西 他是swagger的升级版&#xff0c;在有swagger的调试功能以及接口描述的基础上&#xff0c;让人看着更加一目了然。 这次可能说的比较浅&#xff0c;主要是说怎么使用以及简单配置&#xff0c;还有我自己踩过的坑&#xff0c;因为这个东西我也第一次…

软件环境基础(ROS、CMake)

参考视频&#xff1a;【全】无人驾驶系列知识入门到提高 本文旨在对视频内容规划控制方面做一些学习记录&#xff0c;希望帮助有需要的人学习提高。不对处&#xff0c;望指正。 0 ROS介绍 ROS特点&#xff1a; 点对点设计&#xff08;比如一个结点读取相机数据&#xff0c;传…

yolo配置(windows)

文章目录 一、下载Anaconda和pycharm1 、Anaconda官方下载地址&#xff1a;1.2 Anaconda 的安装 下载好之后双击打开可执行安装文件&#xff1a;1.3 进入到安装界面&#xff1a;1.4 这里建议两个都勾选&#xff08;第一个选项是将 Anaconda 添加到环境变量中&#xff0c;不勾选…

火山引擎 ByteHouse:双十一即将到来,直播商家如何用数据“点播成金”?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 “双十一”电商大促脚步渐近&#xff0c;各大平台的战火又将燃起。直播电商以低成本、高转化率等优势备受商家青睐。据智研咨询数据显示&#xff0c;2022 年我国直播…

iOS——JSONModel的使用与JSONModel的嵌套

什么是JSONModel JSONModel是一个解析JSON数据的开源库&#xff0c;可以将JSON数据直接解析成自定义的model 使用 JSONModel 非常简单,只需要将你的 model 类继承自 JSONModel ,而同时 model 中的属性名又恰巧可以和 JSON 数据中的 key 名字一样的话,那么非常恭喜你,你的工作…

10.16作业

头文件 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include<QDebug> #include<QIcon> #include<QPushButton> #include<QLineEdit> #include<QLabel> #include<QMovie> #include<QCheckBox> #include<QPa…

MyCAT:回顾当年的热潮,探寻这款备受欢迎的数据库中间件的核心特性

什么是 MyCAT &#xff1f; 根据 MyCAT 官网 - http://mycat.io/ 的描述可以知道&#xff0c; MyCAT 是如下的一个东东&#xff1a; 一个彻底开源的&#xff0c;面向企业应用开发的大数据库集支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库…

银河麒麟你服务x86访问ftp服务器上的文件

打开我的电脑 地址栏输入 ftp地址 可以选择需要的文件复制出来了