- 外星人商城项目介绍
- 项目背景
- 项目功能
- 项目技术
- 项目模块
- 项目要求
- 外星人商城项目开发流程
- 第一节 基础构建
- 第二节 用户注册
- 第三节 用户登录
- 1.登录-持久层
- 2.登录-业务层
- 异常处理
- 业务层接口和实现
- 3. 登录-控制层
- 处理异常
- 登录逻辑
- 4. 登录-前端页面
- 5. 登录-用户回话session
- 6. 登录-拦截器
- 第四节 用户管理
- 第一部分 密码修改
- 第二部分 个人资料
- 第三部分 上传头像
- 第四部分 收货地址
- 第五节 热销商品
- 第六节 购物车
- 第一部分 加入购物车
- 第二部分 显示购物车
- 第三部分 购物车商品数量
- 第四部分 勾选数据
- 第七节 订单
- 第八节 商品秒杀
- 外星人商城项目总结
外星人公司(狗头)委托我开发一个一个专门的外星人商城(模仿京东、天猫),出售外星人电子产品以及周边,实现了以下功能。
本项目已经搭载了服务器,网址给定:
链接: 外星人官方网站.
- 登录
- 注册
- 用户管理
- 热销商品
- 购物车
- 订单
- 商品秒杀
- 项目框架:springboot
- 数据库框架:mybaits
- 前端技术:JS、JQuery、Ajax
持久层:依据业务要求规划相关的SQL语句,以及进行配置
业务层:核心功能控制、业务操作以及异常处理
控制层:接受请求,处理响应
前端开发:JS、JQuery、Ajax
单元测试:junit
- JDK8
- maven3.6.1
- 数据库mysql5.1
- idea
用户输入信息传到后台数据库进行查询
1.登录-持久层SQL语句来查询用户,密码的对比在业务层执行
2.登录-业务层 异常处理1.用户名的密码错我
2.用户名不正确
3.业务层异常都继承已经定义的ServiceException
public class PasswordNotMatchException extends ServiceException {
public PasswordNotMatchException() {
super();
}
public PasswordNotMatchException(String message) {
super(message);
}
public PasswordNotMatchException(String message, Throwable cause) {
super(message, cause);
}
public PasswordNotMatchException(Throwable cause) {
super(cause);
}
protected PasswordNotMatchException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
业务层接口和实现
public interface IUserService {
User login(String username, String password);
}
这里的返回类型是User,是存储到cookie或session中,必变重复拿取数据。
@Override
public User login(String username, String password) {
// 调用userMapper的findByUsername()方法,根据参数username查询用户数据
User result = userMapper.findByUsername(username);
// 判断查询结果是否为null
if (result == null) {
// 是:抛出UserNotFoundException异常
throw new UserNotFoundException("用户数据不存在的错误");
}
// 判断查询结果中的isDelete是否为1
if (result.getIsDelete() == 1) {
// 是:抛出UserNotFoundException异常
throw new UserNotFoundException("用户数据不存在的错误");
}
// 从查询结果中获取盐值
String salt = result.getSalt();
// 调用getMd5Password()方法,将参数password和salt结合起来进行加密
String md5Password = getMd5Password(password, salt);
// 判断查询结果中的密码,与以上加密得到的密码是否不一致
if (!result.getPassword().equals(md5Password)) {
// 是:抛出PasswordNotMatchException异常
throw new PasswordNotMatchException("密码验证失败的错误");
}
// 创建新的User对象
User user = new User();
// 将查询结果中的uid、username、avatar封装到新的user对象中
user.setUid(result.getUid());
user.setUsername(result.getUsername());
user.setAvatar(result.getAvatar());
// 返回新的user对象
return user;
}
3. 登录-控制层
处理异常
@ExceptionHandler({ServiceException.class, FileUploadException.class})
public JsonResult handleException(Throwable e) {
JsonResult result = new JsonResult(e);
if (e instanceof UsernameDuplicateException) {
result.setState(4000);
} else if (e instanceof UserNotFoundException) {
result.setState(4001);
} else if (e instanceof PasswordNotMatchException) {
result.setState(4002);
} else if (e instanceof AddressCountLimitException) {
result.setState(4003);
} else if (e instanceof AddressNotFoundException) {
result.setState(4004);
} else if (e instanceof AccessDeniedException) {
result.setState(4005);
} else if (e instanceof ProductNotFoundException) {
result.setState(4006);
} else if (e instanceof CartNotFoundException) {
result.setState(4007);
} else if (e instanceof InsertException) {
result.setState(5000);
} else if (e instanceof UpdateException) {
result.setState(5001);
} else if (e instanceof DeleteException) {
result.setState(5002);
} else if (e instanceof FileEmptyException) {
result.setState(6000);
} else if (e instanceof FileSizeException) {
result.setState(6001);
} else if (e instanceof FileTypeException) {
result.setState(6002);
} else if (e instanceof FileStateException) {
result.setState(6003);
} else if (e instanceof FileUploadIOException) {
result.setState(6004);
}
return result;
}
登录逻辑
@RequestMapping("login")
public JsonResult login(String username, String password, HttpSession session) {
// 调用业务对象的方法执行登录,并获取返回值
User data = userService.login(username, password);
//登录成功后,将uid和username存入到HttpSession中
session.setAttribute("uid", data.getUid());
session.setAttribute("username", data.getUsername());
// System.out.println("Session中的uid=" + getUidFromSession(session));
// System.out.println("Session中的username=" + getUsernameFromSession(session));
// 将以上返回值和状态码OK封装到响应结果中并返回
return new JsonResult(OK, data);
}
4. 登录-前端页面
5. 登录-用户回话session
session对象主要存在服务端,可以用来作为保存服务器的临时数据的对象
所保存的数据可以在整个项目中都可以通过访问获取,把session看做一个共享的数据。
首次登录的时候所获取的用户的数据,转移到session对象即可
使用方法getAttribute(“key”),封装在父类中
public class BaseController {
protected final Integer getUidFromSession(HttpSession session) {
return Integer.valueOf(session.getAttribute("uid").toString());
}
protected final String getUsernameFromSession(HttpSession session) {
return session.getAttribute("username").toString();
}
}
服务器本身自动创建一个session对象,是一个全局seesion,springboot做了一个处理,可以直接使用session对象,直接将httpSession类型的对象组委请求处理方法的参数,会自动将全局的session注入到请求处理方法的session形参上
@RequestMapping("login")
public JsonResult login(String username, String password, HttpSession session) {
// 调用业务对象的方法执行登录,并获取返回值
User data = userService.login(username, password);
//登录成功后,将uid和username存入到HttpSession中
session.setAttribute("uid", data.getUid());
session.setAttribute("username", data.getUsername());
// System.out.println("Session中的uid=" + getUidFromSession(session));
// System.out.println("Session中的username=" + getUsernameFromSession(session));
// 将以上返回值和状态码OK封装到响应结果中并返回
return new JsonResult(OK, data);
}
6. 登录-拦截器
-
安全验证,可以通过shiro或者springcurity来完成;
-
拦截器,首先将所有的请求统一拦截到拦截器中,可以定义拦截的规矩,
如果不满足,统一的处理就是重定向和转发,一般操作为重定向到login页面 -
springMVC提供了一个接口HandlerInterceptor,用于表示一个拦截器
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (request.getSession().getAttribute("uid") == null) {
response.sendRedirect("/web/login.html");
return false;
}
return true;
}
}
- 注册过滤器的技术:借助webmvcconfig接口,将用户定义的拦截器进行注册,才可以保证拦截器能够生效和使用
@Configuration
public class LoginInterceptorConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 创建拦截器对象
HandlerInterceptor interceptor = new LoginInterceptor();
// 白名单
List patterns = new ArrayList();
patterns.add("/bootstrap3/**");
patterns.add("/css/**");
patterns.add("/images/**");
patterns.add("/js/**");
patterns.add("/web/register.html");
patterns.add("/web/login.html");
patterns.add("/web/index.html");
patterns.add("/web/product.html");
patterns.add("/users/reg");
patterns.add("/users/login");
patterns.add("/districts/**");
patterns.add("/products/**");
// 通过注册工具添加拦截器
registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns(patterns);
}
}
第四节 用户管理
第一部分 密码修改
第二部分 个人资料
第三部分 上传头像
第四部分 收货地址
第五节 热销商品
第六节 购物车
第一部分 加入购物车
第二部分 显示购物车
第三部分 购物车商品数量
第四部分 勾选数据
第七节 订单
第八节 商品秒杀
外星人商城项目总结


