从0~1开发财务软件

2024-06-08 16:52
文章标签 开发 财务软件

本文主要是介绍从0~1开发财务软件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 1.获取图形验证码接口

功能要求

1、随机生成6位字符

2、将字符生成base64位格式的图片,返回给前端

3、将生成的字符存储到redis中,用匿名身份id(clientId)作为key,验证码作为value。

clientId通过/login/getClientId接口获取

4、验证码15分钟后过期

依赖包
<!-- 工具类 -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.10</version>
</dependency><!-- redis -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.7.5</version>
</dependency>

redis缓存配置并完善图形验证码接口 

# redis配置
redis:database: 0port: 6379lettuce:pool:#连接池中最大空闲连接数为 30。这意味着连接池可以保持最多 30 个空闲的 Redis 连接,以便在需要时重用。max-idle: 30#连接池中最小空闲连接数为 10。这表示连接池至少会保持 10 个空闲连接,以便在需要时快速获取可用连接。min-idle: 10#连接池中的最大活动连接数为 30。这是指连接池在同一时间可以支持的最大活动(使用中)连接数量。max-active: 30#当连接池已用尽且达到最大活动连接数时,从连接池获取连接的最大等待时间为 10,000 毫秒(10 秒)。如果在等待时间内没有可用连接,将抛出连接超时异常。max-wait: 10000# 应用程序关闭时Lettuce 将等待最多 3 秒钟来完成关闭操作。如果超过这个时间仍未完成,则会强制关闭连接。shutdown-timeout: 3000host: 127.0.0.1

RedisTemplateDefaultConfig.java 

package com.bage.common.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** Redis Template 配置**/
@ConditionalOnProperty(prefix = "sys",name = "redis-template-config",havingValue = "true")
@Configuration
@Slf4j
public class RedisTemplateDefaultConfig<T> {/*** redisTemplate相关配置** @param factory* @return*/@Beanpublic RedisTemplate<String, T> redisTemplate(RedisConnectionFactory factory) {log.info("RedisTemplateConfig init start ...");RedisTemplate<String, T> template = new RedisTemplate<>();// 配置连接工厂template.setConnectionFactory(factory);//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)Jackson2JsonRedisSerializer<Object> jacksonSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper om = new ObjectMapper();// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicom.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);jacksonSerializer.setObjectMapper(om);// 值采用json序列化template.setValueSerializer(jacksonSerializer);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());// 设置hash key 和value序列化模式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(jacksonSerializer);template.afterPropertiesSet();log.info("RedisTemplateConfig init end");return template;}
}

 

 

LoginController.java

import com.bage.finance.biz.dto.form.GetBase64CodeForm;
import com.bage.finance.biz.service.MemberLoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author 啟王朝* date2024/6/6 18:24*/
@Api(tags = "用户登录模块")
@RestController
@RequestMapping("/login")
@RequiredArgsConstructor
/**  @RequiredArgsConstructor final* 作用: 可以省略 @Autowired 和 @Rescuorce  需要注入包的前面必须加上final*/
@Slf4j
public class LoginController {final MemberLoginService memberLoginService;//  获得游客登录的getClientId@ApiOperation(value = "获取客户端id")@GetMapping("/getClientId")public com.bage.common.dto.ApiResponse<String> getClientId() {String clientId = memberLoginService.getClientId();return com.bage.common.dto.ApiResponse.success(clientId);}/*** 作用:*/@ApiOperation(value = "生成base64位格式的图片")@GetMapping("/getBase6Code")/*** 作用:    GetBase64CodeForm form  是将生成的字符存储到redis中,用匿名身份id(clientId)作为key,验证码作为value。* 0*///   @Validated  必须加统一拦截才能起作用public com.bage.common.dto.ApiResponse<String> getBase64Code(@Validated @ModelAttribute GetBase64CodeForm form) {//  返回的是code 为Base64的验证码图片String code = memberLoginService.getBase64Code(form);return com.bage.common.dto.ApiResponse.success(code);}
}

MemberLoginService.java

import com.bage.finance.biz.dto.form.GetBase64CodeForm;/*** @Author:啟王朝* @name:MemberLoginService* @Date:2024/6/6 18:18* @Filename:MemberLoginService*/
public interface MemberLoginService {//  获取客户端idString getClientId();/*** 作用:获得Base64的图形编码*/String getBase64Code(GetBase64CodeForm form);
}

MemberLoginServiceImpl.java 

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.bage.finance.biz.dto.form.GetBase64CodeForm;
import com.bage.finance.biz.service.MemberLoginService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.UUID;
import java.util.concurrent.TimeUnit;import static com.bage.finance.biz.constant.RedisKeyConstant.GRAPHIC_VERIFICATION_CODE;/*** @author 啟王朝* date2024/6/6 18:19*/
@Service
@Slf4j
@RequiredArgsConstructor //  构造参数的注解
public class MemberLoginServiceImpl implements MemberLoginService {final RedisTemplate<String, String> redisTemplate;/*** @Date:获取客户端id // date变量下面会用内置函数进行赋值* @Author:* @return:*/@Overridepublic String getClientId() {return UUID.randomUUID().toString().replace("-", "");}/*** 作用:获取图形验证码界面*/@Overridepublic String getBase64Code(GetBase64CodeForm form) {//  TODO  CaptchaUtil  用工具形成验证码图片/*** 作用:* <dependency>*   <groupId>cn.hutool</groupId>*   <artifactId>hutool-all</artifactId>*   <version>5.8.10</version>* </dependency>*   300,192代表长和宽   5 代表5个字符   lineCount的数字越大,代表的数字越模糊 1000*/LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(300, 192, 5, 1000);//  将验证码内容读出来String code = lineCaptcha.getCode();//  todo 将验证码保存到redis中redisTemplate.opsForValue().set(GRAPHIC_VERIFICATION_CODE + form.getClientId(), code,15, TimeUnit.MINUTES);//  返回base64的图形验证码return lineCaptcha.getImageBase64();}
}

这篇关于从0~1开发财务软件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042757

相关文章

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

基于Python开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T