zoukankan      html  css  js  c++  java
  • discuz!nt里的投票代码

    可能要写一个投票系统,把discuz!net里面的代码放到这里来参考参考,感觉它的投票功能做的有点简单,数据库里面相关的就两个主从表,不过想想也可以理解,毕竟是论坛里的投票小功能,没太复杂的需求。

    /// <summary>
       /// 投票操作类
       /// </summary>
       public class Polls
       {

           /// <summary>
           /// 创建一个投票
           /// </summary>
           /// <param name="tid">关联的主题id</param>
           /// <param name="multiple">投票类型, 0为单选, 1为多选</param>
           /// <param name="itemcount">投票项总数</param>
           /// <param name="itemnamelist">投票项目列表</param>
           /// <param name="itemvaluelist">投票项目结果列表</param>
           /// <param name="usernamelist">用户名列表</param>
           /// <param name="enddatetime">截止日期</param>
           /// <param name="userid">用户id</param>
           /// <param name="maxchoices">最多可选项数</param>
           /// <param name="visible">提交投票后结果才可见, 0为可见, 1为投票后可见</param>
           /// <returns>成功则返回true, 否则返回false</returns>
           public static bool CreatePoll(int tid, int multiple, int itemcount, string itemnamelist, string itemvaluelist, string enddatetime, int userid, int maxchoices, int visible)
           {
               string[] itemname = Utils.SplitString(itemnamelist, "\r\n");
               string[] itemvalue = Utils.SplitString(itemvaluelist, "\r\n");
               if ((itemname.Length != itemcount) || (itemvalue.Length != itemcount))
               {
                   return false;
               }

               PollInfo pollinfo = new PollInfo();
               pollinfo.Displayorder = 0;
               pollinfo.Expiration = Utils.GetStandardDateTime(enddatetime);
               pollinfo.Maxchoices = maxchoices;
               pollinfo.Multiple = multiple;
               pollinfo.Tid = tid;
               pollinfo.Uid = userid;
               pollinfo.Visible = visible;

               int pollid = DatabaseProvider.GetInstance().CreatePoll(pollinfo);

               if (pollid > 0)
               {
                   for (int i = 0; i < itemcount; i++)
                   {
                       PollOptionInfo polloptioninfo = new PollOptionInfo();
                       polloptioninfo.Displayorder = i + 1;
                       polloptioninfo.Pollid = pollid;
                       polloptioninfo.Polloption = Utils.GetSubString(itemname[i], 80, "");
                       polloptioninfo.Tid = tid;
                       polloptioninfo.Voternames = "";
                       polloptioninfo.Votes = 0;
                       DatabaseProvider.GetInstance().CreatePollOption(polloptioninfo);
                   }
                   return true;
               }
               else
               {
                   return false;
               }
           }

           /// <summary>
           /// 更新一个投票
           /// </summary>
           /// <param name="tid">关联的主题id</param>
           /// <param name="multiple">投票类型, 0为单选, 1为多选</param>
           /// <param name="itemcount">投票项总数</param>
           /// <param name="polloptionidlist">投票项id列表</param>
           /// <param name="itemnamelist">投票项目列表</param>
           /// <param name="itemdisplayorderlist">投票项目排列顺序列表</param>
           /// <param name="enddatetime">截止日期</param>
           /// <param name="maxchoices">最多可选项数</param>
           /// <param name="visible">提交投票后结果才可见, 0为可见, 1为投票后可见</param>
           /// <returns>成功则返回true, 否则返回false</returns>
           public static bool UpdatePoll(int tid, int multiple, int itemcount, string polloptionidlist, string itemnamelist, string itemdisplayorderlist, string enddatetime, int maxchoices, int visible)
           {
               //
               string[] itemname = Utils.SplitString(itemnamelist, "\r\n");
               string[] itemdisplayorder = Utils.SplitString(itemdisplayorderlist, "\r\n");
               string[] polloptionid = Utils.SplitString(polloptionidlist, "\r\n");

               if ((itemname.Length != itemcount) || (itemdisplayorder.Length != itemcount))
               {
                   return false;
               }

               PollInfo pollinfo = GetPollInfo(tid);
               pollinfo.Expiration = Utils.GetStandardDateTime(enddatetime);
               pollinfo.Maxchoices = maxchoices;
               pollinfo.Multiple = multiple;
               pollinfo.Tid = tid;
               pollinfo.Visible = visible;

               bool result = false;
               if (pollinfo.Pollid > 0)
               {
                   result = DatabaseProvider.GetInstance().UpdatePoll(pollinfo);
               }
               if (result)
               {
                   PollOptionInfoCollection polloptioninfocoll = GetPollOptionInfoCollection(pollinfo.Tid);
                   int i = 0;

                   //先作已存在的投票选项更新及新添加选项的添加操作
                   bool optionexist;
                   foreach (string optionid in polloptionid)
                   {
                       optionexist = false;
                       foreach (PollOptionInfo polloptioninfo in polloptioninfocoll)
                       {
                           if (optionid == polloptioninfo.Polloptionid.ToString())
                           {
                               polloptioninfo.Pollid = pollinfo.Pollid;
                               polloptioninfo.Polloption = Utils.GetSubString(itemname[i], 80, "");
                               polloptioninfo.Displayorder = Utils.StrIsNullOrEmpty(itemdisplayorder[i]) ? i + 1 : Utils.StrToInt(itemdisplayorder[i], 0);
                               DatabaseProvider.GetInstance().UpdatePollOption(polloptioninfo);
                               optionexist = true;
                               break;
                           }
                       }
                       if (!optionexist) //如果当前选项不存在,表示该选项为新添选项
                       {
                           PollOptionInfo polloptioninfo = new PollOptionInfo();
                           polloptioninfo.Displayorder = Utils.StrIsNullOrEmpty(itemdisplayorder[i]) ? i + 1 : Utils.StrToInt(itemdisplayorder[i], 0);
                           polloptioninfo.Pollid = pollinfo.Pollid;
                           polloptioninfo.Polloption = Utils.GetSubString(itemname[i], 80, "");
                           polloptioninfo.Tid = tid;
                           polloptioninfo.Voternames = "";
                           polloptioninfo.Votes = 0;
                           DatabaseProvider.GetInstance().CreatePollOption(polloptioninfo);
                       }
                       i++;
                   }

                   foreach (PollOptionInfo polloptioninfo in polloptioninfocoll)
                   {
                       //下面代码用于删除已去除的投票项
                       if (("\r\n" + polloptionidlist + "\r\n").IndexOf("\r\n" + polloptioninfo.Polloptionid + "\r\n") < 0)
                       {
                           DatabaseProvider.GetInstance().DeletePollOption(polloptioninfo);
                       }
                   }

                   return true;
               }
               else
               {
                   return false;
               }
           }

           /// <summary>
           /// 通过主题ID获取相应的投票信息
           /// </summary>
           /// <param name="tid">投票主题的id</param>
           /// <returns>投票信息</returns>
           public static PollInfo GetPollInfo(int tid)
           {
               PollInfo pollinfo = new PollInfo();
               IDataReader idatareader = DatabaseProvider.GetInstance().GetPollList(tid);
               while (idatareader.Read())
               {
                   pollinfo.Pollid = Utils.StrToInt(idatareader["pollid"], 0);
                   pollinfo.Displayorder = Utils.StrToInt(idatareader["displayorder"], 0);
                   pollinfo.Expiration = Utils.GetStandardDate(idatareader["expiration"].ToString());
                   pollinfo.Maxchoices = Utils.StrToInt(idatareader["maxchoices"], 0);
                   pollinfo.Multiple = Utils.StrToInt(idatareader["multiple"], 0);
                   pollinfo.Tid = Utils.StrToInt(idatareader["tid"], 0);
                   pollinfo.Visible = Utils.StrToInt(idatareader["visible"], 0);
                   pollinfo.Voternames = idatareader["voternames"].ToString().Trim();
                   break; //目前一个主题只有一个投票,因此在绑定了第一条投票信息后退出
               }
               idatareader.Close();
               return pollinfo;
           }

           /// <summary>
           /// 通过主题ID获取相应的投票信息
           /// </summary>
           /// <param name="tid">主题id</param>
           /// <returns>投票选项集合</returns>
           public static PollOptionInfoCollection GetPollOptionInfoCollection(int tid)
           {
               PollOptionInfoCollection pollinfocoll = new PollOptionInfoCollection();
               IDataReader idatareader = DatabaseProvider.GetInstance().GetPollOptionList(tid);
               PollOptionInfo polloptioninfo;
               while (idatareader.Read())
               {
                   polloptioninfo = new PollOptionInfo();
                   polloptioninfo.Polloptionid = Utils.StrToInt(idatareader["polloptionid"], 0);
                   polloptioninfo.Displayorder = Utils.StrToInt(idatareader["displayorder"], 0);
                   polloptioninfo.Pollid = Utils.StrToInt(idatareader["pollid"], 0);
                   polloptioninfo.Polloption = idatareader["polloption"].ToString().Trim();
                   polloptioninfo.Tid = Utils.StrToInt(idatareader["tid"], 0);
                   polloptioninfo.Voternames = idatareader["voternames"].ToString().Trim();
                   polloptioninfo.Votes = Utils.StrToInt(idatareader["votes"], 0);
                   pollinfocoll.Add(polloptioninfo);
               }
               idatareader.Close();
               return pollinfocoll;
           }

           /// <summary>
           /// 根据投票信息更新数据库中的记录
           /// </summary>
           /// <param name="tid">主题id</param>
           /// <param name="selitemidlist">选择的投票项id列表</param>
           /// <param name="username">用户名</param>
           /// <returns>如果执行成功则返回0, 非法提交返回负值</returns>
           public static int UpdatePoll(int tid, string selitemidlist, string username)
           {
               if (username == "")
               {
                   return -1;
               }

               string[] selitemid = Utils.SplitString(selitemidlist, ",");
               int nowid = 0;
               foreach (string optionid in selitemid)
               {
                   nowid = Utils.StrToInt(optionid, -1);
                   // 如果id结果集合中出现非数字类型字符则认为是非法
                   if (nowid == -1)
                   {
                       return -1;
                   }
               }

               PollInfo pollinfo = GetPollInfo(tid);

               if (pollinfo.Pollid < 1)
               {
                   return -3;
               }

               if (Utils.StrIsNullOrEmpty(pollinfo.Voternames))
               {
                   pollinfo.Voternames = username;
               }
               else
               {
                   pollinfo.Voternames = pollinfo.Voternames + "\r\n" + username;
               }

               DatabaseProvider.GetInstance().UpdatePoll(pollinfo);
               PollOptionInfoCollection polloptioninfocoll = GetPollOptionInfoCollection(pollinfo.Tid);

               foreach (string optionid in selitemid)
               {
                   foreach (PollOptionInfo polloptioninfo in polloptioninfocoll)
                   {
                       if (optionid == polloptioninfo.Polloptionid.ToString())
                       {
                           if (Utils.StrIsNullOrEmpty(polloptioninfo.Voternames))
                           {
                               polloptioninfo.Voternames = username;
                           }
                           else
                           {
                               polloptioninfo.Voternames = polloptioninfo.Voternames + "\r\n" + username;
                           }
                           polloptioninfo.Votes += 1;
                           DatabaseProvider.GetInstance().UpdatePollOption(polloptioninfo);
                       }
                   }
               }

               return 0;
           }

           /// <summary>
           /// 获得与指定主题id关联的投票数据
           /// </summary>
           /// <param name="tid">主题id</param>
           /// <returns>投票数据</returns>
           public static DataTable GetPollOptionList(int tid)
           {

               DataTable dt = new DataTable();
               dt.Columns.Add("name", System.Type.GetType("System.String"));//投票项名称
               dt.Columns.Add("value", System.Type.GetType("System.String"));//票数
               dt.Columns.Add("barid", System.Type.GetType("System.Int32"));
               dt.Columns.Add("barwidth", System.Type.GetType("System.Double"));//显示宽度
               dt.Columns.Add("percent", System.Type.GetType("System.String"));//投票百分比
               dt.Columns.Add("multiple", System.Type.GetType("System.String"));//是否多选
               dt.Columns.Add("polloptionid", System.Type.GetType("System.Int32"));//投票项ID
               dt.Columns.Add("displayorder", System.Type.GetType("System.Int32"));//排序位置
               dt.Columns.Add("votername", System.Type.GetType("System.String"));//投票人名称
               dt.Columns.Add("percentwidth", System.Type.GetType("System.String"));//投票进度条宽度
               PollOptionInfoCollection polloptioninfocoll = GetPollOptionInfoCollection(tid);
               object[] rowVals;

               int multiple = GetPollInfo(tid).Multiple;

               int votesum = 0;
               int maxVote = 0;
               foreach (PollOptionInfo polloptioninfo in polloptioninfocoll)
               {
                   votesum += polloptioninfo.Votes;
                   maxVote = polloptioninfo.Votes > maxVote ? polloptioninfo.Votes : maxVote;
               }
               if (votesum == 0)
               {
                   votesum = 1;
               }
               int i = 0;
               string votername = "";
               //组定数据项
               foreach (PollOptionInfo polloptioninfo in polloptioninfocoll)
               {
                   rowVals = new object[10];
                   rowVals[0] = polloptioninfo.Polloption;
                   rowVals[1] = polloptioninfo.Votes;
                   rowVals[2] = i % 10;
                   rowVals[3] = (((double)(Utils.StrToFloat(polloptioninfo.Votes, 0) * 100 / votesum) / 100) * 200 + 3).ToString("0.00");
                   rowVals[4] = ((double)(Utils.StrToFloat(polloptioninfo.Votes, 0) * 100 / votesum) / 100).ToString("0.00%");
                   rowVals[5] = multiple;
                   rowVals[6] = polloptioninfo.Polloptionid;
                   rowVals[7] = polloptioninfo.Displayorder;

                   if (!Utils.StrIsNullOrEmpty(polloptioninfo.Voternames))
                   {
                       //将投票人字段的数据重新组合成链接字符串
                       foreach (string username in Utils.SplitString(polloptioninfo.Voternames, "\r\n"))
                       {
                           votername += "<a href=\"userinfo.aspx?username=" + Utils.UrlEncode(username.Trim()) + "\">" + username.Trim() + "</a> ";
                       }
                       rowVals[8] = votername;
                       votername = "";
                   }
                   else
                   {
                       rowVals[8] = "";
                   }
                   rowVals[9] = (420*((double) (Utils.StrToFloat(polloptioninfo.Votes, 0)/maxVote))).ToString();
                   dt.Rows.Add(rowVals);
                   i++;
               }
               return dt;
           }

           /// <summary>
           /// 判断是否允许指定用户投票
           /// </summary>
           /// <param name="tid">主题id</param>
           /// <param name="username">用户名</param>
           /// <returns>判断结果</returns>
           public static bool AllowVote(int tid, string username)
           {
               if (username == "")
               {
                   return false;
               }
               string strUsernamelist = DatabaseProvider.GetInstance().GetPollUserNameList(tid);

               // 如果已投票用户uid列表为"" (尚无人投票), 则立即返回true
               if (strUsernamelist.Equals(""))
               {
                   return true;
               }

               // 检查已投票用户uid列表中是否存在指定用户的uid
               string[] usernamelist = Utils.SplitString(strUsernamelist.Trim(), "\r\n");
               int itemcount = usernamelist.Length;
               for (int i = 0; i < itemcount; i++)
               {
                   if (usernamelist[i].Trim() == username)
                   {
                       return false;
                   }
               }
               return true;
           }

           /// <summary>
           /// 获取参与投票者名单
           /// </summary>
           /// <param name="tid">投票的主题id</param>
           /// <param name="userid">当前投票用户id</param>
           /// <param name="username">当前投票用户名</param>
           /// <param name="allowvote">是否允许投票</param>
           /// <returns>参与投票者名单</returns>
           public static string GetVoters(int tid, int userid, string username, out bool allowvote)
           {
               string strUsernamelist = DatabaseProvider.GetInstance().GetPollUserNameList(tid);
               // 如果已投票用户uid列表为"" (尚无人投票), 则立即返回true
               allowvote = true;
               if (strUsernamelist.Equals(""))
               {
                   return "";
               }
               string[] votername = Utils.SplitString(strUsernamelist.Trim(), "\r\n");
               StringBuilder sbVoters = new StringBuilder();
               for (int i = 0; i < votername.Length; i++)
               {
                   if (votername[i].Trim() == username)
                   {
                       allowvote = false;
                   }

                   if (userid == -1 && Utils.InArray(tid.ToString(), ForumUtils.GetCookie("dnt_polled")))
                   {
                       allowvote = false;
                   }

                   if (votername[i].IndexOf(' ') == -1)
                   {
                       sbVoters.Append("<a href=\"userinfo.aspx?username=");
                       sbVoters.Append(Utils.UrlEncode(votername[i].Trim()));
                       sbVoters.Append("\">");
                       sbVoters.Append(votername[i]);
                       sbVoters.Append("</a>");
                   }
                   else
                   {
                       sbVoters.Append(votername[i].Substring(0, votername[i].LastIndexOf(".") + 1).Trim().Replace(" ", string.Empty) + "]");
                   }
                   sbVoters.Append("&nbsp; ");
               }

               return sbVoters.ToString();
           }

           /// <summary>
           /// 得到投票帖的投票类型
           /// </summary>
           /// <param name="tid">主题ID</param>
           /// <returns>投票类型</returns>
           public static int GetPollType(int tid)
           {
               return DatabaseProvider.GetInstance().GetPollType(tid);
           }

           /// <summary>
           /// 得到投票帖的结束时间
           /// </summary>
           /// <param name="tid">主题id</param>
           /// <returns>结束时间</returns>
           public static string GetPollEnddatetime(int tid)
           {
               return DatabaseProvider.GetInstance().GetPollEnddatetime(tid);
           }

       }

  • 相关阅读:
    电脑hosts文件、hosts文件说明、hosts文件域名和ip
    java复制对象属性值、复制值
    查找替换、idea全局搜索、全局替换、全局搜索替换
    谷歌浏览器问题、
    http请求类、RestTemplate、请求工具类
    easypoi导入
    vue下载本地文件、vue下载本地文件报错、vue下载本地文件找不到
    arm汇编指令的条件码
    GNU内嵌汇编
    shell脚本错误:syntax error near unexpected token '$' ''
  • 原文地址:https://www.cnblogs.com/asdio/p/1387359.html
Copyright © 2011-2022 走看看