您好,欢迎来到花图问答。
搜索
您的当前位置:首页开心农场

开心农场

来源:花图问答
网络程序设计 大作业

开心农场设计与实现

班级: 学号: 姓名: 教师:

平时成绩15分: + 大作业成绩:85分: = 总分:_ _ 成绩: _

教师评语:

小计 F7 2 F1 6 3 F2 4 5 3 F3 10 F8 F4 2 4 2 3 F5 7 6 3 F9 F6 6 4 2 F10 5 2 3 2 3 F11(加分) 2 2 教师签名:

2011年6月

开心农场设计与实现

1

目 录

一、需求分析 .......................................... 3 二、系统设计 .......................................... 3

2.1 主界面 ............................................................................................................... 3 2.2 注册功能............................................................................................................ 5

2.3 登陆功能............................................................................................................ 5 2.4 种菜功能............................................................................................................ 5 2.5 查看自己的土地 ................................................................................................. 6 2.6 摘取好友果实..................................................................................................... 6 2.7 修改个人资料..................................................................................................... 7

三、数据库设计 ........................................ 7

3.1 用户表(user) ................................................................................................. 7 3.2 土地表(field1212) ........................................................................................ 8

3.3 果实表(fruit1212) ........................................................................................ 8 3.4 果实种类表(fruitkind) ................................................................................. 8 3.5 爱好(hobbies) ............................................................................................... 8 3.6 偷菜(steal) ................................................................................................... 9 3.7 登录的日志表(login) ..................................................................................... 9

四、系统实现方法 ...................................... 10

4.1主页面功能(F4) ............................................................................................ 10 4.2注册功能(F5) ................................................................................................... 12

4.3登陆功能(F6) ................................................................................................ 14 4.4种菜(F7) ....................................................................................................... 16 4.5查看自己的土地(F8) ..................................................................................... 19 4.6摘取好友果实(F9) ......................................................................................... 22 4.7修改个人资料(F10) ....................................................................................... 24

五、总结 ............................................. 26

2

一、需求分析

这次主要是完成开心农场的设计工作,农场游戏主要功能分成七大部分: 1. 主页面 2. 注册功能 3. 登录功能 4. 种菜

5. 查看自己土地 6. 摘取好友果实 7. 修改个人资料

二、系统设计

struts-config.xml配置图截屏

2.1 主界面

注册游戏账户,游戏登陆两个链接;frame的分区,左边是功能操作区,右边是执行区

3

功能操作区链接功能:注册,登录,种菜,查看自己的土地,修改个人资料。

左边分区的功能是由left1212界面实现的

4

2.2 注册功能

2.3 登陆功能

2.4 种菜功能

5

2.5 查看自己的土地

2.6 摘取好友果实

6

2.7 修改个人资料

三、数据库设计

此项目数据库中共建了七个表:用户表user,土地表field1212,种植的果实表fruit1212,果实种类fruitkind,用户爱好表hobbies,用户登陆日志login,用户偷取日志steal。

3.1 用户表(user)

表名 存储体描述: 字段名 用户编号 用户名 密码 所在班级 年龄 性别 学历 地址 个人描述 爱好 手机号 常用邮箱地址 user 说明 用户表 在注册用户时写入数据库数据。 字段代码 userid username password class age sex education address selfDescribe hobby phone email 字段类型 int varchar(20) varchar(20) varchar(10) int varchar(10) varchar(20) varchar(50) varchar(100) varchar(100) number(11) varchar(50) 7

是否主键 是 必填 缺省值 备注 是 是 自增 唯一 3.2 土地表(field1212)

表名 存储体描述: 属性名 土地编号 土地状态 所属用户 序号 Field1212 说明 土地表 在用户注册时同时给用户分配六块土地。 属性代码 fieldid fieldCondition userid fieldnumber 属性类型 int varchar(20) int int 是否主键 是 必填 缺省值 备注 是 是 是 是 empty 自增 外键 第几块土地 3.3 果实表(fruit1212)

表名 存储体描述: 属性名 果实编号 果实种类 所属土地 种植时间 成熟时间 果实个数 是否成熟 是否收获 Fruit1212 说明 种植的果实表 在用户种植时写入数据库。 属性代码 fruitid fruitkind fieldid planttime maturetime fruitcount ismature isreaped 属性类型 int int int date date int int int 是否主键 必填 缺省值 备注 是 是 是 是 是 是 是 是 20 0 0 自增 外键 外键 标志位 标志位 3.4 果实种类表(fruitkind)

表名 存储体描述: 属性名 果实种类编号 果实种类名称 果实成熟时间 Fruitkind 说明 果实种类表 在用户注册时同时给用户分配六块土地。 属性代码 frukindid frukindname frukindtime 属性类型 int varchar(20) date 是否主键 是 必填 缺省值 备注 是 是 是 20 自增 3.5 爱好(hobbies)

表名 存储体描述: 属性名 Hobbies 说明 果实种类表 描述每个用户的不同爱好 属性代码 属性类型 8

是否主键 必填 缺省值 备注 爱好编号 用户编号 爱好

hobbyid userid hobbies int varchar(20) varchar(20) 是 是 是 自增 外键 3.6 偷菜(steal)

表名 存储体描述: 属性名 用户编号 果实编号 偷取时间

Steal 说明 记录偷取好友果实 在用户种植时写入数据库。使用的是联合主键用户编号和果实编号。 属性代码 userid fruitid stealtime 属性类型 int int date 是否主键 是 是 必填 缺省值 备注 是 是 外键 外键 3.7 登录的日志表(login)

实体 存储体描述: 字段名 登录id 用户名 登录时间

login 说明 登录日志表 在用户登录时写入数据库数据。 字段代码 loginid username loginTime 字段类型 int number date 是否主键 是 必填 缺省值 备注 是 是 是 自增 外键 9

四、系统实现方法

4.1主页面功能(F4)

1)实现注册游戏账户,游戏登陆两个超链接

10

注册功能可以跳转到register1212页面,进行注册填写。登陆功能可以跳转到userLogin1212页面,进行用户的登陆。代码如下:

注册

登录

2)frame的分区,左边是功能操作区,右边是执行区功能操作区链接功能:

注册,登录,种菜,查看自己的土地,修改个人资料。

跳转功能:

\">注册

录\">登录

种菜

title=\"点击查看自己土地\">查看自己土地

target=\"main\"


果实\">偷取好友果实

\">修改个人资料

11

Frame分区功能:

4.2注册功能(F5)

注册信息包括:游戏账户名,密码,所在班级(下拉列621,622,631),年龄,性别(单选),地址,个人描述,爱好(多选),手机号和常用邮箱地址

1)游戏账户名不能重复(js判断)

function checkname() { alert(\"checkname\");

var username = document.getElementById(\"username\").value; if (username.length > 0) { }

}

function checknameCallback(boolean) {

if (boolean) {

12

UserCheckDwr.isUserExist(username, checknameCallback);

document.getElementById(\"nameMessage\").innerHTML = \"用户名已存在\"; } else {

document.getElementById(\"nameMessage\").innerHTML = \"用户名可以通过注册\"; }

}

2)两次输入密码,并判断两次输入的密码是否一致(form的java代码判断)

public ActionErrors validate(ActionMapping mapping,

HttpServletRequest request) {

ActionErrors errors = new ActionErrors();

if(!(this.password.equals(this.checkpassword))){ }

// TODO Auto-generated method stub return errors; }

errors.add(ActionMessages.GLOBAL_MESSAGE,new

request.setAttribute(\"s_pass1\", \"两次输入的密码不同,请重新输入

ActionMessage(\"The passwords aren't match.\")); \");

3)用户名长度不能小于3大于8 ,密码长度不能小于6大于12 (使用js

文件)

if(a<3 || a>8){

alert(\"用户名长度必须大于3小于8\"); return false; }

if(c<6 || c>12){

alert(\"密码长度必须大于6小于12\"); return false;

4)手机号不能为空,且只能输入11位的数字(正则表达式) 未能实现

5)检查邮箱格式

function checkmail() {

var mail = document.getElementById(\"mail\").value; var RegEmail = /^(\\w+[@]\\w+([.]\\w+)+)?$/; if(email == \"\") {

alert(\"电子邮箱不能为空\"); return false;

13

}

}

if(!mail.match(Regmail)) { }

return true;

alert(\"电子邮箱不合法!\"); return false;

6)其他信息输入 未能实现

7)程序国际化:支持英语和汉语两种方式

4.3登陆功能(F6)

1)用户名输入时,使用Dwr进行异步通讯,判断并提示游戏账户名是否存在

function checkLoginName() { alert(\"checkname\"); }

function Callback(boolean) { \"; }

}

if (boolean) {

document.getElementById(\"nameMessage\").innerHTML = \"用户名存在\"; } else {

document.getElementById(\"nameMessage\").innerHTML = \"用户名不存在var username = document.getElementById(\"username\").value; if (username.length > 0) { }

User603CheckDwr.isUserExist(username, Callback);

上面是被调用的dwr函数

function checkLoginName() { alert(\"checkname\");

14

}

var username = document.getElementById(\"username\").value; if (username.length > 0) { }

User603CheckDwr.isUserExist(username, Callback);

function Callback(boolean) { \"; } }

if (boolean) {

document.getElementById(\"nameMessage\").innerHTML = \"用户名存在\"; } else {

document.getElementById(\"nameMessage\").innerHTML = \"用户名不存在

2)用户名密码不能为空,封装登录验证

public ActionErrors validate(ActionMapping mapping,

HttpServletRequest request) { // TODO Auto-generated method stub

ActionErrors errors = new ActionErrors();

if(this.username == null || this.username.equals(\"\")){ }

if(this.password == null || this.password.equals(\"\")){

errors.add(ActionMessages.GLOBAL_MESSAGE,new

15

errors.add(ActionMessages.GLOBAL_MESSAGE,new

ActionMessage(\"用户名必须填写\"));

request.setAttribute(\"s_mess1\",\"用户名必须填写!\");

}

}

ActionMessage(\"密码必须填写\"));

request.setAttribute(\"s_mess2\",\"密码必须填写!\");

return errors;

封装登陆验证

public User CheckLogin(String username,String password)

{

java.util.List results= findByUsername(username); if(results!=null&&results.size()>0) {

User user=(User)results.get(0);

if(user.getPassword().equals(password)) {

return user; }

3)普通用户登陆成功后显示欢迎用户名,例如: 欢迎test18

4)每次登录后要将这个登录的记录写入到数据库的日志表中

在UserLogin1212Action中加入以下代码实现登陆记录写入数据库。

Login login=new Login();

login.setUser(user);

login.setLogintime(new Date());

Transaction tran=logindao.getSession().beginTransaction(); logindao.save(login);

4.4种菜(F7)

plant1212.jsp页面实现用户种植功能。在6块地上种植蔬菜水果。

16

1)土地编号

可以实现六个土地的选择。

2)蔬菜水果名称;(下拉列表或直接输入均可)

土地编号的查询与选择

fieldnumber:

${fieldnumber}

scope=\"session\">

水果的查询与选择

plantkind:

3)种植并保存到数据库

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) { Plant1212Form plant1212Form = (Plant1212Form) form;// TODO /* return mapping.findForward(\"plantfailed\");

17

Auto-generated method stub

*/

System.out.println(\"enter plantaction!\"); Fruit1212DAO fruit1212dao=getFruit1212dao();

java.util.List

FruitkindDAO fruitkinddao=getFruitkinddao(); Field1212DAO field1212dao=getField1212dao(); UserDAO userdao=getUserdao();

userlist=userdao.findByUsername(request.getSession().getAttribute(\"s_username\"));

fruit.setField1212(field1212dao.findById(plantInfobean.getFieldid

fruit.setFruitkind(fruitkinddao.findById(plantInfobean.getFrukind

fruit.setUser(userdao.findById(plantInfobean.getUserid()));

fruit.setPlanttime(new Date()); SimpleDateFormat date_format = new try {

Date date;

String Maturetime = \"\";

SimpleDateFormat DateFormat = new

GregorianCalendar cal = new GregorianCalendar(); date = DateFormat.parse(new Date().toString()); cal.setTime(date);

18

User user=(User)userlist.get(0); String

String fieldnumber=plant1212Form.getFieldnumber(); String frukindname=plant1212Form.getPlantkind(); List

if(result.size()!=0){

PlantInfobean plantInfobean=(PlantInfobean)result.get(0); Fruit1212 fruit=new Fruit1212();

username=request.getSession().getAttribute(\"s_username\").toString();

result=field1212dao.findPlantInfor(fieldnumber,frukindname,username);

()));

id()));

SimpleDateFormat(\"yyyy-MM-dd\");

SimpleDateFormat(\"yyyy-MM-dd\");

}

}

}

}

cal.add(Calendar.MINUTE, +20);

Maturetime = DateFormat.format(cal.getTime());

fruit.setMaturetime(cal.getTime()); // TODO Auto-generated catch block e.printStackTrace();

} catch (ParseException e) {

// System.out.println(\"date is not right\");

fruit.setIsmature(0); fruit.setIsreap(0); Transaction

fruit1212dao.save(fruit); tran1.commit();

return mapping.findForward(\"plantsuccess\");

tran1=fruit1212dao.getSession().beginTransaction();

return mapping.findForward(\"plantfailed\");

4)所有土地都种满则不能进行种植操作。

4.5查看自己的土地(F8)

1)以表格方式显示自己土地上的情况:土地编号,蔬菜水果名称,种植时间,

19

土地状态(空白,种植,可收获),不需要支持分页。(5分)

2)收获自己的果实,并将土地状态设置为可种植状态(3分) 未实现

3)使用css (2分)

@CHARSET \"UTF-8\"; .mytable { width:100%; padding:opx; border:none;

border:1px solid #789DB3; }

.mytable td{ font-size:12px; border:none;

background-color:#F4F4F4; vertical-align:middle; padding:5px; }

.mytable tr.title td{

border-bottom:1px solid yellow; background-color:gray; color:red;

font-weight:bold;

}

20

4)可以按土地编号和蔬菜水果名进行查找(2分)

public List findPlantInfor(String fieldnumber,String frukindname,String username){

log.debug(\"finding plantinformation with

fieldnumber:\"+fieldnumber+\" frukindname: \"+frukindname+\" username \"+username);

try{

String queryString=\"select

field1212.fieldid,frukind.frukindid,user.userid from Field1212 as field1212,Fruitkind as frukind,User as user\" +

\" where field1212.fieldnumber=\"+fieldnumber+\" and

frukind.frukindname='\"+frukindname+\"' and user.username='\"+username+\"' and \"+

System.out.println(\"-----------\"+queryString+\"-------------\");

}

catch(RuntimeException re){

log.error(\"findPlantInfor failed\

21

\"field1212.user=user.userid\";

Query queryObject=getSession().createQuery(queryString); List temp=queryObject.list();

List result=new ArrayList(); Iterator it=temp.iterator(); while(it.hasNext()){ }

return result;

}

result.add(pb); }

if(elems.length>=3&&elems[2]!=null){ }

if(elems.length>=2&&elems[1]!=null){ Object[] elems=(Object[])it.next(); PlantInfobean pb=new PlantInfobean(); if(elems.length>=1&&elems[0]!=null){

pb.setFieldid(Integer.parseInt(elems[0].toString()));

pb.setFrukindid(Integer.parseInt(elems[1].toString()));

pb.setUserid(Integer.parseInt(elems[2].toString()));

}

System.out.println(\"4\"); throw re;

}

5)打印自己的土地情况(快逸报表其他均可)(3分)

4.6摘取好友果实(F9)

1)显示与自己在同一班级的所有用户(即好友)的土地列表状态,支持分页功能(使用displaytag)。(6分)

Listdisplay1212Form listdisplay1212Form = (Listdisplay1212Form) form;// TODO Auto-generated method stub

String

String hql=\"select user1.username, field.fieldnumber,

\" field.fieldCondition from Field1212 as field,User as \" Fruit1212 as fruit, Fruitkind as fruitkind where field.\"

UserName=request.getSession().getAttribute(\"s_username\").toString(); fruitkind.frukindname, fruit.planttime,\" + user1,User as user2,\" +

+ \"user=user1.userid and user1.username!=user2.username and

\"fruit.field1212=field.fieldid and \"order by field.fieldnumber\";

user2.username='\"+UserName+\"' and \" +

fruit.fruitkind=fruitkind.frukindid and fruit.isreap=0 \" +

PagView pv=new PagView(); PagInfo pagInfo=new PagInfo();

pagInfo=PagUtil.getPagInfo(request,5); pv=PagUtil.InitPagView(hql, pagInfo); request.setAttribute(\"pv\", pv);

22

request.setAttribute(\"lst\", pv.getViewList()); return mapping.findForward(\"listsuccess\");

2)摘取好友果实(每次成熟20个果实,每次摘取1个,不判断摘取次数)。

public boolean Steal(String userid,String fruitid){

}

log.debug(\"checksteal by userid:\"+userid+\" try { }

Date date=new Date(); User user=(new Fruit1212 fruit=(new

fruit.setFruitcount(fruit.getFruitcount()-1); Stea stea=new Stea(); SteaId steaid=new SteaId(); steaid.setFruit(fruit); stealid.setUser(user); steal.setId(stealid);

steal.setStealtime(new Date()); StealDAO stealdao=new StealDAO(); stealdao.save(steal); return true;

log.error(\"checksteal by userid:\"+userid+\" throw re;

fruitid:\"+fruitid);

UserDAO()).findById(Integer.parseInt(userid)); Fruit1212DAO()).findById(Integer.parseInt(fruitid));

} catch (RuntimeException re) {

fruitid:\"+fruitid+\" failed\

3)判断摘取次数,只能摘取1次(4分)( 粘贴对应的数据库语句)

public boolean checksteal(String userid,String fruitid){

log.debug(\"checksteal by userid:\"+userid+\" fruitid:\"+fruitid); try {

String queryString = \"from Steal as model where model.userid=\"

+ userid + \" and model.fruitid=\"+fruitid;

Query queryObject = getSession().createQuery(queryString); if(a>0)return true; else return false;

} catch (RuntimeException re) {

int a=queryObject.list().size();

log.error(\"checksteal by userid:\"+userid+\" fruitid:\"+fruitid+\" failed\

23

} }

throw re;

未实现不过有代码!! 4.7修改个人资料(F10)

只能修改密码,年龄,性别(单选),地址,学历(下拉列表),个人描述,爱好(多选),手机号和邮箱地址

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) { Register1212Form registerForm = (Register1212Form) form;// TODO System.out.print(registerForm.getUsername()); User user=new User();

if(user.getUsername().equals(registerForm.getUsername()))//判

Auto-generated method stub

断数据库是否已存在用户名 { ;

}

24

System.out.println(registerForm.getUsername()+\"****************\")

System.out.println(\"此用户名已存在\"); return mapping.findForward(\"failed\"); //return null;

if(registerForm.getPassword().equals(\"\")){ }

request.setAttribute(\"s_pass\", \"密码不能为空\"); return mapping.findForward(\"failed\");

if(!registerForm.getCheckpassword().equals(registerForm.getPasswo

request.setAttribute(\"s_pass1\", \"密码前后不一致\"); return mapping.findForward(\"failed\");

}

java.util.List if(results.size()==0){

System.out.println(\"this user of size is \"+results.size()); user.setUsername(registerForm.getUsername()); if(!registerForm.getAge().equals(\"\"))

user.setAge(Integer.parseInt(registerForm.getAge())); System.out.println(\"age is \"+registerForm.getAge()); user.setPassword(registerForm.getPassword());

user.setSex(registerForm.getSex());

System.out.print(\"6\"+registerForm.getSex());

System.out.println(\"phone is \"+registerForm.getTel()); user.setTel(registerForm.getTel()); user.setCls(registerForm.getCls());

System.out.println(\"class is \"+registerForm.getCls()); user.setAddress(registerForm.getAddress()); user.setInfo(registerForm.getInfo()); user.setMail(registerForm.getMail()); UserDAO dao=new UserDAO();

dao.save(user);

Object obj=(registerForm.getHobbies()); String[] biList=(String[])obj; for(int i=0;iSystem.out.println(\"hobies is \"+i+\" \"+isToGB(biList[i])); Hobbies hobbies=new Hobbies();

hobbies.setHobbies(biList[i]); hobbies.setUser(user);

25

rd())){

results=dao.findByUsername(registerForm.getUsername());

}

HobbiesDAO hobbiesdao=new HobbiesDAO(); hobbiesdao.save(hobbies);

}

}

return mapping.findForward(\"success\"); }

request.setAttribute(\"s_mess3\", \"用户名已存在\"); return mapping.findForward(\"failed\");

public static String isToGB(String src){ }

String strRe=null; try{ }

catch(Exception e){ }

return strRe;

e.printStackTrace();

strRe=new String(src.getBytes(\"ISO-8859-1\"),\"GBK\");

与注册界面类似,更改成功之后的跳转到userEditResultSuccess页面,然后跳转到主页面


更改用户信息成功!

回到主界面

五、总结

原先玩一些游戏的时候总是感觉其充满的神秘感,感觉编出一个游戏来是可望而不可及的事情,可是自从学完网络程序设计之后,我终于系统的理解了项目的实现,在完成了大作业之后,我终于不再对那些游戏的编制过程产生敬畏之心了,而是对其产生了兴趣。

经过这次大作业之后,我培养了网络项目的开发过程的逻辑思考能力,知道开发一个项目必须把各个模块之间的逻辑结构要搞清,特别是现在对开心农场系统特别的了解。在自己开发项目的过程中肯定会遇到很多问题,一方面需要靠自己耐性解决,另一方面还得要经常与同学进行交流,只有交流之后才能知道自己的不足之处。

经过这次项目开发之后我最大的收获是对项目开发感兴趣了,同时了解到自

26

己还有很多的不足,今后要更加的努力。

27

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuowenda.com 版权所有 湘ICP备2023022495号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务