QBlog

This blog will record the growth associated with the Autumn Garden distance and the history of the development progress and other relevant circumstances
Bulletin
Welcome to Autumn Garden official blog, please: download and use CYQBlog system, and make your comments and Recommendations.
Article Archive
Article
爱说说技术原理:前后台参数约定及逻辑代码
2011/4/26 23:51:20

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

总结:

本节的后台逻辑代码就到此结束。

当然“爱说说”后面扩展和完善了很多,本文就不纠结的一个一个讲了,

只把大体功能讲完,就开源了,大伙再细看细节方面代码。

下一节我们讲客户端调用及优化等注意事项,敬请关注。

 

Autumn Garden is QBlog the official site, created by the passing autumn, based on the framework data layers developed cyqdata support multi-user, multi-language, multi-database (access, mssql, oracle), directory level url and other powerful blog system
 LoveSpeak   Browse(6038)   Comment(0)   Tag 爱说说,秋色园,技术原理,前后台参数约定及逻辑代码
:Register
  
Copyright © 2010-2020 power by CYQ.Blog - Autumn v2.0 All Rights Reserved