基于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
使用说明
-
使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中application.yml配置文件中的数据库配置改为自己的配置;
-
运行项目,输入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);
}
}