myapps 会议管理设计与实现

会议管理设计与实现文档

会议管理

    数据库:meetingdb

    数据表:1、meeting_info 2、meeting_join_user  (一对多关系)

菜单

1、我发起的会议公开

2、待参与的会议公开

3、待审批的会议(管理员,经理,主管)

4、所有会议列表(管理员)

注:  角色目前是按照个人自己的设计的角色,后期需要改为省平台的对应的角色

创建会议:创建会议时,把相关参与人的数据插入到meeting_join_user

删除会议:删除会议时,把相关参与人的数据从meeting_join_user表删除

预览会议详情页面:查看会议详情信息

查询会议参与人列表:查看会议参与人的信息列表

带参与会议列表:

回复是否参与会议:弹窗回复是否参与会议

会议流程图:

员工:创建会议(提交)s----审批(提交)----发布

经理、主管:创建会议(提交)-----发布

 

运行效果图:

员工:(我发起的会议,待参与的会议)

主管、经理:(我发起的会议,待参与的会议,待审批的会议)

管理员:(我发起的会议,待参与的会议,待审批的会议、所有会议管理列表)

 

 

开发技术关键点记录:

添加数据:

在保存操作的 动作后,或者动作前,进行对C表添加数据。

A表添加数据时,向C表也添加数据:

(function(){
	var doc = getCurrentDocument();
	var meeting_id=getItemValueAsString("meeting_id");
	var aa = doc.getItemValueAsString("user_list"); //表单用户选择框字段
	
	if(!aa.equals("")&& aa.length()>0){
		var docids = splitText(aa, ";");
		var userlist = createObject("java.util.ArrayList");
		for (var i = 0; i < docids.length; i++) {
			if (docids != null) {
					var userVO = getUserById(docids[i]);
					userlist.add(userVO);
			}
		}
		
		var formProcess = getFormProcess();
		var process = getDocumentProcess(); 
		var form = formProcess.doViewByFormName("meeting_join_user" , getApplication()); 
		if(userlist!=null && userlist.size()>0){
			for(var i = 0; i < userlist.size(); i++){//循环条件
				var dataUser = userlist.get(i);
				var itemDoc = process.doNew(form,getWebUser(),createParamsTable());
				
				var userid=dataUser.getId();
				var sql = "select * from tlk_meeting_join_user where item_meeting_id='"+meeting_id;
				 sql +="' and item_user_id='"+userid+"'";
				var existlist = queryBySQL(sql);
				if(existlist!=null && existlist.size()>0){
	
				}else{
					var depts = dataUser.getDepartments();
					var departmentName = "";
					for (var iter = depts.iterator(); iter.hasNext();) {
						var dept = iter.next();
						departmentName = dept.getName();
					}
					
				        //itemDoc.setParent(doc.getId());
					itemDoc.setAuthor(userid);
					//itemDoc.setIstmp(false);
					itemDoc.setApplicationid(getApplication());
					itemDoc.setDomainid(dataUser.getDomainid());
					
					itemDoc.addStringItem("meeting_id", meeting_id);
					itemDoc.addStringItem("user_id", userid);
					itemDoc.addStringItem("username", dataUser.getName());
					itemDoc.addStringItem("tel_phone", dataUser.getTelephone());
					itemDoc.addStringItem("department", departmentName);
					itemDoc.addStringItem("message", "");
					itemDoc.addStringItem("status", "wait");
					itemDoc.addDateItem("add_date", getToday());
					process.doCreate(itemDoc);
				}

			}
		}
	}	
})()


 

删除数据:

A表删除数据时,向C表也删除数据:

(跟添加数据时的原理一样):

(function(){
	var params = getParameter("_selects");       
	if(params!=null && params!=""){
		var recordids = splitText(params,";");//得到选中记录组的id
		var recordid = "";
		
		var appid=getApplication();//获取应用ID
		var a=new Packages.cn.myapps.core.deploy.application.ejb.ApplicationProcessBean();//实例化application的应用处理类
		var avo=a.doView(appid);//获取软件应用对象
		var did=avo.getDatasourceid();//获取数据源的ID
		var db=new Packages.cn.myapps.core.dynaform.dts.datasource.ejb.DataSourceProcessBean();//实例化数据源的应用处理类
		var kk=db.doView(did);//获取数据源对象
		var dbsname=kk.getName();//获取数据源名称

		var process = new Packages.cn.myapps.core.dynaform.document.ejb.DocumentProcessBean(getApplication()); //实例化文档对象
		for(var i=0;i<recordids.length;i++){
			var id = recordids[i];
			//process.doRemove(recordids[i]);//根据文档ID,删除文档对象
			var sql = "delete from tlk_meeting_join_user where parent='"+id+"'";
			if(!"".equals(dbsname)){
				deleteByDSName(dbsname,sql);	
			}
		}
	}
})()


待参加会议数据查询:

数据查询SQL

(function(){
        var user = getWebUser();
        var userid = user.getId();
var sql="";
if(null!=userid || !"".equals(userid)){
         sql = "select u.item_status, m.* from tlk_meeting_join_user as u LEFT JOIN tlk_meeting_info as m on u.ITEM_MEETING_ID =m.ITEM_MEETING_ID where u.ITEM_USER_ID='"+userid+"' and m.ITEM_MEETING_STATUS='已发布' and m.ITEM_START_TIME>=now()";
}
 
       return sql;
})()


 

视图列跳转视图(当前页)

查询会议参与人列表

(function(){
	var request = $WEB.getParamsTable().getHttpRequest();//获取当前 request
	var curr= getCurrentDocument();
	var meetingId=getItemValueAsString("meeting_id");
 //var uid = getWebUser().getId();

	var url1="http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();
	var view_id="11e6-10d5-c8907e8b-a931-c7e163d030f2";//视图 id,浏览器的http请求可以看到
	var oldUrl = url1+
	"/portal/dynaform/view/displayView.action?_viewid="+view_id+"&clearTemp=true&application=11e6-10c7-cb2f4e2b-a931-c7e163d030f2&meetingId="+meetingId+"&_resourceid=11e6-10da-4b00d761-a931-c7e163d030f2";

	var rtn = "<a style=\"cursor:pointer;\" href='"+oldUrl+"' title='查询参会人' ><font color='blue' >查询参会人</font></a>";
	return rtn;
})();

视图上接收参数去查询相关的记录:

(function(){
 
var request = $WEB.getParamsTable().getHttpRequest();
 
        var meetingId = request.getParameter("meetingId");
        if(isNotNull(meetingId)){
            request.getSession().setAttribute("usermeetingId",meetingId);
        }else{
            meetingId = request.getSession().getAttribute("usermeetingId");
        }
        println("=======mid=========="+meetingId);
  
         var  sql="select * from tlk_meeting_join_user where item_meeting_id='"+meetingId+"'";
 
 
       return sql;
})()

视图列跳转表单(弹窗)

回复会议:

(function(){
        var doc = getCurrentDocument();//当前的文档对象
		var meetingid = doc.getItemValueAsString("meeting_id");//获取所在行的会议id
		var user = getWebUser();
        var userid = user.getId();//获取当前用户的ID
		
		println("=======m======="+meetingid);
		println("=======u======="+userid);
	    var docid="";//记录id
	    var formid="11e6-10d2-5c67ecc1-a931-c7e163d030f2";//相应记录的表单id 固定的
		
		if(meetingid!=null && userid!=null){
			var sql = "select * from tlk_meeting_join_user where item_meeting_id='"+meetingid;
				sql +="' and item_user_id='"+userid+"'";
				var userlist = queryBySQL(sql);
				println("============="+userlist.size());

				if(userlist!=null && userlist.size()>0){   //遍历结果集
					for(var iter1 = userlist.iterator();iter1.hasNext();){
						var itemdoc = iter1.next();
						if(itemdoc!=null){
						  docid=itemdoc.getId();//获取查询出的文档的id
						  println("======m======"+itemdoc.getItemValueAsString("meeting_id"));
						  println("======u======"+itemdoc.getItemValueAsString("user_id"));
						}
					}
				}
				
		}

        var subject = "回复";
        var request = $WEB.getParamsTable().getHttpRequest();//获取当前request
        var url1="http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();

        var oldUrl = url1+"/portal/dynaform/document/view.action?user_reply=yes&_docid="+docid+"&_formid="+formid;
        oldUrl += "&application="+getApplication();
        oldUrl += "&isedit=true&signatureExist=false";

        var url = "OBPM.dialog.show({opener:window.parent,title:'回复会议',url:'"+oldUrl+"',width:960,height:500,close:function(){}})";
        return "<a style=\"cursor:pointer;\" οnclick=\""+url+";\"><font color='blue'>"+subject+"</font></a>";
})();


 

表单操作跳转模板表单(会议详情页)(预览)

视图列跳转模板表单

(function(){
	var id="";
	var formid="";
	var applicationid="";
	var url="";
	var pnama=getItemValueAsString("meeting_id");
	var sql="select id ,formid, applicationid,DOMAINID from tlk_meeting_info where item_meeting_id='"+pnama+"'";
	var querys=queryBySQL(sql);
	 //println("sql****"+sql);
	if(querys!=null&& querys.size()>0){
		 
		var iter = querys.iterator();
		if(iter != null && iter.hasNext()){
		 
			doc = iter.next();
			id = doc.getId();
			formid=doc.getFormid();
			applicationid=doc.getApplicationid();
		}
		var request = $WEB.getParamsTable().getHttpRequest();
		url += "http://" + request.getServerName()+":" + request.getServerPort() + request.getContextPath();
		var templateForm="11e6-1259-48d33857-8df4-1fe7f193ff40";//模板id
		url += "/portal/dynaform/document/view.action?_docid="+id+"&_formid="+formid+"&_templateForm="+templateForm+"&application="+applicationid;
	}

	return url;
})()


 

流程中判断角色是否允许进入路径

判断角色是否允许进入路径:(主管、经理)

var rtn = false;
var curDoc = getCurrentDocument();
	var webUser = curDoc.getAuthor();
	var roles = webUser.getRoles();
	if(roles != null && roles.size()>0){
		
		for(var iter = roles.iterator();iter.hasNext();){
			var roleVo = iter.next();
			var roleName = roleVo.getName();
			if("主管".equals(roleName)||"经理".equals(roleName)){
				rtn = true;
				break;
			}
		}
	}
 rtn;


判断角色是否允许进入路径:(员工)(代码基本都差不多一致,只是返回true/false调整一下)

var rtn = true;
var curDoc = getCurrentDocument();
	var webUser = curDoc.getAuthor();
	var roles = webUser.getRoles();
	if(roles != null && roles.size()>0){
		
		for(var iter = roles.iterator();iter.hasNext();){
			var roleVo = iter.next();
			var roleName = roleVo.getName();
			if("主管".equals(roleName)||"经理".equals(roleName)){
				rtn = false;
				break;
			}
		}
	}
 rtn;


 路劲执行的脚本:(更改数据库meeting_status字段的状态)

var doc =getCurrentDocument();
doc.findItem("meeting_status").setValue("待审批");

var doc =getCurrentDocument();
doc.findItem("meeting_status").setValue("已发布");

流程执行路径发布时  发送站内信、短信的、邮件

var doc =getCurrentDocument();
doc.findItem("meeting_status").setValue("已发布");


var userIds = doc.getItemValueAsString("user_list");

var meetingTitle = doc.getItemValueAsString("title");
var startTime = doc.getItemValueAsString("start_time");
var address = doc.getItemValueAsString("address");

//发送信息通知参会人

var send_way = doc.getItemValueAsString("send_way");
var msgtitle=meetingTitle;
var msgcontent="请各位准时出席《"+meetingTitle+"》会议,开始时间:"+startTime+"地点:"+address;
var receiverId=userIds;
var msgdescription="";
var emailpassword="";
var senderid=doc.getItemValueAsString("user_id");

var uid = getWebUser().getId();  
println("======cu======="+uid)
println("======s======="+senderid)

//调用
#include "autosqllib";
deliverMassage(send_way, msgtitle, msgcontent, receiverId,msgdescription,emailpassword, senderid);




/*
函数格式:
deliverMassage(manner, msgtitle, msgcontent, receiverId, msgdescription, emailpassword, senderid)
函数说明:
Manner: 是发送类别 "10,20,30";字符串类型 title : 是主题
msgContent:内容
receiverId:收件人的id
msgdescription :描述
emailpassword :要发送邮件时,需要的邮箱密码
senderid  :类型的值 (可不传)(date类型
*/
function deliverMassage(manner, title, content, receiverId, description, emailpassword, senderid) {
        content = description + content;
        var curuserprocess = getUserProcess();
        var curuser = getWebUser();
        var userIds = receiverId;
        if (manner.indexOf("10") > -1) {
                var MSreceiver = createObject("java.util.ArrayList");
                MSreceiver = getUserIdList(userIds);
                if (MSreceiver != null && MSreceiver.size() > 0) {
                        for (var j = 0; j < MSreceiver.size(); j++) {
                                sendMessage(senderid, MSreceiver.get(j), title, content);
                        }
                }
        }
        if (manner.indexOf("20") > -1) {
                var docid = getId();
                var receiver = "";
                var isReply = false;
                var isMass = true;
                var SMSuser = createObject("java.util.ArrayList");
                SMSuser = getUserList(userIds);
                if (SMSuser != null && SMSuser.size()) {
                        if (SMSuser.size() == 0) {
                                isMass = false;
                        }
                        for (var i = 0; i < SMSuser.size(); i++) {
                                receiver = receiver + SMSuser.get(i).getTelephone() + ",";
                        }
                        sendSMS(docid, title, content, receiver, isReply, isMass);
                }
        }
        if (manner.indexOf("30") > -1 && emailpassword) {
                var userVO = curuserprocess.doView(senderid);
                var from = userVO.getEmail(); 
                // [email]niro@teemlink.com[/email]
                var to = ""; 
                // [email]zhangjuzhang@yahoo.com[/email]
                var SMuser = createObject("java.util.ArrayList");
                SMuser = getUserList(userIds);
                var i = from.indexOf("@");
                var host = from.substring(i + 1); 
                // teemlink.com
                var user = from; 
                // [email]niro@teemlink.com[/email]
                // var emailpassword=getItemValue("emailpassword"); 123456
                var bbc = null; 
                // 抄送
                var validate = true;
                var subject = title;
                var body = content;
                if (SMuser != null && SMuser.size() > 0) {
                        for (var i = 0; i < SMuser.size(); i++) {
                                to = SMuser.get(i).getEmail();
                                sendMail(from, to, subject, body, host, user, emailpassword, bbc, validate);
                        }
                }
        }
}

//获取userid结合返回list集合
function getUserIdList(userIds) {
        var userProcess = getUserProcess();
        var userIdList = createObject("java.util.ArrayList");
        var userList = createObject("java.util.ArrayList");
        var doc = getCurrentDocument();
        // var domainid = getDomainid();
        userIdList = userIds.split(";");
        for ( var i = 0; i < userIdList.length; i++) {
                var user = userProcess.doView(userIdList[i]);
                userList.add(user.getId());
        }
        return userList;
}

//获取用户对象集合
function getUserList(userIds) {
        var userProcess = getUserProcess();
        var userIdList = createObject("java.util.ArrayList");
        var userList = createObject("java.util.ArrayList");
        var doc = getCurrentDocument();
        // var domainid = getDomainid();
        userIdList = userIds.split(";");
        for ( var i = 0; i < userIdList.length; i++) {
                var user = userProcess.doView(userIdList[i]);
				var userVo = getUserById(user.getId());   
                userList.add(userVo);
        }
        return userList;

}


删除

主表数据删除时,删除子表数据,这里没有把主表id和子表的parent关联起来
而是使用自己设置的字段来关联
/删除动作后后后后执行的脚本//
(function(){
	var params = getParameter("_selects");       
	if(params!=null && params!=""){
		var recordids = splitText(params,";");//得到选中记录组的id
		
		var appid=getApplication();//获取应用ID
		var a=new Packages.cn.myapps.core.deploy.application.ejb.ApplicationProcessBean();//实例化application的应用处理类
		var avo=a.doView(appid);//获取软件应用对象
		var did=avo.getDatasourceid();//获取数据源的ID
		var db=new Packages.cn.myapps.core.dynaform.dts.datasource.ejb.DataSourceProcessBean();//实例化数据源的应用处理类
		var kk=db.doView(did);//获取数据源对象
		var dbsname=kk.getName();//获取数据源名称

		for(var i=0;i<recordids.length;i++){
			var meeting_id ="";
			var selectSql="select id,domainid,item_meeting_id from tlk_meeting_info where id='"+recordids[i]+"'";
			var datas=queryBySQL(selectSql);
			println("========="+datas.size());
			for(var iter = datas.iterator();iter.hasNext();){
			   var doc= iter.next();
			   meeting_id= doc.getItemValueAsString("meeting_id");
			}
			
			println("=====mid======="+meeting_id);
			//process.doRemove(recordids[i]);//根据文档ID,删除文档对象
			var sql = "delete from tlk_meeting_join_user where item_meeting_id='"+meeting_id+"'";
			if(!"".equals(dbsname)){
				deleteByDSName(dbsname,sql);	
			}
		}
	}
})()


//删除动作前前前执行的脚本//

(function(){
	var params = getParameter("_selects");       
	if(params!=null && params!=""){
		var recordids = splitText(params,";");//得到选中记录组的id
		
		var appid=getApplication();//获取应用ID
		var a=new Packages.cn.myapps.core.deploy.application.ejb.ApplicationProcessBean();//实例化application的应用处理类
		var avo=a.doView(appid);//获取软件应用对象
		var did=avo.getDatasourceid();//获取数据源的ID
		var db=new Packages.cn.myapps.core.dynaform.dts.datasource.ejb.DataSourceProcessBean();//实例化数据源的应用处理类
		var kk=db.doView(did);//获取数据源对象
		var dbsname=kk.getName();//获取数据源名称

		var process = new Packages.cn.myapps.core.dynaform.document.ejb.DocumentProcessBean(getApplication()); //实例化文档对象
		for(var i=0;i<recordids.length;i++){
		    var selectdoc = process.doView(recordids[i]);//根据ID查询document对象。

			println("=====doc======="+selectdoc);
			var mid = selectdoc.getItemValueAsString("meeting_id");
			println("=====mid======="+mid);
			//process.doRemove(recordids[i]);//根据文档ID,删除文档对象
			var sql = "delete from tlk_meeting_join_user where item_meeting_id='"+mid+"'";
			if(!"".equals(dbsname)){
				deleteByDSName(dbsname,sql);	
			}
		}
	}
})()

//删除动作前前前执行的脚本///

(function(){
	var params = getParameter("_selects");       
	if(params!=null && params!=""){
		var recordids = splitText(params,";");//得到选中记录组的id
		
		var appid=getApplication();//获取应用ID
		var a=new Packages.cn.myapps.core.deploy.application.ejb.ApplicationProcessBean();//实例化application的应用处理类
		var avo=a.doView(appid);//获取软件应用对象
		var did=avo.getDatasourceid();//获取数据源的ID
		var db=new Packages.cn.myapps.core.dynaform.dts.datasource.ejb.DataSourceProcessBean();//实例化数据源的应用处理类
		var kk=db.doView(did);//获取数据源对象
		var dbsname=kk.getName();//获取数据源名称

		var process = new Packages.cn.myapps.core.dynaform.document.ejb.DocumentProcessBean(getApplication()); //实例化文档对象
		for(var i=0;i<recordids.length;i++){
		    var selectdoc=findDocument(recordids[i]);
			println("=====doc======="+selectdoc);
			var mid = selectdoc.getItemValueAsString("meeting_id");
			println("=====mid======="+mid);
			//process.doRemove(recordids[i]);//根据文档ID,删除文档对象
			var sql = "delete from tlk_meeting_join_user where item_meeting_id='"+mid+"'";
			if(!"".equals(dbsname)){
				deleteByDSName(dbsname,sql);	
			}
		}
	}
})()


 


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一.系统模块的实现 在系统中包括以下功能:系统管理、学籍信息管理、课程信息管 理、成绩信息管理、帮助。分为以下几个模块 主窗体 标 题 名 称 系统管理 sysMenu ……用户管理 Control ……退出系统 Exit 学籍管理 sInfo 课程管理 cInfo 成绩管理 rInfo 帮助 help ……使用说明 howto ……关于 about 1.1登录模块 为了系统的安全,在进入系统之前首先会出现一个登录模块,用户只有在输入正确的用户名和正确的密码之后,才能进入系统。 用户登录窗体中放置了两个文本框(Textbox),用来输入用户名和密码;两个按钮(CommandButton)用来确定或者取消登录。 设置一个SSTab控件,供不同用户登录时选择用户权限,超级用户拥有一切权限(包括添加删除和修改以及对用户的管理),普通用户拥有受限制的权限(查询及修改密码),提高了数据库的安全性。 1.2系统管理模块 1.2.1添加用户窗体的创建 进入系统后,将会出现一个主窗体,选择系统管理模块下的添加用户,就可以进入添加用户窗体,可以通过该窗体增加新的用户。 在这个窗体中放置了三个文本框,用来输入用户名和密码;两个按钮用来确定是否添加用户;三个标签用来标示文本框的提示。 1.2.2修改密码窗体的创建 在系统管理模块下,进入修改密码窗体,用户可根据需要修改自己的密码。 在这个窗体中放置了两个文本框,用来输入密码和确认密码;两个按钮用来确定是否修改密码;两个标签用来标示文本框的内容。 1.3学籍管理模块 1.3.1添加学籍信息功能 选择主窗体中学籍管理模块下的添加学籍信息,就可进入添加学籍信息的窗体,在该窗体中我们可以对学生的学号、姓名、性别、出生日期、班号等学生的信息进行添加。设计时我尽可能设想各种边界条件,如记录为空,输入为空,输入出错等,当输入的信息满足这些边界条件时,将会弹出一个提示框提醒用户,以便用户能及时地做出修改。添加的信息将全部存储到数据库中。 在窗体上放置多个文本框和下拉式文本框,用来输入学籍信息;两个按钮用来确定是否输入学籍信息;一个按钮用来退出窗体;多个标签用来提示文本框中需要输入的内容。 1.3.2修改学籍信息功能 点击学籍管理模块下的修改学籍信息,就进入修改学籍信息的窗体,在该窗体中我们可以对前面添加的学籍信息进行修改。由于用户的需求不同,有的是要对学生的信息做个别的改动,有的是需要删除该条记录,所以该窗体同时包括了修改记录的功能和删除记录的功能。又考虑到用户的误操作,为了方便,我在该窗体中增添了取消修改的功能,可一次性把输入文本框的内容全部置空。 1.3.3查询学籍信息功能 进入学籍管理模块下的查询学籍信息窗体,在该窗体中可以对学生的信息进行查询,有三种查询方式。我在设计时,一方面考虑到简洁的因素,用户可以只设置一种查询方式进行查询;另一方面又为了避免数据的重复,用户可以输入详细的信息,也就是同时设置多种查询方式进行查询。进入查询窗体时,myflexgrid中会显示出所有学生的学籍信息,如果不设置查询方式就进行查询,是无效查询,系统会给出提示。在设置好查询方式后,便开始查询,将在myflexgrid中显示出用户所需的学生的学籍信息。 1.4课程管理模块 1.4.1课程信息浏览功能 点击主窗体中课程管理模块下的课程信息浏览,可进入课程信息浏览窗体。为了用户的使用方便,我使用了SSTab控件,故在该窗体中同时包含了课程信息的添加和修改的功能。并且我还在窗体上设置了myflexgrid控件。添加和修改记录后,对于数据有何变化都可以在myflexgrid中显示出来,使用户对所做的操作一目了然。 1.4.2年级课程设置功能 进入课程管理模块下的年级课程设置窗体,可以对每一个年级的课程进行设置。 1.5成绩管理模块 1.5.1成绩信息管理功能 点击成绩管理模块下的成绩信息浏览,进入成绩信息浏览窗体,考虑到美观和实用性,界面设置如下图。用Frame控件在窗体中划定一个可浏览成绩信息地方,再在Frame中添加MSFlexGrid控件,运行时将在MSFlexGrid中显示所有学生的成绩信息。使用Toolbar来建立工具条。点击工具条中的修改、添加和查询按钮就可分别进入修改成绩信息窗体、添加成绩信息窗体和查询成绩信息窗体。这三个窗体的界面设置分别类似于学籍管理下修改学籍信息窗体、添加学籍信息窗体和查询学籍信息窗体。 1.6其它 操作人员在遇到困难时即可进入帮助菜单寻求帮助。帮助菜单下的“使用说明”将解答你的疑问。帮助菜单下的“关于”详细地列出了关于作者的一些情况,关于版权的一些情况和关于系统的一些情况。进入打印菜单栏,可对你所需要的信息进行打印。 二 系统后期工程 在开发这个软件系统的漫长过程中,面对着极其错综复杂的问题,人的主观认识不可能完全符合客观现实,在本次设计过程中,我采用循环测试法,力求在每个阶段结束之前通过严格技术审查,即每完成一个功能,就进行测试,尽可能早的发现并纠正差错,完成模块测试之后再进行系统测试。 在该设计中,我偏重考虑了当用户输入的信息出错时,系统就会出现提示,以便让用户知道出错的原因,并能及时做出修改,所以我站在用户的角度考虑,尽可能设想各种边界条件,如记录为空,输入为空,输入出错等,以此来发现错误,纠正错误,取得了一定的效果。 当然,该学生信息管理系统也存在一些不足之处。在成绩管理界面,当3次改变成绩为不同的内容时,程序会出错。虽然尝试了很多方法,仍不能解决。再一点就是关于打印和年级课程信息设置都未能实现,这有待于以后的进一步提高。 一个应用系统性能的优劣,效率的高低始终应当由用户来做出判决,应用系统在运行过程中,用户会提出一些新的需求和建议,我就会根据用户需求的变化,对本系统做出一定的修改,使其进一步地得到完善和提高。 1. 概述 1.1. 目的 为了彻底解决了长期困扰教学信息化工作当中安全性、可靠性的问题;为了使管理人员可以随时看到更新的数据,极大地提高信息传递的速度;为了管理者再也不必为聘用专门的操作人员来给众多教师编辑学生成绩资料而殚精竭虑,在此,设计了学生课程成绩查询管理信息系统,使得各个使用者在操作上,从此变得那么从容简单,省时又省心。 1.2. 参考文档 [1] 张海藩.软件工程导论[M].第4版.北京:清华大学出版社.2007.25-63. [2] 赵洋,张丽,王恩东,李玉红.基于B/S结构学生成绩管理系统设计实现[J].沈阳化工学院学报.2007,21(2).140-142. [3] 游应德.基于Intemet的学生信息管理系统—学生成绩管理系统[D].电子科技大学.成都:电子科技大学,2007. [4]郑若忠,王鸿武.数据库原理与方法.湖南科学技术出版社.  2. 总体结构设计 2.1. 层次图 2.2结构图 2.3 功能设计 学生成绩单录入部分可以对某一个学生进行成绩录入,但是一次只能录入一条成绩记录,同时可对缺考、免考、补考学生成绩进行录入。 学生成绩显示/修改部分可以对已录入的成绩进行显示和修改,但是只能对系统默认的当前学期的记录进行修改。 学生成绩显示/删除部分可以对已录入的成绩进行显示和删除,但是也只能对系统默认的当前学期的记录进行删除。 2.3. 运行环境设计 2.3.1. 硬件设计 1.服务器: CPU:P4 2.0G以上 内存:512M 硬盘:60G以上 网络:100M /1000M Ethenet 2.客户机: CPU:500Mz 内存:64M以上 硬盘:1G以上 网络:10M Ethenet 2.3.2. 软件设计 1.服务器: 操作系统:Windows 2000/XP/2003 WEB服务:IIS5.0 数据库:SQL Server 2000(建议打Service Pack 3补丁) 2.客户机: 操作系统:Windows系列之一 浏览器:IE6.0以上版本 2.3.3.网络设计 采用sql server2000网络关系型数据库,存储读取数据将同步进行。 3.详细设计 用判定树表示教师端模块 4. 数据结构设计 4.1. 数据分析 第一层:基础数据及基础数据库分析 此类报表主要反映学校教师、学生和课程等的资料情况。 此类报表是将系统中较为常用的学生、教师和课程等基础资料以报表的形式予以反映。 在本层需要设计三个主表,分别用来存储学生资料、教师资料和课程资料。 第二层:业务流程数据及业务流程数据库分析 在编辑此类表单时,可以点击相应的下拉按钮,这时所有的选项资料都会显 来,您可以根据实际情况来编制表单,使整个过程更加清晰,操作更加简便。 在本层需要设计一个学生成绩主表,用来存储学生的平时成绩表。 4.2. 数据库设计 4.2.1. 设计原则 1.密码管理:学生修改学生查询密码;教师可以修改查询密码。 2.每个教师可以查看所有学生的成绩,包括每门课程的成绩、每门课程的平均成绩、每个分数段的成绩。 3.学生根据自己的学号查询本人的成绩。 4.教师可以登记、修改、查询自己所讲授课程的学生的成绩、该课程的总分、平均成绩、各分数段成绩人数统计、不及格学生的名单、成绩等等。 4.2.2. 数据库组成 数据表3个: 学生表(5个字段: xh, xm, xb, csrq, bj),其中有各班学生的记录 课程表(4个字段:kch,kcm, js, xf),其中有课程的记录; 成绩表(3个字段:xh, kch, cj),其中有学生成绩的记录。 学生基本信息表(Student)描述如下: 学生期末成绩表(Grade)描述如下: 学生的课程管理(Course)描述如下: 4.2.3. 面向对象数据库设计方法 1)考虑对象的静态和动态属性 对象属性决定了数据库或包含具有相同类型对象的表的内容。 2)描述数据实体及其属性 包含所有静态属性的单个对象被称作数据实体。每个单独的数据实体必须唯一,这样可以与其他实体区分。包含在数据实体中的对象的性质被称作为属性。(attribute) 3)用方法来说明对象的行为 关系数据库对象的行为决定了数据对象参与事务的特征。事务的发生对应着事件,通过使用响应事件的方法来实现事务。 4)在单个表中合并不同实体 可以在单个表中包含不同对象类型的说明,只要可以按照相同方式描述属性和行为,以及区分不同对象类型即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值