jfinal实现在线投票系统

基于jfinal的投票系统
1.数据库设计
投票主题表:

-- Create table
create table VOTE_THEME
(
ID VARCHAR2(32),
NAME VARCHAR2(200),
STARTDATE VARCHAR2(10),
ENDDATE VARCHAR2(20),
SFNM VARCHAR2(1) default '0',
YXBJ VARCHAR2(1) default '1',
SCRQ DATE default sysdate,
HEADPIC VARCHAR2(200),
FOOTPIC VARCHAR2(200)
)
;
-- Add comments to the table
comment on table VOTE_THEME
is '投票主题';
-- Add comments to the columns
comment on column VOTE_THEME.NAME
is '主题';
comment on column VOTE_THEME.STARTDATE
is '开始时间';
comment on column VOTE_THEME.ENDDATE
is '截止时间';
comment on column VOTE_THEME.SFNM
is '是否匿名';
comment on column VOTE_THEME.YXBJ
is '有效标记';
comment on column VOTE_THEME.SCRQ
is '生成日期';
comment on column VOTE_THEME.HEADPIC
is '主题图片';
comment on column VOTE_THEME.FOOTPIC
is '底部图片';

投票主题条目:

create table VOTE_THEME_ITEM
(
ID VARCHAR2(32),
NAME VARCHAR2(200),
TYPE VARCHAR2(1),
THEME_ID VARCHAR2(32),
SCRQ DATE default sysdate,
CNUM NUMBER default 1
)
;
-- Add comments to the table
comment on table VOTE_THEME_ITEM
is '投票项目';
-- Add comments to the columns
comment on column VOTE_THEME_ITEM.TYPE
is '1:单选,2:多选;3:手工输入';
comment on column VOTE_THEME_ITEM.CNUM
is '可以选择的个数';

投票条目选项表:

-- Create table
create table VOTE_THEME_ITEM_ANSWER
(
ID VARCHAR2(32),
ITEM_ID VARCHAR2(32),
NAME VARCHAR2(200),
COMMS CLOB,
IMAGE_PATH VARCHAR2(200),
FLV_PATH VARCHAR2(200),
DEPTNAME VARCHAR2(50),
THEME_ID VARCHAR2(32),
ONUM NUMBER,
CNUM NUMBER,
ZGH VARCHAR2(20)
)
;
-- Add comments to the table
comment on table VOTE_THEME_ITEM_ANSWER
is '投票题目选项';


投票管理端代码

package cn.edu.jxut.vote.controller;

import java.io.File;
import java.util.List;

import net.loyin.jFinal.render.excel.ExcelRender;

import org.apache.commons.lang.StringUtils;

import cn.edu.jxut.common.config.GlobalConstants;
import cn.edu.jxut.common.config.PermInterceptor;
import cn.edu.jxut.common.controller.BaseController;
import cn.edu.jxut.common.model.LoginUser;
import cn.edu.jxut.vote.model.Theme;
import cn.edu.jxut.vote.model.ThemeItem;
import cn.edu.jxut.vote.model.ThemeItemAnswer;

import com.jfinal.aop.Before;
import com.jfinal.core.ActionKey;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.plugin.activerecord.Record;
import com.jfinal.upload.UploadFile;
@Before(PermInterceptor.class)
public class VoteManagerController extends BaseController{

@ActionKey("/vote")
public void index() {
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
setAttr("root", this.getRequest().getContextPath());
Theme theme = this.getModel(Theme.class);
Page p = Theme.dao.paginateByExample(theme, "yxbj = '1' and to_date(enddate,'yyyy-MM-dd') >= sysdate ", pageNumber, pageSize, "");
setAttr("page",p);
render("/WEB-INF/vote/index.html");
}
@ActionKey("/vote/add")
public void toAddVote() {
setAttr("root", this.getRequest().getContextPath());
render("/WEB-INF/vote/add.html");
}
@ActionKey("/vote/detail")
public void detail() {
setAttr("root", this.getRequest().getContextPath());
String id = getPara("id");
Theme theme = Theme.dao.findById(id);
List items = theme.getItems();
setAttr("item",items.get(0));
setAttr("theme",theme);
render("/WEB-INF/vote/detail.html");
}
@ActionKey("/vote/export")
public void exportVote(){
String id = getPara("id");

String sql = "select t.id,t.name,i.name as itemname,a.name as answer,(select count(distinct user_id) from vote_user_answer a1" +
" where a1.theme_id = t.id and a1.answer_id = a.id) as answercount" +
" from vote_theme t, vote_theme_item i, vote_theme_item_answer a where t.id = i.theme_id" +
" and i.id = a.item_id and i.theme_id = t.id and t.id = ?";

String[] col = {"投票名称","选项名称","得票数"};
String[] col1 = {"name","answer","answercount"};

List list = Db.find(sql,new Object[]{id});
this.render(new ExcelRender("投票结果.xls",col,col1,list));

}
@ActionKey("/vote/save")
public void voteSave() {
UploadFile headpic = getFile("headpic");
UploadFile footpic = getFile("footpic");
Theme theme = this.getModel(Theme.class);
ThemeItem themeItem = this.getModel(ThemeItem.class);
themeItem.set("name", theme.getStr("name"));
boolean update = true;
if(StringUtils.isEmpty(theme.getStr("id"))){
update = false;
theme.genId();
}
File f = new File(GlobalConstants.filepath+File.separator+theme.getStr("id")+File.separator);
System.out.println("111+++++++++++++++++++++++="+f.getAbsolutePath());
if(!f.exists()){
f.mkdirs();
}
System.out.println("222+++++++++++++++++++++++="+f.getAbsolutePath());
if(headpic!=null){
File uploadFile = headpic.getFile();
uploadFile.renameTo(new File(f.getAbsolutePath()+File.separator+headpic.getFileName()));
System.out.println("+++++++++++++++++++++++++++"+new File(f.getAbsolutePath()+File.separator+headpic.getFileName()).getAbsolutePath());
theme.set("headpic", ("upload"+File.separator+theme.getStr("id")+File.separator+headpic.getFileName()).replace("\\", "/"));
}
if(footpic!=null){
File uploadFile2 = footpic.getFile();
uploadFile2.renameTo(new File(f.getAbsolutePath()+File.separator+footpic.getFileName()));
theme.set("footpic", ("upload"+File.separator+theme.getStr("id")+File.separator+footpic.getFileName()).replace("\\", "/"));
}
if(update){
theme.update();
themeItem.set("theme_id", theme.getStr("id"));
themeItem.update();
setAttr("successMessage","修改成功!");
}else{
theme.genId();
theme.save();
themeItem.set("theme_id", theme.getStr("id"));
themeItem.genId();
themeItem.save();
setAttr("successMessage","保存成功!");
}
render("/WEB-INF/vote/add.html");
}

@ActionKey("/vote/update")
public void toUpdateVode() {
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
setAttr("root", this.getRequest().getContextPath());
String id = getPara("id");
Theme theme = Theme.dao.findById(id);
List items = theme.getItems();
setAttr("item",items.get(0));
setAttr("theme",theme);
render("/WEB-INF/vote/edit.html");
}
@ActionKey("/vote/delete")
public void deleteVote() {
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
setAttr("root", this.getRequest().getContextPath());
}
@ActionKey("/vote/item/add")
public void toItemAdd() {
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
setAttr("root", this.getRequest().getContextPath());
}
@ActionKey("/vote/item/update")
public void toItemUpdate() {
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
setAttr("root", this.getRequest().getContextPath());
}
@ActionKey("/vote/item/delete")
public void deleteItem() {

}

@ActionKey("/vote/addAnswer")
public void toAddAnswer() {
setAttr("themeId",getPara("id"));
Theme theme = Theme.dao.findById(getPara("id"));
ThemeItem item = ThemeItem.dao.findFirst("select * from vote_theme_item where theme_id = ?",new Object[]{theme.get("id")});
setAttr("item_id",item.get("id"));
render("/WEB-INF/vote/answer/add.html");
}

@ActionKey("/vote/answer/update")
public void toUpdateAnswer() {
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
ThemeItemAnswer answer = ThemeItemAnswer.dao.findById(getPara("id"));
setAttr("answer",answer);
render("/WEB-INF/vote/answer/edit.html");
}

@ActionKey("/vote/answer/save")
public void saveAnswer() {
UploadFile image = this.getFile("image");
UploadFile flv = this.getFile("flv");
ThemeItemAnswer answer = this.getModel(ThemeItemAnswer.class);
boolean update = true;
if(StringUtils.isEmpty(answer.getStr("id"))){
update = false;
answer.genId();
}
File f = new File(GlobalConstants.filepath+File.separator+answer.getStr("id")+File.separator);
if(!f.exists()){
f.mkdirs();
}
if(image!=null){
File uploadFile = image.getFile();
uploadFile.renameTo(new File(f.getAbsolutePath()+File.separator+image.getFileName()));
answer.set("image_path", ("upload"+File.separator+answer.getStr("id")+File.separator+image.getFileName()).replace("\\", "/"));
}
if(flv!=null){
File uploadFile2 = flv.getFile();
uploadFile2.renameTo(new File(f.getAbsolutePath()+File.separator+flv.getFileName()));
answer.set("flv_path", ("upload"+File.separator+answer.getStr("id")+File.separator+flv.getFileName()).replace("\\", "/"));
}
setAttr("root", this.getRequest().getContextPath());
if(update){
answer.update();
}else{
answer.save();
}
setAttr("successMessage","保存成功!");
setAttr("themeId",answer.getStr("theme_id"));
setAttr("item_id",answer.getStr("item_id"));
render("/WEB-INF/vote/answer/add.html");
}

@ActionKey("/vote/answer/delete")
public void toDeleteAnswer() {
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
String id = getPara("id");
ThemeItemAnswer answer = ThemeItemAnswer.dao.findById(id);
ThemeItem item = answer.getItem();
Theme theme = item.getTheme();
ThemeItemAnswer.dao.deleteById(id);
setAttr("successMessage","选项删除成功!");
this.redirect("/vote/detail?id="+theme.getStr("id"));
}

}


浏览并投票的代码

package cn.edu.jxut.vote.controller;

import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.lang.StringUtils;

import cn.edu.jxut.common.controller.BaseController;
import cn.edu.jxut.common.model.LoginUser;
import cn.edu.jxut.vote.model.Theme;
import cn.edu.jxut.vote.model.ThemeItem;
import cn.edu.jxut.vote.model.ThemeItemAnswer;
import cn.edu.jxut.vote.model.VoteUserAnswer;

import com.jfinal.aop.ClearInterceptor;
import com.jfinal.aop.ClearLayer;
import com.jfinal.core.ActionKey;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;

public class VoteViewController extends BaseController{

@ActionKey("/vote/view")
@ClearInterceptor(ClearLayer.ALL)
public void index() {
setAttr("root", this.getRequest().getContextPath());
String id = getPara("id");
Theme theme = Theme.dao.findById(id);
ThemeItem item = theme.getItems().get(0);
ThemeItemAnswer answer = new ThemeItemAnswer();
answer.set("theme_id", id);
answer.set("item_id", item.get("id"));
String name = getPara("name");
if(StringUtils.isNotEmpty(name)){
if("请输入教师姓名".equals(name)){
name="";
}
}else{
name = "";
}
Page p = ThemeItemAnswer.dao.paginateByExample(answer, "name like '%"+name+"%'", this.getPageNumber(), this.getPageSize(), "cnum desc,onum");
setAttr("page",p);
setAttr("theme",theme);
setAttr("item",item);
String sql = "select count(*) from vote_user_answer where user_id = ? and item_id = ?";
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
if(u!=null){
int con = Db.queryInt(sql,new Object[]{u.get("user_id"),item.get("id")});
setAttr("cnum",con);
}
if("1".equals(getPara("success"))){
setAttr("successMessage","投票成功!");
}else if("0".equals(getPara("success"))){
setAttr("errorMessage","您已经投过一次了!");
}else if("-1".equals(getPara("success"))){
setAttr("errorMessage","您没有剩余的投票机会了!");
}else if("-2".equals(getPara("success"))){
setAttr("errorMessage","当前投票已经截止!");
}else if("-3".equals(getPara("success"))){
setAttr("errorMessage","当前投票还没有开始!");
}
render("/WEB-INF/voteview/view.html");
}
@ActionKey("/vote/viewAll")
@ClearInterceptor(ClearLayer.ALL)
public void viewAll() {
setAttr("root", this.getRequest().getContextPath());
Theme theme = this.getModel(Theme.class);
Page p = Theme.dao.paginateByExample(theme, "yxbj = '1' and enddate >= to_char(sysdate,'yyyy-MM-dd') ", pageNumber, pageSize, "");
setAttr("page",p);
render("/WEB-INF/voteview/viewAll.html");
}
@ActionKey("/vote/view/detail")
@ClearInterceptor(ClearLayer.ALL)
public void detail() {
setAttr("root", this.getRequest().getContextPath());
String id = getPara("id");
ThemeItemAnswer answer = ThemeItemAnswer.dao.findById(id);
ThemeItem item = answer.getItem();
Theme theme = item.getTheme();
setAttr("answer",answer);
setAttr("theme",theme);
String sql = "select count(*) from vote_user_answer where user_id = ? and item_id = ?";
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
if(u!=null){
int con = Db.queryInt(sql,new Object[]{u.get("user_id"),item.get("id")});
setAttr("cnum",con);
}
render("/WEB-INF/voteview/show.html");
}
@ActionKey("/vote/vote")
@ClearInterceptor(ClearLayer.ALL)
public void vote(){
LoginUser u = (LoginUser)getSessionAttr("LoginUser");
String id = getPara("id");
ThemeItemAnswer answer = ThemeItemAnswer.dao.findById(id);
ThemeItem item = answer.getItem();
Theme theme = item.getTheme();
if("1".equals(theme.getStr("sfnm"))){
u=new LoginUser();
u.set("user_id", this.getRequest().getRemoteAddr());
}else{
if(u==null){
this.redirect("/main?redirect=/vote/view?id="+theme.getStr("id"));
return;
}
}
String startDate = theme.getStr("startDate");
String endDate = theme.getStr("endDate");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
Date start = df.parse(startDate);
Date end = df.parse(endDate);
if(df.parse(df.format(new Date())).compareTo(end)>0){
this.redirect("/vote/view?success=-2&id="+theme.getStr("id"));
return;
}
if(new Date().compareTo(start)<0){
this.redirect("/vote/view?success=-3&id="+theme.getStr("id"));
return;
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

int cnum = item.getBigDecimal("cnum").intValue();
String sql = "select count(*) from vote_user_answer where user_id = ? and item_id = ?";
int con = Db.queryInt(sql,new Object[]{u.get("user_id"),item.get("id")});
if(con>=cnum){
this.redirect("/vote/view?success=-1&id="+theme.getStr("id"));
return;
}
String sql2 = "select count(*) from vote_user_answer where user_id = ? and answer_id = ?";
int con2 = Db.queryInt(sql2,new Object[]{u.get("user_id"),answer.get("id")});
if(con2>0){
this.redirect("/vote/view?success=0&id="+theme.getStr("id"));
return;
}
VoteUserAnswer userAnswer = new VoteUserAnswer();
userAnswer.genId();
userAnswer.set("answer_id", id);
userAnswer.set("user_id", u.get("user_id"));
userAnswer.set("item_id", item.get("id"));
userAnswer.set("theme_id", theme.get("id"));
userAnswer.save();
this.redirect("/vote/view?success=1&id="+theme.getStr("id"));
}
}

你可能感兴趣的:(jfinal实现在线投票系统)