# 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(); } } ```