一、项目介绍

1.项目简介

此系列博客将会介绍从0开始,实现前后端分离项目,使用微服务架构的方式,开发出一套HRM管理系统,并且将整个开发流程记录下来,对关键的部分进行详细说明,会在github上讲此项目进行开源,方便其他项目的相关系统进行二次开发。
github地址前端:https://github.com/2NaCl/gongdaVue
github地址后端:https://github.com/2NaCl/gongda
项目会不断更新,如果git后发现有问题请不要着急,会不断进行更新。

2.涉及功能及技术

  • 授权模块
    使用JWT进行前后端的授权验证,使用Shiro的认证框架(菜单,按钮,API)

  • 代码生成模块

  • 工作流
    底层员工发送层层审批,进行定制开发,用Activiti 7

  • 登录模块

3.SaaS概述

SaaS的意思是软件即服务,简单来说就是在线系统模式,即软件服务商提供的在线服务。

就软件适用对象而言,可以划分为针对个人的和针对企业的,像各种管理系统,按照不同规模划分个人和企业。

4.需求分析

这里使用了powerDesign进行了需求分析的UML绘图

5.系统设计

5.1开发方式

在这里插入图片描述
采用前后端分离式进行开发,后端返回json数据给前端,前端负责h5渲染和用户交互。双方通过文档的形式进行规范接口内容。

5.2 技术架构

在这里插入图片描述

6.开发环境

JDK 1.8
Idea 2018.2.4
数据库 mysql 5.7
maven 3.3.9
lombok插件

二、项目初步设计

  1. 首先创建Maven工程父Module SaaS-LMS,然后导入pom依赖

  2. 再创建子Module,公共子模块lms-common,并且创建实体类。
    实体类功能

  • PageResult
    针对分页时候,返回一个json格式的数据,包含数据相应的具体信息,响应码,状态码,响应是否成功等等
  • Result
    同上,但不针对于分页,且没有数据信息
  • ResultCode
    一个枚举,定义出不同相应状态和对应的操作码
  1. 然后是设计分布式ID生成器。由于在分布式系统中的操作会有一些全局性的ID的需求,所以我们不能使用数据库本身的自增功能来产生主键值,只能由程序来生成唯一的主键值。
    在常规情况还是有以下三种方案的:
    (1). 数据库主键id自增
    (2). uuid(字符太长,占空间)
    (3). 借用全局Redis(网络开销大)
    (4). 雪花算法

下面来介绍一些推特的snowflake算法

SnowFlake所生成的ID一共分成四部分:

第一位

占用1bit,其值始终是0,没有实际作用。

时间戳

占用41bit,精确到毫秒,总共可以容纳约140年的时间。

工作机器id

占用10bit,其中高位5bit是数据中心ID(datacenterId),低位5bit是工作节点ID(workerId),做多可以容纳1024个节点。

序列号

占用12bit,这个值在同一毫秒同一节点上从0开始不断累加,最多可以累加到4095。
在这里插入图片描述

优点:生成有顺序的id,提高数据库的性能,现在大部分都不用uuid作为主键,因为不规则,每向数据库插入一条数据就要重新排列,使数据库性能降低。
而雪花算法依赖于内存,所以可以做到高性能高可用,ID成趋势自增,方便排序,解决数据库性能。

  1. 设计分布式id生成之后,设计一个模块存放实验室实体类,再设计一个实验室业务模块。
    在这里插入图片描述

  2. 并且在业务模块导入mysql依赖,jpa依赖
    实体模块导入jpa依赖

  3. 然后在业务模块进行相关的sql配置。
    并且创建启动类等等基本的东西。

  4. 创建企业相关信息的table,存入以下相关信息
    在这里插入图片描述

三、项目设计

1.企业信息模块crud

  1. 根据以上那张表创建对应的实体类。
    由于此项目的持久层使用的是JPA,所以要在实体类做出两个操作
    (1)实体类和表的映射关系@Entity @Table(name = default)
    (2)字段和属性的映射关系(主键和普通用户)@ID @Column

  2. 创建dao层,用SpringData创建一个接口与数据库进行映射连接
    并且继承JPA和序列化接口

在这里插入图片描述

这里别忘了在maven里互相添加依赖

  1. 然后就是写一个测试类,来测试刚才的代码是否有问题
    在这里插入图片描述

  2. 开始写service业务层
    我们要在企业基本信息中完成了业务层操作是

    对于不同员工的审核
    企业信息更新
    删除人员
    根据id查询企业
    查询企业列表

package com.lms.company.service;


import com.lms.common.utils.IdWorker;
import com.lms.company.dao.CompanyDao;
import com.lms.domain.company.Company;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CompanyService {
    @Autowired
    private CompanyDao companydao;

    @Autowired
    private IdWorker idWorker;

    /**
     * 保存企业
     * 1.配置IDworker到工程中   @CompanyApplication
     * 2.在Service中注入IDworker
     * 3.通过idWorker生成id
     * 4.保存企业
     *
     */
    public void add(Company company) {
        //由于传过来的对象可能是没有id的
        String id = idWorker.nextId() + "";
        company.setId(id);
        //默认的状态,0代表审核未通过,1代表通过
        company.setAuditState("0");//0未审核,1已审核
        company.setState(1);//0未激活  1已激活
        companydao.save(company);
    }

    /**
     * 更新企业
     * 1.参数:Company
     * 2.根据先查在更新
     * 3.设置修改的属性
     * 4.调用dao完成更新
     */
    public void update(Company company) {
        Company temp = companydao.findById(company.getId()).get();
        temp.setName(company.getName());
        temp.setCompanyPhone(company.getCompanyPhone());
        companydao.save(temp);
    }


    /**
     * 删除企业
     */
    public void deleteById(String id) {
        companydao.deleteById(id);
    }


    /**
     * 根据id查询企业
     */

    public Company findById(String id) {
        return companydao.findById(id).get();
    }


    /**
     * 查询企业列表
     */
    public List<Company> findAll() {
        return companydao.findAll();
    }
}

  1. 开始写企业信息控制层
    要注意结构,一般控制层都是首先调用Service的

RestController:专门用来返回各种数据格式用的,一般来说都是json,这一个注解相当于在@Controller的基础上又在特殊的方法上标记了@ResponseBody达到的效果。
Controller:一般只用来返回到指定页面,会在return后面返回的东西自动配合视图解析器,加上html后缀返回到html界面,要是想像@RestController一样返回数据,就要加上·@ResposeBody才能实现

由于我们要通过控制层和前端进行交互,后端必然要返回一个数据的,那么这个数据到底要返回什么,不能是随便定义的,而是根据API文档。匹配请求地址,请求方式,请求数据。

package com.lms.company.controller;

import com.lms.common.entity.Result;
import com.lms.common.entity.ResultCode;
import com.lms.company.service.CompanyService;
import com.lms.domain.company.Company;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value = "/company")
public class CompanyController {

    @Autowired
    private CompanyService companyService;

    /**
     * 保存企业
     */
    @RequestMapping(value = "",method = RequestMethod.POST)
    public Result save(@RequestBody Company company) {//用RequestBody将请求的json封装成为对象
        //业务操作
        companyService.add(company);
        return new Result(ResultCode.SUCCESS);
    }

    /**
     * 根据ID更新企业
     * 1.方法
     * 2.请求参数
     * 3.相应
     */
    @RequestMapping(value = "/{id}",method = RequestMethod.PUT)//更新就是put
    public Result update(@PathVariable(value = "id") String id,@RequestBody Company company) {
        company.setId(id);
        companyService.update(company);
        return new Result(ResultCode.SUCCESS);
    }


    /**
     * 根据ID删除企业
     */
    @RequestMapping(value = "/{id}",method = RequestMethod.DELETE)
    public Result delete(@PathVariable(value = "id") String id){
        companyService.deleteById(id);
        return new Result(ResultCode.SUCCESS);
    }

    /**
     * 根据ID查询企业
     */
    @RequestMapping(value = "/{id}",method = RequestMethod.GET)
    public Result findById(@PathVariable(value = "id") String id) {
        Company company = companyService.findById(id);
        Result result = new Result(ResultCode.SUCCESS);
        result.setData(company);
        return result;
    }

    /**
     * 查询全部企业列表
     */
    @RequestMapping(value = "",method = RequestMethod.GET)
    public Result findAll() {
        List<Company> all = companyService.findAll();
        Result result = new Result(ResultCode.SUCCESS);
        result.setData(all);
        return result;
    }

}

到这里就把基本的写完了。

然后发一个get请求到对应域名
在这里插入图片描述
请求地址成功。

基于SpringBoot2.x+Vue2的SaaS-HRM项目(二)

Logo

前往低代码交流专区

更多推荐