zoukankan      html  css  js  c++  java
  • 一个秒杀系统的搭建(一)

    新建父项目

    youfanmiaosha2

    pom文件

    共有的依赖spring boot,spring boot有父依赖

    <?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>
    
        <groupId>com.youfan.miaosha2</groupId>
        <artifactId>youfanmiaosha2</artifactId>
        <packaging>pom</packaging>
        <version>1.0</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.2.RELEASE</version>
        </parent>
        <properties>
            <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
        </properties>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>${spring-cloud.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
    </project>

    参考:dependencyManagement与dependencies区别

      最近在阅读maven项目代码时,dependencyManagement与dependencies之间的区别不是很了解,现通过项目实例进行总结:项目epps-demob-pom下有一个模块是epps-demob-war。

    一、dependencyManagement应用场景

      为了项目的正确运行,必须让所有的子模块使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。在我们项目顶层的pom文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

      epps-demob-pom中dependencyManagement如下:

    复制代码
        <modules>
            <module>epps-demob-war</module>
        </modules>
        <properties>
                <spring-version>3.1.1.RELEASE</spring-version>
        </properties>
        <dependencyManagement>
              <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-web</artifactId>
                    <version>${spring-version}</version>
              </dependency>
        </dependencyManagement>
    复制代码

      epps-demob-war中dependency如下:

    复制代码
        <dependencies>
                <dependency>
                      <groupId>org.springframework</groupId>
                      <artifactId>spring-web</artifactId>
                </dependency>
        </dependencies>
    复制代码

      这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。

    二、dependencies应用场景

      相对于dependencyManagement,如果在epps-demob-pom中通过dependencies引入jar,将默认被所有的子模块继承。

    三、dependencyManagement与dependencies区别

      dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
      dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。

    新建模块:注册中心

    pom引入注册中心的依赖

    <?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">
        <parent>
            <artifactId>youfanmiaosha2</artifactId>
            <groupId>com.youfan.miaosha2</groupId>
            <version>1.0</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>youfanRegisterCenter</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <finalName>youfanRegisterCenter</finalName>
    
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
            <resources>
                <!-- 先指定 src/main/resources下所有文件及文件夹为资源文件 -->
                <resource>
                    <directory>src/main/resources</directory>
                    <targetPath>${project.build.directory}/classes</targetPath>
                    <includes>
                        <include>**/*</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    </project>

    resources文件夹下配置文件application.yml

    server:
      port: 8761
    
    eureka:
      instance:
        hostname: localhost
      client:
        registerWithEureka: false # 是否向 Eureka 注册服务。该应用为服务注册中心,不需要自注册,设置为 false
        fetchRegistry: false  # 是否检索服务。该应用为服务注册中心,职责为注册和发现服务,无需检索服务,设置为 false 
        serviceUrl:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    
    spring:
      application:
        name: youfanRegisterCenter

    新建包com.youfan.controller

    包下新建类eureka

    package com.youfan.controller;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServer {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServer.class,args);
        }
    }

    用户模块设计

    新建模块youfanUser

    pom添加依赖

    作为客户端,引入eureka

    下面用到mybatis,引入

    <?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">
        <parent>
            <artifactId>youfanmiaosha2</artifactId>
            <groupId>com.youfan.miaosha2</groupId>
            <version>1.0</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>youfanUser</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
        </dependencies>
    
        </build>

    resources文件夹下创建application.properties

    server.port=8081
    spring.application.name=youfanUser

    新建com.youfan包

    包下建YouFanUserApplication类

    package com.youfan;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    public class YouFanUserApplication {
        public static void main(String[] args) {
    
            SpringApplication.run(YouFanUserApplication.class, args);
        }
    }

    建control包

    建测试类UserTest

    package com.youfan.control;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.servlet.http.HttpServletRequest;
    
    @RestController
    public class UserTest {
        @RequestMapping(value="sayHello", method= RequestMethod.GET)
        public String sayHello(HttpServletRequest req){
            String remoteAddr = req.getRemoteAddr();
            return "hello " + remoteAddr + "!!";
        }
    }

    启动

    建service包

    新建数据库youfanshop

    新建表youfanuser

    新建模块youfanCommon

    pom配置常用工具

    <?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">
        <parent>
            <artifactId>youfanmiaosha2</artifactId>
            <groupId>com.youfan.miaosha2</groupId>
            <version>1.0</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>youfanCommon</artifactId>
        <dependencies>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.54</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.3.2</version>
            </dependency>
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.11</version>
            </dependency>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.9.0</version>
            </dependency>
        </dependencies>
    
    </project>

    新建包com.youfan.entity

    新建类UserInfo

    package com.youfan.entity;
    
    public class UserInfo {
    
        private int id;//主键
        private String account;//用户名
        private String encryptionPassword;//加密密码
        private String originalPassword;//未加密密码
        private int sex;//性别 0男1女
        private String telphone;//手机号
        private String birthday;//生日
        private String qq;//qq
        private String weixin;//微信号
        private String idCard;//身份证号
        private String name;//姓名
        private int age;//年龄
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getAccount() {
            return account;
        }
    
        public void setAccount(String account) {
            this.account = account;
        }
    
        public String getEncryptionPassword() {
            return encryptionPassword;
        }
    
        public void setEncryptionPassword(String encryptionPassword) {
            this.encryptionPassword = encryptionPassword;
        }
    
        public String getOriginalPassword() {
            return originalPassword;
        }
    
        public void setOriginalPassword(String originalPassword) {
            this.originalPassword = originalPassword;
        }
    
        public int getSex() {
            return sex;
        }
    
        public void setSex(int sex) {
            this.sex = sex;
        }
    
        public String getTelphone() {
            return telphone;
        }
    
        public void setTelphone(String telphone) {
            this.telphone = telphone;
        }
    
        public String getBirthday() {
            return birthday;
        }
    
        public void setBirthday(String birthday) {
            this.birthday = birthday;
        }
    
        public String getQq() {
            return qq;
        }
    
        public void setQq(String qq) {
            this.qq = qq;
        }
    
        public String getWeixin() {
            return weixin;
        }
    
        public void setWeixin(String weixin) {
            this.weixin = weixin;
        }
    
        public String getIdCard() {
            return idCard;
        }
    
        public void setIdCard(String idCard) {
            this.idCard = idCard;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }

    整合mybatis

    在youfanUser的pom中添加依赖

    <?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">
        <parent>
            <artifactId>youfanmiaosha2</artifactId>
            <groupId>com.youfan.miaosha2</groupId>
            <version>1.0</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>youfanUser</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!--mybaits-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.1</version>
            </dependency>
    
    
            <dependency>
                <groupId>org.apache.tomcat</groupId>
                <artifactId>tomcat-jdbc</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
    
    
        </dependencies>
    
        <build>
            <finalName>youfanUser</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
            <resources>
                <!-- 先指定 src/main/resources下所有文件及文件夹为资源文件 -->
                <resource>
                    <directory>src/main/resources</directory>
                    <targetPath>${project.build.directory}/classes</targetPath>
                    <includes>
                        <include>**/*</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    </project>

    YouFanUserApplication中添加bean和注解

    package com.youfan;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.tomcat.jdbc.pool.DataSource;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    
    
    @SpringBootApplication
    @EnableEurekaClient
    @MappScan("com.youfan.mapper")
    public class YouFanUserApplication { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource(){ return new org.apache.tomcat.jdbc.pool.DataSource(); } @Bean public SqlSessionFactory sqlSessionFactoryBean() throws Exception{ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource()); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mappers/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } public static void main(String[] args) { SpringApplication.run(YouFanUserApplication.class, args); } }

    pom添加youfanCommon依赖

            <dependency>
                <groupId>com.youfan.miaosha2</groupId>
                <version>1.0</version>
                <artifactId>youfanCommon</artifactId>
            </dependency>

    新建com.youfan.mapper包,下面新建UserMapper接口

    package com.youfan.mapper;
    
    import com.youfan.entity.UserInfo;
    
    public interface UserMapper {
        public UserInfo findUserByid(int userid);
    }

    新建上面classpath路径和文件,resources下新建User.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.youfan.mapper.UserMapper">
    
        <select id="findUserByid" resultType="com.youfan.entity.UserInfo"  parameterType="int">
            select account,encryptionPassword,sex,telphone,qq,weixin,age,birthday from youfanuser where id = #{userid}
        </select>
    
    
    </mapper>

    application.properties中配置数据库

    server.port=8081
    spring.application.name=youfanUser
    
    eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
    
    #mysql配置
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/youfanshop?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver

    新建com.youfan.dao包

    新建UserDao

    package com.youfan.dao;
    
    import com.youfan.entity.UserInfo;
    import com.youfan.mapper.UserMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class UserDao {
        @Autowired
        private UserMapper userMapper;
        public UserInfo findUserByid(int userid){
            return userMapper.findUserByid(userid);
        }
    }

    idea报Could not autowired解决办法

    service下新建UserService

    package com.youfan.service;
    
    import com.youfan.dao.UserDao;
    import com.youfan.entity.UserInfo;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserService {
        @Autowired
        private UserDao userDao;
        public UserInfo findUserByid(int userid){
            return userDao.findUserByid(userid);
        }
    }

    control下新建UserControl

    package com.youfan.control;
    
    import com.alibaba.fastjson.JSONObject;
    import com.youfan.entity.UserInfo;
    import com.youfan.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @RestController
    public class UserControl {
        @Autowired
        private UserService userService;
    
        @RequestMapping(value = "findUserbyId", method = RequestMethod.GET)
        public String findUserbyId(int id){
            UserInfo userInfo = userService.findUserByid(id);
            String result = JSONObject.toJSONString(userInfo);
            return result;
        }
    }

    配置maven仓库镜像,settings.xml中添加:

    <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
    <!-- junit镜像地址 -->
    <mirror>
      <id>junit</id>
      <name>junit Address/</name>
      <url>http://jcenter.bintray.com/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>

    数据库插入一条数据

    启动

    整合thymeleaf

    pom依赖

    <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    resources下新建文件夹templates

    新建viewUser.html

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8"/>
        <title>Title</title>
    </head>
    <body>
    <table border="1">
        <tr>
            <td>账号</td>
            <td>手机号</td>
            <td>生日</td>
            <td>qq</td>
            <td>微信</td>
        </tr>
        <tr>
            <td><span th:text="${userInfo.account}"/></td>
            <td><span th:text="${userInfo.telphone}"/></td>
            <td><span th:text="${userInfo.birthday}"/></td>
            <td><span th:text="${userInfo.qq}"/></td>
            <td><span th:text="${userInfo.weixin}"/></td>
        </tr>
    </table>
    </body>
    </html>

    修改UserControl

    package com.youfan.control;
    
    import com.alibaba.fastjson.JSONObject;
    import com.youfan.entity.UserInfo;
    import com.youfan.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.Controller;
    
    
    @Controller
    public class UserControl {
        @Autowired
        private UserService userService;
    
        @RequestMapping(value = "findUserbyId", method = RequestMethod.GET)
        public String findUserbyId(int id, Model model){
            UserInfo userInfo = userService.findUserByid(id);
            model.addAttribute("userInfo", userInfo);
            return "viewUser";
        }
    }

    报错org.thymeleaf.exceptions.TemplateInputException: Error resolving template解决方案

    链接:https://blog.csdn.net/Lin_xiaofeng/article/details/79122053
  • 相关阅读:
    获取mysql数据库中的表信息
    Django Rest Framework --- 分页器组件
    Django Rest Framework --- 频率组件
    Django Rest Framework --- 权限组件
    Django Rest Framework --- 认证组件
    Django Rest Framework --- 视图组件
    序列化组件
    restful规范,cbv源码执行流程,drf之APIView及Respons源码分析
    前后台分离式开发(文件的上传下载),cookie(存放在前台),session(存放在后台)
    ajax,分页器
  • 原文地址:https://www.cnblogs.com/aidata/p/11622369.html
Copyright © 2011-2022 走看看