成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App詳解(二)

SnaiLiu / 2104人閱讀

摘要:實(shí)現(xiàn)聊天,項(xiàng)目介紹。若該用戶(hù)不存在則記性注冊(cè),根據(jù)前端傳入的信息構(gòu)建對(duì)象,通過(guò)的將其保存入數(shù)據(jù)庫(kù)中。注意密碼需要使用工具類(lèi)進(jìn)行加密后再保存到數(shù)據(jù)庫(kù)中。對(duì)返回的路徑進(jìn)行切割后得到縮略圖的路徑。通過(guò)的方法將二維碼圖片上傳到文件服務(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)于用戶(hù)信息處理,以及文件服務(wù)器FastDFS的相關(guān)操作。


包含以下內(nèi)容:

(1)注冊(cè)與登錄功能 (2)文件服務(wù)器的配置 (3)上傳用戶(hù)頭像 (4)設(shè)置用戶(hù)昵稱(chēng) (5)用戶(hù)二維碼的生成與上傳


注冊(cè)與登錄功能

自定義一個(gè)工具類(lèi)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ù)庫(kù)所建的表創(chuàng)建對(duì)應(yīng)的pojo包與mapper包,數(shù)據(jù)庫(kù)建表詳情

創(chuàng)建UserController方法,寫(xiě)入進(jìn)行注冊(cè)于登錄處理的registOrLogin接口。
【0】前端傳入U(xiǎn)sers對(duì)象,首先判斷前端傳入的Users對(duì)象是否為空。
【1】然后通過(guò)userService的queryUsernameIsExist方法根據(jù)傳入的用戶(hù)名在數(shù)據(jù)庫(kù)中進(jìn)行查詢(xún)。
【1.1】若該用戶(hù)存在則進(jìn)行登錄,通過(guò)userService的queryUserForLogin方法判斷前端傳入的用戶(hù)名與密碼試湊匹配,若匹配則登錄成功,否則登錄失敗。
【1.2】若該用戶(hù)不存在則記性注冊(cè),根據(jù)前端傳入的信息構(gòu)建Users對(duì)象,通過(guò)userService的saveUser將其保存入數(shù)據(jù)庫(kù)中。
【2】最后構(gòu)造UsersVO對(duì)象,返回給前端。
注意:密碼需要使用MD5工具類(lèi)進(jìn)行加密后再保存到數(shù)據(jù)庫(kù)中。

    /**
     * @Description: 用戶(hù)注冊(cè)/登錄
     */
    @PostMapping("/registOrLogin")
    public IMoocJSONResult registOrLogin(@RequestBody Users user) throws Exception {
        
        // 0. 判斷用戶(hù)名和密碼不能為空
        if (StringUtils.isBlank(user.getUsername()) 
                || StringUtils.isBlank(user.getPassword())) {
            return IMoocJSONResult.errorMsg("用戶(hù)名或密碼不能為空...");
        }
        
        // 1. 判斷用戶(hù)名是否存在,如果存在就登錄,如果不存在則注冊(cè)
        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("用戶(hù)名或密碼不正確..."); 
            }
        } else {
            // 1.2 注冊(cè)
            user.setNickname(user.getUsername());
            user.setFaceImage("");
            user.setFaceImageBig("");
            user.setPassword(MD5Utils.getMD5Str(user.getPassword()));
            userResult = userService.saveUser(user);
        }
        // 2.構(gòu)造UsersVO對(duì)象
        UsersVO userVO = new UsersVO();
        BeanUtils.copyProperties(userResult, userVO);
        
        return IMoocJSONResult.ok(userVO);
    }


文件服務(wù)器的配置

在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ù)注冊(cè)bean的問(wèn)題
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastdfsImporter {
    // 導(dǎo)入依賴(lài)組件
}

(2)在application.properties中添加如下配置:

fdfs.soTimeout=1501
fdfs.connectTimeout=601
fdfs.thumbImage.width=80
fdfs.thumbImage.height=80
# 192.168.1.70為L(zhǎng)inux虛擬機(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


上傳用戶(hù)頭像

在UserController中添加上傳用戶(hù)頭像的uploadFaceBase64接口。

【1】前端傳入U(xiǎn)serBO對(duì)象,首先獲取前端傳來(lái)的base64字符串,并通過(guò)文件工具類(lèi)FileUtils的base64ToFile方法將其轉(zhuǎn)換成文件對(duì)象保存在本地。
【2】將文件對(duì)象轉(zhuǎn)換成MultipartFile,并通過(guò)fastDFSClient的uploadBase64方法將其上傳到文件服務(wù)器fastDFS中,打印出服務(wù)器返回的路徑,我們可以通過(guò)這個(gè)路徑訪問(wèn)這張圖片。
【3】對(duì)返回的路徑進(jìn)行切割后得到縮略圖的路徑。
【4】更新數(shù)據(jù)庫(kù)中用戶(hù)頭像信息。

    /**
     * @Description: 上傳用戶(hù)頭像
     */
    @PostMapping("/uploadFaceBase64")
    public IMoocJSONResult uploadFaceBase64(@RequestBody UsersBO userBO) throws Exception {
        
        // 1. 獲取前端傳過(guò)來(lái)的base64字符串, 然后轉(zhuǎn)換為文件對(duì)象再上傳
        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.更新用戶(hù)頭像
        Users user = new Users();
        user.setId(userBO.getUserId());
        user.setFaceImage(thumpImgUrl);
        user.setFaceImageBig(url);
        
        Users result = userService.updateUserInfo(user);
        
        return IMoocJSONResult.ok(result);
    }


設(shè)置用戶(hù)昵稱(chēng)

在UserController添加設(shè)置用戶(hù)昵稱(chēng)的setNickname接口。

    /**
     * @Description: 設(shè)置用戶(hù)昵稱(chēng)
     */
    @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);
    }


用戶(hù)二維碼的生成與上傳

在UserServiceImpl中引入相關(guān)工具類(lèi)與組件

    //二維碼工具類(lèi)
     @Autowired
    private QRCodeUtils qrCodeUtils;
    //上傳文件到fsatDFS需要的組件
    @Autowired
    private FastDFSClient fastDFSClient;

在UserServiceImpl保存用戶(hù)信息的saveUser方法中需要為每一個(gè)用戶(hù)生成一個(gè)唯一的二維碼。

【1】通過(guò)二維碼工具類(lèi)qrCodeUtils的createQRCode方法為每個(gè)用戶(hù)生成一個(gè)唯一的二維碼,第一個(gè)參數(shù)為生成的二維碼存儲(chǔ)的路徑,第二個(gè)參數(shù)為二維碼中保存的信息,然后將文件轉(zhuǎn)成MultipartFile對(duì)象,方便上傳操作。
【2】通過(guò)fastDFSClient的uploadQRCode方法將二維碼圖片上傳到文件服務(wù)器中。

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public Users saveUser(Users user) {
        //生成唯一的id
        String userId = sid.nextShort();
        
        // 1.為每個(gè)用戶(hù)生成一個(gè)唯一的二維碼
            //本地用來(lái)存儲(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73282.html

相關(guān)文章

  • Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App詳解(四)

    Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目介紹。Netty+SpringBoot+FastDFS+Html5實(shí)現(xiàn)聊天App,項(xiàng)目github鏈接。本章完整代碼鏈接。 本章內(nèi)容 (1) 查詢(xún)好友列表的接口 (2)通過(guò)或忽略好友請(qǐng)求的接口 (3)添加好友功能展示 查詢(xún)好友列表的接口 /** * @Description: 查詢(xún)我的好友列表 ...

    why_rookie 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<