Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之在線網(wǎng)盤系統(tǒng)的實(shí)現(xiàn)
一、項(xiàng)目簡述
功能:用戶的郵箱注冊、驗(yàn)證碼驗(yàn)證以及用戶登錄。 不需要注冊賬號,也可以上傳滿足條件的臨時(shí)文件,但是只4小時(shí)內(nèi)有效。 文件的管理,上傳、下載、重命名、刪除、查看統(tǒng)計(jì)數(shù)據(jù)、分類管理等。 文件夾的管理,創(chuàng)建、刪除、重命名。 文件的分享,支持通過鏈接和二維碼的分享方式等等,以及管理員對用戶的管理等等。
二、項(xiàng)目運(yùn)行
環(huán)境配置:
Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)
項(xiàng)目技術(shù):
JSP +Springboot+ SpringMVC + MyBatis + ThymeLeaf + FTP+ JavaScript + JQuery + Ajax + maven等等
文件倉庫控制器:
/** * @ClassName: FileStoreController * @Description: 文件倉庫控制器 **/ @Controller public class FileStoreController extends BaseController { private Logger logger = LogUtils.getInstance(FileStoreController.class); /** * @Description 上傳臨時(shí)文件 * @Author xw * @Date 23:14 2020/3/9 * @Param [files] * @return void **/ @PostMapping("/uploadTempFile") public String uploadTempFile(@RequestParam("file") MultipartFile file,String url) { session.setAttribute("imgPath","https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=2654852821,3851565636&fm=26&gp=0.jpg"); String name = file.getOriginalFilename().replaceAll(" ",""); if (!checkTarget(name)){ logger.error("臨時(shí)文件上傳失敗!文件名不符合規(guī)范..."); session.setAttribute("msg", "上傳失敗!文件名不符合規(guī)范"); return "redirect:/temp-file"; } SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = format.format(new Date()); String path = "temp/"+dateStr +"/"+UUID.randomUUID(); try { if (FtpUtil.uploadFile("/"+path, name, file.getInputStream())){ //上傳成功 logger.info("臨時(shí)文件上傳成功!"+name); String size = String.valueOf(file.getSize()); TempFile tempFile = TempFile.builder().fileName(name).filePath(path).size(size).uploadTime(new Date()).build(); if (tempFileService.insert(tempFile)) { try { String id = UUID.randomUUID().toString(); String p = request.getSession().getServletContext().getRealPath("/user_img/"); Long t = tempFile.getUploadTime().getTime(); url = url+"/file/share?t="+ UUID.randomUUID().toString().substring(0,10) +"&f="+tempFile.getFileId()+"&p="+size+"&flag=2"; File targetFile = new File(p, ""); if (!targetFile.exists()) { targetFile.mkdirs(); } File f = new File(p, id + ".jpg"); if (!f.exists()){ //文件不存在,開始生成二維碼并保存文件 OutputStream os = new FileOutputStream(f); QRCodeUtil.encode(url, "/static/img/logo.png", os, true); os.close(); } //異步刪除臨時(shí)文件 tempFileService.deleteById(tempFile.getFileId()); session.setAttribute("imgPath","user_img/"+id+".jpg"); session.setAttribute("url",url); session.setAttribute("msg","上傳成功,掃碼/訪問鏈接 即可下載!"); return "redirect:/temp-file"; } catch (Exception e) { e.printStackTrace(); } }else { logger.info("臨時(shí)文件數(shù)據(jù)庫寫入失敗!"+name); session.setAttribute("url","error"); session.setAttribute("msg", "服務(wù)器出錯(cuò)了,臨時(shí)文件上傳失敗!"); } }else{ //上傳失敗 logger.info("臨時(shí)文件上傳失敗!"+name); session.setAttribute("url","error"); session.setAttribute("msg", "服務(wù)器出錯(cuò)了,上傳失敗!"); } } catch (IOException e) { e.printStackTrace(); } return "redirect:/temp-file"; } /** * @Description 網(wǎng)盤的文件上傳 * @Author xw * @Date 23:10 2020/2/10 * @Param [files] * @return java.util.Map<java.lang.String,java.lang.Object> **/ @PostMapping("/uploadFile") @ResponseBody public Map<String, Object> uploadFile(@RequestParam("file") MultipartFile files) { Map<String, Object> map = new HashMap<>(); if (fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission() != 0){ logger.error("用戶沒有上傳文件的權(quán)限!上傳失敗..."); map.put("code", 499); return map; } FileStore store = fileStoreService.getFileStoreByUserId(loginUser.getUserId()); Integer folderId = Integer.valueOf(request.getHeader("id")); String name = files.getOriginalFilename().replaceAll(" ",""); //獲取當(dāng)前目錄下的所有文件,用來判斷是否已經(jīng)存在 List<MyFile> myFiles = null; if (folderId == 0){ //當(dāng)前目錄為根目錄 myFiles = myFileService.getRootFilesByFileStoreId(loginUser.getFileStoreId()); }else { //當(dāng)前目錄為其他目錄 myFiles = myFileService.getFilesByParentFolderId(folderId); } for (int i = 0; i < myFiles.size(); i++) { if ((myFiles.get(i).getMyFileName()+myFiles.get(i).getPostfix()).equals(name)){ logger.error("當(dāng)前文件已存在!上傳失敗..."); map.put("code", 501); return map; } } SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = format.format(new Date()); String path = loginUser.getUserId()+"/"+dateStr +"/"+folderId; if (!checkTarget(name)){ logger.error("上傳失敗!文件名不符合規(guī)范..."); map.put("code", 502); return map; } Integer sizeInt = Math.toIntExact(files.getSize() / 1024); //是否倉庫放不下該文件 if(store.getCurrentSize()+sizeInt > store.getMaxSize()){ logger.error("上傳失敗!倉庫已滿。"); map.put("code", 503); return map; } //處理文件大小 String size = String.valueOf(files.getSize()/1024.0); int indexDot = size.lastIndexOf("."); size = size.substring(0,indexDot); int index = name.lastIndexOf("."); String tempName = name; String postfix = ""; int type = 4; if (index!=-1){ tempName = name.substring(index); name = name.substring(0,index); //獲得文件類型 type = getType(tempName.toLowerCase()); postfix = tempName.toLowerCase(); } try { //提交到FTP服務(wù)器 boolean b = FtpUtil.uploadFile("/"+path, name + postfix, files.getInputStream()); if (b){ //上傳成功 logger.info("文件上傳成功!"+files.getOriginalFilename()); //向數(shù)據(jù)庫文件表寫入數(shù)據(jù) myFileService.addFileByFileStoreId( MyFile.builder() .myFileName(name).fileStoreId(loginUser.getFileStoreId()).myFilePath(path) .downloadTime(0).uploadTime(new Date()).parentFolderId(folderId). size(Integer.valueOf(size)).type(type).postfix(postfix).build()); //更新倉庫表的當(dāng)前大小 fileStoreService.addSize(store.getFileStoreId(),Integer.valueOf(size)); try { Thread.sleep(5000); map.put("code", 200); } catch (InterruptedException e) { e.printStackTrace(); } }else{ logger.error("文件上傳失敗!"+files.getOriginalFilename()); map.put("code", 504); } } catch (IOException e) { e.printStackTrace(); } return map; } /** * @Description 網(wǎng)盤的文件下載 * @Author xw * @Date 23:13 2020/2/10 * @Param [fId] * @return void **/ @GetMapping("/downloadFile") public String downloadFile(@RequestParam Integer fId){ if (fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission() == 2){ logger.error("用戶沒有下載文件的權(quán)限!下載失敗..."); return "redirect:/error401Page"; } //獲取文件信息 MyFile myFile = myFileService.getFileByFileId(fId); String remotePath = myFile.getMyFilePath(); String fileName = myFile.getMyFileName()+myFile.getPostfix(); try { //去FTP上拉取 OutputStream os = new BufferedOutputStream(response.getOutputStream()); response.setCharacterEncoding("utf-8"); // 設(shè)置返回類型 response.setContentType("multipart/form-data"); // 文件名轉(zhuǎn)碼一下,不然會出現(xiàn)中文亂碼 response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8")); boolean flag = FtpUtil.downloadFile("/" + remotePath, fileName, os); if (flag) { myFileService.updateFile( MyFile.builder().myFileId(myFile.getMyFileId()).downloadTime(myFile.getDownloadTime() + 1).build()); os.flush(); os.close(); logger.info("文件下載成功!" + myFile); } } catch (Exception e) { e.printStackTrace(); } return "success"; } /** * @Description 刪除文件 * @Author xw * @Date 23:14 2020/2/10 * @Param [fId, folder] * @return java.lang.String **/ @GetMapping("/deleteFile") public String deleteFile(@RequestParam Integer fId,Integer folder){ //獲得文件信息 MyFile myFile = myFileService.getFileByFileId(fId); String remotePath = myFile.getMyFilePath(); String fileName = myFile.getMyFileName()+myFile.getPostfix(); //從FTP文件服務(wù)器上刪除文件 boolean b = FtpUtil.deleteFile("/"+remotePath, fileName); if (b){ //刪除成功,返回空間 fileStoreService.subSize(myFile.getFileStoreId(),Integer.valueOf(myFile.getSize())); //刪除文件表對應(yīng)的數(shù)據(jù) myFileService.deleteByFileId(fId); } logger.info("刪除文件成功!"+myFile); return "redirect:/files?fId="+folder; } /** * @Description 刪除文件夾并清空文件 * @Author xw * @Date 15:22 2020/2/12 * @Param [fId] * @return java.lang.String **/ @GetMapping("/deleteFolder") public String deleteFolder(@RequestParam Integer fId){ FileFolder folder = fileFolderService.getFileFolderByFileFolderId(fId); //強(qiáng)制刪除 deleteFolderF(folder); return folder.getParentFolderId() == 0?"redirect:/files":"redirect:/files?fId="+folder.getParentFolderId(); } /** * @Description 迭代刪除文件夾里面的所有文件和子文件夾 * @Author xw * @Date 9:17 2020/2/29 * @Param [folder] * @return void **/ public void deleteFolderF(FileFolder folder){ //獲得當(dāng)前文件夾下的所有子文件夾 List<FileFolder> folders = fileFolderService.getFileFolderByParentFolderId(folder.getFileFolderId()); //刪除當(dāng)前文件夾的所有的文件 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 添加文件夾 * @Author xw * @Date 23:16 2020/2/10 * @Param [folder, map] * @return java.lang.String **/ @PostMapping("/addFolder") public String addFolder(FileFolder folder,Map<String, Object> map) { //設(shè)置文件夾信息 folder.setFileStoreId(loginUser.getFileStoreId()); folder.setTime(new Date()); //獲得當(dāng)前目錄下的所有文件夾,檢查當(dāng)前文件夾是否已經(jīng)存在 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(); } } //向數(shù)據(jù)庫寫入數(shù)據(jù) Integer integer = fileFolderService.addFileFolder(folder); logger.info("添加文件夾成功!"+folder); return "redirect:/files?fId="+folder.getParentFolderId(); } /** * @Description 重命名文件夾 * @Author xw * @Date 23:18 2020/2/10 * @Param [folder, map] * @return java.lang.String **/ @PostMapping("/updateFolder") public String updateFolder(FileFolder folder,Map<String, Object> map) { //獲得文件夾的數(shù)據(jù)庫信息 FileFolder fileFolder = fileFolderService.getFileFolderByFileFolderId(folder.getFileFolderId()); fileFolder.setFileFolderName(folder.getFileFolderName()); //獲得當(dāng)前目錄下的所有文件夾,用于檢查文件夾是否已經(jīng)存在 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(); } } //向數(shù)據(jù)庫寫入數(shù)據(jù) Integer integer = fileFolderService.updateFileFolderById(fileFolder); logger.info("重命名文件夾成功!"+folder); return "redirect:/files?fId="+fileFolder.getParentFolderId(); } /** * @Description 重命名文件 * @Author xw * @Date 12:47 2020/2/12 * @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 獲得二維碼 * @Author xw * @Date 15:20 2020/2/12 * @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); } catch (Exception e) { e.printStackTrace(); } } } return map; } /** * @Description 分享文件 * @Author xw * @Date 14:23 2020/2/12 * @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("下載分享文件失敗,參數(shù)錯(cuò)誤"); 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){ TempFile tempFile = tempFileService.queryById(f); if (tempFile == null){ return "redirect:/error404Page"; } Long test = tempFile.getUploadTime().getTime(); String pwd = tempFile.getSize(); if (!pwd.equals(p)){ return "redirect:/error400Page"; } remotePath = tempFile.getFilePath(); fileName = tempFile.getFileName(); }else { return "redirect:/error400Page"; } fileNameTemp = fileName; try { //解決下載文件時(shí) 中文文件名亂碼問題 boolean isMSIE = isMSBrowser(request); if (isMSIE) { //IE瀏覽器的亂碼問題解決 fileNameTemp = URLEncoder.encode(fileNameTemp, "UTF-8"); } else { //萬能亂碼問題解決 fileNameTemp = new String(fileNameTemp.getBytes("UTF-8"), "ISO-8859-1"); } //去FTP上拉取 OutputStream os = new BufferedOutputStream(response.getOutputStream()); response.setCharacterEncoding("utf-8"); // 設(shè)置返回類型 response.setContentType("multipart/form-data"); // 文件名轉(zhuǎn)碼一下,不然會出現(xiàn)中文亂碼 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 根據(jù)文件的后綴名獲得對應(yīng)的類型 * @Author xw * @Date 23:20 2020/2/10 * @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 正則驗(yàn)證文件名是否合法 [漢字,字符,數(shù)字,下劃線,英文句號,橫線] * @Author xw * @Date 23:22 2020/2/10 * @Param [target] * @return boolean **/ public boolean checkTarget(String target) { final String format = "[^\\u4E00-\\u9FA5\\uF900-\\uFA2D\\w-_.]"; Pattern pattern = Pattern.compile(format); Matcher matcher = pattern.matcher(target); return !matcher.find(); } /** * @Description 判斷當(dāng)前瀏覽器是否為ie * @Author xw * @Date 22:39 2020/3/5 * @Param [request] * @return boolean **/ public static boolean isMSBrowser(HttpServletRequest request) { String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"}; String userAgent = request.getHeader("User-Agent"); for (String signal : IEBrowserSignals) { if (userAgent.contains(signal)){ return true; } } return false; } }
登錄控制器:?
/** * @Description 登錄控制器 * @return **/ @Controller public class LoginController extends BaseController { private Logger logger = LogUtils.getInstance(LoginController.class); /** * @Description 免登陸用戶入口,用于本地開發(fā)測試,上線運(yùn)營為了安全請刪除此方法 * @Author xw * @Date 15:17 2020/2/26 * @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"; } /** * 用于注冊流程,用戶名,密碼,郵箱等校驗(yàn)工作由前端來完成 * * @param map 用于存儲提示信息 * @author GGBOY * @date 2020/1/28 */ @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", "驗(yàn)證碼錯(cuò)誤"); 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("注冊用戶成功!當(dāng)前注冊用戶" + user); logger.info("注冊倉庫成功!當(dāng)前注冊倉庫" + store); } else { map.put("errorMsg", "服務(wù)器發(fā)生錯(cuò)誤,注冊失敗"); return "index"; } session.removeAttribute(user.getEmail() + "_code"); session.setAttribute("loginUser", user); return "redirect:/index"; } /** * 用戶登錄 * @param map 存儲提示信息 * @return java.lang.String * @author 莫提 * @date 2020/1/28 */ @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 ? "該郵箱尚未注冊" : "密碼錯(cuò)誤"; logger.info("登錄失敗!請確認(rèn)郵箱和密碼是否正確!"); //登錄失敗,將失敗信息返回前端渲染 map.put("errorMsg", errorMsg); return "index"; } } /** * @return void * @Description 向注冊郵箱發(fā)送驗(yàn)證碼, 并驗(yàn)證郵箱是否已使用 * @Author xw * @Date 19:32 2020/1/29 * @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("發(fā)送驗(yàn)證碼失??!郵箱已被注冊!"); return "exitEmail"; } logger.info("開始發(fā)送郵件.../n" + "獲取的到郵件發(fā)送對象為:" + mailSender); mailUtils = new MailUtils(mailSender); String code = "123456"; session.setAttribute(email + "_code", code); return "success"; } /** * @Description 請求QQ登錄 * @Author xw * @Date 18:27 2020/2/25 * @Param [] * @return void **/ @GetMapping("/loginByQQ") public void login() { response.setContentType("text/html;charset=utf-8"); try { response.sendRedirect(new Oauth().getAuthorizeURL(request)); logger.info("請求QQ登錄,開始跳轉(zhuǎn)..."); } catch (QQConnectException | IOException e) { e.printStackTrace(); } } /** * @Description QQ登錄回調(diào)地址 * @Author xw * @Date 18:27 2020/2/25 * @Param [] * @return java.lang.String **/ @GetMapping("/connection") public String connection() { try { AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request); String accessToken = null, openID = null; long tokenExpireIn = 0L; if ("".equals(accessTokenObj.getAccessToken())) { logger.error("登錄失敗:沒有獲取到響應(yīng)參數(shù)"); return "accessTokenObj=>" + accessTokenObj + "; accessToken" + accessTokenObj.getAccessToken(); } else { accessToken = accessTokenObj.getAccessToken(); tokenExpireIn = accessTokenObj.getExpireIn(); logger.error("accessToken" + accessToken); request.getSession().setAttribute("demo_access_token", accessToken); request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn)); // 利用獲取到的accessToken 去獲取當(dāng)前用的openid -------- start OpenID openIDObj = new OpenID(accessToken); openID = openIDObj.getUserOpenID(); UserInfo qzoneUserInfo = new UserInfo(accessToken, openID); UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo(); if (userInfoBean.getRet() == 0) { logger.info("用戶的OPEN_ID: " + openID); logger.info("用戶的昵稱: " + removeNonBmpUnicode(userInfoBean.getNickname())); logger.info("用戶的頭像URI: " + userInfoBean.getAvatar().getAvatarURL100()); //設(shè)置用戶信息 User user = userService.getUserByOpenId(openID); if (user == null){ user = User.builder() .openId(openID).userName(removeNonBmpUnicode(userInfoBean.getNickname())) .imagePath(userInfoBean.getAvatar().getAvatarURL100()). registerTime(new Date()).build(); if (userService.insert(user)){ logger.info("注冊用戶成功!當(dāng)前注冊用戶" + user); FileStore store = FileStore.builder().userId(user.getUserId()).build(); if (fileStoreService.addFileStore(store) == 1){ user.setFileStoreId(store.getFileStoreId()); userService.update(user); logger.info("注冊倉庫成功!當(dāng)前注冊倉庫" + 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網(wǎng)名中的特殊表情 * @Author xw * @Date 18:26 2020/2/25 * @Param [str] * @return java.lang.String 返回處理之后的網(wǎng)名 **/ public String removeNonBmpUnicode(String str) { if (str == null) { return null; } str = str.replaceAll("[^\\u0000-\\uFFFF]", ""); if ("".equals(str)) { str = "($ _ $)"; } return str; } /** * @Description 退出登錄,清空session * @Author xw * @Date 18:26 2020/2/25 * @Param [] * @return java.lang.String **/ @GetMapping("/logout") public String logout() { logger.info("用戶退出登錄!"); session.invalidate(); return "redirect:/"; } }
系統(tǒng)頁面跳轉(zhuǎn)控制器:
/** * @ClassName: SystemController * @Description: 系統(tǒng)頁面跳轉(zhuǎn)控制器 **/ @Controller public class SystemController extends BaseController { Logger logger = LogUtils.getInstance(SystemController.class); /** * @return java.lang.String * @Description 前往我的網(wǎng)盤 * @Author xw * @Date 23:28 2020/2/10 * @Param [fId, fName, error, map] **/ @GetMapping("/files") public String toFileStorePage(Integer fId, String fName, Integer error, Map<String, Object> map) { //判斷是否包含錯(cuò)誤信息 if (error != null) { if (error == 1) { map.put("error", "添加失??!當(dāng)前已存在同名文件夾"); } if (error == 2) { map.put("error", "重命名失?。∥募A已存在"); } } //包含的子文件夾 List<FileFolder> folders = null; //包含的文件 List<MyFile> files = null; //當(dāng)前文件夾信息 FileFolder nowFolder = null; //當(dāng)前文件夾的相對路徑 List<FileFolder> location = new ArrayList<>(); if (fId == null || fId <= 0) { //代表當(dāng)前為根目錄 fId = 0; folders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId()); files = myFileService.getRootFilesByFileStoreId(loginUser.getFileStoreId()); nowFolder = FileFolder.builder().fileFolderId(fId).build(); location.add(nowFolder); } else { //當(dāng)前為具體目錄,訪問的文件夾不是當(dāng)前登錄用戶所創(chuàng)建的文件夾 FileFolder folder = fileFolderService.getFileFolderByFileFolderId(fId); if (folder.getFileStoreId() - loginUser.getFileStoreId() != 0){ return "redirect:/error401Page"; } //當(dāng)前為具體目錄,訪問的文件夾是當(dāng)前登錄用戶所創(chuàng)建的文件夾 folders = fileFolderService.getFileFolderByParentFolderId(fId); files = myFileService.getFilesByParentFolderId(fId); nowFolder = fileFolderService.getFileFolderByFileFolderId(fId); //遍歷查詢當(dāng)前目錄 FileFolder temp = nowFolder; while (temp.getParentFolderId() != 0) { temp = fileFolderService.getFileFolderByFileFolderId(temp.getParentFolderId()); location.add(temp); } } Collections.reverse(location); //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); map.put("statistics", statistics); map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission()); map.put("folders", folders); map.put("files", files); map.put("nowFolder", nowFolder); map.put("location", location); logger.info("網(wǎng)盤頁面域中的數(shù)據(jù):" + map); return "u-admin/files"; } /** * @Description 前往文件上傳頁面 * @Author xw * @Date 15:16 2020/2/26 * @Param [fId, fName, map] * @return java.lang.String **/ @GetMapping("/upload") public String toUploadPage(Integer fId, String fName, Map<String, Object> map) { //包含的子文件夾 List<FileFolder> folders = null; //當(dāng)前文件夾信息 FileFolder nowFolder = null; //當(dāng)前文件夾的相對路徑 List<FileFolder> location = new ArrayList<>(); if (fId == null || fId <= 0) { //代表當(dāng)前為根目錄 fId = 0; folders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId()); nowFolder = FileFolder.builder().fileFolderId(fId).build(); location.add(nowFolder); } else { //當(dāng)前為具體目錄 folders = fileFolderService.getFileFolderByParentFolderId(fId); nowFolder = fileFolderService.getFileFolderByFileFolderId(fId); //遍歷查詢當(dāng)前目錄 FileFolder temp = nowFolder; while (temp.getParentFolderId() != 0) { temp = fileFolderService.getFileFolderByFileFolderId(temp.getParentFolderId()); location.add(temp); } } Collections.reverse(location); //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); map.put("statistics", statistics); map.put("folders", folders); map.put("nowFolder", nowFolder); map.put("location", location); logger.info("網(wǎng)盤頁面域中的數(shù)據(jù):" + map); return "u-admin/upload"; } /** * @Description 前往所有文檔頁面 * @Author xw * @Date 10:26 2020/2/26 * @Param [map] * @return java.lang.String **/ @GetMapping("/doc-files") public String toDocFilePage( Map<String, Object> map) { List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),1); //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); map.put("statistics", statistics); map.put("files", files); map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission()); return "u-admin/doc-files"; } /** * @Description 前往所有圖像頁面 * @Author xw * @Date 10:26 2020/2/26 * @Param [map] * @return java.lang.String **/ @GetMapping("/image-files") public String toImageFilePage( Map<String, Object> map) { List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),2); //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); map.put("statistics", statistics); map.put("files", files); map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission()); return "u-admin/image-files"; } /** * @Description 前往所有視頻頁面 * @Author xw * @Date 10:26 2020/2/26 * @Param [map] * @return java.lang.String **/ @GetMapping("/video-files") public String toVideoFilePage( Map<String, Object> map) { List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),3); //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); map.put("statistics", statistics); map.put("files", files); map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission()); return "u-admin/video-files"; } /** * @Description 前往所有音頻頁面 * @Author xw * @Date 10:26 2020/2/26 * @Param [map] * @return java.lang.String **/ @GetMapping("/music-files") public String toMusicFilePage( Map<String, Object> map) { List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),4); //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); map.put("statistics", statistics); map.put("files", files); map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission()); return "u-admin/music-files"; } /** * @Description 前往其他文件頁面 * @Author xw * @Date 10:26 2020/2/26 * @Param [map] * @return java.lang.String **/ @GetMapping("/other-files") public String toOtherFilePage( Map<String, Object> map) { List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),5); //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); map.put("statistics", statistics); map.put("files", files); map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission()); return "u-admin/other-files"; } /** * @Description 登錄之后的用戶主頁 * @Author xw * @Date 10:28 2020/2/26 * @Param [map] * @return java.lang.String **/ @GetMapping("/index") public String index(Map<String, Object> map) { //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); statistics.setFileStore(fileStoreService.getFileStoreById(loginUser.getFileStoreId())); map.put("statistics", statistics); return "u-admin/index"; } /** * @Description 前往幫助頁面 * @Author xw * @Date 15:17 2020/2/26 * @Param [map] * @return java.lang.String **/ @GetMapping("/help") public String helpPage(Map<String, Object> map) { //獲得統(tǒng)計(jì)信息 FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId()); map.put("statistics", statistics); return "u-admin/help"; } }
到此這篇關(guān)于Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之在線網(wǎng)盤系統(tǒng)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java 在線網(wǎng)盤系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之教室預(yù)訂管理系統(tǒng)的實(shí)現(xiàn)
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之共享租車信息管理系統(tǒng)的實(shí)現(xiàn)
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之寵物醫(yī)院與商城一體的系統(tǒng)的實(shí)現(xiàn)
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之生活旅行分享平臺的實(shí)現(xiàn)
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之圖片展覽館管理系統(tǒng)的實(shí)現(xiàn)
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之仿小米電子產(chǎn)品售賣商城系統(tǒng)的實(shí)現(xiàn)
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之校園一卡通系統(tǒng)的實(shí)現(xiàn)
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之藥店信息管理系統(tǒng)的實(shí)現(xiàn)
- Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之平行志愿管理系統(tǒng)的實(shí)現(xiàn)
相關(guān)文章
Spring MVC-@RequestMapping注解詳解
@RequestMapping注解的作用,就是將請求和處理請求的控制器方法關(guān)聯(lián)起來,建立映射關(guān)系。這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Spring boot搭建web應(yīng)用集成thymeleaf模板實(shí)現(xiàn)登陸
這篇文章主要介紹了Spring boot搭建web應(yīng)用集成thymeleaf模板實(shí)現(xiàn)登陸,頁面使用bootstrap,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12SpringBoot?Redis清除所有的key的實(shí)現(xiàn)方法
本文主要介紹了SpringBoot?Redis清除所有的key的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控的步驟
這篇文章主要介紹了SpringBoot整合RedisTemplate實(shí)現(xiàn)緩存信息監(jiān)控,一步一步的實(shí)現(xiàn)?Springboot?整合?Redis?來存儲數(shù)據(jù),讀取數(shù)據(jù),需要的朋友可以參考下2022-01-01Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例
這篇文章主要為大家介紹了Java?C++題解leetcode1441用棧操作構(gòu)建數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Java的Arrays.sort()方法排序算法實(shí)例分析
網(wǎng)上看過很多JDK8中Arrays.sort的底層原理,有些說是插入排序,有些說是歸并排序,也有說大于域值用計(jì)數(shù)排序法,否則就使用插入排序,這種說法到底對嗎?下面通過本文給大家分析下Java的Arrays.sort()方法到底用的什么排序算法,感興趣的朋友一起看看吧2022-02-02Ribbon單獨(dú)使用,配置自動重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式
這篇文章主要介紹了Ribbon單獨(dú)使用,配置自動重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Java實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)任意進(jìn)制轉(zhuǎn)換的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08java設(shè)計(jì)簡單學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)簡單學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09