基于SpringBoot2.x+Vue2的SaaS-HRM项目(一)
文章目录一、项目介绍1.项目简介2.涉及功能及技术3.SaaS概述4.需求分析5.系统设计5.1开发方式5.2 技术架构6.开发环境二、项目初步设计一、项目介绍1.项目简介此系列博客将会介绍从0开始,实现前后端分离项目,使用微服务架构的方式,开发出一套高校实验室人员管理系统,并且将整个开发流程记录下来,对关键的部分进行详细说明,在最后的一次系列文章后,会在github上讲此项目进行开源,方便...
一、项目介绍
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插件
二、项目初步设计
-
首先创建Maven工程父Module SaaS-LMS,然后导入pom依赖
-
再创建子Module,公共子模块lms-common,并且创建实体类。
实体类功能
- PageResult
针对分页时候,返回一个json格式的数据,包含数据相应的具体信息,响应码,状态码,响应是否成功等等 - Result
同上,但不针对于分页,且没有数据信息 - ResultCode
一个枚举,定义出不同相应状态和对应的操作码
- 然后是设计分布式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成趋势自增,方便排序,解决数据库性能。
-
设计分布式id生成之后,设计一个模块存放实验室实体类,再设计一个实验室业务模块。
-
并且在业务模块导入mysql依赖,jpa依赖
实体模块导入jpa依赖 -
然后在业务模块进行相关的sql配置。
并且创建启动类等等基本的东西。 -
创建企业相关信息的table,存入以下相关信息
三、项目设计
1.企业信息模块crud
-
根据以上那张表创建对应的实体类。
由于此项目的持久层使用的是JPA,所以要在实体类做出两个操作
(1)实体类和表的映射关系@Entity @Table(name = default)
(2)字段和属性的映射关系(主键和普通用户)@ID @Column
-
创建dao层,用SpringData创建一个接口与数据库进行映射连接
并且继承JPA和序列化接口
这里别忘了在maven里互相添加依赖
-
然后就是写一个测试类,来测试刚才的代码是否有问题
-
开始写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();
}
}
- 开始写企业信息控制层
要注意结构,一般控制层都是首先调用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请求到对应域名
请求地址成功。
更多推荐
所有评论(0)