基于javaweb+mysql的springboot在线嘿嘿网盘系统设计和实现(java+springboot+ssm+mysql+maven+thymeleaf+html)
运行环境
Java≥8、MySQL≥5.7
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SpringBoot在线嘿嘿网盘系统设计和实现(java+springboot+ssm+mysql+maven+thymeleaf+html)
一、项目简述
功能:用户的邮箱注册、验证码验证以及用户登录。 不需要注册账号,也可以上传满足条件的临时文件,但是 只4小时内有效。 文件的管理,上传、下载、重命名、删除、查看统计数 据、分类管理等。 文件夹的管理,创建、删除、重命名。 文件的分享,支持通过链博口二维码的分享方式等等。
二、项目运行
环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts 都支持)
项目技术: JSP +Springboot+ SpringMVC + MyBatis + ThymeLeaf + FTP+ JavaScript + JQuery + Ajax + maven等等
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
return "u-admin/help";
}
}
package com.moti.controller;
/**
* @ClassName: AdminController
* @Description: 管理员控制器
* @Version: 1.0
**/
@Controller
public class AdminController extends BaseController {
private Logger logger = LogUtils.getInstance(AdminController.class);
/**
* @Description 前往用户管理页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/manages-users")
public String manageUsers(Map<String,Object> map,Integer cur){
* @Description 处理掉QQ网名中的特殊表情
* @Param [str]
* @return java.lang.String 返回处理之后的网名
**/
public String removeNonBmpUnicode(String str) {
if (str == null) {
return null;
}
str = str.replaceAll("[^\\u0000-\\uFFFF]", "");
if ("".equals(str)) {
str = "($ _ $)";
}
return str;
}
/**
* @Description 退出登录,清空session
* @Param []
* @return java.lang.String
**/
@GetMapping("/logout")
public String logout() {
logger.info("用户退出登录!");
session.invalidate();
return "redirect:/";
}
}
package com.moti.controller;
/**
* @ClassName: SystemController
* @Description: 系统页面跳转控制器
//去FTP上拉取
OutputStream os = new BufferedOutputStream(response.getOutputStream());
response.setCharacterEncoding("utf-8");
// 设置返回类型
response.setContentType("multipart/form-data");
// 文件名转码一下,不然会出现中文乱码
response.setHeader("Content-Disposition", "attachment;fileName=" + fileNameTemp);
if (FtpUtil.downloadFile("/" + remotePath, fileName, os)) {
myFileService.updateFile(
MyFile.builder().myFileId(f).downloadTime(times + 1).build());
os.flush();
os.close();
logger.info("文件下载成功!");
}
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
/**
* @Description 根据文件的后缀名获得对应的类型
* @Param [type]
* @return int 1:文本类型 2:图像类型 3:视频类型 4:音乐类型 5:其他类型
**/
public int getType(String type){
if (".chm".equals(type)||".txt".equals(type)||".xmind".equals(type)||".xlsx".equals(type)||".md".equals(type)
||".doc".equals(type)||".docx".equals(type)||".pptx".equals(type)
||".wps".equals(type)||".word".equals(type)||".html".equals(type)||".pdf".equals(type)){
return 1;
}else if (".bmp".equals(type)||".gif".equals(type)||".jpg".equals(type)||".ico".equals(type)||".vsd".equals(type)
||".pic".equals(type)||".png".equals(type)||".jepg".equals(type)||".jpeg".equals(type)||".webp".equals(type)
||".svg".equals(type)){
return 2;
} else if (".avi".equals(type)||".mov".equals(type)||".qt".equals(type)
||".asf".equals(type)||".rm".equals(type)||".navi".equals(type)||".wav".equals(type)
||".mp4".equals(type)||".mkv".equals(type)||".webm".equals(type)){
return 3;
} else if (".mp3".equals(type)||".wma".equals(type)){
return 4;
} else {
return 5;
}
}
/**
* @Description 正则验证文件名是否合法 [汉字,字符,数字,下划线,英文句号,横线]
if (userService.insert(user)){
logger.info("注册用户成功!当前注册用户" + user);
FileStore store = FileStore.builder().userId(user.getUserId()).build();
if (fileStoreService.addFileStore(store) == 1){
user.setFileStoreId(store.getFileStoreId());
userService.update(user);
logger.info("注册仓库成功!当前注册仓库" + store);
}
} else {
logger.error("注册用户失败!");
}
}else {
user.setUserName(removeNonBmpUnicode(userInfoBean.getNickname()));
user.setImagePath(userInfoBean.getAvatar().getAvatarURL100());
userService.update(user);
}
logger.info("QQ用户登录成功!"+user);
session.setAttribute("loginUser", user);
return "redirect:/index";
} else {
logger.error("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());
}
}
} catch (QQConnectException e) {
} finally {
logger.error("登录成功!");
}
return "登录失败!请查看日志信息...";
}
/**
* @Description 处理掉QQ网名中的特殊表情
* @Param [str]
* @return java.lang.String 返回处理之后的网名
**/
public String removeNonBmpUnicode(String str) {
if (str == null) {
return null;
}
str = str.replaceAll("[^\\u0000-\\uFFFF]", "");
if ("".equals(str)) {
str = "($ _ $)";
}
return str;
}
}
}
}
if (folders.size()!=0){
for (int i = 0; i < folders.size(); i++) {
deleteFolderF(folders.get(i));
}
}
fileFolderService.deleteFileFolderById(folder.getFileFolderId());
}
/**
* @Description 添加文件夹
* @Param [folder, map]
* @return java.lang.String
**/
@PostMapping("/addFolder")
public String addFolder(FileFolder folder,Map<String, Object> map) {
//设置文件夹信息
folder.setFileStoreId(loginUser.getFileStoreId());
folder.setTime(new Date());
//获得当前目录下的所有文件夹,检查当前文件夹是否已经存在
List<FileFolder> fileFolders = null;
if (folder.getParentFolderId() == 0){
//向用户根目录添加文件夹
fileFolders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId());
}else{
//向用户的其他目录添加文件夹
fileFolders = fileFolderService.getFileFolderByParentFolderId(folder.getParentFolderId());
}
for (int i = 0; i < fileFolders.size(); i++) {
FileFolder fileFolder = fileFolders.get(i);
if (fileFolder.getFileFolderName().equals(folder.getFileFolderName())){
logger.info("添加文件夹失败!文件夹已存在...");
return "redirect:/files?error=1&fId="+folder.getParentFolderId();
}
}
//向数据库写入数据
Integer integer = fileFolderService.addFileFolder(folder);
logger.info("添加文件夹成功!"+folder);
return "redirect:/files?fId="+folder.getParentFolderId();
}
/**
@GetMapping("/deleteFolder")
public String deleteFolder(@RequestParam Integer fId){
FileFolder folder = fileFolderService.getFileFolderByFileFolderId(fId);
//强制删除
deleteFolderF(folder);
return folder.getParentFolderId() == 0?"redirect:/files":"redirect:/files?fId="+folder.getParentFolderId();
}
/**
* @Description 迭代删除文件夹里面的所有文件和子文件夹
* @Param [folder]
* @return void
**/
public void deleteFolderF(FileFolder folder){
//获得当前文件夹下的所有子文件夹
List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());
//删除当前文件夹的所有的文件
List<MyFile> files = myFileService.getFilesByParentFolderId(folder.getFileFolderId());
if (files.size()!=0){
for (int i = 0; i < files.size(); i++) {
Integer fileId = files.get(i).getMyFileId();
boolean b = FtpUtil.deleteFile("/"+files.get(i).getMyFilePath(), files.get(i).getMyFileName() + files.get(i).getPostfix());
if (b){
myFileService.deleteByFileId(fileId);
fileStoreService.subSize(folder.getFileStoreId(),Integer.valueOf(files.get(i).getSize()));
}
}
}
if (folders.size()!=0){
for (int i = 0; i < folders.size(); i++) {
deleteFolderF(folders.get(i));
}
}
fileFolderService.deleteFileFolderById(folder.getFileFolderId());
}
/**
* @Description 添加文件夹
* @Param [folder, map]
* @return java.lang.String
**/
@PostMapping("/addFolder")
public String addFolder(FileFolder folder,Map<String, Object> map) {
//设置文件夹信息
folder.setFileStoreId(loginUser.getFileStoreId());
String uCode = (String) session.getAttribute(user.getEmail() + "_code");
if (!code.equals(uCode)) {
map.put("errorMsg", "验证码错误");
return "index";
}
// 用户名去空格
user.setUserName(user.getUserName().trim());
user.setImagePath("https://p.qpic.cn/qqconnect/0/app_101851241_1582451550/100?max-age=2592000&t=0");
user.setRegisterTime(new Date());
user.setRole(1);
if (userService.insert(user)) {
FileStore store = FileStore.builder().userId(user.getUserId()).currentSize(0).build();
fileStoreService.addFileStore(store);
user.setFileStoreId(store.getFileStoreId());
userService.update(user);
logger.info("注册用户成功!当前注册用户" + user);
logger.info("注册仓库成功!当前注册仓库" + store);
} else {
map.put("errorMsg", "服务器发生错误,注册失败");
return "index";
}
session.removeAttribute(user.getEmail() + "_code");
session.setAttribute("loginUser", user);
return "redirect:/index";
}
/**
* 用户登录
* @param map 存储提示信息
* @return java.lang.String
*/
@PostMapping("/login")
public String login(User user, Map<String, Object> map) {
User userByEmail = userService.getUserByEmail(user.getEmail());
if (userByEmail != null && userByEmail.getPassword().equals(user.getPassword())) {
session.setAttribute("loginUser", userByEmail);
logger.info("登录成功!"+userByEmail);
return "redirect:/index";
}else{
User user1 = userService.getUserByEmail(user.getEmail());
String errorMsg = user1 == null ? "该邮箱尚未注册" : "密码错误";
logger.info("登录失败!请确认邮箱和密码是否正确!");
//登录失败,将失败信息返回前端渲染
map.put("errorMsg", errorMsg);
return "index";
}
* @Description 重命名文件
* @Param [file, map]
* @return java.lang.String
**/
@PostMapping("/updateFileName")
public String updateFileName(MyFile file,Map<String, Object> map) {
MyFile myFile = myFileService.getFileByFileId(file.getMyFileId());
if (myFile != null){
String oldName = myFile.getMyFileName();
String newName = file.getMyFileName();
if (!oldName.equals(newName)){
boolean b = FtpUtil.reNameFile(myFile.getMyFilePath() + "/" + oldName+myFile.getPostfix(), myFile.getMyFilePath() + "/" + newName+myFile.getPostfix());
if (b){
Integer integer = myFileService.updateFile(
MyFile.builder().myFileId(myFile.getMyFileId()).myFileName(newName).build());
if (integer == 1){
logger.info("修改文件名成功!原文件名:"+oldName+" 新文件名:"+newName);
}else{
logger.error("修改文件名失败!原文件名:"+oldName+" 新文件名:"+newName);
}
}
}
}
return "redirect:/files?fId="+myFile.getParentFolderId();
}
/**
* @Description 获得二维码
* @Param [id, url]
* @return java.util.Map<java.lang.String,java.lang.Object>
**/
@GetMapping("getQrCode")
@ResponseBody
public Map<String,Object> getQrCode(@RequestParam Integer id,@RequestParam String url){
Map<String,Object> map = new HashMap<>();
map.put("imgPath","https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg");
if (id != null){
MyFile file = myFileService.getFileByFileId(id);
if (file != null){
boolean b = FtpUtil.deleteFile("/"+files.get(i).getMyFilePath(), files.get(i).getMyFileName() + files.get(i).getPostfix());
if (b){
myFileService.deleteByFileId(fileId);
fileStoreService.subSize(folder.getFileStoreId(),Integer.valueOf(files.get(i).getSize()));
}
}
}
if (folders.size()!=0){
for (int i = 0; i < folders.size(); i++) {
deleteFolderF(folders.get(i));
}
}
fileFolderService.deleteFileFolderById(folder.getFileFolderId());
}
}
package com.moti.controller;
/**
* @ClassName: BaseController
* @Description: 控制器的基类,所有控制器必须继承此类
* @Version: 1.0
**/
public class BaseController {
@Autowired
protected UserService userService;
@Autowired
protected MyFileService myFileService;
@Autowired
protected FileFolderService fileFolderService;
@Autowired
protected FileStoreService fileStoreService;
@Autowired
protected TempFileService tempFileService;
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
*/
@PostMapping("/register")
public String register(User user, String code, Map<String, Object> map) {
String uCode = (String) session.getAttribute(user.getEmail() + "_code");
if (!code.equals(uCode)) {
map.put("errorMsg", "验证码错误");
return "index";
}
// 用户名去空格
user.setUserName(user.getUserName().trim());
user.setImagePath("https://p.qpic.cn/qqconnect/0/app_101851241_1582451550/100?max-age=2592000&t=0");
user.setRegisterTime(new Date());
user.setRole(1);
if (userService.insert(user)) {
FileStore store = FileStore.builder().userId(user.getUserId()).currentSize(0).build();
fileStoreService.addFileStore(store);
user.setFileStoreId(store.getFileStoreId());
userService.update(user);
logger.info("注册用户成功!当前注册用户" + user);
logger.info("注册仓库成功!当前注册仓库" + store);
} else {
map.put("errorMsg", "服务器发生错误,注册失败");
return "index";
}
session.removeAttribute(user.getEmail() + "_code");
session.setAttribute("loginUser", user);
return "redirect:/index";
}
/**
* 用户登录
* @param map 存储提示信息
* @return java.lang.String
*/
@PostMapping("/login")
public String login(User user, Map<String, Object> map) {
User userByEmail = userService.getUserByEmail(user.getEmail());
if (userByEmail != null && userByEmail.getPassword().equals(user.getPassword())) {
session.setAttribute("loginUser", userByEmail);
logger.info("登录成功!"+userByEmail);
return "redirect:/index";
}else{
User user1 = userService.getUserByEmail(user.getEmail());
String errorMsg = user1 == null ? "该邮箱尚未注册" : "密码错误";
logger.info("登录失败!请确认邮箱和密码是否正确!");
//登录失败,将失败信息返回前端渲染
}
List<MyFile> files = myFileService.getRootFilesByFileStoreId(fileStore.getFileStoreId());
//删除该用户仓库根目录下的所有文件
for (MyFile f:files) {
String remotePath = f.getMyFilePath();
String fileName = f.getMyFileName()+f.getPostfix();
//从FTP文件服务器上删除文件
boolean b = FtpUtil.deleteFile("/"+remotePath, fileName);
if (b){
//删除成功,返回空间
fileStoreService.subSize(f.getFileStoreId(),Integer.valueOf(f.getSize()));
//删除文件表对应的数据
myFileService.deleteByFileId(f.getMyFileId());
}
logger.info("删除文件成功!"+f);
}
if (FtpUtil.deleteFolder("/" + uId)){
logger.info("清空FTP上该用户的文件成功");
}else {
logger.error("清空FTP上该用户的文件失败");
}
userService.deleteById(uId);
fileStoreService.deleteById(fileStore.getFileStoreId());
return "redirect:/manages-users?cur="+cur;
}
/**
* @Description 迭代删除文件夹里面的所有文件和子文件夹
* @Param [folder]
* @return void
**/
public void deleteFolderF(FileFolder folder){
//获得当前文件夹下的所有子文件夹
List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());
//删除当前文件夹的所有的文件
List<MyFile> files = myFileService.getFilesByParentFolderId(folder.getFileFolderId());
if (files.size()!=0){
for (int i = 0; i < files.size(); i++) {
/**
* @Description 登录控制器
* @Param * @param null
* @return
**/
@Controller
public class LoginController extends BaseController {
private Logger logger = LogUtils.getInstance(LoginController.class);
/**
* @Description 免登陆用户入口,用于本地开发测试,上线运营为了安全请删除此方法
* @Param []
* @return java.lang.String
**/
@GetMapping("/admin")
public String adminLogin(){
User user = userService.getUserByOpenId("123456");
logger.info("使用免登陆方式登录成功!"+user);
session.setAttribute("loginUser", user);
return "redirect:/index";
}
/**
* 用于注册流程,用户名,密码,邮箱等校验工作由前端来完成
*
* @param map 用于存储提示信息
*/
@PostMapping("/register")
public String register(User user, String code, Map<String, Object> map) {
String uCode = (String) session.getAttribute(user.getEmail() + "_code");
if (!code.equals(uCode)) {
map.put("errorMsg", "验证码错误");
return "index";
}
// 用户名去空格
user.setUserName(user.getUserName().trim());
user.setImagePath("https://p.qpic.cn/qqconnect/0/app_101851241_1582451550/100?max-age=2592000&t=0");
user.setRegisterTime(new Date());
/**
* @Description 重命名文件
* @Param [file, map]
* @return java.lang.String
**/
@PostMapping("/updateFileName")
public String updateFileName(MyFile file,Map<String, Object> map) {
MyFile myFile = myFileService.getFileByFileId(file.getMyFileId());
if (myFile != null){
String oldName = myFile.getMyFileName();
String newName = file.getMyFileName();
if (!oldName.equals(newName)){
boolean b = FtpUtil.reNameFile(myFile.getMyFilePath() + "/" + oldName+myFile.getPostfix(), myFile.getMyFilePath() + "/" + newName+myFile.getPostfix());
if (b){
Integer integer = myFileService.updateFile(
MyFile.builder().myFileId(myFile.getMyFileId()).myFileName(newName).build());
if (integer == 1){
logger.info("修改文件名成功!原文件名:"+oldName+" 新文件名:"+newName);
}else{
logger.error("修改文件名失败!原文件名:"+oldName+" 新文件名:"+newName);
}
}
}
}
return "redirect:/files?fId="+myFile.getParentFolderId();
}
/**
* @Description 获得二维码
* @Param [id, url]
* @return java.util.Map<java.lang.String,java.lang.Object>
**/
@GetMapping("getQrCode")
@ResponseBody
public Map<String,Object> getQrCode(@RequestParam Integer id,@RequestParam String url){
Map<String,Object> map = new HashMap<>();
map.put("imgPath","https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg");
if (id != null){
/**
* @Description 重命名文件夹
* @Param [folder, map]
* @return java.lang.String
**/
@PostMapping("/updateFolder")
public String updateFolder(FileFolder folder,Map<String, Object> map) {
//获得文件夹的数据库信息
FileFolder fileFolder = fileFolderService.getFileFolderByFileFolderId(folder.getFileFolderId());
fileFolder.setFileFolderName(folder.getFileFolderName());
//获得当前目录下的所有文件夹,用于检查文件夹是否已经存在
List<FileFolder> fileFolders = fileFolderService.getFileFolderByParentFolderId(fileFolder.getParentFolderId());
for (int i = 0; i < fileFolders.size(); i++) {
FileFolder folder1 = fileFolders.get(i);
if (folder1.getFileFolderName().equals(folder.getFileFolderName()) && folder1.getFileFolderId() != folder.getFileFolderId()){
logger.info("重命名文件夹失败!文件夹已存在...");
return "redirect:/files?error=2&fId="+fileFolder.getParentFolderId();
}
}
//向数据库写入数据
Integer integer = fileFolderService.updateFileFolderById(fileFolder);
logger.info("重命名文件夹成功!"+folder);
return "redirect:/files?fId="+fileFolder.getParentFolderId();
}
/**
* @Description 重命名文件
* @Param [file, map]
* @return java.lang.String
**/
@PostMapping("/updateFileName")
public String updateFileName(MyFile file,Map<String, Object> map) {
MyFile myFile = myFileService.getFileByFileId(file.getMyFileId());
if (myFile != null){
String oldName = myFile.getMyFileName();
String newName = file.getMyFileName();
if (!oldName.equals(newName)){
boolean b = FtpUtil.reNameFile(myFile.getMyFilePath() + "/" + oldName+myFile.getPostfix(), myFile.getMyFilePath() + "/" + newName+myFile.getPostfix());
if (b){
Integer integer = myFileService.updateFile(
MyFile.builder().myFileId(myFile.getMyFileId()).myFileName(newName).build());
if (integer == 1){
logger.info("修改文件名成功!原文件名:"+oldName+" 新文件名:"+newName);
}else{
logger.error("修改文件名失败!原文件名:"+oldName+" 新文件名:"+newName);
}
}
}
/**
* @Description 迭代删除文件夹里面的所有文件和子文件夹
* @Param [folder]
* @return void
**/
public void deleteFolderF(FileFolder folder){
//获得当前文件夹下的所有子文件夹
List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());
//删除当前文件夹的所有的文件
List<MyFile> files = myFileService.getFilesByParentFolderId(folder.getFileFolderId());
if (files.size()!=0){
for (int i = 0; i < files.size(); i++) {
Integer fileId = files.get(i).getMyFileId();
boolean b = FtpUtil.deleteFile("/"+files.get(i).getMyFilePath(), files.get(i).getMyFileName() + files.get(i).getPostfix());
if (b){
myFileService.deleteByFileId(fileId);
fileStoreService.subSize(folder.getFileStoreId(),Integer.valueOf(files.get(i).getSize()));
}
}
}
if (folders.size()!=0){
for (int i = 0; i < folders.size(); i++) {
deleteFolderF(folders.get(i));
}
}
fileFolderService.deleteFileFolderById(folder.getFileFolderId());
}
/**
* @Description 添加文件夹
* @Param [folder, map]
* @return java.lang.String
**/
@PostMapping("/addFolder")
public String addFolder(FileFolder folder,Map<String, Object> map) {
//设置文件夹信息
folder.setFileStoreId(loginUser.getFileStoreId());
folder.setTime(new Date());
//获得当前目录下的所有文件夹,检查当前文件夹是否已经存在
List<FileFolder> fileFolders = null;
if (folder.getParentFolderId() == 0){
//向用户根目录添加文件夹
fileFolders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId());
}else{
//向用户的其他目录添加文件夹
try {
String path = request.getSession().getServletContext().getRealPath("/user_img/");
url = url+"/file/share?t="+ UUID.randomUUID().toString().substring(0,10) +"&f="+file.getMyFileId()+"&p="+file.getUploadTime().getTime()+""+file.getSize()+"&flag=1";
File targetFile = new File(path, "");
if (!targetFile.exists()) {
targetFile.mkdirs();
}
File f = new File(path, id + ".jpg");
if (!f.exists()){
//文件不存在,开始生成二维码并保存文件
OutputStream os = new FileOutputStream(f);
QRCodeUtil.encode(url, "/static/img/logo.png", os, true);
os.close();
}
map.put("imgPath","user_img/"+id+".jpg");
map.put("url",url);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return map;
}
/**
* @Description 分享文件
* @Param [fId]
* @return void
**/
@GetMapping("/file/share")
public String shareFile(Integer f,String p,String t,Integer flag){
String fileNameTemp = "";
String remotePath = "";
String fileName = "";
Integer times = 0;
if (flag == null || f == null || p == null || t == null){
logger.info("下载分享文件失败,参数错误");
return "redirect:/error400Page";
}
if(flag == 1){
//获取文件信息
MyFile myFile = myFileService.getFileByFileId(f);
if (myFile == null){
return "redirect:/error404Page";
}
String pwd = myFile.getUploadTime().getTime()+""+myFile.getSize();
if (!pwd.equals(p)){
return "redirect:/error400Page";
}
remotePath = myFile.getMyFilePath();
fileName = myFile.getMyFileName()+myFile.getPostfix();
}else if(flag == 2){
return false;
}
}
package com.moti.controller;
/**
* @Description 登录控制器
* @Param * @param null
* @return
**/
@Controller
public class LoginController extends BaseController {
private Logger logger = LogUtils.getInstance(LoginController.class);
/**
* @Description 免登陆用户入口,用于本地开发测试,上线运营为了安全请删除此方法
* @Param []
* @return java.lang.String
**/
@GetMapping("/admin")
boolean b = FtpUtil.deleteFile("/"+remotePath, fileName);
if (b){
//删除成功,返回空间
fileStoreService.subSize(f.getFileStoreId(),Integer.valueOf(f.getSize()));
//删除文件表对应的数据
myFileService.deleteByFileId(f.getMyFileId());
}
logger.info("删除文件成功!"+f);
}
if (FtpUtil.deleteFolder("/" + uId)){
logger.info("清空FTP上该用户的文件成功");
}else {
logger.error("清空FTP上该用户的文件失败");
}
userService.deleteById(uId);
fileStoreService.deleteById(fileStore.getFileStoreId());
return "redirect:/manages-users?cur="+cur;
}
/**
* @Description 迭代删除文件夹里面的所有文件和子文件夹
* @Param [folder]
* @return void
**/
public void deleteFolderF(FileFolder folder){
//获得当前文件夹下的所有子文件夹
List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());
//删除当前文件夹的所有的文件
List<MyFile> files = myFileService.getFilesByParentFolderId(folder.getFileFolderId());
if (files.size()!=0){
for (int i = 0; i < files.size(); i++) {
Integer fileId = files.get(i).getMyFileId();
boolean b = FtpUtil.deleteFile("/"+files.get(i).getMyFilePath(), files.get(i).getMyFileName() + files.get(i).getPostfix());
if (b){
myFileService.deleteByFileId(fileId);
fileStoreService.subSize(folder.getFileStoreId(),Integer.valueOf(files.get(i).getSize()));
}
}
}
if (folders.size()!=0){
for (int i = 0; i < folders.size(); i++) {
deleteFolderF(folders.get(i));
}
}
fileFolderService.deleteFileFolderById(folder.getFileFolderId());
}
}
package com.moti.controller;
package com.moti.controller;
/**
* @ClassName: AdminController
* @Description: 管理员控制器
* @Version: 1.0
**/
@Controller
public class AdminController extends BaseController {
private Logger logger = LogUtils.getInstance(AdminController.class);
/**
* @Description 前往用户管理页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/manages-users")
public String manageUsers(Map<String,Object> map,Integer cur){
if (loginUser.getRole() == 1){
//用于无访问权限
logger.error("当前登录用户:"+loginUser.getUserName()+"无管理员权限!");
return "redirect:/error401Page";
}
//获取全部的用户
Integer usersCount = userService.getUsersCount();
//获取当前查询的页数,如果为空,默认为0
cur = (cur == null || cur<0)?0:cur;
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
//分页获得20个用户信息
Page<Object> page = PageHelper.startPage(cur, 20);
List<UserToShow> users = userService.getUsers();
map.put("statistics", statistics);
map.put("users", users);
map.put("page", page);
* @ClassName: BaseController
* @Description: 控制器的基类,所有控制器必须继承此类
* @Version: 1.0
**/
public class BaseController {
@Autowired
protected UserService userService;
@Autowired
protected MyFileService myFileService;
@Autowired
protected FileFolderService fileFolderService;
@Autowired
protected FileStoreService fileStoreService;
@Autowired
protected TempFileService tempFileService;
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
protected User loginUser;
@Autowired
protected JavaMailSenderImpl mailSender;
protected MailUtils mailUtils;
/**
* 在每个子类方法调用之前先调用
* 设置request,response,session这三个对象
*
* @param request
* @param response
*/
@ModelAttribute
public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) {
this.request = request;
this.response = response;
this.session = request.getSession(true);
loginUser = (User) session.getAttribute("loginUser");
protected TempFileService tempFileService;
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
protected User loginUser;
@Autowired
protected JavaMailSenderImpl mailSender;
protected MailUtils mailUtils;
/**
* 在每个子类方法调用之前先调用
* 设置request,response,session这三个对象
*
* @param request
* @param response
*/
@ModelAttribute
public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) {
this.request = request;
this.response = response;
this.session = request.getSession(true);
loginUser = (User) session.getAttribute("loginUser");
}
}
package com.moti.component;
/**
* @Description 登录拦截器:用于登录检查,权限控制
* @Param * @param null
* @return
**/
public class LoginHandlerInterceptor implements HandlerInterceptor {
/**
* 在目标方式执行之前执行
* @param request
}
/**
* @Description 前往帮助页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/help")
public String helpPage(Map<String, Object> map) {
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
return "u-admin/help";
}
}
package com.moti.controller;
/**
* @ClassName: AdminController
* @Description: 管理员控制器
* @Version: 1.0
**/
@Controller
public class AdminController extends BaseController {
private Logger logger = LogUtils.getInstance(AdminController.class);
if (myFile != null){
String oldName = myFile.getMyFileName();
String newName = file.getMyFileName();
if (!oldName.equals(newName)){
boolean b = FtpUtil.reNameFile(myFile.getMyFilePath() + "/" + oldName+myFile.getPostfix(), myFile.getMyFilePath() + "/" + newName+myFile.getPostfix());
if (b){
Integer integer = myFileService.updateFile(
MyFile.builder().myFileId(myFile.getMyFileId()).myFileName(newName).build());
if (integer == 1){
logger.info("修改文件名成功!原文件名:"+oldName+" 新文件名:"+newName);
}else{
logger.error("修改文件名失败!原文件名:"+oldName+" 新文件名:"+newName);
}
}
}
}
return "redirect:/files?fId="+myFile.getParentFolderId();
}
/**
* @Description 获得二维码
* @Param [id, url]
* @return java.util.Map<java.lang.String,java.lang.Object>
**/
@GetMapping("getQrCode")
@ResponseBody
public Map<String,Object> getQrCode(@RequestParam Integer id,@RequestParam String url){
Map<String,Object> map = new HashMap<>();
map.put("imgPath","https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg");
if (id != null){
MyFile file = myFileService.getFileByFileId(id);
if (file != null){
try {
String path = request.getSession().getServletContext().getRealPath("/user_img/");
url = url+"/file/share?t="+ UUID.randomUUID().toString().substring(0,10) +"&f="+file.getMyFileId()+"&p="+file.getUploadTime().getTime()+""+file.getSize()+"&flag=1";
File targetFile = new File(path, "");
if (!targetFile.exists()) {
targetFile.mkdirs();
}
File f = new File(path, id + ".jpg");
if (!f.exists()){
//文件不存在,开始生成二维码并保存文件
OutputStream os = new FileOutputStream(f);
QRCodeUtil.encode(url, "/static/img/logo.png", os, true);
os.close();
}
map.put("imgPath","user_img/"+id+".jpg");
map.put("url",url);
*/
@PostMapping("/login")
public String login(User user, Map<String, Object> map) {
User userByEmail = userService.getUserByEmail(user.getEmail());
if (userByEmail != null && userByEmail.getPassword().equals(user.getPassword())) {
session.setAttribute("loginUser", userByEmail);
logger.info("登录成功!"+userByEmail);
return "redirect:/index";
}else{
User user1 = userService.getUserByEmail(user.getEmail());
String errorMsg = user1 == null ? "该邮箱尚未注册" : "密码错误";
logger.info("登录失败!请确认邮箱和密码是否正确!");
//登录失败,将失败信息返回前端渲染
map.put("errorMsg", errorMsg);
return "index";
}
}
/**
* @return void
* @Description 向注册邮箱发送验证码, 并验证邮箱是否已使用
* @Param [userName, email, password]
**/
@ResponseBody
@RequestMapping("/sendCode")
public String sendCode(String userName, String email, String password) {
User userByEmail = userService.getUserByEmail(email);
if (userByEmail != null) {
logger.error("发送验证码失败!邮箱已被注册!");
return "exitEmail";
}
logger.info("开始发送邮件.../n" + "获取的到邮件发送对象为:" + mailSender);
mailUtils = new MailUtils(mailSender);
String code = "123456";
session.setAttribute(email + "_code", code);
return "success";
}
/**
* @Description 请求QQ登录
* @Param []
* @return void
**/
@GetMapping("/loginByQQ")
public void login() {
public String deleteFolder(@RequestParam Integer fId){
FileFolder folder = fileFolderService.getFileFolderByFileFolderId(fId);
//强制删除
deleteFolderF(folder);
return folder.getParentFolderId() == 0?"redirect:/files":"redirect:/files?fId="+folder.getParentFolderId();
}
/**
* @Description 迭代删除文件夹里面的所有文件和子文件夹
* @Param [folder]
* @return void
**/
public void deleteFolderF(FileFolder folder){
//获得当前文件夹下的所有子文件夹
List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId());
//删除当前文件夹的所有的文件
List<MyFile> files = myFileService.getFilesByParentFolderId(folder.getFileFolderId());
if (files.size()!=0){
for (int i = 0; i < files.size(); i++) {
Integer fileId = files.get(i).getMyFileId();
boolean b = FtpUtil.deleteFile("/"+files.get(i).getMyFilePath(), files.get(i).getMyFileName() + files.get(i).getPostfix());
if (b){
myFileService.deleteByFileId(fileId);
fileStoreService.subSize(folder.getFileStoreId(),Integer.valueOf(files.get(i).getSize()));
}
}
}
if (folders.size()!=0){
for (int i = 0; i < folders.size(); i++) {
deleteFolderF(folders.get(i));
}
}
fileFolderService.deleteFileFolderById(folder.getFileFolderId());
}
/**
* @Description 添加文件夹
* @Param [folder, map]
/**
* @Description 登录之后的用户主页
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/index")
public String index(Map<String, Object> map) {
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
statistics.setFileStore(fileStoreService.getFileStoreById(loginUser.getFileStoreId()));
map.put("statistics", statistics);
return "u-admin/index";
}
/**
* @Description 前往帮助页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/help")
public String helpPage(Map<String, Object> map) {
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
return "u-admin/help";
}
}
package com.moti.controller;
/**
* @ClassName: AdminController