"爱说说"技术原理:前后台参数约定及逻辑代码(三)

上一节:"爱说说"技术原理:与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

时间: 2024-11-29 00:28:08

"爱说说"技术原理:前后台参数约定及逻辑代码(三)的相关文章

&quot;爱说说&quot;技术原理:前端Javascript优化技巧(四)

上一节:爱说说技术原理:前后台参数约定及逻辑代码 中,讲解了"爱说说"的后台简单的逻辑处理代码.   本节,看一下前端的逻辑及优化事项[爱说说:http://speak.cyqdata.com/ ]   前言说明: 1:前端没有使用JQ,采用原生的XmlHttp做为异步请求. 2:前端代码就不多贴了,直接查看页面源文件就能看到所有的代码了.   以下讲一下"爱说说"在这个过程中优化过的注意事项: [PS:事隔这么久,好多都忘了,只能靠点回忆代码来写了]   一:基础

&quot;爱说说&quot;技术原理:与TXT交互及MDataTable对Json的功能扩展(二)

关于爱说说在技术选型的文章见:"爱说说"技术原理方案的定选思考过程   本篇将讲述"爱说说"比较重大的技术问题点及解决手段:   爱说说:http://speak.cyqdata.com/   杂说几句: 一开始,原本是打算在秋式开源团队找一JS人才来引导前台页面的呈现的,毕竟本人在JS还停留在原始的编码阶段,于是当时聊了一下. 再后来,接下来几天,由于秋式开源团队内部管理上有点小调整,还有新开任务小组的事,连续忙了几天,"爱说说"就也停了几天.

分页技术原理与实现之Java+Oracle代码实现分页(二)_java

紧接着上篇-分页技术原理与实现之分页的意义及方法(一) ,本篇继续分析分页技术.上篇讲的是分页技术的简单原理与介绍,这篇深入分析一下分页技术的代码实现. 上篇最后讲到了分页的最佳实现是在数据库层进行分页,而且不同的数据库有不同的分页实现,比如Oracle是用三层sql嵌套实现分页的.MySQL是用limit关键字实现的(上篇已讲到). 这篇以Java+Oracle为基础,讲解代码层的实现. 就如平时我们很在分页中看到的,分页的时候返回的不仅包括查询的结果集(List),而且还包括总的页数(pag

分页技术原理与实现之无刷新的Ajax分页技术(三)_AJAX相关

紧接着上篇-分页技术原理与实现之Java+Oracle代码实现分页(二) ,本篇继续分析分页技术.上篇讲的是分页技术的代码实现,这篇继续分析一下分页技术的效果控制. 上篇已经用代码简单的实现了一个分页.但是我们都看到,代码中每次通过servlet请求取得结果集后,都会转向到一个jsp页面显示结果,这样每次查询页面都会刷新一下,比如查询出现结果集后要查看第三页,页面就会刷新一下.这样页面给人的效果感觉就会有点不舒服,所以我们希望能够在通过条件查询结果集后无论访问哪一页,页面都不会刷新,而只是结果集

分页技术原理与实现之无刷新的Ajax分页技术(三)

紧接着上篇-分页技术原理与实现之Java+Oracle代码实现分页(二) ,本篇继续分析分页技术.上篇讲的是分页技术的代码实现,这篇继续分析一下分页技术的效果控制. 上篇已经用代码简单的实现了一个分页.但是我们都看到,代码中每次通过servlet请求取得结果集后,都会转向到一个jsp页面显示结果,这样每次查询页面都会刷新一下,比如查询出现结果集后要查看第三页,页面就会刷新一下.这样页面给人的效果感觉就会有点不舒服,所以我们希望能够在通过条件查询结果集后无论访问哪一页,页面都不会刷新,而只是结果集

秋色园QBlog技术原理解析:Web之页面处理-内容填充(八)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三) --介绍如何实现无后缀URL 4: 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序 5: 秋色园QBlog技术原理解析:Module之页面基类设计(五) --介绍创建

秋色园QBlog技术原理解析:性能优化篇:access的并发极限及超级分库分散并发方案(十六)

上节回顾:   上节 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五) 中, 介绍了 秋色园QBlog 在性能优化方面,从技术的优化手段,开始步入数据库设计优化,并从数据的使用情况上进行了分析,从而将文章内容进行分离,得到新的分表,由于内容比较大,进而分了库,达到一种基础减压.   本节内容:   本节将介绍秋色园 QBlog 的Super分库方案,以及何以如此Super分库的原因.   描述说明:   在进行上了上节的分库方案后,虽然感觉一度秋色园QBlog的访

秋色园QBlog技术原理解析:认识整站处理流程(二)

在上一节 秋色园QBlog技术原理解析:开篇:整体认识(一) 中,   我们了解了 秋色园 的整体结构,包括文件目录及文件的结构及作用.   本节,将解析 秋色园 的业务处理流程: 看一下Bin目录都有哪些内库,如下图:   以一个简单的请求来看一下,秋色园各dll[即各个项目]之间是怎么分工处理的:   1:用户访问 秋色园 如:http://www.cyqdata.com/   2:UrlRewrite.dll:第一时间接受请求,根据各种规则判断,将请求往下仍   3:Module.dll:

秋色园QBlog技术原理解析:独创的多语言翻译机制(九)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三) --介绍如何实现无后缀URL 4: 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序 5: 秋色园QBlog技术原理解析:Module之页面基类设计(五) --介绍创建