# sec_killp
**Repository Path**: Good__night/sec_killp
## Basic Information
- **Project Name**: sec_killp
- **Description**: 高并发的秒杀系统,使用技术栈有SSM,springBoot,Redis,RabbitMQ,分布式等。
- **Primary Language**: Java
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2021-11-08
- **Last Updated**: 2022-01-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: SSM, SpringBoot, Redis, RabbitMQ, 分布式
## README
# 开发流程:
## 1.新建项目
### 新建spring initializr项目
导入pom依赖
```java
com.baomidou
mybatis-plus-boot-starter
3.4.0
commons-codec
commons-codec
org.apache.commons
commons-lang3
```
### 编写配置文件application.yml
```java
spring:
thymeleaf:
#关闭缓存
cache: false
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/seckill
username: root
password: 123456
hikari:
#连接池名
pool-name: DateHikarCP
minimum-idle: 5
maximum-pool-size: 10
idle-timeout: 10000
auto-commit: true
connection-timeout: 30000
max-lifetime: 1800000
#mybatis 配置
mybatis-plus:
#配置mapper.xml的映射文件
mapper-locations: classpath*:/mapper/*Mapper.xml
#配置mybatis数据返回类型别名
type-aliases-package: com.example.sec_killp.pojo
#mybatis sql方法接口所在的包 不是mapper.xml的包
logging:
level:
com.example.sec_killp.mapper: debug
```
### 测试
```java
@Controller
@RequestMapping("/index")
public class Testcontroller {
@RequestMapping("/01")
public String hello(){
return "hello";
}
}
//启动类 SecKillpApplication
@SpringBootApplication
//MapperScan使用后不用在每个mapper文件夹中每个接口中加@Mapper注解了
@MapperScan("com.example.sec_killp.mapper")
public class SecKillpApplication {
public static void main(String[] args) {
SpringApplication.run(SecKillpApplication.class, args);
}
}
```
## 2.前端
### MD5
```java
@Component
public class MD5Utils {
// MD5加密
public static String md5(String src){
return DigestUtils.md5Hex(src);
}
private static final String salt ="1a2b3c4d";
public static String inputPassToFormPass(String inputpass){
// 一次加密下面是加密方法 从输入到后端
String str ="" + salt.charAt(0)+salt.charAt(2)+inputpass+salt.charAt(5)+salt.charAt(4);
// 使用md5
return md5(str);
}
public static String formPassToDBPass(String formpass,String salt){
// 二次加密 从后端到数据库
String str ="" + salt.charAt(0)+salt.charAt(2)+formpass+salt.charAt(5)+salt.charAt(4);
return md5(salt);
}
public static String inputPassToDBPass(String inputpass,String salt){
// 实现上面两次加密,方法调用
String formPass = inputPassToFormPass(inputpass);
String dbPass = formPassToDBPass(formPass,salt);
return dbPass;
}
// 测试方法
public static void main(String[] args){
System.out.println(inputPassToFormPass("123456"));
System.out.println(formPassToDBPass("d3b1294a61a07da9b49b6e22b2cbd7f9", "1z2b3c4d"));
System.out.println(inputPassToDBPass("123456","1z2b3c4d"));
}
}
```
### 公共类RespBean
```java
/**
* 公共返回对象,公共方法,用于返回正确或者失败
*
* @author wangxihao
* @desc
* @email wangxh0108@163.com
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RespBean {
private long code;
private String message;
private Object obj;
/**
* 成功后返回结果
*
* @desc
* @author wangxihao
* @email wangxh0108@163.com
**/
public static RespBean success() {
return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), null);
}
// 成功返回对象
public static RespBean success(Object obj) {
return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), obj);
}
// 失败返回结果
public static RespBean error(RespBeanEnum respBeanEnum) {
return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);
}
// 传对象失败
public static RespBean error(RespBeanEnum respBeanEnum,Object obj) {
return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), obj);
}
}
```
### 登录LoginController.java
```java
@RequestMapping("/doLogin")
@ResponseBody
public RespBean doLogin(LoginVo loginvo){
// log.info("{}",loginvo);
return iwUserService.doLodin(loginvo);
}
}
```
返回doLogin(loginvo)
在service中找到
```JAVA
/**
*
* 服务类
*
*
*wxh-高并发秒杀
*邮箱:wangxh0108@163.com
*/
public interface IWUserService extends IService {
// 登录接口
RespBean doLodin(LoginVo loginvo);
}
```
对应的impl接口
```java
package com.example.sec_killp.service.impl;
import com.example.sec_killp.pojo.WUser;
import com.example.sec_killp.mapper.WUserMapper;
import com.example.sec_killp.service.IWUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.sec_killp.utils.MD5Utils;
import com.example.sec_killp.utils.ValidatorUtil;
import com.example.sec_killp.vo.LoginVo;
import com.example.sec_killp.vo.RespBean;
import com.example.sec_killp.vo.RespBeanEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.thymeleaf.util.StringUtils;
/**
*
* 服务实现类
*
*
*wxh-高并发秒杀
*邮箱:wangxh0108@163.com
*/
@Service
public class WUserServiceImpl extends ServiceImpl implements IWUserService {
// 调用Mapper接口
@Autowired
private WUserMapper wUserMapper;
// 登录实现类
@Override
public RespBean doLodin(LoginVo loginvo) {
String mobile = loginvo.getMobile();
String password = loginvo.getPassword();
if(StringUtils.isEmpty(mobile)||StringUtils.isEmpty(password)){
return RespBean.error(RespBeanEnum.LOGIN_ERROR);
}
if(!ValidatorUtil.isMobile(mobile)){
return RespBean.error(RespBeanEnum.MOBILE_ERROR);
}
WUser wUser = wUserMapper.selectById(mobile);
if (wUser == null){
return RespBean.error(RespBeanEnum.LOGIN_ERROR);
}
// p判断密码是否正确
if(!MD5Utils.formPassToDBPass(password,wUser.getSalt()).equals(wUser.getPassword())){
return RespBean.error(RespBeanEnum.LOGIN_ERROR);
}
return RespBean.success();
}
}
```