复习
在这里补充一些从视频中学到的知识点。
1)使用前后端分类设计模式,实现前端与后端的完全分离,前后端通过接口进行交互。
2)用户模块一共提供11个接口,举例如下
1.登录接口
/user/login.do (post,开放get,方便调试)
request:username,password
response:
fail{
"status":1,
"msg":"密码错误"
}
success{
"status":0,
"data":{
"id":12,
"username":"aaa",
.
.
.
"updateTime":"1479048325"
}
}
2.注册接口
/user/register.do
request:username,password,email,phone,question,answer
response:
fail{
"status":1,
"msg":"用户已存在"
}
success{
"status":0,
"msg":"校验成功"
}
3)通过抽象出高复用服务相应对象实现代码重用
package com.mmall.common;
import org.codehaus.jackson.annotate.JsonIgnore;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import java.io.Serializable;
/**
* Created by geely
*/
@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 T getData(){
return data;
}
public String getMsg(){
return msg;
}
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 errorMessage){
return new ServerResponse<T>(ResponseCode.ERROR.getCode(),errorMessage);
}
public static <T> ServerResponse<T> createByErrorCodeMessage(int errorCode,String errorMessage){
return new ServerResponse<T>(errorCode,errorMessage);
}
}
4)MD5加密
我们将用户输入的密码通过MD5加密后存入数据库,防止出现直接读库获取密码的情况,MD5是种
不可逆的加密方式,虽说可以通过MD5碰撞方式破解,但相对来说是比较安全的。我们封装好MD5的的工具
类,然后在项目中直接使用。
package com.mmall.util;
import org.springframework.util.StringUtils;
import java.security.MessageDigest;
/**
* Created by geely
*/
public class MD5Util {
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++)
resultSb.append(byteToHexString(b[i]));
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n += 256;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
/**
*
* @param origin
* @param charsetname
* @return
*/
private static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString.toUpperCase();
}
public static String MD5EncodeUtf8(String origin) {
origin = origin + PropertiesUtil.getProperty("password.salt", "");
return MD5Encode(origin, "utf-8");
}
private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
}
这个工具类只开放了一个public方法,直接调用即可,在这儿里就不学习MD5的具体细节了
@Override
public ServerResponse<User> login(String username, String password) {
int resultCount = userMapper.checkUsername(username);
if(resultCount == 0 ){
return ServerResponse.createByErrorMessage("不存在该用户");
}
String md5Password = MD5Util.MD5EncodeUtf8(password);
User user = userMapper.selectLogin(username,md5Password);
if(user == null){
return ServerResponse.createByErrorMessage("密码错误");
}
user.setPassword(org.apache.commons.lang3.StringUtils.EMPTY);
return ServerResponse.createBySuccess("登录成功",user);
}
分类管理模块
一、学习目标
- 如何设计及封装无限层级的树状数据结构
- 递归的算法的设计思想
- 如何处理复杂对象排重
- 重写hashcode和equal方法
二、表设计mmall_category
id,parent_id,name,status,sort_order 当 parent_id为0时,表示为根节点。