文件系统的实现描述
技术栈运用
后端技术栈 springboot + mybatis
数据库 mysql 5.7
前端 vue cli3.0 (axios、element ui)
分布式文件存储系统 FastDFS
功能实现
前台
前台展示用户上传的经过审核之后的文件相关信息,通过下拉框确定搜索的条件,进行相关内容的模糊查询,根据定位的相关信息,可以预览查看文件相关的详细信息,以及进行附件的下载操作(下载会判断五文件的属性,是否为非公开文件,公开的可以直接下载,反之需要进行登录认证操作,并记录日志)
- 多维度条件搜索(下拉框实现)
- 页面跳转详情预览
- 预览文件
- 文件下载
后台
后台分为六个板块:
- 用户管理:新增用户(校验用户昵称是否系统重复),维护用户的登录名称,登录密码,以及真实名称,部门信息,可以删除用户,修改用户密码,(会校验用户的旧密码,进行新密码的修改)
- 文档管理:新增文档信息(包括上传附件),详情查看(预览附件信息),信息修改,管理端可以对用户上传的文件进行(审核、下线)操作,用户端文档信息上传(区分不同用户只能看到自己上传的文件)
- 操作日志:记录前台用户下载附件的操作信息
- 文件类型、标准管理:基本的增删改查操作
- 部门信息:该部分通过树形结构,可以维护三级部门信息,删除操作会校验部门的引用信息,以及下级部门引用,控制上级部门的删除操作
- 统计信息管理:该功能为了根据文件类型、文件标准两个维度去统计用户上传的文件数量
- 用户管理模板
- 文档管理
- 操作日志
- 部门管理
- 标准等级管理
- 标准层级管理
- 数据统计管理
核心功能代码
部门管理
package com.core.doc.controller.dept;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.core.doc.DTO.DeptInfoToReg;
import com.core.doc.DTO.DeptShowInfo;
import com.core.doc.entity.DeptInfo;
import com.core.doc.entity.Login;
import com.core.doc.entity.UserInfo;
import com.core.doc.mapper.DeptInfoMapper;
import com.core.doc.mapper.LoginMapper;
import com.core.doc.mapper.UserInfoMapper;
import com.core.doc.response.Result;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.stream.Collectors;
@RestController
@RequestMapping("/dept")
public class DeptContorller {
@Autowired
DeptInfoMapper deptInfoMapper;
@Autowired
UserInfoMapper usermapper;
@ApiOperation(value = "增加部门信息")
@PostMapping("/add")
public Result getDetail(@RequestBody DeptInfo deptInfo){
int insert = deptInfoMapper.insert(deptInfo);
System.out.println(deptInfo.getDeptid());
if(insert > 0){
return Result.ok();
}
return Result.error();
}
@ApiOperation(value = "删除部门信息")
@PostMapping("/del")
public Result del(Integer id){
QueryWrapper<UserInfo> userQuery = new QueryWrapper<>();
userQuery.eq("deptId",id);
Integer check = usermapper.selectCount(userQuery);
if(check > 0){
return Result.error();
}
QueryWrapper<DeptInfo> wrapper = new QueryWrapper<>();;
wrapper.eq("parent",id);
int count = 0;
List<DeptInfo> list = deptInfoMapper.selectList(wrapper);
System.out.println(list);
if(list != null && list.size() >0){
Set<Integer> set = list.stream().map(x -> x.getDeptid()).collect(Collectors.toSet());
Map<String, Set<Integer>> map = new HashMap<>();
map.put("parent",set);
wrapper.or()
.in("parent",set)
.or()
.eq("deptId",id);
List<DeptInfo> deptInfos = deptInfoMapper.selectList(wrapper);
Set<Integer> deptscollect = deptInfos.stream().map(x -> x.getDeptid()).collect(Collectors.toSet());
userQuery.or().in("deptId",deptscollect);
check = usermapper.selectCount(userQuery);
if(check > 0){
return Result.error();
}
count = deptInfoMapper.delete(wrapper);
}else {
QueryWrapper<DeptInfo> newwrapper = new QueryWrapper<>();
newwrapper.eq("deptId",id);
count = deptInfoMapper.delete(newwrapper);
}
if(count > 0){
return Result.ok();
}
return Result.error();
}
@ApiOperation(value = "查询部门信息")
@PostMapping("/detail")
public Result getDetail(Integer id){
DeptInfo deptInfo = deptInfoMapper.selectByPrimaryKey(id);
return Result.ok().data("msg",deptInfo);
}
@ApiOperation(value = "修改部门信息")
@PostMapping("/updata")
public Result updatainfo(@RequestBody DeptInfo deptInfo){
int i = deptInfoMapper.updateById(deptInfo);
if (i > 0){
return Result.ok().data("msg",deptInfo);
}else {
return Result.error();
}
}
@ApiOperation(value = "获取所有的部门信息")
@PostMapping("/info")
public Result getAllDeptInfo(){
List<DeptInfo> deptInfos = deptInfoMapper.selectList(null);
// level_id : parent_id
Map<Integer,Integer> allmap = transform(deptInfos);
List<DeptShowInfo> level1 = new ArrayList<>();
List<DeptShowInfo> level2 = new ArrayList<>();
for (DeptInfo info : deptInfos) {
DeptShowInfo resData = new DeptShowInfo();
resData.setEdit(false);
resData.setId(info.getDeptid());
resData.setDeptid(info.getDeptid());
resData.setLabel(info.getDeptname());
if(info.getParent() == 0){
level1.add(resData);
}else {
level2.add(resData);
}
}
DeptShowInfo[] deptShowInfos = new DeptShowInfo[level1.size()];
Map<Integer,DeptShowInfo> lis = transtoMap(level2);
Map<Integer,DeptShowInfo> temp1map = transform1(level1);
Map<Integer,DeptShowInfo> temp2map = transform1(level2);
for (DeptShowInfo info : level2) {
Integer parentid = allmap.get(info.getId());
if (temp1map.get(parentid) !=null){
if(temp1map.get(parentid).getChildren() ==null){
List<DeptShowInfo> infos = new ArrayList<>();
infos.add(info);
temp1map.get(parentid).setChildren(infos);
}else {
temp1map.get(parentid).getChildren().add(info);
}
}
if (temp2map.get(parentid) !=null){
if(temp2map.get(parentid).getChildren() ==null){
List<DeptShowInfo> infos = new ArrayList<>();
infos.add(info);
temp2map.get(parentid).setChildren(infos);
}else {
temp2map.get(parentid).getChildren().add(info);
}
}
}
return Result.ok().data("msg",level1.toArray());
}
private Map<Integer, DeptShowInfo> transtoMap(List<DeptShowInfo> level2) {
Map<Integer, DeptShowInfo> map = new HashMap<>();
for (DeptShowInfo info : level2) {
map.put(info.getId(),info);
}
return map;
}
private Map<Integer, Integer> transform(List<DeptInfo> deptInfos) {
Map<Integer,Integer> map = new HashMap<>();
for (DeptInfo info : deptInfos) {
map.put(info.getDeptid(),info.getParent());
}
return map;
}
private Map<Integer, DeptShowInfo> transform1(List<DeptShowInfo> deptInfos) {
Map<Integer,DeptShowInfo> map = new HashMap<>();
for (DeptShowInfo info : deptInfos) {
map.put(info.getId(),info);
}
return map;
}
@ApiOperation(value = "获取部门的信息用于用户的信息注册")
@PostMapping("/deptinfotoregis")
public Result getAllDeptInfoToRegist(){
List<DeptInfo> deptInfos = deptInfoMapper.selectList(null);
List<DeptInfoToReg> regs = new ArrayList<>();
for (DeptInfo info : deptInfos) {
regs.add(new DeptInfoToReg(info.getDeptid(), info.getDeptname()));
}
return Result.ok().data("msg",regs);
}
}
统计数据
package com.core.doc.project;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.core.doc.entity.FileInfo;
import com.core.doc.entity.FileLevel;
import com.core.doc.entity.FileType;
import com.core.doc.mapper.FileInfoMapper;
import com.core.doc.mapper.FileLevelMapper;
import com.core.doc.mapper.FileTypeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
//import org.springframework.util.ObjectUtils;
@RestController
@RequestMapping("/query")
public class QueryController {
@Autowired
FileLevelMapper fileLevelMapper;
@Autowired
FileTypeMapper fileTypeMapper;
@Autowired
FileInfoMapper fileInfoMapper;
public static List<FTobj> toA() {
FTobj l1 = new FTobj(1, "ZSA");
FTobj l2 = new FTobj(2, "LSA");
FTobj l3 = new FTobj(3, "WWA");
FTobj l4 = new FTobj(4, "ZZA");
List<FTobj> list = new LinkedList<>();
list.add(l1);
list.add(l2);
list.add(l3);
list.add(l4);
return list;
}
public static List<FTobj> toB() {
FTobj l1 = new FTobj(11, "ZSB");
FTobj l2 = new FTobj(22, "LSB");
FTobj l3 = new FTobj(33, "WWB");
FTobj l4 = new FTobj(44, "ZZB");
List<FTobj> list = new LinkedList<>();
list.add(l1);
list.add(l2);
list.add(l3);
list.add(l4);
return list;
}
public List<ResutlData> toData(Map<String, Set<String>> map) {
for (Map.Entry<String, Set<String>> entry : map.entrySet()) {
for (String s : entry.getValue()) {
// System.out.println(entry.getKey() + ":" + s);
}
}
List<ResutlData> resutlData = new LinkedList<>();
List<FileInfo> list = fileInfoMapper.selectList(null);
// Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(FileInfo::getFiletypeid, FileInfo::getFilestandardid));
HashMap<Integer, Map<Integer, Integer>> listHashMap = new LinkedHashMap<>();
for (FileInfo info : list) {
Map<Integer, Integer> mapList = listHashMap.get(info.getFiletypeid());
if(mapList == null){
HashMap<Integer, Integer> map1 = new HashMap<>();
map1.put(info.getFilestandardid(),1);
listHashMap.put(info.getFiletypeid(),map1);
}else {
Integer integer = mapList.get(info.getFilestandardid());
if (integer == null){
mapList.put(info.getFilestandardid(),1);
}
else {
Integer count = mapList.get(info.getFilestandardid());
mapList.put(info.getFilestandardid(),count + 1);
}
}
}
// System.out.println();
for (Map.Entry<Integer, Map<Integer, Integer>> entry : listHashMap.entrySet()) {
for (Map.Entry<Integer, Integer> integerEntry : entry.getValue().entrySet()) {
resutlData.add(new ResutlData(entry.getKey(), integerEntry.getKey(), integerEntry.getValue()));
}
}
/* for (FileInfo info : list) {
resutlData.add(new ResutlData(info.getFiletypeid(), info.getFilestandardid(), 3));
}*/
// System.out.println(resutlData);
return resutlData;
}
@RequestMapping("/info")
public List<ShowObj> queryMethod() {
Map<String, Set<String>> map = new HashMap<>();
QueryWrapper<FileType> fileTypeQueryWrapper = new QueryWrapper<>();
fileTypeQueryWrapper.orderByAsc("filetypeid");
QueryWrapper<FileLevel> FileLevelQueryWrapper = new QueryWrapper<>();
FileLevelQueryWrapper.orderByAsc("filelevelid");
List<FileType> obja = fileTypeMapper.selectList(fileTypeQueryWrapper);
List<FileLevel> objb = fileLevelMapper.selectList(FileLevelQueryWrapper);
// List<FTobj> obja = toA();
// List<FTobj> objb = toB();
// 使用示例
Map<Long, String> collectA = obja.stream().collect(Collectors.toMap(FileType::getFiletypeid, FileType::getFiletypename));
Map<Integer, String> collectB = objb.stream().collect(Collectors.toMap(FileLevel::getFilelevelid, FileLevel::getFilelevelname));
// System.out.println(collectA);
Set<String> collect = objb.stream().map(x -> x.getFilelevelname()).collect(Collectors.toSet());
for (FileType a : obja) {
map.put(a.getFiletypename(), collect);
}
List<ResutlData> resutlData = toData(map);
Map<String, ShowObj> tempmap = null;
for (ResutlData data : resutlData) {
String s1 = collectA.get(data.getNum1().longValue());
// System.out.println("+==="+s1);
String s2 = collectB.get(data.getNum2());
Integer coun = data.getCoun();
List<FileTypeDTO> fillist = null;
if (tempmap == null) {
tempmap = new HashMap<>();
fillist = new ArrayList<>();
FileTypeDTO dto = new FileTypeDTO(s2, coun);
fillist.add(dto);
tempmap.put(s1, new ShowObj(s1, fillist));
} else {
ShowObj showObj = tempmap.get(s1);
if (showObj != null) {
List<FileTypeDTO> count = showObj.getCount();
if (count != null && count.size() > 0) {
FileTypeDTO dto = new FileTypeDTO(s2, coun);
count.add(dto);
}
} else {
fillist = new ArrayList<>();
FileTypeDTO dto = new FileTypeDTO(s2, coun);
fillist.add(dto);
tempmap.put(s1, new ShowObj(s1, fillist));
}
}
}
// 去填充所有的结果集
Set<String> tempSetA = collectA.entrySet().stream().map(x -> x.getValue()).collect(Collectors.toSet());
Set<String> tempSetB = collectB.entrySet().stream().map(x -> x.getValue()).collect(Collectors.toSet());
// System.out.println("========");
// System.out.println(tempSetB);
for (String num1 : tempSetA) {
List<FileTypeDTO> fillist = null;
ShowObj showObj = tempmap.get(num1);
if (showObj == null) {
fillist = new ArrayList<>();
for (String num2 : tempSetB) {
FileTypeDTO dto = new FileTypeDTO(num2, 0);
fillist.add(dto);
}
tempmap.put(num1, new ShowObj(num1, fillist));
}else {
fillist = showObj.getCount();
Set<String> set = fillist.stream().map(x -> x.getStandardtype()).collect(Collectors.toSet());
for (String s : tempSetB) {
boolean flag = false;
for (String s1 : set) {
if(s1.equals(s)){
flag = true;
}
}
if(!flag){
FileTypeDTO dto = new FileTypeDTO(s, 0);
fillist.add(dto);
}
}
}
}
Set<ShowObj> collect1 = tempmap.entrySet().stream().map(x -> x.getValue()).collect(Collectors.toSet());
System.out.println(collect1);
System.out.println("=====");
System.out.println(tempSetA);
System.out.println(tempSetB);
// 排序
// Map<String, ShowObj> resmap = new LinkedHashMap<>();
LinkedList<ShowObj> list = new LinkedList<>();
for (String key1 : tempSetA) {
List<FileTypeDTO> newlist = new LinkedList<>();
for (String key2 : tempSetB) {
List<FileTypeDTO> templist = tempmap.get(key1).getCount();
for (FileTypeDTO dto : templist) {
if (dto.getStandardtype().equals(key2)){
FileTypeDTO fileTypeDTO = new FileTypeDTO(key2, dto.getCount());
newlist.add(fileTypeDTO);
}
}
}
list.add(new ShowObj(key1,newlist));
}
return list;
}
}
相关功能实现
Vue+Springboot实现数据表格合并列(附前后端代码实现)
记录springboot+vue+fastdfs实现简易的文件(上传、下载、删除、预览)操作
源码下载:GIT