1. 程式人生 > >JSP+SQL實現留言功能(含留言回覆功能),附原始碼

JSP+SQL實現留言功能(含留言回覆功能),附原始碼

一、開發環境

MyEclipse8.6+WampServer+MySQL

這裡用到Apache,是因為我用了他來連線資料庫。

專案中還用到了一個jar包,mysql-connector-java-5.1.13-bin.jar。

二、思路介紹

下圖是回覆資訊在資料庫中儲存的基本結構:

這是博主自己想的一種思路,適合一些小型網站,如果需要在大型網站上運用,需要你們考慮下如何解決資料超載的問題。

三、資料庫結構

資料庫名稱:blog

表內容:

(1)、user表

Field Type Comment
uid int(3) NOT NULL 使用者編號(主鍵
name varchar(10) NOT NULL 名字
pwd varchar(12) NOT NULL 密碼
status int(1) NOT NULL 身份
condi int(1) NOT NULL 使用者狀態
friend varchar(100) NULL 使用者好友
userimg varchar(100) NULL 頭像路徑
sex int(1) NOT NULL 性別(0未填寫1男2女)0下同
age int(3) NOT NULL 年齡
constellation int(2) NOT NULL 星座
addres varchar(15) NOT NULL 地址
bloodtype varchar(5) NOT NULL 血型
sign varchar(25) NOT NULL 頭像

(2)usermessage表

Field Type Comment
MessageId int(5) NOT NULL 留言id(主鍵
wuid int(5) NOT NULL 留言者id
guid int(5) NOT NULL 被留言者id
MessageText text NOT NULL 留言內容
ReplyMessage text NULL 回覆內容
writetime varchar(20) NOT NULL 留言時間

三、html模組

(1)、通過form表單跳轉到留言功能預處理模組的serverlet,表單模組程式碼如下

<form action="SelectMessageServlet" method="post">
<!-- 
手動更改value的值測試效果
value根據自己專案更改為value="<%=userid %>"的形勢 
注:記得刪除註釋,不然jsp編譯會出錯
-->
<input type="hidden" name="userid" value="1"/>
<input class="formliinput" type="submit" value="留言"/>
</form>

注:錶帶中的uid是當前登入使用者的ID資訊(記得刪除註釋,不然編譯會出錯

(2)SelectMessageServlet程式碼介紹

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		request.setCharacterEncoding("utf-8");
		//獲取當前登入使用者的id
		String id=request.getParameter("userid");
		MyBean a=new MyBean();
		//查詢該使用者所有留言資訊
		ResultSet messageinfo=a.SelectUserMessage(id);
		//查詢該使用者的留言回覆資訊
		Map map=a.selectUserReplyMessage(id);
		//當前使用者的id,name等基本資訊
		ResultSet userinfo=a.selectoneuser(id);
		//查詢所有使用者資訊,不含密碼
		ResultSet alluserinfo=a.selectallusernopwd();
		HttpSession session=request.getSession();
		session.setAttribute("nowuserinfo", userinfo); 
		session.setAttribute("messageinfo", messageinfo);
		session.setAttribute("userallinfo", alluserinfo);
		session.setAttribute("replymessage", map);
		try {
			a.con().close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		request.getRequestDispatcher("message.jsp").forward(request, response);
}

MyBean()方法,程式碼如下:

package control;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Date;
public class MyBean {
	Connection conn;
	public MyBean() {
		this.conn = con();
	}
	public Connection con() {//連結資料庫
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//後面進行了編碼宣告,防止中文亂碼
		String sqlcon = "jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8";
		try {
			conn = DriverManager.getConnection(sqlcon, "root", "");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	public ResultSet selectalluser(){//無引數,查詢所有使用者資訊
		ResultSet a = null;
		String sql="select * from user order by uid";
		Statement st;
		try {
			st=conn.createStatement();
			a=st.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return a;
	}
	public ResultSet selectoneuser(String uid){//帶引數,通過uid查詢使用者資訊
		ResultSet a = null;
		String sql="select * from user where uid='"+uid+"' order by uid";
		Statement st;
		try {
			st=conn.createStatement();
			a=st.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return a;
	}
	public ResultSet selectallusernopwd(){//無引數,查詢所有使用者資訊
		ResultSet a = null;
		String sql="select uid,NAME,userimg from user order by uid";
		Statement st;
		try {
			st=conn.createStatement();
			a=st.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return a;
	}
	public ResultSet SelectUserMessage(String gid){//查詢該使用者所有留言記錄,並按時間排序
		ResultSet rt=null;
		String sql="select * from usermessage where guid="+gid+" order by writetime DESC";
		try {
			Statement st=conn.createStatement();
			rt=st.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}		
		return rt;
	}
	public Map selectUserReplyMessage(String gid){//查詢留言回覆資訊
		ResultSet rs=SelectUserMessage(gid);
		ResultSet userinfo=null;
		String replymessage=null;
		String onereply=null;
		int be = 0,en,rbe = 0,ren;
		int i=1,j=1;
		int alllengthnow=0;
		int lengthnow=0;
		String messageid=null;
		boolean check1=true,check2=true;
		Map map=new HashMap();
		try {
			while(rs.next()){
			replymessage=rs.getString("ReplyMessage");
			if(replymessage!=null){
				messageid=rs.getString("MessageId");
				alllengthnow = replymessage.length();
				j=1;
				en=0;be=0;
				ren=0;rbe=0;
				check1=true;
				check2=true;
				while(check1){
					i=1;
					rbe=0;
					be=be+0;
					en=replymessage.indexOf(">",be+1);
					if(en==-1) check1=false;
					if(be==0)
						onereply=replymessage.substring(be,en+1);
					else
						onereply=replymessage.substring(be+1,en+1);
					lengthnow=onereply.length();
					check2=true;
					while(check2){
						rbe=rbe+0;
						ren=onereply.indexOf("<",rbe+1);
						if(ren==-1&&ren!=lengthnow-1)
							ren=lengthnow-1;
						if(ren==-1)check2=false;
						if(rbe==0)
							map.put(messageid+":"+j+"."+i, onereply.substring(rbe, ren));
						else
							map.put(messageid+":"+j+"."+i, onereply.substring(rbe+1, ren));
						userinfo=selectoneuser(map.get(messageid+":"+j+".1").toString());
						if(userinfo.next()){
							map.put(messageid+":"+j+"."+(i+1), userinfo.getString("name"));
							map.put(messageid+":"+j+"."+(i+2), userinfo.getString("userimg"));
						}else{
							map.put(messageid+":"+j+"."+(i+1), "");
							map.put(messageid+":"+j+"."+(i+2), "");
						}
						i++;
						if(ren==lengthnow-1)check2=false;
						rbe=ren;
					}
					j++;
					if(en==alllengthnow-1)check1=false;
					be=en;
				}
			}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return map;
	}
	public int insertmessage(String wid,String gid,String content){
		int i=0;
		String time=gettimenow();
		String sql="insert into usermessage (wuid,guid,MessageText,writetime) values (?,?,?,?)";
		try {
			PreparedStatement pd=conn.prepareStatement(sql);
			pd.setString(1, wid);
			pd.setString(2, gid);
			pd.setString(3, content);
			pd.setString(4, time);
			i=pd.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return i;
	}
	//根據messageid查詢回覆資訊
	public ResultSet selectReplyByMessageId(String messageid){
		ResultSet end = null;
		String sql="select * from usermessage where MessageId="+messageid;
		Statement st;
		try {
			st = conn.createStatement();
			end=st.executeQuery(sql);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return end;
	}
	//新增留言回覆功能
	public int updatetmessagereply(String messageid,String wid,String content){
		int end=0;
		String sql="update usermessage set ReplyMessage=? where MessageId=?";
		content=content.replaceAll("<", "&lt;");
		content=content.replaceAll(">", "&gt;");
		String time=gettimenow();
		StringBuffer oldMessageReply=new StringBuffer();
		ResultSet oldmessageinfo=selectReplyByMessageId(messageid);
		try {
			if(oldmessageinfo.next()){
				if(oldmessageinfo.getString("ReplyMessage")!=null||oldmessageinfo.getString("ReplyMessage")==""){
				oldMessageReply.append(oldmessageinfo.getString("ReplyMessage"));
				}
				oldMessageReply.append(wid+"<"+content+"<"+time+">");
				PreparedStatement ps=conn.prepareStatement(sql);
				ps.setString(1, oldMessageReply.toString());
				ps.setString(2, messageid);
				end=ps.executeUpdate();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return end;
	}
	public String gettimenow(){//獲取當前系統時間
		Date a=new Date();
		SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dataString=formatter.format(a);
		System.out.println(dataString);
		System.out.println(a.getTime());
		return dataString;
	}
}

注:bean方法中的留言回覆功能,有時間我發一條詳解,2執行完後跳轉至message.jsp

(3)、message.jsp頁面程式碼

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page import="java.sql.ResultSet" %>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>留言板</title>
	<link rel="stylesheet" href="css/bootstrap.min.css">
	<link rel="stylesheet" href="css/message.css">
</head>
<script type="text/javascript" src="js/jquery1111.min.js"></script>
<script type="text/javascript" src="js/bootstrap.min.js"></script>
<script>
var ti;
$(document).ready(
function (){
	$("#userinfo").mouseover(function(){
		$("#usernameshow").fadeIn(200);
	});
	$("#usernameshow").mouseover(function(){
		clearTimeout(ti);
		$("#usernameshow").show();
	});
	$("#usernameshow").mouseout(function(){
		$("#usernameshow").hide();
	});
	$("#userinfo").mouseout(function(){
		$("#usernameshow").stop(false,true);
		ti=setTimeout(function(){
			$("#usernameshow").hide();
		},100);
	});
	$(".messageuserreply").click(function(){
		var a=this.id;
		$("[id$='div"+a+"']").toggle();	
	});
	$(".cancelinput").click(function(){
		$(this).parents(".messageuserreplydiv").hide();
	});
});
</script>
<body>
	  <%
	 	String name="NULLUSER";
	 	ResultSet userinfo=null;
		ResultSet messageinfo=null;
		ResultSet userallinfo=null;
		Map map=new HashMap();
		Iterator it=null;
		Set keySet=null;
		int i=1;
	 	if(session.getAttribute("nowuserinfo")!=null){
	 		userinfo=(ResultSet)session.getAttribute("nowuserinfo");
	 		userinfo.beforeFirst();
	 		userinfo.next();
	 		name=userinfo.getString("name"); 		
	 	}
	 	if(session.getAttribute("messageinfo")!=null){
	 		messageinfo=(ResultSet)session.getAttribute("messageinfo");
	 	}
		if(session.getAttribute("userallinfo")!=null){
			userallinfo=(ResultSet)session.getAttribute("userallinfo");
		}
		if(session.getAttribute("replymessage")!=null){
			map=(Map)session.getAttribute("replymessage");
			keySet=map.keySet();//獲取鍵的集合
			it=keySet.iterator();//迭代鍵的集合
			while(it.hasNext()){
				Object key=it.next();
				Object value=map.get(key);//獲取每個鍵所對應的值
				System.out.println(key+":"+value);
			}
		}
	  %>
	  <div id="bigtop">
	  <div id="top">
	  	<div id="topcontentleft">
	      <div class="topbg">
	      <a>部落格首頁</a>
	      </div>
	      </div>
	  	<div id="topcontentright">
	      <div id="userlogininfo">
	      <span class="welcomeuser">歡迎你,</span>
	      <span id="userinfo"><%=name %></span>
	      <div class="showdivuserinfo">
	      <ul id="usernameshow" style="display:none">
	      <li>個人中心</li>
	      <li>這是測試</li>
	      <li style="border:0px">登出登入</li>
	      </ul>
	  	</div>
	      </div>
	      <div>
	      <ul class="topul">
	      	<li>
	          <div class="nrmessage">訊息中心<span class="badge">3</span></div>
	          </li>
	          <li style="border-right: none"><a href="#">退出登陸</a></li>
	      </ul>
	      </div>
	  	</div>
	  </div>
	  </div>
	<div id="content">
	<div><!-- 留言展示內容 -->
	<div class="MessagecontentBigBox"><!-- 內容外層div -->
	<div class="MessagecontentBigBox-top">
		<font>留言板</font>
	</div>
	<script type="text/javascript">
		function checkdata(){
			var a=document.getElementById("messagecontent").value;
			if(a==null||a==""){
				alert("輸入不能為空!釋出失敗。");
				return false;
			}
		}
	</script>
	<div class="messageinfodiv">
		<div class="publishmessage">
		<form action="AddMessageBy" method="post" onsubmit="return checkdata()">
		<div class="publishmessagein"><textarea maxlength="60" rows="" cols="" id="messagecontent" name="messagecontent"></textarea></div>
		<div class="publishmessagebutton"><input type="submit" value="傳送">&nbsp;&nbsp;
		<input type="reset" value="取消"> </div>
		</form>
		</div>
		<ul>
		<% 
		int idi=1;
		 while(messageinfo.next()){
		String thisuserid=null;
		String thisusername=null;
		String thislogurl=null;
		String thismessagecontent=null;
		String thismessagereply=null;
		String thismessageid=null;
		if(messageinfo.getString("wuid")!=null||messageinfo.getString("wuid")!=""){
			thisuserid=messageinfo.getString("wuid"); 
			while(userallinfo.next()){
				if(userallinfo.getString("uid").equals(messageinfo.getString("wuid"))){
					thisusername=userallinfo.getString("name");
					thislogurl=userallinfo.getString("userimg");
					thismessagecontent=messageinfo.getString("MessageText");
					thismessagereply=messageinfo.getString("ReplyMessage");
					thismessageid=messageinfo.getString("MessageId");
					break;
				}
			}
			userallinfo.beforeFirst();
		}
		%>
		<li class="thismessageinfodiv">
		<img src="<%=thislogurl %>" class="messageuserimg"/>
		<font class="messageusername"><%=thisusername %></font>
		<br/>
		<p class="messageusercontent">
			<c:out value="<%=thismessagecontent %>" escapeXml="true" default="載入失敗,請重試!"></c:out>
		</p>
		<p class="messageusertime"><%=messageinfo.getString("writetime") %></p>
		<font class="messageuserreply" id="<%=idi %>">回覆</font>
		<%
		if(thismessagereply!=null){
		i=1;
		keySet=map.keySet();//獲取鍵的集合
		it=keySet.iterator();//迭代鍵的集合
		//System.out.print(it.hasNext());
		%>
		<div class="messagereplydiv">
		<%
		while(it.hasNext()){
			Object key=it.next();
			Object value=map.get(key);//獲取每個鍵所對應的值
			Object srcurl=map.get(thismessageid+":"+i+".5");
			Object thisname=map.get(thismessageid+":"+i+".4");
			Object thisreplycontent=map.get(thismessageid+":"+i+".2");
			Object thisreplytime=map.get(thismessageid+":"+i+".3");
			System.out.print(thisname);
			if(srcurl==null)break;
		%>
		<img class="messagereplyimg" src="<%=srcurl %>">
		<font class="messagereplyname"><%=thisname %></font>
		<font class="messagereplycontent"><%=thisreplycontent %></font>
		<p class="messagereplytime"><%=thisreplytime %></p>
		<% i++;	} %>
		</div>
		<% } %>
		<div class="messageuserreplydiv" id="replybigdiv<%=idi %>" style="display: none">
		<form action="MessageUserReply" method="post" id="replymessageform">
		<!-- <form action="" method="post" id="replymessageform<%=thismessageid %>"> -->
		<input type="hidden" name="thismessageid" value="<%=thismessageid %>" />
		<textarea rows="" cols="" id="replycontent" name="replycontent"></textarea><br/>
		<input type="submit" value="確定">&nbsp;&nbsp;
		<input type="reset" value="取消" class="cancelinput">
		</form>
		<script>
			$(document).ready(function(){
				$('#replymessageform<%=thismessageid %>').submit(function(){
				$msid=$("#replymessageform<%=thismessageid %> input[name='thismessageid']").val();				
				if($msid!=<%=thismessageid %>){return false;}
				});
			});
		</script>
		</div>
		</li>
		<% idi++; } %>
		</ul>
		
	</div>
	</div>
	</div>
	</div>
</body>
</html>

注:1、id="replybigdiv<%=idi %>"的表單為回覆模組的前端程式碼

(3)發表留言功能,AddMessageBy程式碼介紹。這部分需根據自己的專案靈活更改,我這裡做了一個使用者自己給自己留言的方法。如需要在使用者好友的留言板上留言,需要做一個好友互訪的模組,然後根據這部分程式碼為參考,實現好友互相留言的功能。

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		request.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		HttpSession session=request.getSession();
		ResultSet userinfo = (ResultSet)session.getAttribute("nowuserinfo");
		String wid = null,id = null;
		try {
			userinfo.beforeFirst();
			userinfo.next();
			wid = userinfo.getString("uid");
			id=userinfo.getString("uid");
			userinfo.beforeFirst();
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		String content=request.getParameter("messagecontent");
		MyBean a=new MyBean();
		// uid為當前登入使用者的id,即留言者的id
		//wid為被留言者的id
		//這裡的留言者id和被留言者id為同一個,因為我麼有做好友互動的介面
		//通過好友互動的介面,將好友的id賦值給wid即可
		int end=a.insertmessage(wid, id, content);
		ResultSet messageinfo=a.SelectUserMessage(id);
		ResultSet alluserinfo=a.selectallusernopwd();
		 session.setAttribute("nowuserinfo", userinfo);
		session.setAttribute("messageinfo", messageinfo);
		session.setAttribute("userallinfo", alluserinfo);
		try {
			a.con().close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if(end==1){
			out.print("<script>");
			out.print("alert('留言釋出成功!');");
			out.print("window.location.href='message.jsp';");
			out.print("</script>");
		}else{
			out.print("<script>");
			out.print("alert('Erron!留言失敗!');");
			out.print("window.location.href='message.jsp';");
			out.print("</script>");
		}
	}

(4)、留言回覆功能,MessageUserReply程式碼介紹

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html");
		response.setCharacterEncoding("utf-8");
		request.setCharacterEncoding("utf-8");
		HttpSession session=request.getSession();
		ResultSet userinfo=(ResultSet)session.getAttribute("nowuserinfo");
		String wid = null;
		try {
			userinfo.beforeFirst();
			userinfo.next();
			wid=userinfo.getString("uid");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		String content=request.getParameter("replycontent");
		String messageid=request.getParameter("thismessageid");
		MyBean a=new MyBean();
		int end=a.updatetmessagereply(messageid, wid, content);
		ResultSet messageinfo=a.SelectUserMessage(wid);
		//ResultSet userinfo=a.selectoneuser(wid);
		ResultSet alluserinfo=a.selectallusernopwd();
		Map map=a.selectUserReplyMessage(wid);
		session.setAttribute("nowuserinfo", userinfo);
		session.setAttribute("messageinfo", messageinfo);
		session.setAttribute("userallinfo", alluserinfo);
		session.setAttribute("replymessage", map);
		request.getRequestDispatcher("message.jsp").forward(request, response);
	}

注:Mybean a = new MyBean();中mybean方法在2步驟中

四、css樣式部分

專案中引入了bootstrap.min.css樣式,我這裡就沒有列了,可去起步網官網下載下載。下面我展示的是message.css的內容。

@CHARSET "UTF-8";
*{
	margin:0px;
	padding:0px;
	letter-spacing:0.2em;
}
body{
	line-height: inherit;
	background-image:url(../img/back.jpg);
}
a:link{
	color:#FFF;
	text-decoration:none;
}
a:visited{
	color:#FFF;
	text-decoration:none;
}
a:hover{
	color:#FFF;
	text-decoration:underline;
}
a:active{
	color:#FFF;
	text-decoration:none;
}
#bigtop{
	width: 100%;
    height: 45px;
    background-color: rgba(20, 20, 20, 0.9);
    position: fixed;
    top: 0px;
    left: 0px;
    z-index: 999;
}
#top{
	width:960px;
	height:45px;
	margin:0px auto;
	color:#FFF;
}
#bigtopdiv{
	margin:0px auto;
	height:45px;
}
#topcontent{
	margin:0px auto;
	background-color:#666;
	height:auto;
}
#topcontentleft{
	width:40%;
	height:auto;
	float:left;
}
#topcontentright{
	font-size:12px;
	line-height:45px;
	width: 35%;
	height:45px;
	float:right;
	text-align:left;
}
.topbg{
	float:left;
	line-height:45px;
	cursor: pointer;
}
.topbg a{
}
.topul{
	float:left;
	margin-bottom: 0px;
}
.topul li{
	list-style:none;
	height:45px;
	float:left;
	padding: 2px;
	border-right:2px solid #595353;
}
.topul li:hover{
	background-color:#000000;
}
.topul li div{
	padding:0px 5px;
	height:45px;
}
.topul li div img{
	height:28px;
    vertical-align: middle;
	margin-top:8px;
}
.nrmessage span{
	position: relative;
	left: -3px;
	top: -8px;
}
#userlogininfo{
	height:45px;
	float:left;
	padding:0px 5px;
	border-right:2px solid #595353;
	display:inline-flex;
	display: -webkit-inline-flex;
}
.welcomeuser{
	float: left;
}
#userinfo{
	display: block;
	margin:0px 5px;
	width:auto;
	height:45px;
	padding:0px 10px;
	cursor:pointer;
	background-color:#ff0000;
	color: #ffffff;
	border-bottom:5px solid #5D5D5D;
	box-shadow:0px -8px 8px #000000;
	float: left;
}
#userinfo img{
	height:30px;
	width:30px;
	border-radius:100%;
	margin-right:5px;
	padding-top:7px;
}
#userinfo:hover{
	background-color:#000000;
}
#content{
	width:960px;
	height:auto;
	margin:0px auto;
	margin-bottom:50px;
}
.showdivuserinfo{
	position:absolute;
	color:black;
	margin-top:50px;
	width: 120px;
    z-index: 9999;
    margin-left: 65px;
}
.showdivuserinfo ul{
	width:120px;
	box-shadow: 0px 0px 10px;
	border-radius:5px;
	background-color:rgba(255, 255, 255, 0.93);
}
.showdivuserinfo li{
	list-style:none;
	border-bottom:1px dashed #CCC;
	text-align:center;
	font-size:18px;
	z-index: 100;
	cursor: pointer;
}
.MessagecontentBigBox{
	width:960px;
	margin-top:110px;
	background-color: white;
	padding-bottom: 15px;
}
ul{
	list-style: none;
}
.MessagecontentBigBox-top{
	widows: 100%;
	height: 40px;
	background-color: rgba(236,236,236,0.39);
	padding:13px 0px 0px 5px;
}
.MessagecontentBigBox-top font{
	font-size: 14px;
	font-weight: bold;
}
.messageinfodiv{
	width: 100%;
	margin:0px auto 20px auto;
}
.publishmessage{
	margin: 0px auto 10px auto;
	padding:5px;
}
.publishmessage form{
	margin: 0px auto;
	width: 96%;
}
.publishmessagein{
}
.publishmessagebutton{
	margin-top: 10px;
}
.publishmessagebutton input{
	border:0px;
	background-color: #7B8C9E;
	color: white;
	padding:5px;
}
.publishmessage textarea{
	font-size: 18px;
    letter-spacing: 0.2em;
    width: 100%;
    height: 100px;
    max-width: 100%;
    max-height: 240px;
    min-width: 100%;
    min-height: 70px;
}
.thismessageinfodiv{
	padding: 5px;
	width: 96%;
	border-bottom: 1px solid #CCC;
	margin: 0px auto 5px auto;
}
.messageuserimg{
	width: 50px;
	height: 50px;
	float: left;
	margin-left: 5px;
	border-radius: 5px;
}
.messageusername{
	font-size: 16px;
	margin-left: 5px;
}
.messageusercontent{
	padding-bottom: 5px;
	padding-left: 65px;
	font-size: 18px;
	letter-spacing: 0.3em;
	margin-top: 20px;
    overflow-wrap: break-word;
}
.messageusertime{
	clear: both;
	display: inline;
	padding-left: 60px;
}
.messageuserreply{
	margin-left: 20px;
	color: blue;
	cursor: pointer;
}
.messageuserreplydiv{
	clear: both;
	margin-left:55px;
	padding-bottom: 5px;
}
.messageuserreplydiv textarea{
	width: 320px;
	height:30px;
}
.messageuserreplydiv input{
	margin-top:5px;
}
.messagereplydiv{
	width: 90%;
    border-top: 1px solid #CCC;
    margin: 5px auto 0px auto;
    padding:5px;
}
.messagereplyimg{
	width: 40px;
	height: 40px;
}
.messagereplyname{
	color: blue;
}
.messagereplytime{
	padding-left: 46px;
}
#replycontent{
	height: 80px;
	width: 450px;
	max-height: 160px;
	max-width: 100%;
}

五、執行效果

六、結語

內容有點長,後續我會持續更新,進行縮減。最後感謝大家的支援。如果有什麼問題不懂得或者有更好的建議,歡迎看官評論或私信。如果各位需要整個專案原始碼的,請加qq群在群檔案裡面自行免費下載。群號:100372253

相關推薦

JSP+SQL實現留言功能留言回覆功能原始碼

一、開發環境 MyEclipse8.6+WampServer+MySQL 這裡用到Apache,是因為我用了他來連線資料庫。 專案中還用到了一個jar包,mysql-connector-java-5.1.13-bin.jar。 二、思路介紹 下圖是回覆資訊在資料庫中

idea+maven + spring security +springmvc入門 自定義登入頁面idea如何建立web專案

第一次使用idea,上午在eclipse中 學習了spring security 入門,下午試試在idea中搭建。 剛開始 我以為 直接將eclipse的 檔案 copy過來就行了,結果發現copy過來以後 各種報錯。 後來把m

DedeCMS二次開發聯動篩選功能實現多選功能

多選效果如下圖:具體操作說明:一、注意,首先備份以下兩個檔案\include\arc.listview.class.php\include\extend.func.php多選版檔案下載連結:https 多選效果如下圖:   具體操作說明: 1、注意,首先備份以下兩個檔

使用vue+element實現表格的新增、編輯下拉框、刪除功能Vue開發二

幾天前,需要做一個需求:新增一個xml檔案時,新增數量不確定、屬性相同的xml標籤,想了想可以用表格做啊,屬性相同,使用統一的表頭,下面的屬性值只是進行增刪改不就行了,就類似於mysql給表裡填資料一樣。 可是目前似乎還沒有表格的直接增刪改一行的操作,那要怎麼實現呢?於是,通過上網以及自己的思考

Java實現剪下複製貼上功能不同文字域的判斷

通過焦點事件判斷不同的文字域 不同文字域焦點事件的處理 tp1.addFocusListener(new FocusListener(){ @Override public void focu

利用Mybaties註解動態Sql實現查詢功能表名不固定

最近開發過程中,資料庫的表名是日表,每次查詢需要動態傳入表名,所以需要動態拼接sql 一.mapper介面,呼叫provider類,該類返回sql(RecordProvider需要自己新建一個class) 二.Provider.class,利用StringBuid

(轉)織夢DedeCMS二次開發聯動篩選功能實現多選功能

原文:http://www.dedejs.com/html/article-571-1.html點選開啟連結織夢預設的列表頁沒有篩選功能,但有時候我們做產品列表頁的時候,產品的欄位比較多,很多人都需要用到篩選功能,這樣可以讓使用者更方便的找到自己所需要的東西,實現這個聯動篩選

網站首頁菜單欄實現

range sub sea light odin charset ctype settime hide <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="

問題7:如何實現用戶的歷史記錄功能最多n條

NPU app while less ase 退出 添加 數字 pri 實例:制作猜字遊戲,添加歷史記錄功能,顯示用戶最近猜過的數字 解決方案:使用容量為n的隊列存儲歷史記錄 使用標準庫colections中的deque,一個雙端循環隊列 程序退出前,可以使用pick

日常學習隨筆-用鏈表的形式實現普通二叉樹的新增、查找、遍歷前、中、後序等基礎功能側重源碼+說明

新增 rabl super 例子 信息 count TP title 處理 一、二叉樹 1、二叉樹的概念 二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree),其次序不能任意顛倒。 2、性質

vue 導航菜單的實現二級菜單

lec func switch route -a abs sheng nav fun <template> <div class="nav"> <div class="nav-a"> <ul class

小程式購物車功能支援手動輸入數量以及側邊欄和列表欄聯動的實現

小組剛完成一個小程式專案,第一版正式釋出了,過程中也遇到了很多問題,這裡記錄一下我負責的模組中的購物車功能的實現過程。後期再把其他小夥伴的模組也一併貼上來分析一下,自己也學習一下他們的獨門技能!效果圖如下: 在這裡,計數器、購物籃做成元件用於複用,由於左右聯動的功能

SQL實現 模糊查詢

在進行資料庫查詢時,有完整查詢和模糊查詢之分。 一般模糊查詢語句如下: SELECT 欄位 FROM 表 WHERE 某欄位 Like 條件 其中關於條件,SQL提供了四種匹配模式: 1,% :表示任意0個或多個字元。可匹配任意型別和長度的字元,有些情況下若是中文

mvp實現Xrecyclerview的上下拉和購物車功能仿餓了麼

  首先先匯入咱們的依賴 implementation 'com.android.support:design:28.0.0' implementation 'com.google.code.gson:gson:2.8.5' implementation 'cn.b

利用tkinter實現簡單計算器功能不使用eval函式

利用tkinter實現簡單計算器功能(不使用eval函式) 一、思路 tkinter: 佈置主介面; 上部為數字顯示介面; 下部為數字鍵與功能鍵介面; 邏輯: 程式只考慮兩個運算元進行計算的情況,不考慮複雜情況 展示:

jsp實現上傳圖片即時顯示效果功能

<script> function setImagePreview() { var docObj=document.getElementById("doc"); var imgObjPreview=document.getElementById("preview

Android用SharedPreferences儲存資料實現註冊和登入功能首次安裝預設開啟註冊記住密碼

註冊介面xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

一文搞定信用評分卡模型-Python、SAS和R的實現程式碼和視訊

感謝關注天善智慧,走好資料之路↑↑↑歡迎關注天善智慧,我們是專注於商業智慧BI,人工智慧AI,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定!對商業智慧BI、大資料分析挖掘、機器學習,python,R等資料領域感興趣的同學加微信:tstoutiao,邀請你進入資料愛好者交

react + antd 實現列印功能踩了不少坑

最近在有網頁列印需求,嘗試了一下react的列印功能,遇到了不少的坑: 1.react本身有一些列印的元件,但都不好用,都是基於window.print(),但是window.print()如果直接列印的話,沒有樣式。處理直接當前網頁的body設定為你要列印的區域,但是當你取消列印的時候你會發現整個網頁都被

react + antd 實現打印功能踩了不少坑

set wid 但是 pan ets req 問題: 我們 posit 最近在有網頁打印需求,嘗試了一下react的打印功能,遇到了不少的坑: 1.react本身有一些打印的組件,但都不好用,都是基於window.print(),但是window.print()如果直接打印