您现在的位置是:首页 > cms教程 > Discuz教程Discuz教程

discuz!nt投票功能写法实例

赵道霄2025-07-01Discuz教程已有人查阅

导读可能要写一个投票系统,把discuz!net里面的代码放到这里来参考参考,感觉它的投票功能做的有点简单,数据库里面相关的就两个主从表,不过想想也可以理解

可能要写一个投票系统,把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, 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, 80, "");
polloptioninfo.Displayorder = Utils.StrIsNullOrEmpty(itemdisplayorder) ? i + 1 : Utils.StrToInt(itemdisplayorder, 0);
DatabaseProvider.GetInstance().UpdatePollOption(polloptioninfo);
optionexist = true;
break;
}
}
if (!optionexist) //如果当前选项不存在,表示该选项为新添选项
{
PollOptionInfo polloptioninfo = new PollOptionInfo();
polloptioninfo.Displayorder = Utils.StrIsNullOrEmpty(itemdisplayorder) ? i + 1 : Utils.StrToInt(itemdisplayorder, 0);
polloptioninfo.Pollid = pollinfo.Pollid;
polloptioninfo.Polloption = Utils.GetSubString(itemname, 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.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.Trim() == username)
{
allowvote = false;
}
if (userid == -1 && Utils.InArray(tid.ToString(), ForumUtils.GetCookie("dnt_polled")))
{
allowvote = false;
}
if (votername.IndexOf(' ') == -1)
{
sbVoters.Append("<a href=\"userinfo.aspx?username=");
sbVoters.Append(Utils.UrlEncode(votername.Trim()));
sbVoters.Append("\">");
sbVoters.Append(votername);
sbVoters.Append("</a>");
}
else
{
sbVoters.Append(votername.Substring(0, votername.LastIndexOf(".") + 1).Trim().Replace(" ", string.Empty) + "]");
}
sbVoters.Append(" ");
}
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);
}
}

本文标签:

很赞哦! ()

相关源码

  • 帝国cms7.5大型游戏资讯门户网站源码免费下载本模板基于帝国CMS7.5内核开发,为大型游戏资讯门户网站设计。模板自带响应式手机版,适配多种终端设备。内容架构针对游戏行业特点优化,支持游戏资讯、评测、攻略等内容类型的发布与管理。查看源码
  • (PC+WAP)蓝色钢材加工建筑装修施工材料网站模板下载为钢材加工企业设计的PbootCMS响应式模板,采用PC+WAP双端适配技术,数据实时同步。简洁大气的蓝色工业风格设计,突出钢材加工行业特性,其他制造业用户更换图文内容即可快速应用。查看源码
  • (自适应响应式)HTML5建筑工程公司建筑集团网站模板下载基于PbootCMS内核开发的响应式建筑行业网站模板,为建筑工程公司、建筑集团等企业打造,通过简洁大气的设计风格展现企业专业形象。查看源码
  • 帝国CMS中小学生知识点试题练习题考试源码下载基于帝国CMS后台管理系统,支持在线修改联系信息、网站参数等配置,操作流程简洁明了。专注于中小学教育领域,集成知识点总结、试题练习、考试资讯等学习资源,为师生提供全面的在线学习支持与服务。查看源码
  • (PC+WAP)中英双语户外用品帐篷装备pbootcms网站模板下载这款基于PbootCMS开发的中英文双语模板专为户外装备行业设计,适配PC和移动设备。模板采用现代化设计风格,突出户外产品的功能性和实用性,帮助企业建立专业的国际化展示平台。查看源码
  • (PC+WAP)红色厨具厨房用品设备pbootcms模板源码下载为厨具设备企业设计的响应式网站模板,采用PbootCMS内核开发,适用于商用厨房设备、家用厨具、厨房用品等企业展示。模板包含产品展示、新闻动态、案例中心等标准模块,助您快速搭建专业级行业网站。查看源码
分享笔记 (共有 篇笔记)
验证码:

本栏推荐