"爱说说"技术原理:前后台参数约定及逻辑代码(三)
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;
}
}
![复制代码](http://common.cnblogs.com/images/copycode.gif)
![复制代码](http://common.cnblogs.com/images/copycode.gif)
类型参数:t=1
文本参数:v="这是提交的内容";
昵称参数:n="路过秋天"
回应参数:pid=-1,[回应时带回应消息的ID,非回应则为-1]
![复制代码](http://common.cnblogs.com/images/copycode.gif)
逻辑代码:
![复制代码](http://common.cnblogs.com/images/copycode.gif)
/// 发布消息
/// /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();
}
![复制代码](http://common.cnblogs.com/images/copycode.gif)
二:数据删除:[用户删除指定ID数据]
参数约定:
类型参数:t=2
行ID参数:v=88 [被删除行的ID]
逻辑代码
![复制代码](http://common.cnblogs.com/images/copycode.gif)
/// 删除消息
/// /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();
}
![复制代码](http://common.cnblogs.com/images/copycode.gif)
三:数据加载[首次加载及点击“浏览更多时”加载]
参数约定:
类型参数:t=3
值ID参数:v=id [最小ID,加载时都是取的最新的数据,每次都从后面取,所以比较最小ID]
分页参数:s=20[每次20条消息]
逻辑代码
![复制代码](http://common.cnblogs.com/images/copycode.gif)
{
Op op = minID 1 ? Op.None : Op.Small;//Small就是" "号了
return Table.Select(1, pageSize, true, "ID", op, minID).ToJson();
}
![复制代码](http://common.cnblogs.com/images/copycode.gif)
四:定时数据加载[定时多少秒取一次数据]
参数约定:
类型参数:t=4
值ID参数:v=id,[最大ID,每次根据最大ID进行查询最新消息]
逻辑代码
![复制代码](http://common.cnblogs.com/images/copycode.gif)
{
if (maxRowID = maxID)//下面的Big就是" "号了
{
return Table.Select(1, 60, true, "ID", Op.Big, maxID).ToJson();
}
return string.Empty;
}
![复制代码](http://common.cnblogs.com/images/copycode.gif)
五:总体规划[其它逻辑代码]
上面四点,是比较重要四个逻辑,接下来补全一些旁支代码。
1:全局的定义:
private static int maxRowID = 0;//行IDprivate static MDataTable _Table = null;//今天的数据表
private static int day = 0;//今天
说明:
maxRowID,这是为了保证每条数据都有一个不重复的ID。
_Table:定义为静态的,简单的就叫内存表。
day:由于TXT文本只保存一天数据,提交时需要判断是过天,如果是,需要新建新的TXT。
2:方法属性
2.1:内存表:
![复制代码](http://common.cnblogs.com/images/copycode.gif)
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;
}
}
![复制代码](http://common.cnblogs.com/images/copycode.gif)
2.2:最大行ID
![复制代码](http://common.cnblogs.com/images/copycode.gif)
{
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;
}
}
![复制代码](http://common.cnblogs.com/images/copycode.gif)
2.3:文件的保存路径:这个不多解释了
![复制代码](http://common.cnblogs.com/images/copycode.gif)
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;
}
}
![复制代码](http://common.cnblogs.com/images/copycode.gif)
3:MDataTable 的Select函数介绍:可以方便查询满足条件的行
![复制代码](http://common.cnblogs.com/images/copycode.gif)
/// 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://common.cnblogs.com/images/copycode.gif)
最后总结:
本节的后台逻辑代码就到此结束。
当然“爱说说”后面扩展和完善了很多,本文就不纠结的一个一个讲了,
只把大体功能讲完,就开源了,大伙再细看细节方面代码。
下一节我们讲客户端调用及优化等注意事项,敬请关注。
版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:
http://www.cnblogs.com/cyq1162/archive/2011/04/27/2030446.html
优雅的参数校验与全局异常-代码规范的天生落地 代码规范是项目质量的基石,能够帮助开发者和管理者更好的管理/维护项目、专注于推动快速成长的业务、留出更多时间攻坚重难点系统设计。而全局异常和参数校验则是快速开发的利器,本文将结合阿里巴巴开发手册阐述如何定义众所周知的全局异常机制。
作为逻辑动态化的基础,GaiaX 表达式是如何设计的? | GaiaX 开源解读 GaiaX 跨端模板引擎,是在阿里文娱内广泛使用的 Native 动态化方案,其核心优势是性能、稳定和易用。本系列文章《GaiaX 开源解读》,带大家看看过去三年 GaiaX 的发展过程。 GaiaX 开源地址:https://github.com/alibaba/GaiaX
相关文章
- 零散逻辑验证不再烦恼:基于Python和Redis的实践
- 聊聊运营活动的设计与实现逻辑
- (《机器学习》完整版系列)第15章 规则学习——15.6 一阶逻辑公式及“分拆”
- React-Native 之 GD (十九)TabBarItem 逻辑完善 / 关闭筛选菜单滑动手势 / Navigator 掉帧卡顿问题处理
- 《数据库技术原理与应用教程第2版》——3.5信息世界与逻辑模型
- Hystrix降级逻辑中如何获取触发的异常
- QCache 缓存(模板类,类似于map,逻辑意义上的缓存,方便管理,和CPU缓存无关。自动获得被插入对象的所有权,超过一定数量就会抛弃某些值)
- 《数据库技术原理与应用教程(第2版)》——3.5 信息世界与逻辑模型
- 【MySQL】MySQL中的逻辑运算符,位运算符和运算符的优先级
- Oracle逻辑读详解
- 1、IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)