IHRM项目一章_搭建项目

  • 开发环境
    • JDK1.8
    • 数据库mysql 5.7
    • 开发工具 idea 2018.1
    • maven版本3.5.2
  • 搭建一个父工程,两个子模块.
  • 新建项目
    1. 点击file-->new-->project-->maven-->next

    2.  
    3. 然后修改项目文件路径,生成项目.
    4. 修改项目的maven配置
    5. 因为是父工程并不会有具体的代码,所以可以吧src文件夹删掉.
    6. pom.xml文件
    7. <?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.ihrm</groupId>
          <artifactId>ihrm_parent</artifactId>
          <version>1.0-SNAPSHOT</version>
      
          <packaging>pom</packaging>
          <name>ihrm_parent</name>
          <description>IHRM-父工程</description>
      
          <parent>
              <!--springboot的maven配置-->
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.0.5.RELEASE</version>
              <relativePath/>
          </parent>
      
          <properties>
              <!--项目工程的基本配置-->
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
              <java.version>1.8</java.version>
              <fastjson.version>1.2.47</fastjson.version>
          </properties>
      
          <dependencies>
              <dependency>
                  <!--web环境-->
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-logging</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
              <dependency>
                  <!--阿里提供的json转化-->
                  <groupId>com.alibaba</groupId>
                  <artifactId>fastjson</artifactId>
                  <version>${fastjson.version}</version>
              </dependency>
              <dependency>
                  <!--lombok插件-->
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <version>1.16.16</version>
              </dependency>
          </dependencies>
      
          <repositories>
              <repository>
                  <id>spring-snapshots</id>
                  <name>Spring Snapshots</name>
                  <url>https://repo.spring.io/snapshot</url>
                  <snapshots>
                      <enabled>true</enabled>
                  </snapshots>
              </repository>
              <repository>
                  <id>spring-milestones</id>
                  <name>Spring Milestones</name>
                  <url>https://repo.spring.io/milestone</url>
                  <snapshots>
                      <enabled>false</enabled>
                  </snapshots>
              </repository>
          </repositories>
      
          <pluginRepositories>
              <pluginRepository>
                  <id>spring-snapshots</id>
                  <name>Spring Snapshots</name>
                  <url>https://repo.spring.io/snapshot</url>
                  <snapshots>
                      <enabled>true</enabled>
                  </snapshots>
              </pluginRepository>
              <pluginRepository>
                  <id>spring-milestones</id>
                  <name>Spring Milestones</name>
                  <url>https://repo.spring.io/milestone</url>
                  <snapshots>
                      <enabled>false</enabled>
                  </snapshots>
              </pluginRepository>
          </pluginRepositories>
          <build>
              <plugins>
                  <!--编译插件-->
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-compiler-plugin</artifactId>
                      <version>3.1</version>
                      <configuration>
                          <source>${java.version}</source>
                          <target>${java.version}</target>
                      </configuration>
                  </plugin>
      
                  <!--单元测试插件-->
                  <plugin>
                      <groupId>org.apache.maven.plugins</groupId>
                      <artifactId>maven-surefire-plugin</artifactId>
                      <version>2.12.4</version>
                      <configuration>
                          <skipTests>true</skipTests>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      
      </project>

       

    • 构建公共的子模块

      • 就是公用交互的实体类,或者dto,公共的Utils工具类 等等.

      • 点击hrm项目,选择new-->module-->maven-->填写文件名:ihrm_common

      • 写ResultCode公共的返回对象,

      • package com.ihrm.common.entity;
        
        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        
        import java.util.List;
        
        /**
         * 分页对象
         * @param <T>
         */
        @Data
        @AllArgsConstructor
        @NoArgsConstructorpackage com.ihrm.common.entity;
        
        /**
         * 公共的返回代码
         */
        public enum ResultCode {
        
            SUCCESS(true,200,"操作成功!"),
            //---系统错误返回码-----
            FAIL(false,999,"操作失败"),
        
        
            //操作是否成功
            boolean success;
            //操作代码
            int code;
            //提示信息
            String message;
        
            ResultCode(boolean success,int code, String message){
                this.success = success;
                this.code = code;
                this.message = message;
            }
        
            public boolean success() {
                return success;
            }
        
            public int code() {
                return code;
            }
        
            public String message() {
                return message;
            }
        
        }
        
        public class PageResult<T> {
            private Long total;
            private List<T> rows;
        }
        

         

      • Result返回的结果集

        • package com.ihrm.common.entity;
          
          import com.fasterxml.jackson.annotation.JsonInclude;
          import com.fasterxml.jackson.databind.annotation.JsonSerialize;
          import lombok.AllArgsConstructor;
          import lombok.Data;
          import lombok.NoArgsConstructor;
          
          
          /**
           * 封装的数据相应对象
           */
          @Data
          @NoArgsConstructor
          public class Result {
          
              private boolean success;//是否成功
              private Integer code;// 返回码
              private String message;//返回信息
              private Object data;// 返回数据
          
              public Result(ResultCode code) {
                  this.success = code.success;
                  this.code = code.code;
                  this.message = code.message;
              }
          
              public Result(ResultCode code,Object data) {
                  this.success = code.success;
                  this.code = code.code;
                  this.message = code.message;
                  this.data = data;
              }
          
              public Result(Integer code,String message,boolean success) {
                  this.code = code;
                  this.message = message;
                  this.success = success;
              }
          
              public static Result SUCCESS(){
                  return new Result(ResultCode.SUCCESS);
              }
          
              public static Result ERROR(){
                  return new Result(ResultCode.SERVER_ERROR);
              }
          
              public static Result FAIL(){
                  return new Result(ResultCode.FAIL);
              }
          }
          

           

      • PageResult分页返回的结果集

      • package com.ihrm.common.entity;
        
        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        
        import java.util.List;
        
        /**
         * 分页对象
         * @param <T>
         */
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public class PageResult<T> {
            private Long total;
            private List<T> rows;
        }
        

         

    • 微服务架构id的生成

      • 常用的主键生成方式
        • 主键自增-->多家公司共用一张表.

        • uuid-->太长了.数据量大

        • 借助全局的redis. 每次都访问同一个redis. 但是对于网络的开销太大了.

      • 微服务的主键生成方式: 雪花算法:

        • 目前微服务架构盛行,在分布式系统中的操作中都会有一些全局性ID的需求,所以我们不能使用数据库本身的自增功能来产生主键值,只能由程序来生成唯一的主键值。我们采用的是开源的twitter( 非官方中文惯称:推特.是国外的一个网站,是一个社交网络及微博客服务) 的snowflake (雪花)算法。

        • 第一位不用,后面是时间戳的毫秒数加上工作机器的id加上系列号最大支持4096个id

          • 如果你在同一毫秒同一个机器上,瞬间进入10000个,多余的它就会等到下一毫秒在进行处理.

      • 网上找到的生成的工具类

        • package com.ihrm.common.utils;
          
          import java.lang.management.ManagementFactory;
          import java.net.InetAddress;
          import java.net.NetworkInterface;
          
          //雪花算法代码实现
          public class IdWorker {
              // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动)
              private final static long twepoch = 1288834974657L;
              // 机器标识位数
              private final static long workerIdBits = 5L;
              // 数据中心标识位数
              private final static long datacenterIdBits = 5L;
              // 机器ID最大值
              private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);
              // 数据中心ID最大值
              private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
              // 毫秒内自增位
              private final static long sequenceBits = 12L;
              // 机器ID偏左移12位
              private final static long workerIdShift = sequenceBits;
              // 数据中心ID左移17位
              private final static long datacenterIdShift = sequenceBits + workerIdBits;
              // 时间毫秒左移22位
              private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
          
              private final static long sequenceMask = -1L ^ (-1L << sequenceBits);
              /* 上次生产id时间戳 */
              private static long lastTimestamp = -1L;
              // 0,并发控制
              private long sequence = 0L;
          
              private final long workerId;
              // 数据标识id部分
              private final long datacenterId;
          
              public IdWorker(){
                  this.datacenterId = getDatacenterId(maxDatacenterId);
                  this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);
              }
              /**
               * @param workerId
               *            工作机器ID
               * @param datacenterId
               *            序列号
               */
              public IdWorker(long workerId, long datacenterId) {
                  if (workerId > maxWorkerId || workerId < 0) {
                      throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
                  }
                  if (datacenterId > maxDatacenterId || datacenterId < 0) {
                      throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
                  }
                  this.workerId = workerId;
                  this.datacenterId = datacenterId;
              }
              /**
               * 获取下一个ID
               *
               * @return
               */
              public synchronized long nextId() {
                  long timestamp = timeGen();
                  if (timestamp < lastTimestamp) {
                      throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
                  }
          
                  if (lastTimestamp == timestamp) {
                      // 当前毫秒内,则+1
                      sequence = (sequence + 1) & sequenceMask;
                      if (sequence == 0) {
                          // 当前毫秒内计数满了,则等待下一秒
                          timestamp = tilNextMillis(lastTimestamp);
                      }
                  } else {
                      sequence = 0L;
                  }
                  lastTimestamp = timestamp;
                  // ID偏移组合生成最终的ID,并返回ID
                  long nextId = ((timestamp - twepoch) << timestampLeftShift)
                          | (datacenterId << datacenterIdShift)
                          | (workerId << workerIdShift) | sequence;
          
                  return nextId;
              }
          
              private long tilNextMillis(final long lastTimestamp) {
                  long timestamp = this.timeGen();
                  while (timestamp <= lastTimestamp) {
                      timestamp = this.timeGen();
                  }
                  return timestamp;
              }
          
              private long timeGen() {
                  return System.currentTimeMillis();
              }
          
              /**
               * <p>
               * 获取 maxWorkerId
               * </p>
               */
              protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
                  StringBuffer mpid = new StringBuffer();
                  mpid.append(datacenterId);
                  String name = ManagementFactory.getRuntimeMXBean().getName();
                  if (!name.isEmpty()) {
                      /*
                       * GET jvmPid
                       */
                      mpid.append(name.split("@")[0]);
                  }
                  /*
                   * MAC + PID 的 hashcode 获取16个低位
                   */
                  return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
              }
          
              /**
               * <p>
               * 数据标识id部分
               * </p>
               */
              protected static long getDatacenterId(long maxDatacenterId) {
                  long id = 0L;
                  try {
                      InetAddress ip = InetAddress.getLocalHost();
                      NetworkInterface network = NetworkInterface.getByInetAddress(ip);
                      if (network == null) {
                          id = 1L;
                      } else {
                          byte[] mac = network.getHardwareAddress();
                          id = ((0x000000FF & (long) mac[mac.length - 1])
                                  | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;
                          id = id % (maxDatacenterId + 1);
                      }
                  } catch (Exception e) {
                      System.out.println(" getDatacenterId: " + e.getMessage());
                  }
                  return id;
              }
          }
          

           

        • 如果maven加载完报错,就把报错的maven注释掉,重新加载就可以了.或者

  • 把dao需要的实体类都放到一个项目中,这样方便管理.

    • <?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>ihrm_parent</artifactId>
              <groupId>com.ihrm</groupId>
              <version>1.0-SNAPSHOT</version>
          </parent>
          <modelVersion>4.0.0</modelVersion>
      
          <artifactId>ihrm_commom_model</artifactId>
      
          <dependencies>
              <!--springData_jpa的依赖-->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-data-jpa</artifactId>
              </dependency>
              <!--commom项目的依赖-->
              <dependency>
                  <groupId>com.ihrm</groupId>
                  <artifactId>ihrm_common</artifactId>
                  <version>1.0-SNAPSHOT</version>
              </dependency>
          </dependencies>
      
      </project>

       

    • 然后model项目下的java包和resource包设置为sources root 和 resource root

  • 新建一个ihrm_company项目引入对common和model项目的以来,然后增加springboot的启动类和jpa的依赖

    • <?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>ihrm_parent</artifactId>
              <groupId>com.ihrm</groupId>
              <version>1.0-SNAPSHOT</version>
          </parent>
          <modelVersion>4.0.0</modelVersion>
      
          <artifactId>ihrm_company</artifactId>
      
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-data-jpa</artifactId>
              </dependency>
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
              </dependency>
              <dependency>
                  <groupId>com.ihrm</groupId>
                  <artifactId>ihrm_common</artifactId>
                  <version>1.0-SNAPSHOT</version>
              </dependency>
              <dependency>
                  <groupId>com.ihrm</groupId>
                  <artifactId>ihrm_commom_model</artifactId>
                  <version>1.0-SNAPSHOT</version>
              </dependency>
          </dependencies>
      
      </project>

       

    • 在添加好后刷新maven,然后在resource目录下,新建springboot的启动配置文件application.yml

      • 直接new file就可以了.

      • 配置启动文件

        • springboot的配置文件在 服务器上不支持tab键.所以就手敲空格吧.

          • #服务配置
            server:
              port: 9001
            #spring配置
            spring:
              application:
                name: ihrm-company
            #数据库连接
              datasource:
                driver-class-name: com.mysql.jdbc.Driver
                url: jdbc:mysql://127.0.0.1:3306/ihrm?useUnicode=true&characterEncoding=utf8&useSSL=false
                username: root
                password: 123456
            #jap的配置
              jpa:
                database: MySQL
                show-sql: true
                open-in-view: true

             

      • 创建当前项目的启动类

        •  

          /**
           * 启动类
           */
          //配置springboot的包扫描
          @SpringBootApplication(scanBasePackages = "com.ihrm.**")
          //配置jsp注解的扫描 就是扫描model项目的
          @EntityScan(value = "com.ihrm.domain.**")
          @Slf4j
          @RestController
          public class CompanyApplication {
          
              /**
               * 启动方法
               *
               * @param args
               */
              public static void main(String[] args) throws UnknownHostException {
                  ConfigurableApplicationContext application = SpringApplication.run(CompanyApplication.class, args);
                  Environment env = application.getEnvironment();
                  log.info("\n--------------------------------------------------------------------------------------------------------------------\n\t" +
                                  "CompanyApplication '{}' is running! Access URLs:\n\t" +
                                  "Local: \t\thttp://localhost:{}/\n\t" +
                                  "External: \thttp://{}:{}/\n\t" +
                                  "docs: \thttp://{}:{}/docs.html" +
                                  "\n--------------------------------------------------------------------------------------------------------------------",
                          "CompanyApplication Server Application v1.0",
                          env.getProperty("server.port"),
                          InetAddress.getLocalHost().getHostAddress(),
                          env.getProperty("server.port"));
              }
          
              @GetMapping("/")
              public String index() {
                  return "CompanyApplication Server is running";
              }
          
          
              @RequestMapping("/hello")
              @ResponseBody
              String home() {
                  return "Hello ,spring boot!";
              }

           

      • mysql安装:

        •  https://www.cnblogs.com/ixan/p/7341637.html

        • 创建数据库表

          • CREATE TABLE `co_company` (
             `id` varchar(40) NOT NULL COMMENT 'ID',
             `name` varchar(255) NOT NULL COMMENT '公司名称',
             `manager_id` varchar(255) NOT NULL COMMENT '企业登录账号ID',
             `version` varchar(255) DEFAULT NULL COMMENT '当前版本',
             `renewal_date` datetime DEFAULT NULL COMMENT '续期时间',
             `expiration_date` datetime DEFAULT NULL COMMENT '到期时间',
             `company_area` varchar(255) DEFAULT NULL COMMENT '公司地区',
             `company_address` text COMMENT '公司地址',
             `business_license_id` varchar(255) DEFAULT NULL COMMENT '营业执照-图片ID',
             `legal_representative` varchar(255) DEFAULT NULL COMMENT '法人代表',
             `company_phone` varchar(255) DEFAULT NULL COMMENT '公司电话',
             `mailbox` varchar(255) DEFAULT NULL COMMENT '邮箱',
             `company_size` varchar(255) DEFAULT NULL COMMENT '公司规模',
             `industry` varchar(255) DEFAULT NULL COMMENT '所属行业',
             `remarks` text COMMENT '备注',
             `audit_state` varchar(255) DEFAULT NULL COMMENT '审核状态',
             `state` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态',
             `balance` double NOT NULL COMMENT '当前余额',
             `create_time` datetime NOT NULL COMMENT '创建时间'
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

             

          • 生成实体类.

            • 因为使用jpa操作数据,使用jpa注解

              • 实体类和表的映射关系

              • 字段和属性的映射关系

            • 用@Entity表示实体类.@Table(name = "co_company")写对应的映射表名.

              • @id或者@Column(name= "数据对应的字段")

            • 数据库连接的版本和本地数据库的版本 不匹配.

              • 要不然就改数据库,要不然就该驱动..建议还是降低数据库吧.然后一系列的maven配置都要改.

            • 然后写一个test类.这样数据库就连接成功了.

            •  

          • 我用的软件百度网盘下载地址:

            • 链接:https://pan.baidu.com/s/1Q4guTqX21zRf2rWyscg6xw 
              提取码:gyod

               

手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 项目介绍: iHRM是一款基于SaaS平台的人力资源管理系统, 企业通过该系统可以完成员工管理、审批管理、考勤管理、社保公积金管理、薪资管理等功能,为企业的人力资源管理提供一站式解决方案。 掌握的核心能力:   1、能够了解SaaS的基本概念   2、掌握Activiti7工作流引擎的使用   3、能够掌握商用权限方案的设计   4、能够使用JasperReport生成报表。   5、能够使用PowerDesigner构建数据库模型   6、了解SAAS-HRM中权限控制   7、理解前端权限控制思路   8、熟练构造Chart图形报表 解决方法:   1、Spring全家桶解决方案|   2、SPA工程构建解决方案|   3、Saas系统数据库设计方案|   4、统一会话管理的解决方案|   5、企业级报表解决方案|   6、系统认证授权的解决方案|   7、云存储解决方案|   8、RBAC权限设计方案|   9、刷脸登录解决方案|   10、自定义代码生成器|   11、Activiti工作流开发| 涵盖知识点:   1.结合Activiti7工作流引擎的应用教程。   2.基于Shiro+Redis的分布式session解决方案。   3.可商用的权限设计方案(提供菜单,按钮,超链接,API粒度的权限控制)。   4.完整的代码生成器教程。   5.采用JasperReport完成企业级PDF报表生成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值