ajax實現的聊天室程序

基於ajax的聊天室程序。程序很簡單,但是涵蓋的內容還是很多的。把做的代碼直接帖出來和大家一起分享了。。
數據庫我用的是MYSQL
drop table if exists chat;
create table chat(
    chat_id 
int(16not null auto_increment,
    chat_name 
varchar(64default null,
    start_time Date 
default null,
    
primary key(chat_id)
)
drop table if exists user;
create table user(
    
user_id int(16not null auto_increment,
    
user_name varchar(64default null,
    start_time Date 
default null,
    
primary key(user_id)
)
drop table if exists message;
create table message(
    message_id 
int(16not null auto_increment,
    chat_id 
int(16not null default '0',
    
user_id int(16not null default '0',
    
user_name varchar(64default null,
    message 
varchar(1024),
    post_time Date 
default null,
    
primary key(message_id)
)

insert into chat values(1,'Beijing','');
insert into chat values(2,'Shanghai','');
insert into chat values(3,'Guangzhou','');
package book.chat.table;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import book.chat.util.DbManager;

public class Chat {
    
private int chatID;
    
private String chatName;
    
private Date startTime;
    
    
public Chat(){}
    
public Chat(int id){
        
this.chatID =id ;
        
if(!FromDb())
            
this.chatID=-1;
    }

    
private boolean FromDb() {
        
int row = -1;
        String sql 
="select * from chat where chat_id="+this.chatID;
        ResultSet rs 
= DbManager.getResultSet(sql);
        
try{
            rs.last();
            row 
= rs.getRow();
            
if(row == 1){
                
this.chatID = rs.getInt("CHAT_ID");
                
this.chatName = rs.getString("CHAT_NAME");
                
this.startTime = rs.getDate("START_TIME");
                
return true;
            }
else
                
return false;
        }
catch(SQLException e){
            e.printStackTrace();
            
return false;
        }
finally{
            DbManager.releaseConnection();
        }

    }

    
public int getChatID() {
        
return chatID;
    }

    
public void setChatID(int chatID) {
        
this.chatID = chatID;
    }

    
public String getChatName() {
        
return chatName;
    }

    
public void setChatName(String chatName) {
        
this.chatName = chatName;
    }

    
public Date getStartTime() {
        
return startTime;
    }

    
public void setStartTime(Date startTime) {
        
this.startTime = startTime;
    }



}

package book.chat.table;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import book.chat.util.DbManager;

public class Message {
    
private int messageID;
    
private int chatID;
    
private int userID;
    
private String userName;
    
private String message;
    
private Date postTime;
    
    
public Message(){}
    
    
public Message(int id){
        
this.messageID =id ;
        
if(!FromDb())
            
this.messageID=-1;
    }

    
private boolean FromDb() {
        
// TODO 自動生成方法存根
        int row = -1;
        String sql 
="select * from message where message_id="+this.messageID;
        ResultSet rs 
= DbManager.getResultSet(sql);
        
try{
            rs.last();
            row 
= rs.getRow();
            
if(row == 1){
                
this.messageID=rs.getInt("MESSAGE_ID");
                
this.chatID = rs.getInt("CHAT_ID");
                
this.userID = rs.getInt("USER_ID");
                
this.userName = rs.getString("USER_NAME");
                
this.message = rs.getString("MESSAGE");
                
this.postTime = rs.getDate("POST_TIME");
                
return true;
            }
else
                
return false;
        }
catch(SQLException e){
            e.printStackTrace();
            
return false;
        }
finally{
            DbManager.releaseConnection();
        }

    }

    
    
public int getChatID() {
        
return chatID;
    }

    
public void setChatID(int chatID) {
        
this.chatID = chatID;
    }

    
public String getMessage() {
        
return message;
    }

    
public void setMessage(String message) {
        
this.message = message;
    }

    
public int getMessageID() {
        
return messageID;
    }

    
public void setMessageID(int messageID) {
        
this.messageID = messageID;
    }

    
public int getUserID() {
        
return userID;
    }

    
public void setUserID(int userID) {
        
this.userID = userID;
    }

    
public String getUserName() {
        
return userName;
    }

    
public void setUserName(String userName) {
        
this.userName = userName;
    }


    
public Date getPostTime() {
        
return postTime;
    }


    
public void setPostTime(Date postTime) {
        
this.postTime = postTime;
    }

}

package book.chat.table;

import java.sql.ResultSet;
import java.sql.SQLException;

import book.chat.util.DbManager;

public class User {
    
private int userID;
    
private String userName;
    
private Date startTime;
    
    
public User(){}
    
    
public User(int id){
        
this.userID =id ;
        
if(!FromDb())
            
this.userID=-1;
    }

    
private boolean FromDb() {
        
int row = -1;
        String sql 
="select * from user where user_id="+this.userID;
        ResultSet rs 
= DbManager.getResultSet(sql);
        
try{
            rs.last();
            row 
= rs.getRow();
            
if(row == 1){
                
this.userID = rs.getInt("USER_ID");
                
this.userName = rs.getString("USER_NAME");
                
this.startTime = rs.getDate("START_TIME");
                
return true;
            }
else
                
return false;
        }
catch(SQLException e){
            e.printStackTrace();
            
return false;
        }
finally{
            DbManager.releaseConnection();
        }

    }

    
public Date getStartTime() {
        
return startTime;
    }

    
public void setStartTime(Date startTime) {
        
this.startTime = startTime;
    }

    
public int getUserID() {
        
return userID;
    }

    
public void setUserID(int userID) {
        
this.userID = userID;
    }

    
public String getUserName() {
        
return userName;
    }

    
public void setUserName(String userName) {
        
this.userName = userName;
    }

}

以上是對應的實體 ,及對應的set,get方法

寫一個連接數據庫的幫助類,要調用時很方便啦 不用寫那些煩人的連接關閉 !

package book.chat.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class DbManager {
    
private static Connection con;
    
public static final String CLASS_NAME="org.gjt.mm.mysql.Driver";
    
public static final String CONNET_URL = "jdbc:mysql://localhost:3306/chat";
    
public static Connection getConnection(){
        
try{
            
//利用反射加載驅動類
            Class.forName(CLASS_NAME);
            
//獲得一個connection
            con = DriverManager.getConnection(CONNET_URL,"root","root");
            
return con;
        }
catch(Exception e){
            e.printStackTrace();
            
return null;
        }

    }
 
    
//傳入查詢DB的SQL語句,返回resultsset
    public static ResultSet getResultSet(String sql){
        
boolean bSuccess = true;
        Statement stmt 
= null;
        ResultSet rs 
= null;
        Connection con 
= getConnection();
        
if(con == null)
            bSuccess 
= false;
        
if(bSuccess){
            
try{
                stmt 
= con.createStatement();
                rs 
= stmt.executeQuery(sql);
            }
catch(Exception e){
                e.printStackTrace();
                bSuccess 
= false;
            }

        }
    
        
if(bSuccess)
            
return rs;
        
else
            
return null;
    }

    
//返回記錄集的總數
    public static int getTotal(String sql){
        ResultSet rs 
= getResultSet(sql);
        
try{
            rs.last();
            
return rs.getRow();
        }
catch(Exception e){
            e.printStackTrace();
            
return 0;
        }
finally{
            releaseConnection();
        }

    }

    
//傳入執行數據更新的語句,返回更新結果集
    public static boolean execute(String sql){
        
boolean bSuccess = true;
        Statement stmt 
= null;
        Connection con 
= getConnection();
        
if(con==null)
            bSuccess 
= false;
        
if(bSuccess){
            
try{
                stmt
=con.createStatement();
                bSuccess 
= stmt.execute(sql);
            }
catch(SQLException e){
                e.printStackTrace();
                bSuccess 
= false;
            }

        }

        
return bSuccess;
    }

    
public static void releaseConnection(){
        
try{
            
if(con!= null)
                con.close();
        }
catch(SQLException e){
            e.printStackTrace();
        }

    }

}

接着來看看歡迎界面吧·····很簡潔,偶不會美工
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="book.chat.table.*" %>
<%@ page import="book.chat.util.*" %>
<%
String path 
= request.getContextPath();
String basePath 
= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>
    
<base href="<%=basePath%>">
    
    
<title>Welcome to chat!</title>
    
<link rel="stylesheet" type="text/css" href="styles.css">
  
</head>
  
  
<body>
   
<form name="chatRoom" action="room.jsp" method="post">
   
<table border="0" width="400px">
   
<tr>
       
<td colspan="2" align="center"><h3>簡單AJAX聊天室</h3></td>
   
</tr>
   
<tr>
       
<td width="200px" class="formPrompt">請輸入你的名字:</td>
       
<!-- 輸入暱稱的文本框 -->
       
<td class="formInput"><input type="text" name="username" class="textInput"></td>
   
</tr>
   
<tr>
       
<td class="formPrompt">請選擇你要進入的房間:</td>
       
<!-- 顯示可選擇的聊天室 -->
       
<td class="formInput">
       
<%=ChatUtil.renderChatroom()%>
   
</tr>
   
<tr>
       
<td></td>
       
<td><input type="submit" name="enter" value="Enter" class="normalButton"/></td>
   
</tr>
  
</body>
</html>
再來看看ChatUtil 
 
package book.chat.util;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import book.chat.table.Chat;

public class ChatUtil {
    
public static String renderChatroom(){
        List result 
= new ArrayList();
        String sql
= "select * from chat";
        ResultSet rs 
= DbManager.getResultSet(sql);
        
        Chat chat 
= new Chat();
        
try{
            
while(rs.next()){
                chat 
= new Chat(rs.getInt("CHAT_ID"));
                result.add(chat);
            }

        }
catch(Exception e){
            e.printStackTrace();
        }

        StringBuffer buf 
= new StringBuffer();
        buf.append(
"<select name="roomlist" size="5" class="textInput">");
        
for(int i=0;i<result.size();i++){
            Chat c 
= (Chat)result.get(i);
            buf.append(
"<option value=""+c.getChatID()+"">"+c.getChatName()+"</option>");
            
        }

        buf.append(
"</select>");
        DbManager.releaseConnection();
    
return buf.toString();    
    }

}

接着是這個styles.css 只做了簡單的處理
/*設置顯示*/
.formPrompt
{
    font-family
:Arial,Helvetica,sans-serif;
    font-size
:10pt;
    color
:#000000;
    TEXT-ALIGN
:right;
    line-height
:17pt;
    while-space
:nowrap;
}

/*設置輸入格式*/
.formInput
{
    font-family
:Arial,Helvetica,sans-serif;
    font-size
:10pt;
    color
:#000000;
    TEXT-ALIGN
:left;
}

/*設置按鈕格式*/
.normalButton
{
    font-size
:9pt;
    font-family
:Arial,Helvetica,Geneva,sans-serif;
    BORDER-LEFT
:#A0AAA0 1px solid;
    BORDER-TOP
:#A0AAA0 1px solid;
    BORDER-RIGHT
:#404440 1px solid;
    BORDER-BOTTOM
:#404440 1px solid;
}

ajax_chat.js 最核心的部分了。。。有註釋有詳細  大家可以自己看了。。。
//聲明發送消息的XMLHttpRequest對象
var sendReq = createAjaxObj();
//聲明發送檢索消息的XMLHttpRequest對象
var receiveReq = createAjaxObj();
//設置上次取回的Message_ID
var lastMessage = 0;
//聲明setTimeout()的返回值
var mTimer;
//聊天室的ID
var chatId;
//用戶的id
var userId;
//startChat()方法:初始化全局變量後,每兩秒鐘向DB中發送一次請求
function startChat(){
    
//將焦點設置到消輸入框中
    document.getElementById('txt_message').focus();
    
//調用initial()方法初始化chatId和userId變量
    initial();
    
//調用getChatText()方法獲得消息
    getChatText();
}

function initial()
{
    chatId 
= document.frmmain.cid.value;
    userId 
= document.frmmain.uid.value;
}

//createAjaxObj()方法創建XMLHttpRequest對象
function createAjaxObj(){
    var httprequest 
= false;
    
if(window.XMLHttpRequest)
    
{
        
//如果是Mozilla,Safari等瀏覽器
        httprequest=new XMLHttpRequest()
        
if(httprequest.overrideMimeType)
            httprequest.overrideMimeType(
'text/xml')
    }
else if(window.ActiverXObject)
    
{
        
//如果是IE瀏覽器
        try{
            httprequest
=new ActiverXObject("Msxml2.XMLHTTP");        
        }
catch(e){
            
try{
                httprequest
=new ActiverXObject("Microsoft.XMLHTTP");
            }
catch(e){
            }

        }
    
    }

    
return httprequest;
}

//getChatText()向DB中發送請求,並獲得最新的消息
function getChatText(){
    
//判斷上次請求的狀態是否完成或者是還未發送請求
    
//alert("sdfsdfsdf");
    if(receiveReq.readyState==4||receiveReq.readyState==0){
        
//發送獲得消息的服務器地址
        var submitURL = "getMessage?chatId="+chatId+"&last="+lastMessage;
        
//建立請求
        receiveReq.open("GET",submitURL,true);
        
//當請求狀態改變時調用handleReceiveChat
        receiveReq.onreadystatechange=handleReceiveChat;
        
//發送請求
        receiveReq.send(null);
    }

}

//新請求的狀態改變時調用
function handleReceiveChat(){
    
//此時請求已經完成
    if(receiveReq.readyState==4){
        
//獲得顯示消息的圖層元素對象
        var chat_div=document.getElementById("div_chat");
        
//獲得返回後的XML文件
        var xmldoc = receiveReq.responseXML;    
        
        
//得到所有的新消息記錄
        var message_nodes = xmldoc.getElementsByTagName("message");
        var n_messages 
= message_nodes.length;
        
//alert(n_messages);
        
//循環每一條新消息,組織成HTML格式數據
        for(var i=0;i<n_messages;i++){
            var user_node 
= message_nodes[i].getElementsByTagName("user");
            var text_node 
= message_nodes[i].getElementsByTagName("text");
            var time_node 
= message_nodes[i].getElementsByTagName("time");
            
//alert(time_node[0].firstChild.nodeValue);
            chat_div.innerHTML+='(<font class="chatUser">'+user_node[0].firstChild.nodeValue+'</font>)&nbsp;said at &nbsp;';
            chat_div.innerHTML
+='<font class="chatTime">'+time_node[0].firstChild.nodeValue+'</font><br />';
            chat_div.innerHTML
+='<span class="title">'+text_node[0].firstChild.nodeValue+'</span><br />';
            chat_div.scrollTop 
= chat_div.scrollHeight;
            
//每循環一條消息,記錄到全局變量lastMessage中
            lastMessage = (message_nodes[i].getAttribute('id'));
        }

        
//獲取數據後,設置2秒鐘後再次調用getChatText()方法
        mTimer = setTimeout('getChatText();',2000);
    }

}
    
//sendChatText()方法向DB中添加消息記錄
function sendChatText(){
    
//如果輸入的消息爲空,提示用戶輸入
    if(document.getElementById('txt_message').value==''){
        alert(
"You have not entered a message");
        
return;
    }

    
//判斷上次發送消息請求的狀態是否完成或是還未發送請求
    if(sendReq.readyState == 4||sendReq.readyState == 0){
        
//保存消息的服務器地址
        var submitURL="sendMessage?cid="+chatId+"&uid="+userId+"&msg="+document.getElementById('txt_message').value;
        
//建立請求連接
        sendReq.open("POST",submitURL,true);
        sendReq.setRequestHeader(
'Content-Type','application/x-www-form-urlencoded');
        
//當請求狀態改變時調用handleSendChat()方法
        sendReq.onreadystatechange = handleSendChat();
        
//發送請求
        sendReq.send(null);
        
//設置提交消息文本框爲空
        document.getElementById('txt_message').value='';
    }

}

//請求狀態改變時調用handleSendChat()方法
function handleSendChat(){
    
//取消間隔獲取數據的方法
    clearInterval(mTimer);
    
//從新獲取調用getChatText()方法
    getChatText();
}

room.jsp 這就是聊天室的主頁面   也很簡潔的·····
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page import="book.chat.table.*" %>
<%@ page import="book.chat.util.*" %>
<%
String path 
= request.getContextPath();
String basePath 
= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%
    
//接收用戶請求中的username的值
    String userName = request.getParameter("username");
    
//如果暱稱爲空,設置爲默認的用戶名
    if(userName==null||userName.equals(""))
        userName
="Guest User";
    
//獲得請求中聊天室ID的值    
    String r = request.getParameter("roomlist");
    
//如果聊天室id爲空,則返回選擇聊天室頁面
    if(r==null||r.equals("")){
        RequestDispatcher dispatcher 
= request.getRequestDispatcher("welcome.jsp");
        dispatcher.forward(request,response);
        
return;
    }

    
int roomID = Integer.parseInt(r);
    Chat room 
= new Chat(roomID);
    User user 
= null;
    
//得到user表中的總的記錄數
    int number = DbManager.getTotal("select user_id from user")+1;
    
//添加user表中的一條記錄
    String insertSQL = "insert into user values(" + number + ",'" + userName + "',NOW())";
    
//執行SQL語句
    DbManager.execute(insertSQL);
    
//釋放DB連接
    DbManager.releaseConnection();
    
//初始化User對象
    user = new User(number);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>
    
<base href="<%=basePath%>">
    
    
<title>Welcome</title>
    
<link rel="stylesheet" type="text/css" href="styles.css">
    
<script type="text/javascript" src="ajax_chat.js">
    
</script>
  
</head>
  
  
<!-- 網頁加載時條用startChat()方法不斷獲取新消息 -->
  
<body onload="javascript:startChat();">
  
<h3>Welcome to 
  
<%
      out.println(room.getChatName());
  
%>
  
</h3>

  
<!-- 該層顯示聊天信息的內容id獲取標識對象的字符串。class設置或獲取對象的類。-->
  
<div id="div_chat" class="chat">    

  
</div>
  
  
<!-- 提交消息的表單 -->
  
<form id="frmmain" name="frmmain" onsubmit="return blockSubmit();">
  
  
<!-- 輸入消息的文本框 -->
  
<input type="text" id="txt_message" name="txt_message" class="textInput" size="80" />

  
<!-- 點擊提交按鈕時調用sendChatText()方法發送消息 -->
  
<input type="button" name="btn_send_chat" id="btn_send_chat" value="Send" class="normalButton" onclick="javascript:sendChatText();"/>
  
  
<!-- 兩個隱藏的字段記錄該聊天室的id和用戶的id -->
  
<input type=hidden name="cid" value="<%=room.getChatID() %>"/>    
  
<input type=hidden name="uid" value="<%=user.getUserID() %>"/>
  
  
</form>
  
</body>
</html>
刷新時獲得消息請求的處理 
package book.chat.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import book.chat.table.Message;
import book.chat.util.DbManager;

public class GetServlet extends HttpServlet {

    
public void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        doPost(request,response);
    }

    
public void doPost(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
//        獲得請求參數中chatId參數的值
        String chatID = request.getParameter("chatId");
        
//獲取請求參數中last參數的值
        String lastID = request.getParameter("last");
        
//如果chatId爲空,則返回
        if(chatID==null||chatID.equals(""))
            
return;
        
//如果lastID爲空則返回
        if(lastID==null||lastID.equals(""))
            
return;
        
//定義保存查詢數據結果的向量
        List result = new ArrayList();
        
//數據庫查詢語句,查詢message表
        String sql = "select message_id from message where chat_id="+chatID+" and message_id >"+lastID;
        
try{
            
//聲明一個message對象
            Message message =null;
            
//執行查詢語句,返回記錄集
            ResultSet rs = DbManager.getResultSet(sql);
            
//循環記錄集,將DB中的數據添加到向量中 
            while(rs.next()){
                message 
= new Message(rs.getInt("MESSAGE_ID"));
                result.add(message);
            }

        }
catch(SQLException e){
            e.printStackTrace();
        }

        
//關閉DB連接
        DbManager.releaseConnection();
        
//設置返回類型爲XML格式
        response.setContentType("text/xml");
        PrintWriter out 
= response.getWriter();
        
//調用parasToXML()方法
        out.print(parasToXML(result));

    }

    
public String parasToXML(List list){
        StringBuffer buf 
= new StringBuffer();
        buf.append(
"<?xml version="1.0" encoding="utf-8"?>");
        buf.append(
"<root>");
        
for(int i=0;i<list.size();i++){
            Message message 
= (Message)list.get(i);
            buf.append(
"<message id=""+message.getMessageID()+"">");
            buf.append(
"<user>"+message.getUserName()+"</user>");
            buf.append(
"<text>"+message.getMessage()+"</text>");
            buf.append(
"<time>"+message.getPostTime()+"</time>");
            buf.append(
"</message>");
        }

        buf.append(
"</root>");
        
return buf.toString();
    }

}

發送消息請求的處理
package book.chat.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import book.chat.table.User;
import book.chat.util.DbManager;

public class SendServlet extends HttpServlet {

    
public void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        doPost(request,response);
    }


    
public void doPost(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        
//獲得請求中cid的值
        String chatID = request.getParameter("cid");
        
//獲得請求中uid的值
        String userID = request.getParameter("uid");
        
//獲得請求中msg的值
        String msg = request.getParameter("msg");
        
//判斷都不爲空
        if(chatID==null||chatID.equals(""))
            
return;
        
if(userID==null||userID.equals(""))
            
return;
        
if(msg==null||msg.equals(""))
            
return;
        User user 
= new User(Integer.parseInt(userID));
        
//插入message表記錄的sql語句
        String insertSQL = "insert into message(chat_id,user_id,user_name,message,post_time) values("+chatID+","+
            user.getUserID()
+",'"+user.getUserName()+"','"+msg+"',NOW())";
        
//執行SQL
        DbManager.execute(insertSQL);
    }


}

最後一個了web.xml的配置    希望大家有個好心情················@_@

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns
="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
    
<servlet>
        
<servlet-name>getMessage</servlet-name>
        
<servlet-class>book.chat.servlet.GetServlet</servlet-class>
    
</servlet>
  
<servlet>
    
<servlet-name>sendMessage</servlet-name>
    
<servlet-class>book.chat.servlet.SendServlet</servlet-class>
  
</servlet>

    
<servlet-mapping>
        
<servlet-name>getMessage</servlet-name>
        
<url-pattern>/getMessage</url-pattern>
    
</servlet-mapping>
  
<servlet-mapping>
    
<servlet-name>sendMessage</servlet-name>
    
<url-pattern>/sendMessage</url-pattern>
  
</servlet-mapping>
</web-app>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章