可能要写一个投票系统,把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(" ");
}
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);
}
}