摘要:實(shí)現(xiàn)聊天,項(xiàng)目介紹。若該用戶不存在則記性注冊,根據(jù)前端傳入的信息構(gòu)建對象,通過的將其保存入數(shù)據(jù)庫中。注意密碼需要使用工具類進(jìn)行加密后再保存到數(shù)據(jù)庫中。對返回的路徑進(jìn)行切割后得到縮略圖的路徑。通過的方法將二維碼圖片上傳到文件服務(wù)器中。
Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹。
Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目github鏈接。
本章完整代碼
本節(jié)主要講解聊天App PigChat中關(guān)于用戶信息處理,以及文件服務(wù)器FastDFS的相關(guān)操作。
包含以下內(nèi)容:
自定義一個(gè)工具類IMoocJSONResult,是后端響應(yīng)前端的數(shù)據(jù)結(jié)構(gòu)。
包含下面三個(gè)屬性:
// 響應(yīng)業(yè)務(wù)狀態(tài) private Integer status; // 響應(yīng)消息 private String msg; // 響應(yīng)中的數(shù)據(jù) private Object data;
提供錯(cuò)誤響應(yīng)與正常響應(yīng)的方法:
public static IMoocJSONResult ok(Object data) { return new IMoocJSONResult(data); } public static IMoocJSONResult ok() { return new IMoocJSONResult(null); } public static IMoocJSONResult errorMsg(String msg) { return new IMoocJSONResult(500, msg, null); } public static IMoocJSONResult errorMap(Object data) { return new IMoocJSONResult(501, "error", data); } public static IMoocJSONResult errorTokenMsg(String msg) { return new IMoocJSONResult(502, msg, null); } public static IMoocJSONResult errorException(String msg) { return new IMoocJSONResult(555, msg, null); }
根據(jù)數(shù)據(jù)庫所建的表創(chuàng)建對應(yīng)的pojo包與mapper包,數(shù)據(jù)庫建表詳情
創(chuàng)建UserController方法,寫入進(jìn)行注冊于登錄處理的registOrLogin接口。
【0】前端傳入U(xiǎn)sers對象,首先判斷前端傳入的Users對象是否為空。
【1】然后通過userService的queryUsernameIsExist方法根據(jù)傳入的用戶名在數(shù)據(jù)庫中進(jìn)行查詢。
【1.1】若該用戶存在則進(jìn)行登錄,通過userService的queryUserForLogin方法判斷前端傳入的用戶名與密碼試湊匹配,若匹配則登錄成功,否則登錄失敗。
【1.2】若該用戶不存在則記性注冊,根據(jù)前端傳入的信息構(gòu)建Users對象,通過userService的saveUser將其保存入數(shù)據(jù)庫中。
【2】最后構(gòu)造UsersVO對象,返回給前端。
注意:密碼需要使用MD5工具類進(jìn)行加密后再保存到數(shù)據(jù)庫中。
/** * @Description: 用戶注冊/登錄 */ @PostMapping("/registOrLogin") public IMoocJSONResult registOrLogin(@RequestBody Users user) throws Exception { // 0. 判斷用戶名和密碼不能為空 if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) { return IMoocJSONResult.errorMsg("用戶名或密碼不能為空..."); } // 1. 判斷用戶名是否存在,如果存在就登錄,如果不存在則注冊 boolean usernameIsExist = userService.queryUsernameIsExist(user.getUsername()); Users userResult = null; if (usernameIsExist) { // 1.1 登錄 userResult = userService.queryUserForLogin(user.getUsername(), MD5Utils.getMD5Str(user.getPassword())); if (userResult == null) { return IMoocJSONResult.errorMsg("用戶名或密碼不正確..."); } } else { // 1.2 注冊 user.setNickname(user.getUsername()); user.setFaceImage(""); user.setFaceImageBig(""); user.setPassword(MD5Utils.getMD5Str(user.getPassword())); userResult = userService.saveUser(user); } // 2.構(gòu)造UsersVO對象 UsersVO userVO = new UsersVO(); BeanUtils.copyProperties(userResult, userVO); return IMoocJSONResult.ok(userVO); }
在linux中配置好文件服務(wù)器FastDFS后,需要在項(xiàng)目中添加如下配置:
(1)在Application同目錄下創(chuàng)建FastdfsImporter
package com.imooc; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableMBeanExport; import org.springframework.context.annotation.Import; import org.springframework.jmx.support.RegistrationPolicy; import com.github.tobato.fastdfs.FdfsClientConfig; /** * 導(dǎo)入FastDFS-Client組件 * * @author tobato * */ @Configuration @Import(FdfsClientConfig.class) // 解決jmx重復(fù)注冊bean的問題 @EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING) public class FastdfsImporter { // 導(dǎo)入依賴組件 }
(2)在application.properties中添加如下配置:
fdfs.soTimeout=1501 fdfs.connectTimeout=601 fdfs.thumbImage.width=80 fdfs.thumbImage.height=80 # 192.168.1.70為Linux虛擬機(jī)的ip地址 fdfs.trackerList[0]=192.168.1.70:22122
啟動(dòng)服務(wù)命令:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf /usr/bin/fdfs_storaged /etc/fdfs/storage.conf #查看服務(wù)啟動(dòng)情況(23000/22122端口) netstat -lnp |grep fdfs cd /usr/local/nginx/sbin ./nginx
在UserController中添加上傳用戶頭像的uploadFaceBase64接口。
【1】前端傳入U(xiǎn)serBO對象,首先獲取前端傳來的base64字符串,并通過文件工具類FileUtils的base64ToFile方法將其轉(zhuǎn)換成文件對象保存在本地。
【2】將文件對象轉(zhuǎn)換成MultipartFile,并通過fastDFSClient的uploadBase64方法將其上傳到文件服務(wù)器fastDFS中,打印出服務(wù)器返回的路徑,我們可以通過這個(gè)路徑訪問這張圖片。
【3】對返回的路徑進(jìn)行切割后得到縮略圖的路徑。
【4】更新數(shù)據(jù)庫中用戶頭像信息。
/** * @Description: 上傳用戶頭像 */ @PostMapping("/uploadFaceBase64") public IMoocJSONResult uploadFaceBase64(@RequestBody UsersBO userBO) throws Exception { // 1. 獲取前端傳過來的base64字符串, 然后轉(zhuǎn)換為文件對象再上傳 String base64Data = userBO.getFaceData(); // 在本地存儲(chǔ)圖片的路徑 String userFacePath = "C:" + userBO.getUserId() + "userface64.png"; FileUtils.base64ToFile(userFacePath, base64Data); // 2.上傳文件到fastdfs MultipartFile faceFile = FileUtils.fileToMultipart(userFacePath); String url = fastDFSClient.uploadBase64(faceFile); System.out.println(url); // "dhawuidhwaiuh3u89u98432.png" // "dhawuidhwaiuh3u89u98432_80x80.png" // 3.獲取縮略圖的url String thump = "_80x80."; String arr[] = url.split("."); String thumpImgUrl = arr[0] + thump + arr[1]; // 4.更新用戶頭像 Users user = new Users(); user.setId(userBO.getUserId()); user.setFaceImage(thumpImgUrl); user.setFaceImageBig(url); Users result = userService.updateUserInfo(user); return IMoocJSONResult.ok(result); }
在UserController添加設(shè)置用戶昵稱的setNickname接口。
/** * @Description: 設(shè)置用戶昵稱 */ @PostMapping("/setNickname") public IMoocJSONResult setNickname(@RequestBody UsersBO userBO) throws Exception { Users user = new Users(); user.setId(userBO.getUserId()); user.setNickname(userBO.getNickname()); Users result = userService.updateUserInfo(user); return IMoocJSONResult.ok(result); }
在UserServiceImpl中引入相關(guān)工具類與組件
//二維碼工具類 @Autowired private QRCodeUtils qrCodeUtils; //上傳文件到fsatDFS需要的組件 @Autowired private FastDFSClient fastDFSClient;
在UserServiceImpl保存用戶信息的saveUser方法中需要為每一個(gè)用戶生成一個(gè)唯一的二維碼。
【1】通過二維碼工具類qrCodeUtils的createQRCode方法為每個(gè)用戶生成一個(gè)唯一的二維碼,第一個(gè)參數(shù)為生成的二維碼存儲(chǔ)的路徑,第二個(gè)參數(shù)為二維碼中保存的信息,然后將文件轉(zhuǎn)成MultipartFile對象,方便上傳操作。
【2】通過fastDFSClient的uploadQRCode方法將二維碼圖片上傳到文件服務(wù)器中。
@Transactional(propagation = Propagation.REQUIRED) @Override public Users saveUser(Users user) { //生成唯一的id String userId = sid.nextShort(); // 1.為每個(gè)用戶生成一個(gè)唯一的二維碼 //本地用來存儲(chǔ)生成的二維碼圖片的路徑 String qrCodePath = "C://user" + userId + "qrcode.png"; // 掃描二維碼后得到的信息:zhuzhu_qrcode:[username] qrCodeUtils.createQRCode(qrCodePath, "zhuzhu_qrcode:" + user.getUsername()); MultipartFile qrCodeFile = FileUtils.fileToMultipart(qrCodePath); //2.上傳文件 String qrCodeUrl = ""; try { qrCodeUrl = fastDFSClient.uploadQRCode(qrCodeFile); } catch (IOException e) { e.printStackTrace(); } user.setQrcode(qrCodeUrl); user.setId(userId); userMapper.insert(user); return user; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73282.html
Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹。Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目github鏈接。本章完整代碼鏈接。 本章內(nèi)容 (1) 查詢好友列表的接口 (2)通過或忽略好友請求的接口 (3)添加好友功能展示 查詢好友列表的接口 /** * @Description: 查詢我的好友列表 ...
閱讀 3136·2021-11-11 16:54
閱讀 2291·2021-09-04 16:48
閱讀 3219·2019-08-29 16:08
閱讀 642·2019-08-29 15:13
閱讀 1344·2019-08-29 15:09
閱讀 2660·2019-08-29 12:45
閱讀 1926·2019-08-29 12:12
閱讀 444·2019-08-26 18:27