mirror of
https://github.com/qiurunze123/miaosha.git
synced 2023-11-19 22:41:03 +08:00
code clean
This commit is contained in:
parent
df23e07856
commit
993280d5fd
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#### [提交合并代码规范](/docs/code-criterion.md)
|
#### [提交合并代码规范](/docs/code-criterion.md)
|
||||||
|
|
||||||
>> 秒杀注意事项
|
> 秒杀注意事项
|
||||||
#### [1.如何解决卖超问题]()
|
#### [1.如何解决卖超问题]()
|
||||||
--在sql加上判断防止数据边为负数
|
--在sql加上判断防止数据边为负数
|
||||||
--数据库加唯一索引防止用户重复购买
|
--数据库加唯一索引防止用户重复购买
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package com.geekq.miaosha;
|
package com.geekq.miaosha.common;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
|
@ -1,27 +0,0 @@
|
||||||
package com.geekq.miaosha.common;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 响应类
|
|
||||||
*/
|
|
||||||
public enum ResponseCode {
|
|
||||||
SUCCESS(0, "SUCCESS"),
|
|
||||||
ERROR(1, "ERROR"),
|
|
||||||
NEED_LOGIN(10, "NEED_LOGIN"),
|
|
||||||
ILLEGAL_ARGUMENT(2, "ILLEGAL_ARGUMENT");
|
|
||||||
|
|
||||||
private final int code;
|
|
||||||
private final String desc;
|
|
||||||
|
|
||||||
private ResponseCode(int code, String desc) {
|
|
||||||
this.code = code;
|
|
||||||
this.desc = desc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCode() {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getDesc() {
|
|
||||||
return desc;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
package com.geekq.miaosha.common;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
|
|
||||||
//保证序列化的时候 不会有空
|
|
||||||
public class ServerResponse<T> implements Serializable {
|
|
||||||
|
|
||||||
private int status ;
|
|
||||||
private String msg ;
|
|
||||||
private T data ;
|
|
||||||
private ServerResponse( int status ){
|
|
||||||
this.status =status;
|
|
||||||
}
|
|
||||||
private ServerResponse( int status ,T data){
|
|
||||||
this.status =status;
|
|
||||||
this.data = data;
|
|
||||||
}
|
|
||||||
private ServerResponse( int status ,String msg ,T data){
|
|
||||||
this.status =status;
|
|
||||||
this.msg = msg ;
|
|
||||||
this.data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
private ServerResponse( int status ,String msg ){
|
|
||||||
this.status =status;
|
|
||||||
this.msg = msg ;
|
|
||||||
}
|
|
||||||
|
|
||||||
@JsonIgnore
|
|
||||||
public boolean isSuccess(){
|
|
||||||
return this.status == ResponseCode.SUCCESS.getCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getStatus() {
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMsg() {
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T getData() {
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> ServerResponse<T> createBySuccess(){
|
|
||||||
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> ServerResponse<T> createBySuccessMessage(String msg){
|
|
||||||
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> ServerResponse<T> createBySuccess(T data){
|
|
||||||
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> ServerResponse<T> createBySuccess(String msg,T data){
|
|
||||||
return new ServerResponse<T>(ResponseCode.SUCCESS.getCode(),msg,data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> ServerResponse<T> createByError(){
|
|
||||||
return new ServerResponse<T>(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getDesc());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> ServerResponse<T> createByErrorMessage(String errorMsg){
|
|
||||||
return new ServerResponse<T>(ResponseCode.ERROR.getCode(),errorMsg);
|
|
||||||
}
|
|
||||||
public static <T> ServerResponse<T> createByErrorCodeMessage(int errorCode , String errorMsg){
|
|
||||||
return new ServerResponse<T>(errorCode,errorMsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
package com.geekq.miaosha;
|
package com.geekq.miaosha.common;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
|
@ -1,19 +1,65 @@
|
||||||
package com.geekq.miaosha.common.enums;
|
package com.geekq.miaosha.common.enums;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 普通返回类
|
||||||
|
* 1打头 系统系列错误
|
||||||
|
* 2 注册登录系列错误
|
||||||
|
* 3 check 系列错误
|
||||||
|
* 4 秒杀错误
|
||||||
|
* 5 商品错误
|
||||||
|
* 6 订单错误
|
||||||
|
* @author qiurunze
|
||||||
|
*/
|
||||||
public enum ResultStatus {
|
public enum ResultStatus {
|
||||||
SUCCESS(0, "成功"),
|
SUCCESS(0, "成功"),
|
||||||
FAILD(-1, "失败"),
|
FAILD(-1, "失败"),
|
||||||
EXCEPTION(-1, "系统异常"),
|
EXCEPTION(-1, "系统异常"),
|
||||||
PARAM_ERROR(1000, "参数错误"),
|
PARAM_ERROR(10000, "参数错误"),
|
||||||
SYSTEM_ERROR(1001, "系统错误"),
|
SYSTEM_ERROR(10001, "系统错误"),
|
||||||
FILE_NOT_EXIST(1001, "文件不存在"),
|
FILE_NOT_EXIST(10002, "文件不存在"),
|
||||||
FILE_NOT_DOWNLOAD(1002, "文件没有下载"),
|
FILE_NOT_DOWNLOAD(10003, "文件没有下载"),
|
||||||
FILE_NOT_GENERATE(1003, "文件没有生成"),
|
FILE_NOT_GENERATE(10004, "文件没有生成"),
|
||||||
FILE_NOT_STORAGE(1004, "文件没有入库"),
|
FILE_NOT_STORAGE(10005, "文件没有入库"),
|
||||||
SYSTEM_DB_ERROR(1005, "数据库系统错误"),
|
SYSTEM_DB_ERROR(10006, "数据库系统错误"),
|
||||||
FILE_ALREADY_DOWNLOAD(1003, "文件已经下载"),
|
FILE_ALREADY_DOWNLOAD(10007, "文件已经下载"),
|
||||||
DATA_ALREADY_PEXISTS(1006, "数据已经存在");
|
DATA_ALREADY_PEXISTS(10008, "数据已经存在"),
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 注册登录
|
||||||
|
*/
|
||||||
|
RESIGETR_SUCCESS(20000,"注册成功!"),
|
||||||
|
RESIGETER_FAIL(200001,"注册失败!"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check
|
||||||
|
*/
|
||||||
|
BIND_ERROR (30001,"参数校验异常:%s"),
|
||||||
|
ACCESS_LIMIT_REACHED (30002,"请求非法!"),
|
||||||
|
REQUEST_ILLEGAL (30004,"访问太频繁!"),
|
||||||
|
SESSION_ERROR (30005,"Session不存在或者已经失效!"),
|
||||||
|
PASSWORD_EMPTY (30006,"登录密码不能为空!"),
|
||||||
|
MOBILE_EMPTY (30007,"手机号不能为空!"),
|
||||||
|
MOBILE_ERROR (30008,"手机号格式错误!"),
|
||||||
|
MOBILE_NOT_EXIST (30009,"手机号不存在!"),
|
||||||
|
PASSWORD_ERROR (30010,"密码错误!"),
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单模块
|
||||||
|
*/
|
||||||
|
ORDER_NOT_EXIST(60001,"订单不存在"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 秒杀模块
|
||||||
|
*/
|
||||||
|
MIAO_SHA_OVER(40001,"商品已经秒杀完毕"),
|
||||||
|
REPEATE_MIAOSHA(40002,"不能重复秒杀"),
|
||||||
|
MIAOSHA_FAIL(40003,"秒杀失败");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 商品模块
|
||||||
|
*/
|
||||||
private int code;
|
private int code;
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
|
@ -49,4 +95,8 @@ public enum ResultStatus {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.getName();
|
return this.getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ResultStatus(Object... args) {
|
||||||
|
this.message = String.format(this.message, args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,10 +8,17 @@ public class AbstractResult {
|
||||||
private String message;
|
private String message;
|
||||||
|
|
||||||
protected AbstractResult(ResultStatus status, String message) {
|
protected AbstractResult(ResultStatus status, String message) {
|
||||||
|
this.code = status.getCode();
|
||||||
this.status = status;
|
this.status = status;
|
||||||
this.message = message;
|
this.message = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected AbstractResult(ResultStatus status) {
|
||||||
|
this.code = status.getCode();
|
||||||
|
this.message = status.getMessage();
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isSuccess(AbstractResult result) {
|
public static boolean isSuccess(AbstractResult result) {
|
||||||
return result != null && result.status == ResultStatus.SUCCESS && result.getCode() == ResultStatus.SUCCESS.getCode();
|
return result != null && result.status == ResultStatus.SUCCESS && result.getCode() == ResultStatus.SUCCESS.getCode();
|
||||||
}
|
}
|
||||||
|
@ -37,7 +44,6 @@ public class AbstractResult {
|
||||||
this.status = ResultStatus.SUCCESS;
|
this.status = ResultStatus.SUCCESS;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ResultStatus getStatus() {
|
public ResultStatus getStatus() {
|
||||||
return this.status;
|
return this.status;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
package com.geekq.miaosha.common.resultbean;
|
|
||||||
|
|
||||||
import com.geekq.miaosha.common.enums.ResultStatus;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
|
|
||||||
public class Result<T> extends AbstractResult implements Serializable {
|
|
||||||
private static final long serialVersionUID = 867933019328199779L;
|
|
||||||
private T value;
|
|
||||||
private Integer count;
|
|
||||||
|
|
||||||
protected Result(ResultStatus status, String message) {
|
|
||||||
super(status, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> Result<T> build() {
|
|
||||||
return new Result(ResultStatus.SUCCESS, (String)null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> Result<T> build(String message) {
|
|
||||||
return new Result(ResultStatus.SUCCESS, message);
|
|
||||||
}
|
|
||||||
|
|
||||||
public T getValue() {
|
|
||||||
return this.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(T value) {
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getCount() {
|
|
||||||
return this.count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCount(Integer count) {
|
|
||||||
this.count = count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void success(T value) {
|
|
||||||
this.success();
|
|
||||||
this.value = value;
|
|
||||||
this.count = 0;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.geekq.miaosha.common.resultbean;
|
||||||
|
|
||||||
|
import com.geekq.miaosha.common.enums.ResultStatus;
|
||||||
|
import com.geekq.miaosha.result.CodeMsg;
|
||||||
|
import com.geekq.miaosha.result.Result;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
public class ResultGeekQ<T> extends AbstractResult implements Serializable {
|
||||||
|
private static final long serialVersionUID = 867933019328199779L;
|
||||||
|
private T data;
|
||||||
|
private Integer count;
|
||||||
|
|
||||||
|
protected ResultGeekQ(ResultStatus status, String message) {
|
||||||
|
super(status, message);
|
||||||
|
}
|
||||||
|
protected ResultGeekQ(ResultStatus status) {
|
||||||
|
super(status);
|
||||||
|
}
|
||||||
|
public static <T> ResultGeekQ<T> build() {
|
||||||
|
return new ResultGeekQ(ResultStatus.SUCCESS, (String)null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> ResultGeekQ<T> build(String message) {
|
||||||
|
return new ResultGeekQ(ResultStatus.SUCCESS, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> ResultGeekQ<T> error(ResultStatus status) {
|
||||||
|
return new ResultGeekQ<T>(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(T data) {
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCount() {
|
||||||
|
return this.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCount(Integer count) {
|
||||||
|
this.count = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void success(T value) {
|
||||||
|
this.success();
|
||||||
|
this.data = value;
|
||||||
|
this.count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,16 +1,14 @@
|
||||||
package com.geekq.miaosha.dao;
|
package com.geekq.miaosha.config;
|
||||||
|
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
|
||||||
|
|
||||||
|
import com.alibaba.druid.pool.DruidDataSource;
|
||||||
|
import com.alibaba.druid.support.http.StatViewServlet;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
import com.alibaba.druid.pool.DruidDataSource;
|
import javax.sql.DataSource;
|
||||||
import com.alibaba.druid.support.http.StatViewServlet;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@ConfigurationProperties(prefix="spring.datasource")
|
@ConfigurationProperties(prefix="spring.datasource")
|
|
@ -24,17 +24,9 @@ public class UserArgumentResolver implements HandlerMethodArgumentResolver {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
|
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest webRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
|
||||||
// HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
|
/**
|
||||||
// HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
|
* threadlocal 存储线程副本 保证线程不冲突
|
||||||
//
|
*/
|
||||||
// String paramToken = request.getParameter(MiaoShaUserService.COOKIE_NAME_TOKEN);
|
|
||||||
// String cookieToken = getCookieValue(request, MiaoShaUserService.COOKIE_NAME_TOKEN);
|
|
||||||
// if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
|
|
||||||
// return null;
|
|
||||||
// }
|
|
||||||
// String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
|
|
||||||
// return userService.getByToken(response, token);
|
|
||||||
//threadlocal 存储线程副本 保证线程不冲突
|
|
||||||
return UserContext.getUser();
|
return UserContext.getUser();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,19 +13,19 @@ import java.util.List;
|
||||||
public class WebConfig extends WebMvcConfigurerAdapter {
|
public class WebConfig extends WebMvcConfigurerAdapter {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
UserArgumentResolver userArgumentResolver;
|
UserArgumentResolver resolver;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private AccessInterceptor accessInterceptor;
|
private AccessInterceptor interceptor;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addInterceptors(InterceptorRegistry registry) {
|
public void addInterceptors(InterceptorRegistry registry) {
|
||||||
super.addInterceptors(registry);
|
super.addInterceptors(registry);
|
||||||
registry.addInterceptor(accessInterceptor);
|
registry.addInterceptor(interceptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
|
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
|
||||||
argumentResolvers.add(userArgumentResolver);
|
argumentResolvers.add(resolver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
package com.geekq.miaosha.controller;
|
|
||||||
|
|
||||||
import com.geekq.miaosha.domain.User;
|
|
||||||
import com.geekq.miaosha.redis.RedisService;
|
|
||||||
import com.geekq.miaosha.redis.Userkey;
|
|
||||||
import com.geekq.miaosha.result.CodeMsg;
|
|
||||||
import com.geekq.miaosha.result.Result;
|
|
||||||
import com.geekq.miaosha.service.UserService;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Controller;
|
|
||||||
import org.springframework.ui.Model;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Controller
|
|
||||||
@RequestMapping("/demo")
|
|
||||||
public class DemoController {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private UserService userService ;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RedisService redisService;
|
|
||||||
|
|
||||||
@RequestMapping("/")
|
|
||||||
@ResponseBody
|
|
||||||
String home(){
|
|
||||||
return "hello world" ;
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/user")
|
|
||||||
@ResponseBody
|
|
||||||
public Result<User> user(){
|
|
||||||
User user = userService.getById(1);
|
|
||||||
return Result.success(user) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@RequestMapping("/hello")
|
|
||||||
@ResponseBody
|
|
||||||
public Result<String> hello(){
|
|
||||||
return Result.success("hello world!");
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/helloError")
|
|
||||||
@ResponseBody
|
|
||||||
public Result<String> helloError(){
|
|
||||||
Map<String,String> map = new HashMap<String, String>() ;
|
|
||||||
map.put("a","1") ;
|
|
||||||
return Result.error(CodeMsg.SERVER_ERROR) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/thymeleaf")
|
|
||||||
public String thymeleaf(Model model ){
|
|
||||||
model.addAttribute("name","world") ;
|
|
||||||
return "hello" ;
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/redis/set")
|
|
||||||
@ResponseBody
|
|
||||||
public Result<Boolean> redis(){
|
|
||||||
User user = userService.getById(1);
|
|
||||||
boolean ret = redisService.set(Userkey.getById,""+1,user);
|
|
||||||
return Result.success(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/redis/get")
|
|
||||||
@ResponseBody
|
|
||||||
public Result<User> redisG(){
|
|
||||||
User user = redisService.get(Userkey.getById,""+1,User.class) ;
|
|
||||||
return Result.success(user) ;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.geekq.miaosha.controller;
|
package com.geekq.miaosha.controller;
|
||||||
|
|
||||||
|
import com.geekq.miaosha.common.resultbean.ResultGeekQ;
|
||||||
import com.geekq.miaosha.domain.MiaoshaUser;
|
import com.geekq.miaosha.domain.MiaoshaUser;
|
||||||
import com.geekq.miaosha.redis.GoodsKey;
|
import com.geekq.miaosha.redis.GoodsKey;
|
||||||
import com.geekq.miaosha.redis.RedisService;
|
import com.geekq.miaosha.redis.RedisService;
|
||||||
|
@ -40,7 +41,7 @@ public class GoodsController {
|
||||||
private GoodsService goodsService;
|
private GoodsService goodsService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
ThymeleafViewResolver thymeleafViewResolver;
|
ThymeleafViewResolver viewResolver;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
ApplicationContext applicationContext;
|
ApplicationContext applicationContext;
|
||||||
|
@ -64,7 +65,7 @@ public class GoodsController {
|
||||||
SpringWebContext ctx = new SpringWebContext(request,response,
|
SpringWebContext ctx = new SpringWebContext(request,response,
|
||||||
request.getServletContext(),request.getLocale(), model.asMap(), applicationContext );
|
request.getServletContext(),request.getLocale(), model.asMap(), applicationContext );
|
||||||
//手动渲染
|
//手动渲染
|
||||||
html = thymeleafViewResolver.getTemplateEngine().process("goods_list", ctx);
|
html = viewResolver.getTemplateEngine().process("goods_list", ctx);
|
||||||
if(!StringUtils.isEmpty(html)) {
|
if(!StringUtils.isEmpty(html)) {
|
||||||
redisService.set(GoodsKey.getGoodsList, "", html);
|
redisService.set(GoodsKey.getGoodsList, "", html);
|
||||||
}
|
}
|
||||||
|
@ -108,7 +109,7 @@ public class GoodsController {
|
||||||
|
|
||||||
SpringWebContext ctx = new SpringWebContext(request,response,
|
SpringWebContext ctx = new SpringWebContext(request,response,
|
||||||
request.getServletContext(),request.getLocale(), model.asMap(), applicationContext );
|
request.getServletContext(),request.getLocale(), model.asMap(), applicationContext );
|
||||||
html = thymeleafViewResolver.getTemplateEngine().process("goods_detail", ctx);
|
html = viewResolver.getTemplateEngine().process("goods_detail", ctx);
|
||||||
if(!StringUtils.isEmpty(html)) {
|
if(!StringUtils.isEmpty(html)) {
|
||||||
redisService.set(GoodsKey.getGoodsDetail, ""+goodsId, html);
|
redisService.set(GoodsKey.getGoodsDetail, ""+goodsId, html);
|
||||||
}
|
}
|
||||||
|
@ -124,8 +125,9 @@ public class GoodsController {
|
||||||
*/
|
*/
|
||||||
@RequestMapping(value="/detail/{goodsId}")
|
@RequestMapping(value="/detail/{goodsId}")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Result<GoodsDetailVo> detail(HttpServletRequest request, HttpServletResponse response, Model model,MiaoshaUser user,
|
public ResultGeekQ<GoodsDetailVo> detail(HttpServletRequest request, HttpServletResponse response, Model model,MiaoshaUser user,
|
||||||
@PathVariable("goodsId")long goodsId) {
|
@PathVariable("goodsId")long goodsId) {
|
||||||
|
ResultGeekQ<GoodsDetailVo> result = ResultGeekQ.build();
|
||||||
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
|
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
|
||||||
long startAt = goods.getStartDate().getTime();
|
long startAt = goods.getStartDate().getTime();
|
||||||
long endAt = goods.getEndDate().getTime();
|
long endAt = goods.getEndDate().getTime();
|
||||||
|
@ -147,6 +149,7 @@ public class GoodsController {
|
||||||
vo.setUser(user);
|
vo.setUser(user);
|
||||||
vo.setRemainSeconds(remainSeconds);
|
vo.setRemainSeconds(remainSeconds);
|
||||||
vo.setMiaoshaStatus(miaoshaStatus);
|
vo.setMiaoshaStatus(miaoshaStatus);
|
||||||
return Result.success(vo);
|
result.setData(vo);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,88 +1,39 @@
|
||||||
package com.geekq.miaosha.controller;
|
package com.geekq.miaosha.controller;
|
||||||
|
|
||||||
import com.geekq.miaosha.dao.UserMapper;
|
import com.geekq.miaosha.common.resultbean.ResultGeekQ;
|
||||||
import com.geekq.miaosha.domain.MiaoshaUser;
|
|
||||||
import com.geekq.miaosha.result.Result;
|
|
||||||
import com.geekq.miaosha.service.MiaoShaUserService;
|
import com.geekq.miaosha.service.MiaoShaUserService;
|
||||||
import com.geekq.miaosha.vo.LoginVo;
|
import com.geekq.miaosha.vo.LoginVo;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/login")
|
@RequestMapping("/login")
|
||||||
public class LoginController {
|
public class LoginController {
|
||||||
|
|
||||||
private static Logger log = LoggerFactory.getLogger(LoginController.class);
|
private static Logger logger = LoggerFactory.getLogger(LoginController.class);
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private MiaoShaUserService userService;
|
private MiaoShaUserService userService;
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private UserMapper userMapper;
|
|
||||||
|
|
||||||
@RequestMapping("/to_login")
|
@RequestMapping("/to_login")
|
||||||
public String tologin(LoginVo loginVo) {
|
public String tologin(LoginVo loginVo) {
|
||||||
log.info(loginVo.toString());
|
logger.info(loginVo.toString());
|
||||||
return "login";
|
return "login";
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/do_login")
|
@RequestMapping("/do_login")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Result<Boolean> dologin(HttpServletResponse response, @Valid LoginVo loginVo) {
|
public ResultGeekQ<Boolean> dologin(HttpServletResponse response, @Valid LoginVo loginVo) {
|
||||||
log.info(loginVo.toString());
|
ResultGeekQ<Boolean> result = ResultGeekQ.build();
|
||||||
|
logger.info(loginVo.toString());
|
||||||
userService.login(response, loginVo);
|
userService.login(response, loginVo);
|
||||||
return Result.success(true);
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@RequestMapping(value = "/register", method = RequestMethod.POST)
|
|
||||||
public Result<String> register(MiaoshaUser user) {
|
|
||||||
return userService.insertMiaoShaUser(user);
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping("/mybatis")
|
|
||||||
public void mybatisXml() {
|
|
||||||
//
|
|
||||||
int count = userMapper.getMiaoShaUserNum();
|
|
||||||
System.out.println(count);
|
|
||||||
MiaoshaUser user = userMapper.getMiaoShaUserById(Long.valueOf("18612766134"));
|
|
||||||
System.out.println(user);
|
|
||||||
//
|
|
||||||
// MiaoshaUser miaoshaUser =new MiaoshaUser();
|
|
||||||
// miaoshaUser.setId(Long.valueOf("1234569879"));
|
|
||||||
// miaoshaUser.setNickname("test");
|
|
||||||
// Long num = userMapper.insertMiaoShaUser(miaoshaUser);
|
|
||||||
|
|
||||||
// MiaoshaUser upmiaoshaUser =new MiaoshaUser();
|
|
||||||
// upmiaoshaUser.setId(Long.valueOf("1234569879"));
|
|
||||||
// upmiaoshaUser.setNickname("test1");
|
|
||||||
// userMapper.updateMiaoShaUser(upmiaoshaUser);
|
|
||||||
//
|
|
||||||
// userMapper.deleteMiaoShaUser(Long.valueOf("1234569879"));
|
|
||||||
|
|
||||||
List<MiaoshaUser> lists = new ArrayList<MiaoshaUser>();
|
|
||||||
MiaoshaUser upmiaoshaUser =new MiaoshaUser();
|
|
||||||
upmiaoshaUser.setId(Long.valueOf("1234569879"));
|
|
||||||
upmiaoshaUser.setNickname("test1");
|
|
||||||
MiaoshaUser upmiaoshaUser1 =new MiaoshaUser();
|
|
||||||
upmiaoshaUser1.setId(Long.valueOf("1234569872"));
|
|
||||||
upmiaoshaUser1.setNickname("test1");
|
|
||||||
lists.add(upmiaoshaUser);
|
|
||||||
lists.add(upmiaoshaUser1);
|
|
||||||
|
|
||||||
userMapper.insertMiaoShaUserValues(lists);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package com.geekq.miaosha.controller;
|
package com.geekq.miaosha.controller;
|
||||||
|
|
||||||
import com.geekq.miaosha.access.AccessLimit;
|
import com.geekq.miaosha.access.AccessLimit;
|
||||||
|
import com.geekq.miaosha.common.enums.ResultStatus;
|
||||||
|
import com.geekq.miaosha.common.resultbean.ResultGeekQ;
|
||||||
import com.geekq.miaosha.domain.MiaoshaOrder;
|
import com.geekq.miaosha.domain.MiaoshaOrder;
|
||||||
import com.geekq.miaosha.domain.MiaoshaUser;
|
import com.geekq.miaosha.domain.MiaoshaUser;
|
||||||
import com.geekq.miaosha.rabbitmq.MQSender;
|
import com.geekq.miaosha.rabbitmq.MQSender;
|
||||||
|
@ -28,153 +30,168 @@ import java.io.OutputStream;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.geekq.miaosha.common.enums.ResultStatus.*;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/miaosha")
|
@RequestMapping("/miaosha")
|
||||||
public class MiaoshaController implements InitializingBean {
|
public class MiaoshaController implements InitializingBean {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
MiaoShaUserService userService;
|
MiaoShaUserService userService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
RedisService redisService;
|
RedisService redisService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
GoodsService goodsService;
|
GoodsService goodsService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
OrderService orderService;
|
OrderService orderService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
MiaoshaService miaoshaService;
|
MiaoshaService miaoshaService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
MQSender mqSender ;
|
MQSender mqSender;
|
||||||
|
|
||||||
private HashMap<Long, Boolean> localOverMap = new HashMap<Long, Boolean>();
|
private HashMap<Long, Boolean> localOverMap = new HashMap<Long, Boolean>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QPS:1306
|
* QPS:1306
|
||||||
* 5000 * 10
|
* 5000 * 10
|
||||||
* get post get 幂等 从服务端获取数据 不会产生影响 post 对服务端产生变化
|
* get post get 幂等 从服务端获取数据 不会产生影响 post 对服务端产生变化
|
||||||
* */
|
*/
|
||||||
@AccessLimit(seconds = 5,maxCount = 5,needLogin = true)
|
@AccessLimit(seconds = 5, maxCount = 5, needLogin = true)
|
||||||
@RequestMapping(value="/{path}/do_miaosha", method= RequestMethod.POST)
|
@RequestMapping(value = "/{path}/do_miaosha", method = RequestMethod.POST)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Result<Integer> miaosha(Model model, MiaoshaUser user,
|
public ResultGeekQ<Integer> miaosha(Model model, MiaoshaUser user,
|
||||||
@RequestParam("goodsId")long goodsId,@PathVariable("path") String path) {
|
@RequestParam("goodsId") long goodsId, @PathVariable("path") String path) {
|
||||||
if (user == null) {
|
ResultGeekQ<Integer> result = ResultGeekQ.build();
|
||||||
return Result.error(CodeMsg.SESSION_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//验证path
|
|
||||||
boolean check = miaoshaService.checkPath(user, goodsId, path);
|
|
||||||
if(!check){
|
|
||||||
return Result.error(CodeMsg.REQUEST_ILLEGAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (user == null) {
|
||||||
|
result.withError(SESSION_ERROR.getCode(), SESSION_ERROR.getMessage());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
//验证path
|
||||||
|
boolean check = miaoshaService.checkPath(user, goodsId, path);
|
||||||
|
if (!check) {
|
||||||
|
result.withError(REQUEST_ILLEGAL.getCode(), REQUEST_ILLEGAL.getMessage());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
// //使用RateLimiter 限流
|
// //使用RateLimiter 限流
|
||||||
// RateLimiter rateLimiter = RateLimiter.create(10);
|
// RateLimiter rateLimiter = RateLimiter.create(10);
|
||||||
// //判断能否在1秒内得到令牌,如果不能则立即返回false,不会阻塞程序
|
// //判断能否在1秒内得到令牌,如果不能则立即返回false,不会阻塞程序
|
||||||
// if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
|
// if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) {
|
||||||
// System.out.println("短期无法获取令牌,真不幸,排队也瞎排");
|
// System.out.println("短期无法获取令牌,真不幸,排队也瞎排");
|
||||||
// return Result.error(CodeMsg.MIAOSHA_FAIL);
|
// return ResultGeekQ.error(CodeMsg.MIAOSHA_FAIL);
|
||||||
//
|
//
|
||||||
// }
|
// }
|
||||||
|
|
||||||
//是否已经秒杀到
|
//是否已经秒杀到
|
||||||
MiaoshaOrder order = orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);
|
MiaoshaOrder order = orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);
|
||||||
if(order!=null){
|
if (order != null) {
|
||||||
return Result.error(CodeMsg.REPEATE_MIAOSHA) ;
|
result.withError(REPEATE_MIAOSHA.getCode(), REPEATE_MIAOSHA.getMessage());
|
||||||
}
|
return result;
|
||||||
//内存标记,减少redis访问
|
}
|
||||||
boolean over = localOverMap.get(goodsId);
|
//内存标记,减少redis访问
|
||||||
if(over) {
|
boolean over = localOverMap.get(goodsId);
|
||||||
return Result.error(CodeMsg.MIAO_SHA_OVER);
|
if (over) {
|
||||||
}
|
result.withError(MIAO_SHA_OVER.getCode(), MIAO_SHA_OVER.getMessage());
|
||||||
//预见库存
|
return result;
|
||||||
Long stock = redisService.decr(GoodsKey.getMiaoshaGoodsStock,""+goodsId) ;
|
}
|
||||||
if(stock <0){
|
//预见库存
|
||||||
localOverMap.put(goodsId, true);
|
Long stock = redisService.decr(GoodsKey.getMiaoshaGoodsStock, "" + goodsId);
|
||||||
return Result.error(CodeMsg.MIAO_SHA_OVER);
|
if (stock < 0) {
|
||||||
}
|
localOverMap.put(goodsId, true);
|
||||||
MiaoshaMessage mm = new MiaoshaMessage();
|
result.withError(MIAO_SHA_OVER.getCode(), MIAO_SHA_OVER.getMessage());
|
||||||
mm.setGoodsId(goodsId);
|
return result;
|
||||||
mm.setUser(user);
|
}
|
||||||
mqSender.sendMiaoshaMessage(mm);
|
MiaoshaMessage mm = new MiaoshaMessage();
|
||||||
return Result.success(0);
|
mm.setGoodsId(goodsId);
|
||||||
}
|
mm.setUser(user);
|
||||||
|
mqSender.sendMiaoshaMessage(mm);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* orderId:成功
|
* orderId:成功
|
||||||
* -1:秒杀失败
|
* -1:秒杀失败
|
||||||
* 0: 排队中
|
* 0: 排队中
|
||||||
* */
|
*/
|
||||||
@AccessLimit(seconds = 5,maxCount = 5,needLogin = true)
|
@AccessLimit(seconds = 5, maxCount = 5, needLogin = true)
|
||||||
@RequestMapping(value="/result", method=RequestMethod.GET)
|
@RequestMapping(value = "/result", method = RequestMethod.GET)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Result<Long> miaoshaResult(Model model,MiaoshaUser user,
|
public ResultGeekQ<Long> miaoshaResult(Model model, MiaoshaUser user,
|
||||||
@RequestParam("goodsId")long goodsId) {
|
@RequestParam("goodsId") long goodsId) {
|
||||||
model.addAttribute("user", user);
|
ResultGeekQ<Long> result = ResultGeekQ.build();
|
||||||
if(user == null) {
|
if (user == null) {
|
||||||
return Result.error(CodeMsg.SESSION_ERROR);
|
result.withError(SESSION_ERROR.getCode(), SESSION_ERROR.getMessage());
|
||||||
}
|
return result;
|
||||||
long result =miaoshaService.getMiaoshaResult(user.getId(), goodsId);
|
}
|
||||||
return Result.success(result);
|
model.addAttribute("user", user);
|
||||||
}
|
Long miaoshaResult = miaoshaService.getMiaoshaResult(user.getId(), goodsId);
|
||||||
@AccessLimit(seconds = 5,maxCount = 5,needLogin = true)
|
result.setData(miaoshaResult);
|
||||||
@RequestMapping(value="/path", method=RequestMethod.GET)
|
return result;
|
||||||
@ResponseBody
|
}
|
||||||
public Result<String> getMiaoshaPath(HttpServletRequest request, MiaoshaUser user,
|
|
||||||
@RequestParam("goodsId")long goodsId,
|
@AccessLimit(seconds = 5, maxCount = 5, needLogin = true)
|
||||||
@RequestParam(value="verifyCode", defaultValue="0")int verifyCode
|
@RequestMapping(value = "/path", method = RequestMethod.GET)
|
||||||
) {
|
@ResponseBody
|
||||||
if(user == null) {
|
public ResultGeekQ<String> getMiaoshaPath(HttpServletRequest request, MiaoshaUser user,
|
||||||
return Result.error(CodeMsg.SESSION_ERROR);
|
@RequestParam("goodsId") long goodsId,
|
||||||
}
|
@RequestParam(value = "verifyCode", defaultValue = "0") int verifyCode
|
||||||
boolean check = miaoshaService.checkVerifyCode(user, goodsId, verifyCode);
|
) {
|
||||||
if(!check) {
|
ResultGeekQ<String> result = ResultGeekQ.build();
|
||||||
return Result.error(CodeMsg.REQUEST_ILLEGAL);
|
if (user == null) {
|
||||||
}
|
result.withError(SESSION_ERROR.getCode(), SESSION_ERROR.getMessage());
|
||||||
String path =miaoshaService.createMiaoshaPath(user, goodsId);
|
return result;
|
||||||
return Result.success(path);
|
}
|
||||||
}
|
boolean check = miaoshaService.checkVerifyCode(user, goodsId, verifyCode);
|
||||||
|
if (!check) {
|
||||||
|
result.withError(REQUEST_ILLEGAL.getCode(), REQUEST_ILLEGAL.getMessage());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
String path = miaoshaService.createMiaoshaPath(user, goodsId);
|
||||||
|
result.setData(path);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@RequestMapping(value="/verifyCode", method=RequestMethod.GET)
|
@RequestMapping(value = "/verifyCode", method = RequestMethod.GET)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Result<String> getMiaoshaVerifyCod(HttpServletResponse response, MiaoshaUser user,
|
public Result<String> getMiaoshaVerifyCod(HttpServletResponse response, MiaoshaUser user,
|
||||||
@RequestParam("goodsId")long goodsId) {
|
@RequestParam("goodsId") long goodsId) {
|
||||||
if(user == null) {
|
if (user == null) {
|
||||||
return Result.error(CodeMsg.SESSION_ERROR);
|
return Result.error(CodeMsg.SESSION_ERROR);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
BufferedImage image = miaoshaService.createVerifyCode(user, goodsId);
|
BufferedImage image = miaoshaService.createVerifyCode(user, goodsId);
|
||||||
OutputStream out = response.getOutputStream();
|
OutputStream out = response.getOutputStream();
|
||||||
ImageIO.write(image, "JPEG", out);
|
ImageIO.write(image, "JPEG", out);
|
||||||
out.flush();
|
out.flush();
|
||||||
out.close();
|
out.close();
|
||||||
return null;
|
return null;
|
||||||
}catch(Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
return Result.error(CodeMsg.MIAOSHA_FAIL);
|
return Result.error(CodeMsg.MIAOSHA_FAIL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 系统初始化
|
* 系统初始化
|
||||||
* @throws Exception
|
*
|
||||||
*/
|
* @throws Exception
|
||||||
@Override
|
*/
|
||||||
public void afterPropertiesSet() throws Exception {
|
@Override
|
||||||
List<GoodsVo> goodsList= goodsService.listGoodsVo();
|
public void afterPropertiesSet() throws Exception {
|
||||||
if(goodsList ==null){
|
List<GoodsVo> goodsList = goodsService.listGoodsVo();
|
||||||
return;
|
if (goodsList == null) {
|
||||||
}
|
return;
|
||||||
for (GoodsVo goods :goodsList ){
|
}
|
||||||
redisService.set(GoodsKey.getMiaoshaGoodsStock,""+goods.getId(),goods.getStockCount()) ;
|
for (GoodsVo goods : goodsList) {
|
||||||
localOverMap.put(goods.getId(), false);
|
redisService.set(GoodsKey.getMiaoshaGoodsStock, "" + goods.getId(), goods.getStockCount());
|
||||||
}
|
localOverMap.put(goods.getId(), false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.geekq.miaosha.controller;
|
package com.geekq.miaosha.controller;
|
||||||
|
|
||||||
|
import com.geekq.miaosha.common.resultbean.ResultGeekQ;
|
||||||
import com.geekq.miaosha.domain.MiaoshaUser;
|
import com.geekq.miaosha.domain.MiaoshaUser;
|
||||||
import com.geekq.miaosha.domain.OrderInfo;
|
import com.geekq.miaosha.domain.OrderInfo;
|
||||||
import com.geekq.miaosha.redis.RedisService;
|
import com.geekq.miaosha.redis.RedisService;
|
||||||
|
@ -17,6 +18,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
|
||||||
|
import static com.geekq.miaosha.common.enums.ResultStatus.ORDER_NOT_EXIST;
|
||||||
|
import static com.geekq.miaosha.common.enums.ResultStatus.SESSION_ERROR;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/order")
|
@RequestMapping("/order")
|
||||||
public class OrderController {
|
public class OrderController {
|
||||||
|
@ -35,21 +39,25 @@ public class OrderController {
|
||||||
|
|
||||||
@RequestMapping("/detail")
|
@RequestMapping("/detail")
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public Result<OrderDetailVo> info(Model model, MiaoshaUser user,
|
public ResultGeekQ<OrderDetailVo> info(Model model, MiaoshaUser user,
|
||||||
@RequestParam("orderId") long orderId) {
|
@RequestParam("orderId") long orderId) {
|
||||||
if(user == null) {
|
ResultGeekQ<OrderDetailVo> result = ResultGeekQ.build();
|
||||||
return Result.error(CodeMsg.SESSION_ERROR);
|
if (user == null) {
|
||||||
}
|
result.withError(SESSION_ERROR.getCode(), SESSION_ERROR.getMessage());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
OrderInfo order = orderService.getOrderById(orderId);
|
OrderInfo order = orderService.getOrderById(orderId);
|
||||||
if(order == null) {
|
if(order == null) {
|
||||||
return Result.error(CodeMsg.ORDER_NOT_EXIST);
|
result.withError(ORDER_NOT_EXIST.getCode(), ORDER_NOT_EXIST.getMessage());
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
long goodsId = order.getGoodsId();
|
long goodsId = order.getGoodsId();
|
||||||
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
|
GoodsVo goods = goodsService.getGoodsVoByGoodsId(goodsId);
|
||||||
OrderDetailVo vo = new OrderDetailVo();
|
OrderDetailVo vo = new OrderDetailVo();
|
||||||
vo.setOrder(order);
|
vo.setOrder(order);
|
||||||
vo.setGoods(goods);
|
vo.setGoods(goods);
|
||||||
return Result.success(vo);
|
result.setData(vo);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
package com.geekq.miaosha.controller;
|
|
||||||
|
|
||||||
import org.springframework.stereotype.Controller;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
|
|
||||||
@Controller
|
|
||||||
@RequestMapping("/ratelimiter")
|
|
||||||
public class RateLimiterController {
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
package com.geekq.miaosha.controller;
|
|
||||||
|
|
||||||
import org.springframework.stereotype.Controller;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
|
|
||||||
@Controller
|
|
||||||
@RequestMapping("/user/")
|
|
||||||
public class UserController {
|
|
||||||
/**
|
|
||||||
* 用户登录
|
|
||||||
* @param username
|
|
||||||
* @param password
|
|
||||||
* @param session
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@RequestMapping(value = "/login",method = RequestMethod.POST)
|
|
||||||
public Object login(String username , String password , HttpSession session){
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,32 +0,0 @@
|
||||||
package com.geekq.miaosha.dao;
|
|
||||||
|
|
||||||
import com.geekq.miaosha.domain.MiaoshaUser;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* mybatis xml 写法
|
|
||||||
*/
|
|
||||||
@Mapper
|
|
||||||
public interface UserMapper {
|
|
||||||
int countbyMenuId();
|
|
||||||
MiaoshaUser getMiaoShaUserById(Long phoneId);
|
|
||||||
//秒杀对象获取 mybatis的#与$的区别
|
|
||||||
List<MiaoshaUser> queryMiaoShaUserOrderByColumn(String column);
|
|
||||||
|
|
||||||
|
|
||||||
//查询总条数
|
|
||||||
public int getMiaoShaUserNum();
|
|
||||||
|
|
||||||
public Long insertMiaoShaUser(MiaoshaUser user);
|
|
||||||
|
|
||||||
void insertMiaoShaUserValues(List<MiaoshaUser> miaoshaUsers);
|
|
||||||
|
|
||||||
//更改表数据
|
|
||||||
void updateMiaoShaUser(MiaoshaUser user) ;
|
|
||||||
|
|
||||||
//删除表数据
|
|
||||||
|
|
||||||
void deleteMiaoShaUser(long id );
|
|
||||||
}
|
|
|
@ -1,17 +1,22 @@
|
||||||
package com.geekq.miaosha.exception;
|
package com.geekq.miaosha.exception;
|
||||||
|
|
||||||
import com.geekq.miaosha.result.CodeMsg;
|
import com.geekq.miaosha.common.enums.ResultStatus;
|
||||||
|
|
||||||
public class GlobleException extends RuntimeException {
|
public class GlobleException extends RuntimeException {
|
||||||
|
|
||||||
|
|
||||||
private CodeMsg cm ;
|
private ResultStatus status;
|
||||||
public GlobleException(CodeMsg cm){
|
|
||||||
|
public GlobleException(ResultStatus status){
|
||||||
super();
|
super();
|
||||||
this.cm = cm;
|
this.status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CodeMsg getCm() {
|
public ResultStatus getStatus() {
|
||||||
return cm;
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(ResultStatus status) {
|
||||||
|
this.status = status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
package com.geekq.miaosha.exception;
|
package com.geekq.miaosha.exception;
|
||||||
|
|
||||||
|
import com.geekq.miaosha.common.enums.ResultStatus;
|
||||||
|
import com.geekq.miaosha.common.resultbean.ResultGeekQ;
|
||||||
import com.geekq.miaosha.result.CodeMsg;
|
import com.geekq.miaosha.result.CodeMsg;
|
||||||
import com.geekq.miaosha.result.Result;
|
import com.geekq.miaosha.result.Result;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.validation.BindException;
|
import org.springframework.validation.BindException;
|
||||||
import org.springframework.validation.ObjectError;
|
import org.springframework.validation.ObjectError;
|
||||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
@ -11,25 +15,38 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import static com.geekq.miaosha.common.enums.ResultStatus.SESSION_ERROR;
|
||||||
|
import static com.geekq.miaosha.common.enums.ResultStatus.SYSTEM_ERROR;
|
||||||
|
import static com.geekq.miaosha.result.CodeMsg.BIND_ERROR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 拦截异常
|
||||||
|
* @author qiurunze
|
||||||
|
*/
|
||||||
@ControllerAdvice
|
@ControllerAdvice
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public class GlobleExceptionHandler {
|
public class GlobleExceptionHandler {
|
||||||
|
|
||||||
|
private static Logger logger = LoggerFactory.getLogger(GlobleExceptionHandler.class);
|
||||||
|
|
||||||
@ExceptionHandler(value=Exception.class)
|
@ExceptionHandler(value=Exception.class)
|
||||||
public Result<String> exceptionHandler(HttpServletRequest request , Exception e){
|
public ResultGeekQ<String> exceptionHandler(HttpServletRequest request , Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
if(e instanceof GlobleException){
|
if(e instanceof GlobleException){
|
||||||
GlobleException ex= (GlobleException)e;
|
GlobleException ex= (GlobleException)e;
|
||||||
return Result.error(ex.getCm());
|
return ResultGeekQ.error(ex.getStatus());
|
||||||
}else if( e instanceof BindException){
|
}else if( e instanceof BindException){
|
||||||
BindException ex = (BindException) e ;
|
BindException ex = (BindException) e ;
|
||||||
List<ObjectError> errors = ex.getAllErrors();
|
List<ObjectError> errors = ex.getAllErrors();
|
||||||
ObjectError error = errors.get(0);
|
ObjectError error = errors.get(0);
|
||||||
String msg = error.getDefaultMessage();
|
String msg = error.getDefaultMessage();
|
||||||
return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
|
/**
|
||||||
|
* 打印堆栈信息
|
||||||
|
*/
|
||||||
|
logger.error(String.format(msg, msg));
|
||||||
|
return ResultGeekQ.error(SESSION_ERROR);
|
||||||
}else {
|
}else {
|
||||||
return Result.error(CodeMsg.SERVER_ERROR);
|
return ResultGeekQ.error(SYSTEM_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -42,7 +42,7 @@ public class Result<T> {
|
||||||
return new Result<T>(cm);
|
return new Result<T>(cm);
|
||||||
}
|
}
|
||||||
|
|
||||||
// public Result(CodeMsg msg, T data) {
|
// public ResultGeekQ(CodeMsg msg, T data) {
|
||||||
// this.code = msg.getCode();
|
// this.code = msg.getCode();
|
||||||
// this.msg = msg.getMsg();
|
// this.msg = msg.getMsg();
|
||||||
// this.data = data;
|
// this.data = data;
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
package com.geekq.miaosha.service;
|
|
||||||
|
|
||||||
public interface IUserService {
|
|
||||||
|
|
||||||
Object login(String username , String password) ;
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,16 +1,13 @@
|
||||||
package com.geekq.miaosha.service;
|
package com.geekq.miaosha.service;
|
||||||
|
|
||||||
import com.geekq.miaosha.Md5Utils.MD5Utils;
|
|
||||||
import com.geekq.miaosha.dao.MiaoShaUserDao;
|
import com.geekq.miaosha.dao.MiaoShaUserDao;
|
||||||
import com.geekq.miaosha.domain.MiaoshaUser;
|
import com.geekq.miaosha.domain.MiaoshaUser;
|
||||||
import com.geekq.miaosha.exception.GlobleException;
|
import com.geekq.miaosha.exception.GlobleException;
|
||||||
import com.geekq.miaosha.redis.MiaoShaUserKey;
|
import com.geekq.miaosha.redis.MiaoShaUserKey;
|
||||||
import com.geekq.miaosha.redis.RedisService;
|
import com.geekq.miaosha.redis.RedisService;
|
||||||
import com.geekq.miaosha.result.CodeMsg;
|
import com.geekq.miaosha.utils.MD5Utils;
|
||||||
import com.geekq.miaosha.result.Result;
|
|
||||||
import com.geekq.miaosha.utils.UUIDUtil;
|
import com.geekq.miaosha.utils.UUIDUtil;
|
||||||
import com.geekq.miaosha.vo.LoginVo;
|
import com.geekq.miaosha.vo.LoginVo;
|
||||||
import com.sun.org.apache.bcel.internal.classfile.Code;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
@ -18,6 +15,8 @@ import org.springframework.stereotype.Service;
|
||||||
import javax.servlet.http.Cookie;
|
import javax.servlet.http.Cookie;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import static com.geekq.miaosha.common.enums.ResultStatus.*;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MiaoShaUserService {
|
public class MiaoShaUserService {
|
||||||
|
|
||||||
|
@ -62,7 +61,7 @@ public class MiaoShaUserService {
|
||||||
//取user
|
//取user
|
||||||
MiaoshaUser user = getById(id);
|
MiaoshaUser user = getById(id);
|
||||||
if(user == null) {
|
if(user == null) {
|
||||||
throw new GlobleException(CodeMsg.MOBILE_NOT_EXIST);
|
throw new GlobleException(MOBILE_NOT_EXIST);
|
||||||
}
|
}
|
||||||
//更新数据库
|
//更新数据库
|
||||||
MiaoshaUser toBeUpdate = new MiaoshaUser();
|
MiaoshaUser toBeUpdate = new MiaoshaUser();
|
||||||
|
@ -76,34 +75,23 @@ public class MiaoShaUserService {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Result<String> insertMiaoShaUser(MiaoshaUser miaoshaUser){
|
|
||||||
|
|
||||||
long resultRegister = miaoShaUserDao.insertMiaoShaUser(miaoshaUser);
|
|
||||||
|
|
||||||
if(resultRegister == 0){
|
|
||||||
throw new GlobleException(CodeMsg.RESIGETER_FAIL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Result.success(CodeMsg.SUCCESS_RESIGETER);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean login(HttpServletResponse response , LoginVo loginVo) {
|
public boolean login(HttpServletResponse response , LoginVo loginVo) {
|
||||||
if(loginVo ==null){
|
if(loginVo ==null){
|
||||||
throw new GlobleException(CodeMsg.SERVER_ERROR);
|
throw new GlobleException(SYSTEM_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
String mobile =loginVo.getMobile();
|
String mobile =loginVo.getMobile();
|
||||||
String password =loginVo.getPassword();
|
String password =loginVo.getPassword();
|
||||||
MiaoshaUser user = getById(Long.valueOf(mobile));
|
MiaoshaUser user = getById(Long.valueOf(mobile));
|
||||||
if(user == null) {
|
if(user == null) {
|
||||||
throw new GlobleException(CodeMsg.MOBILE_NOT_EXIST);
|
throw new GlobleException(MOBILE_NOT_EXIST);
|
||||||
}
|
}
|
||||||
|
|
||||||
String dbPass = user.getPassword();
|
String dbPass = user.getPassword();
|
||||||
String saltDb = user.getSalt();
|
String saltDb = user.getSalt();
|
||||||
String calcPass = MD5Utils.formPassToDBPass(password,saltDb);
|
String calcPass = MD5Utils.formPassToDBPass(password,saltDb);
|
||||||
if(!calcPass.equals(dbPass)){
|
if(!calcPass.equals(dbPass)){
|
||||||
throw new GlobleException(CodeMsg.PASSWORD_ERROR);
|
throw new GlobleException(PASSWORD_ERROR);
|
||||||
}
|
}
|
||||||
//生成cookie
|
//生成cookie
|
||||||
String token= UUIDUtil.uuid();
|
String token= UUIDUtil.uuid();
|
||||||
|
@ -118,12 +106,4 @@ public class MiaoShaUserService {
|
||||||
cookie.setPath("/");
|
cookie.setPath("/");
|
||||||
response.addCookie(cookie);
|
response.addCookie(cookie);
|
||||||
}
|
}
|
||||||
// private void addCookie(HttpServletResponse response ,MiaoshaUser user){
|
|
||||||
// String token = UUIDUtil.uuid();
|
|
||||||
// redisService.set(MiaoShaUserKey.token,token,user) ;
|
|
||||||
// Cookie cookie = new Cookie(COOKIE_NAME_TOKEN , token) ;
|
|
||||||
// cookie.setMaxAge(MiaoShaUserKey.token.expireSeconds());
|
|
||||||
// cookie.setPath("/");
|
|
||||||
// response.addCookie(cookie);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package com.geekq.miaosha.service;
|
package com.geekq.miaosha.service;
|
||||||
|
|
||||||
import com.geekq.miaosha.Md5Utils.MD5Utils;
|
|
||||||
import com.geekq.miaosha.domain.MiaoshaOrder;
|
import com.geekq.miaosha.domain.MiaoshaOrder;
|
||||||
import com.geekq.miaosha.domain.MiaoshaUser;
|
import com.geekq.miaosha.domain.MiaoshaUser;
|
||||||
import com.geekq.miaosha.domain.OrderInfo;
|
import com.geekq.miaosha.domain.OrderInfo;
|
||||||
import com.geekq.miaosha.redis.MiaoshaKey;
|
import com.geekq.miaosha.redis.MiaoshaKey;
|
||||||
import com.geekq.miaosha.redis.RedisService;
|
import com.geekq.miaosha.redis.RedisService;
|
||||||
|
import com.geekq.miaosha.utils.MD5Utils;
|
||||||
import com.geekq.miaosha.utils.UUIDUtil;
|
import com.geekq.miaosha.utils.UUIDUtil;
|
||||||
import com.geekq.miaosha.vo.GoodsVo;
|
import com.geekq.miaosha.vo.GoodsVo;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package com.geekq.miaosha.Md5Utils;
|
package com.geekq.miaosha.utils;
|
||||||
|
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
|
|
|
@ -7,8 +7,8 @@ import java.lang.annotation.*;
|
||||||
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
|
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Documented
|
@Documented
|
||||||
@Constraint(validatedBy = {IsMobileValidator.class})
|
@Constraint(validatedBy = {MobileValidator.class})
|
||||||
public @interface IsMobile {
|
public @interface MobileCheck {
|
||||||
boolean required() default true ;
|
boolean required() default true ;
|
||||||
|
|
||||||
String message() default "手机号码格式有误!";
|
String message() default "手机号码格式有误!";
|
|
@ -6,12 +6,12 @@ import org.apache.commons.lang3.StringUtils;
|
||||||
import javax.validation.ConstraintValidator;
|
import javax.validation.ConstraintValidator;
|
||||||
import javax.validation.ConstraintValidatorContext;
|
import javax.validation.ConstraintValidatorContext;
|
||||||
|
|
||||||
public class IsMobileValidator implements ConstraintValidator<IsMobile , String> {
|
public class MobileValidator implements ConstraintValidator<MobileCheck, String> {
|
||||||
|
|
||||||
private boolean require = false ;
|
private boolean require = false ;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void initialize(IsMobile isMobile) {
|
public void initialize(MobileCheck isMobile) {
|
||||||
require = isMobile.required() ;
|
require = isMobile.required() ;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package com.geekq.miaosha.vo;
|
package com.geekq.miaosha.vo;
|
||||||
|
|
||||||
import com.geekq.miaosha.validator.IsMobile;
|
import com.geekq.miaosha.validator.MobileCheck;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
@ -15,7 +15,7 @@ import javax.validation.constraints.NotNull;
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
public class LoginVo {
|
public class LoginVo {
|
||||||
@NotNull
|
@NotNull
|
||||||
@IsMobile
|
@MobileCheck
|
||||||
private String mobile ;
|
private String mobile ;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|
|
@ -86,7 +86,7 @@ function doLogin(){
|
||||||
layer.msg("成功");
|
layer.msg("成功");
|
||||||
window.location.href="/goods/to_list";
|
window.location.href="/goods/to_list";
|
||||||
}else{
|
}else{
|
||||||
layer.msg(data.msg);
|
layer.msg(data.message);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error:function(){
|
error:function(){
|
||||||
|
|
Loading…
Reference in New Issue
Block a user