Java SSM从零到企业级电商项目实战

                                                Java SSM从零到企业级电商项目实战

git地址:https://gitee.com/weisiyu/mmall_learning/tree/v1.0/

(注意一下,项目只需要window环境也可进行开发,只要有ideajdk,tomcatmaven配置FTP的安装,即可进行开发使用

http://learning.happymmall.com/

总的模块的开发:

简单介绍一下大型电商网站架构:

 

系统构建:

第一天:

环境搭建:

 

 

 

 

 

安装java环境:

注:这里可以百度一下 jdk的环境变量的配置。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Windows的FTP安装完成

 

 

数据表结构的设计:

 

 

第一天:开始创建maven项目:

 

 

Java是sourceRoot(自己创建)

Test自己创建

对应的sourcesRoot

 

项目的整体架构如下图所示:

配置maven的pom文件

Pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>
4.0.0</modelVersion>
  <groupId>
com</groupId>
  <artifactId>
mmall</artifactId>
  <packaging>
war</packaging>
  <version>
1.0-SNAPSHOT</version>
  <name>
mmall Maven Webapp</name>
  <url>
http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>
UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>
UTF-8</project.reporting.outputEncoding>
    <maven.compiler.encoding>
UTF-8</maven.compiler.encoding>

    <org.springframework.version>
4.0.0.RELEASE</org.springframework.version>
    <org.mybatis.version>
3.4.1</org.mybatis.version>
    <org.mybatis.spring.version>
1.3.0</org.mybatis.spring.version>
  </properties>

  <dependencies>

    <dependency>
      <groupId>
org.apache.tomcat</groupId>
      <artifactId>
tomcat-servlet-api</artifactId>
      <version>
7.0.64</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-webmvc</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-oxm</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-jdbc</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-tx</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-test</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>


    <dependency>
      <groupId>
org.aspectj</groupId>
      <artifactId>
aspectjweaver</artifactId>
      <version>
1.7.3</version>
    </dependency>

    <dependency>
      <groupId>
org.mybatis</groupId>
      <artifactId>
mybatis-spring</artifactId>
      <version>
${org.mybatis.spring.version}</version>
    </dependency>
    <dependency>
      <groupId>
org.mybatis</groupId>
      <artifactId>
mybatis</artifactId>
      <version>
${org.mybatis.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.aspectj</groupId>
      <artifactId>
aspectjrt</artifactId>
      <version>
1.6.11</version>
    </dependency>

    <dependency>
      <groupId>
org.codehaus.jackson</groupId>
      <artifactId>
jackson-mapper-asl</artifactId>
      <version>
1.9.12</version>
    </dependency>

    <dependency>
      <groupId>
commons-dbcp</groupId>
      <artifactId>
commons-dbcp</artifactId>
      <version>
1.4</version>
     
<!--<scope>runtime</scope>-->
   
</dependency>


    <dependency>
      <groupId>
ch.qos.logback</groupId>
      <artifactId>
logback-classic</artifactId>
      <version>
1.1.2</version>
      <scope>
compile</scope>
    </dependency>
    <dependency>
      <groupId>
ch.qos.logback</groupId>
      <artifactId>
logback-core</artifactId>
      <version>
1.1.2</version>
      <scope>
compile</scope>
    </dependency>

    <dependency>
      <groupId>
mysql</groupId>
      <artifactId>
mysql-connector-java</artifactId>
      <version>
5.1.6</version>
    </dependency>

    <dependency>
      <groupId>
com.google.guava</groupId>
      <artifactId>
guava</artifactId>
      <version>
20.0</version>
    </dependency>


    <dependency>
      <groupId>
org.apache.commons</groupId>
      <artifactId>
commons-lang3</artifactId>
      <version>
3.5</version>
    </dependency>


    <dependency>
      <groupId>
commons-collections</groupId>
      <artifactId>
commons-collections</artifactId>
      <version>
3.2.1</version>
    </dependency>


    <dependency>
      <groupId>
junit</groupId>
      <artifactId>
junit</artifactId>
      <version>
4.12</version>
     
<!--<scope>test</scope>-->
   
</dependency>

    <dependency>
      <groupId>
joda-time</groupId>
      <artifactId>
joda-time</artifactId>
      <version>
2.3</version>
    </dependency>


   
<!-- id加密解密 -->
   
<dependency>
      <groupId>
org.hashids</groupId>
      <artifactId>
hashids</artifactId>
      <version>
1.0.1</version>
    </dependency>


   
<!-- ftpclient -->
   
<dependency>
      <groupId>
commons-net</groupId>
      <artifactId>
commons-net</artifactId>
      <version>
3.1</version>
    </dependency>

   
<!-- file upload -->

    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
   
<dependency>
      <groupId>
commons-fileupload</groupId>
      <artifactId>
commons-fileupload</artifactId>
      <version>
1.2.2</version>
    </dependency>

    <dependency>
      <groupId>
commons-io</groupId>
      <artifactId>
commons-io</artifactId>
      <version>
2.0.1</version>
    </dependency>




   
<!-- mybatis pager -->

   
<dependency>
      <groupId>
com.github.pagehelper</groupId>
      <artifactId>
pagehelper</artifactId>
      <version>
4.1.0</version>
    </dependency>

    <dependency>
      <groupId>
com.github.miemiedev</groupId>
      <artifactId>
mybatis-paginator</artifactId>
      <version>
1.2.17</version>
    </dependency>

    <dependency>
      <groupId>
com.github.jsqlparser</groupId>
      <artifactId>
jsqlparser</artifactId>
      <version>
0.9.4</version>
    </dependency>


   
<!-- alipay -->
   
<dependency>
      <groupId>
commons-codec</groupId>
      <artifactId>
commons-codec</artifactId>
      <version>
1.10</version>
    </dependency>
    <dependency>
      <groupId>
commons-configuration</groupId>
      <artifactId>
commons-configuration</artifactId>
      <version>
1.10</version>
    </dependency>
    <dependency>
      <groupId>
commons-lang</groupId>
      <artifactId>
commons-lang</artifactId>
      <version>
2.6</version>
    </dependency>
    <dependency>
      <groupId>
commons-logging</groupId>
      <artifactId>
commons-logging</artifactId>
      <version>
1.1.1</version>
    </dependency>
    <dependency>
      <groupId>
com.google.zxing</groupId>
      <artifactId>
core</artifactId>
      <version>
2.1</version>
    </dependency>
    <dependency>
      <groupId>
com.google.code.gson</groupId>
      <artifactId>
gson</artifactId>
      <version>
2.3.1</version>
    </dependency>
    <dependency>
      <groupId>
org.hamcrest</groupId>
      <artifactId>
hamcrest-core</artifactId>
      <version>
1.3</version>
    </dependency>

    <dependency>
      <groupId>
redis.clients</groupId>
      <artifactId>
jedis</artifactId>
      <version>
2.9.0</version>
    </dependency>
  </dependencies>


  <build>
    <finalName>
mmall</finalName>
    <plugins>
      <plugin>
        <groupId>
org.mybatis.generator</groupId>
        <artifactId>
mybatis-generator-maven-plugin</artifactId>
        <version>
1.3.2</version>
        <configuration>
          <verbose>
true</verbose>
          <overwrite>
true</overwrite>
        </configuration>
      </plugin>

     
<!-- geelynote maven的核心插件之-complier插件默认只支持编译Java 1.4,因此需要加上支持高版本jre的配置,在pom.xml里面加上 增加编译插件 -->
     
<plugin>
        <groupId>
org.apache.maven.plugins</groupId>
        <artifactId>
maven-compiler-plugin</artifactId>
        <configuration>
          <source>
1.7</source>
          <target>
1.7</target>
          <encoding>
UTF-8</encoding>
          <compilerArguments>
            <extdirs>
${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
          </compilerArguments>
        </configuration>
      </plugin>
    </plugins>

  </build>


</project>

包的结构:

 

common中编写常用的类,四个:

第一个Const

package com.mmall.common;

import
com.google.common.collect.Sets;

import
java.util.Set;

/**
 * Created by geely
 */

public class Const {

   
public static final String CURRENT_USER = "currentUser";

    public static final
String EMAIL = "email";
    public static final
String USERNAME = "username";

    public interface
ProductListOrderBy{
        Set<String>
PRICE_ASC_DESC = Sets.newHashSet("price_desc","price_asc");
   
}

   
public interface Cart{
       
int CHECKED = 1;//即购物车选中状态
       
int UN_CHECKED = 0;//购物车中未选中状态

       
String LIMIT_NUM_FAIL = "LIMIT_NUM_FAIL";
       
String LIMIT_NUM_SUCCESS = "LIMIT_NUM_SUCCESS";
   
}

   
public interface Role{
       
int ROLE_CUSTOMER = 0; //普通用户
       
int ROLE_ADMIN = 1;//管理员
   
}

   
public enum ProductStatusEnum{
       
ON_SALE(1,"在线");
        private
String value;
        private int
code;
       
ProductStatusEnum(int code,String value){
           
this.code = code;
            this
.value = value;
       
}

       
public String getValue() {
           
return value;
       
}

       
public int getCode() {
           
return code;
       
}
    }


   
public enum OrderStatusEnum{
       
CANCELED(0,"已取消"),
       
NO_PAY(10,"未支付"),
       
PAID(20,"已付款"),
       
SHIPPED(40,"已发货"),
       
ORDER_SUCCESS(50,"订单完成"),
       
ORDER_CLOSE(60,"订单关闭");


       
OrderStatusEnum(int code,String value){
           
this.code = code;
            this
.value = value;
       
}
       
private String value;
        private int
code;

        public
String getValue() {
           
return value;
       
}

       
public int getCode() {
           
return code;
       
}

       
public static OrderStatusEnum codeOf(int code){
           
for(OrderStatusEnum orderStatusEnum : values()){
               
if(orderStatusEnum.getCode() == code){
                   
return orderStatusEnum;
               
}
            }
           
throw new RuntimeException("么有找到对应的枚举");
       
}
    }
   
public interface  AlipayCallback{
        String
TRADE_STATUS_WAIT_BUYER_PAY = "WAIT_BUYER_PAY";
       
String TRADE_STATUS_TRADE_SUCCESS = "TRADE_SUCCESS";

       
String RESPONSE_SUCCESS = "success";
       
String RESPONSE_FAILED = "failed";
   
}



   
public enum PayPlatformEnum{
       
ALIPAY(1,"支付宝");

       
PayPlatformEnum(int code,String value){
           
this.code = code;
            this
.value = value;
       
}
       
private String value;
        private int
code;

        public
String getValue() {
           
return value;
       
}

       
public int getCode() {
           
return code;
       
}
    }

   
public enum PaymentTypeEnum{
       
ONLINE_PAY(1,"在线支付");

       
PaymentTypeEnum(int code,String value){
           
this.code = code;
            this
.value = value;
       
}
       
private String value;
        private int
code;

        public
String getValue() {
           
return value;
       
}

       
public int getCode() {
           
return code;
       
}


       
public static PaymentTypeEnum codeOf(int code){
           
for(PaymentTypeEnum paymentTypeEnum : values()){
               
if(paymentTypeEnum.getCode() == code){
                   
return paymentTypeEnum;
               
}
            }
           
throw new RuntimeException("么有找到对应的枚举");
       
}

    }




}

第二个ResponseCode编码响应的状态:

package com.mmall.common;



/**

 * Created by geely

 */

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;





    ResponseCode(int code,String desc){

        this.code = code;

        this.desc = desc;

    }



    public int getCode(){

        return code;

    }

    public String getDesc(){

        return desc;

    }



}

第三个ServerResponse

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)

//保证序列化json的时候,如果是null的对象,key也会消失

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

    //使之不在json序列化结果当中

    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);

    }



























}

第四个TokenCache:

package com.mmall.common;



import com.google.common.cache.CacheBuilder;

import com.google.common.cache.CacheLoader;

import com.google.common.cache.LoadingCache;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;



import java.util.concurrent.TimeUnit;



/**

 * Created by geely

 */

public class TokenCache {



    private static Logger logger = LoggerFactory.getLogger(TokenCache.class);



    public static final String TOKEN_PREFIX = "token_";



    //LRU算法

    private static LoadingCache<String,String> localCache = CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000).expireAfterAccess(12, TimeUnit.HOURS)

            .build(new CacheLoader<String, String>() {

                //默认的数据加载实现,当调用get取值的时候,如果key没有对应的值,就调用这个方法进行加载.

                @Override

                public String load(String s) throws Exception {

                    return "null";

                }

            });



    public static void setKey(String key,String value){

        localCache.put(key,value);

    }



    public static String getKey(String key){

        String value = null;

        try {

            value = localCache.get(key);

            if("null".equals(value)){

                return null;

            }

            return value;

        }catch (Exception e){

            logger.error("localCache get error",e);

        }

        return null;

    }

}

Day01

第一个门户--用户接口

  1. 登录
  2. 注册
  3. 检查用户名是否有效
  4. 获取用户信息
  5. 忘记密码
  6. 提交问题答案
  7. 忘记密码的重设密码
  8. 登录中状态重置密码
  9. 登录状态更新个人信息
  10. 获取当前登录用户的详细信息,并强制登录
  11. 退出登录

 

Day02

 

后台用户接口:

  1. 后台管理员登录
  2. 用户列表

分类管理模块接口:

获取品类

/manage/category/get_category.do

增加节点

/manage/category/add_category.do

修改类品的名字

/manage/category/set_category_name.do

.获取当前分类id及递归子节点categoryId

/manage/category/get_deep_category.do

 

Day03

商品模块的开发

         前台功能:

产品搜索 动态排序 商品详情

后台功能

商品列表        商品搜索        图片上传

富文本上传 商品详情        商品上下架

增加商品        更新商品

购物车功能模块的开发

                            功能:

  1. 加入商品      
  2. 更新商品      
  3. 查询商品数量
  4. 移除商品      
  5. 单选、取消
  6. 全选、取消
  7. 购物车列表

                                              重点注意几个方面:

购物车的接口设计:

  1. 购物车的列表页
  2. 购物车的添加商品
  3. 更新购物车某个产品的数量
  4. 购物车选中某个商品
  5. 购物车取消选中某个商品
  6. 查询在购物车里的产品数量
  7. 购物车全选
  8. 购物车取消全选

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

安装java环境:

 

 

 

 

 

 

 

 

 

 

 

 

注:这里可以百度一下 jdk的环境变量的配置。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

安装java环境:

 

 

 

 

 

 

 

 

 

 

 

 

注:这里可以百度一下 jdk的环境变量的配置。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Windows的FTP安装完成

数据表结构的设计:

 

 

 

 

 

 

 

 

 

 

 

 

第一天:开始创建maven项目:

 

 

 

 

 

Java是sourceRoot(自己创建)

Test自己创建

 

对应的sourcesRoot

 

项目的整体架构如下图所示:

 

 

 

配置maven的pom文件

Pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>
4.0.0</modelVersion>
  <groupId>
com</groupId>
  <artifactId>
mmall</artifactId>
  <packaging>
war</packaging>
  <version>
1.0-SNAPSHOT</version>
  <name>
mmall Maven Webapp</name>
  <url>
http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>
UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>
UTF-8</project.reporting.outputEncoding>
    <maven.compiler.encoding>
UTF-8</maven.compiler.encoding>

    <org.springframework.version>
4.0.0.RELEASE</org.springframework.version>
    <org.mybatis.version>
3.4.1</org.mybatis.version>
    <org.mybatis.spring.version>
1.3.0</org.mybatis.spring.version>
  </properties>

  <dependencies>

    <dependency>
      <groupId>
org.apache.tomcat</groupId>
      <artifactId>
tomcat-servlet-api</artifactId>
      <version>
7.0.64</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-webmvc</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-oxm</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-jdbc</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-tx</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.springframework</groupId>
      <artifactId>
spring-test</artifactId>
      <version>
${org.springframework.version}</version>
    </dependency>


    <dependency>
      <groupId>
org.aspectj</groupId>
      <artifactId>
aspectjweaver</artifactId>
      <version>
1.7.3</version>
    </dependency>

    <dependency>
      <groupId>
org.mybatis</groupId>
      <artifactId>
mybatis-spring</artifactId>
      <version>
${org.mybatis.spring.version}</version>
    </dependency>
    <dependency>
      <groupId>
org.mybatis</groupId>
      <artifactId>
mybatis</artifactId>
      <version>
${org.mybatis.version}</version>
    </dependency>

    <dependency>
      <groupId>
org.aspectj</groupId>
      <artifactId>
aspectjrt</artifactId>
      <version>
1.6.11</version>
    </dependency>

    <dependency>
      <groupId>
org.codehaus.jackson</groupId>
      <artifactId>
jackson-mapper-asl</artifactId>
      <version>
1.9.12</version>
    </dependency>

    <dependency>
      <groupId>
commons-dbcp</groupId>
      <artifactId>
commons-dbcp</artifactId>
      <version>
1.4</version>
     
<!--<scope>runtime</scope>-->
   
</dependency>


    <dependency>
      <groupId>
ch.qos.logback</groupId>
      <artifactId>
logback-classic</artifactId>
      <version>
1.1.2</version>
      <scope>
compile</scope>
    </dependency>
    <dependency>
      <groupId>
ch.qos.logback</groupId>
      <artifactId>
logback-core</artifactId>
      <version>
1.1.2</version>
      <scope>
compile</scope>
    </dependency>

    <dependency>
      <groupId>
mysql</groupId>
      <artifactId>
mysql-connector-java</artifactId>
      <version>
5.1.6</version>
    </dependency>

    <dependency>
      <groupId>
com.google.guava</groupId>
      <artifactId>
guava</artifactId>
      <version>
20.0</version>
    </dependency>


    <dependency>
      <groupId>
org.apache.commons</groupId>
      <artifactId>
commons-lang3</artifactId>
      <version>
3.5</version>
    </dependency>


    <dependency>
      <groupId>
commons-collections</groupId>
      <artifactId>
commons-collections</artifactId>
      <version>
3.2.1</version>
    </dependency>


    <dependency>
      <groupId>
junit</groupId>
      <artifactId>
junit</artifactId>
      <version>
4.12</version>
     
<!--<scope>test</scope>-->
   
</dependency>

    <dependency>
      <groupId>
joda-time</groupId>
      <artifactId>
joda-time</artifactId>
      <version>
2.3</version>
    </dependency>


   
<!-- id加密解密 -->
   
<dependency>
      <groupId>
org.hashids</groupId>
      <artifactId>
hashids</artifactId>
      <version>
1.0.1</version>
    </dependency>


   
<!-- ftpclient -->
   
<dependency>
      <groupId>
commons-net</groupId>
      <artifactId>
commons-net</artifactId>
      <version>
3.1</version>
    </dependency>

   
<!-- file upload -->

    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
   
<dependency>
      <groupId>
commons-fileupload</groupId>
      <artifactId>
commons-fileupload</artifactId>
      <version>
1.2.2</version>
    </dependency>

    <dependency>
      <groupId>
commons-io</groupId>
      <artifactId>
commons-io</artifactId>
      <version>
2.0.1</version>
    </dependency>




   
<!-- mybatis pager -->

   
<dependency>
      <groupId>
com.github.pagehelper</groupId>
      <artifactId>
pagehelper</artifactId>
      <version>
4.1.0</version>
    </dependency>

    <dependency>
      <groupId>
com.github.miemiedev</groupId>
      <artifactId>
mybatis-paginator</artifactId>
      <version>
1.2.17</version>
    </dependency>

    <dependency>
      <groupId>
com.github.jsqlparser</groupId>
      <artifactId>
jsqlparser</artifactId>
      <version>
0.9.4</version>
    </dependency>


   
<!-- alipay -->
   
<dependency>
      <groupId>
commons-codec</groupId>
      <artifactId>
commons-codec</artifactId>
      <version>
1.10</version>
    </dependency>
    <dependency>
      <groupId>
commons-configuration</groupId>
      <artifactId>
commons-configuration</artifactId>
      <version>
1.10</version>
    </dependency>
    <dependency>
      <groupId>
commons-lang</groupId>
      <artifactId>
commons-lang</artifactId>
      <version>
2.6</version>
    </dependency>
    <dependency>
      <groupId>
commons-logging</groupId>
      <artifactId>
commons-logging</artifactId>
      <version>
1.1.1</version>
    </dependency>
    <dependency>
      <groupId>
com.google.zxing</groupId>
      <artifactId>
core</artifactId>
      <version>
2.1</version>
    </dependency>
    <dependency>
      <groupId>
com.google.code.gson</groupId>
      <artifactId>
gson</artifactId>
      <version>
2.3.1</version>
    </dependency>
    <dependency>
      <groupId>
org.hamcrest</groupId>
      <artifactId>
hamcrest-core</artifactId>
      <version>
1.3</version>
    </dependency>

    <dependency>
      <groupId>
redis.clients</groupId>
      <artifactId>
jedis</artifactId>
      <version>
2.9.0</version>
    </dependency>
  </dependencies>


  <build>
    <finalName>
mmall</finalName>
    <plugins>
      <plugin>
        <groupId>
org.mybatis.generator</groupId>
        <artifactId>
mybatis-generator-maven-plugin</artifactId>
        <version>
1.3.2</version>
        <configuration>
          <verbose>
true</verbose>
          <overwrite>
true</overwrite>
        </configuration>
      </plugin>

     
<!-- geelynote maven的核心插件之-complier插件默认只支持编译Java 1.4,因此需要加上支持高版本jre的配置,在pom.xml里面加上 增加编译插件 -->
     
<plugin>
        <groupId>
org.apache.maven.plugins</groupId>
        <artifactId>
maven-compiler-plugin</artifactId>
        <configuration>
          <source>
1.7</source>
          <target>
1.7</target>
          <encoding>
UTF-8</encoding>
          <compilerArguments>
            <extdirs>
${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs>
          </compilerArguments>
        </configuration>
      </plugin>
    </plugins>

  </build>


</project>

包的结构:

 

common中编写常用的类,四个:

第一个Const

package com.mmall.common;

import
com.google.common.collect.Sets;

import
java.util.Set;

/**
 * Created by geely
 */

public class Const {

   
public static final String CURRENT_USER = "currentUser";

    public static final
String EMAIL = "email";
    public static final
String USERNAME = "username";

    public interface
ProductListOrderBy{
        Set<String>
PRICE_ASC_DESC = Sets.newHashSet("price_desc","price_asc");
   
}

   
public interface Cart{
       
int CHECKED = 1;//即购物车选中状态
       
int UN_CHECKED = 0;//购物车中未选中状态

       
String LIMIT_NUM_FAIL = "LIMIT_NUM_FAIL";
       
String LIMIT_NUM_SUCCESS = "LIMIT_NUM_SUCCESS";
   
}

   
public interface Role{
       
int ROLE_CUSTOMER = 0; //普通用户
       
int ROLE_ADMIN = 1;//管理员
   
}

   
public enum ProductStatusEnum{
       
ON_SALE(1,"在线");
        private
String value;
        private int
code;
       
ProductStatusEnum(int code,String value){
           
this.code = code;
            this
.value = value;
       
}

       
public String getValue() {
           
return value;
       
}

       
public int getCode() {
           
return code;
       
}
    }


   
public enum OrderStatusEnum{
       
CANCELED(0,"已取消"),
       
NO_PAY(10,"未支付"),
       
PAID(20,"已付款"),
       
SHIPPED(40,"已发货"),
       
ORDER_SUCCESS(50,"订单完成"),
       
ORDER_CLOSE(60,"订单关闭");


       
OrderStatusEnum(int code,String value){
           
this.code = code;
            this
.value = value;
       
}
       
private String value;
        private int
code;

        public
String getValue() {
           
return value;
       
}

       
public int getCode() {
           
return code;
       
}

       
public static OrderStatusEnum codeOf(int code){
           
for(OrderStatusEnum orderStatusEnum : values()){
               
if(orderStatusEnum.getCode() == code){
                   
return orderStatusEnum;
               
}
            }
           
throw new RuntimeException("么有找到对应的枚举");
       
}
    }
   
public interface  AlipayCallback{
        String
TRADE_STATUS_WAIT_BUYER_PAY = "WAIT_BUYER_PAY";
       
String TRADE_STATUS_TRADE_SUCCESS = "TRADE_SUCCESS";

       
String RESPONSE_SUCCESS = "success";
       
String RESPONSE_FAILED = "failed";
   
}



   
public enum PayPlatformEnum{
       
ALIPAY(1,"支付宝");

       
PayPlatformEnum(int code,String value){
           
this.code = code;
            this
.value = value;
       
}
       
private String value;
        private int
code;

        public
String getValue() {
           
return value;
       
}

       
public int getCode() {
           
return code;
       
}
    }

   
public enum PaymentTypeEnum{
       
ONLINE_PAY(1,"在线支付");

       
PaymentTypeEnum(int code,String value){
           
this.code = code;
            this
.value = value;
       
}
       
private String value;
        private int
code;

        public
String getValue() {
           
return value;
       
}

       
public int getCode() {
           
return code;
       
}


       
public static PaymentTypeEnum codeOf(int code){
           
for(PaymentTypeEnum paymentTypeEnum : values()){
               
if(paymentTypeEnum.getCode() == code){
                   
return paymentTypeEnum;
               
}
            }
           
throw new RuntimeException("么有找到对应的枚举");
       
}

    }




}

第二个ResponseCode编码响应的状态:

package com.mmall.common;



/**

 * Created by geely

 */

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;





    ResponseCode(int code,String desc){

        this.code = code;

        this.desc = desc;

    }



    public int getCode(){

        return code;

    }

    public String getDesc(){

        return desc;

    }



}

第三个ServerResponse

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)

//保证序列化json的时候,如果是null的对象,key也会消失

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

    //使之不在json序列化结果当中

    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);

    }



























}

第四个TokenCache:

package com.mmall.common;



import com.google.common.cache.CacheBuilder;

import com.google.common.cache.CacheLoader;

import com.google.common.cache.LoadingCache;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;



import java.util.concurrent.TimeUnit;



/**

 * Created by geely

 */

public class TokenCache {



    private static Logger logger = LoggerFactory.getLogger(TokenCache.class);



    public static final String TOKEN_PREFIX = "token_";



    //LRU算法

    private static LoadingCache<String,String> localCache = CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000).expireAfterAccess(12, TimeUnit.HOURS)

            .build(new CacheLoader<String, String>() {

                //默认的数据加载实现,当调用get取值的时候,如果key没有对应的值,就调用这个方法进行加载.

                @Override

                public String load(String s) throws Exception {

                    return "null";

                }

            });



    public static void setKey(String key,String value){

        localCache.put(key,value);

    }



    public static String getKey(String key){

        String value = null;

        try {

            value = localCache.get(key);

            if("null".equals(value)){

                return null;

            }

            return value;

        }catch (Exception e){

            logger.error("localCache get error",e);

        }

        return null;

    }

}

 

 

 

Day01

第一个门户--用户接口

  1. 登录
  2. 注册
  3. 检查用户名是否有效
  4. 获取用户信息
  5. 忘记密码
  6. 提交问题答案
  7. 忘记密码的重设密码
  8. 登录中状态重置密码
  9. 登录状态更新个人信息
  10. 获取当前登录用户的详细信息,并强制登录
  11. 退出登录

 

Day02

 

后台用户接口:

  1. 后台管理员登录
  2. 用户列表

分类管理模块接口:

获取品类

/manage/category/get_category.do

增加节点

/manage/category/add_category.do

修改类品的名字

/manage/category/set_category_name.do

.获取当前分类id及递归子节点categoryId

/manage/category/get_deep_category.do

 

Day03

 

 

商品模块的开发

         前台功能:

产品搜索 动态排序 商品详情

后台功能

商品列表        商品搜索        图片上传

富文本上传 商品详情        商品上下架

增加商品        更新商品

 

购物车功能模块的开发

                            功能:

  1. 加入商品      
  2. 更新商品      
  3. 查询商品数量
  4. 移除商品      
  5. 单选、取消
  6. 全选、取消
  7. 购物车列表

                                              重点注意几个方面:

 

 

购物车的接口设计:

  1. 购物车的列表页
  2. 购物车的添加商品
  3. 更新购物车某个产品的数量
  4. 购物车选中某个商品
  5. 购物车取消选中某个商品
  6. 查询在购物车里的产品数量
  7. 购物车全选
  8. 购物车取消全选

 

猜你喜欢

转载自blog.csdn.net/qq_41479464/article/details/90112006
今日推荐