- 相关文章 (13)
- QBlog隐藏技巧 (2)
- 爱说说系列 (4)
- QBlog 开源发布 (3)
- QBlog版本发布 (8)
- QBlog 模板制作教程 (6)
- QBlog开发者视频教程 (6)
- 秋色园技术原理解析 (21)
- 现在还是ACCESS吗
- 日本超人気のスーパーコピーブランド激安通販専門店! ┏━━━━━2024年人気最高品質━━━━━┓ ◎━ 腕時計、バッグ、財布、アクセサリ ━◎最新入荷! 商品の数量は多い、品質はよい、 高品質のブランドコピーを超激安な価格で販売しています。 ★ 100%品質を保証する。 ★ 送料は無料です(日本全国)! 税関の没収する商品は再度無料にして発送します!
- 啊哈
- スーパーコピーブランド専門ショップ時計 バッグ 財布N級品販売通販 全品送料無料!! 弊社は価値をつけてルイヴィトンを販売して、シャネル 、グッチなど。 ◆2018年は最も新型に人気があって、新しい素材の商品到着! 人気ブランド品大注目 ◆信用の第1、風格は多くて、品質は良いです! ◆運賃の無料(日本全国)が予約購入することを期待しています! ◆弊社の商品は絶対的な自信があります。 ぜひ、見てくださいね!! 海外スーパーコピーのスーパーコピー バッグ、アクセサリー スーパーコピー時計、貴金属の(リサイクル品)のスーパーコピー販売買取
- ルイヴィトン 財布スーパーコピー ようこそ ルイヴィトン スーパーコピー販売商店へいらっしゃいませ! 真心込めて最高 レベルのスーパーコピールイヴィトン偽物ブランド品をお届けしています。 安全税関対策+ 素早い配送+随時の在庫補給+丁寧な対応+スーパーコピー販売業界最低価格に挑戦 ! 当店は業界最高品質に挑戦!全商品はプロの目にも分からないルイヴィトン 財布スーパーコピーです。 ルイヴィトン財布コピー、ルイヴィトン 財布 ブランド偽物など世界 有名なバックコピー商品が満載! 当店のスーパーコピー商品は他店よりも質が高く、金額も安くなっております。 ご購入する度、ご安心とご満足の届けることを旨にしております よろしくお願いします ありがとうございます (*^__^*)
- 可以
- 不错,博主是大神,膜拜中
- 44
- 顶起来!一页文字,几载求索
- ACESS 我也是深恶痛绝,但还是不得不用
- 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三)(31569)
- 调查:是否支持秋色园QBlog走进开源博客之路(30640)
- 绑定一级域名(顶级域名)到秋色园QBlog博客教程(28379)
- 秋色园QBlog技术原理解析:开篇:整体认识(一)(27765)
- Windows7下如何安装部署秋色园CYQBlog站点(20051)
- 如何安装部署秋色园CYQBlog站点(19300)
- 开源博客-秋色园QBlog多用户博客系统安装视频教程(19246)
- 秋色园QBlog技术原理解析:Module之基类生命周期-页面加载(七)(19107)
- 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四)(19063)
- CYQ.IIS 无需要安装IIS运行QBlog网站(18744)
- 调查:是否支持秋色园QBlog走进开源博客之路(32)
- 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三)(23)
- 秋色园QBlog技术原理解析:开篇:整体认识(一)(13)
- QBlog开发者视频教程:开篇-开发基础配置与系统运行(一)(13)
- CYQ.IIS 无需要安装IIS运行QBlog网站(13)
- Windows7下如何安装部署秋色园CYQBlog站点(12)
- 开源博客CYQ.Blog 秋色园QBlog 源码下载[免费开放24个下载码](11)
- 如何安装部署秋色园CYQBlog站点(10)
- 开源博客-秋色园QBlog多用户博客系统安装视频教程(10)
- 绑定一级域名(顶级域名)到秋色园QBlog博客教程(10)
上一节:爱说说技术原理:与TXT交互及MDataTable对Json的功能扩展 中,
我们解决了TXT数据存储和Json的交互问题,本节,看一下后台的业务逻辑:
爱说说:http://speak.cyqdata.com/ [当前版本已增加了音乐和表情]
先看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>
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>
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条消息]
逻辑代码
{
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查询最新消息]
逻辑代码
{
if (maxRowID >= maxID)//下面的Big就是">"号了
{
return Table.Select(1, 60, true, "ID", Op.Big, maxID).ToJson();
}
return string.Empty;
}
五:总体规划[其它逻辑代码]
1:全局的定义:
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
{
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)
总结:
本节的后台逻辑代码就到此结束。
当然“爱说说”后面扩展和完善了很多,本文就不纠结的一个一个讲了,
只把大体功能讲完,就开源了,大伙再细看细节方面代码。
下一节我们讲客户端调用及优化等注意事项,敬请关注。