自定义注解方式防止前端同一时间多次重复提交
一、 前情提要
有这样一个业务,上课的时候老师给表现好的学生送小花花,
每节课都能统计出某个学生收到的花的总数。
按照产品需求,前端点击送花按钮后30秒内是不能再次送花的(信任的基础)
(上课老师送花行为都进行统计了,可见互联网是多么可怕)
二、技术设计
2.1 库表设计
CREATE TABLE `t_student_flower` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键(自增)', `classroom_id` bigint(20) NOT NULL COMMENT '每堂课的唯一标识', `student_id` bigint(20) NOT NULL COMMENT '学生唯一标识', `flower_num` bigint(20) NOT NULL DEFAULT '0' COMMENT '学生收到的花数量', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
2.2 业务逻辑
业务逻辑很简单,针对某一堂课的某一个学生,老师第一次送花就新增一条记录,之后老师给这个学生送花就在原有的记录基础上增加送花数量即可。
如果前端能保证一堂课,一个学生,30秒内只能送一次花,这样设计能99.9999%的保证业务没问题
2.3 代码编写
至于创建SpringBoot项目,连接Mybatis 准备在Mybatis篇章写,这里主要点不是这些。
重要是业务逻辑
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>student_flower</artifactId> <version>0.0.1-SNAPSHOT</version> <name>student_flower</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--lombok 一款还不错的副主编程工具--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <versi<strong>本文来源gaodai#ma#com搞@@代~&码网</strong>on>1.16.18</version> <scope>provided</scope> </dependency> <!--测试使用--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>