本項目使用jsp+servlet+mysql架構搭建可聊天的酷炫博客系統。界面很是好看,除了登陸註冊我的中心修改外,博客還添加背景音樂,可在線交友聊天,發表動態,相互評論等,喜歡的博文還能添加收藏。
http://localhost:8090/indexServlet
1.註冊使用郵箱驗證碼前端
//郵件對象 public class EmailModel { private String title;//標題 private String receiverEmail;//接收人郵箱 private String text;//發送內容 public static String register="歡迎來到微博客n您的註冊爲:"; public static String registerTitle="註冊驗證碼"; public static String findPwdTitle="找回密碼:"; public static String findPwdText="找回密碼驗證碼:"; } // 郵件發送 public class EmailUtils { private final static String authorizationCode="khdotvxxxxdba"; //受權碼-本身設置 private final static String senderEmail ="1022287044@qq.com"; //發送人郵箱--測試郵箱 //發送郵件方法 public static int sendEmail(EmailModel emailModel){ try{ Properties props = new Properties(); // 開啓debug調試 props.setProperty("mail.debug", "false"); // 發送服務器須要身份驗證 props.setProperty("mail.smtp.auth", "true"); // 設置郵件服務器主機名 props.setProperty("mail.host", "smtp.qq.com"); // 發送郵件協議名稱 props.setProperty("mail.transport.protocol", "smtp"); MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); props.put("mail.smtp.ssl.enable", "true"); props.put("mail.smtp.ssl.socketFactory", sf); Session session = Session.getInstance(props); Message msg = new MimeMessage(session); msg.setSubject(emailModel.getTitle());//標題 StringBuilder builder = new StringBuilder(); builder.append(emailModel.getText()); msg.setText(builder.toString()); msg.setFrom(new InternetAddress(senderEmail));//發送人的郵箱地址 Transport transport = session.getTransport(); //發送人的郵箱地址 //你的郵箱密碼或者受權碼 transport.connect("smtp.qq.com", senderEmail, authorizationCode); transport.sendMessage(msg, new Address[] { new InternetAddress(emailModel.getReceiverEmail()) });// 接收人的郵箱地址 transport.close(); return 1; }catch (Exception e){ e.printStackTrace(); return 0; } }} //註冊及發送郵箱驗證碼 public void doGet(HttpServletRequest request, HttpServletResponse response) { try{ PrintWriter printWriter=response.getWriter(); HttpSession session=request.getSession(); String action = request.getParameter("action"); String userName=request.getParameter("userName"); String password=request.getParameter("password"); if("sendEmail".equals(action)){ //發送驗證碼 String receiverEmail=request.getParameter("receiverEmail"); String type=request.getParameter("type"); String authCode=RandomUtil.randomNumbers(4); EmailModel emailModel=new EmailModel(); if("register".equalsIgnoreCase(type)){ //註冊 User search=new User(); search.setUserName(receiverEmail); search=userService.getUser(search); if(null!=search){ printWriter.println("2"); return; }else{ emailModel.setTitle(EmailModel.registerTitle); emailModel.setText(EmailModel.register+authCode); } }else{ //找回密碼 emailModel.setTitle(EmailModel.findPwdTitle); emailModel.setText(EmailModel.findPwdText+authCode); } System.out.println("郵箱驗證碼:"+authCode); emailModel.setReceiverEmail(receiverEmail); int result= EmailUtils.sendEmail(emailModel); session.setAttribute(receiverEmail+"#EmailCode",authCode);//註冊驗證碼 printWriter.println(result); }else if("doRegister".equals(action)){ //註冊驗證 String authCode=request.getParameter("authCode");//驗證碼 String sessionCode=(String)session.getAttribute(userName+"#EmailCode");//註冊驗證碼 if(null==sessionCode){ printWriter.println("3"); //驗證碼爲空,請先獲取郵箱驗證碼 }else if(!sessionCode.equals(authCode)){ printWriter.println("2"); //驗證碼錯誤 }else{ User user=new User(); user.setUserName(userName); user.setNickName(userName); user.setPassword(password); int result=userService.addUser(user); printWriter.println(result); //驗證成功 } } }catch (Exception e){ e.printStackTrace(); return ; }}
2.上傳頭像mysql
protected void doGet(HttpServletRequest request, HttpServletResponse response) { try { // 配置上傳參數 PrintWriter printWriter = response.getWriter(); String fileName = ""; DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); String userId = request.getParameter("userId"); String type = request.getParameter("type"); if (null != userId && !"".equals(userId)) { List<FileItem> formItems = upload.parseRequest(request); for (FileItem item : formItems) { // 迭表明單數據 if (!item.isFormField()) { String fileName2 = item.getName(); //重置亂碼中文 fileName = RandomUtil.randomString(5) + (fileName2.substring(fileName2.indexOf("."))); String filePath = String.format("%s/%s", SystemConfig.fileUploadPath, fileName); File storeFile = new File(filePath); item.write(storeFile); // 保存文件到硬盤 } } if (null == type || "".equalsIgnoreCase(type)) { String userUpload = SessionUtils.getUserUpload(Integer.valueOf(userId), request); if (null != userUpload && !"".equalsIgnoreCase(userUpload)) { userUpload = userUpload + fileName + ","; } else { userUpload = fileName + ","; } SessionUtils.setUserUpload(Integer.valueOf(userId), userUpload, request); printWriter.println("0"); } else if ("headPic".equalsIgnoreCase(type)) {//頭像 SessionUtils.setUserHeadPic(Integer.valueOf(userId), fileName, request); printWriter.println("0"); } } else { printWriter.println("0"); //用戶信息未找到 } printWriter.close(); } catch (Exception ex) { ex.printStackTrace(); }}
3.我的聊天(發送消息及讀取消息實現)ajax
//消息採用讀取數據庫模式實現,並不是socket或者其餘通信主件 public void doGet(HttpServletRequest request, HttpServletResponse response) { HttpSession session=request.getSession(); PrintWriter printWriter=response.getWriter(); String action = request.getParameter("action"); User user= SessionUtils.getUser(request); if ("sendMsg".equals(action)) { //發送消息 String message=request.getParameter("message"); String receiveId=request.getParameter("receiveId"); Chat chat=new Chat(); chat.setUserId(user.getId()); chat.setUserName(user.getNickName()); chat.setMessage(message); chat.setStatus(0); chat.setReceiveId(Integer.valueOf(receiveId)); chat.setCreateTime(DateUtil.formatDateTime(new Date())); Posts posts=new Posts(); posts.setReleaseId(user.getId()); chatService.addChat(chat); printWriter.println("0"); session.setAttribute(user.getId()+":"+receiveId,message); //添加推送 Notice notice=new Notice(); notice.setNoticeUserId(Integer.valueOf(receiveId)); notice.setUserId(user.getId()); notice.setNoticeType(3); notice.setIsRead(0); Notice isExtis=noticeService.getNotice(notice); if(null==isExtis){ System.out.println("添加推送"); notice.setUserName(user.getUserName()); notice.setPostTitle(message); noticeService.addNotice(notice); //添加通知 }else{ System.out.println("有未讀消息,不添加推送"); } }else if ("getMsg".equals(action)) { //獲取消息 String sendUserId=request.getParameter("sendUserId"); //發送人id String receiveId=request.getParameter("receiveId"); //接收人 Chat chat=new Chat(); chat.setUserId(Integer.valueOf(sendUserId)); chat.setReceiveId(Integer.valueOf(receiveId)); chat.setStatus(0); List<Chat> list=chatService.getChatList(chat); if(list.size()>0){ printWriter.println(JSONUtil.toJsonStr(list)); for(Chat c:list){ c.setStatus(1); chatService.updateChat(c); } }else{ printWriter.println(""); } printWriter.close(); }} //前端jsp頁面代碼 <div class="qqBox"> <div class="BoxHead"> <div class="headImg"> <img src="images/upload/${userInfo.headPic}" /> <!--當前本身--> <input value="images/upload/${loginUser.headPic}" id="loginUserHeadPic" type="hidden"/> <input value="${loginUser.id}" id="sendUserId" type="hidden"/> <!--對方好友--> <input value="images/upload/${userInfo.headPic}" id="userInfoHeadPic" type="hidden"/> <input value="${userInfo.id}" id="receiveId" type="hidden"/> </div> <div class="internetName">${userInfo.userName}</div> </div> <div class="context"> <div class="conRight"> <div class="Righthead"> <div class="headName">${userInfo.nickName}</div> <div class="headConfig"> <ul> <li><img src="images/chat/20170926103645_06.jpg"/></li> <li><img src="images/chat/20170926103645_08.jpg"/></li> <li><img src="images/chat/20170926103645_10.jpg"/></li> <li><img src="images/chat/20170926103645_12.jpg"/></li> </ul> </div> </div> <div class="RightCont"> <ul class="newsList"> </ul> </div> <div class="RightFoot"> <div class="footTop"> <ul> <li><img src="images/chat/20170926103645_31.jpg"/></li> <li class="ExP"><img src="images/chat/20170926103645_33.jpg"/></li> <li><img src="images/chat/20170926103645_35.jpg"/></li> <li><img src="images/chat/20170926103645_37.jpg"/></li> <li><img src="images/chat/20170926103645_39.jpg"/></li> <li><img src="images/chat/20170926103645_41.jpg" alt="" /></li> <li><img src="images/chat/20170926103645_43.jpg"/></li> <li><img src="images/chat/20170926103645_45.jpg"/></li> </ul> </div> <div class="inputBox"> <textarea id="dope" name="" rows="" cols=""></textarea> <button class="sendBtn">發送(s)</button> </div> </div> </div> </div></div>
4.關注 粉絲 喜歡統計sql
//每一項根據用戶id單獨統計在組裝數據 public void getLikeFansNul(Integer userId,HttpServletRequest request){ String fansSql="select count(id) from t_likeuser where likeUserId="+userId; int fansNum= JDBCUtils.getCount(fansSql); String likeSql="select count(id) from t_likeuser where userid="+userId; int likeNum= JDBCUtils.getCount(likeSql); String collectSql="select count(id) from t_collection where userid="+userId; int collectNum= JDBCUtils.getCount(collectSql); CountsVo countsVo=new CountsVo(fansNum,likeNum,collectNum); SessionUtils.setCountsVo(countsVo,request);}
1: 收藏和關注纔會有通知
2:收藏本身的推文沒有通知
3:聊天消息推送若是有一條當前人發送的消息未讀時,只保存一條未讀消息
4:消息採用讀取數據庫模式實現,並不是socket或者其餘通信主件,後期會單獨起一個項目完成socket版本及其餘三方開源的通訊主件版本,敬請關注及更新
數據庫