您现在的位置是:首页 > 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);
}
}
本文标签:
很赞哦! ()
相关教程
图文教程
discuz全局数组变量后台各项设置教程
$_G 保存了Discuz中所有的预处理数据缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可。Discuz! 中所有的缓存保存在 $_G[cache] 中
Discuz的NT的LLServer架构设计介绍
在开发LLServer的同时,我一直在跟进测试企业版的相应LLServer客户端,目前这部分代码已测试完毕并提交的DiscuzNT产品中,会跟随较新的源码包一并发布。
discuz x3.1论坛搬家换域名的方法
请关闭论坛,尤其是数据备份和还原时请不要操作论坛。进入后台→站长→数据库→备份,备份成功以后,数据保存在 data/backup_**。
Discuz! 7.1 & 7.2远程代码执行漏洞分析
Discuz!新版本7.1与7.2版本中的showmessage函数中eval中执行的参数未初始化,可以任意提交,从而可以执行任意PHP命令。
相关源码
-
(自适应响应式)HTML5建筑工程公司建筑集团网站模板下载基于PbootCMS内核开发的响应式建筑行业网站模板,为建筑工程公司、建筑集团等企业打造,通过简洁大气的设计风格展现企业专业形象。查看源码 -
帝国cms7.5模板情感文学名言名句心情文章类源码下载带手机本模板基于帝国CMS7.5开发,为情感文学类网站设计。整体风格温馨雅致,布局合理清晰,特别适合建设情书分享、文学作品展示类网站。模板采用响应式设计,能够自动适配各种终端设备。查看源码 -
pbootcms模板(自适应)花店鲜花花卉园艺网站源码一款基于PbootCMS内核开发的花店鲜花配送与花卉园艺企业网站模板。该模板采用响应式设计,自动适配手机、平板等移动设备,确保用户在任何设备上都能获得优质浏览体验。查看源码 -
工商注册财务代理记账类自适应pbootcms网站工商注册、财务代理记账企业打造的数字化门户模板,基于PbootCMS内核深度开发。采用前沿响应式架构,无缝适配手机端触控交互与PC端展示需求查看源码 -
(PC+WAP)蓝色新能源环保太阳能光伏模板pbootcms下载新能源环保行业网站解决方案为太阳能光伏系统企业打造的专业网站模板,助力新能源企业高效展示产品与服务PbootCMS内核开发,源码开放可修改PC与手机端自适应设计查看源码 -
pbootcms响应式蓝色旅游旅行社pbootcms网站源码下载为旅游公司、旅行社定制的响应式网站模板,聚焦旅游线路展示、景点推荐及预约服务场景。采用PbootCMS内核开发,自适应技术确保PC与手机端数据实时同步查看源码
| 分享笔记 (共有 篇笔记) |
