基于springboot+vue+fastdfs的文件简易管理系统

2023-10-27

文件系统的实现描述

技术栈运用

后端技术栈 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于springboot+vue+fastdfs的文件简易管理系统 的相关文章

随机推荐

  • 接口测试之:Postman工具进阶教程。

    Postman进阶教程 1 引言 2 Postman详细教程 2 1 选择Postman的理由 2 2 安装 2 3 工作区功能介绍 2 4 接口类型请求 2 4 1 Get请求处理 2 4 2 Post请求处理 2 4 3 请求参数化 2
  • ElementUI-----UI框架

    ElementUI是由饿了么团队开源的UI框架 并于Vue完美契合 项目地址 https github com ElemeFE element 项目文档 Element The world s most popular Vue UI fra
  • 更改 VS Code C++ 默认代码风格为 Google C++ Style

    更改 VS Code C 默认代码风格为 Google C Style 安装插件 Clang Format C C 谷歌规范 进入设置 结果 自己规范 由于谷歌是缩进2个空格 括号不换行 但我喜欢缩进4个空格 括号不换行 只能自定义设置了
  • yolov7训练

    一 制作数据集 使用LabelImage进行标注 LabelImage的下载安装方法 百度上用的比较多 这里就不赘述了 简单介绍一下LabelImage的标注方法 制作自己的数据集 1 下载LabelImage 下载LabelImage源码
  • 用python来写Excel 的vlookup

    首先先介绍一下vlookup的基本用法 用vlookup 的前提 有一份确定了是标准的表 另一份是需要校验的 因为数量比较多 就需要用到vlookup的这个函数 比如校验名字和身份证是否对应 在表格或数值数组的首列查找指定的数值 并由此返回
  • 金蝶管易云 X Hologres:新一代全渠道电商ERP最佳实践

    业务简介 金蝶管易云是金蝶集团旗下专注提供电商企业管理软件服务的子公司 成立于2008年 是国内最早的电商ERP服务商之一 目前已与300 主流电商平台建有合作关系 以企业数据为驱动 深度融合线上线下数据 为超过11万家客户提供实现业务 财
  • Dubbo负载均衡策略实现

    一 dubbo版本说明 基于dubbo版本2 6 2讲解 二 负载均衡的接口关系 SPI RandomLoadBalance NAME public interface LoadBalance Adaptive loadbalance
  • CSS——属性选择器

    标签和属性结合
  • springboot+shiro+swagger+redis+vue+element完成权限系统

    1 回顾 1 Vue通过脚手架创建Vue工程 1 组件 网页 gt 组件 父组件 可以引用另一个组件 子组件 父组件怎么传参给子组件 2 路由 1 路由跳转
  • jdbc连接字符串

    MySQL String Driver com mysql jdbc Driver 驱动程序String URL jdbc mysql localhost 3306 db name 连接的URL db name为数据库名String Use
  • LeetCode 高级 - 最长连续序列

    最长连续序列 给定一个未排序的整数数组 找出最长连续序列的长度 要求算法的时间复杂度为 O n 示例 输入 100 4 200 1 3 2 输出 4 解释 最长连续序列是 1 2 3 4 它的长度为 4 分析 由于O n 时间复杂度的限制
  • Linux下9种优秀的代码比对工具推荐

    大家好 我是良许 在我们编写代码的时候 我们经常需要知道两个文件之间 或者同一个文件不同版本之间有什么差异性 在 Windows 下有个很强大的工具叫作 BeyondCompare 那在 Linux 下需要用到什么工具呢 本文介绍 9 种
  • 常见的下载工具有哪些?BT下载软件哪个好

    BT下载软件有哪些 说到下载软件 您又了解多少 互联网技术在不断飞速发展 我们日常观看电影除了在线观看外 更习惯用高科技的下载技术来下载电影 这就离不开我们常用的一些下载工具 比如 迅雷 QQ旋风 等 那么 究竟如何才能选择一套适合自己的B
  • 各区块链底层数据存储分析

    互联网的中心化发展模式是传统网络安全的的软肋 区块链作为一种去中心化 集体维护 不可篡改的新兴技术 是对互联网底层架构的革新 是对当今生产力和生产关系的变革 区块链也被誉为是继蒸汽机 电力 信息和互联网科技之后 目前最有潜力触发第五轮颠覆性
  • 数据结构——在一个有序表中,现在要插入一个元素,要求在插入后不改变表的有序性

    题目 在一个有序表中 现在要插入一个元素 要求在插入后不改变表的有序性 要求采用一种时间复杂度较低的算法 所采用的的数据结构不限 思想 本题有多种做法 但是最少的时间复杂度是申请一个新的顺序表 一次比较后插入 时间复杂度为O N 这是典型的
  • docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:9090: bind: An attem

    Windows10下使用docker部署minio时报错 命令 docker run p 9090 9000 name minio v mydata minio data data v mydata minio config root mi
  • 基于大数据框架的协同过滤算法餐饮推荐系统【Update2023-6-25】

    开始之前 设计思路 首先这位作者的推荐系统给了我很大的构思启发 Github地址 https github com share23 Food Recommender 他的系统采用实时大数据技术组件 具体有Spark Streaming HD
  • lvm 扩容和缩减

    lvm 扩容和缩减 1 LVM简介 LVM是逻辑卷管理 Logical Volume Manager 的简称 它是Linux环境下对磁盘分区进行管理的一种机制 LVM是建立在硬盘和分区之上的逻辑层 来提高磁盘分区管理的灵活性 LVM的工作原
  • 脚本关

    第9题 提交验证码后发现 所以用burpsuite改脚本 把电话号码改成他所要求的在扔回去 就能出现key
  • 基于springboot+vue+fastdfs的文件简易管理系统

    文件系统的实现描述 技术栈运用 后端技术栈 springboot mybatis 数据库 mysql 5 7 前端 vue cli3 0 axios element ui 分布式文件存储系统 FastDFS 功能实现 前台 前台展示用户上传