风靡商城项目搭建

233 阅读6分钟

一、风靡商城项目搭建

基于maven的聚合工程完成项目搭建

  • 前端采用vue+axios
  • 后端采用springboot整合SSM

1.1技术储备

  • springboot:实现无配置的SSM整合
  • Maven聚合工程:实现模块的复用

1.2项目搭建

  • 创建聚合工程
  • 基于springboot整合SSM

1.3Maven聚合工程

1.3.1构建父工程

image.png

image.png

  • common——进行公共类的定义(Vo返还给前端)
  • beans——实体类
  • mapper——对数据库进行操作,创建dao
  • service——对业务进行处理
  • api——相当于controller对外提供的接口,应用程序接口 在父工程中添加代码 <packaging>pom</packaging>

1.3.2构建子工程

image.png 创建springboot子项目

image.png

image.png

将创建的springboot的api换成子工程 pom.xml(api)

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.qfedu</groupId>
    <artifactId>fmmall</artifactId>
    <version>2.0.1</version>
</parent>
<artifactId>api</artifactId>

父工程中引入子工程的依赖

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.7.10</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>
<module>api</module>

api继承fmmall,fmmall继承springboot

1.3.3创建步骤总结

  • 创建父工程(fmmall)创建一个maven工程、packing设置为pom,父工程继承spring-boot-starter-parent
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.qfedu</groupId>
    <artifactId>fmall</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>common</module>
        <module>beans</module>
        <module>mapper</module>
        <module>service</module>
        <module>api</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

</project>
  • 创建common子工程(beans、mapper、service等同)
    • 选择fmmall,右键——New——Moudle(Maven工程)
    • 修改common的pom.xml文件,设置packing=jar
<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>
    <parent>
        <groupId>com.qfedu</groupId>
        <artifactId>fmmall</artifactId>
        <version>2.0.1</version>
    </parent>
    <artifactId>common</artifactId>
    <packaging>jar</packaging>
    <name>Archetype - common</name>
    <url>http://maven.apache.org</url>
</project>
  • 创建beans子工程(beans、mapper、service等同)
    • 选择fmmall,右键——New——Moudle(Maven工程)
    • 修改beans的pom.xml文件,设置packing=jar
  • 创建mapper子工程(beans、mapper、service等同)
    • 选择fmmall,右键——New——Moudle(Maven工程)
    • 修改mapper的pom.xml文件,设置packing=jar
    • 在mapper的pom.xml,依赖beans
<dependencies>
    <dependency>
        <groupId>com.qfedu</groupId>
        <artifactId>beans</artifactId>
        <version>2.0.1</version>
    </dependency>
</dependencies>
  • 创建servicen子工程(beans、mapper、service等同)
    • 选择fmmall,右键——New——Moudle(Maven工程)
    • 修改service的pom.xml文件,设置packing=jar
    • 在service的pom.xml,依赖mapper、common(用户加密)
<dependencies>
   <dependency>
       <groupId>com.qfedu</groupId>
       <artifactId>beans</artifactId>
       <version>2.0.1</version>
   </dependency>
   <dependency>
       <groupId>com.qfedu</groupId>
       <artifactId>common</artifactId>
       <version>2.0.1</version>
   </dependency>
</dependencies>
  • 创建api工程
    • 选择fmmall,右键——New——Moudle(SpringBoot工程)
    • 修改api的pom.xml,继承fmmall,删除自己的groupId和version
    • 将springboot的依赖配置到父工程(fmmall)pom.xml中
    • 在父工程fmmall的pom.xml的moudles中添加api moudle
    • 在api中依赖service 修改api的pom.xml
<parent>
    <groupId>com.qfedu</groupId>
    <artifactId>fmmall</artifactId>
    <version>2.0.1</version>
</parent>

修改api的pom.xml,继承fmmall,删除自己的groupId和version

<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>
<!--  api中需要依赖的条件-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.10</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.qfedu</groupId>
  <artifactId>fmmall</artifactId>
  <version>2.0.1</version>
  <packaging>pom</packaging>
  <name>Archetype - fmmall</name>
  <url>http://maven.apache.org</url>
  <modules>
    <module>common</module>
    <module>beans</module>
    <module>mapper</module>
    <module>service</module>
    <module>api</module>
  </modules>
</project>

将springboot的依赖配置到父工程(fmmall)pom.xml中,添加api

<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>
<!--  api中需要依赖的条件-->
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.10</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <groupId>com.qfedu</groupId>
  <artifactId>fmmall</artifactId>
  <version>2.0.1</version>
  <packaging>pom</packaging>
  <name>Archetype - fmmall</name>
  <url>http://maven.apache.org</url>
  <modules>
    <module>common</module>
    <module>beans</module>
    <module>mapper</module>
    <module>service</module>
    <module>api</module>
  </modules>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <excludes>
            <exclude>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
            </exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

在api中依赖service

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.qfedu</groupId>
        <artifactId>fmmall</artifactId>
        <version>2.0.1</version>
    </parent>
    <artifactId>api</artifactId>
    <dependencies>
        <dependency>
            <groupId>com.qfedu</groupId>
            <artifactId>service</artifactId>
            <version>2.0.1</version>
        </dependency>
    </dependencies>
</project>

image.png

1.3.4聚合工程的依赖分析

如果将依赖添加到父工程的pom中,根据依赖的继承关系,所有的子工程都会继承父工程的依赖:

  • 好处:当有多个子工程都需要相同的依赖时,无需在子工程中重复添加依赖
  • 缺点:如果某些子工程不需要这些依赖时,还是会被强行继承

如果在父工程中没有添加统一的依赖,则需要在每个子工程的pom中自行添加所需要的依赖 如果存在多个子工程需要添加相同的依赖,则需要在父工程pom中进行依赖版本管理

<!--  在父工程中定义版本,以使子工程中的依赖版本保持一致-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.16</version>
        <optional>true</optional>
      </dependency>
    </dependencies>
  </dependencyManagement>

image.png 说明: 方案一:我们可以在父工程的pom文件中一次性添加各个工程所需的所有依赖

方案二:在各个子工程中单独添加当前子工程的依赖

1.3.5Maven依赖配置

1.3.5.1common子工程
  • lombok
1.3.5.2bean子工程
  • lombok
1.3.5.1mapper子工程-MyBatis整合
  • 在mapper子工程的pom文件新增mybatis所需的依赖
 <dependencies>
       <!--  beans-->
        <dependency>
            <groupId>com.qfedu</groupId>
            <artifactId>beans</artifactId>
            <version>2.0.1</version>
        </dependency>
<!--        mysql-->
        <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <version>8.0.32</version>

        </dependency>

        <!--        spring-boot-starter-->
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>3.0.4</version>
        </dependency>

        <!--        mybatis-spring-boot-starter-->
        <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
    </dependencies>
  • 在mapper子工程的resources目录创建application.yml
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db_2010_mybatis?characterEncoding=utf-8
    username: root
    password: root
mybatis:
  mapper-locations: classpath:mappers/*Mapper.xml
  type-aliases-package: com.qfedu.fmmall.entity
#    以上配置数据库,配置别名和mapper文件和别名类()写在beans中
  • 在api子工程的启动类ApiApplication通过@MapperScan声明dao包的路径,dao写在mapper项目中
package com.qfedu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.qfedu.fmmall.dao")
public class ApiApplication {
    public static void main(String[] args) {
        SpringApplication.run( ApiApplication.class, args );
    }
}

注意命名规则:扫描的时候一定要包括entity和dao包;启动启动类会扫描到com.qfedu以及其下的所有子包

image.png

1.3.6SpringBoot单元测试

以通过用户名查找用户为例

  • 在beans中创建user实体类
package com.qfedu.fmmall.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int userId;
    private String userName;
    private String userRealname;
    private String userImg;
}
  • 在mapper中创建UserDAO
package com.qfedu.fmmall.dao;

import com.qfedu.fmmall.entity.User;

public interface UserDAO {
//    根据用户名字查询用户
    public User queryUserByName(String name);

}
  • 在mapper中的resources中新建mappers包,创建UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.qfedu.fmmall.dao.UserDAO">
    <!--namespace根据自己需要创建的的mapper的路径和名称填写-->
<!--   mapper映射用户信息-->
   <resultMap id="userMap" type="com.qfedu.fmmall.entity.User">
      <id column="user_id" property="userId"></id>
      <result column="user_name" property="userName"></result>
      <result column="user_realname" property="userRealname"></result>
      <result column="user_img" property="userImg"></result>

   </resultMap>
<!--   根据用户姓名查询用户,注意需要同时包含数据库和user中的成员名-->
   <select id="queryUserByName" resultType="com.qfedu.fmmall.entity.User">
      select user_id AS userId,user_name AS userName,user_realname AS userRealname,user_img AS userImg
      from users
      where user_name=#{name}
   </select>
</mapper>
  • 在api的test中创建com.qfedu.fmmall.dao包,在包中创建UserDAOTest
    • Alt+Insert选择test再选择JUnit4,进行Junit测试
    • 导入JUnit的包,创建测试类

image.png

package com.qfedu.fmmall.dao;

import com.qfedu.ApiApplication;
import com.qfedu.fmmall.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;


@RunWith( SpringRunner.class )
@SpringBootTest(classes = ApiApplication.class)
public class UserDAOTest {
    @Resource//注入dao对象
    private UserDAO userDAO;

    @Test//引入Junit测试,导入其包
    public void queryUserByName() {
        User user = userDAO.queryUserByName("Lucy");
        System.out.println(user);
    }
}
  • 添加依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
</dependency>

为了使其初始化成功,则需要将UserDAOTest放在api中,因为该项目需要通过启动类加载配置(启动类在api中),因此单元测试统一放到API中,依赖也放到API中

image.png

1.4整合Druid

  • 在mapper子工程添加druid-starter 放到mapper的pom.xml中
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>
  • 在application.yml中修改druid配置
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/db_2010_mybatis?characterEncoding=utf-8
      username: root
      password: root
mybatis:
  mapper-locations: classpath:mappers/*Mapper.xml
  type-aliases-package: com.qfedu.fmmall.entity
#    以上配置数据库,配置别名和mapper文件和别名类()写在beans中

1.5项目整合测试

1.5.1 在beans中创建User

package com.qfedu.fmall.entity;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data

public class User {
    private int userId;
    private String userName;
    private String userPwd;
    private String userRealname;
    private String userImg;


}

1.5.2 在mapper中创建UserDAO

package com.qfedu.fmall.dao;

import com.qfedu.fmall.entity.User;

public interface UserDAO {

    public User queryUserByName(String name);
}

在mapper中的resources下创建mappers,在mappers中创建UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.qfedu.fmall.dao.UserDAO">
   <!--namespace根据自己需要创建的的mapper的路径和名称填写-->
   <!--   mapper映射用户信息-->
   <resultMap id="userMap" type="com.qfedu.fmall.entity.User">
      <id column="user_id" property="userId"></id>
      <result column="user_name" property="userName"></result>
      <result column="user_pwd" property="userPwd"></result>
      <result column="user_realname" property="userRealname"></result>
      <result column="user_img" property="userImg"></result>

   </resultMap>


   <!--   根据用户姓名查询用户-->
   <select id="queryUserByName" resultType="com.qfedu.fmall.entity.User">
      select user_id AS userId,user_name AS userName,user_pwd AS userPwd,user_realname AS userRealname,user_img AS userImg
      from users
      where user_name=#{name}
   </select>
</mapper>

1.5.3 在service中创建UserService

package com.qfedu.fmall.service;

import com.qfedu.fmall.entity.User;
import com.qfedu.fmall.vo.ResultVO;

public interface UserService {
    public ResultVO checkLogin(String name, String pwd);
}

在service中创建impl包,创建UserServiceImpl

package com.qfedu.fmall.service.impl;

import com.qfedu.fmall.dao.UserDAO;
import com.qfedu.fmall.entity.User;
import com.qfedu.fmall.service.UserService;
import com.qfedu.fmall.vo.ResultVO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class UserServiceImpl implements UserService {
    //注入userDAo
    @Resource
    private UserDAO userDAO;
    @Override
    public ResultVO checkLogin(String name, String pwd) {
        //根据账号查询用户信息
        User user = userDAO.queryUserByName( name );
        //判断
        if(user == null ){
            //用户名不存在
            return new ResultVO(10001,"用户不存在",null);
        }else{
            //对输入的密码pwd进行加密
            //使用加密后的密码和user中的密码进行匹配
            if (user.getUserPwd().equals( pwd )){
                //验证成功
                return new ResultVO(10000,"登录成功",null);
            }else {
                //密码错误
                return new ResultVO(10001,"密码错误",null);
            }
        }

    }
}

1.5.4 在common中创建ResultVO

package com.qfedu.fmall.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class ResultVO {
    //响应给前端的状态码
    private int code;
    //响应给前端的提示信息
    private String msg;
    //响应给前端的数据
    private Object data;
}

1.5.5 在api中创建UserController

package com.qfedu.controller;

import com.qfedu.fmall.service.UserService;
import com.qfedu.fmall.vo.ResultVO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;

@Controller
@ResponseBody
@RequestMapping("/user")

public class UserController {
    @Resource
    private UserService userService;
    @RequestMapping("/login")
    public ResultVO login(String name,String pwd){
        return userService.checkLogin( name,pwd );

    }

}

在api的启动类中添加如下信息

package com.qfedu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.qfedu.fmall.dao")
@SpringBootApplication
public class ApiApplication {

    public static void main(String[] args) {
        SpringApplication.run( ApiApplication.class, args );
    }

}