爱说说技术原理:前后台参数约定及逻辑代码(三)
上一節:"愛說說"技術原理:與TXT交互及MDataTable對Json的功能擴展?中,
?
我們解決了TXT數據存儲和Json的交互問題,本節,看一下后臺的業務邏輯:
?
愛說說:http://speak.cyqdata.com/?[當前版本已增加了音樂和表情]
?
先看Page_Load事件:
??????public?override?void Page_Load()??????? {
??????????? if (day == 0)//首次初始化
??????????? {
??????????????? day = Now.Day;
??????????? }
????????????switch?(GetInt("t"))
??????????? {
??????????????? case 1://添加信息
??????????????????? if (PostBufferOK(0.05))//同一IP3秒提交一次
??????????????????? {
??????????????????????? outHtml = Add(Get("n"), Get("v"), GetInt("pid"));
??????????????????? }
??????????????????? break;
??????????????? case 2://刪除信息
??????????????????? outHtml = Del(GetInt("v"));
??????????????????? break;
??????????????? case 3://獲取更多信息
??????????????????? outHtml = Select(GetInt("v"), GetInt("s"));
??????????????????? break;
??????????????? case 4://獲取最新消息
??????????????????? outHtml = Select(GetInt("v"));
??????????????????? break;
??????????? }
??????? }
說明:通過分支,調用了不同的方法,最后通過outHtml輸出Json到客戶端。
?
下面進行詳細的分支解說:
?
一:數據提交:[用戶發布消息或回應消息時提交的數據]
?
參數約定:
類型參數:t=1
文本參數:v="這是提交的內容";
昵稱參數:n="路過秋天"
回應參數:pid=-1,[回應時帶回應消息的ID,非回應則為-1]
?
邏輯代碼:
??????? /// <summary>??????? /// 發布消息
??????? /// </summary>
????????public string?Add(string?nickName,?string?body,?int?pid)
??????? {
????????????MDataRow?row = Table.NewRow();
??????????? int maxID = MaxID;
??????????? row.Set(0, maxID);
??????????? row.Set("ParentID", pid);
??????????? row.Set("UserID", IP.Replace(".",string.Empty));
??????????? row.Set("NickName", nickName);
??????????? row.Set("Body", body);
??????????? row.Set("CreatedOn", Now);
??????????? Table.Rows.Add(row);//內存表加一行
??????????? AppendText(row.ToJson());//寫入TXT文本一行
????????????return?maxID.ToString();
??????? }
?
二:數據刪除:[用戶刪除指定ID數據]
?
參數約定:
類型參數:t=2
行ID參數:v=88 [被刪除行的ID]
?
邏輯代碼
??????? /// <summary>??????? /// 刪除消息
??????? /// </summary>
????????public string?Del(int?id)
??????? {
????????????MDataRow?row = Table.FindRow("ID", Op.Equal, id);
??????????? if (row != null)
??????????? {
??????????????? RemoveText(row.ToJson());//刪除文本一行
??????????????? Table.Rows.Remove(row);//刪除內存表一行
??????????? }
????????????return?id.ToString();
??????? }
?
三:數據加載[首次加載及點擊“瀏覽更多時”加載]
?
參數約定:
類型參數:t=3
值ID參數:v=id [最小ID,加載時都是取的最新的數據,每次都從后面取,所以比較最小ID]
分頁參數:s=20[每次20條消息]
?
邏輯代碼
????????public string?Select(int?minID,?int?pageSize)??????? {
??????????? Op op = minID < 1 ? Op.None : Op.Small;//Small就是"<"號了
????????????return?Table.Select(1, pageSize, true, "ID", op, minID).ToJson();
??????? }
?
四:定時數據加載[定時多少秒取一次數據]
?
參數約定:
類型參數:t=4
值ID參數:v=id,[最大ID,每次根據最大ID進行查詢最新消息]
?
邏輯代碼
????????public string?Select(int?maxID)??????? {
??????????? if (maxRowID >= maxID)//下面的Big就是">"號了
??????????? {
????????????????return?Table.Select(1, 60, true, "ID", Op.Big, maxID).ToJson();
??????????? }
????????????return?string.Empty;
??????? }
?
五:總體規劃[其它邏輯代碼]
?
上面四點,是比較重要四個邏輯,接下來補全一些旁支代碼。?
1:全局的定義:
????????private static?int maxRowID = 0;//行ID????????private static?MDataTable?_Table = null;//今天的數據表
????????private static?int day = 0;//今天
說明:
maxRowID,這是為了保證每條數據都有一個不重復的ID。
_Table:定義為靜態的,簡單的就叫內存表。
day:由于TXT文本只保存一天數據,提交時需要判斷是過天,如果是,需要新建新的TXT。?
?
2:方法屬性
?
2.1:內存表:
????????public?MDataTable?Table
??????? {
??????????? get
??????????? {
??????????????? if (_Table == null || day != Now.Day)//首次/緩存失效/第二天
??????????????? {
??????????????????? if (_Table != null)
??????????????????? {
??????????????????????? _Table.Rows.Clear();//第二天,清除前一天數據行
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? day = Now.Day;
??????????????????? }
??????????????????? //嘗試加載文件
??????????????????? _Table =?MDataTable.LoadFromJson(LoadText());//從文本加載
??????????????????? if (_Table.Columns.Count == 0)
??????????????????? {
??????????????????????? _Table.Columns.Add("ID", SqlDbType.Int);//ID標識
??????????????????????? _Table.Columns.Add("ParentID", SqlDbType.Int);//>0說明是回貼
??????????????????????? _Table.Columns.Add("UserID", SqlDbType.Int);
??????????????????????? _Table.Columns.Add("NickName", SqlDbType.NVarChar);
??????????????????????? _Table.Columns.Add("Body", SqlDbType.NVarChar);//內容
??????????????????????? _Table.Columns.Add("CreatedOn", SqlDbType.DateTime);//創建日期
??????????????????????? AppendText(_Table.Columns.ToJson());//首行寫表架構信息
??????????????????? }
??????????????? }
????????????????return?_Table;
??????????? }
??????? }
2.2:最大行ID
????????public?int?MaxID??????? {
??????????? get
??????????? {
??????????????? if (maxRowID > 0)//正常狀態
??????????????? {
??????????????????? maxRowID++;
??????????????? }
??????????????? else if (_Table != null && _Table.Rows.Count > 0)//緩存失效
??????????????? {
??????????????????? maxRowID = int.Parse(Convert.ToString(_Table.Rows[_Table.Rows.Count - 1][0].Value)) + 1;
??????????????? }
??????????????? else//第一次
??????????????? {
??????????????????? maxRowID = 1;
??????????????? }
????????????????return?maxRowID;
??????????? }
??????? }
2.3:文件的保存路徑:這個不多解釋了
????????public string?FilePath
??????? {
??????????? get
??????????? {
??????????????? string path = AppDomain.CurrentDomain.BaseDirectory + "txtFile/" + Now.ToString("yyyyMM") + "/";
??????????????? if (!Directory.Exists(path))
??????????????? {
??????????????????? Directory.CreateDirectory(path);
??????????????? }
??????????????? path = path + Now.Day + ".txt";
??????????????? if (!File.Exists(path))
??????????????? {
??????????????????? File.Create(path).Close();
??????????????? }
????????????????return?path;
??????????? }
??????? }
3:MDataTable?的Select函數介紹:可以方便查詢滿足條件的行
??????? /// <summary>
??????? /// 表查詢[支持分頁與單個條件]
??????? /// </summary>
??????? /// <param name="pageIndex">頁索引</param>
??????? /// <param name="pageSize">每頁多少條</param>
??????? /// <param name="reverse">反轉排序</param>
??????? /// <param name="column">條件列</param>
??????? /// <param name="op">條件符號</param>
??????? /// <param name="value">條件過濾值</param>
??????? /// <returns>返回新的MDataTable</returns>
????????public?MDataTable?Select(int?pageIndex,?int?pageSize,?bool?reverse,?string?column,?Op?op,?object?value)
?
最后總結:
?
本節的后臺邏輯代碼就到此結束。
當然“愛說說”后面擴展和完善了很多,本文就不糾結的一個一個講了,
只把大體功能講完,就開源了,大伙再細看細節方面代碼。
?
下一節我們講客戶端調用及優化等注意事項,敬請關注。
版權聲明:本文原創發表于博客園,作者為路過秋天,原文鏈接:
http://www.cnblogs.com/cyq1162/archive/2011/04/27/2030446.html
總結
以上是生活随笔為你收集整理的爱说说技术原理:前后台参数约定及逻辑代码(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 红魔电竞平板如何截图 红魔电竞平板截图教
- 下一篇: scala N99(18-28)