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

一、项目介绍

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项目(二)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SaaS(Software as a Service)是近些年来软件产业的一次创新性进步。随着Internet的迅猛发展,将软件作为一种服务形式提供给客户的需求逐渐增加。而“软件即服务”(Software as a Service)这个新模式的出现正是顺应了这个需求。 SaaS不同于传统的按需定制软件,要能够满足不同用户,不同地域,不同业务规则,对服务的适应性,扩展性,灵活性要求非常高,从而在技术上也有很高的要求。SaaS这一先进服务模式的应用,必须有众多合格的技术过硬的软件服务供应商作支撑。特别是SaaS这种单实例多租赁的模式,对ISV来说是一个很大的挑战。 作为微软最新的SaaS应用案例,Crab用到了大部分微软一些最新的技术,如:用 Asp.net ajax 1.0、web parts、themes对页面View进行优化,用WCF(Windows Communication Foundation)对Services进行封装,用WF(Windows Workflow Foundation)实现业务流程中的控制流,用SQlServer 2005实现单实例多租赁的数据模型,使用ADAM与ASP.NET2.0membership来实现用户和角色的安全管理等等。这些技术的优势与特点都在Crab这个案例里充分的体现出来,对于刚接触asp.net3.0的程序员来说,Crab甚至可以作为微软新技术的”教科书”和”入门指南”。 而微软作为全球最大的软件公司,也将SaaS作为其下一步的战略重点,同时也是SaaS在中国的主要推动者,为SaaS在中国的发展作了大量工作。Crab 这个案例应用正是在这种形势下应运而生的。Crab是由微软(中国)平台与合作部,微软总部解决方案架构师组,新宇软件以及苏州SaaS孵化器四方合作,共同完成的中国首个SaaS案例应用,也是继LitwareHR之后全球第二个面向ISV 并可以体现SaaS 主要技术架构要点的案例应用。可以说Crab是中国SaaS软件的一个里程碑,希望通过Crab这个案例程序把微软SaaS架构和开发的有关知识阐述出来,提供给广大的架构师和开发人员进行学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值