当前位置: 首页 > Web前端 > HTML5

Netty+SpringBoot+FastDFS+Html5实现ChatApp详解(二)

时间:2023-04-05 02:20:19 HTML5

Netty+SpringBoot+FastDFS+Html5实现ChatApp,项目介绍。Netty+SpringBoot+FastDFS+Html5实现聊天App,项目github链接。本章完整代码本节主要讲解聊天应用PigChat中的用户信息处理和文件服务器FastDFS的相关操作。包括以下内容:(1)注册登录功能(2)文件服务器配置(3)上传用户头像(4)设置用户昵称(5)用户二维码生成及上传注册登录功能自定义一个工具类IMoocJSONResult为后端响应前端的数据结构。包含以下三个属性://响应业务状态privateIntegerstatus;//响应消息privateStringmsg;//响应中的数据privateObjectdata;提供错误响应和正常响应的方法:publicstaticIMoocJSONResultok(Objectdata){returnnewIMoocJSONResult(data);}publicstaticIMoocJSONResultok(){returnnewIMoocJSONResult(null);}publicstaticIMoocJSONResulterrorMsg(Stringmsg){returnnewIMoocJSONResult(500,msg,null);}publicstaticIMoocJSONResulterrorMap(Objectdata){returnnewIMoocJSONResult(501,"error",data);}publicstaticIMoocJSONResulterrorTokenMsg(Stringmsg){returnnewIMoocJSONResult(502,msg,null);}publicstaticIMoocJSONResulterrorException(Stringmsg){returnnewIMoocJSONResult(555,msg,null);}根据建库表创建对应的pojo包和mapper包,针对建库表的详情创建UserController方法,写入registOrLogin接口进行注册和登录处理。[0]前端传入Users对象,首先判断前端传入的Users对象是否为空。[1]然后根据传入的用户名使用userService的queryUsernameIsExist方法在数据库中进行查询。[1.1]如果用户存在,则登录。使用userService的queryUserForLogin方法判断前端传入的用户名与密码trial是否匹配。如果匹配则登录成功,否则登录失败。[1.2]如果用户不存在,记得注册,根据前端传入的信息构建一个Users对象,通过userService的saveUser保存到数据库中。[2]最后构造UsersVO对象返回给前端。注意:密码保存到数据库前需要用MD5工具加密。/***@Description:用户注册/登录*/@PostMapping("/registOrLogin")publicIMoocJSONResultregistOrLogin(@RequestBodyUsersuser)throwsException{//0.判断用户名和密码不能为空if(StringUtils.isBlank(user.getUsername())||StringUtils.isBlank(user.getPassword())){returnIMoocJSONResult.errorMsg("用户名或密码不能为空...");}//1.判断用户名是否存在,存在则登录,不存在则注册booleanusernameIsExist=userService.queryUsernameIsExist(user.getUsername());用户userResult=null;if(usernameIsExist){//1.1登录userResult=userService.queryUserForLogin(user.getUsername(),MD5Utils.getMD5Str(user.getPassword()));if(userResult==null){returnIMoocJSONResult.errorMsg("用户名或密码不正确...");}}else{//1.2注册user.setNickname(user.getUsername());你ser.setFaceImage("");user.setFaceImageBig("");user.setPassword(MD5Utils.getMD5Str(user.getPassword()));userResult=userService.saveUser(用户);}//2.构造UsersVO对象UsersVOuserVO=newUsersVO();BeanUtils.copyProperties(userResult,userVO);返回IMoocJSONResult.ok(userVO);}文件服务器配置在linux中配置好文件服务器FastDFS后,需要在工程中添加如下配置:(1)在Application同级目录下创建FastdfsImporterpackagecom.imooc;importorg.springframework.context.annotation.Configuration;导入org.springframework.context.annotation.EnableMBeanExport;导入org.springframework.context.annotation.Import;导入org.springframework.jmx.support.RegistrationPolicy;导入com.github.tobato.fastdfs.FdfsClientConfig;/***导入FastDFS-Client组件**@authortobato**/@Configuration@Import(FdfsClientConfig.class)//解决jmx重复注册bean问题@EnableMBeanExport(registration=RegistrationPolicy.IGNORE_EXISTING)publicclassFastdfsImporter{//导入依赖组件}(2)在application.properties中添加如下配置:fdfs.soTimeout=1501fdfs.connectTimeout=601fdfs.thumbImage.width=80fdfs.thumbImage.height=80#192.168.1.70为linux虚拟机的ip地址machinefdfs.trackerList[0]=192.168.1.70:22122启动服务命令:/usr/bin/fdfs_trackerd/etc/fdfs/tracker.conf/usr/bin/fdfs_storaged/etc/fdfs/storage.conf#查看服务启动(23000/22122端口)netstat-lnp|grepfdfscd/usr/local/nginx/sbin./nginx上传用户头像在UserController中添加上传用户头像的uploadFaceBase64接口[1]前端传入UserBO对象,首先获取前端字符串的base64,通过文件工具类FileUtils的base64ToFile方法转换为文件对象保存到本地。[2]将文件对象转换成MultipartFile,通过fastDFSClient的uploadBase64方法上传到文件服务器fastDFS,并打印出服务器返回的路径。我们可以通过这个路径访问这张图片。[3]剪切返回的路径,得到缩略图的路径。【4】更新数据库中的用户头像信息。/***@Description:上传用户头像*/@PostMapping("/uploadFaceBase64")publicIMoocJSONResultuploadFaceBase64(@RequestBodyUsersBOuserBO)throwsException{//1.获取前端传来的base64字符串,然后进行转换到文件对象然后上传Stringbase64Data=userBO.getFaceData();//本地存放图片的路径StringuserFacePath="C:\\"+userBO.getUserId()+"userface64.png";FileUtils.base64ToFile(userFacePath,base64Data);//2.上传文件到fastdfsMultipartFilefaceFile=FileUtils.fileToMultipart(userFacePath);字符串url=fastDFSClient.uploadBase64(faceFile);System.out.println(url);//"dhawuidhwaiuh3u89u98432.png"//"dhawuidhwaiuh3u89u98432.png"//"dhawuidhwaiuh3u89u98432.png""//3.获取缩略图的urlStringthump="_80x80.";Stringarr[]=url.split("\\.");StringthumpImgUrl=arr[0]+thump+arr[1];//4.更新用户头像Usersuser=newUsers();user.setId(userBO.getUserId());user.setFaceImage(thumpImgUrl);user.setFaceImageBig(url);用户结果=userService.updateUserInfo(user);返回IMoocJSONResult.ok(结果);}在UserController中设置用户昵称添加用户昵称setNicknameinterface/***@Description:设置用户昵称*/@PostMapping("/setNickname")publicIMoocJSONResultsetNickname(@RequestBodyUsersBOuserBO)throwsException{Usersuser=newUsers();user.setId(userBO.getUserId());user.setNickname(userBO.getNickname());用户结果=userService.updateUserInfo(user);返回IMoocJSONResult.ok(结果);}用户二维码的生成和上传在UserServiceImpl中引入相关的工具类和组件//二维码工具类@AutowiredprivateQRCodeUtilsqrCodeUtils;//上传文件到fsatDFS需要的组件@AutowiredprivateFastDFSClientfastDFSClient;在UserServiceImpl中保存用户信息的saveUser方法中,需要为每个用户生成一个唯一的二维码。[1]通过二维码工具类qrCodeUtils的createQRCode方法为每个用户生成唯一的二维码。第一个参数是生成的二维码的存储路径,第二个参数是二维码中存储的值。信息,然后将文件转换成MultipartFile对象,方便上传。[2]通过fastDFSClient的uploadQRCode方法将二维码图片上传到文件服务器。@Transactional(propagation=Propagation.REQUIRED)@OverridepublicUserssaveUser(Usersuser){//生成唯一idStringuserId=sid.nextShort();//1.为每个用户生成一个唯一的二维码//本地路径用于存放生成的二维码图片StringqrCodePath="C://user"+userId+"qrcode.png";//扫描二维码后得到的信息:zhuzhu_qrcode:[用户名]qrCodeUtils.createQRCode(qrCodePath,"zhuzhu_qrcode:"+user.getUsername());MultipartFileqrCodeFile=FileUtils.fileToMultipart(qrCodePath);//2。上传文件StringqrCodeUrl="";尝试{qrCodeUrl=fastDFSClient.uploadQRCode(qrCodeFile);}catch(IOExceptione){e.printStackTrace();}user.setQrcode(qrCodeUrl);user.setId(userId);userMapper.insert(用户);返回用户;