ylb-接口4投资排行榜

总览:
在这里插入图片描述

1、使用Redis存储投资信息

在这里插入图片描述

2、Redis常量类

在common模块constants包,创建一个Redis常量类(RedisKey):

package com.bjpowernode.common.constants;public class RedisKey {/*投资排行榜*/public static  final String KEY_INVEST_RANK = "INVEST:RANK";/*注册时,短信验证码 SMS:REG:手机号*/public static final String KEY_SMS_CODE_REG = "SMS:REG:";/*登录时,短信验证码 SMS:LOGIN:手机号*/public static final String KEY_SMS_CODE_LOGIN = "SMS:LOGIN:";/*redis自增*/public static final String KEY_RECHARGE_ORDERID = "RECHARGE:ORDERID:SEQ";/*orderId*/public static final String KEY_ORDERID_SET= "RECHARGE:ORDERID:SET";
}

3、显示存储投资排行榜的数据RankView

在web模块view包,创建一个显示投资排行榜的数据RankView类:

package com.bjpowernode.front.view.invest;/*** 存储投资排行榜的数据*/
public class RankView {private String phone;private Double money;public RankView(String phone, Double money) {this.phone = phone;this.money = money;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}
}

4、controller处理

在web模块controller包,BaseController添加Redis模板对象(StringRedisTemplate):

package com.bjpowernode.front.controller;import com.bjpowernode.api.service.*;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.data.redis.core.StringRedisTemplate;import javax.annotation.Resource;/*** 公用controller类*/
public class BaseController {//声明公共的方法,属性的等@Resourceprotected StringRedisTemplate stringRedisTemplate;//平台信息服务@DubboReference(interfaceClass = PlatBaseInfoService.class,version = "1.0")protected PlatBaseInfoService platBaseInfoService;//产品服务@DubboReference(interfaceClass = ProductService.class,version = "1.0")protected ProductService productService;//投资服务@DubboReference(interfaceClass = InvestService.class,version = "1.0")protected InvestService investService;//用户服务@DubboReference(interfaceClass = UserService.class,version = "1.0")protected UserService userService;//充值服务@DubboReference(interfaceClass = RechargeService.class,version = "1.0")protected RechargeService rechargeService;
}

在web模块controller包,创建投资控制InvestController 类:
投资排行榜(showInvestRank())

package com.bjpowernode.front.controller;import com.bjpowernode.api.model.User;
import com.bjpowernode.common.constants.RedisKey;
import com.bjpowernode.common.util.CommonUtil;
import com.bjpowernode.front.view.RespResult;
import com.bjpowernode.front.view.invest.RankView;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.*;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;/*** 有关投资功能*/@Api(tags = "投资理财产品")
@RestController
public class InvestController extends BaseController {/*投资排行榜*/@ApiOperation(value = "投资排行榜", notes = "显式投资金额最高的3位用户信息")@GetMapping("/v1/invest/rank")public RespResult showInvestRank() {//从redis查询数据Set<ZSetOperations.TypedTuple<String>> sets = stringRedisTemplate.boundZSetOps(RedisKey.KEY_INVEST_RANK).reverseRangeWithScores(0, 2);List<RankView> rankList = new ArrayList<>();//遍历set集合(lamdba表达式)sets.forEach(tuple -> {//tuple.getValue();//手机号//tuple.getScore();//投资金额rankList.add(new RankView(CommonUtil.tuoMinPhone(tuple.getValue()), tuple.getScore()));});RespResult result = RespResult.ok();result.setList(rankList);return result;}/*购买理财产品, 更新投资排行榜*/@ApiOperation(value = "投资理财产品")@PostMapping("/v1/invest/product")public RespResult investProduct(@RequestHeader("uid") Integer uid,@RequestParam("productId") Integer productId,@RequestParam("money") BigDecimal money){RespResult result = RespResult.fail();//1.检查基本参数if( (uid != null && uid > 0) && (productId != null && productId > 0)&&( money != null && money.intValue() % 100 == 0 && money.intValue() >= 100)){int investResult = investService.investProduct(uid,productId,money);switch (investResult){case 0:result.setMsg("投资数据不正确");break;case 1:result = RespResult.ok();modifyInvestRank(uid,money);break;case 2:result.setMsg("资金账号不存在");break;case 3:result.setMsg("资金不足");break;case 4:result.setMsg("理财产品不存在");break;}}return result;}/*更新投资排行榜*/private void modifyInvestRank(Integer uid,BigDecimal money){User user  = userService.queryById(uid);if(user != null){//更新redis中的投资排行榜String key = RedisKey.KEY_INVEST_RANK;stringRedisTemplate.boundZSetOps(key).incrementScore(user.getPhone(),money.doubleValue());}}
}

手机号脱敏

在common模块util包,工具类CommonUtil添加手机号脱敏方法:(public static String tuoMinPhone(String phone))
1、参数(手机号)验证(存在且为11位数字)
2、拼接前几位和后几位,中间用’*'表示

package com.bjpowernode.common.util;import java.math.BigDecimal;
import java.util.regex.Pattern;public class CommonUtil {/*处理pageNo*/public static int defaultPageNo(Integer pageNo) {int pNo = pageNo;if (pageNo == null || pageNo < 1) {pNo = 1;}return pNo;}/*处理pageSize*/public static int defaultPageSize(Integer pageSize) {int pSize = pageSize;if (pageSize == null || pageSize < 1) {pSize = 1;}return pSize;}/*手机号脱敏*/public static String tuoMinPhone(String phone) {String result = "***********";if (phone != null && phone.trim().length() == 11) {result = phone.substring(0,3) + "******" + phone.substring(9,11);}return result;}/*手机号格式 true:格式正确;false不正确*/public static boolean checkPhone(String phone){boolean flag = false;if( phone != null && phone.length() == 11 ){//^1[1-9]\\d{9}$flag = Pattern.matches("^1[1-9]\\d{9}$",phone);}return flag;}/*比较BigDecimal  n1 >=n2 :true ,false*/public static boolean ge(BigDecimal n1, BigDecimal n2){if( n1 == null || n2 == null){throw new RuntimeException("参数BigDecimal是null");}return  n1.compareTo(n2) >= 0;}
}

全局跨域设置

在web模块settings包,创建一个全局跨域配置类WebMvcConfiguration

package com.bjpowernode.front.settings;import com.bjpowernode.front.interceptor.TokenInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;/*** 全局跨域*/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {@Value("${jwt.secret}")private String jwtSecret;/*token拦截器*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {TokenInterceptor tokenInterceptor = new TokenInterceptor(jwtSecret);String [] addPath = {"/v1/user/realname"};registry.addInterceptor(tokenInterceptor).addPathPatterns(addPath);}/*处理跨域*/@Overridepublic void addCorsMappings(CorsRegistry registry) {System.out.println("===========addCorsMappings===========");//addMapping 处理的请求地址, 拦截这些地址,使用跨域处理逻辑registry.addMapping("/**").allowedOriginPatterns("http://localhost:8080")  //可跨域的域名,可以为 *//支持跨域请求的,http方式.allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS").allowCredentials(true).maxAge(3600)//支持跨域的请求头, 在请求头包含哪些数据时,可以支持跨域功能.allowedHeaders("*");}}

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

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

相关文章

Qt5.15.2安装

解释一下 Qt 的版本号 比如 5.15.2 是完整的 Qt 版本号&#xff0c;第一个数字 5 是大版本号&#xff08;major&#xff09;&#xff0c;第二个数字 15 是小版本号&#xff08;minor&#xff09;&#xff0c;第三个数字 2 是补丁号&#xff08;patch&#xff09;。 只要前面两个…

oracle 如何连同空表一起导出成dmp的方法

1、oracle导出dmp文件的时候&#xff0c;经常会出现一些空表&#xff0c;没有一并被导出的情况。 执行sql select alter table ||table_name|| allocate extent; from user_tables where num_rows0 or num_rows is null; 新建一个sql窗口&#xff0c;把查询结果的sql&#…

GSV6201替代方案|CS5466设计资料|CS5466原理图|typec转HDMI_8k方案芯片

GSV6201是一款高性能、低功耗、高性能的&#xff0c;USB Type-C备用模式显示端口1.4至HDMI 2.1转换器。通过集成增强型微控制器&#xff0c;GSV6201创造了一个经济高效的解决方案提供了上市时间优势。显示端口接收机支持高达32.4Gbps&#xff08;HBR3&#xff0c;4通道&#xf…

uniapp和uview组件实现下拉触底刷新列表

下面是一个在UniApp中使用uView组件实现下拉触底刷新列表的示例&#xff0c;并使用Axios来请求分页数据列表&#xff1a; 首先&#xff0c;确保你已经在UniApp项目中添加了uView组件库。你可以在项目根目录执行以下命令安装它们&#xff1a; npm install uview-ui或者使用 Hb…

曲师大2023大一新生排位赛-D.Factor题解

D.Factor 题目描述 你有一个集合 &#xff0c;和具有 个正整数的数组 . 最初&#xff0c;集合 为空&#xff08;不包含任一元素&#xff09;。你将按照以下方式填充集合 : 以此枚举数组 a 中的每个元素。对于数组中的第 i 个元素 &#xff0c;生成 ​ 的因子集合 ​。如果…

使用对象解构赋值,将对象的某些属性赋值给另一个对象

在处理接口返回的数据时&#xff0c;我需要将接口返回的数据&#xff08;对象&#xff09;的某些属性用另一个对象进行接收&#xff0c;学习对象解构赋值之前&#xff0c;我一直使用的都是最笨的方法&#xff1a; this.formData.projectId res.data.projectId this.formData.…

idea中常用的快捷键

快捷键: 1.快速生成main方法 main/psvm public static void main(String[] args) {} 2.快速复制当前行的代码: ctrld 3.快速捕获异常: altctrlt 4.快速打印结果: sout/soutv System.out.println(s); System.out.println("s " s); 5.自动生成对象的返回值…

【运维工程师学习六】LAM部署搭建个人Discuz论坛

【运维工程师学习六】LAM部署搭建个人Discuz论坛 1、先卸载Mariadb再安装Mysql2、MySQL官网rpm包下载3、在rpm包路径下安装 YUM Repo 文件4、更新软件仓库本地数据库信息5、开始部署——php的安装6、搜索yum包7、开始部署——配置apache以支持php&#xff08;1&#xff09;配置…

GitHub上整理的一些实用的工具

1. Visual Studio Code 简称VScode&#xff0c;是一个轻量且强大的跨平台开源代码编辑器&#xff08;IDE&#xff09;&#xff0c;支持Windows&#xff0c;OS X和Linux。内置JavaScript、TypeScript和Node.js支持&#xff0c;而且拥有丰富的插件生态系统&#xff0c;可通过安装…

SylixOS下SSH和SFTP连接

简要 基于网络的连接&#xff08;telnet&#xff0c;ftp&#xff09;方便高效&#xff0c;但其是基于明文的通信&#xff0c;容易被窃取、篡改和攻击&#xff0c;存在网络安全问题&#xff0c;尤其在进行远程访问时&#xff0c;穿过复杂未知的公网环境非常危险&#xff0c;为此…

ELK-日志服务【es-安装使用】

目录 【1】安装-配置elasticsearch&#xff08;01、02、03相同&#xff09; 端口 【2】安装-配置-启动-Kibana 【3】浏览器访问测试&#xff08;10.0.0.21:5601&#xff09; 【4】使用kibana创建、更新、删除es索引、文档 【5】组es集群&#xff08;投票选举机制&#xf…

【多线程】(六)Java并发编程深度解析:常见锁策略、CAS、synchronized原理、线程安全集合类和死锁详解

文章目录 一、常见锁策略1.1 乐观锁和悲观锁1.2 读写锁1.3 重量级锁和轻量级锁1.4 自旋锁1.5 公平锁和非公平锁1.6 可重入锁和不可重入锁 二、CAS2.1 什么是CAS2.2 CAS的实现原理2.3 CAS应用2.4 ABA问题 三、synchronized原理3.1 synchronized锁的特点3.2 加锁工作过程3.3 锁消…

自动驾驶多任务框架 MultiTask V3、HybridNets和YOLOP比较

目标检测和分割是自动驾驶汽车感知系统的两个核心模块。它们应该具有高效率和低延迟,同时降低计算复杂性。目前,最常用的算法是基于深度神经网络的,这保证了高效率,但需要高性能的计算平台。 在自动驾驶汽车的场景下,大多使用的都是计算能力有限的嵌入式平台,这使得难以满…

力扣 332. 重新安排行程

一、题目描述 给你一份航线列表 tickets&#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必须从 JFK 开始。…

计算机网络基础-OSI七层模型 和 TCP/IP四层模型的对比

OSI七层模型 和 TCP/IP四层模型的对比 OSI七层模型&#xff1a; 理论上的网络通信模型 记忆&#xff1a; (物、链、网、输、会、示、用) TCP/IP四层模型&#xff1a; 实际上的网络通信标准 (1) 七层网络体系结构各层的主要功能&#xff1a; 应用层&#xff1a; 最上层的&am…

Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用

一、基本概念 1.什么是Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强&#xff0c;其并发能力确实在同类型的网页server中表现较好。 http服务器 Web服务器是指驻留于因特网上某种类型计算机的程…

请问支付功能如何测试

目录 01测试思维 02支付功能的测试点 一&#xff1a;支付的分类&#xff1a; 二&#xff1a;功能测试 三&#xff1a;接口测试 四&#xff1a;安全测试 五&#xff1a;测试点 01测试思维 要分析测试点之前&#xff0c;我们先来梳理一下测试思维。总结来说&#xff0c;任…

IP首部报文字段

一、IP首部报文字段 字段如下图所示 二、每个字段的含义 版本 表示 IP 协议的版本。通信双方使用的 IP 协议版本必须一致。目前广泛使用的IP协议版本号为 4&#xff0c;即 IPv4 首部长度 这个字段所表示数的单位是 32 位字长&#xff08;1 个 32 位字长是 4 字节&#xff0…

分布式事务 Seata

分布式事务 Seata 事务介绍分布式理论Seata 介绍Seata 部署与集成Seata TC Server 部署微服务集成 Seata XA 模式AT 模式AT 模式执行过程读写隔离写隔离读隔离 实现 AT 模式 TCC 模式TCC 模式介绍实现 TCC 模式 Saga 模式Seata 四种模式对比 事务介绍 事务&#xff08;Transac…

uniapp引入echarts

作为前端在开发需求的时候经常会遇到将数据展示为图表的需求&#xff0c;之前一直用的HBuilder的图表插件uCharts&#xff0c;使用方法可以参考我的另一篇博客&#xff1a;uniapp 中使用图表&#xff08;秋云uCharts图表组件&#xff09; 但是最近发现uCharts很多功能都需要付…