您现在的位置是:首页 > 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);
}
}
本文标签:
很赞哦! ()
相关教程
图文教程
从PHP的模板引擎看Discuz模板机制
此文转自第七期,看看人家写的东西。鉴于对PHP的熟悉度及以后的维护,最近想把那个ASP的分类信息网改一下,前台基本改版 完毕,使用了fleaPHP提供的架构(对比了
ubuntu安装Discuz的步骤方法
1,安装数据库和Web服务器这个步骤请记住MySql的密码。另外可以安装MySQL到图形管理界面:2,安装Zend框架4,解压
discuz的MVC结构分析
Discuz软件经解压后产生的三个文件夹中的一个叫upload的成为网站的根目录。里面的内容可以在某些网站上在线阅读。也可以离线在本地阅读,如用VS.Php for Visual Studio。
discuz表情提取方法
discuz将应用的表情生成了一个js文件,在forumdata/cache/下,叫smilies_var.js,这个文件是根据后台数据库生成的一个表情数组,里面有两个数组
相关源码
-
(自适应响应式)瓷砖大理石装修建材类网站pbootcms模板html5模板本模板基于PbootCMS开发,针对瓷砖、大理石等建材行业特点进行优化设计。采用响应式布局技术,确保产品展示效果在不同设备上都能合理呈现。模板特别强化了石材纹理的视觉表现力,帮助建材企业更好地展示产品质感。查看源码 -
响应式帝国cms7.5NBA黑色体育资讯模板下载本模板为体育新闻媒体、报道机构设计,采用帝国CMS7.5内核开发,具备完整的资讯发布、体育日历、数据展示功能。响应式布局确保在手机端呈现实时资讯和图文内容查看源码 -
响应式pbootcms模板新闻资讯博客自媒体门户网站行业通用解决方案为新闻资讯、自媒体博客打造的响应式网站模板,同时支持企业门户、行业资讯等多场景快速适配。通过简单的图文替换即可实现跨行业转型,显著降低建站成本。查看源码 -
(PC+WAP)红色驾校培训学车在线预约源码下载基于PbootCMS内核开发的驾校培训专用网站模板,深度适配驾驶培训行业展示需求。采用PC与移动端同步响应设计,单一后台统一管理内容数据,更换图文素材后可快速转变为其他行业网站。查看源码 -
(自适应)英文外贸电子设备网站模板三级子目录基于PbootCMS内核开发的响应式英文网站模板,为外贸企业打造,支持多行业快速适配。通过简洁高效的代码架构,帮助企业低成本构建专业海外形象,实现更好客户触达与订单转化。查看源码 -
(自适应)光伏测试仪器电站运维设备网站源码免费下载本模板为光伏检测设备与电站运维服务企业设计,采用PbootCMS内核开发,具备完整的设备展示、技术文档管理及客户服务功能模块。通过自适应结构与SEO优化框架,有效提升企业在移动端和搜索引擎中的专业形象。查看源码
| 分享笔记 (共有 篇笔记) |