国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

Discuz .net版本中的短消息系統(tǒng)第1/2頁(yè)

2024-07-10 13:20:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在Discuz中,消息可以分為公用消息(管理后臺(tái) --> 其他 -->公共消息管理)如下:

Discuz .net版本中的短消息系統(tǒng)第1/2頁(yè)

另外還有批量短消息發(fā)送(用戶管理):

Discuz .net版本中的短消息系統(tǒng)第1/2頁(yè)

以及個(gè)人用戶時(shí)的發(fā)送:

Discuz .net版本中的短消息系統(tǒng)第1/2頁(yè)

 

而在discuz中,短信息只用到了一張表:dnt_pms

Discuz .net版本中的短消息系統(tǒng)第1/2頁(yè)


其字段說(shuō)明如下:

復(fù)制代碼 代碼如下:


pmid:自遞增的id
msgfrom:發(fā)送者的用戶名,若為系統(tǒng)消息則為“系統(tǒng)”。
msgfromid:發(fā)送者的id
msgto:接收者的用戶名
msgtoid:接收者的id
folder: 0、收件箱,1、發(fā)件箱,2、草稿箱
new:是否是新消息,未讀,1;0已讀
subject:標(biāo)題
postdatetime:發(fā)送時(shí)間
message:消息內(nèi)容


看下公用信息部分的函數(shù):

復(fù)制代碼 代碼如下:


/// <summary>
/// 得到公共消息數(shù)量
/// </summary>
/// <returns>公共消息數(shù)量</returns>
public int GetAnnouncePrivateMessageCount()
{
return Utils.StrToInt(DbHelper.ExecuteScalar(CommandType.Text, "SELECT COUNT(pmid) FROM [" + BaseConfigs.GetTablePrefix + "pms] WHERE [msgtoid] = 0").ToString(), 0);
}


/// <summary>
/// 獲得指定用戶的短信息列表
/// </summary>
/// <param>每頁(yè)顯示短信息數(shù)</param>
/// <param>當(dāng)前要顯示的頁(yè)數(shù)</param>
/// <returns>短信息列表</returns>
public IDataReader GetAnnouncePrivateMessageList(int pagesize, int pageindex)
{
string sql = "";
if(pageindex <= 1)
{
sql = string.Format("SELECT TOP {0} * FROM [{1}pms] WHERE [msgtoid] = 0 ORDER BY [pmid] DESC", pagesize, BaseConfigs.GetTablePrefix);
}
else
{
sql = string.Format("SELECT TOP {0} * FROM [{1}pms] WHERE [msgtoid] = 0 AND [pmid] < (SELECT MIN([pmid]) FROM (SELECT TOP " + (pageindex - 1) * pagesize + " [pmid] FROM [{1}pms] WHERE [msgtoid] = 0 ORDER BY [pmid] DESC) AS tblTmp) ORDER BY [pmid] DESC", pagesize, BaseConfigs.GetTablePrefix);
}

IDataReader reader = DbHelper.ExecuteReader(CommandType.Text, sql);
return reader;
}


可見(jiàn):msgtoid=0為判斷是否公用信息的條件。

而在注冊(cè)部分發(fā)送一條歡迎的信息到新用戶的收件箱中,歡迎信息只有一條,而公用信息可以有很多條,每個(gè)注冊(cè)的用戶如果后臺(tái)設(shè)置了發(fā)送歡迎消息,則都會(huì)執(zhí)行以下代碼:

復(fù)制代碼 代碼如下:


PrivateMessageInfo privatemessageinfo = new PrivateMessageInfo();

string curdatetime = Utils.GetDateTime();
// 收件箱
privatemessageinfo.Message = config.Welcomemsgtxt;
privatemessageinfo.Subject = "歡迎您的加入! (請(qǐng)勿回復(fù)本信息)";
privatemessageinfo.Msgto = userinfo.Username;
privatemessageinfo.Msgtoid = uid;
privatemessageinfo.Msgfrom = PrivateMessages.SystemUserName;
privatemessageinfo.Msgfromid = 0;
privatemessageinfo.New = 1;
privatemessageinfo.Postdatetime = curdatetime;
privatemessageinfo.Folder = 0;
PrivateMessages.CreatePrivateMessage(privatemessageinfo, 0);


而其批量發(fā)送短消息:

Discuz .net版本中的短消息系統(tǒng)第1/2頁(yè)



       執(zhí)行方法也是讓我感到奇怪,居然是:比如我選擇了乞丐,而乞丐這個(gè)等級(jí)有10萬(wàn)用戶,則取得這10W用戶的數(shù)據(jù),一條條執(zhí)行插入。暴汗……這樣算法以及實(shí)現(xiàn)確實(shí)簡(jiǎn)單了很多,但會(huì)員一多,要經(jīng)常清理這些數(shù)據(jù)。這也是為什么我們看到discuz的論壇經(jīng)常一段時(shí)間需要清理短消息的原因。建議批量發(fā)送只對(duì)等級(jí)較高,數(shù)量較少的用戶使用。同時(shí)在使用過(guò)程中,不明白為什么在“批量短消息發(fā)送”中的“文件箱”有“收件箱”、“發(fā)件箱”、“草稿箱”3種,這里應(yīng)該只有“收件箱”比較合適,或者這里根本就不該出現(xiàn)這個(gè)“文件箱”。

批量發(fā)送的代碼如下:

復(fù)制代碼 代碼如下:


private void BatchSendSM_Click(object sender, EventArgs e)
{
#region 批量短消息發(fā)送

if (this.CheckCookie())
{
string groupidlist = Usergroups.GetSelectString(",");

if (groupidlist == "")
{
base.RegisterStartupScript( "", "<script>alert('請(qǐng)您先選取相關(guān)的用戶組,再點(diǎn)擊提交按鈕');</script>");
return;
}

int percount = 10; //每多少記錄為一次等待
int count = 0; //當(dāng)前記錄數(shù)
// GetUserNameListByGroupid為取得選中的用戶組的所有用戶的id和用戶名
foreach (DataRow dr in DatabaseProvider.GetInstance().GetUserNameListByGroupid(groupidlist).Rows)
{
DatabaseProvider.GetInstance().SendPMToUser(username.Replace("'", "''"), userid, dr["username"].ToString().Replace("'", "''"), Convert.ToInt32(dr["uid"].ToString()), int.Parse(folder.SelectedValue), subject.Text, Convert.ToDateTime(postdatetime.Text), message.Text);
if (count >= percount)
{
Thread.Sleep(3500);
count = 0;
}
count++;
}
base.RegisterStartupScript( "PAGE", "window.location.href='global_sendSMtogroup.aspx';");
}

#endregion
}

//SendPMToUser函數(shù)如下:
public void SendPMToUser(string msgfrom, int msgfromid, string msgto, int msgtoid, int folder, string subject, DateTime postdatetime, string message)
{
DbParameter[] parms =
{
DbHelper.MakeInParam("@msgfrom", (DbType)SqlDbType.NVarChar,50, msgfrom),
DbHelper.MakeInParam("@msgfromid", (DbType)SqlDbType.Int, 4, msgfromid),
DbHelper.MakeInParam("@msgto", (DbType)SqlDbType.NVarChar,50, msgto),
DbHelper.MakeInParam("@msgtoid", (DbType)SqlDbType.Int, 4, msgtoid),
DbHelper.MakeInParam("@folder", (DbType)SqlDbType.SmallInt, 2, folder),
DbHelper.MakeInParam("@subject", (DbType)SqlDbType.NVarChar,60, subject),
DbHelper.MakeInParam("@postdatetime", (DbType)SqlDbType.DateTime,8, postdatetime),
DbHelper.MakeInParam("@message",(DbType)SqlDbType.NText, 0,message)
};
string sql = "INSERT INTO [" + BaseConfigs.GetTablePrefix + "pms] (msgfrom,msgfromid,msgto,msgtoid,folder,new,subject,postdatetime,message) " +
"VALUES (@msgfrom,@msgfromid,@msgto,@msgtoid,@folder,1,@subject,@postdatetime,@message)";
DbHelper.ExecuteNonQuery(CommandType.Text, sql, parms);
sql = "UPDATE [" + BaseConfigs.GetTablePrefix + "users] SET [newpmcount]=[newpmcount]+1 WHERE [uid] =@msgtoid";
DbHelper.ExecuteNonQuery(CommandType.Text, sql, parms);
}


有一句語(yǔ)句是用于users用戶表中的一個(gè)字段,而用戶表中有兩個(gè)字段跟短消息是相關(guān)的:

       不明白這里為什么要用兩個(gè)字段,用newpmcount一個(gè)字段就可以判斷是否有新消息了,如果為0說(shuō)明沒(méi)有新消息,而查看消息后也只需要對(duì)newpmcount進(jìn)行操作,并不需要對(duì)newpm也進(jìn)行操作。公用消息并不會(huì)對(duì)這兩個(gè)字段進(jìn)行操作。

詳細(xì)如下,根據(jù)自己見(jiàn)解做了修改,在會(huì)員閱讀信息之后的具體操作大家應(yīng)該都清楚,就不寫那么仔細(xì)。

Discuz .net版本中的短消息系統(tǒng)第1/2頁(yè)

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 赤峰市| 深州市| 康乐县| 苗栗县| 山东省| 房产| 逊克县| 大英县| 固镇县| 宾川县| 会昌县| 永丰县| 揭东县| 静宁县| 馆陶县| 舒城县| 保德县| 民乐县| 邵阳县| 玉山县| 临夏县| 仙游县| 洛阳市| 城步| 宜丰县| 开阳县| 古浪县| 阜城县| 绥中县| 铁岭县| 社会| 尼勒克县| 抚松县| 深泽县| 邢台市| 桂平市| 奉新县| 蕲春县| 宜良县| 郓城县| 浮梁县|