学习如何对组织架构的管理之搬到线上管理的过程《前端-后端-数据库》

108 阅读4分钟

学习如何对组织架构的管理

简介

最近讨论到一个公司的组织架构的话题,一个大型公司对组织架构的规划是非常重视的,那么在互联网时代很多工作都搬到了线上来完成,那么我在想怎么把组织管理这个需求搬到线上管理呢?

经过了一段时间的学习,先了解什么是组织架构,一个组织架构的划分实际转为数据的时候应该是很么样的结构。

我们可以先看一下一个简单的组织架构图先了解一下。

结构非常清晰,从上往下每个层级会有那些部门都很清楚,对应到数据结构上,就是一个比较经典的树结构了。那么对于树结构在代码中的思维都是循环递归去处理,可是在数据库的存储中来说,没有存储树结构的方式,可以用一个字段来关联每个层级之间的关系。

1、设计数据库表

简介

我使用的是 MySQL 数据库,看上面的组织结构图可以大致有:

  • 组织结构名称
  • 组织结构编码
  • 组织结构的描述
  • 父结构的id

那么我们在数据库表设计上,增加了:

  • 每条数据的主键id
  • 每条数据的创建时间
  • 每条数据的更新时间
  • 每条数据的删除标识

数据库表就算建好了,接下来就开始写接口来对数据进行增删改查。

2、编写CRUD接口

简介

我使用的 Java 来写数据库的 CRUD 接口,用的是 springboot 2.7,搭配 mybatis-plus 来操作数据库。

2.1、Java 项目准备

a、项目依赖:

<dependencies>
  <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>

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

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

  <!-- mybatis-plus -->
  <dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.5.0</version>
  </dependency>
  <!-- mysql -->
  <dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
  </dependency>
  <!-- lombok -->
  <dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.10</version>
  </dependency>
 </dependencies>

b、项目配置:

server.port=8088
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.password=123456
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/tree_test?characterEncoding=utf-8&useSSL=false&serverTimezone=UTC

c、对应数据库表结构的类 Organize

package com.xx.springbootWebSocket.model;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

import java.util.Date;

@Data
public class Organize {
    @TableId(type= IdType.ASSIGN_UUID)
    private String id;
    private String name;
    private String code;
    private String descInfo;
    private String parentId;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    private int isDelete;
}

d、对应查询参数的类 OrganizeParmaOV

package com.xx.springbootWebSocket.model;

import lombok.Data;

@Data
public class OrganizeParmaOV {
    private String id;
    private String name;
    private String code;
    private String desc;
    private String parentId;
}

e、查询组织架构的树结构类 OrganizeAllList

package com.xx.springbootWebSocket.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

@Data
public class OrganizeAllList {
    private String id;
    private String name;
    private String code;
    private String desc;
    private String parentId;
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    private Object children;
}
2.2、编写新增接口
// Controller
// 添加组织架构
@PostMapping("/addOrganize")
public ResponseVO addOrganize(@RequestBody OrganizeParmaOV organizeParmaOV){
    return organizeService.addOrganize(organizeParmaOV);
}

// Services
// 添加
public ResponseVO addOrganize( OrganizeParmaOV paramOrganize){
  // 实例化组织架构类
  Organize organize = new Organize();
  organize.setIsDelete(0);
  organize.setName(paramOrganize.getName());
  organize.setCode(paramOrganize.getCode());
  organize.setDescInfo(paramOrganize.getDesc());
  organize.setParentId(paramOrganize.getParentId() != null && !Objects.equals(paramOrganize.getParentId(), "") ? paramOrganize.getParentId() : "-1");

  // 添加到数据库
  int insert = organizeMapper.insert(organize);

  // 实例化返回类
  ResponseVO responseVO = getResponse(true, "添加成功", 200);
  if( insert != 1 ){
      responseVO.setMessage("添加失败");
      responseVO.setData(false);
      responseVO.setStatus(1);
  }
  return responseVO;
}

前端调用:

save() {
  const data = {
    ...this.formData,
  };
  fetch( `http://localhost:8088/addOrganize`,
    {
      method: "post",
      headers: {
        "Content-Type""application/json",
      },
      body: JSON.stringify(data),
    }
  )
    .then((response) => {
      return response.json();
    })
    .then((res) => {
      if (res.data) {
        this.$message({
          type: "success",
          message: res.message || "操作成功",
        });
        this.getList();
        this.handleClose();
      }
    });
},
2.3、编写编辑接口
// Controller
// 编辑组织架构
@PutMapping("/editOrganize")
public ResponseVO editOrganize(@RequestBody OrganizeParmaOV organizeParmaOV){
    return organizeService.editOrganize(organizeParmaOV);
}

// Services
// 编辑
public ResponseVO editOrganize( OrganizeParmaOV paramOrganize){
    // 使用默认的wrapper
    UpdateWrapper<OrganizeorganizeUpdateWrapper = new UpdateWrapper<>();
    // 指定数据
    organizeUpdateWrapper.eq("id", paramOrganize.getId());
    // 修改字段以及值
    organizeUpdateWrapper.set("name", paramOrganize.getName());
    organizeUpdateWrapper.set("code", paramOrganize.getCode());
    organizeUpdateWrapper.set("desc_info", paramOrganize.getDesc());

    // 添加到数据库
    int update = organizeMapper.update(null, organizeUpdateWrapper);

    // 实例化返回类
    ResponseVO responseVO = getResponse(true, "更新成功"200);
    if( update != 1 ){
        responseVO.setMessage("更新失败");
        responseVO.setData(false);
        responseVO.setStatus(1);
    }
    return responseVO;
}

前端调用:

editItme() {
  const data = {
    ...this.formData,
  };
  fetch( `http://localhost:8088/editOrganize`,
    {
      method: "put",
      headers: {
        "Content-Type""application/json",
      },
      body: JSON.stringify(data),
    }
  )
    .then((response) => {
      return response.json();
    })
    .then((res) => {
      if (res.data) {
        this.$message({
          type: "success",
          message: res.message || "操作成功",
        });
        this.getList();
        this.handleClose();
      }
    });
},
2.4、编写删除接口
// Controller
// 删除组织架构
@DeleteMapping("/deleteOrganize")
public ResponseVO deleteOrganize(String id){
    if(id == null){
        ResponseVO responseVO = new ResponseVO();
        responseVO.setData(false);
        responseVO.setStatus(1);
        responseVO.setMessage("Required request parameter id");
        return responseVO;
    }
    return organizeService.deleteOrganize(id);
}

// Services
 // 删除
public ResponseVO deleteOrganize(String id){
    // 实例化返回类
    ResponseVO responseVO = getResponse(false"id params is required"1);
    if( id == null ){
        return responseVO;
    }
    HashMap<String, Object> stringObjectHashMap = new HashMap<>();
    stringObjectHashMap.put("parent_id", id);
    List<Organize> organizes = organizeMapper.selectByMap(stringObjectHashMap);

    if( organizes.size() > 0 ){
        responseVO.setMessage("当前项还存在下级,请删除所有下级再删除。");
        return responseVO;
    }

    int i = organizeMapper.deleteById(id);

    if( i != 1 ){
        responseVO.setMessage("删除失败");
        responseVO.setData(false);
        responseVO.setStatus(1);
    }else{
        responseVO.setMessage("删除成功");
        responseVO.setData(true);
        responseVO.setStatus(200);
    }
    return responseVO;
}

前端调用:

editItem(item) {
  fetch(`http://localhost:8088/deleteOrganize?id=${item.id}`, {
    method"delete",
  })
    .then((response) => {
      return response.json();
    })
    .then((res) => {
      if (res.data) {
        this.$message({
          type"success",
          message"删除成功!",
        });
        this.getList();
      } else {
        this.$message.error(res.message);
      }
    });
},
2.5、编写获取全部列表接口
// Controller
// 获取全部
@GetMapping("/getAll")
public ResponseVO getAl(){
    return organizeService.allOrganize();
}

// Services
// 查询所有
public ResponseVO allOrganize(){
    // 实例化返回类
    ResponseVO responseVO = getResponse(true"添加成功"200);
    // 查询所以一级
    HashMap<StringObject> hashMap = new HashMap<StringObject>();
    hashMap.put("parent_id""-1");
    List<Organize> organizes = organizeMapper.selectByMap(hashMap);

    if( organizes.size() == 0 ){
        return getResponse(new Array[] {
        }, "获取成功"200);
    }

    responseVO.setData(getList("-1"));
    return responseVO;
}

public List<OrganizeAllListgetList(String id){
    // 查询所以一级
    HashMap<StringObject> hashMap = new HashMap<StringObject>();
    hashMap.put("parent_id", id);
    List<Organize> organizes = organizeMapper.selectByMap(hashMap);
    if( organizes.size() == 0 ){
        return new ArrayList<>();
    }
    ArrayList<OrganizeAllList> organizeAllLists = new ArrayList<>();

    for(Organize item : organizes  ){
        OrganizeAllList organizeAllList = new OrganizeAllList();
        organizeAllList.setName(item.getName());
        organizeAllList.setCode(item.getCode());
        organizeAllList.setDesc(item.getDescInfo());
        organizeAllList.setParentId(item.getParentId());
        organizeAllList.setId(item.getId());
        organizeAllList.setCreateTime(item.getCreateTime());
        List<OrganizeAllList> list = getList(item.getId());
        organizeAllList.setChildren(list.size() == 0 ? null : list);
        organizeAllLists.add(organizeAllList);
    }
    return organizeAllLists;
}

前端调用:

getList() {
fetch("http://localhost:8088/getAll")
.then((response) => {
  return response.json();
})
.then((res) => {
  this.tableData = res.data || [];
  this.refresh = false;
});
}

结尾

以上就是对组织架构管理搬到线上管理的实现过程啦,还有很多可以优化的地方,第一次写 Java 项目很多不熟悉,写的不够好,各位大佬多多指导。

感谢各位看官耐心看完,前后端源码有感兴趣的朋友可以留言私聊呀。