zoukankan      html  css  js  c++  java
  • "爱说说"技术原理:前后台参数约定及逻辑代码(三)

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

     

    最后总结:

     

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

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

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

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

  • 相关阅读:
    体验平安免费车身划痕补漆服务
    美股
    SpringBoot 开发环境热部署
    IDEA 报 Unable to import maven project: See logs for details
    docker-compose部署SpringCloud
    将镜像上传到Docker Hub中央仓库中
    创建一个简单的Docker镜像
    hystrix.stream dashboard
    Error creating bean with name 'eurekaAutoServiceRegistration': Singleton bean creation not allowed while singletons
    Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
  • 原文地址:https://www.cnblogs.com/cyq1162/p/2030446.html
Copyright © 2011-2022 走看看