基于javaweb+mysql的springboot线上网络文件管理系统(java+springboot+html+ssm+maven+mysql)

基于javaweb+mysql的springboot线上网络文件管理系统(java+springboot+html+ssm+maven+mysql)

运行环境

Java≥8、MySQL≥5.7

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

基于javaweb+mysql的SpringBoot线上网络文件管理系统(java+springboot+html+ssm+maven+mysql)

项目介绍

本项目分为前后台,有管理员与用户两种角色;

管理员角色包含以下功能:

管理员登录,管理员主页,权限管理,分类管理,用户管理,文档管理,下载记录,上传记录等功能。 用户角色包含以下功能:

注册账号,登录,系统首页,我的资源查看,编辑资源,我的资料修改,文件上传,密码重置,邮箱信息,密码重置成功等功能。

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 8.0/5.7版本;

6.是否Maven项目:是;

技术栈

HTML+CSS+JavaScript+mysql+Spring+SpringMVC+mybatis+Spring boot

使用说明

  1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中application.yml配置文件中的数据库配置改为自己的配置;

  2. 运行项目,输入http://localhost:8091 登录

    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/signin", method = RequestMethod.GET)
    public String signin() {
        return "/signin";
    }

    @ApiOperation(value = "管理员页面")
    @AuthInterceptor(InterceptorLevel.ADMIN)
    @RequestMapping(value = "/admin", method = RequestMethod.GET)
    public String admin() {
        return "/admin";
    }

    @ApiIgnore
    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    @ResponseBody
    public String test() {
        return "<b>test</b>";
    }
}

/**
 */
public class ControllerUtils {

    private ControllerUtils() {}

    /**
     * 获取一个简单的响应状态
     *
     * @param isSuccess 是否操作成功
     *
     * @return 响应JSON字符串
     */
    public static String getResponse(boolean isSuccess) {
        JSONObject jsonObject = new JSONObject();
        if (isSuccess) {

    /**
     * 资源下载
     *
     * @param response {@link HttpServletResponse}
     */
    @ApiOperation(value = "通过访问路径获取文件资源")
    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/**", method = RequestMethod.GET)
    public void getResource(HttpServletResponse response) throws IOException {
        ControllerUtils.loadResource(response, fileService.getResource(request.getServletPath(), request),
                ValueConsts.FALSE);
    }
}

/**
 */
@Service
public class FileManagerServiceImpl implements IFileManagerService {

    private static Logger logger = Logger.getLogger(FileManagerServiceImpl.class);

    @Override
    public void multiDownload(HttpServletResponse response, String[] items, String destFile) throws IOException {
        File zip = ZipUtil.zip(new File(ValueConsts.USER_DESKTOP + File.separator + destFile), ValueConsts.FALSE,
                FileExecutor.getFiles(items));

/**
 */
public interface IUserService {

    /**
     * 更新用户权限
     *
     * @param id 用户编号
     * @param permission 权限
     *
     * @return 是否更新成功
     */
    boolean updatePermission(int id, int permission);

    /**
     * 重置用户密码
     *
     * @param id 用户编号
     * @param password 密码
     *
     * @return 是否重置成功
     */
    boolean resetPassword(int id, String password);

    /**
     * 更新用户权限
     *
     * @param id 编号
     * @param auths 操作文件的权限集
     *
     * @return 是否更新成功
     */
    boolean updateFileAuth(int id, String auths);


/**
 */
@RestController
@RequestMapping("/common")
@Api(value = "/common", description = "公共接口")
public class CommonController {

    private static Logger logger = LoggerFactory.getLogger(ConfigController.class);

    private final ICommonService commonService;

    private final HttpServletRequest request;

    @Autowired
    private IUserService userService;
    
    private final JSONObject jsonObject;

    @Autowired
    public CommonController(ICommonService commonService, HttpServletRequest request, JSONObject jsonObject) {
        this.commonService = commonService;
        this.request = request;
        this.jsonObject = jsonObject;
    }

    @ApiOperation(value = "获取头像资源")
    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/avatar/{name}", method = RequestMethod.GET)
    public void getAvatar(HttpServletResponse response, @PathVariable("name") String name) throws IOException {
        String path = SettingConfig.getAvatarStoragePath() + ValueConsts.SEPARATOR + name;
        ControllerUtils.loadResource(response, path, ValueConsts.FALSE);
    }
     * @return 是否更新成功
     */
    boolean updateBasicInfoById(int id, String avatar, String realName, String email);

    /**
     * 用过用户名获取用户Id
     *
     * @param usernameOrEmail 用户名或邮箱
     *
     * @return 用户编号
     */
    int getUserId(String usernameOrEmail);
}

/**
 */
public class WebInterceptor implements HandlerInterceptor {

    @Autowired
    UserServiceImpl userService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
            Exception {
        String url = request.getServletPath();
        InterceptorLevel level = InterceptorLevel.NONE;
        if (handler instanceof HandlerMethod) {
            AuthInterceptor interceptor = ((HandlerMethod) handler).getMethodAnnotation(AuthInterceptor.class);
            //注解到类上面的注解,无法直接获取,只能通过扫描
            if (Checker.isNull(interceptor)) {
                for (Class<?> type : StartApplication.controllers) {
    @Override
    public boolean updateAuth(long id, String auth) {
        int[] au = BeanUtils.getAuth(auth);
        return fileDAO.updateAuthById(id, au[0], au[1], au[2], au[3], au[4]);
    }

    @Override
    public BaseAuthRecord getAuth(long id) {
        return fileDAO.getAuth(id);
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor =
            Exception.class)
    public boolean deleteFiles(String ids) {
        if (Checker.isNotEmpty(ids)) {
            String[] id = ids.split(ValueConsts.COMMA_SIGN);
            for (String s : id) {
                long fileId = Formatter.stringToLong(s);
                String localUrl = fileDAO.getLocalUrlById(fileId);
//                FileExecutor.deleteFile(localUrl);
                removeById(fileId);
            }
            return true;
        }
        return false;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 36000, rollbackFor =
            Exception.class)
    public boolean[] updateUrl(int id, String oldLocalUrl, String localUrl, String visitUrl) {
        boolean[] b = new boolean[]{false, false};
        boolean canUpdateLocalUrl = Checker.isExists(oldLocalUrl) && Checker.isNotEmpty(localUrl) && Checker
                .isNotExists(localUrl) && !localUrlExists(localUrl);
        if (canUpdateLocalUrl) {
            FileExecutor.renameTo(oldLocalUrl, localUrl);
            fileDAO.updateLocalUrlById(id, localUrl);
            b[0] = true;
        }
        if (Checker.isNotEmpty(visitUrl) && !visitUrlExists(visitUrl)) {
            fileDAO.updateVisitUrlById(id, visitUrl);
            b[1] = true;
        }

/**
 */
@Service
public class FileManagerServiceImpl implements IFileManagerService {

    private static Logger logger = Logger.getLogger(FileManagerServiceImpl.class);

    @Override
    public void multiDownload(HttpServletResponse response, String[] items, String destFile) throws IOException {
        File zip = ZipUtil.zip(new File(ValueConsts.USER_DESKTOP + File.separator + destFile), ValueConsts.FALSE,
                FileExecutor.getFiles(items));
        if (zip.exists()) {
            response.getOutputStream().write(FileExecutor.readFileToByteArray(zip));
            FileExecutor.deleteFile(zip);
        }
    }

    @Override
    public JSONObject upload(String destination, MultipartFile... files) {
        System.out.println(files.length);
        if (Checker.isNotEmpty(files)) {
            if (Checker.isWindows() && destination.length() < ValueConsts.TWO_INT) {
                destination = "C:";
            }
            for (MultipartFile file : files) {
                if (Checker.isNotNull(file) && !file.isEmpty()) {
                    try {
                        file.transferTo(new File(destination + File.separator + file.getOriginalFilename()));
                    } catch (IOException e) {
                        logger.error(e.getMessage());
                        return getBasicResponse(ValueConsts.FALSE);
                    }

    @ApiOperation(value = "验证验证码是否正确")
    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/{code}/verification", method = RequestMethod.PUT)
    public String verifyCode(@PathVariable("code") String code) {
        boolean isSuccess = Checker.checkNull(code).equals(String.valueOf(request.getSession().getAttribute
                (DefaultValues.CODE_STRING)));
        return ControllerUtils.getResponse(isSuccess);
    }
}

/**
 */
@RestController
@RequestMapping("/config")
@Api(value = "/config", description = "配置文件的相关操作")
    }
}

/**
 */
public interface IFileManagerService {

    /**
     * 下载多个文件
     *
     * @param response {@link HttpServletResponse}
     * @param items 文件集
     * @param destFile 目标文件名
     *
     * @throws IOException 异常
     */
    void multiDownload(HttpServletResponse response, String[] items, String destFile) throws IOException;

    /**
     * 上传文件(暂时还没有实现)
     *
     * @param destination 目标文件
     * @param files {@link MultipartFile}
     *
     * @return {@link JSONObject}
     */
    JSONObject upload(String destination, MultipartFile... files);

    /**
     * 解压文件
     *
     * @param object {@link JSONObject}
     *
     * @return {@link JSONObject}
     */
    JSONObject extract(JSONObject object);
    @AuthInterceptor(InterceptorLevel.SYSTEM)
    @RequestMapping(value = "/rename", method = RequestMethod.POST)
    public String rename(@RequestBody JSONObject json) {
        jsonObject.put("result", fileManagerService.rename(json));
        return jsonObject.toJSONString();
    }

    @AuthInterceptor(InterceptorLevel.SYSTEM)
    @RequestMapping(value = "/list", method = RequestMethod.POST)
    public String list(@RequestBody JSONObject json) {
        jsonObject.put("result", fileManagerService.list(json));
        return jsonObject.toJSONString();
    }
}

/**
 */
public interface IFileService {

    /**
     * 更新文件权限
     *
     * @param id 文件编号
     * @param auth 权限集
     *
     * @return 是否更新成功
     */
    boolean updateAuth(long id, String auth);

    /**
     * 获取文件权限
     *
     * @param id 文件编号
     *
     * @return {@link BaseAuthRecord}
     */
    BaseAuthRecord getAuth(long id);

    /**
     */
    boolean updateFileInfo(long id, User user, String name, String category, String tag, String description);

    /**
     * 删除文件,验证权限
     *
     * @param user 用户对象
     * @param fileId 文件编号
     *
     * @return {@link Boolean}
     */
    boolean removeFile(User user, long fileId);

    /**
     * 获取用户的下载资源
     *
     * @param userId 用户编号
     * @param offset 偏移
     * @param search 搜索
     *
     * @return {@link List}
     */
    List<FileRecord> listUserDownloaded(int userId, int offset, String search);

    /**
     * 获取用户的上传资源
     *
     * @param userId 用户编号
     * @param offset 偏移
     * @param search 搜索
     *
     * @return {@link List}
     */
    List<FileRecord> listUserUploaded(int userId, int offset, String search);

    /**
     * 通过编号删除,不验证权限
     *
     * @param id 编号
     *
     * @return 是否删除成功
     */
    boolean removeById(long id);

    /**
     * 通过访问路径删除
                        : StartApplication.settings.getStringUseEval(ConfigConsts.CUSTOM_LINK_RULE_OF_SETTING), user,
                        name, suffix, category);
                if (fileExists) {
                    removeByLocalUrl(localUrl);
                }
                if (visitUrlExists(visitUrl)) {
                    removeByVisitUrl(visitUrl);
                }
                try {
                    multipartFile.transferTo(new java.io.File(localUrl));
                    logger.info("local url of upload file: " + localUrl);
                    File file = new File(name, suffix, localUrl, visitUrl, WebUtils.scriptFilter(description),
                            WebUtils.scriptFilter(tag), user.getId(), categoryId);
                    int[] auth = SettingConfig.getAuth(ConfigConsts.FILE_DEFAULT_AUTH_OF_SETTING);
                    file.setAuth(auth[0], auth[1], auth[2], auth[3], auth[4]);
                    boolean isSuccess = fileDAO.insertFile(file);
                    if (isSuccess) {
                        long fileId = fileDAO.getIdByLocalUrl(localUrl);
                        if (fileId > 0) {
                            authService.insertDefaultAuth(user.getId(), fileId);
                        }
                    } else {
                        FileExecutor.deleteFile(localUrl);
                    }
                    return isSuccess;
                } catch (Exception e) {
                    FileExecutor.deleteFile(localUrl);
                    logger.error("save file error: " + e.getMessage());
                }
            }
        }
        return false;
    }

    private String getRegularVisitUrl(String customUrl, User user, String fileName, String suffix, Category category) {
        Date date = new Date();
        suffix = suffix.startsWith(".") ? "" : "." + suffix;
        if (Checker.isNotEmpty(customUrl)) {
            try {
                customUrl = URLDecoder.decode(customUrl, "utf-8");
            } catch (UnsupportedEncodingException e) {
                logger.error(e.getMessage());
            }
        }
        if (!customUrl.contains(FILE_NAME) && !customUrl.contains(RANDOM_ID)) {
            customUrl += (customUrl.endsWith("/") ? "" : "/") + fileName;
        }
        customUrl = customUrl.replace(YEAR, DateUtils.getYear(date)).replace(MONTH, DateUtils.getMonth(date)).replace
                (DAY, DateUtils.getDay(date)).replace(AUTHOR, user.getUsername()).replace(FILE_NAME, fileName)
                .replace(CATEGORY_NAME, Checker.checkNull(Checker.isNull(category) ? "uncategorized" : category
     *
     * @param response {@link HttpServletResponse}
     */
    @ApiOperation(value = "通过访问路径获取文件资源")
    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/**", method = RequestMethod.GET)
    public void getResource(HttpServletResponse response) throws IOException {
        ControllerUtils.loadResource(response, fileService.getResource(request.getServletPath(), request),
                ValueConsts.FALSE);
    }
}

/**
 */
@Service
public class FileManagerServiceImpl implements IFileManagerService {

    private static Logger logger = Logger.getLogger(FileManagerServiceImpl.class);

    @Override
    public void multiDownload(HttpServletResponse response, String[] items, String destFile) throws IOException {
        File zip = ZipUtil.zip(new File(ValueConsts.USER_DESKTOP + File.separator + destFile), ValueConsts.FALSE,
                FileExecutor.getFiles(items));
        if (zip.exists()) {
            response.getOutputStream().write(FileExecutor.readFileToByteArray(zip));
            FileExecutor.deleteFile(zip);
        }
    }

    @Override
    @RequestMapping(value = "/admin", method = RequestMethod.GET)
    public String admin() {
        return "/admin";
    }

    @ApiIgnore
    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    @ResponseBody
    public String test() {
        return "<b>test</b>";
    }
}

/**
 */
public class ControllerUtils {

    private ControllerUtils() {}

    /**
     * 获取一个简单的响应状态
     *
     * @param isSuccess 是否操作成功
     *
     * @return 响应JSON字符串
     */
    public static String getResponse(boolean isSuccess) {
     * @param avatar 头像
     * @param realName 真实姓名
     * @param email 邮箱
     *
     * @return 是否更新成功
     */
    boolean updateBasicInfoById(int id, String avatar, String realName, String email);

    /**
     * 用过用户名获取用户Id
     *
     * @param usernameOrEmail 用户名或邮箱
     *
     * @return 用户编号
     */
    int getUserId(String usernameOrEmail);
}

/**
 */
public class WebInterceptor implements HandlerInterceptor {

    @Autowired
    UserServiceImpl userService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws
            Exception {
        String url = request.getServletPath();
        InterceptorLevel level = InterceptorLevel.NONE;
        if (handler instanceof HandlerMethod) {
    BaseAuthRecord getAuth(long id);

    /**
     * 批量删除文件
     *
     * @param ids 所有文件编号
     *
     * @return 是否删除成功
     */
    boolean deleteFiles(String ids);

    /**
     * 更新文件路径
     *
     * @param id 文件编号
     * @param oldLocalUrl 原本地路径
     * @param localUrl 本地路径
     * @param visitUrl 访问路径
     *
     * @return 是否更新成功
     */
    boolean[] updateUrl(int id, String oldLocalUrl, String localUrl, String visitUrl);

    /**
     * 更新文件信息
     *
     * @param id 文件编号
     * @param user 用户对象
     * @param name 文件名
     * @param category 文件分类
     * @param tag 标签
     * @param description 文件描述
     *
     * @return 是否更新成功
     */
    boolean updateFileInfo(long id, User user, String name, String category, String tag, String description);

    /**
     * 删除文件,验证权限
     *
     * @param user 用户对象
     * @param fileId 文件编号
     *
     * @return {@link Boolean}
     */
    boolean removeFile(User user, long fileId);

    /**
     * 获取用户的下载资源
     *
        String name = commonService.uploadAvatar(multipartFile);
        User user = (User) request.getSession().getAttribute(ValueConsts.USER_STRING);
        user.setAvatar("/common/avatar/" + name);
        userService.updateBasicInfoById(user.getId(), user.getAvatar(), user.getRealName(), user.getEmail());
        if (Checker.isEmpty(name)) {
            jsonObject.put("error", "文件格式不合法");
        } else {
            jsonObject.put("success", "/common/avatar/" + name);
        }
        return jsonObject.toString();
    }

    @ApiOperation(value = "发送验证码")
    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/{email}/code", method = RequestMethod.POST)
    public String sendVerifyCode(@PathVariable("email") String email) {
        int code = commonService.sendVerifyCode(email);
        if (code > 0) {
            request.getSession().setAttribute(DefaultValues.CODE_STRING, code);
            logger.info("verify code: " + code);
            jsonObject.put("status", "success");
        } else {
            jsonObject.put("status", "error");
        }
        return jsonObject.toString();
    }

    @ApiOperation(value = "验证验证码是否正确")
    @AuthInterceptor(InterceptorLevel.NONE)
    @RequestMapping(value = "/{code}/verification", method = RequestMethod.PUT)
    public String verifyCode(@PathVariable("code") String code) {
        boolean isSuccess = Checker.checkNull(code).equals(String.valueOf(request.getSession().getAttribute
                (DefaultValues.CODE_STRING)));
        return ControllerUtils.getResponse(isSuccess);
    }
}

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值