分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 C语言 C++ JAVA C# JSP PYTHON PHP
数据结构与算法 操作系统 编译原理 数据库 计算机网络 软件工程 VC++程序设计
游戏 PC程序 APP 网站 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019 2020

资源列表

  • 基于JAVA和Oracle数据库实现的项目信息管理系统

    1 需求分析1.1 背景项目管理系统,是反映公司员工资料,项目负责部门和项目进度,设备采购软件系统,是管理项目的有效工具。
    面向用户:对项目进度跟踪,公司人员信息管理和设备管理的公司。只能由公司内部查看数据库中的数据。要求使用本系统的用户管理系统的使用有所了解,知道基本的操作和使用过程的注意事项。
    1.2 系统目标系统对外部封闭,不允许外部人员访问公司项目管理系统中的数据库。能够安全的访问系统独立的数据库。程序实现数据库数据的直观显示,保证数据库的能够为公司提供较为方便和基础的项目管理服务,能够为公司管理层提供监督渠道。
    数据分析:员工的基本信息,部门的基本信息,项目的基本信息,设备基本信息
    1.3 功能分析项目管理系统应该能够提供以下功能:管理员登陆、员工信息管理、部门信息管理、项目信息管理、设备信息管理。

    管理员登录:项目管理系统采用Oracle数据库连接的服务名,用户名和口令(密码)验证模式,进入项目管理系统前项目管理员必须在登陆界面输入验证信息方可进入项目管理系统的主界面进行相应的操作
    学生信息管理:学生信息管理包含五个模块:学生信息的浏览、添加、删除、查询、修改
    部门信息管理:包含一个模块:部门经理信息查询
    项目信息管理:包含两个模块:根据项目经理的姓名查询项目的完成情况、查询某个项目的设备购买情况
    设备信息管理:包含三个模块:设备费用查询、设备供应商查询、添加设备

    1.4 性能需求分析
    系统易操作性:项目管理系统应该做到操作简单,界面友好,使得用户可以快速上手使用,不受到专业知识的限制
    系统可维护性:由于系统涉及的信息比较多,数据库中的数据需定期修改,系统可利用的空间及性能也随之下降,为了使系统更好地运转,用户可以对系统数据及一些简单的功能进行独立的维护及调整

    2 概念设计2.1 概念模型(E-R图)
    2.2 数据字典数据字典包括的项目有数据项、数据结构、数据流、数据存储、加工逻辑和外部实体。可使用一些符号来表示数据结构、数据流和数据存储的组成。
    2.2.1 员工表


    数据元素
    数据类型
    数据长度
    数据描述




    w_id
    VARCHAR2
    4
    员工编号


    w_name
    VARCHAR2
    16
    员工姓名


    sex
    CHAR
    2
    员工性别


    age
    CHAR
    20
    员工年龄


    contract_date
    DATE

    合同日期


    d_id
    VARCHAR2
    4
    部门编号


    d_name
    VARCHAR2
    12
    部门名称


    post
    VARCHAR2
    6
    员工职务



    2.2.2 部门表


    数据元素
    数据类型
    数据长度
    数据描述




    d_id
    VARCHAR2
    4
    部门编号


    d_name
    VARCHAR2
    12
    部门名称


    m_id
    VARCHAR2
    4
    部门经理编号


    m_name
    VARCHAR2
    8
    部门经理姓名


    w_num
    NUMBER

    员工人数



    2.2.3 项目表


    数据元素
    数据类型
    数据长度
    数据描述




    p_id
    VARCHAR2
    4
    项目编号


    p_name
    VARCHAR2
    16
    项目名称


    d_id
    VARCHAR2
    4
    部门名称


    w_id
    VARCHAR2
    4
    项目经理编号


    fund
    FLOAT
    126
    项目经费


    type
    VARCHAR2
    4
    项目类型


    signing_time
    DATE

    签订时间


    complete_time
    DATE

    应完成时间


    check_time
    DATE

    验收时间


    remarks
    VARCHAR2
    8
    备注



    2.2.4 设备表


    数据元素
    数据类型
    数据长度
    数据描述




    e_id
    VARCHAR2
    4
    设备编号


    e_name
    VARCHAR2
    12
    设备名称


    fee
    FLOAT

    设备费用


    supplier
    VARCHAR2
    12
    供应商


    p_id
    VARCHAR2
    4
    项目编号


    remarks
    VARCHAR2
    8
    备注



    2.3 数据流图数据流图(Data Flow Diagram)是一种图形化技术,它描绘信息流和数据从输入到输出的过程中所经受的变换。根据数据流图,可以分析出程序所需的模块和模块之间的调用关系。
    如下图所示,在项目管理系统,在用户界面捕捉用户的操作,接受事务后数据流流向不同的模块。

    3 逻辑结构设计3.1 关系描述
    员工与部门的关系:n:1一个员工只能属于一个部门,一个部门可以有多个员工
    部门与项目的关系:1:n一个部门可以负责多个项目,一个项目只能由一个部门负责
    员工与项目的关系:m:n一个员工可以实现多个项目,一个项目可以由多个员工实现
    员工与设备的关系:1:n一个员工可以采购多个设备,一个设备只能由一个员工采购
    项目与设备的关系:1:n一个项目可以使用多个设备,一个设备只能由一个部门使用

    3.2 系统结构图
    3.3 流程图
    4 系统实施4.1 建表语句/*==============================================================*//* Table: "worker" *//*==============================================================*/create table "worker" ( "w_id" VARCHAR2(4) not null, "w_name" VARCHAR2(8), "sex" CHAR(2), "age" CHAR(2), "contract_date" DATE, "post" VARCHAR2(8), "d_id" VARCHAR2(4), constraint PK_WORKER primary key ("w_id"));/*==============================================================*//* Table: "department" *//*==============================================================*/create table "department" ( "d_id" VARCHAR2(4) not null, "d_name" VARCHAR2(16), "m_id" VARCHAR2(4), constraint PK_DEPARTMENT primary key ("d_id"));/*==============================================================*//* Table: "project" *//*==============================================================*/create table "project" ( "p_id" VARCHAR2(4) not null, "p_name" VARCHAR2(16), "fund" FLOAT(126), "type" VARCHAR2(4), "signing_time" DATE, "complete_time" DATE, "check_time" DATE, "m_id" VARCHAR2(4), "remarks" VARCHAR2(256), constraint PK_PROJECT primary key ("p_id"));/*==============================================================*//* Table: "equipment" *//*==============================================================*/create table "equipment" ( "e_id" VARCHAR2(4) not null, "e_name" VARCHAR2(16), "fee" FLOAT(126), "supplier" VARCHAR2(16), "p_id" VARCHAR2(4), "remarks" VARCHAR2(256), constraint PK_EQUIPMENT primary key ("e_id"));
    4.2 插入数据4.2.1 worker表INSERT INTO "worker" VALUES ('1008', '马化腾', '男', '29', TO_DATE('20171229201245', 'YYYYMMDDHH24MISS'), '经理', '11');INSERT INTO "worker" VALUES ('1011', '雷军', '男', '21', TO_DATE('20171220085418', 'YYYYMMDDHH24MISS'), '职员', '11');INSERT INTO "worker" VALUES ('1006', '司马懿', '男', '56', TO_DATE('20171229202106', 'YYYYMMDDHH24MISS'), '职员', '13');INSERT INTO "worker" VALUES ('1005', '王超', '男', '38', TO_DATE('20171018161809', 'YYYYMMDDHH24MISS'), '经理', '14');INSERT INTO "worker" VALUES ('1001', '张三', '男', '26', TO_DATE('20171026143550', 'YYYYMMDDHH24MISS'), '职员', '11');INSERT INTO "worker" VALUES ('1002', '李四', '男', '25', TO_DATE('20171026143733', 'YYYYMMDDHH24MISS'), '职员', '12');INSERT INTO "worker" VALUES ('1003', '李玲', '女', '27', TO_DATE('20171026144030', 'YYYYMMDDHH24MISS'), '经理', '13');INSERT INTO "worker" VALUES ('1004', '王五', '男', '25', TO_DATE('20171026144412', 'YYYYMMDDHH24MISS'), '经理', '14');
    4.2.2 department表INSERT INTO "department" VALUES ('11', '采购部', '1008');INSERT INTO "department" VALUES ('12', '销售部', '1002');INSERT INTO "department" VALUES ('13', '策划部', '1003');INSERT INTO "department" VALUES ('14', '人事部', '1004');
    4.2.3 project表INSERT INTO "project" VALUES ('004', '跨海大桥', 300000000, '桥梁', TO_DATE('20160226150155', 'YYYYMMDDHH24MISS'), TO_DATE('20170326150206', 'YYYYMMDDHH24MISS'), TO_DATE('20171001150213', 'YYYYMMDDHH24MISS'), '1004', NULL);INSERT INTO "project" VALUES ('001', '京沪高速', 300000, '建筑', TO_DATE('20170901145036', 'YYYYMMDDHH24MISS'), TO_DATE('20171026145042', 'YYYYMMDDHH24MISS'), TO_DATE('20171027145048', 'YYYYMMDDHH24MISS'), '1005', NULL);INSERT INTO "project" VALUES ('002', '青藏铁路', 1500000, '建筑', TO_DATE('20170701145439', 'YYYYMMDDHH24MISS'), TO_DATE('20170901145459', 'YYYYMMDDHH24MISS'), TO_DATE('20171026145505', 'YYYYMMDDHH24MISS'), '1008', NULL);INSERT INTO "project" VALUES ('003', '鸟巢', 30000000, '工程', TO_DATE('20170801145900', 'YYYYMMDDHH24MISS'), TO_DATE('20170901145906', 'YYYYMMDDHH24MISS'), TO_DATE('20171004145911', 'YYYYMMDDHH24MISS'), '1003', NULL);
    4.2.4 equipment表INSERT INTO "equipment" VALUES ('101', '挖掘机', 100000, '徐工', '001', NULL);INSERT INTO "equipment" VALUES ('102', '玻璃', 10000, '通用', '003', NULL);INSERT INTO "equipment" VALUES ('103', '铝合金', 20000, '上汽', '002', NULL);INSERT INTO "equipment" VALUES ('104', '液晶', 50000, '京东方', '004', NULL);INSERT INTO "equipment" VALUES ('105', '台式机', 100000, '清华同方', '003', '办公专用');INSERT INTO "equipment" VALUES ('108', 'A4纸', 200, '华润', '003', NULL);INSERT INTO "equipment" VALUES ('109', '键鼠套装', 1000, '达尔优', '003', NULL);
    5 运行维护转储:定期进行静态转储,动态转储,海量转储。
    数据库中可能发生各种各样的故障,大致可以分为以下几类:

    事务故障的恢复策略主要是:反向扫描日志文件,查找该事物的更新操作;对该事物的更新操作执行逆操作;继续反向扫描日志文件,查找该事物的其他更新操作,并做同样处理;如此处理下去,直至读到此事物的开始标记,事物故障恢复就完成了。
    系统故障的恢复策略主要是:正向扫描日志文件,找出在故障发生前已经提交的事务,将其事务标识记入重做队列。同时找出故障发生时尚未完成的事务,将其事务标识记入撤消队列;对撤消队列的各个事务进行撤消处理;对重做队列的各个事务进行重做处理。
    介质故障的恢复策略主要是:装入最新的数据库后备副本,使数据库恢复到最近一次转储的一致性状态。装入相应的日志文件副本,重做已完成的事物。

    6 用户手册6.1 安装及配置本系统基于Java开发,要使用本系统在本机上必须安装有Java开发环境,数据库使用Oracle。
    6.2 使用方法登录界面

    主界面

    6.3 基本操作运行程序之后首先进入登陆界面,在登录界面中输入服务名,用户名(数据库的用户名,比如SCOTT),密码。例如我的数据库的服务名是orcl,用户名是CHAN。经过正确的连接即可进入到程序的主界面。

    如下图所示,应用程序界面包括 “切换卡 (用来切换页面)”,“显示区 (显示基本信息)”,“查询区 (用来进行数据查询)”,“控制按钮 (用来进行基本操作)”。

    员工页面,点击打开表格可以查看所有员工的基本信息,关闭表格可以清空页面上的表格显示。

    点击添加信息可以添加某个员工的信息:

    点击修改可以修改某个员工的信息(注意:员工的编号在数据库中是唯一的,被修改的员工的编号在数据库中必须存在)

    点击删除信息可以删除某个员工的信息(同样编号必须存在)

    在部门页面可以通过部门名称查询部门经理的信息:


    在项目页面

    点击查询完成情况可以查询某项目经理(姓名)完成合同的情况

    点击查询设备采购可以某个项目设备采购情况

    在设备页面有一下几个查询:

    7 附录对客户端进行响应的逻辑处理函数大部分通过在客户端中调用数据库的存储过程完成。
    客户端程序逻辑处理的核心代码如下(界面代码在提交的工程中):
    import com.connectdb.ConnectDB;import oracle.jdbc.OracleTypes;import java.sql.*;import java.text.SimpleDateFormat;import java.util.Vector;import java.util.Date;public class ProjectFunction { /** * 添加员工信息 * @param */ public static boolean addWorker(String wId,String dId,String wName,String sex,String age,String date,String dName,String post){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); System.out.println(wId+dId+wName+sex+age+date+dName+post); try { CallableStatement c = conn.prepareCall("{call p_addworker(?,?,?,?,?,?,?)}"); c.setString(1,wId); c.setString(2,wName); c.setString(3,sex); c.setString(4,age); System.out.println("传入的时间是 "+date); c.setString(5,date); c.setString(6,post); c.setString(7,dId); //c.setDate(6,Date.valueOf(date)); //执行Oracle存储过程 c.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return true; } /** * 删除员工信息 * @param */ public static void deleteWorker(String wId){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); try { CallableStatement c = conn.prepareCall("{call p_delworker(?)}"); c.setString(1,wId); //执行Oracle存储过程 c.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } } /** * 查询员工信息 * @param */ public static Vector<Vector<String>> queryWorker(String sql){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); ResultSet rs=null; Vector<Vector<String>> list=new Vector<Vector<String>>(); int i=0; try { Statement st = conn.createStatement(); rs = st.executeQuery(sql); System.out.println("执行查询"); // 判断结果集是否有效 while(rs.next()){ // 数据库存在,返回结果集 System.out.println(rs.getString("w_id")); System.out.println(rs.getString("w_name")); System.out.println(rs.getString("sex")); System.out.println(rs.getString("post")); Vector<String> result=new Vector<String>(); result.add(rs.getString("w_id")); result.add(rs.getString("w_name")); result.add(rs.getString("sex")); result.add(rs.getString("d_name")); result.add(rs.getString("post")); result.add(rs.getDate("contract_date").toString()); list.add(i,result); i++; } // 释放此 ResultSet 对象的数据库和 JDBC 资源 rs.close(); // 释放此 PreparedStatement 对象的数据库和 JDBC 资源 st.close(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return list; } /** * 修改员工信息 * @param */ public static boolean updateWorker(String wId,String dId,String wName,String sex,String age,String date,String dName,String post){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); System.out.println(wId+dId+wName+sex+age+date+dName+post); try { CallableStatement c = conn.prepareCall("{call p_updateworker(?,?,?,?,?,?,?)}"); c.setString(1,wId); c.setString(2,wName); c.setString(3,sex); c.setString(4,age); System.out.println("传入的时间是 "+date); c.setString(5,date); c.setString(6,post); c.setString(7,dId); //c.setDate(6,Date.valueOf(date)); //执行Oracle存储过程 c.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return true; } /** * 获取员工列表 * @param */ public static Vector<Vector<String>> getWorkerList(){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); ResultSet rs=null; Vector<Vector<String>> list=new Vector<Vector<String>>(); int i=0; try { Statement st = conn.createStatement(); String sql="SELECT * FROM \"worker\""; rs = st.executeQuery(sql); // 判断结果集是否有效 while(rs.next()){ // 数据库存在,返回结果集 Vector<String> result=new Vector<String>(); result.add(rs.getString("w_id")); result.add(rs.getString("w_name")); result.add(rs.getString("sex")); result.add(rs.getString("post")); result.add(rs.getDate("contract_date").toString()); result.add(rs.getString("d_id")); list.add(i,result); i++; } System.out.println("长度 "+list.size()); rs.close(); // 释放此 PreparedStatement 对象的数据库和 JDBC 资源 st.close(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return list; } /** * 查询部门经理 * @param */ public static Vector<String> queryManager(String dName){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String wId="",wName="",sex="",age="",post="",contractTime=""; Vector<String> list=new Vector<String>(); try { CallableStatement c = conn.prepareCall("{call P_FDMANAGER(?,?,?,?,?,?,?)}"); c.setString(1,dName); c.registerOutParameter(2, OracleTypes.VARCHAR); c.registerOutParameter(3,OracleTypes.VARCHAR); c.registerOutParameter(4,OracleTypes.CHAR); c.registerOutParameter(5,OracleTypes.CHAR); c.registerOutParameter(6,OracleTypes.DATE); c.registerOutParameter(7,OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); wId=c.getString(2); wName=c.getString(3); sex=c.getString(4); age=c.getString(5); contractTime=c.getDate(6).toString(); post=c.getString(7); System.out.println("执行查询"); list.add(wId); list.add(wName); list.add(sex); list.add(age); list.add(contractTime); list.add(post); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return list; } /** * 查询项目设备采购信息 * @param */ public static Vector<String> getEqubyPro(String pName){ Vector<String> result=new Vector<String>(); // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String eNmae="",eSupplier=""; float eFee; try { CallableStatement c = conn.prepareCall("{call P_GETEBYP(?,?,?,?)}"); c.setString(1,pName); c.registerOutParameter(2, OracleTypes.VARCHAR); c.registerOutParameter(3,OracleTypes.FLOAT); c.registerOutParameter(4,OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); eNmae=c.getString(2); eFee=c.getFloat(3); eSupplier=c.getString(4); result.add(eNmae); result.add(String.valueOf(eFee)); result.add(eSupplier); System.out.println("查询设备 "+eNmae+eFee+eSupplier); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return result; } /** * 查询设备采购费用信息 * @param */ public static float getEquFee(String eName){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); float eFee=0; try { CallableStatement c = conn.prepareCall("{call P_GETEFEE(?,?)}"); c.setString(1,eName); c.registerOutParameter(2,OracleTypes.FLOAT); //执行Oracle存储过程 c.execute(); eFee=c.getFloat(2); System.out.println("查询设备 "+eName+eFee+"----"); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return eFee; } /** * 添加设备 * @param */ public static void addEqu(String eId,String eName,float fee,String supplier,String remarks,String pId){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); System.out.println(eId+eName+fee+supplier+remarks+pId); try { CallableStatement c = conn.prepareCall("{call p_addequ(?,?,?,?,?,?)}"); c.setString(1,eId); c.setString(2,eName); c.setFloat(3,fee); c.setString(4,supplier); c.setString(5,pId); c.setString(6,remarks); //执行Oracle存储过程 c.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } } /** * 查询设备供应商信息 * @param */ public static String getEquSup(String eName){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String eSupplier=""; try { CallableStatement c = conn.prepareCall("{call P_GETESUP(?,?)}"); c.setString(1,eName); c.registerOutParameter(2,OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); eSupplier=c.getString(2); System.out.println("查询设备 "+eName+eSupplier); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return eSupplier; } /** * 查询项目员工信息 * @param */ public static void getWerbyPro(String pName){ // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String wNmae="",wId=""; float eFee; try { CallableStatement c = conn.prepareCall("{call P_GETEBYP(?,?,?,?)}"); c.setString(1,pName); c.registerOutParameter(2, OracleTypes.VARCHAR); c.registerOutParameter(3,OracleTypes.FLOAT); c.registerOutParameter(4,OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); wNmae=c.getString(2); wId=c.getString(4); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } } /** * 查询项目完成情况 * @param */ public static Vector<String> queryComplete(String ManagerName){ Vector<String> result=new Vector<String>(); // 获取数据库连接Connection对象 Connection conn = ConnectDB.getConnection(); String date1="",date2="",pName="",isComplete=""; try { CallableStatement c = conn.prepareCall("{call P_ISFINISHED(?,?,?,?)}"); c.setString(1,ManagerName); c.registerOutParameter(2, OracleTypes.DATE); c.registerOutParameter(3, OracleTypes.DATE); c.registerOutParameter(4, OracleTypes.VARCHAR); //执行Oracle存储过程 c.execute(); date1=c.getString(2).toString(); date2=c.getString(3).toString(); pName=c.getString(4); System.out.println("签订时间是:"+date2); System.out.println("应完成时间是:"+date1); //pName=c.getString(4); Date date; date=c.getDate(2); System.out.println("应完成时间是 "+date1); System.out.println("时间格式 "+date); Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//可以方便地修改日期格式 String hehe = dateFormat.format( now ); System.out.println(hehe); if(date1.compareTo(hehe)<0){ isComplete="已完成"; System.out.println("已经完成"); } else { isComplete="未完成"; } result.add(pName); result.add(date2); result.add(date1); result.add(isComplete); } catch (Exception e) { e.printStackTrace(); }finally{ // 关闭数据库连接 ConnectDB.closeConnection(conn); } return result; }}
    8 总结8.1 遇到的问题Oracle数据库与之前接触过的数据库SQL语句有些不一样,除了常用的增删查改与其他主关系型数据库相似,其他的语句还是有一些区别的。在实习中经常因为在SQL语句中少个双引号或者将双引号写成单引号而出错,所以在刚开始写存储过程中用了不少时间。可见Oracle数据库对语法的要求比较严格。
    8.2 存在的问题
    在这次实习中,我发现自己的数据库设计能力还稍有不足,对项目管理系统的几个表的设计不是很合理,表中有些字段的类型和长度可能与实际应用不相符。在进行数据库设计时应该考虑实际项目中的应用,这样才能设计出满足实际需求的数据库管理系统。
    客户端程序中的程序设计时没有很好地采用架构来实现。使用三层逻辑架构时没有做到完全的层次分离,在表现层中还存在一些业务逻辑层的代码。数据库中每个表都应该用一个类来封装,然后对类中的成员变量也就是数据库表中的每个字段分别设置set()和get()方法。
    程序尚存在一些已知和未知的BUG,反映出自己在程序设计时对问题的考虑不够全面,对于在实际中可能存在的情况没完全把握。

    8.3 收获
    通过完成数据库课程设计,加深了我对数据库理论知识和在实际应用方面的认识,在实践中发现了自己在数据库设计和程序设计上的不足,对于提高自己的编程能力很有帮助。实习中的数据库设计部分可以巩固在实用数据库中的知识,让我学会在实际场景中更好地使用数据库。
    这次实习让我学习了在项目中经常使用到的主流关系型数据库Oracle,掌握Oracle的特征和基本使用方法。在项目中使用Oracle可以实现对SQL语句的封装,不仅提高程序的执行效率还提高了数据的安全性。当对数据库进行复杂操作时(如对多个表进行 Update, Insert, Query, Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
    7 评论 301 下载 2018-11-05 15:14:59 下载需要13点积分
  • 基于C++实现的学生选修课程系统

    1.题目学生选修课程系统设计
    2.设计任务及要求2.1 任务假定有n门课程,每门课程有:课程编号,课程名称,课程性质(公共课、必修课、选修课),总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。试设计该选修课程系统。
    2.2 要求
    设计一个抽象类表示课程,包括课程最基本的属性和行为
    在课程抽象类的基础上派生出选修课程类
    设计一个学生类,表示某一个学生的选修课程的情况
    用主程序模拟多个学生的选课过程
    要求有文件支持选课内容的永久保存;使之能提供以下功能:

    系统以文本菜单方式工作对学生进行各种操作对课程信息进行各种操作

    其中, 查询方式可按学分查询、按课程性质查询5、学生选修课程(可选项)。
    3.软件环境及工具
    Microsoft Visual C++ 6.0
    Windows操作系统

    4.课程设计内容4.1 概要设计4.1.1 类的介绍Course_ZR类
    主要功能是作为基类为子类的功能实现提供模板。



    Course_ZR




    course_num、 course_name、 course_nature、 all_hours、 teach_hours、 practice_hours、 credit、 term


    virtual void data_show()=0、 virtual void search_credit(float n)=0、 virtual void search_nature()=0、 virtual void search_hours(int h)=0;(纯虚函数) get_course_num()函数、 get_course_name()函数、 get_course_nature()函数、 get_all_hours()函数、 get_teach_hours()函数、 get_practice_hours()函数、 get_credit()函数、get_term()函数、get_day()函数



    Public_course_ZR类
    主要功能为作为公共课信息储存和传递的接口。



    Public_course_ZR




    course_num、 course_name、 course_nature、 all_hours、 teach_hours、practice_hours、 credit、 term、teacher


    virtual void search_credit(float n); virtual void search_nature(); virtual void search_hours(int h); friend ostream & operator<<(ostream &,Public_course_ZR &); friend istream & operator>>(istream &,Public_course_ZR &); data_show()函数、 get_teacher()函数



    Required_course_ZR
    主要功能为作为必修课信息储存和传递的接口。



    Required_course_ZR




    course_num、 course_name、 course_nature、 all_hours、 teach_hours、practice_hours、 credit、 term、teacher


    virtual void search_credit(float n); virtual void search_nature(); virtual void search_hours(int h); friend ostream & operator<<(ostream &,Required_course_ZR &); friend istream & operator>>(istream &,Required_course_ZR &); data_show()函数、 get_teacher()函数



    ElctiveCourse_HWN类
    主要功能为作为选修课信息储存和传递的接口。



    ElctiveCourse_HWN




    course_num、 course_name、 course_nature、 all_hours、 teach_hours、practice_hours、 credit、 term、teacher


    void search_credit(float n);//纯虚函数的实现 void search_nature(); void search_hours(int h); friend ostream & operator<<(ostream &,ElctiveCourse_HWN &); friend istream & operator>>(istream &,ElctiveCourse_HWN &); data_show ()函数、get_teacher()函数



    Student_HWN类
    主要功能为作为学生选课信息储存和传递的接口。



    Student_HWN




    num、 Class、 name、 personal_num、personal_password


    void delete_Publiccourse(int)、//退选相关函数 void delete_Requiredcourse(int)、 void delete_Elctivecourse(int)、 friend ostream & operator<<(ostream &,Student_HWN &)、 friend istream & operator>>(istream &,Student_HWN &)、 get_num()函数、get_Class()函数、get_name()函数、 get_personal_num()函数、 get_personal_password()函数



    4.1.2 类间关系
    4.1.3对象字典


    类名
    父类
    提供的服务
    需要的服务




    Course_ZR

    作为父类为子类的实现提供模板



    Student_HWN

    作为存储学生对课程信 息的操作的存储
    读取学生信息存储文档


    Public_course_ZR
    Course_ZR
    作为获取文档中有关公共课信息的媒介
    读取公共课课程信息操作


    Required_course_ZR
    Course_ZR
    作为获取文档中有关必修课信息的媒介
    读取必修课课程信息操作


    ElctiveCourse_HWN
    Course_ZR
    作为获取文档中有关选修课信息的媒介
    读取选修课课程信息操作



    4.2 详细设计4.2.1 Course_ZR类
    属性介绍
    int course_num; //表示课程的编号,用于体现课程信息string course_name; //表示课程的名称,用于体现课程信息string course_nature; //表示课程的性质(看是公共课,必修课,还是选修课),用于体现课程信息int all_hours; //表示课程的总学时,用于体现课程信息int teach_hours; //表示课程的授课学时,用于体现课程信息int practice_hours; //表示课程的实践学时,用于体现课程信息float credit; //表示课程的学分,用于体现课程信息string term; //表示课程开设在哪个学期,用于体现课程信息string day; //表示课程开设在星期几,用于体现课程信息
    接口

    virtual void data_show()=0;

    程序功能:作为所有信息的显示输出入口参数:无返回值: 无
    virtual void search_credit(float n)=0;

    程序功能:将符合学分为n的所有课程信息显示输出入口参数:n返回值: 无
    virtual void search_nature()=0;

    程序功能:作为一个课程类型的所有课程信息的显示输出入口参数:无返回值: 无
    virtual void search_hours(int h)=0;

    程序功能:作为所有信息的显示输出入口参数:无返回值: 无
    int get_course_num(){return course_num;}

    程序功能:作为获取课程编号的接口入口参数:无返回值: course_num
    string get_course_name(){return course_name;}

    程序功能:作为获取课程名称的接口入口参数:无返回值: course_name
    string get_course_nature(){return course_nature;}

    程序功能:作为获取课程性质的接口入口参数:无返回值: course_nature
    int get_all_hours(){return all_hours;}

    程序功能:作为获取课程总学时的接口入口参数:无返回值: all_hours
    int get_teach_hours(){return teach_hours;}

    程序功能:作为获取课程授课学时的接口入口参数:无返回值: teach_hours
    int get_practice_hours(){return practice_hours;}

    程序功能:作为获取课程实验或上机学时的接口入口参数:无返回值: practice_hours
    float get_credit(){return credit;}

    程序功能:作为获取课程学分的接口入口参数:无返回值: credit
    string get_term(){return term;}

    程序功能:作为获取课程学期的接口入口参数:无返回值: term
    string get_day(){return day;}

    程序功能:作为获取课程日期的接口入口参数:无返回值: day

    4.2.2 Public_course_ZR类
    属性介绍
    int course_num; //表示公共课的编号,用于体现课程信息string course_name; //表示公共课的名称,用于体现课程信息string course_nature; //表示公共课,用于体现课程信息int all_hours; //表示公共课的总学时,用于体现课程信息int teach_hours; //表示公共课的授课学时,用于体现课程信息int practice_hours; //表示公共课的实践学时,用于体现课程信息float credit; //表示公共课的学分,用于体现课程信息string term; //表示公共课开设在哪个学期,用于体现课程信息string day; //表示公共课开设在星期几,用于体现课程信息string teacher; //表示课程的老师是谁,用于学生选课时候得知该门 课程的授课老师的信息
    接口

    void data_show()

    程序功能:作为Public_course_ZR类对象的信息显示输出入口参数:无返回值: 无
    virtual void search_credit(float n);

    程序功能:筛选出Public_course_ZR类对象符合学分要求的信息显示输出入口参数:n返回值: 无
    virtual void search_nature();

    程序功能:Public_course_ZR类对象所有的信息显示输出入口参数:无返回值: 无
    virtual void search_hours(int h);

    程序功能:Public_course_ZR类对象所有符合总学时要求的信息显示输出入口参数:h返回值: 无
    string get_teacher(){return teacher;}

    程序功能:Public_course_ZR类对象所有教师信息获取接口入口参数:无返回值: teacher
    ostream & operator<<(ostream &output,Public_course_ZR &a)

    程序功能:对“<<”重载输出Public_course_ZR类对象入口参数:&output,&a返回值: output
    istream & operator>>(istream &input,Public_course_ZR &a)

    程序功能:对“>>”重载输入Public_course_ZR类对象入口参数:&input,&a返回值: input

    4.2.3 Required_course_ZR类
    属性介绍
    int course_num; //表示必修课的编号,用于体现课程信息string course_name; //表示必修课的名称,用于体现课程信息string course_nature; //表示必修课,用于体现课程信息int all_hours; //表示必修课的总学时,用于体现课程信息int teach_hours; //表示必修课的授课学时,用于体现课程信息int practice_hours; //表示必修课的实践学时,用于体现课程信息float credit; //表示必修课的学分,用于体现课程信息string term; //表示必修课开设在哪个学期,用于体现课程信息string day; //表示必修课开设在星期几,用于体现课程信息string teacher; //表示课程的老师是谁,用于学生选课时候得知该门课程的授课老师的信息
    接口

    void data_show()

    程序功能:Required_course_ZR类对象所有信息显示输出入口参数:无返回值: 无
    virtual void search_credit(float n);

    程序功能:筛选出Required_course_ZR对象符合学分要求的信息显示输出入口参数:n返回值: 无
    virtual void search_nature();

    程序功能:Required_course_ZR类对象所有的信息显示输出入口参数:无返回值: 无
    virtual void search_hours(int h);

    程序功能:Required_course_ZR类对象所有符合总学时要求的信息显示输出入口参数:h返回值: 无
    string get_teacher(){return teacher;}

    程序功能:Required_course_ZR类对象所有教师信息获取接口入口参数:无返回值: teacher
    ostream & operator<<(ostream &output,Required_course_ZR &a)

    程序功能:对“<<”重载输出Required_course_ZR类对象入口参数:&output,&a返回值: output
    istream & operator>>(istream &input,Required_course_ZR &a)

    程序功能:对“>>”重载输入Required_course_ZR类对象入口参数:&input,&a返回值: input

    4.2.4 ElctiveCourse_HWN类
    属性介绍
    int course_num; //表示选修课的编号,用于体现课程信息string course_name; //表示选修课的名称,用于体现课程信息string course_nature; //表示选修课,用于体现课程信息int all_hours; //表示选修课的总学时,用于体现课程信息int teach_hours; //表示选修课的授课学时,用于体现课程信息int practice_hours; //表示选修课的实践学时,用于体现课程信息float credit; //表示必修课的学分,用于体现课程信息string term; //表示选修课开设在哪个学期,用于体现课程信息string day; //表示选修课开设在星期几,用于体现课程信息string teacher; //表示课程的老师是谁,用于学生选课时候得知该门课程的授课老师的信息
    接口

    void data_show()

    程序功能:ElctiveCourse_HWN 类对象所有信息显示输出入口参数:无返回值: 无
    virtual void search_credit(float n);

    程序功能:筛选出ElctiveCourse_HWN对象符合学分要求的信息显示输出入口参数:n返回值: 无
    virtual void search_nature();

    程序功能:ElctiveCourse_HWN类对象所有的信息显示输出入口参数:无返回值: 无
    virtual void search_hours(int h);

    程序功能:ElctiveCourse_HWN类对象所有符合总学时要求的信息显示输出入口参数:h返回值: 无
    string get_teacher(){return teacher;}

    程序功能:ElctiveCourse_HWN类对象所有教师信息获取接口入口参数:无返回值: teacher
    ostream & operator<<(ostream & output,ElctiveCourse_HWN &EC )

    程序功能:对“<<”重载输出ElctiveCourse_HWN类对象入口参数:&output,&EC返回值: output
    istream & operator>>(istream &input,ElctiveCourse_HWN &a)

    程序功能:对“>>”重载输入ElctiveCourse_HWN类对象入口参数:&input,&a返回值: input

    4.2.5 Student_HWN类
    属性介绍
    Public_course_ZR Pu[5]; //表示一个公共课对象数组,用于存储学生的对公共课的相关操作(选课,查看或者退课)Required_course_ZR Re[5]; //表示一个必修课对象数组,用于存储学生对必修课的相关操作选课,查看或者退课)ElctiveCourse_HWN El[5]; //表示一个选修课对象数组,用于存储学生的对公共课的相关操作(选课,查看或者退课)int num; //表示该学生的学号,用于表现学生的信息string Class; //表示该学生的班级,用于表现学生的信息string name; //表示该学生的名字,用于表现学生的信息int personal_num; //表示学生的个人学号,用于登录时候与输入的学号进行比对int personal_password; //表示学生的密码,用于登录时候与输入的密码进行比对
    接口

    void Student_HWN::delete_Publiccourse(int a)

    程序功能:筛选出要退选的公共课对象信息并删除入口参数:a返回值: 无
    void Student_HWN::delete_Requiredcourse(int a)

    程序功能:筛选出要退选的必修课对象信息并删除入口参数:a返回值: 无
    void Student_HWN::delete_Elctivecourse(int a)

    程序功能:筛选出要退选的选修课对象信息并删除入口参数:a返回值: 无
    int get_num(){return num;}

    程序功能:作为获取学生学号信息的接口入口参数:无返回值: num
    string get_Class(){return Class;}

    程序功能:作为获取学生所在班级信息的接口入口参数:无返回值: Class
    string get_name(){return name;}

    程序功能:作为获取学生姓名信息的接口入口参数:无返回值:name
    int get_personal_num(){return personal_num;}

    程序功能:作为获取学生登录学号信息的接口入口参数:无返回值:personal_num
    int get_personal_password(){return personal_password;}

    程序功能:作为获取学生登录密码信息的接口入口参数:无返回值:personal_password
    ostream & operator<<(ostream &output,Student_HWN &a)

    程序功能:对“<<”重载输出Student_HWN类对象入口参数:&output,&a返回值: output
    istream & operator>>(istream &input,Student_HWN &a)

    程序功能:对“>>”重载输入Student_HWN类对象入口参数:&input,&a返回值: input

    5.调试与测试5.1 测试5.1.1 密码登录界面
    测试学号:160708283
    测试密码:123456


    5.1.2 必修课界面
    进入大学英语界面后进行浏览

    5.2 系统遗留问题
    在进行退选时候,应该再次让用户考虑一下是否真的进行退选,然后再进行退选。
    当输入编号不存在的情况时,并没有很好的解决问题

    选择的课程编号不存在:
    最后没出现“没有该门课程,请重新选择”的语句报错,而是直接加了第一门课程编号。
    输入编号为 201751



    好像如果连着输入的编号是已选或者跟那个已选课程的日期有冲突的话会出现死循环,会出现“该课程与所选课程日期冲突,请重新输入”,无论是不是冲突了
    6.设计心得与总结这次作为第二次的课程设计学习,收获还是很大的,很明显感觉到自己在写代码方面的进步,无论是写起来更加顺手了还是在思考上逻辑更加通畅了,这些进步都是能够鼓励我更加认真去完成项目的动力。这次的活动也算是让我有点感受到了“熟能生巧”的含义。但是这次的突破并不是很明显,在程序的内容上有些进步但是外观以及操作上还是没有什么提高。也许是和熟悉的伙伴合作的原因,这次做起项目来需要磨合的也少,所以工作效率比较高,项目进展也算比较顺利的,没有遇到什么很大的问题。很有意义的一次活动,也提升了我们彼此之间的默契。
    2 评论 2 下载 2020-11-26 10:04:39 下载需要7点积分
  • 基于python实现的udp可靠文件传输

    一、项目说明
    本项目使用Python进行实现
    采用Client-Server架构,源代码有两个文件client.py和server.py,两个文件需要放在同一目录下才能运行客户端/服务端功能,支持大文件传输(下载/上传)。服务端监听端口限定为10000,传输端口在10001-10009之间,监听端口用于与用户建立连接,传输端口用于与用户进行文件数据的传输,最大支持9个线程同时工作(此处可以修改,以更改端口号或者最大连接数)

    服务端使用方法:命令行输入 python server.py即可客户端使用方法:命令行输入python client.py lget/lsend ipv6_hostname filename
    使用UDP作为传输层,使用IPV6作为网络层,所以传输速度比较快
    实现了100%可靠传输
    实现类似TCP的流式控制功能
    实现类似TCP的拥塞控制功能
    服务端支持多用户同时下载/上传

    关于参数改进:如果使用的时候发现大量丢包,需要更改下面的常量值,以此优化传输:
    Client.py中:

    Server.py中:

    网络越拥堵,MAX_DATA_LENGTH、RECV_WINDOW两个常量值越应该设置的小一点:
    如果网络状况非常拥堵,这两个参数推荐(client.py和server.py都需要更改这两个参数):

    将MAX_DATA_LENGTH设置为300(每个UDP数据包大小)
    将RECV_WINDOW设置为400(接收方拥塞窗口大小)

    二、结构设计客户端具有从服务器下载和上传的功能,因此我们分别设计Recv_Unit和Send_Unit两个类分别完成下载和上传功能。
    客户端下载文件时实例化Recv_Unit并调用该类的recv_file方法接收服务端发来的文件,同时服务端实例化Send_Unit并调用send_file向用户发送文件。
    客户端上传文件时则相反,由客户端实例化Send_Unit并调用该类的send_file方法向服务器发送文件,同时服务端实例化Recv_Unit并调用recv_file方法接收用户发来的文件。
    因此主要设计包含:class Send_Unit 上传类、class Recv_Unit 下载类、class Fragmentation分片类,下面分别介绍:
    2.1 class Send_Unit 上传类
    该类用于向远程主机发送数据,其实例变量与各自的说明如上图注释中所示,有端口、套接字、目的IP地址、总数据段数量、用于模拟TCP的send base、send window、rwnd、cwnd、ssthresh、计时器、冗余ACK计数和表示拥塞控制中三个状态的变量等。
    下面简要说明该类的4种方法。
    send方法
    调用该方法向远程主机发送文件。

    首先创建套接字,并绑定端口(这里还另外调整了UDP的发送缓存)。

    这里获取远程主机想要下载的文件(文件路径),并设计超时,若3s内对方没有发送这个信息到发送方,则假定连接未建立,此时关闭套接字,切断连接。

    计算要传输的文件大小与总数据段数量,获取远程主机IP地址。
    接下来开始正式传输文件:

    这里单线程模仿流水线实现传输,为此,首先将套接字设为非阻塞模式。
    传输文件时发送方接收文件只会接收到接收方发送的ACK,所以我们首先从UDP缓存读取数据(ACK),若发现无法读取到任何数据,则转到异常处理部分;若能够读取到数据,说明发送方这边收到了ACK,则转入ACK处理函数处理ACK。

    异常处理部分:该部分用于发送数据。由于ACK还没有传到,故继续传输数据给接收方,此时由于流控制和阻塞控制,我们应保证发送到连接中但未被确认的数据量(最后发送的数据段序号 next_seq_num – 最早未被确认的数据段序号 send_base)小于等于接收窗口rwnd和拥塞窗口cwnd的两者的最小值。若条件满足,我们就读取读取要发送文件的一段发送给接收方,并将这段数据放入send_window(重传时使用)。当计数器未启动时,启动计时器。另外,若rwnd为0,则根据教材所说方案,发送方这边继续发送只有一个字节数据的报文段到接收方以维持两方的通信
    接收到ACK:进入ACK处理函数

    handle_ack方法
    调用该方法处理接收到的ACK。

    首先解析收到的ACK数据,更新rwnd,并打印一些相关信息。

    正式处理ACK,通过判断ACK和send_base的大小关系来判断是否是冗余ACK。

    不是冗余ACK:更新send_base的值,移动send_window,若当前还有未确认的数据段,则重启定时器。重置冗余ACK计数。根据当前所处状态(拥塞控制),相应更新cwnd
    是冗余ACK:根据当前所处状态相应更新cwnd。若当前为慢启动或拥塞避免状态,则增加冗余ACK计数,当该计数等于3时触发快速重传,调用重传函数

    retransmit方法
    调用该方法重传数据段(选择重传)

    首先通过传入的参数判断这次重传是超时触发的还是快速重传,据此更新当前状态。然后判断send_window是否为空,rwnd是否为0,若是则可以进行重传。进行重传时取出send_window中的第一个元素,该元素的data成员即为最早发送未确认的数据段,再次向接收方发送该数据段。
    enter_slow_start方法

    调用该方法初始化进入慢启动状态时的各变量。
    阻塞控制主要是根据教材中对TCP拥塞控制的FSM描述设计,即下图:

    2.2 class Recv_Unit 下载类成员变量


    self.ack_send_interval:接收方并不会收到数据包就立即发送,而是使用RFC [5681]的建议:当接收到按序的报文,将最多等待500ms发送一次ack给发送方 ,self.ack_send_interval设置为不超过500ms。如果收到乱序报文则马上回复一个ack给发送方,以示按序报文仍未收到,三次这样的冗余ack将引起快速重传
    self.client_socket:该类使用的套接字,使用ipv6作为网络层,并使用setsockopt设置UDP套接字缓存大小为1M
    self.port = port:使用传入的port进行初始化,表示后续接收数据通过该端口进行
    self.top:当前还未收到的报文的最小序号,小于该序号的报文段都已收到并写入磁盘
    self.last_byte_received:当前已经收到的报文数目
    self.clock_using = False:用于指示计时器是否在使用,该计时器即按照(1)中变量计时,每间隔 ack_send_interval发送一次ack
    self.send_ack_operation:ack_send_interval的计时器
    self.package_num:指示整个文件大小
    self.have_received:是一个bool数组,指示某个数据包是否已经收到过,如果是则会丢弃该数据包,不进行分析/写入文件操作

    recv_file(self, filename)方法
    该方法首先向发送方发送文件名字信息,并设置套接字为非阻塞:

    并打开文件向文件写入收到的信息:

    如果能够从套接字缓冲区收到信息,并且该数据包之前未收到过(通过have_received[seq]是否为1判断,是1则收到过),则将其放入内存,等待后续处理(这样能够及时从缓冲区获取数据防止套接字过长时间未使用而端口连接),同时更新变量:last_byte_received++,have_received[seq]设为0:


    如果暂时不能从套接字缓冲区接收到数据(数据还在网络传输中),则对上一步存入内存的数据进行处理:
    首先进行解包得到该数据包的序号和原始文件中的数据:

    然后判断该数据是否是期望的数据(具有期望的按序的序号,即seq==self.top,表示该数据包的序号就是期望的数据序号):

    如果不是就将该序号和数据组成一个Fragmentation分片类的实例,放入优先队列q,该优先队列按照序号排序,并且立刻发送ack(快速重传):

    如果是就直接将解包的原始文件数据写入磁盘文件,并且如果队列q中有序分片的最小序号(即q.top)等于期望的序号,则将q.top为首连续分配全部写入磁盘文件,并且每写入一段数据都更新self.top = self.top+1,即下一个期望收到的序号,由于此时收到的报文按序,所以调用计时器,间隔ack_send_interval才发送一次ack:

    循环操作(3)、(4)步骤,直到文件传输并处理完毕,发送最后一个ack并关闭连接:

    close_socke函数

    判断传输是否结束方法:

    start_clock函数
    设置并开始定时器,间隔一定时间发送一次ack:

    stop_clock函数
    停止计时器:

    send_ack_per_interval函数
    发送一个ack并且设置clock_using为false表示时钟未在使用。
    send_ack函数
    计算并发送ack序号和接收窗口信息。


    2.3 class Fragmentation分片类
    用于将数据序号和数据包打包,通过序号判断大小顺序,从而形成按序的优先队列。
    2.4 客户端主函数逻辑
    判断用户输入是否正确,必须输入正确的command(lget/lsend)、正确的ipv6地址、正确的文件名,否则输出正确使用方法,然后退出程序
    与给定的服务端地址(由用户输入)+端口(10000)进行连接建立,(3)、(4)步骤均在此端口进行
    向服务端发送命令,通知其服务类型(lget对应下载服务,lsend对应上传服务)
    从服务端接受进行数据传输的端口号(如果收到-1,说明服务器进行传输的端口被占满,需要等待其它用户完成服务才能从服务的接受服务),然后使用该端口号实例化Recv_Unit/ Send_Unit类,调用send_file/recv_file从该端口进行数据收/发
    如果(4)步骤3s之内未受到服务端反馈信息,连接断开,输出超时信息,需要重试

    服务器端主函数设计如下:

    在主函数中,创建一个专门用于接收传输请求的套接字,当有请求从远程发来时,寻找可用的端口号,若有可用的端口号,则新建一个线程,利用该端口号创建套接字进行相应的传输任务;若无可用的端口号,则发送含有数字0的报文段,通知客户端不能进行传输。
    三、测试客户端下载测试(lget功能,可传输大文件,下面用于下载一个视频)
    客户端使用lget进行文件下载,输入参数:lget+服务器地址+文件名(路径)

    客户端收到文件的md5码:

    服务器原文件的md5码:

    对比md5码完全相同,说明成功实现100%可靠下载,当然作为视频也能在客户端完整播放:

    客户端上传测试:(lsend功能,可传输大文件,下面用于上传一个视频)
    客户端使用lsend进行文件上传,输入参数:lsend+服务器地址+文件名(路径)

    客户端原文件的md5码:

    服务器收到文件的md5码:

    对比md5码完全相同,说明成功实现100%可靠上传,当然作为视频也能在服务端完整播放:

    服务端多线程工作:(下面三个客户端同时向服务端发起下载/上传请求,服务端则通过多个线程同时为它们提供服务)


    从上面看到,两个客户端client、client1正在进行下载操作、一个客户端client2正在进行上传操作。
    下面是服务端的输出,从输出中我们也能看到现在有三个线程同时运行:

    类似TCP的流式控制功能实现
    流式控制指的是一种机制,在该机制的作用下发送方的发送数据速度能够与接收方处理数据的速度匹配,防止发送方发送过快而接收方处理速度跟不上,接收方缓存剩余空间不断变小,最终溢出。通过流式控制,发送方在接收方处理好数据之前将不会继续大量发送数据,从而留给接收方足够的数据处理时间。
    下面通过客户端的一次lget作为例子说明我们的流式控制实现:
    随着数据包接收到缓冲区(实际上是内存模拟的缓冲区),缓冲区中的数据可能来不及处理,从而使得接收方的缓冲区剩下的空间变小,也就是接收窗口变小,下面图中(接收方输出)我们可以看到接收窗口从2000变为了1998,即缓存区中还有两个数据等待处理:


    然后接收方将这个缓冲区剩余空间变小的信息通过“接收窗口“来告诉发送方,发送方收到这个信息之后将会限制已发送的数据<接收窗口:

    下面是发送方的输出中我们看到发送方已经发送的数据量但是未被接收方收到/确认19252-17873 = 1379 < 1997,即被限制在接收方的接收窗口之内:

    从而能够使得接收方有足够的时间处理,不至于缓存溢出。
    但是当接收方的接收窗口变为0的时候,发送方将无法再向接收方发送数据,这时候需要让发送方继续发送大小1字节的报文给接收方,接收方收到之后会回复包含接收窗口信息的报文,等到接收方处理数据一段时间之后,接收窗口将不再为0,从而发送方能够正常发送数据:
    发送方在接收方接收窗口变为0的时候继续发送一个大小1字节的报文给接收方代码:

    接收方收到发送方发送的大小1字节的报文时,接收方回复接收窗口代码:

    下面时接收窗口为0的时候用wireshark抓到的大小1字节的数据包:

    并且与此同时接收方不停的回复包含receive window的报文,用来通知发送方自己当前的接收窗口:

    一段时间之后接收方的接收窗口为2,又能够进行正常数据传输了:

    以上说明流式控制功能完整实现。
    类似TCP的拥塞控制功能实现测试
    首先将client.py中的DEBUG_MODE_1常量设置为True,表示检测拥塞控制功能:

    然后设置随即丢包率,从而通过代码主动丢包:

    这里random.random()>0.95则表示丢包率5%。
    然后得到如下结果:

    上图中,状态首先从拥塞避免状态进入慢启动阶段,这是因为接收方主动丢包导致了发送方超时,然后进入慢启动。
    除此之外,从上图可以看出,从慢启动阶段到拥塞避免阶段,接收方收到了1309 – 1273 = 36 个有效数据包,所以在下一次收到ACK打印信息时,cwnd从1增加到37,进入了拥塞避免状态(因为增加后cwnd大于了ssthresh,判断进入拥塞避免状态)。
    由于状态转移过于复杂,上面仅仅列出有限的例子进行状态变化说明,更多信息见代码&实际运行状况。
    1 评论 1 下载 2020-11-27 09:54:53 下载需要12点积分
  • 基于α-β剪枝算法实现的AI五子棋游戏

    一、对抗问题对抗问题:顾名思义,博弈双方是带有对抗性质的。博弈的任何一方都希望局面尽量对自己有利,同时局面也应该尽量令对方不利。通常这一类问题可以通过 Minimax 算法解决。
    Minimax 算法又名极小化极大算法,是一种找出失败的最大可能性中的最小值的算法。Minimax 算法常用于棋类等由两方较量的游戏和程序,这类程序由两个游戏者轮流,每次执行一个步骤。为了执行 Minimax 算法,我们可以通过穷举的方式,枚举所有的状态空间,从而使得我们可以在游戏刚一开始,就预测到输赢。但是,在实际情况下,游戏的状态空间都是异常庞大的。很显然,我们不能将以穷举方式实现的 Minimax 算法用于实际应用。
    二、α-β减枝通过分析可以发现,在利用穷举方法执行 Minimax 算法中有许多的无效搜索,也就是说,许多明显较劣的状态分支我们也进行搜索了。我们在进行极大值搜索的时候,我们仅仅关心,下面最大的状态,对于任何小于目前值的分支也都是完全没有必要进行进一步检查的。(α减枝)

    通过上图,我们可以发现,我们可以减去大量无用的状态检查,从而降低我们的运算量。
    同时,我们在进行极小值搜索的时候,我们仅仅关心,下面最小的状态,对于任何大于目前值的分支都是完全没有必要进行进一步检查的。(β 减枝)

    通过上图,我们可以发现,我们可以减去大量无用的状态检查,从而降低我们的运算量。
    将上述所提到的 α 减枝与 β 减枝进行综合就可以得到 α-β 减枝。对于对抗搜索而言,我们需要精心设计其估值函数,不然我们的 α-β 减枝将毫无用武之地。
    三、五子棋问题五子棋:是一种两人对弈的纯策略型棋类游戏,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成 5 子连线者获胜。

    这里,我们采用了极大极小博弈树(MGT),来实现 AI。这里用一张井字棋的搜索示意图来说明。

    上图很清晰的展示了对局可能出现的所有情况(已经去除了等价的情况),如果让这个图延展下去,我们就相当于穷举了所有的下法,如果我们能在知道所有下法的情况下,对这些下法加以判断,我们的 AI自然就可以选择具有最高获胜可能的位置来下棋。极大极小博弈树就是一种选择方法,由于五子棋以及大多数博弈类游戏是无法穷举出所有可能的步骤的(状态会随着博弈树的扩展而呈指数级增长),所以通常我们只会扩展有限的层数,而 AI 的智能高低,通常就会取决于能够扩展的层数,层数越高,AI 了解的信息就越多,就越能做出有利于它的判断。
    为了让计算机选择那些获胜可能性高的步骤走,我们就需要一个对局面进行打分的算法,越有利,算法给出的分数越高。在得到这个算法过后,计算机就可以进行选择了,在极大极小博弈树上的选择规则是这样的:

    AI 会选择子树中具有最高估值叶子节点的路径
    USER 会选择子树中具有最小估值叶子节点的路径

    这样的原则很容易理解,作为玩家,我所选择的子一定要使自己的利益最大化,而相应的在考虑对手的时候,也不要低估他,一定要假设他会走对他自己最有利,也就是对我最不利的那一步。
    接下来,我们实现关键的局面评分步骤:直接分析整个棋面是一件很复杂的事情,为了让其具备可分析性,我们可以将其进行分解,分解成易于我们理解和实现的子问题。
    对于一个二维的期面,五子棋不同于围棋,五子棋的胜负只取决于一条线上的棋子,所以根据五子棋的这一特征,我们就来考虑将二维的棋面转换为一维的,下面是一种简单的思考方式,对于整个棋盘,我们只需要考虑四个方向即可,所以我们就按照四个方向来将棋盘转换为 15 * 6 个长度不超过 15 的一维向量(分解斜向的时候,需要分为上下两个半区),参考下图:

    我们的目的是为了为其评分,那么我们就还需要评估每个线状态,将每个线状态的评分进行汇总,当做我们的棋面评分:

    接下来我们所要做的就是评价每一条线状态,根据五子棋的规则,我们可以很容易穷举出各种可能出现的基本棋型,我们首先为这些基本棋型进行识别和评价,并且统计每个线状态中出现了多少种下面所述的棋型,并据此得出评价值,得到如下图所示的静态估值表:

    根据这个表以及我们之前所谈到的规则,我们就可以得到一个可以运行的AI了。
    四、进一步的优化注意到,如果我们搜索到第四层,总共需要搜索:224 + 224 223 + 224 223 222 + 224 223 222 221 = 2 461 884 544 个状态节点,搜索如此多的状态节点的开销是十分可观的,因此,我们提高效率的方式就锁定到了:如何减少需要搜索的状态节点。
    我们可以采取以下方法来减少需要搜索的状态节点:

    我们可以利用经典的α-β剪枝算法对博弈树剪枝
    我们可以每次搜索仅搜索落子点周围 2*2 格范围内存在棋子的位置,这样可以避免搜索一些明显无用的节点,而且可以大幅度提升整体搜索速度
    避免对必胜/负局面搜索,当搜索过程中出现了必胜/负局面的时候直接返回不再搜索,因为此时继续搜索是没有必要的,直接返回当前棋局的估价值即可
    加入随机化AI的下棋方式,普通的AI算法对于给定的玩家下棋方式会给出固定的回应,这就导致玩家获胜一次之后只要此后每次都按此方式下棋,都能够获胜。为了避免这种情况,可以在 AI选择下子位置的时候,在估值相差不多的几个位置中随机挑选一个进行放置,以此增加 AI的灵活性

    规划搜索顺序,有很多有价值的下子点存在于更靠近棋盘中央的地方,如果从棋盘中央向外搜索的话,则能够提高α-β剪枝的效率,让尽可能多的分支被排除
    五、实验成果

    六、实验总结通过本次实验,加强了组员之间的沟通协调能力,同时也提高了我们对αβ减枝算法的了解。我们更了解了五子棋相关的游戏规则以及一些技巧,拓宽了我们的知识面,有助于我们在未来的生活中更好的与人交流。
    同时,经过此次实验,我们深入了解了棋类人工智能算法,进一步的提升了我们的专业水平,有助于我们在未来的就业与科研岗位上走的更远。
    虽然α-β减枝实现起来非常容易,但是五子棋的局势估计却十分的有挑战性,其局势估计的准确与否直接影响了程序的运行结果是否令人满意,AI是否能够展现出足够的智能。
    7 评论 184 下载 2019-06-20 11:17:32 下载需要12点积分
  • 基于C++的教室管理系统

    1 需求分析
    核心需求:实现教室管理系统,完成对学校教室的维护、查询、预约、统计功能。程序拥有权限控制,分为管理员和普通用户
    管理员需求:查看某栋楼教室的概要信息、每个教室的详细信息(包括教室基本信息、预约情况、上课情况)、修改某教室基本信息、增加教室、删除教室、增加某教室上课情况、统计某类教室的综合使用情况(周上课率、周预约率)
    普通用户需求:查询符合条件的空闲教室、预约空闲教室
    其他需求:程序具有良好的交互性

    2 概要设计程序运用面向对象编程思想进行设计。核心有教室类、预约信息类、上课信息类。

    教室类:

    成员:校区号、教学楼号、教室号、教室类型、座位数、预约状态、预约数、预约信息、上课数、上课信息
    函数:默认构造函数、成员获取函数、成员设置函数

    预约信息类:

    成员:课时时间、学号/教工号、姓名、电话
    函数:默认构造函数、构造函数、成员获取函数、重载流运算符

    上课信息类:

    成员:教师姓名、教工号、总上课次数、上课时间
    函数:默认构造函数、构造函数、成员获取函数、重载流运算符

    课时时间类:

    成员:课时周、周、节
    函数:重载相等、不等、流运算符


    程序结构图如下图所示:

    3 运行环境
    硬件环境

    处理器:Intel® Core™ i7-6500U CPU @ 2.50GHz 2.59GHz内存:8.00GB 系统类型:64位操作系统,基于x64的处理器
    软件环境:

    Windows 10

    4 开发工具和编程语言
    开发工具:

    Microsoft Visual Studio Community 2017
    编程语言:

    C++11

    5 详细设计5.1 教室信息类该类封装有教室的基本属性和方法,用于存储每个教室的信息集合及修改其中的信息,构成教室管理系统的核心。
    class Classroom{public: Classroom() = default; //默认构造函数 void setCampusType(uint); //设置函数 void setBuildID(uint); void setRoomID(uint); void setRoomType(uint); void setSeats(uint); void setOrderStatus(uint); void setOrderCnt(uint); void setClassCnt(uint); void addOrderInfo(OrderInfo); void addClassInfo(ClassInfo); uint getCampusType() const; //获取函数 uint getBuildID() const; uint getRoomID() const; uint getRoomType() const; uint getSeats() const; uint getOrderStatus() const; uint getOrderCnt() const; uint getClassCnt() const; vector <OrderInfo> getOrderInfo() const; vector <ClassInfo> getClassInfo() const;private: uint m_campusType = 0; //校区 uint m_buildID = 0; //楼号 uint m_roomID = 0; //教室号 uint m_roomType = 0; //教室类型 uint m_seats = 0; //座位数 uint m_orderStatus = 0; //预约状态 uint m_orderCnt = 0; //预约数 uint m_classCnt = 0; //课堂数 vector <OrderInfo> m_orderInfo; //预约信息数组 vector <ClassInfo> m_classInfo; //课堂信息数组};
    5.2 预约信息类主要用来存取每间教室的一条预约信息,含有预约时间、预约账号、预约者姓名及电话等基本信息,提供构造函数进行初始化,提供获取函数用于获取私有成员。
    class OrderInfo{ friend ostream& operator<< (ostream &, const OrderInfo&);public: OrderInfo() = default; OrderInfo(const classTime &time, const string &ID, const string &name, const string &phoneNum) : m_time(time), m_ID(ID), m_name(name), m_phoneNum(phoneNum) { } string getID() const; classTime getClassTime() const; string getName() const; string getPhoneNum() const;private: classTime m_time; string m_ID = ""; string m_name = ""; string m_phoneNum = "";};
    5.3上课信息类用来存取当前教室的一条上课信息,如上课时间、上课老师姓名、ID。
    class ClassInfo{ friend ostream& operator<< (ostream &, const ClassInfo &);public: ClassInfo() = default; ClassInfo(const string &teacherName, const string &teacherID, uint sumClassCnt, vector< classTime > &classTime) :m_teacherName(teacherName),m_teacherID(teacherID),m_sumClassCnt(sumClassCnt), m_classTime(classTime) {} string getName() const; string getID() const; uint getSumClassCnt() const; vector<classTime> getClassTime() const;private: string m_teacherName = ""; string m_teacherID = ""; uint m_sumClassCnt = 0; vector< classTime > m_classTime; //三元组 (课时周,周,节)};
    5.4 查看信息查看每座楼的所有教室基本信息,如教室号、教室类型、座位数、预约数、课程数。查看每个教室的详细信息,包括基本信息、预约信息、上课信息。

    修改信息:

    对某个教室的信息进行修改
    修改教室:

    可增加、删除一个教室
    增加管理员:

    增加一个管理员账号并存储
    增加上课信息:

    为某个教室增加上课信息
    统计使用情况:

    用于统计各类教室的使用率情况
    查询空闲教室:

    普通用户可通过输入课时时间来查询某号楼所有的空闲教室,同时可按照座位数、教室类型进行筛选
    预约空闲教室:

    普通用户可通过输入课时时间来预约教室、如果预约时间该教室有课或已有预约将预约失败

    6 调试分析
    问题1:程序所有功能都集中一起

    解决:增加用户权限,分为管理员和普通用户。管理员需要密码登陆,并对其进行校验,可对教室信息进行直接管理维护。对于普通用户仅开放预约及查询教室功能
    问题2:预约无校验功能

    解决:为系统添加时间属性、采用课时时间的方式对预约信息、上课信息进行时间管理。预约时可检测是否当前时间已被上课或预约占用
    问题3:交互逻辑使用不便

    解决:改进交互逻辑,提供跳转功能、选择错误处理

    程序改进

    改进管理员对教室进行维护的操作逻辑,使得操作更加方便
    增加真实时间、自动对已过期的预约进行删除
    采用更为合理的信息管理方式、使教室信息管理更加高效易行
    增加用户更多功能,如查询自己的预约、删除自己的预约
    增加程序鲁棒性
    改进交互

    7 测试结果管理员功能列表

    查询教室详细信息

    普通用户界面

    查询空闲教室

    预约空闲教室(预约成功)

    预约空闲教室(预约失败)

    参考文献[1] H.M.Deitel.C++大学基础教程(第五版)[M]. 北京: 电子工业出版社, 2011
    [2] 沈学东等. C++面向对象程序设计实用教程[M]. 上海: 上海交通大学出版社,2012
    [3] 谭浩强等. C++程序设计 [M]. 北京: 清华大学出版社, 2011
    [4] Stanley B.Lippman等. C++ Primer中文版[M]. 北京:电子工业出版,2017
    [5] Bjarne Stroustrup. C++程序设计语言[M]. 北京:机械工业出版社,2016
    3 评论 214 下载 2018-11-04 14:36:23 下载需要8点积分
  • 基于JSP和MySQL开发的酒店管理系统的设计与实现

    摘 要中国经济近几年来取得蓬勃飞速发展,使得人民生活水平的要求和生活的质量有了很高的要求。因此人们对外出旅游和就餐的需求也越来越大。同时,随着我国科技水平的兴起和对互联网+新时代的大力支持,酒店管理系统在现代人们的生活中扮演着不可或缺的角色。
    酒店管理系统,不仅能够加大对酒店的有效管理,而且能够使顾客享受到更优质服务。这个酒店管理系统从实际的需求出发实现了管理员权限管理模块,餐饮信息管理模块,客房信息管理和餐饮预订模块,顾客消费情况管理,客房预订操作模块。
    这个系统以jsp风格为主要的开发语言,使用现在比较流行的MVC框架作为辅助手段,运用于开源免费的小型tomcat服务器来进行对MYSQL操作,在Myeclipse企业版开发环境软件上运行,完成了一个酒店管理系统。本系统具有简单易懂的操作方式和显示详细的房间信息,用户可以方便的了解到本酒店的全面信息,节约时间和成本。
    关键字:酒店管理, JSP, MYSQL, tomcat

    AbstractWith the rapid development of China’s economy, people’s living standards generally improved. So the number of people traveling and dining is increasing. At the same time, with the rise of China’s science and technology and the arrival of the Internet + era, the hotel management system for modern people’s lives played an important role.
    Hotel management system, not only to the effective management of the hotel, but also to provide customers with better service. Therefore, this article on the hotel management system system research is very necessary. The main functions of the hotel management system include the following sections: administrator rights management module, room information management module and room booking module, catering information management module and catering booking module, customer consumption module.
    This system to jsp as the main development language, the use of MVC framework, the use of the database is open source free MYSQL database, deployed in open source free small server tomcat, in Myeclipse Enterprise Edition development environment software to run, completed a hotel management system The system has a convenient and quick user interface, easy to understand the mode of operation, the user can easily understand the hotel’s comprehensive information, saving time and cost, so that the real thing to make the best use of their best.
    Key words: Hotel Management,JSP, MYSQL,tomcat
    1 绪论1.1 课题背景中国改革开放以后,我国大力发展经济、教育、旅游等等先进产业链,人们对于外出旅游和群体聚餐的需求越来越大。而且我国的良好的科学教育水平和人民文化素质的提高,为酒店管理系统提供了良好的机遇和前景。
    采用现代化开发模式,能够方便快捷的对酒店进行有效的管理了解酒店的具体情况,同时提供令顾客满意的服务,提高了效率。顾客可以方便地了解酒店的客房情况和餐饮情况,进行提前预订消费。目前,由于中小型酒店缺少必要的资金和人员,仍采用手工记录和打电话咨询的方式,对酒店管理和顾客预订都很不方便,而且极其容易出错。所以开发一套适合的用于中小酒店的酒店管理系统是非常符合当代的条件,既可以节约软件开发成本预算,也可以提高酒店服务水平。
    1.2 目的和意义人们现在越来越注重精神上的满足,排除了学习读书等消遣方式之外,外出参加旅游和组织聚餐也成为当下放松心情,缓解压力的重要环节。因此对酒店的入住情况和餐饮服务质量的及时了解是十分有必要的。而且随着顾客对酒店的需求越来大,和酒店有关的信息也就越来越多,单靠人力已经无法完成必要的信息记忆和信息整理,由此得出,我们必须要一套完善的酒店管理系统满足顾客的需求,提供对酒店管理的效率。酒店管理系统可以帮助我们完成对信息的有效存储和永不丢失,也能对信息进行有效整理,极大缓解了人员的工作负担。而且能够知道所需要的具体信息,执行效率也是非常方便快捷,几乎不会出错。以上种种可以看出来,通过使用酒店管理系统能够更加有效的对酒店进行管理和有效的进行信息处理,这样就可以达到员工福利的目的,缓解了雇职人员之间的矛盾,减少了酒店管理的成本。
    1.3 开发工具及技术1.3.1 开发工具这个项目采用的是MyEclipse+tomcat+Mysql+JSP开发。以下分别介绍这次开发的主要技术方法和应用方式。
    MyEclipseMyeclipse是在面向对象的开发过程中还是很有用的。实在eclipse的基础之上有增加了一系列有利于开发人员编程的插件的集合,另外自己还可以根据自己的具体需求来进行私人订制,增加一些具有特色的功能。Myeclipse对我们软件开发人员来说确实是一个功能齐全的企业级应用开发环境。
    TomcatTomcat是由一些知名软件公司开发的,例如Apache和sun等等公司。首先要明确,tomcat的开发者很人性,不收取费用,而且还给我们提供了其制作原理。是属于服务器,而且是轻量级的对设备的要求低,我们可以从tomcat的实际原理进行参考,对自己分析研究服务器设计具有重大意义。为什么要选择tomcat是因为它在占用很少的资源的情况下能够独立运行一些应用,而且扩展性能也是非常好的。
    MySQLMYSQL是一项公益性的,供编程人员模仿学习,它的存在一直对我们研究学习工作意义非凡,不仅能够降低我们的开发成本,减少投入资金,而且我们可以欣赏到大师级的代码技术和代码风格,最主要的是能够学到他们的设计理念和设计思想。另一方面,MYSQL使用了各种各样的不同风格的编译器和开发工具的测试,使得我们的源代码能够轻松移植到其他平台上,减轻我们的开发。
    1.3.2 JSPJSP,ASP,PHP是现代流行的动态网页技术标准,是有一些十分优秀的大公司结合实际需求制定的一个标准。在以前众所周知的HTML程序段中添加一些具有特殊意义的java程序段以及自己特定的jsp标签属性,由此形成了JSP文件。当然,jsp完全继承了Java的一些优秀的特点,能够应用与各种不同的平台之上。
    为了满足我们对动态网站迅速开发的目标,到达编程人员的身心需求,缓解人员的工作状态,JSP进一步改进优化:

    将具体所需的内容与所要显示的界面进行分离:web开发工程师在进行网站设计的时候,可以采用HTML或者是XML来确定最终页面的具体情况到底是什么界面。通过使用JSP来实现动态页面的制作,其中具体的逻辑过程被封装起来。这样的话,对我们所写的代码具有一定的保护作用,又能保证在任何其他浏览器上都具有一定的可用性
    可重复使用组件:开发人员及软件工程师能够共享和重复使用经常使用的组件
    可以跨平台实现:在市面上的几乎所有平台都支持JSP+servlet+JavaBean,不需要考虑不同平台之间的移植问题

    为了方便与数据库相连接,专业人员开发了JDBC驱动程序来供我们使用。除此之外,sun公司还有许多关于数据库的技术供我们使用参考。这里就不一一介绍,希望在后期学习中在做介绍。
    1.3.3 MVC简介MVC是一种编程思想,是一种将代码中的输入部分,输出部分和程序的逻辑处理部分分开进行代码设计。这种编程方法主要将代码分成三部分:模型,视图和控制器三个核心部分。

    视图:主要是指用户主管视觉上能够欣赏的界面。在以前的网站中,视图主要是有HTML来扮演主要的角色。但随着世界上计算机科学与技术水平的不断革新,新的技术水平不断出现,主要有xml,flash等等。视图仅仅是允许数据输出和用户能够就行操作等简单界面,并没有进行真正的逻辑处理
    模型:模型表示系统的逻辑处理部分,主要指在数据库中处理数据。一个视图可以对应多个模型,因此大大减少了代码的数量和代码的重复量
    控制器:控制器是指在知晓用户输入的情况下,通过使用模型和调用视图来满足用户的具体需求

    MVC工作过程是:首先让用户输入信息并使用控制器来得到用户输入的结果。接下来根据用户的具体请求,用具体模块来处理用户的信息请求并返回最终结果。最后,控制器用具体的视图来显示来返回请求数据。
    1.4 软硬件需求本系统开发机器的配置:

    处理器:Intel(R)Core(TM) i5-3230M CPU @2.60GHz 2.60GHz
    RAM:4.00GB

    软件需求:

    操作系统版本:Win7
    开发工具:MyEclipse 10
    后台服务器:jdk1.8.0_05 Apache Tomcat 6.0
    开发语言:Java
    浏览器:360安全浏览器8.1

    1.5 本章小结本章主要介绍了本文研究的课题所涉及背景以及研究所的目的及其意义。表明研究是十分有必要的。同时,也简单介绍了本课题所研究的一些关键技术,表达了为什么要用这些技术以及这些技术的优势。最后也简单介绍了本次研究所需要准备的软硬件条件和设施。

    2 需求分析需求分析可以认为是软件开发的重中之重。对于软件的后期开发和测试起到了关键性的作用。从历史的经验中我们可以看出,需求分析的成功与失败决定了后期软件制作所要花费的代价。一个好的需求就是成功的一半,能够大大降低软件开发的成本。反言之,一个失败的软件需求,不能正确反映客户的需求,将会给后期软件开发和维护带来极大的困难。
    本系统在进行需求分析时,严格按照客户的实际需求来进行。减少后期因需求不足导致额外的花费。
    2.1 需求调研现阶段,我们国家经济状况良好而且国家对旅游政策的大力支持,人民对酒店的性能、服务设施等条件要求十分严格。这样会带来酒店的极大的扩张,管理也越来越困难,面对顾客各种复杂而且膨大的信息量和信息资源,单单靠人力无法单独完成。因此利用计算机的优势所在,采用现代化管理技术,减少不必要的人力消耗至关重要。通过酒店管理系统,可以实现有效系统管理,方便对酒店的各种操作,降低各种复杂工作的量,提供员工的工作效率。根据实际需求和各种技术支持发现,对酒店采用现代化,专业化,系统化管理方式是非常有必要也是十分可行的。综上所述,本文的酒店管理系统使十分值得研究和发展的。
    2.2 可行性分析开发酒店管理系统可能会受到现实生活中的各种各样的限制,比如:开发的时间,技术水平和资源有效分配等等问题。由此可见,在开发系统之前,可行性研究的实行显得十分重要和有必要。可以减少不必要的人力的消耗和财力的损失,减少这个系统开发的风险投资。这里从以下几个方面进行研究和分析,本系统是否真正的具有可行性、可研究性
    2.2.1 技术的可行性主要用Myeclipse进行本系统的发布,在eclipse不能运行,运用主流的tomcat开源免费的服务器,数据库也是开源免费的Mysql数据库。主要开发语言还是面向对象的开发语言Java。这个系统主要完成一些简单业务,如客房信息管理和客房预订操作模块,餐饮信息管理模块和餐饮预订操作模块。前端界面采用html+css等技术进行页面设计,后台采用java来操作数据库进行增删改查和用Java实现图片上传等操作。同时java也是开源的,为系统开发也提供了一些系统架包。由此可以看出,现有的技术是完全可以支撑起本系统的开发。
    2.2.2 经济的可行性根据技术可行性可以看出,酒店管理系统主要采用免费开源的软件进行开发,通过这样做,我们的开发成本得到了有效的管理,节约了大量开发工具的费用,不需要大量的软件开发成本需求。采用免费开源的软件还可以根据自己的需求对其进行改造适应自己的需求和发展,因此可以看出,从经济的角度对酒店管理系统分析可以得出酒店管理系统在经济方面也是可行的。
    2.2.3 操作可行性酒店管理系统操作简单方便,大多都是通过鼠标进行操作和管理。而且由于现在电脑技术的迅速普及,基本每个人都具备基本的电脑操作技巧,因此在用户具备一定的操作技巧的基础之上进行简单的培训就可以使用酒店管理系统对酒店进行全面细致的管理。
    2.2.4 法律的可行性本酒店是自己进行独立开发和测试完善的,具有很强的实际操作意义。另外,开发所使用的软件大多数是开源免费的,因此不存在侵犯版权之类的问题,是在法律允许的范围之类进行开发和测试的。因此,在法律上是可行的。
    根据以上的种种条件,可以判断出酒店管理系统在当今社会上对酒店管理和发展具有很大的帮助和发展,因此可以看出,酒店管理系统的开发和应用是大势所趋,是非常适合当今时代的发展。
    2.3 系统用户用例图2.3.1 管理员用例图管理员是酒店管理系统的主要管理权限用户,主要有以下四大功能,管理人员对使用本系统用户人员管理,对客房信息进行管理,对餐厅餐饮和菜色进行管理,对顾客消费情况进行管理。

    2.4 功能模块需求分析本酒店管理系统与现代开发软件的特点完美结合,界面友好,观赏性强。下面依次介绍本系统的功能:

    本系统界面友好,且具有良好的健壮性,能预防各种出现的错误提示操作
    管理人员对使用本系统用户人员管理,对客房信息进行管理,对餐厅餐饮和菜色进行管理,对顾客消费情况进行管理
    本着对用户和酒店负责的态度,对酒店信息和用户信息起到一定安全作用,防止信息泄露,对用户和酒店造成困扰

    管理员功能模块说明:

    用户人员管理:这个功能主要包括对系统人员就行删除增加和密码修改等基本操作等
    客房信息管理,主要有以下几部分组成:

    客房类型的增加和删除:现在有单人间,双人间和豪华间等等客房信息的补充和修改:主要指房间号,房间面积,价格以及房间的真实图片等必要的信息客房预订的增加和删除:主要是指客户对酒店的预订情况,包括客房的房间号,预订天数,预定时间和客户信息等
    客户信息的增加修改和删除和查看:主要用于完成对客户信息的修改和删除,当然也可以进行客户信息的增加和查看
    餐饮管理,主要有以下几部分组成:

    特色菜品的介绍:对特色菜品进行及时增加,过时的菜品进行删除和不合理的菜品进行修改,查看本店特色菜品操作,特色菜的名称,价格,和真实图片等操作进行管理。也能增加和删除特色菜品餐桌预订管理: 对已经预订了的餐桌消费人员进行修改,查看预订信息进行就餐和删除一些已经就餐完成或就餐预订取消的信息餐桌预订添加:将顾客要求的预订信息添加到本系统
    消费管理:主要指住房消费和餐饮消费两部分,用于对顾客消费情况进行登记和查看,以便对酒店收入情况进行管理

    2.5 性能需求2.5.1 系统的安全性本文设计的这个酒店管理系统具有严格的执行权限要求,只有符合管理员身份的人员才可以对其进行操作管理,对已经取消管理员资格的人员也可以手动对其进行删除管理,提高系统的安全性。
    2.5.2 数据的完整性
    对数据的记录要求精确,信息不能出现空白信息,否则显示错误
    各个数据项的记录必须要求是正确的,不能出现虚假信息,造成错误
    不同界面显示的相同信息的数据也必须保持一致,不能出现相同信息不同数据的现象

    2.6 本章小结本章主要是对软件的需求进行分析。不过在其分析之前,简单的从经济,技术,操作,法律等方面研究了本系统是否值得分析设计。其次,本文采用用例图来分析软件在功能方面的实际需求。都软件的性能需求也进行了评价分析。

    3 系统分析与设计系统分析与设计分析与设计时系统开发过程中最重要的一个环节部件。它会影响到后续代码编写的实施。尽管不同系统具体的实施过程不同,但都有异曲同工之妙。在实际的工作和学习中可以看出,系统分析与设计的质量与系统的成败有巨大的联系。
    管理系统分析的任务是:在充分认识原有系统的基础上,通过查询可行信息、定义问题识别、规划详细调查、通过系统化分析,最后完成了新系统的逻辑方案设计,或称逻辑原型设计[2]。
    3.1 系统模块设计3.1.1 总体设计框架在上述对系统的分析的基础上,现在对系统进行总体设计,总体设计功能的模块如图 3.1所示。

    3.1.2 总体设计具体模块按照总体设计的功能模块和需求分析,酒店管理系统的各个模块的数据字典:

    系统管理员数据:包含的数据项用户名,密码
    客房类型数据:包含的数据项有id号,类型名称
    客房信息数据:包含的数据项有房间号,房间面积,房间简介,房间图片,房间类型
    房间预订数据:包含的数据项有预订客房,预订时间,预订用户的名字及电话,预订天数
    入住消费数据:包含的数据项有入住客房,入住时间,客户姓名及联系方式,预订天数和消费金额
    客户信息数据:包含的数据项有客户名字,地址,电话,E-mail
    **特色餐品数据:包含的数据项有名称,描述,图片,价格
    **餐桌预订数据:包含的数据项有预订时间,预订餐桌号,预订人
    **餐饮消费数据:包含的数据项有消费时间,消费金额,消费者姓名

    3.2 数据库的分析与设计当代的计算机软件系统已将不单单是运用计算机来静态的处理解决问题,而是利用具体数据,具体情况具体分析动态解决实际问题。因此数据就显得尤其至关重要。而数据都是在数据库中进行各种操作实现完成的。运用数据库管理系统的优势和特点,来对数据信息进行有效的管理、合理的分析、灵活的运用等的。数据库的巨大优势使得数据库已经作为了现在信息系统等计算机系统的主要部件。对数据库设计是否合理直接影响到整体系统的质量问题。
    本系统建立抽象的概念数据模型主要是选用:

    集中式模式设计法:根据全局数据模式为各个用户组或应用定义外模式。对用户要求描述的逻辑结构分类、二维表的形式表示实体间数据模型,并建立抽象的概念数据模型[1]
    视图集成法:以个别部分的为基础,分别设计局部模式,然后在以这些视图为基础,集成为一个全部模式[1]

    3.2.1 数据库的概念结构设计概念设计时,要先进行数据分析,然后在从下往上依次建立数据库整体概念结构,从用户的角度出发看问题,进行视图的整合设计,最后对整合的设计进一步分析优化得到最后结果。
    本文中数据库的概念结构设计采用实体联系属性的E-R模型。E-R模型都是包括实体,联系(不同实体之间的关系),属性(实体具有的特征)三部分内容,本文通过绘制E-R图来描述E-R模型。
    概念设计最终要能够正确表达酒店对数据的实际需求,也就是要能够完成酒店的所有功能。概念模式是独立存在的,与数据库逻辑结构基本上无关。当然了,它也与数据库的物理结构无关。
    通过对酒店管理系统的需求分析和系统所需的概念结构,结合自己对E-R图的理解,下面是建立的E-R模型图。










    实体
    属性
    实体间关系



    酒店管理系统的数据库E—R图如图3.2所示:
    )
    3.2.2 数据库的逻辑结构设计众所周知,数据库的概念模型与某个具体的数据库是没有关系的,因此,我们需要结合实际所使用的数据库的特征来进行具体变化,也就是转化成逻辑关系模型,来让计算机进行处理加工。概念模型向数据库的逻辑模型进行转化需要遵守的规则:

    每一个实体要转换成一个关系
    所有的主键必须定义非空(NOT NULL)
    对于有多个联系的实体要区分主次,按照一对多,一对一和多对多的顺序来依次建立外键。

    通过以上的分析,我们现在建立了相应的逻辑结构,下面逻辑结构的详细说明部分。
    用户信息表主要是记录了住房客户基本信息,表结构如表3.3所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    user_id
    int
    4


    编号


    user_realname
    varchar
    50


    姓名


    user_address
    varchar
    50


    地址


    user_tel
    varchar
    50


    联系电话


    user_email
    varchar
    50


    邮箱


    user_post
    varchar
    50


    邮编


    user_fax
    varchar
    50


    传真



    管理员信息表主要记录了管理员基本信息,表结构如表3.4所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    userId
    int
    4


    编号


    userName
    varchar
    50


    用户名


    userPw
    varchar
    50


    密码



    客房信息表主要是记录了客房的基本信息,表结构如图3.5所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    fangjianhao
    Int
    4


    编号


    catelog_id
    varchar
    50


    客房类别


    area
    varchar
    50


    面积


    jieshao
    varchar
    50


    介绍


    fujian
    varchar
    50


    图片



    客房预订信息表主要是记录了客房预订的基本信息,表结构如图3.6所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    id
    Int
    4


    编号


    user_id
    varchar
    50


    预订用户


    kefangid
    Int
    4


    客房号


    tianshu
    varchar
    50


    预订天数


    yudingzheTel
    varchar
    50


    联系电话


    shijian
    varchar
    50


    预订时间



    客房类别信息表主要是记录了客房类别的基本信息,表结构如图3.7所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    id
    Int
    4


    房间号


    Kefang_leixing
    varchar
    50


    客房类型



    餐饮信息表主要是记录了餐饮的基本信息,表结构如图3.8所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    canyin_key
    Int
    4


    编号


    canyin_name
    varchar
    50


    名称


    jiage
    varchar
    50


    价格


    jieshao
    varchar
    50


    介绍


    fujian
    varchar
    50


    图片



    餐饮预订信息表主要是记录了用户餐饮预订的基本信息,表结构如图3.9所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    id
    Int
    4


    编号


    name
    varchar
    50


    预订人


    canzuo_number
    varchar
    50


    预定餐桌号


    shijian
    varchar
    50


    预订时间



    入住消费信息表主要是记录了用户入住消费的基本信息,表结构如图3.10所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    id
    Int
    4


    入住人身份证号


    name
    varchar
    50


    预订人


    Name_cost
    varchar
    50


    消费


    shijian
    varchar
    50


    入住天数



    餐饮消费信息表主要是记录了用户餐饮消费的基本信息,表结构如图3.11所示。



    列名
    数据类型
    长度
    允许空
    是否主键
    说明




    id
    Int
    4


    用餐人的身份证号


    name
    varchar
    50


    用餐人名字


    Name_cost
    varchar
    50


    消费



    3.2.3 数据库的连接原理Hibernate是由专业人员设计的一种对酒店管理系统进行有效管理的系统框架,本文就采用了这种框架。Hibernate 是一种开源的,并且能够将对象关系进行映射的一种框架,它通过对JDBC部分对象的进行了封装设计,因此,我们程序员在编程设计时,可以根据自己喜好使用面向对象的编程思想来进行数据库的各种操作。它可以完成具体的Java类与其相应的数据库表来进行映射,也能够对数据进行查询和对数据进行恢复。与JDBC连接数据库的传统方式相比较来看,Hibernate在很大程度上已经可以减少工作量的操作。另一方面,Hibernate提供了代理模式,它可以对需要载入的具体类进行简化操作。使用代理模式的目的主要是减少从数据库提取数据所需的代码工作量,这样我们的开发时间和开发成本也就得到了有效的缓解和降低。 由于Hibernate具有众多优点,受到了技术人员的青睐,现在市面上流行的服务器都是可以与Hibernate进行良好的集成。
    Hibernate 的运行过程如图3.5所示:

    图3.1给出了 Hibernate 的具体运行过程,它可以与应用程序之间建立持久性服务的主要原因是使用了数据库和利用了配置文件。
    3.3 设计思想
    采用良好的交互界面,减少键盘输入,尽可能多的使用鼠标操作
    采用B/S架构。使用浏览器/服务器模式这种开发方式不需要用户下载特定的软件,只要在具有浏览器的计算机上基本都可以进行操作,符合大众心理
    功能模块化设计原则。将不同的功能作为一个模块来进行划分设计,这样思路清晰,逻辑清楚,有利于后期的编码,测试和调试
    使用了面向对象分析方法。按照不同功能的模块划分,使用面向对象分析方法学来分析各个模块中所需要的类包括类中的属性和方法,以及不同类之间的关系等等。采用面向对象方法学来提高程序的质量,有利于后期的开发维护

    3.4 详细设计3.4.1 登录模块设计
    在登录界面,包含用户名,密码信息,输入之后点击登录进入酒店管理系统
    用户名和密码都不能为空,否则会弹出对话框进行提醒
    后端也会进行验证。如果验证不通过,弹出对话框提示用户名或密码错误。后端验证成功,提示登录成功,跳转到系统页面

    3.4.2 客房管理模块设计3.4.2.1 客房类型模块
    客房类型界面主要包括类型的id号,类型名称,操作和添加
    可以查看客房类型的具体信息,每项都有具体的值都不可以是空的
    通过操作下方编辑和删除按钮可以对客房类型信息进行操作
    点击下方添加按钮可以进行客房类型进行添加

    3.4.2.2 客房信息模块
    客房信息界面主要包括房间号,房间面积,房间简介,房间图片和房间类型和操作
    可以了解房间的具体信息,若有一项的值为空的话是不合法的
    点击操作下方的删除按钮可以删除某个特定房间
    点击本页面上的添加按钮,跳转到客房添加界面进行客房信息添加。添加的信息同(1),并且要上传房间图片

    3.4.2.3 客房预订模块
    在这个模块中,主要有预订的客房号,预订时间,预订天数,预订人的名字和电话和操作
    主要用于管理用户的预订信息,其中房间号必须和客房信息里面的房间号相一致,不会出现不存在的房间号。预订时间也一定在今天及其以后的时间,不会出现已经过去的时间。预订人和联系方式已经预订天数都不允许空,都有具体值
    使用鼠标点击特定预订信息后面的删除按钮,可以删除此条预订信息
    通过添加按钮出现客房预订信息界面,可以进行客房预订信息的添加

    3.4.2.3 入住消费模块
    入住消费模块主要信息是入住的房间号,入住时间及天数,入住者的名字及其联系电话和消费金额
    主要是用于记录用户的消费记录情况,入住的房间号一定是存在的房间号,入住时间也必须符合现实,联系电话是11位阿拉伯数字,这些信息参数值也必须不为空
    对已经付过账要离开的顾客可以点击对应后面的删除按钮进行删除操作,去除记录
    对于将要入住和正在入住的顾客点击添加按钮进行消费信息的添加

    3.4.3 客户模块设计3.4.3.1 客户信息模块
    客户信息模块主要用于显示客户信息和根据顾客名查询特定入住者
    客户信息模块主要有查询框和查询按钮,以及一些顾客基本信息比如:用户名字和联系方式,住所等等信息
    对已经离开和将要离开的用户,通过其信息后面对应的删除按钮进行删除,完成住宿

    3.4.3.2 添加客户模块
    添加客户模块对于已经入住的顾客进行信息添加完善
    添加客户模块主要包含多个文本框,比如客户名字,联系方式和地址等等一些必要信息,还有一个提交和重置按钮
    当填写完用户信息,点击提交按钮时,弹出对话框提示操作成功。这时,客户信息界面上就会显示刚才添加的用户信息

    3.4.4 特色菜品介绍模块设计3.4.4.1 特色菜品模块
    特色菜品模块所显示的信息可供顾客选择菜单上的菜品,提供餐饮服务,方便顾客选菜
    特色菜品模块显示一些菜品的名称,菜品的描述和图片以及价格等必要的信息和删除操作

    3.4.4.2 添加特色菜品模块
    添加特色菜品界面上包含几个文本框信息和提交,重置按钮
    这几个文本框所要填写的信息与特色菜单模块上的信息必须一一相对应,不能出现不相符的状况
    当填写完特色菜品信息进行提交后,弹出提示框显示操作成功,并且在特色菜品界面上会显示刚才所添加的菜品信息

    3.4.5 餐桌预订管理模块设计3.4.5.1 餐饮预订模块
    餐饮预订界面主要是显示餐桌预订的相关信息,包括预订时间,预订餐桌和预订人以及删除操作
    预订时间也是需要符合当前时间,不能是已经过去的时间,预订时间和预订人不能为空
    当顾客已经就过餐或者不在就餐时,点击删除按钮可以取消预订的信息

    3.4.5.2 添加餐饮预订模块
    餐饮预订添加界面包含预订的时间,预订人的名字和预订的餐桌号三个文本框信息,以及重置和提交按钮
    添加餐饮预订界面上的信息和餐饮预订界面上的信息是完全吻合的,需要将添加的信息显示到餐饮预订界面上

    3.4.6 餐饮消费管理模块设计
    餐饮消费管理界面主要是保存了用户消费的相关内容,比如消费时间,金额和消费者名字和删除信息操作
    当本次消费已经完成时,就可以点击删除按钮就可以删除此条所要删除的信息记录

    3.5 本章小结本章主要是进行系统设计。首先进行系统的总体设计,确定系统的主要功能模块。其次我们根据系统所需要完成的功能模块来进行ER图的分析和建立。再根据E-R图来确定数据库的逻辑模型,建立数据库的逻辑模型结构。最后是系统的详细设计阶段,确定各个模块的具体细节,为下一阶段的系统实现做充分的准备。

    4 系统功能实现前面我们已经明白了用户的具体需求,也经过了系统的分析和设计阶段,本章是进行系统的实现。根据前面对系统的分析和设计,我们现在对系统进行具体的代码实现。通过前面的对系统的逻辑分析,现在要正真转化成能够在机器上运行的物理系统,是对前面所做工作的总结和肯定。
    4.1 系统登陆页面实现描述:每个系统都需要相应的账号和密码进行登录。这样,不会因为随意登录操作系统而造成系统混乱。在系统设计之初,给出了管理员账号。
    下面展示了程序的运行效果如图4.1所示:

    进行登录时,输入本人自己的用户名和密码进行登录。然后点击登录按钮进行信息的提交。然后我们的后台会寻找相应的service来进行用户名和密码的匹配操作。根据用户名和密码的具体情况,返回具体的结果。
    public String login(String userName,String userPw,int userType) { String result="no"; String sql="from TAdmin where userName=? and userPw=?"; Object[] con={userName,userPw}; List adminList=adminDAO.getHibernateTemplate().find(sql,con); if(adminList.size()==0) { result="no"; } else { WebContext ctx = WebContextFactory.get(); HttpSession session=ctx.getSession(); TAdmin admin=(TAdmin)adminList.get(0); session.setAttribute("userType", 0); session.setAttribute("admin", admin); result="yes"; } return result; }
    4.2 总体功能模块描述:我们登录到系统后,可以看到可供我们操作的六大功能模块。这时,只需要点击相应的菜单来运用相应的功能。效果图如图4.2所示:

    在本文具体设计过程中,本系统的每个页面都进行了系统性的拦截,防止不法分子不需要登录来进行恶意操作。
    if(session.getAttribute("user")==null){ out.print("<script>alert('请先登录!');window.open('../index.jsp','_self')</script>"); }
    4.2.1 管理员管理4.2.1.1 系统管理员信息管理描述:登录人员进入管理员操作界面后,后天根据用户的具体操作来寻找具体的action类来进行系统响应。本文中主要是利用了List对象集合,通过request来显示出具体的信息。程序效果图如下图4.3所示

    系统管理员管理关键代码:
    /** 添加系统管理员 **/ public void adminAdd(HttpServletRequest req,HttpServletResponse res) { String userName=req.getParameter("userName");//获取填写用户名 String userPw=req.getParameter("userPw");/获取密码 String sql="insert into t_admin(userName,userPw) values(?,?)";//数据添加到数据库中 Object[] params={userName,userPw}; DB mydb=new DB(); mydb.doPstm(sql, params); mydb.closed(); req.setAttribute("message", "操作成功"); req.setAttribute("path", "admin?type=adminMana"); String targetURL = "/common/success.jsp"; dispatch(targetURL, req, res); } /** 系统管理员删除 **/ public void adminDel(HttpServletRequest req,HttpServletResponse res) { String sql="delete from t_admin where userId="+Integer.parseInt(req.getParameter("userId"));//在数据库中查找满足userId的数据 Object[] params={}; DB mydb=new DB(); mydb.doPstm(sql, params); mydb.closed(); req.setAttribute("message", "操作成功"); req.setAttribute("path", "admin?type=adminMana"); String targetURL = "/common/success.jsp"; dispatch(targetURL, req, res); }
    4.2.1.2 系统管理员密码修改界面描述:管理员点击左侧的菜单“密码修改”,系统显示出密码修改的界面。修改时,必须要输入正确的原密码。否则,会弹出对话框提示原密码错误。其次,新密码和确认密码保持一致。不然会弹出对话框两次输入的密码不一致。程序效果图如下图4.4所示

    4.2.2 客房类别管理4.2.2.1 客房类别信息录入描述:本功能需要操作人员输入正确的客房类型。如果操作人员出现失误信息填写错误,系统都会给相应的出错信息。本文在后台也设置了相应的函数来进行信息的处理。要能够将管理员填写的信息正确反映到客房信息界面上,信息的提交以及信息的交互都具有及时性。本文程序的实际效果如下图4.5所示:

    4.2.2.2 客房类别信息管理描述:本文这个功能主要是显示本酒店所有的客房类别信息供顾客选择和对酒店客房进行更好的分类。这些客房类别信息都保存在list对象里面,并通过request对象来进行显示输出。程序效果图如下图4.6所示:

    4.2.2.3 客房类别信息删除描述:本功能可以对已经过时货已经不存在的客房类别进行去除操作,能够及时反映本酒店的真实信息。删除时,给出了提示,为了防止出现误删除。程序效果图如下图4.7所示

    客房类别信息删除删除代码:
    public void kefangleixingDel(HttpServletRequest req,HttpServletResponse res) { String sql="update t_kefangleixing set del='yes' where id="+Integer.parseInt(req.getParameter("id")); Object[] params={}; DB mydb=new DB(); mydb.doPstm(sql, params); mydb.closed(); req.setAttribute("message", "操作成功"); req.setAttribute("path", "kefangleixing?type=kefangleixingMana"); String targetURL = "/common/success.jsp"; dispatch(targetURL, req, res); }
    4.2.2.4 客房类别信息修改描述:设置这个功能的主要目的是为了修改录入客房类别时出现的错误,或者对已经不符合酒店实际情况的信息进行修改。
    4.2.3 客房信息管理4.2.3.1 客房信息添加录入描述:当我们的酒店进行进一步扩张和发展的时候,我们就需要运用这个功能。这个要求使用人员要输入不存在的房间号和已经存在的房间类型,否则给出相应的信息提示,录入信息失败。这个功能所填写的信息通过后台的service及时反映到客房信息界面上。程序效果图如下图4.8所示:

    客房信息添加关键代码:
    String fangjianhao=req.getParameter("fangjianhao");String fangjianmianji=req.getParameter("fangjianmianji");String fangjianjianjie=req.getParameter("fangjianjianjie");String fujian=req.getParameter("fujian");String fujianYuanshiming=req.getParameter("fujianYuanshiming");String kefangleixingId=req.getParameter("kefangleixingId");String del="no";String sql="insert into t_kefang(fangjianhao,fangjianmianji,fangjianjianjie,fujian,fujianYuanshiming,kefangleixingId,del) values(?,?,?,?,?,?,?)";Object[] params={fangjianhao,fangjianmianji,fangjianjianjie,fujian,fujianYuanshiming,Integer.parseInt(kefangleixingId),del};DB mydb=new DB();mydb.doPstm(sql, params);mydb.closed();req.setAttribute("message", "操作成功");req.setAttribute("path", "kefang?type=kefangMana");String targetURL = "/common/success.jsp";dispatch(targetURL, req, res);
    4.2.3.2 客房信息管理描述:客房信息管理方便入住人员对房间的信息有一个大致的了解,节约了顾客寻找房间的时间。相应的list对象来保存相应客房信息,然后利用系统提供的request对象来进行显示。程序效果图如下图4.9所示:

    4.2.3.3 客房信息修改描述:本文通过使用这个功能对房间的真实信息已经改变了的状况进行修改,让顾客第一时间来反映本酒店客房的真实信息。程序效果图如下图4.10所示:

    4.2.3.4 客房信息删除描述:主要是对已经不存在的客房进行去除操作,当本酒店对某个特定的客房进行去除时,就需要用此功能进行客房的删除。删除后,客房信息界面上也就不再显示本客房的具体情况。客房信息管理关键代码:
    TKefang kefang=kefangDAO.findById(id);kefang.setDel("yes");kefangDAO.attachDirty(kefang);Map request=(Map)ServletActionContext.getContext().get("request");request.put("msg", "操作成功");return "msg";
    4.2.4 客房预订信息管理4.2.4.1 客房预订信息管理描述:客房预订这个功能的需求性非常高,顾客可以提前寻找酒店进行入住,不需要因无法找到二无法入住。它显示了顾客的预订信息,顾客可以凭借这些信息来进行入住。程序效果图如下图4.12所示:

    预订信息管理关键代码:
    public String yudingMana() { String sql="from TYuding where del='no'"; List yudingList=yudingDAO.getHibernateTemplate().find(sql); for(int i=0;i<yudingList.size();i++) { TYuding yuding=(TYuding)yudingList.get(i); yuding.setUser(userDAO.findById(yuding.getUserId())); yuding.setKefang(kefangDAO.findById(yuding.getKefangId())); } Map request=(Map)ServletActionContext.getContext().get("request"); request.put("yudingList", yudingList); return ActionSupport.SUCCESS; }
    4.2.4.2 客房预订信息删除描述:当顾客因意外无法入住或者已经入住完,我们就可以使用客房预订删除功能来进行处理。当删除了预订信息后,后台会将预订信息界面上的删除的信息进行去除,不在显示。客房预订信息删除代码:
    public String yudingDel(){ TYuding yuding=yudingDAO.findById(id); yuding.setDel("yes"); yudingDAO.attachDirty(yuding); Map request=(Map)ServletActionContext.getContext().get("request"); request.put("msg", "操作成功"); return "msg";}
    4.2.4.3 客房预订信息添加描述:当顾客计划将要在本酒店入住时,我们就可以记录下预订顾客的信息为后期顾客入住提供证明。本界面上客房必须是现存的房间号,不存在的房间号不会显示出来供选择。程序效果图如下图4.13所示:

    4.2.5 客户信息管理4.2.5.1 客户信息管理描述:我们需要记录客户的信息来进行客户管理,我们可以方便查询客户信息,为客户提供服务。这些客户信息都是运用了list对象进行处理的,在需要的时候,调用request对象来进行显示供参考。当客户信息过多时,管理人员可以输入客户的名称进行特定客户查询。程序真实表达他如下图4.14所示:

    4.2.5.2 客户信息添加描述:客户来进行入住登记的时候,就可以利用本系统的这个功能将特定的客户添加到本系统中。下面就是本文中的现实的图如图4.15所示:

    4.2.6 特色餐饮管理4.2.6.1 特色菜品介绍描述:本功能主要展示本酒店提供的餐饮服务有哪些。当顾客需要聚会就餐时,可以参考本页面上的餐品信息的具体介绍并根据自己的口味爱好来进行选择,方便就餐人员的选择。菜品介绍功能真实图如下图4.16所示:

    4.2.6.2特色菜品添加描述:管理员点击左侧的菜单“特色菜品添加”,就可以添加特定菜品。菜品添加界面如下图4.17所示:

    4.2.7 餐桌预订管理4.2.7.1 餐桌预订管理描述:当顾客想在本酒店进行餐饮服务,而现在不在本酒店的时候,就可以运行此功能。它显示了所有就餐人员的时间,信息等等。当具体进行餐饮服务时,可以利用本界面的信息进行对比。餐桌预订的效果图如下图4.18所示:

    4.2.7.2 餐桌预订信息添加描述:当有顾客有要预订餐饮的需求的时候就要使用本界面上的信息,并且将本界面填写的信息正确反映到餐桌预订的界面上。餐桌预订信息添加效果图如下图4.19所示:

    4.2.8 客户消费管理4.2.8.1 客户入住消费管理描述:当顾客入住时,需要对其的消费情况做一个记录信息。一方面顾客可以对自己的消费的情况有一个真实的的了解。同时,也可以对了解本酒店的经营状况,确定是否需要改进。客户入住消费图如下图4.20所示:

    4.2.8.2 客户入住消费删除描述:当顾客的消费记录已经过去很久了,为了节约存储空间,就可以对其进行删除处理。客户入住消费删除图如下图4.21所示:

    4.2.8.3 客户入住消费添加描述:当顾客办理入住手续的时候,需要对其消费情况进行添加。并且其添加的信息显示到客户入住消费的界面上。客户入住消费添加图如下图4.22所示:

    4.2.8.4 客户餐饮消费管理描述:这里真实的记录了某个特定人的真实消费情况,顾客可以查询自己的消费情况,并进行支付。酒店也可以知道餐饮服务这块业务的收入情况,并进行适当的调整和完善。客户餐饮消费运行图如下图4.23所示:

    4.2.8.5 客户餐饮消费删除描述:对已经结过餐饮费用且对消费金额无异议的顾客。按照实际情况,将结账记录久远的信息去掉。客户餐饮消费删除执行图如下图4.24所示:

    4.2.8.6 客户餐饮消费添加描述:当顾客就餐结账的时候,需要对顾客就餐消费情况进行统计管理。在本页面上添加的信息会体现到客户餐饮消费界面上。下图4.25就是其运行结果:

    4.3 本章小结本章主要用来说明系统设计开发的情况。也就是说,向用户展现的系统概貌。这一章已经可以看出对对上一章中总体设计和详细设计中所展现的功能模块都已经实现完成了,也达到了需求分析中用户的实际需求。通过本章节对系统的介绍,相信会对本系统有一个多方面的客观认识。 
    5 系统测试5.1 系统测试目的与意义为了发现代码中存在的错误和减轻后期代码维护工作量,我们需要对酒店管理系统进行测试。软件测试是通过输入特定值并将输出结果与预定的输出结果结果进行对比,找出程序中存在的错误。软件测试的根本目的是尽可能多的发现现在程序中存在的错误和潜在错误,通过后期调试改正程序中存在的错误。通过测试,提高软件的质量,给客户一个满意的答案。
    测试一般分为三个阶段完成:模块测试,主要用于发现编码和详细设计中存在的错误。将一个个单个模块作为一个测试对象进行测试。系统测试,我们也可以称之为集成测试。主要是验证系统的功能与需求分析中指定的功能是否相一致,验证各个模块之间的是否能够进行组装。验收测试也就是通常说的集成测试,将整个系统作为一个整体来进行测试。本文主要是采用黑盒测试,验证已经设计完成的功能是否能够正常运行和是否缺少必要的功能。
    5.2 测试原则
    测试应该在早期就要开始实施,因为越早发现错误就越能够减少后期的工作量,降低成本
    自己设计的程序一般由其他专业人员来进行测试
    设计测试用例也要尽可能合理全面,既要测试合法的数据,也要想到不合法的数据以及测试数据的边界等等
    选择尽可能会出错的测试用例进行测试

    5.3 测试目标
    发现一些可以通过测试避免的开发风险
    实施测试来降低所发现的风险
    确定测试何时可以结束
    注重测试,将测试作为软件开发的一个重要环节
    测试的其目的是发现程序中的错误并调试,使系统符合客户的需求,达到预期值

    5.4 测试用例设计的原则
    全面性

    应尽可能覆盖程序的各种路径应考虑存在跨年、跨月的数据大量数据并发测试的准备
    正确性

    输入界面后的数据应与测试文档所记录的数据一致预期结果应与测试数据发生的业务吻合。
    符合正常业务惯例

    测试数据应符合用户实际工作业务流程兼顾各种业务变化的可能
    可操作性

    测试用例中应写清测试的操作步骤,不同的操作步骤相对应的操作结果

    5.5 测试过程5.5.1 主页面的登录模块测试测试流程:

    打开系统首页,输入错误的登录信息
    登录
    输入正确的登录信息
    登录
    测试结果

    登录模块的测试记录表,测试过程如5-1所示:



    模块名称
    测试用例
    预期结果
    实际结果
    是否通过




    登录模块
    用户名:null 密码:null
    弹出错误提示,请输入用户名
    失败,提示请输入用户名如图5.1所示
    通过


    登录模块
    用户名:m1 密码:null
    弹出错误提示,请输入密码
    失败,提示输入密码 如图5.2所示
    通过


    登录模块
    用户名:m1 密码:1
    弹出错误提示,用户名或者密码错误
    失败,提示用户名或者密码错误 如图5.3所示
    通过


    登录模块
    用户名:root 密码:root
    弹出提示, 通过验证,系统登录成功。
    登录成功,提示 通过验证,系统登录成功。 如图5.4所示
    通过



    5.5.2 修改密码测试测试步骤:

    登录系统后,点击“密码修改”
    输入原密码,新密码和确认密码
    点击提交按钮
    测试结果鉴定

    管理员模块的测试信息表,测试过程如5-2所示:



    模块名称
    测试用例
    预期结果
    实际结果
    是否通过




    管理员模块
    原密码:null 新密码:null 确认密码:null
    弹出错误提示: 原密码不正确
    失败,提示原密码不正确 如图5.5所示
    通过


    管理员模块
    原密码:xls 新密码:null 确认密码:null
    弹出错误提示,原密码不正确
    失败,提示输入密码 如图5.6所示
    通过


    管理员模块
    原密码:root 新密码:null 确认密码:null
    弹出错误提示,新密码不能为空
    失败,提示新密码不能为空 如图5.7所示
    通过


    管理员模块
    原密码:root 新密码:root01 确认密码:root02
    弹出错误提示, 两次输入的密码不一致
    失败,提示 两次输入的密码不一致 如图5.8所示
    通过


    管理员模块
    原密码:root 新密码:root01 确认密码:root01
    弹出提示, 修改成功,并且重新登录时,只能使用新密码。
    成功,提示 修改成功,并且重新登录时,只能使用新密码。 如图5.9,5.10,5.11所示



    5.5.3 客房添加测试测试步骤:

    登录系统后,点击“客房信息”页面上的添加按钮
    在文本框中输入数据
    点击提交按钮
    对比测试结果

    客房添加测试信息表,测试过程如5-3所示:



    模块名称
    测试用例
    预期结果
    实际结果
    是否通过




    客房管理模块
    房间号:111 房间面积:100 房间简介:干净整洁 房间图片:1492489628424.jpg 房间类型(下拉框,只显示已经添加的客房类型):单人间
    在客房信息界面上能正确显示填写信息。
    所填写的信息在客房信息界面上显示出来了 如图5.12,5.13所示
    通过



    5.5.4 客房预订添加测试测试步骤:

    登录系统后,点击“客房预订”
    点击添加按钮,进入客房添加界面
    点击提交按钮
    对比测试结果

    客房预订添加测试信息表,测试过程如5-4所示:



    模块名称
    测试用例
    预期结果
    实际结果
    是否通过




    客房预订添加模块
    现存的房间号只有110和111
    在客房预订添加界面上的房间号只显示110,111。(注:房间号是下拉框)
    房间号确实只显示现在已存在的房间号 如图5.14所示
    通过



    5.5.5 客户信息查询测试测试步骤:

    登录系统后,点击“客户信息”
    在查询的文本框中输入要查询的顾客名
    点击提交查询按钮
    分析显示结果

    客房预订添加测试信息表,测试过程如5-5所示:



    模块名称
    测试用例
    预期结果
    实际结果
    是否通过




    客户信息模块
    查询小兰的信息
    在多个客户信息中只显示出了小兰的信息
    确实只显示出顾客小兰的信息如图5.15,5.16所示
    通过



    5.5.6 其余模块测试剩余模块与已经列出了的模块测试都是大同小异,本文就不在这里一一列举。但是在实际的测试中所有的模块都是经过严格的测试。
    5.6 中文乱码问题处理在web.xml中配置:
    <param-name>encoding</param-name><param-value>gb2312</param-value>
    对应的SetCharacterEncodingFilter.java文件中的重要代码,在初始化init()方法中定义:
    public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); String value = filterConfig.getInitParameter("ignore");}try{ byte[] tempByte = gbStr.getBytes("GB2312"); uniStr = new String(tempByte,"ISO8859_1");}catch(Exception ex){}return uniStr;
    5.7 其他错误本文在程序开发阶段,由于自己不够细心和代码量庞大的缘故,难免会出现一些传值得名字不一致无法找到、传值参数的类型不同而无法识别和传值得个数不同而无法运行等等情况。下图5.17就是因为路径问题而导致的错误。

    5.8 本章小结本章主要对各个模块进行单元测试,当然也对本系统进行了集成测试。主要采用黑盒测试的方法学,找出程序功能上的不足,并通过调试来进一步完善系统。测试中发现了一些不足,比如中文乱码,信息没有及时传递等等问题。由此可以看出,系统测试也是我们软件开发过程中的不可或缺的一环,对我们系统的完善性和健壮性有很大的帮助。所以,在以后要注重系统测试环节。

    结论通过这次对酒店管理系统的设计,我收获良多。首先利用MVC模型。通过使用MVC模型可以达到界面和逻辑部件分离。换言之,当我们需要修改界面风格时,不需要再改变系统的逻辑部件。这样有利于后期的系统维护。代码的复杂度相对应的也就减轻了,有利于系统的实现。
    在系统的开发和设计中,我运用B/S三层开发结构技术和自己平时学习积累的知识水平,完成这个酒店系统的开发。通过开发这个酒店管理系统我也明白了软件开发不单单是完成代码编写,而是具有一整套完整的体系,代码只是其中占据很少一部分,前期准备才至关重要。另外,测试对我们的帮助也很大。测试也要在早期进行,越早发现系统中的错误,所要花费的代价也就越少,对我们也就越有利。如果后期发现错误,尤其是在维护时期,那么有可能付出比开发这个系统还要大的代价,得不偿失。
    这个系统可以帮助酒店工作人员刚好的管理酒店,本系统主要实现了一下几个功能:

    客房管理功能:在这个模块中,我们可以查看,增加和删除客房的类型。也可以查看客房的信息和预订客房并记录消费情况
    客户管理功能:我们可以利用此功能查询特定客户的信息情况,了解客户的实际情况,也可以增加新的顾客
    特色菜品功能:在这个功能下,详细的记录了本酒店的餐饮服务,顾客可以根据自己的喜好来选择餐饮服务,也可以添加新的菜色
    餐饮预订功能:顾客可以根据自己的实际情况来进行就餐时间,就餐地点的选择,方便顾客的实际用餐
    餐饮消费功能:记录了顾客的餐饮消费金额,方便顾客查阅,了解自己的消费细节

    希望在以后中,进一步完善。可以分析出不同职业,不同性别,不同年龄段的的人对房间类型的需求,对餐饮不同菜色的喜爱程度。
    通过这次对酒店管理系统的设计,也让我完整的体验了一次软件开发的全过程。获益良多。锻炼了自我学习,自我研究的能力。同时,也为自己以后的工作学习甚至生活都起到了关键的作用。也锻炼了我的耐心和查找错误并分析错误的能力。
    当然,由于技术和时间的关系,这个系统也存在一些问题。比如对酒店的收入和消费人群没有系统的统计和分析。希望在以后的学习中,继续提高自己的专业水平和技能素养。不断完善自己的系统。
    参考文献[1] 黄剑.基于移动互联网酒店管理系统的设计与实现[D]. 电子科技大学,2014(11):21-25
    [2] 杨玉平.基于WEB的酒店管理系统的设计[D].吉林:吉林大学 , 2012,(21):21-38
    [3] 宣振国.基于Mysql的数据库集群设计与实现[D].北京:北京邮电大学,2013:25-28
    [4] 莫祖英,马费成. 数据库信息资源内容质量用户满意度模型及实证研究[J]. 中国图书馆学报,2013,(10):113-115
    [5] 杨宏. 大数据与智慧酒店管理[J].科技创新与应用,2015 ,(32):76+102
    [6] 陈娅玲. 新形势下酒店管理如何实现创新[J].黑龙江教育学院学报, 2014,(22):174-203
    [7] 陈世敏.大数据分析与高速数据更新[J].计算机研究与发展, 2015, (74):115+168
    [8] Michael J.A.Berry,LinoffGordonS.Mastering Data mining,The art and science of customer management [C].America,2004,11-34
    [9] MarkAllenWeiss.Data structure and algorithm analysisin C[J].America.2004,12+97
    [10] Thomas M.Cover,Joy A.Thomas.Elements of Information Theory[J]America.2011,27-86
    2 评论 19 下载 2020-07-26 11:30:51 下载需要14点积分
  • 基于TCP和UDP Socket编程实现的网路聊天室支持文件传输

    1、环境1.1 开发平台Intel i5处理器,4GB内存,500GB机械硬盘,1GBps网卡速率;操作系统为Windows 10,开发平台为Qt creator5.9.2,除Qt的部分动态链接库以外,无其他组件。
    1.2 运行平台服务器运行平台与开发平台相同,由于需要多个用户同时在线,故其中一个用户也运行在开发平台上;其他用户运行在虚拟机上,虚拟机是Vmware workstation上安装的Windows 7虚拟机,内存2GB,磁盘空间50GB。第三方组件为Qt的动态链接库。
    2、系统功能需求基于TCP和UDP协议实现一个即时通讯工具,具体功能要求包括:

    工具包括服务器端和客户端
    具备用户注册、登录、找回密码功能(基于TCP协议)
    两个用户如果同时在线,采用点到点通信方式进行聊天,信息不需要通过服务器中转,服务器也不保存,且消息要在五秒内送达对方(基于TCP协议)
    支持离线消息,且在登录后一分钟内全部收到(基于TCP协议)
    支持点到点可靠文件传输(基于UDP协议)
    存储在服务器端的数据需要进行强加密
    支持不少于两组用户同时在线交流和传输文件
    文件传输具有良好的性能,能够充分利用网路带宽
    人机交互友好,软件易用性强

    3、系统设计3.1 系统架构由于开发环境是qt,而qt中有其独特的信号和槽机制,通过信号的触发来调用槽函数,所以系统的功能函数基本都是槽函数,通过用户的按键等操作来实现调用,所以不像一般的系统都是一个主函数调用若干个子功能函数,本系统中的众多功能函数相对比较分散、独立,各有各的触发开关,执行自己的功能。
    3.2 功能模块由于系统分为服务器和客户端,所以功能模块也需要各自讨论。
    3.2.1 服务器服务器主要功能是接受用户的注册消息、登录消息和离线消息等,所以主要功能模块如下:

    用户连接:处理用户的tcp连接请求
    注册功能:处理用户的注册消息
    找回密码:处理用户的找回密码请求
    获取IP:用于处理聊天的用户发来的获取IP的请求
    离线消息:处理用户发来的离线消息
    获取用户列表:获取所有用户,区分在线和离线用户
    保存&读取数据:保存已注册用户的所有账号信息并加密,读取用户信息并解密

    3.2.2 客户端客户端的功能远远多于服务器,大体上可以分成tcp模块和udp模块,而这两个模块下又有很多子模块。

    注册账号:新用户注册新账号
    找回密码:老用户根据密保问题找回密码
    登录:最基本的功能,是聊天和发文件的基础
    文本聊天:选择好友进行文字聊天
    文件传送:选择好友进行文件传输
    接收聊天信息:接受好友或服务器发来的聊天信息并显示
    接收文件:接受好友发来的文件并保存
    界面控制:根据不同的用户状态,在界面上显示或隐藏不同的控件
    获取好友列表:获取所有好友,并在列表中显示器账号

    3.3 应用层协议3.3.1 文本传输用Qbytearray向qtcpsocket中写入数据,为了供数据接收方识别,需要根据数据的功能加上各自的头部,比如注册信息可加上“reg”头部,普通聊天消息可加“msg”,发送方要根据当前用户所处的状态来加不同的头部,而接收方在取出头部后,需要根据头部的值来判断这是何种信息,接下来该执行何种操作,这是应用层协议的关键,双方需要协商好每一种信息使用何种头部。
    3.3.2 文件传输使用qdatastream向qudpsocket中写入从文件中读出的数据,每个包的数据长度自己定义,由于udp只用于文件传输,所以发送和接收方都不会发生混淆,不需要加消息头部标识,但是还是需要在头部添加数据包的序号。接收方采用累积确认法,接受一个包就发送该包对应序号的ack,当收到的数据包不是已确认序号的下一个时,仍发送最后一个已确认序号的ack信号。发送方采用快速重传法,并且使用tcp reno算法控制拥塞窗口大小。当收到三个冗余的ack时,重新发送冗余ack后的所有分组,窗口长度减半,当发生超时,拥塞窗口减为1,再用慢启动恢复窗口长度。
    4、系统实现4.1 服务器保存&读取数据:这是服务器一切功能的基础。服务器启动时,从内存中导入已注册用户的信息,形成一个用户链表,表中的每个结点分别对应一个用户,其中存放了用户的账号、密码等个人信息,此外还有是否在线的标记,以及与服务器建立连接的tcp套接字。
    在读取文件恢复链表时, 只需要恢复账号密码信息即可,其他在线信息暂且不用管。在保存数据时,也只需要保存账号信息。需要注意的是,对于密码,需要进行加密然后再写入文件,读出文件时使用与之配套的解密算法进行解密。
    从内存读取数据并恢复用户链表的流程图如下图所示,保存数据的过程与之类似,但顺序相反。

    用户连接:当有用户发送连接请求时,服务器要用一个套接字来与之连接。与服务器进行连接的用户有多种情况:注册、找回密码和登录,对于前两种情况,该套接字在操作完成后就失效了,但对于登录的用户,则需要长久保持连接。因此,我们先创建一个套接字建立这一连接,等到确认该用户是登录用户时,就将该套接字挂载到用户链表中的对应节点上,并将链表中用户是否在线的标志变量置为1,并获取登录方的IP地址,也存到用户结点中。若用户是进行注册和找回密码,则需要在一定时间以后销毁该套接字,以免占用内存。
    客户端接受用户各类连接信息的流程图如下图所示。

    注册功能:用户与服务器建立连接,发送注册的账号和密码,服务器到用户链表中查找是否已经存在该用户,假如不存在,则新建一个用户结点,把该用户添加到用户链表中;否则,发送注册失败的消息,告诉用户,该账号已经被注册了。
    注册功能是服务器处理各类连接中的一类情况,其操作流程已经包含在服务器处理连接的流程图中。
    找回密码:用户与服务器建立连接,发送密保问题和答案,并附带新密码。需要注意的是,我们生活中常用的软件附带的找回密码功能,实际上都是让用户设置新密码,而并不是直接把旧的密码告诉用户,因为这样更安全,所以此处也借鉴了这一做法。服务器根据用户账号去用户链表中找到该用户,判断用户的密保问题是否回答正确,若是,则将新密码替换旧密码,并反馈给用户修改成功的信息;否则,告知用户问题回答错误,无法找回密码。
    找回密码功能是服务器处理各类连接中的一类情况,其操作流程已经包含在服务器处理连接的流程图中。
    获取IP:系统要求用户点对点聊天时,消息不经过服务器,那么,用户就必须知道聊天对方的IP地址,才能与之交流,所以用户必须向服务器索要IP。服务器收到获取IP的请求后,根据用户所请求的账号,去用户链表中查找该用户是否在线,若是,则把用户的IP发回请求方,否则,告知请求方,你所请求的用户不在线,假如要跟它聊天,请直接把离线消息发给服务器。
    离线消息:对于不在线的用户,与之聊天时只能把消息发给服务器。发送方要在消息头部注明该消息是发给谁的,服务器收到以后,为该用户建立一个文件,把离线消息全都存起来。当离线的用户上线时,服务器立马检索是否有该用户的离线消息,若有,则打开文件,把消息读出,并发给用户,然后还要记得销毁文件,以免占用内存。
    获取用户列表:为了方便服务器管理用户,在要求服务器端显示所有用户的账号,对于在线的用户,还需要显示IP地址。可以设置一个获取用户的按键,按键触发时,遍历用户的链表,判断该用户是否在线,假如在线,则将其昵称和IP地址显示到在线用户列表,否则,将账号显示到离线用户列表。
    获取IP、发送离线消息和获取用户列表三者都是某用户在线条件下向服务器发送消息的功能,所以三者是同一处理程序的不同分支,其流程图如下图所示。

    4.2 客户端注册账号:获取用户输入的账号信息,包括账号、密码、密保问题、问题答案,将这些信息打包发给服务器,加上“reg”首部表示是注册信息,等待服务器响应,若服务器返回确认信息,则注册成功,可以使用注册的账号登录,否则,注册账号失败,说明该账号已存在。
    注册账号的流程图如下图所示。

    找回密码:用户输入已注册的账号,该账号的密保问题和答案,以及新的密码,将这三项信息加上头部“psd”,打包发给服务器,若服务器返回确认信息,说明找回密码成功,可以使用新密码登录;否则,说明密保问题回答错误,找回密码失败。找回密码的流程与注册账号相似,流程图结构也相似。
    登录:将账号和密码,以及头部“login”发给服务器,等待服务器响应,若返回确认信息,则登录成功,否则登录失败,账号与密码不匹配。登陆流程与注册和找回密码相似,流程图结构也类似。
    获取好友列表:点击获取用户按键,向服务器发送一个请求信息,请求服务器将当前所有已经注册的用户反馈过来,这样,我就可以选择其中的用户进行聊天。收到服务器的反馈以后,建立一个用户链表,每个结点代表一个用户,并将每个人的账号显示在列表中。当需要与某人聊天时,双击即可。获取用户列表的流程图如下图所示。

    文本聊天:在已经获取了好友列表以后,在好友列表中点击一位好友,客户端将向服务器发送获取IP地址的请求,请求服务器把我选中的用户的IP地址进行反馈,以便我与他取得联系。服务器可能有两种响应:返回用户IP,或者返回错误信息。正常返回用户IP时,客户端向该IP地址发送tcp连接请求,连接成功后,在文本框内输入消息,点击发送,就可以使用已经建立的tcp连接把消息发送过去。假如服务器返回了错误信息,说明该用户当前不在线,所以也就不存在IP地址一说,故不能直接和他聊天,而应该以离线消息的形式发给服务器。在用户看来,对方在线或者不在线是没有区别的,消息都成功发送出去了,但是在内部实现时,要根据对方是否在线,决定将消息发向对方或者是发向服务器。
    文本聊天的程序流程图如下图所示。

    接收聊天信息:接收好友或者服务器发来的消息。对于好友发来的消息,在消息框内进行显示,并在界面左上角显示当前联系人,也就是发消息过来的人,这些消息都是包含在对方发来的报文中的,直接提取即可。对于服务器发来的离线消息,处理程序也类似,只是在消息显示时,注明是离线消息,以便让用户知道这不是当前发的消息。
    文件传送:点击获取文件,弹出文件选择框,选择待发送的文件,获取其文件名,将文件名发送给好友,并向其发送udp端口请求,请求对方提供他的udp端口号,以便进行udp文件传输。对方收到文件名以后,创建文件,并反馈端口号,即刻,文件传输开始。一次从文件中读取1400个字节的数据,再加上一个从1开始的序号,用udp发送给对方。虽然是udp文件传输,但是在拥塞控制上,使用了tcp的reno算法,拥塞窗口长度一开始为1,然后在每次收到正确的ack以后长度翻倍。当收到三个冗余ack时,窗口减半;当发生超时,窗口减为1。发送结束后,关闭套接字和文件。文件发送的流程图如下图所示,由于发送过程的处理逻辑过于复杂,全部用流程图展出难度太大,所以对有些过程进行了缩减,只画出了大致流程。

    接收文件:根据好友发送的文件名,在本地创建文件,并将收到的数据写入文件。若收到的序号是递增的,则将数据写入文件,并返回递增的ack序号。若收到的数据包序号不是当前想要的,就发送重复的ack,直到收到正确的数据包。文件接受完毕后,关闭文件。接收文件的逻辑没有发送文件那么复杂,其流程图如下图所示。

    界面控制:在不同的用户操作状态下,界面上要显示不同的组件,可以设立一个状态变量,界面控制函数里有一个状态机,它会根据当前所处的状态进行控件的隐藏和显示。这个不涉及到系统的核心功能,没有太多技术含量,只是为了让界面尽可能友好,调用的主要就是控件的show、hide、settext函数。
    5、系统测试及结果说明测试系统为本机+虚拟机,本机配置为:Intel i5处理器,4GB内存,500GB机械硬盘,1GBps网卡速率,Windows10操作系统; 虚拟机为:Vmware workstation上安装的Windows 7虚拟机,内存2GB,磁盘空间50GB。
    5.1 注册选择注册功能,填写要注册的账号信息。这里注册账号为胖虎,密码为panghu,密保问题是我的真实姓名,答案是胖虎的真实姓名“冈田武”的拼音。点击确认,注册成功。

    5.2 登录输入账号密码。

    登录成功,进入用户界面,右侧显示本机ip地址和分配的tcp以及udp端口号。点击获取用户列表,获取到当前已注册的所有用户。

    5.3 点对点聊天现在想要与小明聊天,故双击小明,右侧显示“connected”表示成功与小明建立连接(此时小明也成功登录了)。向小明发送消息,与他问好,小明成功收到了消息。

    小明收到消息以后,应该回复消息,两人可以按照任意顺序,随意进行聊天。

    5.4 多组用户聊天当胖虎与小明聊天时,其他在线用户可能向小明和胖虎发送消息,此时他们要能够正常接收其他用户发来的消息。现假定小红也在线,她向正在聊天的小明和胖虎分别发去了消息。

    此时小明和胖虎都收到了小红发的消息。

    5.5 离线消息当前共有三人在线,而小强不在线,小明和胖虎想叫小强出去打篮球,所以他们都向小强发了消息。

    此时,两人发送的消息在服务器端存了起来,等到小强上线时才会发送给他。几分钟后,小强上线了,他立马就收到了来自服务器的消息。

    5.6 密码找回假设小刚想要登录,但是发现自己忘记了密码,他应该选择找回密码功能,填写账号和密保问题,并设置新密码。

    点击确认,找回密码成功。再用新密码进行登录,登录成功。


    5.7 文件传输小刚向胖虎发送视频文件狐狸爸爸fox.mkv,用时23秒,如下图所示。在文件夹中可以看到保存成功的文件。

    文件传输过程中拥塞窗口长度变化的部分图像。

    图中横坐标为时间,单位是毫秒,纵坐标是拥塞窗口的长度。由于传输过程达到了上千毫秒,所以只能选取部分过程进行分析,只要该部分中包含有传输中可能出现的各种情况,都是可取的。这里选取了开始的半秒钟,可见在半秒钟时间内,窗口长度就发生了多次剧变。一开始窗口长度以指数型方式增长,超过阈值,然后线性增长;当网络轻度拥塞,产生三个冗余ack,拥塞窗口减半再加三,以线性增长方式恢复;当网络重度拥塞,窗口长度减为1,然后再以指数型方式恢复。这与我们的网络传输协议的设计是相符的,也就相当于tcp拥塞控制协议中的reno算法,只不过是用在了udp传输中而已。
    4 评论 101 下载 2019-03-22 09:09:24 下载需要15点积分
  • 基于JSP和MYSQL数据库的在线购物网站的设计与实现

    1 系统概述1.1 系统描述IShopping购物网站是一个在线的百货商店,用户可以通过网络购买我们的商品,其基本功能包括用户的注册、登录,浏览所有商品,浏览分类商品,查看商品的详细信息,购买商品,处理订单等功能;管理员功能包括管理商品,管理商品分类,管理普通用户,管理管理员帐号,处理订单等功能。
    1.2 技术说明IShopping购物网站的开发语言是 java , 使用纯jsp技术来实现,采用ajax来实现后台订单的管理,页面使用 bootstrap twitter和jquery实现,使用CommonsCodec进行用户的密码加密, 数据库采用 MySQL 5.1。 开发环境是MyEclipse 10.1。 部署环境是tamcat 6.0
    1.3 源码使用说明1.3.1 测试数据
    请导入项目文件夹下的data.sql到mysql中(source data.sql)
    普通用户帐号:xxxx0xxxx@qq.com 密码:123
    管理员帐号:xxxx.myxxxxr@gmail.com 密码:xxxx

    1.3.2 注意事项
    测试时由于图片和评论不是在本地,必须联网,否则可能不能看到完整功能
    后台管理入口在页面底部黑色区域的最左边,你懂得~

    1.3.3 关于代码
    所有模型类在src/beans/下
    所有业务逻辑处理放在scr/servlets/下
    所有数据库操作和工具代码放在src/utils/下
    除首页外所有页面放在webroot/templates/下

    2 数据设计2.1 物理模型
    2.2 相关数据库表
    2.3 各表详细说明2.3.1 管理员表(admin)
    2.3.2 订单表(orders)
    2.3.3 商品表(goods)
    2.3.4 分类表(goodstypes)
    2.3.5 图片表(pics)
    2.3.6 已订购表(ordered_goods)
    2.3.7 用户表(users)
    3 功能设计3.1 基本功能
    3.2 扩展功能
    3.3 界面设计3.3.1 首页界面
    3.3.2 商品详情界面
    3.3.3 用户个人中心界面
    3.3.4 管理员登录界面
    3.3.5 后台管理界面
    2 评论 257 下载 2018-12-03 09:44:46 下载需要12点积分
  • 基于PHP的网上购物系统设计与实现

    摘 要随着Internet技术的发展,人们的日常生活已经离不开网络。未来社会人们的生活和工作将越来越依赖于Internet技术的发展,也将越来越数字化、网络化、电子化、虚拟化。电子商务也随着网络的发展日益和人们的生活贴近。Internet的发展历程以及目前的应用状况和发展趋势,可以充分地相信网络技术将极大的改变我们的生活和工作方式,甚至社会的价值观也会发生某种变化。本设计尝试用PHP在网络上架构一个动态的网上商品购物网站,以使每一位顾客不用出门在家里就能够通过上网来轻松购物。
    本文详细介绍了基于PHP的网上购物系统的系统结构设计、实现方法和操作流程,并介绍了系统各个模块的主要功能和数据库设计及功能。该系统采用B/S结构,采用PHP技术进行动态窗体页面的设计。后台数据库选用MySQL 数据库。系统设计并实现了会员注册及登录模块,会员基本信息模块,会员购物模块,产品搜索模块,管理员商品管理模块,用户管理模块,订单管理模块,信息管理模块等一系列功能模块。最后,对网上购物系统进行了系统测试,各个模块功能运行良好。
    关键字:Internet,PHP,B/S,网上购物系统
    AbstractAlong with the development of internet technology, daily life can not go on without the network. The life and work of the social people of future will depend on the development of digital technology more and more , digitization, networking, electronization, virtual more and more. E-commerce presses close to people’s life day by day along with the development of network too.Developing course and present application state and development trend of Internet can believe network technology will change life and working way of us greatly, and even change the values of the society to some extent.This paper tries to build up a dynamic e-commerce website in the network with PHP, so that each customer needn’t go out and can do some shopping easily through internet at home 。
    This paper describes system structure design, implementation method and operation process based on PHP, and introduces main functions of various modules about the system and database design. The system uses B/S structure, and conducts design of dynamic form page by PHP technology. Background database selects MySQL database. System design realizes a series of function modules such as user registration and landing module, user basic information module, shopping module, searching goods module, the management of goods ,the management of user,the management of orders ,the management of news and so on. Finally, the paper tests Shopping Inline System, and the result finds that kinds of modules operate well.
    Keyword: Internet, PHP, B/S, e-Shopping
    1 绪论1.1 开发背景及意义电子商务是伴随着信息经济的脚步,在20世纪90年代兴起于美国、欧洲等发达国家的一个新概念。目前,国际上对电子商务尚无统一的定义。一般来说,狭义的概念是指在开放的国际互联网及其它网络的环境下,通过服务器的运用,实现消费者的网上购物、企业间商业交易的一种新型交易运营模式。即电子商务=Web(服务器)+IT(信息技术)+企业业务。
    电子商务的类型:从其交易对象来看,电子商务的应用包括企业与企业之间的电子商务 (B2B)、企业与消费者之间的电子商务(B2C)、企业与政府之间的电子商务 (B2G)、政府与消费者之间的电子商务(G2C)、企业内部的电子商务。
    电子商务的本质特点:电子商务的重点在于商务、电子商务的核心竞争力在于信息平台、电子商务的使命在于利用互联网技术对传统资源的整合。
    电子商务实现贸易的全球化、直接化、网络化,发展电子商务是不可阻挡的趋势,而我国的电子商务尚不完善。要实现全过程的电子商务,就要加快网络基础设施建设和网络互联,实现金融电子化及海关、税务、行政监管部门电子化,市场环境网上支付,建立安全体系认证结构,健全相关法律法规等等。
    1.2 国内外电子商务现状以下是根据CNNIC(中国互联网络信息中心)公布的中国B2C电子商务发展报告来进一步分析目前的网上购物的现状。(主要引用其中的分析图表)

    从上面的图可以看出网上购物选择节约时间和操作方便的分别占46.7%和44.2%,这说明随着生活节奏的加快,人们越来越希望拥有简单快捷的购物方式。

    从上面的图中可以看出人们总希望直接可以拿到物品,而不需要耽搁自己的时间,如果是送货上门,也可以当面检查所购的物品,这也表现出人们对厂商信誉的担忧。

    从上面的图中可以看出目前两个最严重的问题是安全性和产品服务。
    1.3 本文研究的内容本文详细介绍了基于PHP的网上购物系统的系统结构设计、实现方法和操作流程,并介绍了系统各个模块的主要功能和数据库设计及功能。该系统采用B/S结构,采用PHP技术进行动态窗体页面的设计。后台数据库选用MySQL 数据库。系统设计并实现了会员注册及登录模块,会员基本信息模块,会员购物模块,产品搜索模块,管理员商品管理模块,用户管理模块,订单管理模块等一系列功能模块。最后,对网上购物系统进行了系统测试,各个模块功能运行良好。
    1.4 开发可行性分析1.4.1 管理上的可行性把企业业务延伸到Internet上,建立电子商务网站,对运营商业企业来说,是企业对外展示信息,从事商务活动的窗口和界面。因此,高中层管理人员不会对此有很大的抵触情绪,主管领导也能够相应的支持。
    1.4.2 技术上的可行性根据系统目标需求分析得结果来看,不需要通过购买专业软件,仅采用phpStudyAdmin为开发环境,Apachec为服务器,选择PHP语言就可以解决相关的问题,从而保证系统功能的实现。
    1.4.3 经济上的可行性商业企业在运营过程中 ,经常会遇到产品的宣传受到限制,采购商或顾客只能通过上门咨询、电话沟通等方式进行各种信息的获取,受一定的时间与物理空间的局限并且成本较高。而本系统可以帮助企业正确认识电子商务技术在企业中的重要地位,以少量的时间和资金建立企业信息门户网站并架设一定范围的商务网络,以此来是企业与顾客间的经济活动变得更灵活、更主动。
    1.4.4 执行可行性本系统采用IE浏览界面,是大家熟悉的,对于用户只需要具有一般的计算机知识的人员都可以轻松上手。而且整个系统采用最友好的交互界面,简洁明了,不需要对数据库非常了解。因此,该系统的操作是可行的。
    2 系统需求分析2.1 目标和任务网上购物基于B/S模式, 通过对一些典型电子商务网站的考察、分析,并结合企业要求, 开发一套拥有前后台的信息化管理系统,需满足以下要求:

    统一友好的操作界面,保证系统的易用性
    商品分类详尽,可按不同类别查看商品信息
    为客户提供通过一个购物车模型就能够购买多个商品项的机制
    提供简单的安全模型,让客户必须先进行登录,才允许购买购物车的内容
    设计网站后台操作平台,管理网站的各项基本数据
    对不同的管理者设置不同的权限

    系统的主要任务有:

    处理对象:主要涉及的数据有:商品、顾客(会员)、顾客组、管理员(用户)、管理员组、订单、邮寄方式等
    处理功能要求:本系统完成商品、顾客(会员)、管理员(用户)、订单等之间的功能联系,形成一个有效的循环系统。具体包括以下几点:1,顾客注册为会员;2,管理员发布商品;3,订单管理;4,顾客组管理;5,管理员权限的管理等

    2.2 系统功能分析2.2.1 功能性需求概述在线购物系统是商家和购买者直接接触的桥梁,商家通过管理在线购物系统,向购买者发布、展示产品,而购买者也通过网站和商家交流、订购产品,从而达到现实交易的目的。
    在这个交易过程前,商家需要将产品信息录入,并且在前台显示出来,这其实就是一个信息发布系统,顾客在看到产品后,可能会有许多的问题,也就是需要针对产品留言,然后企业做出相应的回答,这个留言也属于信息发布的一部分。
    在交易过程中,顾客一般是不允许匿名购买的,顾客需要留下现实的个人信息才能收到现实中的产品,相信作为顾客,也很愿意方便线下联系。接着是在线模拟交易过程,顾客完成所有的选取后,就可以付账了,这里需要和支付网关连接。付账之后就是企业方通过后台的程序发现有新交易并进行线下处理。
    在交易完成后,企业方需要对近期销售情况进行统计,如会员资料的查询、修订等。
    通过对电子交易流程的划分,在线购物系统的系统功能主要由3部分组成:信息发布系统、会员管理系统和电子交易系统。电子商务的本质更趋向于电子交易,也就是前台和客户打交道的页面。
    通过细化系统功能,很明显电子交易部分是重点,电子交易页面需要完成哪些功能呢?
    逛在线购物系统和逛超市相似,进入超市时,顾客习惯拿购物筐或者购物车,再开始逛。逛超市时会不断查看想买的东西,直到确定买的那个产品的位置,在确定的过程中,会不断将其他物品放到购物车中,然后再将不适合的东西拿出,一直到结账。在选取物品时会发现,超市总是把相关的产品放在一个位置,以方便消费者,同时消费者也会拿出两个相同类型的东西进行比较。
    通过对超市购物的分析,了解了应该如何去模拟一个现实的交易过程。首先,需要一个产品的展示,方便顾客查询,还要有产品比较的数据,更有助于消费者比较,选择自己满意的产品;然后,要有一个购物车,方便顾客查看自己选中的产品,也可以把需要购买的产品放入购物车或者从购物车中拿出不需要的产品;最后是结账,和超市结账有很大区别,电子商务不允许匿名买卖。付账和收到产品之间有一个相对较长的时间,而且企业和顾客也不是面对面的,企业需要收集有效的信息,才能把产品送到顾客手中,所以结账时要确定用户是否登录,以收集用户的资料。
    通过以上分析可知,本系统分成两个模块:前台浏览模块和后台管理模块。
    前台浏览模块可再分为两个模块:产品浏览模块和购物模块,涉及产品首页浏览、推荐产品浏览、产品列表,以及查看产品详细内容、查看评论等功能。购物模块主要充当购物车作用,包括选取产品、对比产品、会员注册、登录及网上支付等功能。
    后台管理模块可分为3个模块:会员管理模块、产品管理模块和订单管理模块。后台管理模块主要涉及产品分类目录管理,以及产品内容的管理。会员管理模块主要是查看和修改,包括管理会员的基本资料以及购买的产品等详细信息。订单管理模块主要涉及对顾客订购的产品管理,按照订单的状态大致分为待处理的订单和已经处理的订单。

    2.2.2 系统流程分析在后台管理模块中,管理员需要先添加产品栏目分类,再进入产品列表页面,选择指定的产品栏目进行产品添加操作。在会员提交订单之后,管理员可以通过订单管理模块查看订单,并根据实际情况更改订单状态,管理员也可以通过会员管理模块查看会员信息。前台界面则是会员选取需要购买的商品,并提交订单。

    2.2.3 系统目录结构系统目录结构的规划非常重要,这样可以更加方便管理程序,体现出清晰的思路。通过对系统结构的分析,可以按照功能模块来划分系统目录结构。

    由图可以看出,系统文件保存在dzsw目录中,其下有13个子目录:admin目录主要保存后台管理的程序:data主要保存一些log信息,方便以后的查看:htmlarea目录保存文本编辑代码:includes目录保存公共模块中的代码,如MySQL连接之类的封装类等;install目录保存安装程序,方便把系统移植到其他的机器上,也方便初始化网站;js目录包括程序中需要使用的JavaScript程序;languages目录主要是为了界面的多国语言需要设计的,根据不同语言的需要调用不同的文件;modules目录保存连接支付网关的程序;myaccount目录保存关于本站的一些信息;styles目录保存网站的样式文件;templates目录保存模板文件;upload目录保存所有的上传文件,这个文件夹需要特别关照,在发布网站后,这个目录中的任何东西都是不能执行的,否则将产生隐患。
    2.3 数据库分析2.3.1 数据库需求分析数据库需求分析是所有数据库系统设计的最重要一步,在这个步骤里需要对系统的所有数据存储进行分析和整理,以便得出具有稳定性和扩展性的存储结构,这也是数据建模的过程。
    通过分析,不难得出主要有4个重要的实体对象,即产品分类存储表、产品内容存储表、订单存储表及会员存储表。 这4个表是在线购物系统的核心,所有的产品必须归属于某个类别,而这些产品分类的类别是不固定的,所以就需要一个分类存储表来存储产品的分类栏目。
    2.3.2 数据库概念结构设计根据以上对数据库的分析,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计打下基础。这些实体包含各种具体信息,通过相互之间的作用形成数据的流动。
    下面是在线购物系统的E-R模型图。

    2.4 系统开发环境2.4.1 硬件平台系统所需的硬件平台:PⅡ以上的CPU,512M以上内存,硬盘80G以上,windows xp操作系统。
    2.4.2 服务器平台
    WWW服务器:Apache
    数据库软件:MYSQL

    2.4.3 开发工具开发工具使用:phpStudyAdmin
    2.4.4 技术构架系统采用B/S技术架构。
    2.6 数据字典2.6.1 数据元素
    名字:会员名称描述:顾客用来登陆网站的唯一标识数据类型:字符长度:96
    名字:产品ID描述:用来表示产品的唯一标识数据类型:整型长度:10
    名字:订单ID描述:用来表示顾客订单的唯一标识数据类型:整型长度:8
    名字:管理员ID描述:用来表示管理员的唯一标识数据类型:整型长度:4
    名字:邮寄方式ID描述:用来表示邮递的唯一标识数据类型:整型长度:8
    名字:顾客组ID描述:用来表示打折顾客组的唯一标识数据类型:整型长度:6

    2.6.2 数据存储
    名字:顾客信息描述:注册为会员的个人信息组成:自动编号ID,用户名(Email),密码,组名,消费金额,注册日期。
    名字:顾客组信息描述:存储顾客的打折优惠组成:自动编号,名称,折扣。
    名字:产品信息描述:发布的产品的信息描述组成:自动编号ID,产品名称,产品单位,产品价格,产品描述。
    名字:订单信息描述:会员发出订单的信息组成:自动编号ID,用户联系方式,订单内容,邮寄方式。
    名字:管理员信息描述:系统管理的信息组成:管理员ID,管理员名称,管理员类别,管理员密码。
    名字:邮寄方式信息描述:送货方式信息组成:方式编号ID,名称,费用。

    3 系统概要设计3.1 系统结构设计系统结构设计是结构化系统分析与结构化程序设计之间的接口。结构化系统设计运用了一套标准的设计准则工具,采用模块化方法进行新系统层次关系和模块分解设计,结构化系统设计的核心是模块分解设计,其基本思想是以系统的逻辑功能设计和数据流关系为基础,根据数据流程图和数据字典,借助于一套标准的设计准则和图表工具,通过“自上而下”的逐层分解,把系统划分为多个大小适当、功能明确、具有一定独立性、并易于实现的模块,从而把复杂系统设计转化为多个简单模块的设计。
    3.1.1 系统体系结构目前,Web项目较为流行的开发模式是三层逻辑体系结构,本系统的开发按照Windows DNA (Windows Distributed Internet Application,分布式互联网应用结构),采用基于XML的三层B/S体系结构。Windows DNA提供了一种开发三层结构Web应用程序的通用方法是一个电子商务开发的良好环境。
    MVC的设计思想简介,MVC的设计思想将平台划分为表现层、业务层、数据访问层、数据库层。
    表现层(Presentation Tier)对应于MVC的V(View),负责系统的表示逻辑,主要是每个.php 页面。
    业务层(Business Tier)体现系统的业务逻辑。业务层起到了Business Delegate的作用,屏蔽了表示层,有利于重用业务模型。
    数据访问/集成层(Data Access/Integration Tier)负责进行数据访问及系统间交互操作。数据访问组件负责与关系型数据库打交道,进行具体的增删改查(CRUD)操作。系统集成代理/适配器组件负责与软件产品和外部系统打交道,交换数据和消息。数据访问/集成层组件意识不到业务层的具体逻辑,通过约定的接口让业务层来调用。
    MVC三层逻辑体系结构如图3-1所示。

    3.1.2 系统总体功能结构根据系统分析的结果数据流程图所描述的系统的逻辑模型,把数据流程图上各个处理模块进一步分解,确定系统的层次结构关系,把逻辑模型变为物理模型。
    在管理信息系统的设计过程中,系统划分的一般原则如下:

    子系统要具有独立性,即应把相对独立的事务处理过程作为一个子系统。这样的子系统具有较高的内聚性,与其它的藕合较弱,便于软件开发、使用及日后系统维护
    子系统的划分结果应使数据冗余度较小,应避免部分数据在多个子系统中出现,尤其是修改,以保证系统的安全性、可靠性和数据的一致性
    子系统的划分应能满足目前和日后管理上的需要,功能应齐全,操作要方便且为今后发展留有接口
    子系统的划分应以该单位的管理职能为依据,应尽量避免过分依赖于组织机构,以防止机构变更后为系统带来不必要的麻烦

    从公司的组织结构上出发,把整个管理信息系统划分成多个子系统。每个子系统的功能相对独立,但是子系统之间有必要的数据联系。
    对电子购物商城系统的数据流图采用变换中心法和事务中心法进行分析,对其逐步进行功能分解,直到分解成为含义明确、功能单一的单元功能模块,从而得到系统的功能模块结构图,即系统的功能图。如图3-2,反映了电子购物商城的系统功能模块的划分。

    1、前台模块详细功能描述其中,用户信息管理以及订单和购物车是禁止匿名用户访问的内容。

    商品信息模块:商品浏览(首页显示部分普通商品列表)、特价商品浏览(首页显示特价商品列表)、商品分类浏览、商品详细信息
    购物车模块:添加商品到购物车、购物车信息修改、结账
    用户信息管理模块:注册新用户、登录、用户修改密码、用户个人资料管理
    订单模块:查询个人订单列表、查询某笔订单的详细信息、取消订单

    2、后台模块详细功能描述
    管理员信息管理:管理员登录、添加新管理员、删除管理员、修改密码
    商品信息管理:添加新商品、修改商品信息、删除商品
    订单管理:管理订单是否确认、是否付款、是否发货、是否归档,并且对相应信息进行查询

    3.1.3 系统总体物理结构电子购物各个部门在不同的地点办公,网络拓扑结构以交换机为基础,各部门通过主交换机连接到公司主服务器,电子购物有不同办公地点。根据这个特点,系统利用微机局域网作为系统的基本物理结构。为了提高系统的可靠性和可扩展性,网络采用以网络集线器为基础,以双绞线为传输介质的星型结构。在每个业务发生点以及每个管理员分别配制微型计算机作为系统结点工作站,系统功能的实现,子系统间的数据共享与交互通过网络服务器完成。电子购物的系统网络拓扑图如图3.3所示。

    系统具体物理配置如下:
    利用公司已经架设好的企业局域网,主服务器采用:服务器、交换机、网络集线器,传输介质采用10M屏蔽双绞线为介质的星型网络拓扑结构,服务器作为系统功能实现和数据共享中心,应具有较好的性能和可靠性。在此基础上再配上一台提供web服务的服务器和一台MYSQL数据库服务器即可实现对本系统的全部物理支持。
    系统具体硬件配置如下:

    WWW服务器:INTER P4 2.4 512M DDR ROM 80GB 硬盘
    数据库服务器:INTER P4 2.4 512M DDR ROM 80GB 硬盘
    客户机:目前流行的PC兼容机
    网络连接设备:路由器、交换机、打印机、扫描仪等

    系统具体软件配置如下:

    操作系统:Microsoft公司Windown2000Server,网络协议采用TCP/IP协议
    WWW服务器:Apache
    数据库软件:MYSQL

    3.2 数据库结构设计3.2.1 数据库概念结构设计根据需求分析中的结果,数据库的关系模型设计如下:

    会员(顾客ID,顾客名称,顾客组,消费金额,注册日期,联系方式)
    产品(产品编号,产品名称,售价,数量,图片,备注)
    管理员(管理员编号,密码,管理员组)
    订单(编号,顾客名称,内容,备注)
    顾客组(ID,类别,名称,折扣)
    管理员组(ID,类别,名称,权限)
    邮寄方式(ID ,名称,费用计算)

    3.2.2 数据库逻辑设计经过需求分析,概念结构设计,了解了系统的存储结构需求后,可以得出8个表结构,即顾客组设置表、顾客表、产品评论表、产品列表、订单表和邮递方式表、管理员表、管理员组表。
    顾客组设置表是为了存储顾客的打折优惠,这里记录的事组的打折信息。表结构如表3-1所示。
    顾客组设置表(usergroups)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Groupid
    自动编号
    Smallint(6)





    2
    Classes
    类型
    Varchar(30)





    3
    Grouptitle
    组名称
    Varchar(30)





    4
    groupdiscount
    折扣
    float


    0



    顾客信息表主要是记录顾客的详细信息,其中groupid是指定顾客组的编号,用户的名称采用Email,记录用户的登录时间可以方便的查看最后的登录时间,这样有助于对客户的跟踪服务。表结构如表3-2所示。
    顾客信息表(customers)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Customers_id
    自动编号
    Smallint(6)





    2
    Email
    用户名称
    Varchar(30)





    3
    Grouid
    组名称
    Int(10)





    4
    Regdate
    注册时间
    Int(10)


    0


    5
    Lastvisit
    最后登录时间
    Int(10)


    0


    6
    Money
    消费总金额
    Decimal(15.2)


    0


    7
    QQ
    QQ联系方式
    Varchar(30)





    8
    msn
    msn联系方式
    Varchar(30)






    产品评论表主要是针对产品的评论信息,其中products_id就是产品的编号,date_add就是记录产品的添加时间,viewed是表示这条评论被浏览的次数。表结构如表3-3所示。
    产品分类表(classes)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    rid
    自动编号
    Mediumint(8)





    2
    Email
    用户名称
    Varchar(30)





    3
    Products_id
    产品 id
    Int(10)





    4
    review
    评论内容
    text


    0


    5
    Date_added
    添加时间
    Int(10)


    0


    6
    viewed
    被浏览次数
    Mediumint(8)


    0



    产品的信息列表记录的是产品的基础信息,包括产品的价格、重量、名称、所属分类、详细描述等字段。表结构如表3-4所示。
    产品表(products)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Products_id
    自动编号
    Mediumint(8)





    2
    Classes_id
    分类编号
    Mediumint(8)





    3
    name
    产品名称
    Varchar(64)





    4
    model
    产品单位
    Varchar(64)





    5
    image
    产品展示图片链接
    Varchar(64)





    6
    price
    产品价格
    Decimal(15.2)


    0


    7
    weight
    产品重量
    Decimal(5.2)


    0


    8
    description
    产品描述
    Text





    9
    manufacturer
    生产厂商
    Varchar(64)






    订单表主要记录的就是用户订单的详细信息,包括购买人、购买人的联系方式、产品的价格、邮寄方式等信息。由于每次用户可能会定购多种产品,所以订单将分成两个表来记录,一张用来记录联系信息,一张表用来记录联系信息和产品之间的关联。表结构如表3-5和表3-6所示。
    订单表联系信息(orders)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Order_id
    自动编号
    Mediumint(8)





    2
    D_name
    用户联系姓名
    Varchar(100)





    3
    cid
    会员id
    Int(10)





    4
    D_street_address
    会员地址
    Varchar(100)





    5
    D_tel_mobile
    会员联系方式
    Varchar(100)





    6
    Orders_status
    订单状态
    Varchar(100)





    7
    Shipping_method
    邮递方式
    Int(10)






    订单产品信息关联表(orders_products)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    opid
    自动编号
    Mediumint(8)





    2
    Orderd_id
    于orders表关联id
    Int(10)





    3
    Products_id
    产品关联id
    Int(10)





    4
    price
    产品价格
    Decimal(15.2)


    0


    5
    Final_price
    最终价格
    Decimal(15.2)


    0



    邮寄方式表主要是为计算邮寄费用产生的,不同的邮寄方式会带来不同的邮寄费用。表结构如表3-7所示。
    邮寄方式表(shipping)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    id
    自动编号
    Mediumint(8)





    2
    Shippingname
    费用名称
    varchar(200)





    3
    Fee
    费用计算公式
    Varchar(200)






    管理组设置表是为了存储管理员的不同管理权限。表结构如表3-8所示。
    管理组设置表(Admingroups)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    AdminGroupid
    自动编号
    Smallint(6)





    2
    Classes
    类型
    Varchar(30)





    3
    Grouptitle
    组名称
    Varchar(30)





    4
    Allow_class_see
    查看会员组
    float


    0


    5
    Allow_class_add
    添加会员组
    Int(10)


    0


    6
    Allow_class_delete
    删除会员组
    Int(10)


    0


    7
    Allow_product_see
    查看商品
    Int(10)


    0


    8
    Allow_product_edit
    编辑商品
    Int(10)


    0


    9
    Allow_product_add
    上传商品
    Int(10)


    0


    10
    Allow_product_delete
    删除商品
    Int(10)


    0



    管理员信息表主要是记录管理员的信息。表结构如表3-9所示。
    管理员信息表(customers)结构



    序 号
    字 段
    描 述
    类型和长度
    主 键
    可 空
    默认值




    1
    Admin_id
    自动编号
    Smallint(6)





    2
    name
    名称
    Varchar(30)





    3
    password
    密码
    Varchar(30)





    4
    admingroupsid
    管理组
    Varchar(30)





    5
    createdate
    创建时间
    Int(10)





    6
    lastvisit
    最后登录时间
    Int(10)






    4 系统详细设计4.1 系统设计在系统总体设计阶段已经提到过本系统采用MVC体系架构,但MVC架构具体是怎么实现的呢?下面我将介绍系统的具体实现功能。
    4.2 公共模块设计结构合理的系统都是经过改良的,将共同的东西取出来放置到相同的地方供引用和调用时设计系统必须要做的工作。
    4.2.1 数据库公共模块PHP中将创建数据库连接connection 独立出来做成公用的文件是最常用的做法,我将其命名为config.php,放置在include目录下。这个目录用来存储供整个系统公用的目录。当页面需要使用数据库连接时,只需要通过PHP的<? Require ‘include/db_mysql.php’;?>引用公用文件即可,这样不但避免了每个页面都编写数据连接,而且也能避免当数据连接发生变化时去修改每一个页面的麻烦。Db_mysql.php中使用了两种方式来获取与数据库连接:一种是获取已有的连接mysql_pconnect($dbuser,$dbpw),这样无须重复的建立连接,节约了资源:另外一种方式是mysql_connect($dbhost,$dbuser,$dbpw),这种方式是获取一个新的连接。在获取连接资源时,通常会传递3个参数,这里分别是$dbhost,$dbuser,$dbpw,代表的是带有端口号的主机地址,登录用户名和密码。
    Config.php中的定义代码如下所示:
    Define(‘DB_SERVER’,’localhost’);//数据库服务器Define(‘DB_SERVER_USERNAME’,’root’);//数据库用户名Define(‘DB_SERVER_PASSWORD’,’’);//数据库密码Define(‘DB_DATABASE’,’shoopdb’);//数据库名
    4.2.2 common.php和golbal.php单元Common.php是公共函数的文件,将公共函数独立出来可以大大节约编程时间及编程量,也为后期维护带来很大方便。
    Global文件是对全局变量的处理。
    4.3 产品模块设计4.3.1 产品类型设计产品一般有大类和小类之分,多级栏目使用树结构来展示。可以单击编辑和删除来修改。

    分类编辑修改分类名称和是否在页面显示。

    4.3.2 产品添加设计把产品作为一个类封装起来可方便对产品进行各种处理。Includes中的cla.products_p.php和cla.products.php文件就是对产品的封装。
    首先,添加产品的基本信息。

    添加完产品的基本信息后单击提交按钮,系统会向服务器端提交产品的基本信息,之后就会自动转向详细信息添加页面;如果添加产品基本信息不成功,将转向错误显示页面。
    完成提交后,程序会自动转向产品详细信息添加页面。该页面分为5个子页面。

    如添加错误可以修改。

    商品图片添加页面。

    4.3.3 产品信息查询查询页面可以通过商品名称、状态、基本信息、详细说明来查找产品信息。


    4.4 前台页面模块设计这里主要涉及产品的前台展示和购物车的编码制作等。
    4.4.1 首页设计作为在线购物系统,首要的任务是展示产品。除了展示产品,还可以加入其他元素来丰富页面。为了在有限的首页空间展示最吸引客户的信息,可把特价产品和新到产品的前5名展示在首页。

    在设置前台时,会把这些信息缓存起来,以方便再次调用此页面时不需要再次读取数据库,这样可以提高读取效率,也可以减轻服务器端的压力。Fun.common.php中的cacheexists($filename,$pam=‘’)函数就是用来验证是否在硬盘中有缓存,如果没有,将生成缓存文件。Cacheeesxists($filename,$pam=‘’)的实现代码如下所示:
    Function cacheexists($filename,$lpam=’’){ If($pam==’’){ $pam=$filename; } If(!file_exists(DIR_SHOOPD.”data/cache/cache_”.$filename.”.php”)){ Updataecache($pam); } Return DIR_SHOOPD.”data/cache/cache_”.$filename.”.php”;}
    4.4.2 产品详细信息用户在首页上看到感兴趣的产品后,对商品做进一步的了解。

    单击“您对此商品有话要说,您可以点击这里发表评论。”后就进入评论页面。可以看到URL http://127.0.0.1/dzsw/writerviems.php?products_id=23 ,这里是把商品的编号传递到评论页面,找到评论商品的ID。

    评论提交后,首先判断消费者是否已经登录,如果用户已经登录,需要把评论信息和会员昵称关联起来。需对Email进行验证,使用的是正则表达式。
    在添加评论之后返回商品展示页面,就可以看到针对商品的评论了。

    4.4.3 购物车设计购物车的实现流程:购物清单(购物车)->收货/送货人地址->选择送货方式->选择付款方式->确认并提交订单。
    购物车模块有两个链接,进入购物车和点击结账。“进入购物车”主要是显示已经放入购物车的详细信息,而“点击结账”的页面就是结账页面。

    4.4.4 结账处理单击购物车中的“结账”链接就可以进入结账页面。
    4.4.5 会员注册和登录页面设计注册会员需要填入会员的基本信息,这里的注册名是消费者的Email地址,用这个作为用户登录名的好处是可以强制性的让用户输入一个Email,而且Email地址是不会重复的。获取Email地址后,就可以通过这个Email地址给消费者发送订单处理等信息。在注册会员之后还需要让用户填入详细信息。

    将会员的详细信息和基本信息分开的好处是,用户在填入某信息出错时,只需要重复填入少量资料,避免了用户的麻烦。
    输入收货人地址后就是选择发送方式。

    在中国,一般提供了3种送货方式,即中国邮政的EMS、国内快递和普通快递。这3种方式的送货费用不同,计算方法为:产品的总重量*每公斤运送价格+其他固定费用。

    4.4.6 会员账户管理顾客在购买产品后,需要对自己的产品进行跟踪,需要知道自己购买产品的状态。

    4.5 订单管理模块设计订单分类,按照订单的状态分为:新订单、已审核订单、等待付款订单、部分付款订单、全部付款订单、已确认付款订单、取消订单等。

    4.6 会员管理模块设计会员管理模块是电子商务的最后一个模块。会员添加在前台已经完成,后台只需要一个浏览模块。

    还有一个会员组的选项,对于在线购物来说,打折时很有必要的,而打折方式是按照不同的会员组来设定的。

    5 系统测试5.1 系统测试5.1.1 测试的目的软件测试的目标和定义:

    测试是为了发现程序中的错误而执行程序的过程
    好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案
    成功的测试是发现了至今为止尚未发现的错误的测试

    在对本网络书店销售管理系统测试时,也正是基于上述观点来进行的,测试的目的不是证明系统是完美的,而是发现问题,更好的解决问题,使系统不断完善,满足客户的需求。
    5.1.2 测试的准则为了能设计出行之有效的测试方案,必须深入理解并正确运用指导软件测试的基本准则。下面列举主要的测试准则:

    所有的测试都应该追溯到用户需求应该在开始测试之前就制定出测试计划
    把Pareto原理应用到软件测试中。Pareto原理说明,测试发现的错误中80%很可能是由程序中的20%模块造成的
    应该从“小模块”测试开始,并逐步进行“大模块”测试
    穷举测试是不可能的
    为了达到最佳的测试效果,应该由独立的第三方从事测试工作

    5.1.3 测试的方法测试任何产品都有两种方法:如果已经知道了产品应该具有的功能,可以通过测试来检验是否每个功能正常使用;如果知道了产品的内部工作过程,可以通过测试来检测产品内部动作是否按照说明书的规定正常工作。前一种称为黒盒测试又称功能测试,后一种方法称为白盒测试又称结构测试。
    在测试本系统时,采用的是黑盒测试来设计测试用例,而且在测试过程中,由于条件原因,不能完全按照测试规则由第三方来测试,测试过程和方案设计由作者完成。
    5.2 单元测试实例5.2.1 测试一在管理员登陆时,用户名或密码有一项为空或者填写错误,系统是否出现预先设定的操作提示。

    预期效果:输入错误及时报错
    具体操作:用户名、密码、任意一项为空或者填写有误
    结果:都出现相应的错误原因的信息提示
    结论:要求管理员必须填写正确的用户名和密码,才能进入管理页面,测试成功

    5.2.2 测试二发布产品或修改本站的公告﹑返回前台,看其是否更新成功。

    预期效果:发布和修改过后能及时更新内容
    具体操作:通过管理页面发布产品功能发布产品,修改公告功能修改公告的内容,看其是否发布修改成功
    结果:显示发布的新产品,公告内容更新为修改后的信息
    结论:发布产品,修改公告功能正常,测试成功

    5.2.3 测试三顾客浏览商品放入购物车后结账,如不登录能否提交订单。

    预期效果:该用户不能提交订单
    具体操作:前台顾客不登录提交订单
    结果:该订单无法提交,转入登录页面
    结论:购物车功能完善,测试成功。

    5.2.4 测试四顾客注册为新会员,注册号重复,密码没有6位。

    预期效果:注册失败,提示错误
    具体操作:注册号重复,密码设为5位
    结果:提示注册号已存在,密码至少6位
    结论:顾客注册功能正常,测试成功。

    5.2.5 测试五发货失败,取消订单。

    预期效果:顾客账户页面订单取消,已付款退回
    具体操作:在后台订单管理页面取消一已付款订单
    结果:前台会员账户页面显示订单取消,余额增加
    结论:订单功能正常,测试成功

    5.3 综合测试在以上测试的基础上,对系统功能进行了整体测试,依次检验系统功能是否符合系统开发的目标。经过使用大量的数据多次进行系统测试,发现系统存在的问题并及时改进,最终实现了网上购物系统的开发目标。
    5.4 系统的维护主要包括四个方面
    程序的维护:修改部分或全部程序,这种维护往往是在条件发生变化或原系统的效率低的情况下进行的
    数据文件的维护:按照用户的要求对数据文件进行不定期的修改
    代码的维护:随着系统的发展和变化,可能会出现旧代码不能适应新要求的问题,因此,有必要变更代码,予以维护
    硬件的维护:对系统所使用的设备进行维护

    6 总结本文讲述了在线购物系统的系统分析和设计,介绍了后台的商品发布、订单管理、会员管理以及前台的购物管理。
    在线购物系统只是所有在线购物系统的雏形,后台的商品发布、订单管理、会员管理和前台的购物管理是所有在线购物共有的特征。根据本实例的最初设计思想,对方案如下改进意见:
    完善系统功能除了给用户浏览商品外,提供给用户一个接口,用户对产品提出自己的建议,比如设计方面,包装方面,企业可以在网上搞一些活动,比如意见征集,这样提高用户参与的积极性,同时企业可以从用户的意见以及反馈信息中,找到使企业可持续发展的途径。只要是服务性的行业最根本的还是要坚持以客户为中心的原则。
    完善业务流程根据实际情况,使业务流程规范化。做到充分利用企业的资源,市场的资源,人力资源。使工作业务流程能够更合理,更有序的进行。
    完善人员培训机制对员工进行定期的培训,让员工了解市场,了解企业发展状况,了解客户需求。对员工进行一定的理论方面的培训。加强信息观念,这样提高了员工的素质,更加有利于员工参与工作,并胜任工作。在全球都提倡信息化的今天,面对我国的实际情况,所有人都应当提高自己的信息素养,只有这样我们才能很好的和世界贸易接轨,我国的电子商务才能有较快的发展,我国的经济发展才会有保证。
    通过开发这个项目,巩固了以前所学的理论知识,提高了自己理论联系实际的能力,为今后进一步学习新技术打下一个很好的基础,为走上社会实际工作岗位做好了充足的准备,为今后的职业发展打下良好的基础。面对以后各项挑战,我有信心做得更好!
    当然,由于时间和技术上的原因,该系统还是存在一些问题和不足的地方,比如在数据容量方面,由于没有经过大量数据的测试,数据库能承受多大负荷还不能确定,在美工方面,由于缺少美工经验,所以很多页面看起来可能会不那么漂亮美观,在一些细小的处理上可能还缺少进一步的考虑。
    3 评论 41 下载 2019-10-11 12:22:08 下载需要15点积分
  • 基于JAVA EE框架的在线考试系统平台的设计与实现

    摘要在线考试系统以java作为开发语言,Struts2、Hibernate实现前后台数据管理,Spring实现业务逻辑管理,以MyEclipse作为开发工具,MySQL实现数据持久化,Tomcat部署整个系统,实现了院系管理、专业管理、班级管理、用户管理、课程管理、题库管理、考试管理、成绩管理八大功能。
    关键字:在线考试系统、J2EE、JSP、Struts2、Hibernate、Spring、MySQL、Tomcat
    AbstractOnline examinationsystem with Java as a development language, struts 2, Hibernate implementationQianHouTai data management, Spring management, implement the business logicwith MyEclipse as development tools, M and SQL for data persistence, Tomcatdeployment of the entire system, realized the departments management,professional management, class management, user management, course management,question bank management, examination management, grade management eightfunctions.
    Key words: online examinationsystem; J2EE;JSP;struts 2;Hibernate;Spring;MySQL;Tomcat
    第一章 绪论当今社会是一个信息社会,一个知识经济时代。自世界上第一台计算机ENINC(Electronicnumerical integrator and calculator)于1946年在美国问世到现在,计算机业飞速发展,技术淘汰指标高的惊人,价格下降以及软件应用的快速扩展引发了以信息处理计算机化为标志的“微机革命”,随之而来的是以全球信息网络普及和全球信息共享为标志的“全球信息网络革命”的蓬勃兴起[1]。可见,世界已进入在计算机信息管理领域中激烈竞争的时代,计算机已经变得普通的不能再普通的工具,如同我们离不开的自行车、汽车一样。我们应该承认,谁掌握的知识多,信息量大,信息处理速度快,批量大,谁的效率就高,谁就能在各种竞争中立于不败之地。
    随着网络技术的飞速发展,现在很多国内外的大学和其他部门都已经开设了远程教育,通过计算机网络实现了异地教育和培训。
    远程教育包括很多环节,例如:教学系统、答疑系统和考试系统等等,在我国远程教育正在逐步地发展起来,在教育教学过程中考试又是一个很重要环节,它对学生知识的增长、能力的发展、兴趣爱好、思想品德以及对学校的教育措施等许多问题是一个良好的反应,通过对考试成绩的分析有利于学校更好的指导和教育学生。但是目前学校与社会上的考试大都采用传统的考试方式,而传统的考试方式组织一次考试至少需要经过五个步骤,即人工出题、考生考试、人工阅卷、成绩评估和试卷分析[2]。其中人工出题由老师将题目用笔写在纸上或者由老师以电子文档的形式出题,然后在将试题打印在纸质试卷上;而考生考试也必须从其他地方赶到同一个地方参加考试,考试过程中要准备好考试所用的各种工具;考试结束后老师将试卷收上去然后根据标准答案进行手工阅卷;阅卷完后还需要手工统计学生的成绩等等。显然,随着考试类型的不断增加及考试要求的不断提高,教师的工作量将会变得越来越大,十分的繁琐,并且非常容易出错。因此传统的考试方式已经不能适应现代化考试的需求了,人们迫切需要新的技术来改善这一状况。
    目前,利用计算机网络技术来进行考试的主要是社会上的培训认证考试(如微软的各种认证考试)和远程教育的考试。一个成功的基于WEB的考试需要一个好的网络环境和一个号的考试平台以及一个好的题库。但一个真正智能化的基于WEB的考试系统的实现是一个复杂的过程,考试平台和题库的研究要依靠软件开发专家、被测科学专家和精通考试理论和命题的专家三者的合作。
    在线考试系统具有降低考试成本、解决繁重的考务工作的优点。它可以免去老师大量的临考工作,试卷可以根据题库中的内容即时生成;老师也无须在考生提交答卷后批阅考生所有的答案,还可以免去阅卷后对成绩的统计与分析等工作,计算机可以自动统计、排序和汇总成绩,实现无纸考试,大大提高工作效率。
    一个完善的在线考试系统可以使学生在网上学习过后及时检验自己的学习效果,以发现自己的不足,使得学习效率得到很大提高[3]。在线考试系统中题目的生成、试卷的提交、成绩的批阅等都可以由系统自动完成。只要形成一套成熟的题库就可以实现考试的自动化。这样老师所要做的只是精心设计题目、维护题库,而不是组织考试,从而大大减轻了教师的负担。
    第二章 可行性分析本章主要从经济可行性、技术可行性和操作可行性三个方面阐述了在线考试系统的开发可行性,其中经济可行性主要是从传统考试方式所消耗的成本与在线考试系统开发与应用所消耗的成本来对比经济可行性,技术可行性主要是介绍系统开发所用到的技术,操作可行性则是介绍用户使用系统的能快速上手操作整个系统。
    2.1 经济可行性传统考试采用的是纯人工方式的出卷、阅卷、成绩统计,考生考试时也需要提前从各地集中在一个地点进行统一考试,因此,从经济角度分析,出卷时印刷所消耗的成本、考生赶往考试地点所消耗的交通费用、老师组织一次考试时消耗的工时等等都是比较大的。同样,在考生考试过后,老师阅卷也是采用纯人工的方式来完成,阅卷完成之后还需要制作报表、对数据进行综合分析等,这消耗的工时也是较多的,且效率低下。
    而利用计算机网络来组织考生在有网络的地方进行在线考试,不但可以为学校或者企业节省大量的人力物力,而且效率要比手工传统的考试方式高的多,还可以让人力资源得到充分的利用,由此可见,开发在线考试系统在经济上是完全可行的。
    2.2 技术可行性在线考试系统开发所利用的技术主要包括JSP、JAVASCRIPT、J2EE、STRUTS2、HIBERNATE、SPRING,以MySQL数据库实现数据的持久化,Tomcat部署整个系统的运行。
    其中JSP技术主要是有Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准[4],而J2EE是Sun Microsystems针对Java开发人员的产品(JDK)的一个企业版[5],JSP与J2EE都可夸平台操作。STRUTS是一个使用MVC架构的框架,将设计模式中的模型、视图、控制器三者实现代码分离,从而使同一个应用程序可以使用不同的表现形式[6]。HIBERNATE是一个ORM(对象关系映射)框架,它对JDBC进行了轻量级的封装,通过使用HIBERNATE框架,开发人员能够以面向对象的思维方式来操作数据库[7]。SPRING是一个以IoC和AOP为核心的轻量级容器框架,它提供了一系列的JAVA EE开发解决方案[8]。MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库[9]。Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选[10]。
    以上所提及到的技术都是开源或者免费的技术,同时也具有跨平台使用的效果,开发使用起来简单方便,所以在线考试系统的开发在技术上是可行的。
    2.3 操作可行性在线考试系统开发是所使用到的技术都是可跨平台的,所以我们首选的操作系统是windows操作系统。作为21世纪的学生,人人都会使用电脑、人人都能在windows环境下进行网页浏览操作。
    在线考试系统的业务逻辑简单,在懂的操作windows系统的前提下只要对用户进行简单的培训用户就能独立完成在线考试系统的各个功能使用,所以在线考试系统在操作上也是完全可行的。
    第三章 需求分析本章主要讲述的是系统的功能需求,同时也包含了系统的运行环境需求、性能需求和系统的E-R图。其中系统的功能需求是通过本人对考试各个环节的理解以及在网上收集资料等各种方法所获取的,运行环境需求是对运行本系统的一个最低PC配置,E-R图是对系统的各实体之间的关系的一个解说[11]。
    3.1 功能需求本系统主要包括登录功能、院系管理功能、专业管理功能、班级管理功能、用户管理功能、课程管理功能、题库管理功能、考试管理功能和成绩管理功能。登录功能是用于用户登录系统,院系管理功能是用于管理员管理院系信息,专业管理功能是用于管理员管理专业信息,班级功能是用于管理员管理班级信息,用户管理功能是用于管理员管理系统用户,课程管理功能是用于管理员管理课程信息,题库管理功能是用于教师管理题库信息,考试管理功能是用于管理员生成试卷、学生在线考试与教师阅卷,成绩管理功能是用于学生查询本人成绩和教师统计学生成绩。
    3.3.1 登录功能该功能是针对所有的用户必需的功能,用户在登录页面输入用户名和密码,选择相应的角色进行登录,其中学生的用户名为学号,老师与管理员的用户名为教师编号,登录成功后进去在线考试系统,失败则返回登录页面重新登录。
    操作流程如图3.1所示。

    3.3.2 院系管理功能该功能仅对管理员可见,管理员登录系统后可对院系的基本信息进行增删改查操作,其中修改和删除两项操作需要先将院系信息查询出来才可进行。点击添加院系信息时进入填写院系信息页面填写院系信息,提交后保存结束,点击查看院系信息直接将所有院系信息列出来显示在页面,在每条院系信息后面有编辑与删除按钮,点编辑按钮编辑所选院系,并在编辑页面显示所选院系的所有信息,修改提交后保存并结束,点删除按钮直接删除所选院系信息并结束。
    操作流程如图3.2所示。

    3.3.3 专业管理该功能仅对管理员可见,管理员登录系统后可对专业的基本信息进行增删改查操作,其中修改和删除两项操作需要先将院系信息查询出来才可进行。点击添加专业信息时进入填写专业信息页面填写专业信息,提交后保存结束,点击查看专业信息进入选择要查看的院系的页面,选择院系后点查看直接将所选院系的所有专业信息列出来显示在页面,在每条专业信息后面有编辑与删除按钮,点编辑按钮编辑所选专业,并在编辑页面显示所选专业的所有信息,修改提交后保存并结束,点删除按钮直接删除所选专业信息并结束。
    操作流程如图3.3所示。

    3.3.4 班级管理该功能仅对管理员可见,管理员登录系统后可对班级的基本信息进行增删改查操作,其中修改和删除两项操作需要先将班级信息查询出来才可进行。点击添加班级信息时进入填写班级信息页面填写班级信息,提交后保存结束,点击查看班级信息进入填写查询条件页面填写查询条件,填写完查询条件后点查看直接将所填条件下的所有班级信息列出来显示在页面,在每条班级信息后面有编辑与删除按钮,点编辑按钮编辑所选班级,并在编辑页面显示所选班级的所有信息,修改提交后保存并结束,点删除按钮直接删除所选班级信息并结束。
    操作流程如图3.4所示。

    3.3.5 用户管理该功能仅对管理员可见,管理员登录系统后可对用户的基本信息进行增删改查操作,其中用户包括学生与老师两种类别,老师也包括管理员,修改和删除两项操作需要先将用户信息查询出来才可进行。点击添加老师信息时进入填写老师信息页面填写老师信息,提交后保存结束,点击查看老师信息进入填写查询条件页面填写查询条件,填写完查询条件后点查看直接将所填条件下的所有老师信息列出来显示在页面,在每条老师信息后面有编辑与删除按钮,点编辑按钮编辑所选老师,并在编辑页面显示所选老师的所有信息,修改提交后保存并结束,点删除按钮直接删除所选老师信息并结束。对学生信息的管理与老师类似。
    操作流程如图3.5所示。

    3.3.6 课程管理该功能仅对管理员可见,管理员登录系统后可对课程的基本信息进行增删改查操作,其中修改和删除两项操作需要先将课程信息查询出来才可进行。点击添加课程信息时进入填写课程信息页面填写课程信息,提交后保存结束,点击查看课程信息直接将所有课程信息列出来显示在页面,在每条课程信息后面有编辑与删除按钮,点编辑按钮编辑所选课程,并在编辑页面显示所选课程的所有信息,修改提交后保存并结束,点删除按钮直接删除所选课程信息并结束。
    操作流程如图3.6所示。

    3.3.7 题库管理该功能对管理员与老师都可见,管理员或者老师登录系统后可对题库的基本信息进行增删改查操作,题库中的题型分为选择题、判断题、填空题、简答题四种。其中修改和删除两项操作需要先将题库信息查询出来才可进行。点击添选择题信息时进入填写选择题信息页面填写题目信息,提交后保存结束,点击查看选择题信息后进入查询条件填写页面,填写完查询条件后点查询后将列出所填查询条件下的所有选择题信息,在每条选择题信息后有编辑与删除按钮,点击编辑按钮编辑所选选择题,并在编辑页面显示所选选择题的所有信息,修改提交保存并结束,点删除按钮直接删除所选选择题信息并结束;类似选择题管理,点击添判断题信息时进入填写判断题信息页面填写题目信息,提交后保存结束,点击查看判断题信息后进入查询条件填写页面,填写完查询条件后点查询后将列出所填查询条件下的所有选择题信息,在每条判断题信息后有编辑与删除按钮,点击编辑按钮编辑所选判断题,并在编辑页面显示所选判断题的所有信息,修改提交保存并结束,点删除按钮直接删除所选判断题信息并结束;填空题与简答题的管理类似。
    选择题操作流程如图3.7所示,判断题操作流程如图3.8所示,填空题操作流程如图3.9所示,简答题操作流程如图3.10所示。

    3.3.8 考试管理该功能分为生成试卷、在线考试、老师阅卷三个功能,生成试卷仅对管理员可见,在线考试仅对学生可见、老师阅卷仅对老师可见。其中生生试卷功能是管理员登录系统后点考试管理,然后再点生成试卷进入生成试卷条件填写页面,在试卷条件填写页面填写生成试卷的条件后提交自动随机生成试卷并结束;在线考试功能在学生登录系统后点考试管理,然后再点在线考试进入试卷选择页面,选择要考试的试卷开始考试,考试完毕提交试卷结束。老师阅卷功能在老师登录系统后选择考试管理,点击老师阅卷进入学生答卷选择页面,选择学生考试试卷开始阅卷,阅卷完后提交结束。
    生成试卷的操作流程如图3.11所示,在线考试的操作流程如图3.12所示,老师阅卷的操作流程如图3.13所示。



    生成试卷
    在线考试
    老师阅卷










    3.3.9 成绩管理该功能主要包括成绩统计与成绩查询两个功能,其中成绩统计仅对老师可见,老师登录系统后选择成绩管理,然后点击成绩统计进入统计条件填写页面填写统计条件,点统计后将显示统计结果,点关闭结束。查看成绩仅对学生可见,学生登录系统后选择成绩管理,点击查询成绩将显示该学生所有考试科目的成绩,点关闭结束。
    成绩统计操作流程如图3.14所示,查看成绩操作流程如图3.15所示。



    成绩统计
    查询成绩









    3.2 运行环境需求为了保证系统运行的流畅性,我们对硬件有一定的需求,硬件配置不得低于32GB的硬盘容量、1GB的运行内存、1.8GHz的CUP处理速度。同样为了保证系统操作的简单性,我们要求该系统在windows操作系统下运行,浏览器的版本火狐浏览器,同时也要求各客户PC机与服务器所在PC机保存通信状态。
    3.2 性能需求由于在线考试系统最主要的功能是用于在线考试,而每场考试都是设定时间的,所对系统的性能有一定的需求,系统每个操作处理时间不能大于10S,正常处理时间必须低于5S。
    第四章 概要设计本章主要介绍在线考试系统的八个功能模块的总体设计以及数据库的设计。其中院系管理模块、专业管理模块、班级管理模块、用户管理模块、课程管理模块和题库管理模块都具有增删改查功能,而考试管理模块具有生成试卷、在线考试、老师阅卷三个功能,成绩管理模块具有成绩统计和查询成绩两个功能。
    4.1 功能模块设计该在线考试系统主要包括院系管理模块、专业管理模块、班级管理模块、用户管理模块、课程管理模块、题库管理模块、考试管理模块和成绩管理八大模块,如图4-1所示。

    4.1.1 院系信息管理模块该模块主要包括添加院系信息、查询院系信息、修改院系信息、删除院系信息四个功能模块,如图4.2所示。

    4.1.2 专业信息管理该模块主要包括添加专业信息、查询专业信息、修改专业信息、删除专业信息四个功能模块,如图4.3所示。

    4.1.3 班级信息管理]该模块主要包括添加班级信息、查询班级信息、修改班级信息、删除班级信息四个功能模块,如图4.4所示。

    4.1.4 用户信息管理该模块主要包括添加老师信息、查询老师信息、修改老师信息、删除老师信息以及添加学生信息、查询学生信息、修改学生信息、删除学生信息八个功能模块,如图4.5所示。

    4.1.5 课程管理该模块主要包括添加课程信息、查询课程信息、修改课程信息、删除课程信息四个功能模块,如图4.6所示。

    4.1.6 题库管理该模块主要包括添加选择题、查看选择题、修改选择题、删除选择题、添加判断题、查看判断题、修改判断题、删除判断题、添加填空题、查看填空题、修改填空题、删除填空题、添加简答题、查看简答题、修改简答题、删除简答题十六个功能模块,如图4.7所示。

    4.1.7 考试管理该模块主要包括添加生成试卷、在线考试、老师阅卷三个功能模块,如图4.8所示。

    4.1.8 成绩查询该模块主要包括成绩统计和查询成绩两个功能模块,如图4.9所示。

    4.2 E-R图 E-R(实体 - 关系)图是用来描述实体之间的关系的[12],一个专业属于一个院系,一个班级属于一个专业,一个学生属于一个班级,学生与老师都拥有权限,一个老师管理多个班级,学生与试卷的选择题、判断题、填空题、简答题存在考试关系,试卷的选择题、判断题、填空题与简答题分别是从题库的选择题、判断题、填空题和简答题表中抽取出来的,题库中的每一道选择题、判断题、填空题、简答题又隶属于一门课程,总体E-R图如图4.10、图4.11所示,实体E-R图如图4.12至图4.26所示。

    实体图见图4.12至图4.26。



    院系实体
    专业实体








    班级实体
    权限实体







    学生实体

    教师实体

    课程实体




    试卷选择题实体
    试卷选择题实体








    试卷填空题实体
    试卷简答题实体






    题库判断题实体
    题库填空题实体






    题库简答题实体
    题库选择题实体







    4.3 数据库设计该在线考试系统以院系、专业、班级、学生、老师、权限、课程、题库选择题、题库判断题、题库填空题、题库简答题、试卷选择题、试卷判断题、试卷填空题、试卷简答题15个实体作为数据库的表,表的设计如下。
    4.2.1 院系表院系表包含id、name、date、des四个字段,id为主键,没有实际意义,name用来存储院系名称,date用来存储院系创办日期,des是用来对存储院系做一个简单的描述。表的设计如表4.1所示。



    字段名
    字段类型
    字段长短
    字段描述




    id
    int
    8
    主键


    name
    varchar
    50
    名称


    date
    date

    创办日期


    des
    text

    描述



    4.2.2 专业表专业表包含id、name、deptId、date、des五个字段,id为主键,没有实际意义,name存储专业名称,deptId存储院系id,用来唯一标识专业属于哪个院系,date存储专业开始日期,des用来对存储的专业做一个简短的描述,如表4.2所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    name
    varchar
    50
    名称


    deptId
    int
    8
    所属院系


    date
    date

    创办日期


    des
    text

    描述



    4.2.3 班级表班级表包含id、name、majorId、teacherId、des五个字段,id为主键,没有实际意义,name存储班级名称,majorId存储专业id,用来唯一标识班级属于哪个专业,teacherId存储教师id,用来唯一标识负责老师,des是用来对存储班级做一个简短的描述,如表4.3所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    name
    varchar
    50
    名称


    majorId
    int
    8
    所属专业


    teacherId
    int
    8
    班主任


    des
    text

    描述



    4.2.4 学生表学生表包含id、sno、name、birthday、nation、tel、email、address、classId、powerId、password、des十二个字段,id为主键,没有实际意义,sno存储学生学号,name存储学生姓名,birthday存储学生出生日期,nation标识学生属于哪个民族,tel存储学生电话号码,email存储学生邮箱,address存储学生住址,classId存储班级id,用来唯一标识学生属于哪个班级,powerId存储学生权限id,用来唯一标识学生的权限,password存储学生登录系统的密码,des是用来对存储的学生做一个简短的描述,如表4.4所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    sno
    varchar
    11
    学号


    name
    varchar
    50
    姓名


    birthday
    date

    出生日期


    nation
    varchar
    50
    民族


    tel
    varchar
    20
    电话


    email
    varchar
    20
    邮箱


    address
    varchar
    200
    地址


    classId
    int
    8
    所属班级


    powerId
    int
    2
    权限


    password
    varchar
    20
    密码


    des
    text

    描述



    4.2.5 教师表教师表包含id、name、birthday、nation、tel、email、address、position、powerId、password、des十一个字段,id是主键,没有实际意义,tno存储教师的教师编号,name存储教师名称,birthday存储教师的出生日期,nation用来标注教师属于哪个民族,tel存储教师的电话号码,email存储教师的邮箱,address存储教师的住址,position存储教师的职位,powerId存储权限id,用来唯一标识教师的权限,password存储教师登录系统的密码,des是用来对教师做一个简短的描述,如表4.5所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    tno
    varchar
    11
    教师编号


    name
    varchar
    50
    姓名


    birthday
    date

    出生日期


    nation
    varchar
    50
    民族


    tel
    varchar
    20
    电话


    email
    varchar
    20
    邮箱


    address
    varchar
    200
    地址


    position
    varchar
    50
    职位


    powerId
    int
    2
    权限


    password
    varchar
    20
    密码


    des
    text

    描述



    4.2.6 权限表权限表包含id、power、des三个字段,id为主键,没有实际意义,power存储用户权限,des是对用户权限做一个简短的描述,如表4.6所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    2
    主键


    power
    varchar
    50
    权限


    des
    text

    描述



    4.2.7 课程表课程表包含id、cname、des三个字段,id为主键,没有实际意义,cname存储课程名称,des是用来对存储的课程做一个简短的描述,如表4.7所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    cname
    varchar
    50
    课程名称


    des
    text

    描述



    4.2.8 题库选择题表题库选择题表包含id、question、answer、teachername、courseid五个字段,id为主键,没有实际意义,question存储选择题题目,answer存储选择题答案,teachername存储出题老师姓名,courseid存储课程id,用来唯一标识选择题属于哪门课程,如表4.8所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    question
    text

    题目


    answer
    char
    1
    标准答案


    teachername
    varchar
    50
    出题老师


    courseid
    int
    8
    课程



    4.2.9 题库判断题表题库判断题表包含id、question、answer、teachername、courseid五个字段,id为主键,没有实际意义,question存储判断题题目,answer存储判断题答案,teachername存储出题老师姓名,courseid存储课程id,用来唯一标识判断题属于哪门课程,如表4.9所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    question
    text

    题目


    answer
    int
    1
    标准答案


    teachername
    varchar
    50
    出题老师


    courseid
    int
    8
    课程



    4.2.10 题库填空题表题库填空题表包含id、question、answer、teachername、courseid五个字段,id为主键,没有实际意义,question存储填空题题目,answer存储填空题答案,teachername存储出题老师姓名,courseid存储课程id,用来唯一标识填空题属于哪门课程,如表4.10所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    question
    text

    题目


    answer
    text

    标准答案


    teachername
    varchar
    50
    出题老师


    courseid
    int
    8
    课程



    4.2.11 题库简答题表题库简答题表包含id、question、answer、teachername、courseid五个字段,id为主键,没有实际意义,question存储简答题题目,answer存储简答题答案,teachername存储出题老师姓名,courseid存储课程id,用来唯一标识简答题属于哪门课程,如表4.11所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    question
    text

    题目


    answer
    text

    标准答案


    teachername
    varchar
    50
    出题老师


    courseid
    int
    8
    课程



    4.2.12 试卷选择题表试卷选择题表包含id、papername、question、modelanswer、teachername、studentid、courseid、studentanswer、score九个字段,id为主键,没有实际意义,papername为试卷名称,用来标识试卷选择题属于哪份试卷,question存储试卷选择题题目,modelanswer存储试卷选择题题目的标准答案,teachername存储阅卷老师名字,studentid存储学生id,用来唯一标识存储的题目由哪个学生作答,courseid存储课程id,用来唯一标识题目属于哪门课程,studentanswer存储学生答题后的答案,score存储试卷选择题的分值,如表4.12所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    papername
    varchar
    200
    试卷名称


    question
    text

    题目


    modelanswer
    int
    1
    标准答案


    teachername
    varchar
    50
    阅卷老师


    studentid
    int
    11
    答题学生


    courseid
    int
    8
    课程


    studentanswer
    int
    1
    学生答案


    score
    int
    2
    分值



    4.2.13 试卷判断题表试卷判断题表包含id、papername、question、modelanswer、teachername、studentid、courseid、studentanswer、score九个字段,id为主键,没有实际意义,papername为试卷名称,用来标识试卷判断题属于哪份试卷,question存储试卷判断题题目,modelanswer存储试卷判断题题目的标准答案,teachername存储阅卷老师名字,studentid存储学生id,用来唯一标识存储的题目由哪个学生作答,courseid存储课程id,用来唯一标识题目属于哪门课程,studentanswer存储学生答题后的答案,score存储试卷判断题的分值,如表4.13所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    papername
    varchar
    200
    试卷名称


    question
    text

    题目


    modelanswer
    int
    1
    标准答案


    teachername
    varchar
    50
    阅卷老师


    studentid
    int
    11
    答题学生


    courseid
    int
    8
    课程


    studentanswer
    int
    1
    学生答案


    score
    int
    2
    分值



    4.2.14 试卷填空题表试卷填空题表包含id、papername、question、modelanswer、teachername、studentid、courseid、studentanswer、score九个字段,id为主键,没有实际意义,papername为试卷名称,用来标识试卷填空题属于哪份试卷,question存储试卷填空题题目,modelanswer存储试卷填空题题目的标准答案,teachername存储阅卷老师名字,studentid存储学生id,用来唯一标识存储的题目由哪个学生作答,courseid存储课程id,用来唯一标识题目属于哪门课程,studentanswer存储学生答题后的答案,score存储试卷填空题的分值,如表4.14所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    papername
    varchar
    200
    试卷名称


    question
    text

    题目


    modelanswer
    text

    标准答案


    teachername
    varchar
    50
    阅卷老师


    studentid
    int
    11
    答题学生


    courseid
    int
    8
    课程


    studentanswer
    text

    学生答案


    score
    int
    2
    分值



    4.2.15 试卷简答表试卷简答题表包含id、papername、question、modelanswer、teachername、studentid、courseid、studentanswer、score九个字段,id为主键,没有实际意义,papername为试卷名称,用来标识试卷简答题属于哪份试卷,question存储试卷简答题题目,modelanswer存储试卷简答题题目的标准答案,teachername存储阅卷老师名字,studentid存储学生id,用来唯一标识存储的题目由哪个学生作答,courseid存储课程id,用来唯一标识题目属于哪门课程,studentanswer存储学生答题后的答案,score存储试卷简答题的分值,如表4.12所示。



    字段名
    字段类型
    字段长度
    字段描述




    id
    int
    8
    主键


    papername
    varchar
    200
    试卷名称


    question
    text

    题目


    modelanswer
    text

    标准答案


    teachername
    varchar
    50
    阅卷老师


    studentid
    int
    11
    答题学生


    courseid
    int
    8
    课程


    studentanswer
    text

    学生答案


    score
    int
    2
    分值



    4.4 创建工程在MyEclipse中新建一个Web工程,工程命名为“online_examination_system”,并设置其为J2EE应用,工程的目录结构如图4.27所示。

    在线考试系统主要包括action、bean、dao、dao.impl、service、service.impl、util七个包(注:本文提及的类包一律省略类包前的com.online_examination_system),其中action类包主要是存放action类,用于实现前后台数据交换;bean包存放实体类,用于实现系统与数据库关联;dao包存放dao接口,用于存放系统与数据库进行数据交互的接口;dao.impl包存放dao的实现类,用于实现dao类对数据库的访问;service包存放逻辑控制接口,用于控制系统业务逻辑;service.impl存放service接口的实现类,用于实现service对系统的业务逻辑控制;util包存放工具类,用于实现类型转换。
    第五章 详细设计本章主要讲述了在线考试系统的各个功能页面的详细设计,每个功能的设计包括对该页面的一个简短介绍、运行效果图与核心代码,页面的文字介绍主要是从用户角度描述每个功能界面的操作方式,运行效果图是用户正确操作后该系统的显示效果,核心代码是实现每个功能界面的的关键代码。
    5.1 登录用户在浏览器上输入“http://localhost:8080/online_examination_system/”进入登录页面,在登录页面输入用户名、密码、选择相应的角色登录系统,登录页面如图5.1所示。

    核心代码如下:
    HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); List<StudentBean> listStudentBean = new ArrayList<StudentBean>(); List<TeacherBean> listTeacherBean = new ArrayList<TeacherBean>(); StudentBean studentBean = null; TeacherBean teacherBean = null; String hql = ""; if(this.userClass.equals("student")){ hql = hql + "from StudentBean studentBean where studentBean.sno='" + this.username + "'" + " and studentBean.password='" + this.password + "'"; try { listStudentBean = this.studentService.findStudentByHql(hql); } catch (Exception e) { // TODO: handle exception return ERROR; } if(listStudentBean.size() == 0){ return ERROR; } studentBean = listStudentBean.get(0); session.setAttribute("user", studentBean); } else { hql = hql + "from TeacherBean teacherBean where teacherBean.tno='" + this.username + "'" + " and teacherBean.password='" + this.password + "'"; try { listTeacherBean = this.teacherService.findTeacherByHql(hql); } catch (Exception e) { // TODO: handle exception return ERROR; } if(listTeacherBean.size() == 0){ return ERROR; } teacherBean = listTeacherBean.get(0); session.setAttribute("user", teacherBean); }
    5.2 院系管理院系管理包含院系添加、院系查看、院系更新、院系删除四个功能,其中院系添加和院系查看直接在院系管理模块下就能操作,院系更新与院系删除需要在查询出院系信息后才能进行操作。
    5.2.1 院系添加管理员登录系统后选择院系管理,点添加院系信息进入院系添加页面,在该页面输入院系名称、创办日期与对添加的院系的描述,点添加按钮添加院系,院系添加页面如图5.2所示。

    核心代码如下:
    public String addDept() { try{ this.deptBean.setSetdate(DateUtils.strToDate(setDate)); this.deptService.addDept(this.deptBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.2.2 院系查看管理员登录系统后选择院系管理,点查看院系信息进入查看院系页面,该页面讲显示所有院系信息,院系查看页面如图5.3所示。

    核心代码如下:
    public String listDept() { try{ HttpServletRequest req = ServletActionContext.getRequest(); this.listDept = deptService.findAllDept(); req.setAttribute("listDept", this.listDept); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.2.3 院系更新管理员在查看院系信息页面点击要更新的院系信息后的更新,进入更新院系信息页面,在该页面将显示原院系信息,可以在原来院系信息的基础上修改所要更新的院系信息,院系更新页面如图5.4所示。

    核心代码如下:
    public String updateDept() { try{ this.deptBean.setSetdate(DateUtils.strToDate(setDate)); this.deptService.updateDept(this.deptBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.2.4 院系删除管理员在查看院系信息页面点击要删除的院系信息后的删除直接删除该条院系信息,删除院系信息页面如图5.5所示。

    核心代码如下:
    public String deleteDept(){ try{ HttpServletRequest req = ServletActionContext.getRequest(); int id = Integer.parseInt(req.getParameter("id")); this.deptBean = deptService.findDeptById(id); deptService.deleteDept(this.deptBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.3 专业信息管理专业管理包含专业添加、专业查看、专业更新、专业删除四个功能,其中专业添加和专业查看直接在专业管理模块下就能操作,专业更新与专业删除需要在查询出专业信息后才能进行操作。
    5.3.1 专业添加管理员登录系统后选择专业管理,点添加专业信息进入专业添加页面,在该页面输入专业名称、创办日期、所属院系与对添加的专业的描述,点添加按钮添加专业,专业添加页面如图5.6所示。

    核心代码如下:
    public String addMajor(){ try { this.majorService.addMajor(this.majorBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.3.2 专业查看管理员登录系统后选择专业管理,点查看专业信息进入属院系选择页面,院系选择页面如图5.7所示,在该页面上选择要查看的院系,点查看将显示所选院系下所有专业,专业查看页面如图5.8所示。

    核心代码如下:
    public String listMajor(){ try{ ActionContext ctx = ActionContext.getContext(); if(this.deptId == 0){ this.listMajor = this.majorService.findAllMajor(); } else { this.listMajor = this.majorService.findConditionMajor(this.deptId); } ctx.put("listMajor", this.listMajor); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.3.3 专业更新管理员在查看专业信息页面点击要更新的专业信息后的更新,进入更新专业信息页面,在该页面将显示原专业信息,可以在原来专业信息的基础上修改所要更新的专业信息,专业更新页面如图5.9所示。

    核心代码如下:
    public String updateMajor(){ try{ this.majorService.updateMajor(majorBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.3.4 专业删除管理员在查看专业信息页面点击要删除的专业信息后的删除直接删除该条专业信息,删除专业信息页面如图5.10所示。

    核心代码如下:
    public String deleteMajorById(){ try{ this.majorBean = this.majorService.findMajorById(this.majorId); this.majorService.deleteMajor(this.majorBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.4 班级信息管理班级管理包含班级添加、班级查看、班级更新、班级删除四个功能,其中班级添加和班级查看直接在班级管理模块下就能操作,班级更新与班级删除需要在查询出班级信息后才能进行操作。
    5.4.1 班级添加管理员登录系统后选择班级管理,点添加班级信息进入班级添加页面,在该页面输入班级名称、创办日期与对添加的班级的描述,点添加按钮添加班级,班级添加页面如图5.11所示。

    核心代码如下:
    public String addPoliticsClass(){ try{ this.politicsClassService.addPoliticsClassBean(this.politicsClassBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.4.2 班级查看管理员登录系统后选择班级管理,点查看班级信息进入班级查看限定条件页面,查看班级限定条件填写页面如图5.12所示,在该页面上填写要查看的班级名称、选择所属专业、负责老师等信息,点查看将显示限定条件下的所有班级,班级查看页面如图5.13所示。

    核心代码如下:
    public String searchPoliticsClass(){ try{ this.listMajorBean = this.majorService.findAllMajor(); this.listTeacherBean = this.teacherService.findAllTeacher(); this.listPoliticsClassBean = this.politicsClassService .searchPoliticsClass(this.politicsClassBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.4.3 班级更新管理员在查看班级信息页面点击要更新的班级信息后的更新,进入更新班级信息页面,在该页面将显示原班级信息,可以在原来班级信息的基础上修改所要更新的班级信息,班级更新页面如图5.14所示。

    核心代码如下:
    public String updatePoliticsClass(){ try { this.politicsClassService .updatePoliticsClass(this.politicsClassBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.4.4 班级删除管理员在查看专业信息页面点击要删除的专业信息后的删除直接删除该条专业信息,班级删除页面如图5.15所示。

    核心代码如下:
    public String deletePoliticsClass(){ try { this.politicsClassBean = this.politicsClassService .findPoliticsClassById(this.politicsClassBean.getId()); this.politicsClassService .deletePoliticsClass(this.politicsClassBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.5 用户信息管理用户管理包含教师添加、教师查看、教师更新、教师删除、学生添加、学生查看、学生更新、学生删除八个功能,其中教师添加、学生添加、教师查看和学生查看四个功能直接在用户管理模块下就能操作,教师更新与教师删除需要在查询出教师信息后才能进行操作,学生更新与学生删除需要在查询出学生信息后才能进行操作。
    5.5.1 教师添加管理员登录系统后选择用户管理,点添加教师信息进入教师添加页面,在该页面输入教师编号、教师名称、出生日期、民族、电话、邮箱、职位、密码、权限等信息,点添加按钮添加教师,教师添加页面如图5.16所示。

    核心代码如下:
    public String addTeacher(){ try{ this.teacherService.addTeacher(this.teacherBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.5.2 教师查看管理员登录系统后选择用户管理,点查看教师信息进入查看教师页面,该页面讲显示所有教师信息,教师查看页面如图5.17所示。

    核心代码如下:
    public String listTeacher(){ try { this.listTeachser = this.teacherService.findAllTeacher(); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.5.3 教师更新管理员在查看教师信息页面点击要更新的教师信息后的更新,进入更新教师信息页面,在该页面将显示原教师信息,可以在原来教师信息的基础上修改所要更新的教师信息,教师更新页面如图5.18所示。

    核心代码如下:
    public String updateTeacher(){ try { this.teacherService.updateTeacher(this.teacherBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.5.4 教师删除管理员在查看院系信息页面点击要删除的院系信息后的删除直接删除该条院系信息,教师删除页面如图5.19所示。

    核心代码如下:
    public String deleteTeacher(){ try { this.teacherBean = this.teacherService .findTeacherById(this.teacherBean.getId()); this.teacherService.deleteTeacher(this.teacherBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.5.5 学生添加管理员登录系统后选择用户管理,点添加学生信息进入学生添加页面,在该页面输入学生编号、学生名称、出生日期、民族、电话、邮箱、职位、密码、权限等信息,点添加按钮添加学生,学生添加页面如图5.20所示。

    核心代码如下:
    public String addStudent(){ try { this.studentService.addStudentBean(this.studentBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.5.6 学生查询管理员登录系统后选择用户管理,点查看学生信息进入学生查看限定条件页面,查看学生限定条件填写页面如图5.21所示,在该页面上填写要查看的学生学号、姓名、出生日期等限定条件,点查看将显示限定条件下的所有学生,学生查看页面如图5.22所示。

    核心代码如下:
    public String searchStudent(){ try{ this.listStudentBean = this.studentService .searchStudentBean(this.studentBean); this.listPoliticsClassBean = this.politicsClassService .findAllPoliticsClass(); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.5.7 学生更新管理员在查看学生信息页面点击要更新的学生信息后的更新,进入更新学生信息页面,在该页面将显示原学生信息,可以在原来学生信息的基础上修改所要更新的学生信息,学生更新页面如图5.23所示。

    核心代码如下:
    public String updateStudent(){ try { this.studentService.updateStudent(this.studentBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.5.8 学生删除管理员在查看院系信息页面点击要删除的院系信息后的删除直接删除该条院系信息,学生删除页面如图5.24所示。

    核心代码如下:
    public String deleteStudent(){ try { this.studentBean = this.studentService .findStudentById(this.studentBean.getId()); this.studentService.deleteStudent(this.studentBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.6 课程管理课程管理包含课程添加、课程查看、课程更新、课程删除四个功能,其中课程添加和课程查看直接在课程管理模块下就能操作,课程更新与课程删除需要在查询出课程信息后才能进行操作。
    5.6.1 课程添加管理员登录系统后选择课程管理,点添加课程进入课程添加页面,在该页面输入课程名称、课程描述信息,点添加按钮添加课程,课程添加页面如图5.25所示。

    核心代码如下:
    public String addCourse(){ try { this.courseService.addCourse(this.courseBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.6.2 课程查看管理员登录系统后选择课程管理,点查看课程进入查看课程页面,该页面讲显示所有课程信息,课程查看页面如图5.26所示。

    核心代码如下:
    public String listCourse(){ try { this.listCourseBean = this.courseService.findAllCourse(); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.6.3 课程更新管理员在查看课程信息页面点击要更新的课程后的更新,进入更新课程页面,在该页面将显示原课程信息,可以在原来课程信息的基础上修改所要更新的课程信息,课程更新页面如图5.27所示。

    核心代码如下:
    public String updateCourse(){ try{ this.courseService.updateCourse(this.courseBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.6.1 课程删除管理员在查看课程信息页面点击要删除的课程后的删除直接删除该条课程信息,课程删除页面如图5.28所示。

    核心代码如下:
    public String deleteCourse(){ try { this.courseBean = this.courseService.findCourseById(this.courseBean .getId()); this.courseService.deleteCourse(this.courseBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7 题库管理题库管理包含题库选择题添加、题库选择题查看、题库选择题更新、题库选择题删除、题库判断题添加、题库判断题查看、题库判断题更新、题库判断题删除、题库填空题添加、题库填空题查看、题库填空题更新、题库填空题删除、题库简答题添加、题库简答题查看、题库简答题更新和题库简答题删除十六个功能,其中题库选择题添加、题库选择题查看、题库判断题添加、题库判断题查看、题库填空题添加、题库填空题查看、题库简单题添加和题库简答题查看直接在题库管理模块下就能操作,题库选择题更新与题库选择题删除需要再查询出题库选择题后操作,题库判断题更新与题库判断题删除需要再查询出题库判断题后操作,题库填空题更新和题库填空题删除需要再查询出题库填空题后操作,题库简单题更新与题库简答题删除需要再查询出题库简答题后操作。
    5.7.1 题库选择题添加教师登录系统后选择题库管理,点添加选择题进入题库选择题添加页面,在该页面选择题目所属课程、输入题目、正确答案,点添加按钮添加题库选择题,题库选择题添加页面如图5.29所示。

    核心代码如下:
    public String addQuestionBankSelect(){ try { this.questionBankSelectService .addQuestionBankSelect(this.questionBankSelectBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.2 题库选择题查看教师登录系统后选择题库管理,点查看选择题信息进入题库选择题查看限定条件填写页面,查看题库选择题限定条件填写页面如图5.30所示,在该页面上选择要查看的题库选择题的出题老师、所属课程以及题目关键字,点查看将显示限定条件下的所有题库选择题,题库选择题查看页面如图5.31所示。

    核心代码如下:
    public String searchQuestionBankSelect(){ try { this.listCourseBean = this.courseService.findAllCourse(); this.listQuestionBankSelectBean = this.questionBankSelectService .searchQuestionBankSelect(this.questionBankSelectBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.3 题库选择题更新教师在查看题库选择题页面点击要更新的选择题后的更新,进入更新题库选择题页面,在该页面将显示原选择题题目信息,可以在原题库选择题题目的基础上修改所要更新的选择题信息,题库选择题更新页面如图5.32所示。

    核心代码如下:
    public String updateQuestionBankSelect(){ try { this.questionBankSelectService .updateQuestionBankSelect(this.questionBankSelectBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.4 题库选择题删除教师在查看题库选择题页面点击要删除的选择题后的删除直接删除该选择题信息,题库选择题删除页面如图5.33所示。

    核心代码如下:
    public String deleteQuestionBankSelect(){ try { this.questionBankSelectBean = this.questionBankSelectService .findQuestionBankSelectById(this.questionBankSelectBean .getId()); this.questionBankSelectService .deleteQuestionBankSelect(this.questionBankSelectBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; }}
    5.7.5 题库判断题添加教师登录系统后选择“题库管理”,点添加“判断题进”入题库判断题添加页面,在该页面判断题目所属课程、输入题目、正确答案,点添加按钮添加题库判断题,题库判断题添加页面如图5.34所示。

    核心代码如下:
    public String addQuestionBankJudge(){ try { this.questionBankJudgeService .addQuestionBankJudge(this.questionBankJudgeBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.6 题库判断题查看教师登录系统后选择题库管理,点查看判断题信息进入题库判断题查看限定条件填写页面,查看题库判断题限定条件填写页面如图5.35所示,在该页面上判断要查看的题库判断题的出题老师、所属课程以及题目关键字,点查看将显示限定条件下的所有题库判断题,题库判断题查看页面如图5.36所示。

    核心代码如下:
    public String searchQuestionBankJudge(){ try { this.listCourseBean = this.courseService.findAllCourse(); this.listQuestionBankJudgeBean = this.questionBankJudgeService .searchQuestionBankJudge(this.questionBankJudgeBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.7 题库判断题更新教师在查看题库判断题页面点击要更新的判断题后的更新,进入更新题库判断题页面,在该页面将显示原判断题题目信息,可以在原题库判断题题目的基础上修改所要更新的判断题信息,题库判断题更新页面如图5.37所示。

    核心代码如下:
    public String updateQuestionBankJudgeAction(){ try { this.questionBankJudgeService .updateQuestionBankJudgeAction(this.questionBankJudgeBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.8 题库判断题删除教师在查看题库判断题页面点击要删除的判断题后的删除直接删除该判断题信息,题库判断题删除页面如图5.38所示。

    5.7.9 题库填空题添加教师登录系统后填空题库管理,点添加选填空进入题库填空题添加页面,在该页面填空题目所属课程、输入题目、正确答案,点添加按钮添加题库填空题,题库填空题添加页面如图5.39所示。

    核心代码如下:
    public String addQuestionBankFill(){ try { this.questionBankFillService .addQuestionBankFill(this.questionBankFillBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.10 题库填空题查看教师登录系统后选择题库管理,点查看填空题信息进入题库填空题查看限定条件填写页面,查看题库填空题限定条件填写页面如图5.40所示,在该页面上填空要查看的题库填空题的出题老师、所属课程以及题目关键字,点查看将显示限定条件下的所有题库填空题,题库填空题查看页面如图5.41所示。

    核心代码如下:
    public String searchQuestionBankFill(){ try { this.listCourseBean = this.courseService.findAllCourse(); this.listQuestionBankFillBean = this.questionBankFillService .searchQuestionBankFill(this.questionBankFillBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.11 题库填空题更新教师在查看题库填空题页面点击要更新的填空题后的更新,进入更新题库填空题页面,在该页面将显示原填空题题目信息,可以在原题库填空题题目的基础上修改所要更新的填空题信息,题库填空题更新页面如图5.42所示。

    核心代码如下:
    public String updateQuestionBankFill(){ try { this.questionBankFillService .updateQuestionBankFill(this.questionBankFillBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.12 题库填空题删除教师在查看题库填空题页面点击要删除的填空题后的删除直接删除该填空题信息,题库填空题删除页面如图5.43所示。

    核心代码如下:
    public String deleteQuestionBankFill(){ try { this.questionBankFillBean = this.questionBankFillService .findQuestionBankFillById(this.questionBankFillBean.getId()); this.questionBankFillService .deleteQuestionBankFill(this.questionBankFillBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.13 题库简答题添加教师登录系统后填空题库管理,点添加简答题进入题库简答题添加页面,在该页面选择题目所属课程、输入题目、正确答案,点添加按钮添加题库简答题,题库简答题添加页面如图5.44所示。

    核心代码如下:
    public String addQuestionBankShortAnswer(){ try { this.questionBankShortAnswerService .addQuestionBankShortAnswer(this.questionBankShortAnswerBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.14 题库简答题查看教师登录系统后选择题库管理,点查看简答题信息进入题库简答题查看限定条件填写页面,查看题库简答题限定条件填写页面如图5.45所示,在该页面上简答要查看的题库简答题的出题老师、所属课程以及题目关键字,点查看将显示限定条件下的所有题库简答题,题库简答题查看页面如图5.46所示。

    核心代码如下:
    public String searchQuestionBankShortAnswer(){ try { this.listQuestionBankShortAnswerBean = this.questionBankShortAnswerService .searchQuestionBankShortAnswer(this.questionBankShortAnswerBean); this.listCourseBean = this.courseService.findAllCourse(); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.15 题库简答题更新教师在查看题库简答题页面点击要更新的简答题后的更新,进入更新题库简答题页面,在该页面将显示原简答题题目信息,可以在原题库简答题题目的基础上修改所要更新的简答题信息,题库简答题更新页面如图5.47所示。

    核心代码如下:
    public String updateQuestionBankShortAnswer(){ try { this.questionBankShortAnswerService .updateQuestionBankShortAnswer(this.questionBankShortAnswerBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.7.16 题库简答题删除教师在查看题库简答题页面点击要删除的简答题后的删除直接删除该简答题信息,题库简答题删除页面如图5.48所示。

    核心代码如下:
    public String deleteQuestionBankShortAnswer(){ try { this.questionBankShortAnswerBean = this.questionBankShortAnswerService .findQuestionBankShortAnswerById(this.questionBankShortAnswerBean .getId()); this.questionBankShortAnswerService .deleteQuestionBankShortAnswer(this.questionBankShortAnswerBean); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    5.8 考试管理考试管理包含试卷生成、在线考试、教师阅卷三个功能,试卷生成在管理员登录系统后在考试管理中直接操作,在线考试为学生登录系统后再考试管理中选择在线考试进行试卷的选择,然后作答,老师阅卷为老师登录系统后点击教师阅卷选择所要批阅的试卷,然后再批阅试卷。
    5.8.1 试卷生成管理员登录系统后选择考试管理,点击“试卷生成”进入试卷生成信息填写页面,试卷生成如图5.49所示

    核心代码如下:
    public String createPaper(){ //生成试卷选择题 while (selectNumber != 0){ } //生成试卷填空题 while (fillNumber != 0){ } shortAnswerNumber = this.shortAnswerNumber; //生成试卷简答题 while (shortAnswerNumber != 0){ } return SUCCESS; }
    5.8.2 学生考试学生登录系统后选择考试管理,点击“在线考试”进入试卷选择页面,试卷选择页面如图5.50所示,点击开始考试进入考试页面,在考试页面选择相应的题型作答。选择题答题页面如图5.51、判断题答题页面图5.52、填空题答题页面图5.53、简答题答题页面图5.54所示。

    核心代码如下:
    public String examingSelect(){ PaperSelectBean paperSelectBean = this.paperSelectService.findPaperSelectById(this.paperSelectBean.getId()); paperSelectBean.setStudentanswer(this.paperSelectBean.getStudentanswer()); if (paperSelectBean.getModelanswer() == paperSelectBean.getStudentanswer()){ paperSelectBean.setGetscore(paperSelectBean.getScore()); } else { paperSelectBean.setGetscore(0); } this.studentid = (Integer) session.getAttribute("studentid"); this.paperName = (String) session.getAttribute("paperName"); this.paperSelectService.updatePaperSelect(paperSelectBean); this.listPaperSelectBean = this.paperSelectService.searchPaperSelect(this.studentid, this.paperName); return SUCCESS; }
    判断题答题页面

    核心代码如下:
    public String examingJudge(){ PaperJudgeBean paperJudgeBean = this.paperJudgeService.findPaperJudgeById(this.paperJudgeBean.getId()); paperJudgeBean.setStudentanswer(this.paperJudgeBean.getStudentanswer()); if (paperJudgeBean.getModelanswer() == paperJudgeBean.getStudentanswer()){ paperJudgeBean.setGetscore(paperJudgeBean.getScore()); } else { paperJudgeBean.setGetscore(0); } this.studentid = (Integer) session.getAttribute("studentid"); this.paperName = (String) session.getAttribute("paperName"); this.paperJudgeService.updatePaperJudge(paperJudgeBean); this.listPaperJudgeBean = this.paperJudgeService.searchPaperJudge(this.studentid, this.paperName); return SUCCESS; }
    填空题答题页面

    核心代码如下:
    public String examingFill(){ PaperFillBean paperFillBean = this.paperFillService.findPaperFillById(this.paperFillBean.getId()); paperFillBean.setStudentanswer(this.paperFillBean.getStudentanswer()); this.studentid = (Integer) session.getAttribute("studentid"); this.paperName = (String) session.getAttribute("paperName"); this.paperFillService.updatePaperFill(paperFillBean); this.listPaperFillBean = this.paperFillService.searchPaperFill(this.studentid, this.paperName); return SUCCESS; }
    简答题答题页面

    核心代码如下:
    public String examingShortAnswer(){ PaperShortAnswerBean paperShortAnswerBean = this.paperShortAnswerService.findPaperShortAnswerById(this.paperShortAnswerBean.getId()); paperShortAnswerBean.setStudentanswer(this.paperShortAnswerBean.getStudentanswer()); this.studentid = (Integer) session.getAttribute("studentid"); this.paperName = (String) session.getAttribute("paperName");this.paperShortAnswerService.updatePaperShortAnswer(paperShortAnswerBean); this.listPaperShortAnswerBean = this.paperShortAnswerService.searchShortAnswer(this.studentid, this.paperName); return SUCCESS; }
    5.8.3 教师阅卷教师登录系统后选择考试管理,点击“教师阅卷”进入试卷与题型选择页面,题型选择页面如图5.55所示,在该页面选择试卷与题型点击“开始阅卷”进入阅卷页面,判断题阅卷页面如图5.56、简答题阅卷页面图5.57所示。

    核心代码如下:
    public String listPaperQuetionType(){ try { this.listPaperName = this.paperSelectService.searchPaper(); return SUCCESS; } catch (Exception e) { e.printStackTrace(); return ERROR; } }
    判断题阅卷页面

    核心代码如下:
    public String updateFillBean(){ int temp = 0; this.listPaperFillBean = (List<PaperFillBean>)session.getAttribute("listPaperFillBean"); PaperFillBean paperFillBean = new PaperFillBean(); paperFillBean = this.paperFillService.findPaperFillById(this.paperFillBean.getId()); paperFillBean.setGetscore(this.paperFillBean.getGetscore()); this.paperFillService.updatePaperFill(paperFillBean); temp = this.index; this.index = temp; temp = this.listsize; this.listsize = temp; return SUCCESS; }
    简答题阅卷页面

    核心代码如下:
    public String updateShortAnswerBean(){ int temp = 0; this.listPaperShortAnswerBean = (List<PaperShortAnswerBean>)session.getAttribute("listPaperShortAnswerBean"); PaperShortAnswerBean paperShortAnswerBean = new PaperShortAnswerBean(); paperShortAnswerBean = this.paperShortAnswerService.findPaperShortAnswerById(this.paperShortAnswerBean.getId()); paperShortAnswerBean.setGetscore(this.paperShortAnswerBean.getGetscore()); this.paperShortAnswerService.updatePaperShortAnswer(paperShortAnswerBean); temp = this.index; this.index = temp; temp = this.listsize; this.listsize = temp; return SUCCESS; }
    5.9 成绩管理成绩管理只实现了学生查看本人成绩,学生在登录系统后选择成绩管理,点击查看成绩查看本人所有考试的成绩,成绩查看界面如图5.58所示。

    核心代码如下:
    public String findGradeCourse(){ for ( int i = 0; i < listcourseidsize; i ++){ for ( int j = 0 ; j < listPaperNamesize; j ++){ GradeBean gradeBean = new GradeBean(); selectBeans = this.paperSelectService.searchPaperSelect(this.studentBean.getId(), this.listcourseid.get(i).intValue(), this.listPaperName.get(j)); judgeBeans = this.paperJudgeService.searchPaperJudge(this.studentBean.getId(), this.listcourseid.get(i).intValue(), this.listPaperName.get(j)); fillBeans = this.paperFillService.searchPaperFill(this.studentBean.getId(), this.listcourseid.get(i).intValue(), this.listPaperName.get(j)); shortAnswerBeans = this.paperShortAnswerService.searchShortAnswer(this.studentBean.getId(), this.listcourseid.get(i).intValue(), this.listPaperName.get(j)); for (int k = 0; k < selectBeanslength; k ++){ n = n + selectBeans.get(k).getGetscore(); } for (int k = 0; k < judgeBeanslength; k ++){ n = n + judgeBeans.get(k).getGetscore(); } for (int k = 0; k < fillBeanslength; k ++){ n = n + fillBeans.get(k).getGetscore(); } for (int k = 0; k < shortAnswerBeanslength; k ++){ n = n + shortAnswerBeans.get(k).getGetscore(); } for(int k = 0; k < listCourseBeansizi; k ++){ if (selectBeans.get(0).getCourseid() == this.listCourseBean.get(k).getId()) gradeBean.setCourseName(this.listCourseBean.get(k).getName()); } gradeBean.setPaperName(selectBeans.get(0).getPapername()); gradeBean.setGrade(n); this.listGradeBean.add(gradeBean); } } return SUCCESS; }
    第六章 总结该在线考试系统以java作为开发语言,Struts2、Hibernate实现前后台数据管理,Spring实现业务逻辑管理,以MyEclipse作为开发工具,MySQL实现数据持久化,Tomcat部署整个系统,实现了院系管理、专业管理、班级管理、用户管理、课程管理、题库管理、考试管理、成绩管理八大功能。考试的主要参与者——学生在考试过程中出来要体现考生的姓名、学号、考试科目外还需要知道考生属于哪个班级,每个班级都属于特定的专业,每个专业又只属于一个院系,因此在该考试系统中出了实现基本的考试功能还实现了对学生的相关信息的管理,在添加院系时,每个院系的名称唯一,添加专业时,在院系管理中必须存在这样的院系才能添加相关专业,同样,添加班级是首先在专业中要有这样的专业,添加学生时也又必须存在学生所属班级。在学生信息管理这几大模块中,如果对学生所属班级的信息进行更改,那学生对应的所属班级信息会自动更改,更改了专业信息后,班级对应所属专业也会自动更改,修改院系信息后专业对应的所属专业也会自动修改。在线考试系统的另外一个优点就是针对不同的考试科目可以出不同的试卷,也许没门考试的难度不一样,因此该考试系统中实现的自主确定考试题目数量与自主设置每题分值是该考试系统的另一个优点。管理员可以根据考试的实际难易程度设定不同的考试题目数量,根据题目的难易程度设定不同类型的题目的分值,同时,在生成考试试卷时对于试卷生成后老师不能预览考试题目,试卷中的题目也是从数据库中随机抽取,因此这样实现了考试过程中的对试卷的保密性。学生在正个考试过程中能看到自己考试剩余时间,这能使考生在考试时合理安排答题时间。
    该考试系统虽已经相当完善,但是没有任何一个软件没有任何缺陷,同样该考试系统也存在着它特有的不足,该考试系统对数据的输入只能一个一个的添加,不能实现文件导入功能,这是该考试系统的最大不足,当然,该考试系统还有其他的不足之处,如页面的设计有些地方不是特别合理,因此改考试系统还有待完善。
    致谢在本系统的设计和实现过程中,老师给我了极大的帮助。老师在我设计系统的功能时给了我许多技术指导,并教会了我许多新的知识,拓宽了我的眼界。更为重要的是,在老师的帮助下让我体会到了当一名好的程序员是需要付出极大的耐心与努力,为将来的工作做好了心理上的准备。
    同时,在这毕业的最后,我也要感谢大学四年来与我共同生活,共同努力,共同学习进步的同学们,我们互帮互助,为我们自己的青春挥洒汗水,为我们的将来而努力。谢谢你们!
    参考文献[1] 何为东.在线考试系统设计[D]:[学士学位论文].武汉:武汉大学,2012.
    [2] 王子强.在线考试系统需求分析设计[EB/OL].http://wenku.baidu.com/view/d4002f37ee06eff9aef807c3.html
    [3] 吴国柱.基于Java的在线考试系统设计[D]:[学士学位论文].武汉:华中科技大学,2012.
    [4] 吴建,张晓东.JSP网络开发入门与实践[M].北京:人民邮电出版社,2007,7~15.
    [5] 计磊,李显,周伟.J2EE—-Eclipse Struts Hibernate Spring整合应用案例[M].北京:人民邮电出版社,2006,21~27.
    [6] 戎伟,张双.精通Struts—-Java流行服务器、框架、工具及整合应用[M].北京:人民邮电出版社,2007,19~31.
    [7] 范立峰,林果园.JavaWeb程序设计教程[M].北京:人民邮电出版社,2011,173~224.
    [8] 孟劫.精通Spring—-Java轻量级架构开发实践[M].北京:人民邮电出版社,2007,41~96.
    [9] 崔洋 贺亚茹.MySQL数据库应用从入门到精通[M].北京:中国铁道出版社,2012,24~72.
    [10] 克尼亚万,德克,曹旭东.深入剖析Tomcat[M].北京:机械工业出版社,2012,22~87.
    [11] 张海藩.软件工程导论 [M].北京:清华大学出版社,2008,55~73.
    [12] 王珊,萨师煊.数据库系统概论(第四版)[M].北京:高等教育出版社,2011,198~235.
    9 评论 313 下载 2018-09-27 22:47:00 下载需要18点积分
  • 基于JSP和SQL Server的网上花店销售系统的设计与实现

    摘 要随着时代的快速发展,我们的生活已经离不开计算机网络,而电子商务的快速发展正在改变着人们的生活方式。随着各种网上购物平台的不断兴起,人们早已习惯了不用出门就买到自己需要的东西。但是针对鲜花销售这方面的网络平台还很少,因此设计一个网上花店销售系统很有前景。
    网上花店销售系统采用JSP+Servlet+JavaBean的MVC模式,将数据对象、业务逻辑以及用户界面分离。该系统分为用户和管理员两个角色。用户注册登录后可以浏览鲜花,浏览公告,购买鲜花,管理员登录后可以对系统进行管理和维护。
    网上花店销售系统对于用户来说操作方便,满足了用户随时随地购买鲜花的需求,不仅为用户节省了时间,还提高了用户的购买效率。对于花店老板而言,不仅提高了销售效率还降低了时间和人工成本。
    关键词:销售系统;JSP;MVC;网上花店
    AbstractWith the rapid development of the times, our lives have been inseparable from the computer network, and the rapid development of e-commerce is changing people’s way of life. With the continuous rise of a variety of online shopping platform, people have long been accustomed to buy their own needs do not have to go out. But for the sale of flowers on the network platform is still very small, so the design of an online florist sales system is promising.
    Online flower florist system using JSP + Servlet + Javabean MVC model, the data object, business logic and user interface are separate. The system includes two roles: user and administrator. After registering, user can browse the flowers, browse the announcement, buy flowers, Administrators can manage and maintain the system after logging.
    Online florist sales system for the user is easy to operate, It fulfills the needs of users to buy flowers anytime and anywhere.This system not only saves user’s time, but also improve the user’s purchasing efficiency. For the flower shop owner, this system not only improve the sales efficiency but also reduce the time and labor costs.
    Key words: sales system; JSP; MVC; online florist
    1 绪论1.1 现状分析鲜花销售行业最初是鲜花销售商个体进行实体销售,后来经过发展形成了鲜花进入批发市场再进行分销的形式。传统的鲜花销售模式是以实体花店为主体,直到后来由于网络的迅速发展,电子商务的介入使鲜花销售发生了很大的变化。随着人们生活水平的提高以及对生活品质的要求,鲜花销售行业发展的前景也越来越好。目前,很多大的鲜花销售品牌已经开始了鲜花的网上销售,方便了消费者购买鲜花的需求,节约了大量的时间。但很多个体鲜花销售商的鲜花销售依然不够景气,还停留在传统花店的状态。这样不仅消费者必须亲自进入花店进行购买,再加上鲜花包装等一系列工序,浪费了大量的时间,而且鲜花销售商也会由于实体销售的缺陷降低销售额。另外,传统花店销售由于地域性的约束和客户范围的划分,使得传统花店的客户受到限制。因此发展网上花店销售系统就显得比较重要,也比较有前景。这样能扩展鲜花消费市场,实现利润增长。网上花店销售系统的实现不仅缩短了鲜花上市时间,节约了成本,方便了消费者购买,方便管理员管理,节约了大量时间和大量的人力物力,还增强了人们之间的感情交流等。
    1.2 研究意义传统的实体鲜花销售存在很多的限制,该系统致力于满足用户随时随地在网上挑选购买鲜花的需求。对于花店老板而言,可以提高工作效率,使网上鲜花管理工作系统化、规范化、自动化,提高整个购买鲜花流程的效率,使总体水平上升到一个新的高度。与传统花店相比,网上花店有其不可比拟的优势。首先网上花店的运营成本较低,职员人数较少,也不需要很大的运营场地。其次网上花店有传播信息迅速、容量大、范围广、可交互等特点。不仅如此,网上花店的建立,可以更好的满足消费者的需求。通过这种网络工具为消费者带来方便,同时促进浏览此网站用户的购买欲,提高销售效率。
    网上花店系统给用户提供了一整套完整的网上鲜花订购流程,使用户足不出户直接进行网上购物,给消费者带来了很大的方便。随着人类社会的发展,人际交往变得越来越重要。在这个繁忙的社会,人们很少有时间能见面交流感情,在特殊的日子里送给好友一束鲜花是用于联络感情的很好方式,因此受到广大消费者的欢迎。与此同时,商家也不再需要在商店里被动的等待顾客,完全可以坐在家里就轻松的卖出自己的商品,获得利润。计算机的存储与快速查询功能大大提高了网上花店管理的效率,并且还提高了查询并购买鲜花的精确度。方便快速的操作,不仅可减少从前的漏洞,还可以减少因工作的冗余出现的错误,更重要的是该系统的操作非常简单,推广起来比较容易。
    1.3 研究方法网上花店销售系统将采用瀑布模型的方式,先对目前鲜花销售的情况进行概述,然后对开发系统的环境以及技术进行简要介绍,之后对开发网上花店销售系统进行可行性分析、需求分析、总体设计、详细设计、编程实现以及测试直到实现最终理想的效果。本文将详细阐述整个实现过程。
    2 系统的开发环境及技术简介2.1 系统开发环境简介2.1.1 MyEclipse简介MyEclipse企业级工作平台作为对Eclipse IDE的扩展,它的功能体现在可以在数据库和JavaEE的开发、发布、应用程序服务器的整合方面极大的提高工作效率。MyEclipse几乎包括了目前所有主流开源产品的专属Eclipse开发工具,它作为功能丰富的JavaEE集成开发环境,在功能方面包括了完备的编码、调试、测试和发布,十分完整地支持HTML、Struts 2、Spring、JSP、CSS、JavaScript、Servlet、Hibernate、JDBC数据库链接工具等。JavaEE模型;Web开发工具;EJB开发工具;应用程序服务器的连接器;JavaEE项目部署服务;数据库服务;MyEclipse整合帮助是MyEclipse的7类特征。在Eclipse中,对于以上每一种功能上的类别都存在相应的功能部件,以及一系列可以用来实现它们的插件。MyEclipse这种结构上的模块化为它带来了很多优势,可以让开发人员在基本不影响其他模块的前提下,可以单独的扩展和升级任一模块。
    2.1.2 Tomcat简介Tomcat服务器是一个免费的开放源代码的Web应用服务器。运行时占用的系统资源小;扩展性好;支持负载平衡与邮件服务等开发应用系统常用的功能这几个特点使得其很受编程人员的喜欢。任何一个编程人员都可以更改它或在其中加入新的功能,因此Tomcat服务器还在不断的改进和完善中。 Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是调试和开发JSP程序的第一选择。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行Tomcat时,它实际上是作为一个与Apache独立的进程单独运行的。
    2.1.3 SQL Server简介SQL Server 是一个关系数据库管理系统,常用的有SQL Server 2000,SQL Server 2005,SQL Server 2008等版本。SQL Server 2008是微软公司2008年推出的数据库产品。它紧密结合了微软公司的各类主要产品,与Windows操作系统、Office办公软件、Visual Studio开发平台的最新技术进行了衔接。其各项指标在同类产品中都堪称优秀,而且图形化的管理界面十分便于学习与使用。SQL Server 2008具有很多新的特点,它是可信任的,使得公司可以以很高的安全性、可靠性和可扩展性来运行他们最关键任务的应用程序。它是高效的,使得公司可以降低开发和管理他们的数据基础设施的时间和成本。它是智能的,提供了一个全面的平台,可以在你的用户需要的时候给他发送观察和信息。
    2.2 系统开发技术简介2.2.1 JSP简介JSP全称Java Server Pages,是一种动态网页开发技术。JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Servlet和JSP配合才能完成。JSP具备了Java技术简单易用的特点,完全地面向对象,具有平台无关性、主要面向因特网且安全可靠。简单的理解,JSP就是HTML页面+Java代码,但是JSP中能写的内容还不止这些,可以包含HTML标签,CSS,JavaScript,JAVA代码,EL表达式,引入并使用其他标签库,例如JSTL标签库、Struts 2标签库等。浏览器可以直接运行HTML页面,但是不能直接运行JSP页面,JSP是需要在拥有JSP引擎的服务器中运行的,例如Tomcat服务器。所以JSP是运行在服务器端的,运行完之后,把动态生成的HTML页面再使用IO流写回给浏览器,浏览器接收并且解析后再呈现出来效果。JSP的生命周期分为编译阶段,初始化阶段,执行阶段,销毁阶段。
    2.2.2 Javabean简介JavaBean 是一种Java语言写成的可重用组件。为了编写JavaBean,类必须是特定的和公共的,并且具有无参数的构造器。JavaBean通过提供一个符合一致设计模式的公共方法公开内部域的成员属性。众所周知,属性名与此模式相一致,其他java类可以通过自省机制发现和操纵这些JavaBean的属性。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。JavaBean可分为两种:一种是有用户界面的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。JavaBean是可复用的平台独立的软件组件,开发者可以在软件构造器工具中对其直接进行可视化操作。一个JavaBean由3部分组成:属性、方法、事件。
    2.2.3 Servlet简介Servlet是一个基于JAVA技术的Web组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容,Servlet是平台独立的Java类,编写一个Servlet实际上就是按照Servlet规范编写一个Java类,Servlet被编译为平台独立的字节码,可以被动态地加载到支持 Java技术的Web服务器中运行。Servlet容器也叫Servlet引擎,是Web服务器或者应用服务器的一部分,用户在发送请求和响应之上提供网络服务,Servlet不能独立运行,必须被部署到Servlet容器中,由容器实例化和调用Servlet的方法,Servlet容器在Servlet的生命周期内包含和管理Servlet。Servlet是单实例多线程的运行方式,每个请求在一个独立的线程中运行,提供服务的Servlet实例只有一个Servlet 具有可升级性,能响应更多的请求,因为Servlet容器使用一个线程而不是操作系统进程,线程占用的资源要小,Servlet使用标准的API,被更多的Web服务器所支持。Servlet使用Java语言编写,拥有更多的Java程序语言的优点,Servlet可以访问Java平台丰富的类库,使得各种应用的开发更为容易,Servlet容器给Servlet提供额外的功能。
    2.2.4 JDBC简介对系统来说数据库连接应该说是最为重要的部分,Java中连接数据库的技术是JDBC。JDBC作为一种用于执行SQL语句的Java API,具备为多种关系数据库提供统一访问的功能,JDBC是由一组用Java语言编写的类和接口组成的。为了达到可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序的目的,JDBC提供了一种基准。众所周知,JDBC API、JDBC驱动程序和JDBC驱动程序管理器是JDBC的三个部分,即可以通过Java.sql包来提供JDBC API,JDBC API上仅仅设计为了利用数据库而提供的类的接口,提供JDBC驱动的软件商来实际完成这个接口。当JDBC API制作的程序进行数据调用时,JDBC驱动发挥它的作用,实际连接数据库并且进行相应的处理, JDBC API的接口类也由JDBC驱动提供。
    两层模型(C/S)和三层模型(B/S)同样都是JDBC API支持数据库访问的。在两层模型(C/S)中,Java Applet或应用程序与数据库会直接进行对话,与所访问的特定数据库管理系统进行通讯时需要一个JDBC驱动程序,数据库收到被用户送来的SQL语句,而用户将会收到其被送回的结果。客户机/服务器配置指的是数据库可以位于另一台计算机上,用户通过网络连接到上面。其中客户机就是我们平时常说的用户的计算机,而服务器是我们常说的提供数据库的计算机,网络是Internet。在三层模型(B/S)中,服务的”中间层”先是收到命令,然后由服务的“中间层”将SQL语句交给数据库,数据库需要对SQL语句进行处理并将所得结果送回到中间层,最后用户将会收到中间层所得的结果。JDBC是用于直接调用SQL命令的“低级”接口。它在这方面的功能极佳,相比其它的数据库,它连接API易于使用,与此同时它也被设计成为了一种基础接口,高级接口和工具可以建立在它之上。很明显,JDBC具有如下优点:JDBC支持不同的关系数据库,JDBC使得开发人员不需要再使用复杂的驱动器调用命令和函数,可以将常用的JDBC数据库连接封装成一个类等。
    2.2.5 SQL语言简介SQL全称是结构化查询语言(Structured Query Language),SQL语言结构简洁,功能强大,简单易学。SQL语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。SQL语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。SQL语言不仅是一个功能强大的通用的关系数据库标准语言,而且还是一种介于关系演算和代数之间的语言,其功能之强大体现在查询、操纵、定义和控制这四个方面。SQL语言包含以下六个部分:

    数据查询语言
    数据操作语言
    事务处理语言
    数据控制语言
    数据定义语言
    指针控制语言

    作为非过程化的语言,SQL一次只对一个记录进行处理,自动对数据提供导航。SQL不对单个记录进行操作,它不仅可对记录集进行操作,还允许用户在高层的数据结构上工作。对于所有SQL语句,输入的是接受集合,输出的是返回集合。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。SQL可用于所有用户的DB活动模型,这里所指的用户包括系统管理员、数据库管理员、 应用程序员、决策支持系统人员以及许多其它类型的终端用户等。基本的SQL命令简单易学,一般情况下只需很少时间就能学会,即使是高级的命令在几天也内便可掌握。SQL语言则将所有任务统一在了一种语言中。用户之所以可将使用SQL的技能从一个关系数据库管理系统转到另一个,是因为所有主要的关系数据库管理系统都支持SQL语言。
    3 可行性研究3.1 经济可行性经济可行性,主要考虑的是系统开发涉及到的一些相关费用问题,企业是否可以支撑这些费用,通常来分析,软件系统开发主要包括的费用有设备购买费用,人员开发成本,设备维护更新成本,以及其他零散费用等,这些费用中,人员开发费用相对较高,但是本次系统开发规模小,周期短,所设计的开发费用不高,因此企业不必担心此方面问题。再则就是设备购买费用,一般保持电脑,交换机,网络,服务器等,这些都是一次性购买,费用也不高。因此,对于企业来讲,问题不大,经济上可以接受。通过对现已存在的相关系统进行调查,开发该系统所需的相关资料可以由此采集。同时所需的应用软件、系统硬件也便于获得,因此该系统开发成本不高。在引进该系统之后,不可否认,与传统方式相比可以节省不少人力、物力及财力,因为它的确具有效率高、质量高、成本低以及实用性高的特点。所以,站在经济的角度来讲,网上花店销售系统被认定为是可行的。
    3.2 技术可行性技术可行性主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。首先,系统采用的是JAVA开发技术,这项技术比较全面,实用广泛,没有实现不了的功能需求;其次该网站采用了SQL Server2008数据库,它能够处理大量数据,同时保持数据的完整性并提供许多高级管理功能,它的灵活性、安全性和易用性为数据库编程提供了良好的条件;最后开发工具,采用的是MyEclipse,工具中具有框架函数等,可以直接引用。因此,系统的软件开发平台已成熟可行。硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,其硬件平台完全能满足此系统的需要。
    3.3 操作可行性操作可行性主要是考虑系统完成后,用户使用的是否便利,是否可以达到用户的操作要求。该系统界面设计充分考虑浏览用户的习惯,鲜花信息浏览,公告浏览,鲜花搜索,用户注册,用户登录,用户挑选鲜花加入购物车,用户将购物车的鲜花生成订单,用户查看订单,用户管理个人信息等功能操作方便。除此之外,对于管理员而言,管理界面一目了然,对于系统的管理和维护也很容易。更重要的是所有网页设计清新、简洁、合理,不会让用户感到视觉疲劳,可操作性强。
    3.4 法律可行性法律可行性主要是看新系统的开发会不会在社会上或政治上引起侵权,有无违法问题。网上花店销售系统开发过程中所有技术资料都是合法的;在开发过程中是不存在知识产权问题的;未抄袭其他系统,故不存在侵犯版权问题;开发过程中不会涉及任何法律责任。
    4 需求分析4.1 数据描述4.1.1 数据流图数据流图简称DFD,它从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。网上花店销售系统的数据流图如图4-1所示。

    在该数据流图中方框表示数据的原点或终点,原点和终点是系统之外的实体。椭圆表示变换数据的处理,也称之为加工,它对数据流进行某些操作或变换。箭头表示数据流,数据流是数据在系统中的运行方向。双杠表示数据存储文件,是用来暂时存储数据的。网上花店销售系统的实体有两个,分别为用户和管理员,用户对应于在网上购买鲜花的顾客,管理员对应于网上花店的老板。此系统中的加工对于用户来说有浏览鲜花、查看分类、管理用户信息、管理购物车、生成并查看订单、查看公告,对管理员来说有鲜花管理、分类管理、用户管理、订单管理、公告管理。此系统中的数据存储包括鲜花信息、分类信息、用户信息、购物车信息、订单信息和公告信息,在实际的实现中应该将这些信息存储在对应的表里,虽然鲜花信息、分类信息、用户信息、订单信息和公告信息是用户和管理员共享的,但是由于权限的不同用户对于鲜花信息、分类信息以及公告信息只有查看的权限,管理员对于这些信息有增、删、改的权限。在数据流图中反映为加工的不同。
    用户在系统中可以浏览鲜花、查看分类、管理用户信息、管理购物车、生成并查看订单、查看公告,本系统中用户数据流图如图4-2所示。

    管理员在系统中可以进行鲜花管理、分类管理、用户管理、订单管理、公告管理,其中管理员可以对鲜花、分类和公告进行添加、修改、查看和删除,对用户进行查看和删除,对订单进行查看和处理。本系统中管理员数据流图如图4-3所示。

    4.1.2 数据字典数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明。图4-1中数据流条目如下所示:

    用户信息=用户ID+用户名+密码+姓名+角色+手机号+地址
    鲜花信息=鲜花ID+鲜花名+鲜花图片+上架时间+分类ID+分类名+价格+是否推荐+点击数+鲜花销量+鲜花描述
    公告信息=公告ID+标题+内容+添加时间
    分类信息=分类ID+分类名称
    购物车信息=购物车ID+用户ID+鲜花ID+鲜花名+价格+购买数量
    订单信息=订单ID+订单状态+用户ID+用户姓名+用户手机+收货地址+订单详情+订单号+备注+生成时间+总价

    根据数据流条目得到数据项条目如表4-1所示。



    名称
    类型
    长度
    别名




    id
    int
    11
    用户ID


    username
    varchar
    255
    用户名


    password
    varchar
    255
    密码


    xingming
    varchar
    255
    姓名


    role
    int
    11
    角色


    dianhua
    varchar
    255
    手机号


    dizhi
    varchar
    255
    地址


    id
    int
    11
    鲜花ID


    pname
    varchar
    255
    鲜花名


    imgpath
    varchar
    255
    鲜花图片


    createtime
    varchar
    255
    上架时间


    fname
    varchar
    255
    分类名


    jiage
    double

    价格


    tuijian
    varchar
    255
    是否推荐


    dianjishu
    int
    11
    点击数


    xiaoliang
    int
    11
    鲜花销量


    miaoshu
    text

    鲜花描述


    id
    int
    11
    公告ID


    biaoti
    varchar
    255
    标题


    neirong
    text

    内容


    shijian
    varchar
    255
    添加时间


    id
    int
    11
    分类ID


    fname
    varchar
    255
    分类名称


    id
    int
    11
    购物车ID


    shuliang
    int
    11
    购买数量


    id
    int
    11
    订单ID


    status
    varchar
    255
    订单状态


    xiangqing
    text

    订单详情


    orderid
    varchar
    255
    订单号


    beizhu
    varchar
    255
    备注


    shijian
    varchar
    255
    生成时间


    zongjia
    double

    总价



    4.1.3 系统IPO图IPO图是输入—处理—输出图(Input-Process-Output)的简称。基本形式是画三个方框,在左边框中列出有关输入数据,在中间框内列出主要处理,在右边框中列出产生的输出数据。网上花店销售系统的输入数据主要是用户信息以及鲜花信息,处理主要针对用户、鲜花分类、鲜花详情、购物车以及订单,输出数据对应于处理过程。该系统IPO图如图4-4所示。

    4.2 功能需求4.2.1 功能划分本网上花店销售系统主要分为前台操作和后台管理两部分。

    前台操作

    前台作为与用户直接交互的界面,在考虑功能的同时,也考虑了操作的简洁和方便性,目的是让大多数不太懂电脑操作的用户也能轻松的享受该系统带来的便利前台主要功能包括:首页(主界面)、鲜花搜索、鲜花分类、花店公告、鲜花浏览、用户注册、用户登录、订购鲜花、查看购物车、查看订单等
    后台管理

    后台管理考虑了花店管理的操作简单方便后台主要功能包括:分类管理、鲜花管理、公告管理、订单管理、用户管理

    4.2.2 功能描述
    首页(主界面):提供简洁美观的主界面,界面陈列系统提供功能,用户和管理员通过选择各个功能来达到自己所需的目的
    用户注册:新用户通过填写注册表单,将自己的详细信息输入并提交系统,系统会通过与数据库的连接以及表单限定的格式来检查合法性。注册成功后可以进行订购等其他功能
    用户登录:用户通过输入“用户名”和“密码”进行登录,系统会通过与数据库的连接来检查合法性,如果存在则登录成功继续接下来的功能,如果不存在则返回登录界面
    鲜花浏览:用户可以通过选择该功能看到本系统鲜花的详细介绍
    加入购物车:用户可以通过该功能选择自己要购买的鲜花并放入购物车,在购物车也可以进行数量的修改并且生成订单。但要首先登录才可以实现该功能
    生成订单:用户可以把购物车里的鲜花下订单
    查看订单:用户可以查询自己的订单,但首先必须登录
    修改个人信息:用户可以修改个人资料
    管理员分类管理:管理员可以对系统首页的分类进行增加、查看、修改、删除
    管理员鲜花管理:管理员可以对系统首页的鲜花进行增加、查看、修改、删除
    管理员公告管理:管理员可以对系统首页的公告进行增加、查看、修改、删除
    管理员订单管理:管理员可以对用户的订单进行查看、处理
    管理员用户管理:管理员可以对系统已经注册的用户进行查看、删除

    4.3 性能需求网上花店销售系统在日常处理中的响应速度为秒级,达到实时要求,以及时反馈信息。在进行统计分析时,根据所需数据量的不同而从秒级到分钟级,原则是保证操作人员不会因为速度问题而影响工作效率。系统处理的准确性和及时性是系统的必要性能。在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足用户对信息处理的求。由于网上花店销售系统的查询功能对于整个系统的功能和性能完成举足轻重,作为系统的很多数据源,其准确性很大程度上决定了网上花店销售系统的成败。在系统开发过程中,必须采用一定的方法保证系统的准确性。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。当操作发生变化时,一些功能同样能够实现。因为在实现各项功能时了,把功能划分成了不同的模块,各模块之间互不干扰,而且JavaBean都采用类的形式,每个功能都封装成一个类,当运行环境发生变化时,对程序会有一些影响,但打上补丁就可以继续运行了。总体上讲,本系统具有一定的自适应性。
    4.4 运行需求
    硬件条件:英特尔酷睿2 CPU、1GB 内存、20GB以上硬盘的PC机
    软件条件:Windows 7操作系统

    当系统遇到问题时,首先查看运行环境是否更改;如果更改,只修复运行环境即可;若未更改,查看系统中各个模块之间的接口是否有问题,可通过调试改正错误。数据库最严重的问题是数据库损坏,此时最好是从备份恢复数据库。如果是由于存储问题导致部分数据库文件损坏,但数据库还可以连接,这种情况采用导出数据库的表结果和数据的方法来恢复数据库。解决数据库的性能问题,可以从以下方面入手,检查数据库的配置,如缓冲池,排序堆等是否处理;检查数据库是否收集过统计信息,准确的统计信息对语句优化起着重要的作用;对sql语句进行优化;查看是否有系统资源瓶颈。
    4.5 其他需求网上花店销售系统是直接面对使用人员的,而使用人员往往对计算机并不是非常熟悉。这就要求系统能够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求系统应该尽量使用用户熟悉的术语和中文信息的界面。针对用户可能出现的使用问题,要提供足够的在线帮助,缩短用户对系统熟悉的过程。网上花店系统中涉及到的数据是相当重要的信息,系统要提供方便的手段供系统维护人员进行数据的备份,日常的安全管理,系统意外崩溃时数据的恢复等工作。
    5 总体设计5.1 系统功能模块设计网上花店销售系统一共分为前台和后台两大模块,两个模块之间虽然在表面上是相互独立的,但是在对数据库的访问上是紧密相连的,各个模块访问的是同一个数据库,只是所访问的表不同。
    网上花店销售系统的前台功能模块分为:

    鲜花展示模块:鲜花展示模块主要是向用户展示网上花店的鲜花,主要分为鲜花搜索和鲜花分类两个子模块。用户可以通过鲜花搜索直接查询自己想要了解的鲜花,也可以通过鲜花分类查找某一类的鲜花
    公告展示模块:公告展示模块是管理员发布的与网上花店系统相关的公告信息,可以包括系统的使用或者最新的优惠活动等。用户登录系统后,可以查看公告信息,以此来最快的了解系统
    购买鲜花模块:购买鲜花模块主要是完成用户在网上的购物的流程。购买鲜花模块分为加入购物车和生成订单两个子模块
    用户管理模块:用户管理模块分为用户注册、用户登录、用户修改信息三个子模块

    网上花店销售系统前台功能模块图如图5-1所示。

    用户进行购买鲜花时,先进行注册,然后进行登录,登录系统后用户可以浏览鲜花,把需要购买的鲜花加入购物车,把购物车的鲜花生成订单。用户购买鲜花时序图如图5-2所示。

    网上花店销售系统的后台功能模块分为:

    分类管理模块:分类管理模块主要是实现管理员对系统分类的管理,使得用户可以按照分类挑选鲜花,方便了用户的挑选,管理员通过这个模块可以向系统添加新的分类,查看已有的分类,修改已有的分类,删除旧的分类
    鲜花管理模块:鲜花管理模块主要是实现管理员对系统鲜花的管理,该模块对整个系统至关重要。管理员通过这个模块可以向系统添加新的鲜花,查看已有的鲜花,修改已有的鲜花,删除旧的鲜花
    订单管理模块:订单管理模块主要是实现管理员对系统订单的管理,管理员通过这个模块可以查看用户下的订单并对订单做出相应的处理
    公告管理模块:公告管理模块主要是实现管理员对系统公告的管理,这样用户进入系统后可以通过浏览公告获取网上花店销售系统的最新资讯,并且可以在最短的时间内对系统有基本的了解。管理员通过这个模块可以向系统添加新的公告,查看已有的公告,修改已有的公告,删除旧的公告
    用户管理模块:用户管理模块主要是实现管理员对已注册用户的管理,管理员通过这个模块可以查看用户的信息或者删除用户

    网上花店销售系统后台功能模块图如图5-3所示。

    5.2 数据库设计5.2.1 概念结构设计描述概念模型的有力工具是E-R模型,E-R模型是用E-R图来描述现实世界的概念模型。E-R模型包括实体、属性、实体之间的联系等。接下来将用E-R图对网上花店销售系统进行概念结构设计,包括各实体间的E-R图及各实体的详细属性E-R图。其中实体型用矩形表示,矩形框内写明实体名。属性用椭圆形表示,并用无向边将其与相应的实体型连接起来。联系用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型。
    本网上花店销售系统的实体有管理员,用户,公告,订单,分类,鲜花。下面将分别设计各实体的E-R图。
    用户E-R图如图5-4所示。

    在该E-R图中,对于用户实体,用户可以浏览公告,因此用户实体和公告实体是浏览关系,用户可以选购鲜花,因此用户实体和鲜花实体是选购关系,用户可以查看分类,因此用户实体和分类实体是查看关系,用户可以管理自己的购物车,因此用户实体和购物车实体是管理关系,用户可以查看自己的订单,因此用户实体和订单实体是查看关系,用户在系统中是被管理员管理的,因此用户和管理员是被管理的关系。
    管理员E-R图如图5-5所示。

    在该E-R图中,对于管理员实体,管理员可以对系统的公告、订单、分类、鲜花进行管理,对已注册的用户进行管理,因此它与其他实体的关系都是管理关系。
    用户实体的属性有ID、用户名、密码、姓名、角色、手机号、地址。用户详细属性E-R图如图5-6所示。

    鲜花实体的属性有ID、鲜花名、鲜花图片、上架时间、分类ID、分类名、价格、是否推荐、点击数、鲜花销量、鲜花描述。鲜花详细属性E-R图如图5-7所示。

    公告实体的属性有ID、标题、内容、添加时间。公告详细属性E-R图如图5-8所示。

    分类实体的属性有ID、分类名称。分类详细属性E-R图如图5-9所示。

    购物车实体的属性有ID、用户ID、鲜花ID、鲜花名、价格、购买数量。购物车详细属性E-R图如图5-10所示。

    订单实体的属性有ID、订单状态、用户ID、用户姓名、用户手机、收货地址、订单详情、订单号、备注、生成时间、总价。订单详细属性E-R图如图5-11所示。

    5.2.2 逻辑结构设计逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R图转换为与选用数据库管理系统产品所支持的数据模型相符合的逻辑结构。数据库设计时注意保证在整个系统运行和业务操作过程中,数据库都能便于访问和查询,同时还需要考虑到要尽量节省数据库操作时的响应时间,尽可能的提高数据库对程序和业务请求的响应速度。
    根据概念结构设计阶段的E-R图,设计数据库表结构如下。
    t_Fenlei分类表
    该表存放分类ID及分类名称。t_Fenlei分类表如表5-1所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    fname
    varchar
    255
    分类名称



    t_Product鲜花表
    该表存放鲜花信息,主要包括鲜花名、鲜花图片、上架时间、价格、鲜花销量、鲜花描述等信息。分类表和该表相关联,因此表中还包含了分类ID以及分类名。t_Product鲜花表如表5-2所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    pname
    varchar
    255
    鲜花名


    imgpath
    varchar
    255
    鲜花图片


    createtime
    varchar
    255
    上架时间


    fenleiid
    varchar
    255
    分类ID,外键


    fname
    varchar
    255
    分类名


    jiage
    double

    价格


    tuijian
    varchar
    255
    是否推荐


    dianjishu
    int
    11
    点击数


    xiaoliang
    int
    11
    鲜花销量


    miaoshu
    text

    鲜花描述



    t_Gonggao公告表
    该表存放公告信息,主要包括标题、内容、添加时间。t_Gonggao公告表如表5-3所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    biaoti
    varchar
    255
    标题


    neirong
    text

    内容


    shijian
    varchar
    255
    添加时间



    t_Gouwuche购物车表
    该表存放购物车ID、以及用户ID、鲜花ID、鲜花名、价格、购买数量。t_Gouwuche购物车表如表5-4所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    userid
    int
    11
    用户ID,外键


    pid
    int
    11
    鲜花ID,外键


    pname
    varchar
    255
    鲜花名


    jiage
    double

    价格


    shuliang
    int
    11
    购买数量



    t_User用户表
    该表中存放用户的基本信息,普通用户和管理员共用此表,主要包括用户ID、用户名、密码、姓名、角色、手机号、地址信息。普通用户和管理员通过角色的值进行区分, 0表示普通用户,1表示系统管理员。t_User用户表如表5-5所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    username
    varchar
    255
    用户名


    password
    varchar
    255
    密码


    xingming
    varchar
    255
    姓名


    role
    int
    11
    角色


    dianhua
    varchar
    255
    手机号


    dizhi
    varchar
    255
    地址



    t_Dingdan订单表
    该表存放订单ID、订单状态、以及关联表里的用户ID、用户姓名等信息。t_Dingdan订单表如表5-6所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    status
    varchar
    255
    订单状态


    userid
    int
    11
    用户ID 外键


    xingming
    varchar
    255
    用户姓名


    dianhua
    varchar
    255
    用户手机


    dizhi
    varchar
    255
    收货地址


    xiangqing
    text

    订单详情


    orderid
    varchar
    255
    订单号


    beizhu
    varchar
    255
    备注


    shijian
    varchar
    255
    生成时间


    zongjia
    double

    总价



    6 详细设计与实现根据总体设计部分对于功能模块的划分,在详细设计中采用JSP+Servlet+Javabean的MVC模式,其中系统的显示由JSP页面完成,用Javabean封装对象,业务的逻辑处理由Servlet完成,对于数据库的操作写在dao包的文件里。
    6.1 系统对象的设计与实现系统中总共包括七个对象,分别为用户,管理员,公告,鲜花,类别,购物车和订单。系统的类图如图6-1所示。

    在实现过程中将这七个对象封装成bean对象,其中管理员和用户的封装对象内容相同,故二者共用一个对象,用属性role进行区分,0表示用户,1表示系统管理员。六个对象对应于代码中的Dingdan.java,Fenlei.java,Gonggao.java,Gouwuche.java,Product.java,User.java。以User.java为例,关键代码如下:
    public class User { private int id;//主键 private String username;//用户名 private String password;//密码 private String xingming;//姓名 private int role;//用户角色 0表示用户,1表示系统管理员 private String dianhua;//手机 private String dizhi;//收货地址}
    6.2 系统首页的设计与实现该系统首页页面风格简单明了,上边横条可以选择注册和登录,左侧有鲜花搜索,鲜花分类,销量排行榜以及花店公告,用户可以根据自己的需求浏览相关内容。页面右侧是鲜花列表,用户可以通过点击相应的链接查看详情或者加入购物车。首页页面的设计如图6-2所示。

    具体的实现过程是:index.jsp文件主要包括鲜花列表部分,在index.jsp页面引入黄色横条的head.jsp以及左侧的left.jsp。
    6.3 系统前台功能的设计与实现6.3.1 用户注册模块的设计与实现用户注册需要填写相应的信息,主要包括用户名、密码、确认密码、姓名、收货地址以及手机号码。用户注册页面的设计如图6-3所示。

    该页面对应代码中的register.jsp,该页面对输入的每一个数据都有格式上的要求,用户名不能为空且必须是数字,字母或者下划线,密码不能为空且至少6位,确认密码要和密码一致,姓名,收货地址以及手机号都不能为空,手机号码还要符合正确的格式。当用户进行注册时,页面首先会对输入的数据格式进行检验,若输入错误会有相应的提示。除此之外,当用户输入正确的格式的数据之后,点击了注册按钮,系统会在数据库进行比对,若用户名已经被注册,系统也会弹出相应的提示,若用户名还未注册则将数据插入数据库,提示注册成功并跳转到首页。具体的实现过程是在IndexServlet.java中对注册进行逻辑处理,在UserDao.java中对数据库进行操作。
    该页面关键代码如下:
    <form action="indexServlet/register" method="post" onsubmit="return checkform()"> <label>用户名:</label> <input type="text" class="form_input" name="username" id="usernameid" /> <label>密码:</label> <input type="password" class="form_input" name="password" id="passwordid"/> <label>确认密码:</label> <input type="password" class="form_input" name="password2" id="password2id"/> <label>姓名:</label> <input type="text" class="form_input" name="xingming" id="xingmingid"/> <label>收货地址:</label> <input type="text" class="form_input" name="dizhi" id="dizhiid"/> <label>手机:</label> <input type="text" class="form_input" name="dianhua" id="dianhuaid"/> <input type="submit" class="form_submit" value="注册" /></form>
    用户在注册时,第一不能有空值,第二两次密码的输入要一致,第三各项数据的格式要正确。除此之外,用户名不可以是已经注册过的。用户注册程序流程图如图6-4所示。

    6.3.2 用户登录模块的设计与实现用户登录需要填写用户名以及密码,登录页面的设计如图6-5所示:

    该页面对应代码中的login.jsp,用户名和密码都不能为空,否则页面会进行相应的提示,当输入用户名和密码点击登录之后,系统会在数据库中查找,若有匹配的数据则提示登录成功并跳转到首页,否则提示用户名或密码不正确。具体的实现过程是在IndexServlet.java中对登录进行逻辑处理,在UserDao.java中对数据库进行操作。
    该页面关键代码如下:
    <form action="indexServlet/login" method="post" onsubmit="return checkform()"><label>用户名:</label><input type="text" class="form_input" name="username" id="usernameid" /><label>密码:</label><input type="password" class="form_input" name="password" id="passwordid"/><input type="submit" class="form_submit" value="登录" /></form>
    用户在登录时,用户名和密码要一致,如果正确才可以登录成功,否则登录失败需要重新输入登录信息。用户登录程序流程图如图6-6所示。

    6.3.3 公告浏览模块的设计与实现用户在首页可以浏览花店公告,通过点击花店公告的标题可以查看花店公告的详细信息。花店公告页面以及公告详情页面设计如图6-7以及6-8所示。
    花店公告页面

    公告详情页面

    具体的实现过程是,当用户点击花店公告的标题时,通过IndexServlet.java的gonggaoupdate方法获取对象,然后通过GonggaoDao.java对数据库进行操作,最后将对象传到gonggao.jsp页面。
    公告详情页面关键代码如下:
    <form action="${url }" method="post" onsubmit="return checkform()"><div class="form"><div class="form_row"><label>公告标题:</label>${bean.biaoti }</div><div class="form_row"><label>内容:</label>${bean.neirong }</div><div class="form_row"><label>发布时间:</label>${bean.shijian }</div><div class="form_row"><input type="button" class="form_submit" value="返回" onclick="javascript:history.go(-1);"/> </div> <div class="clear"></div></div></form>
    6.3.4 鲜花列表模块的设计与实现用户在系统首页的鲜花列表可以浏览鲜花,鲜花列表包括鲜花名,图片,分类名,鲜花价格,以及查看详情和加入购物车两种操作。点击查看详情后页面会跳转到鲜花信息详情页面。鲜花列表页面以及鲜花信息详情页面如图6-9以及6-10所示。
    鲜花列表页面

    鲜花信息详情页面

    鲜花列表页面对应代码中的index.jsp,鲜花信息详情页面对应代码中的product.jsp,具体实现方式是当用户点击查看详情时,在IndexServlet.java中用productupdate方法进行具体处理,之后把对象传到product.jsp页面。当用户点击鲜花列表或鲜花信息详情页面的加入购物车时,如果用户已经登录,那么系统跳转到我的购物车页面。否则,系统会提示用户先登录并跳转到登录页面。
    6.3.5 用户购物车模块的设计与实现我的购物车页面,包括鲜花名,单价,购买时间,小计。用户可以修改购买数量或者删除购物车里的东西,也可以点击链接跳转到订单页面。我的购物车页面设计如图6-11所示。

    我的购物车页面对应代码中的gouwuchelist.jsp,当用户点击鲜花列表或鲜花信息详情页面的加入购物车时,在IndexServlet.java中用gouwucheadd2方法进行添加商品到购物车操作,在GouwucheDao.java里对数据库进行操作,将所选鲜花数据插入数据库。我的购物车页面的变更删除分别用IndexServlet.java的gouwucheupdate2方法和gouwuchedelete方法实现。
    6.3.6 用户订单模块的设计与实现我的订单页面,包括订单号,收货人姓名,订单状态,生成时间,总价,以及查看订单详情的操作。用户也可以查看和搜索自己的订单。我的订单页面如图6-12所示。

    我的订单页面对应代码中的orderlist.jsp,查询订单的操作在indexServlet/orderlist中实现,查看订单详情的操作在indexServlet/dingdanupdate3中实现,其中对数据库的操作在DingdanDao.java中完成。
    6.3.7 用户信息管理模块的设计与实现用户可以在个人信息页面对自己的信息进行管理,主要是对姓名,手机号以及收货地址的更改,可以在修改密码页面进行密码的修改。用户信息页面的设计与修改密码的设计如图6-13以及6-14所示。
    个人信息页面

    修改密码页面

    个人信息页面对应代码中的userupdate.jsp,修改密码页面对应代码中的passwordupdate.jsp,修改个人信息在是在indexServlet/userupdate2中完成的,修改密码是在indexSe rvlet/passwordupdate2中完成的,操作数据库的部分在UserDao.java中完成。
    6.4 系统后台功能的设计与实现6.4.1 系统后台页面的设计与实现管理员登录成功后会进入系统后台页面,主要包括左侧的主菜单以及中间的欢迎页面。主菜单包括,分类管理,鲜花管理,公告管理,订单管理,用户管理。系统后台页面如图6-15所示。

    管理员在此页面可以通过点击左侧主菜单进行相应的管理。关键代码如下:
    <ul> <li><a href="<%=basePath2 %>manageServlet/fenleilist" >分类管理</a></li> <li><a href="<%=basePath2 %>manageServlet/productlist" >鲜花管理</a></li> <li><a href="<%=basePath2 %>manageServlet/gonggaolist" >公告管理</a></li> <li><a href="<%=basePath2 %>manageServlet/dingdanlist" >订单管理</a></li> <li><a href="<%=basePath2 %>manageServlet/userlist" >用户管理</a></li></ul>
    6.4.2 分类管理功能的设计与实现管理员通过此功能可以查看、修改、删除已经存在的分类,也可以增加新的分类。该系统分类管理页面如图6-16所示。

    分类管理页面对应代码中的fenleilist.jsp,添加新分类以及查看和修改分别对应fenl eiadd.jsp,fenleiupdate3.jsp,fenleiupdate.jsp,管理员进行操作时,系统通过在ManageSer vlet.java中的方法实现,对数据库的操作在FenleiDao.java中实现。
    6.4.3 鲜花管理功能的设计与实现管理员通过此功能可以查看、修改、删除已经存在的鲜花,也可以增加新的鲜花。该系统鲜花管理页面如图6-17所示。

    鲜花管理页面对应代码中的productlist.jsp,添加新商品对应productadd.jsp,上传图片对应productupdate5.jsp,查看和修改分别对应productupdate3.jsp,productupdate.jsp,管理员进行操作时,系统通过在ManageServlet.java中的方法实现,对数据库的操作在ProductDao.java中实现。
    6.4.4 公告管理功能的设计与实现管理员通过此功能可以查看、修改、删除已经存在的公告,也可以增加新的公告。该系统公告管理页面如图6-18所示。

    公告管理页面对应代码中的gonggaolist.jsp,添加新公告对应gonggaoadd.jsp,查看和修改分别对应gonggaoupdate3.jsp,gonggaoupdate.jsp,管理员进行操作时,系统通过在ManageServlet.java中的方法实现,对数据库的操作在GonggaoDao.java中实现。
    6.4.5 订单管理功能的设计与实现管理员通过此功能可以查看和处理订单。该系统订单管理页面如图6-19所示。

    订单管理页面对应代码中的dingdanlist.jsp,查看订单详情对应dingdanupdate3.jsp,管理员进行操作时,系统通过在ManageServlet.java中的方法实现,对数据库的操作在DingdanDao.java中实现。
    6.4.6 用户管理功能的设计与实现管理员通过此功能可以查看和删除用户。该系统用户管理页面如图6-20所示。

    用户管理页面对应代码中的userlist.jsp,管理员进行查询用户和删除用户操作的时候,系统通过在ManageServlet.java中的方法实现,对数据库的操作在UserDao.java中实现。
    7 系统的调试与测试7.1 程序调试调试是在测试发现错误之后排除错误的过程。调试的目的是为了解决存在的错误,即对错误定位、分析并找出原因改正错误,因此调试也称为纠错。软件调试是一项具有很强技巧性的工作,调试是一个通过外部表现找出原因的思维分析过程。常用的调试技术是消去原因法,即通过思考,分析列出发生错误的所有可能原因,逐个排除,最后找出真正的原因。试探法、归纳法、折半查找法、演绎法都属于消去原因法。
    7.2 程序测试7.2.1 测试的内容功能测试:用户注册登录后进行鲜花选购、查看公告等功能,与此同时查看数据库内容是否同步更改,若更改成功则说明程序正确,反之说明程序错误。同理以管理员身份进行登录,对公告、用户等进行查看更改,查看数据库的变化。

    链接测试:在点击菜单按钮之后,查看跳转的页面是否正确
    极限测式:可以通过频繁登录与退出数据库这类频繁的操作来对系统进行测试等

    7.2.2 测试用例根据系统的功能,测试用例为以下几方面:

    用户的注册和登录以及退出,管理员的登录以及退出
    用户浏览鲜花,将鲜花加入购物车,对购物车的鲜花数量进行更改,生成订单,提交订单,查看订单,修改个人信息
    管理员对分类、鲜花、公告进行增、删、改、查,对订单和用户进行查、删

    具体的测试细节为:

    用户注册测试:用户注册时,填写各项信息,首先是各项信息空值的测试,其次是各项数据的数据格式的测试
    用户及管理员登录测试:用户及管理员登录时只需填写用户名和密码,因此测试时主要对用户名和密码的匹配性进行测试
    用户及管理员退出测试:用户和管理员的退出主要是通过点击“退出系统”按钮,因此实际测试中只需测试用户点击按钮后是否能够正确跳转
    浏览鲜花测试:浏览鲜花时用户可以点击查看详情去获取鲜花的详细信息,因此实际测试中只需测试用户点击按钮后是否能够正确跳转到相应的鲜花详情页面
    加入购物车测试:鲜花列表以及鲜花详情页面都有包含加入购物车功能,因此实际测试中需要在两个页面都测试用户点击按钮后是否能够正确跳转到购物车页面
    管理购物车测试:在购物车页面,用户可以对购物车里的鲜花数量进行更改,可以删除购物车里的鲜花,因此实际测试中需对这两方面进行测试
    生成订单测试:用户点击生成订单页面会跳转到确认订单收货信息页面,因此实际测试中要测试用户点击链接后能否正确跳转
    提交订单测试:用户提交订单后会跳转到订单页面,因此实际测试中要测试用户点击提交按钮后页面能否正确跳转以及数据库信息是否相应改变
    用户管理个人信息测试:用户可以更改自己的姓名、收货地址和手机,更改后数据库数据会有相应改变,因此实际测试中要测试用户点击提交按钮后页面能否正确弹出更改成功的信息以及数据库信息是否相应改变
    管理员分类管理测试:管理员在网上花店后台对于分类的管理主要是对分类的增加、修改、查询和删除,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行增加、修改和删除操作时前台显示的分类是否改变以及数据库中的分类数据是否相应的改变
    管理员鲜花管理测试:管理员在网上花店后台对于鲜花的管理主要是对鲜花的增加、修改、查询和删除,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行增加、修改和删除操作时前台显示的鲜花是否改变以及数据库中的鲜花数据是否相应的改变
    管理员公告管理测试:管理员在网上花店后台对于鲜花的管理主要是对公告的增加、修改、查询和删除,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行增加、修改和删除操作时前台显示的公告是否改变以及数据库中的公告数据是否相应的改变
    管理员订单管理测试:管理员在网上花店后台对于订单的管理主要是对订单的查询和处理,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行处理操作时订单是否显示已处理并且数据库中的订单数据是否相应的改变
    管理员用户管理测试:管理员在网上花店后台对于用户的管理主要是对用户的查询和删除,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行删除操作时数据库中的用户数据是否相应的删除

    7.2.3 测试结果通过上一小节对测试细节的分析,对系统进行相应的测试,具体的测试结果如表7-1、表7-2以及表7-3所示。
    在表中有四项内容:

    名称:指测试的对象
    操作:指测试过程中进行的操作方法
    预期结果:指对测试操作产生结果的预测
    实际结果:指实际对系统进行测试时产生的结果

    登录注册测试结果



    名称
    操作
    预期结果
    实际结果




    用户注册测试
    在注册表单输入各种格式的数据
    格式正确则注册成功,反之失败
    同预期


    用户登录测试
    在登录表单输入未注册和已注册数据
    与数据库数据一致则登录成功,反之失败
    同预期


    管理员登录测试
    在登录表单输入正确数据及错误数据
    与数据库数据一致则登录成功,反之失败
    同预期


    用户退出测试
    点击退出系统
    正确退出
    同预期


    管理员退出测试
    点击退出系统
    正确退出
    同预期



    用户操作测试结果



    名称
    操作
    预期结果
    实际结果




    浏览鲜花测试
    点击首页的鲜花列表相应链接
    跳转到相应鲜花界面
    同预期


    加入购物车测试
    点击加入购物车按钮
    跳转正确并且数据库相应改变
    同预期


    管理购物车测试
    对购物车内容进行增、删
    跳转正确并且数据库相应改变
    同预期


    生成订单测试
    点击生成订单按钮
    跳转正确
    同预期


    提交订单测试
    点击提交订单按钮
    跳转正确并且数据库相应改变
    同预期


    管理个人信息测试
    修改个人信息并提交
    跳转正确并且数据库相应改变
    同预期



    管理员操作测试结果



    名称
    操作
    预期结果
    实际结果




    分类管理测试
    在分类管理界面进行增删改查
    跳转正确并且数据库相应改变
    同预期


    鲜花管理测试
    在鲜花管理界面进行增删改查
    跳转正确并且数据库相应改变
    同预期


    公告管理测试
    在公告管理界面进行增删改查
    跳转正确并且数据库相应改变
    同预期


    订单管理测试
    在订单管理界面进行查看和处理
    跳转正确并且数据库相应改变
    同预期


    用户管理测试
    在用户管理界面查看和删除用户
    跳转正确并且数据库相应改变
    同预期



    结论完成了网上花店销售系统的设计,系统前台实现了用户在线浏览所有鲜花,按需求搜索相关鲜花,浏览系统公告以及注册登录后对鲜花选购的操作和购物结束后对订单信息的查看。系统后台实现了管理员对鲜花、分类、公告、订单、用户的管理。
    所设计系统中有一些优点,第一系统安全性高,本系统使用者分为管理员和用户两个角色,当其登录系统时,对其身份进行严格认证;第二采用隔离与访问控制,本系统根据用户的工作需求来分析,对用户权限进行了严格的控制,比如,用户只能浏览鲜花信息而不能修改,系统管理员就可以添加、删除、修改鲜花信息;第三操作简便,该系统本着方便易用的目的进行设计,无论是管理员还是用户都不需要具备专业的计算机知识,只要懂得计算机的一些基本操作,就可以轻松的对花店进行使用,这样做更加贴近用户,使用户使用方便,提高用户的体验。
    但本系统也有一些不足,比如界面相对比较简单,功能相对有限。所以该系统还可以继续完善。
    参考文献[1] 万常选,刘云生. 电子商务的技术及其应用[J]. 计算机工程与应用. 2002(07) .
    [2] 王知强,郑炜. 基于UML的动态企业建模的研究与实现[J]. 哈尔滨商业大学学报(自然科学版). 2005(02) .
    [3] 文灿华,张伟. 基于JSP的网上商城的设计与实现[J]. 电脑知识与技术. 2010(31) .
    [4] 鲁晓东,李育龙,杨健编著.JSP软件工程案例精解[M]. 电子工业出版社, 2005.
    [5] 杨学瑜等编著.JSP入门与提高[M]. 清华大学出版社, 2002.
    [6] 张琳. 网上购物系统的设计与开发[J]. 科技信息(学术研究). 2007(24).
    [7] 陈春蓉. 网上购物系统的设计与开发[J]. 软件导刊. 2009(08).
    [8] 万华. 基于JSP的网上购物系统的实现[J]. 现代计算机(专业版). 2002(10).
    [9] Enhancing Java server availability with JAS. Reinhard Klemm,Navjot Singh. Software. Practice \& Experience . 2001.
    [10] D.C.Ghita.JavaScript Generators. Studia Universitatis Babes-Bolyai:Series Informatica . 2010.
    [11] Jeffrey A Hoffer,Joey F. George.Modern SystemsAnalysis and Design. 2003.
    2 评论 50 下载 2020-08-03 19:01:00 下载需要14点积分
  • 基于JAVA实现的FTP文件传输工具(包括TCP和UDP实现的客户端和服务端)

    1.系统概述1.1 业务背景FTP服务提供了对文件传输的支持,对FTP文件传输服务的需求是本程序的背景,当然现在已经有很多FTP的很好的实现,本程序也不可能说做得比知名的那些要好,在这里程序的目的是为了锻炼网络程序设计与实践和软件系统设计与开发实践能力。
    1.2 总体目标实现一个FTP服务,能够在客户端和服务器端查看和传输文件,使用TCP和UDP两种协议方式进行实现,最后会提供一个FTP服务器、一个FTP客户端。
    2.系统分析和设计2.1 系统概述2.1.1 业务需求描述FTP服务器需求

    为客户端提供查看文件的功能
    为客户端提供上传文件的功能
    为客户端提供下载文件的功能
    能够接受TCP协议的访问方式
    能够接受UDP协议的访问方式

    FTP客户端需求

    能够从服务器上查看文件
    能够向服务器上上传文件
    能够从服务器上下载文件
    能够通过TCP协议访问服务器
    能够通过UDP协议访问服务器

    2.1.2 外部接口需求
    硬件接口:无直接硬件接口,只通过OS等软件接口与硬件间接交互
    软件接口:相应的JDK、JVM环境,以及标准的浏览器软件
    通讯接口:TCP协议、UDP协议

    2.1.3 非功能性需求FTP服务器要求响应时间不能过长,且稳定、可靠;FTP客户端要求传输速度不能过慢,且可随时访问服务器。
    2.1.4 约束条件开发环境

    Eclipse-Java IDE,windows7系统
    整个项目由Java开发,所以要求系统装有相应的JDK、JVM环境,另外,FTP服务器和客户端要求系统有tcp、udp协议的接口

    开发规范

    文件命能清楚的描述其功能
    代码中的空格与空行上下保持一致
    有适量且清楚的注释
    界面整洁,方便使用
    所有函数及变量有能描述其功能的名字
    应注意代码的简洁和优化

    2.2 用例模型2.2.1 用例图
    2.2.2 详细描述


    用例名称
    FTP下载文件




    描述
    用户用FTP客户端从服务器上通过TCP协议下载一个文件


    参与者与关注点
    FTP客户端(用户):希望能够得到快速地响应,而且文件没有传输错误。FTP服务器:希望能够尽快完成客户端请求,有个较好的吞吐量。


    事件流
    主成功场景(或基本流程):客户端要求建立和服务器建立用于控制对话的TCP连接;服务器响应要求并完成3次握手建立连接;客户端向服务器发送文件名;服务器接受文件名并建立用于传输的TCP连接;客户端从服务器通过该连接下载文件;传输完毕,客户端断开与服务器的TCP连接;完成。任意TCP连接建立失败:服务器报错给服务器管理员,管理员检查服务器状态是否异常;客户端报错给用户并退出。文件传输过程出错:客户端报错给用户;用户重新使用客户端从服务器上下载文件或放弃下载。


    前置条件
    服务器已运行



    2.3 领域类图2.3.1 FTP(UDP)类图
    2.3.2 FTP(UDP)核心顺序图
    2.4 体系结构设计
    2.5 程序流程图FTP服务器

    FTP客户端

    2.6 测试截图

    3.总结综上所述,程序实现了一个FTP文件传输工具,包括TCP服务器和客户端、UDP服务器和客户端。在简单规模的测试及使用下,程序运行正确且良好,在较大用户数下表现得一般,响应时间不是很好。作为一个学习网络程序设计的程序已经完成了目标。
    这次作业中,复习了很多计算机网络的相关知识的同时也学到了很多新的实践方面的知识,锻炼了编程能力,感谢老师的辛勤付出。
    3 评论 28 下载 2019-05-07 12:10:07 下载需要12点积分
  • 基于Qt5实现的数独游戏

    1 软件用途本软件是一个数独小游戏,使用 Qt5 编写,实现了数独游戏的快速生成、以及提供任意题目的解决方案。
    2 运行方式安装 Qtcreater 之后,将源代码拷贝至本机sudoku。运行 Qtcreater 直接编译即可。
    Ubuntu 下需要额外安装软件包 qtmultimedia5-dev,进入目录之后运行 qmake -makefile;make;即可得到可执行文件 sudoku。
    3 功能介绍3.1 使用帮助
    图 1 显示了关于本软件的使用帮助。它是运行软件时的最初界面,点击 OK 即可进入主游戏界面。
    3.2 游戏界面
    图 2 显示了软件的开始游戏界面。最上方为选项栏,左侧是菜单栏,中部是数独界面,右上侧是功能栏,右中部是计时器,右下侧是数字栏。
    3.3 选项栏
    图 3 显示了软件的标题选项栏,有四种难度可供选择,每种难度下有内置 4 个关卡,并且还有按照该难度随机生成题目的选项。
    最后一个选项 Custom 提供了输入题目的功能,该软件能够给出用户提供题目的解答。
    3.4 菜单栏
    图 4 显示了软件的左侧菜单栏,从上到下依次为:显示信息(快捷键:Alt+I)、暂停/继续游戏(快捷键:空格)、撤销(快捷键:Ctrl+Z)、重做(快捷键:Ctrl+Y)、回到初始题目状态、音效开关(快捷键:Ctrl+M)。
    3.5 功能栏
    图 5 显示了软件的右上侧功能栏,从上到下依次为:开始游戏、显示帮助、显示计算机给出的解答。
    显示帮助时,软件会显示一个还未被正确填上数字的格子的答案;显示帮助和解答时,均不会覆盖用户记录,下一步操作会回到点击按钮之前的状态。
    3.6 数字栏
    图 6 显示了软件的数字栏,点击 1 ∼ 9(或者按下数字 1 ∼ 9 按键)即可在当前选中的格子上标记/去除一个点击的数字。第四行第一个图标为清除一个格子内的所有数字(快捷键:Delete),第二个图标为标记/取消标记一个选中的格子(快捷键:M)。
    3.7 数独界面
    图 7 显示了软件在游戏过程中的运行界面。在每个时刻,均有一个格子被选中,用黑框蓝色字体高亮显示。当选中的格子已经填上一个数字,那么所有相同数字的格子均会立体高亮显示;否则如果选中的是一个空白格子,那么与这个格子同行同列的所有格子都会被立体高亮显示。当前选中格子的坐标在左下角会给予显示。
    如果一个格子是题目数据,那么它会被标记为黑色字体;如果一个格子里有多个数字,那么程序将会以灰色小字号在格子内显示这些数字;如果一个填写上去的数字和已有数字发生冲突,则标记为红色字体;否则标记为绿色字体。
    图 8 显示了软件在用户完成解题时的界面。

    图 9 显示了软件在 Custom 模式中按下 Solve 按钮之后的自动解题情况,黑色为用户输入数据,左下角状态栏会显示是否多解/单解/无解,以及计算机解题的用时。

    4 数独算法实现高中的时候仔细研究了一下数独的解法,发现 Dancing Link 完全可以被普通的搜索所取代。基本的思路是预处理出来一个搜索序列,然后用二进制表示的状态直接进行搜索。预处理出来的序列整体上保证是限制数目从小到大的,这样的话搜索树就会长得非常瘦,也更容易寻找到解。在 [NOIP2009] 靶型数独一题中,这个方法比 Dancing Link 快一倍以上。并且本机测试,10000 组数独题目,每组平均 56.5 空格,总计算时间为 0.82 秒。
    5 Qt界面实现界面设计的一个原则是,看起来要很清楚,感觉舒服,不要太多颜色花花绿绿的,感觉很浮夸,就像那种垃圾应用一样,玩着玩着给你开个广告。我尽量避免了给使用者留下这样的印象。
    我使用了 QTableWidget 创造出一个表单,再将 81 个 QPushButton 嵌到表单里面。在设计的时候,我将所有的 QpushButton 的 setFlat 设置为 True。这样的话扁平效果就能够体现。一个附带的效果就是,setFlat 在 True 和 False 之间切换时,由于表单上的网格线,会使整个界面产生 3D 立体效果(误打误撞 (x)。
    有一个问题困扰了我很久:QPushButton 在设置成扁平化之后,在选中的时候会出现蓝色的选中框,并且会影响上下左右键的原始操作。解决方案是将所有的 QPushButton 的setFocusPolicy 改成 Qt::NoFocus 即可。
    在每次用户产生鼠标/键盘事件时,由于无需考虑界面的实现效率,因此为了方便,每个事件产生之后都会重新刷新一遍整个界面;并且一个好处就是,可以在刷新的时候顺便更新历史版本记录。
    界面设计的另一个原则就是用户友好,每种操作既可以用鼠标也可以用键盘,在撤销/恢复/显示提示/显示解答/回到最初的时候都不会丢失之前的数据,所有历史数据都存储在一个 QVector 中,每次要撤销/的时候直接移动指针,不会将原来已经在 QVector 中的数据删除,新一步的操作会 append 到 QVector 中,此时再使用撤销操作会回到上一次撤销前的状态。
    在 Qt 程序中,我保存了四个 9 × 9 的数组,分别为:题目,解答,用户数字数据和用户标记数据。
    代码很丑啊我只把数独算法和 ui 隔离开了,一点也不 OO 是吧但是写得爽 233。
    1 评论 4 下载 2020-11-25 10:35:52 下载需要12点积分
  • 基于Python的PyGame实现的超级马里奥游戏

    一、选题在《实践:数据结构与算法实践》中选择了“超级马里奥第一关”为最后作业的题目。
    超级马里奥是红白机上的横版过关类游戏。
    功能特性在于在实现人物移动的同时,要使背景的地图也要进行移动,还有砖块、怪物等其他要素也要进行移动,因为只有让两者一起进行移动,才能让人物和地图和其他的要素保持相对的位置。后期又加入了音效和美化了一下界面。
    二、方案该选题难题主要分为以下几点实现。

    实现了人物的动态移动效果。主要是使用了MyLibrary.py里精灵类来实现的,该类在继承pygame自带的基础类上,加入符合本游戏需要运作的相关代码。在主文件main.py中我使用了四个精灵去实现人物的移动:向左走、向右走、向左跳、向右跳。然后通过一些变量继承来让马里奥实现了在图上只有一个存在且能完成四个动作。但也因为我这样设计导致了后面难以使用Pygame的碰撞检测函数,改用了点坐标去判断,有点累赘。
    由于马里奥掉下坑和其他一些需要根据位图来判断地方和屏幕上直接绘图的数据时不同的。所以要实现人物移动的同时,要让地图、问号砖块、砖块、旗画在当前的屏幕上,以此必须要这些要素也实现相对的移动。当马里奥运行到屏幕中间时,屏幕会向左运动,而马里奥横坐标会固定在屏幕中间,以此形成一种马里奥在移动的错觉,其他的要素(问号砖块、怪物)也是在此条件下发现地图在进行相对移动时,这些要素也会进行向左移动,以此保证一种没有动的错觉。
    关于水管和其他三角形障碍物的判定,由于马里奥精灵是使用了四个精灵来实现的,所以使用pygame自带的碰撞检测的话也不是很好用,我就直接采用了点坐标判断的方式,为了能更直观的去写代码。
    在最后阶段,加碰砖块的特效、金币闪烁的特效,蘑菇出现的特效、所有的特效。这里也使用了精灵去实现特效。
    由于时间有限,最后并没有实现马里奥吃蘑菇变大和吃花变无敌的特效,很遗憾。

    三、关键技术关键技术分为以下几点:

    马里奥动态实现。马里奥动态实现时调用了四种不同的精灵去实现,根据键盘的不同反应会调用不同的精灵,以此实现了马里奥向左走、向右走、向左跳、向右跳的动态画面。这样写的好处是我可以实现空中变向和空中控制降落地点的原作没有的功能。
    碰撞检测。由于马里奥动态实现不是单个精灵的问题,这里是采用了点坐标判断的方式,也就是meetobstacle.py实现的代码相当多,数据也是很复杂。
    马里奥撞击问号砖块的判定问题和特效问题。也是有一个碰撞检测的函数去进行了判断,然后加载动画效果,再最后在原地方画上另外一种砖块。
    怪兽的移动、死亡、杀死马里奥。首先要实现怪物和马里奥之间相对距离随地图的改变而变化的问题,是地图移动时,怪物还是以一种原来的速度去移动。然后追加怪兽被踩时死亡效果和杀死马里奥的判定。

    四、结果和效果人物移动和跳跃的效果可能有点违和,没有实现原作的吃蘑菇升级功能和吃花无敌功能,额外实现了空中变向和可以玩家在跳跃时选择落地点的功能。






    五、总结和不足前两周的时候,我本来是打算实现超级马里奥,但发现运用c语言去实现的话问题会有很多,于是后来就选择了中国象棋。在稍微接触了一点Python和pygame的一些相关知识后,就决定用python去实现了这个之前有点遗憾的游戏。从结果上也可以看出,Python由于拥有功能更加完善和多样的库,所以使用Python去实现像超级马里奥之类的动作较多、场景较多的游戏是比C语言要更完善的。Python的库真的很多、很方便,利用好这些库的话,可以轻松实现C语言很难实现的功能。
    不足之处是没有考虑到将判定的坐标进行变量化,而是直接用数据去进行了判定,如果在一开始考虑到这点的话,可以很轻松实现马里奥吃蘑菇变大的功能,但由于写到结尾才发现这个问题,所以就没有实现这个功能,是我一个很大的遗憾。
    6 评论 241 下载 2019-02-22 18:04:00 下载需要13点积分
  • 基于JSP和MySQL的宠物网站设计与实现

    摘 要本系统是采用Java技术来构建的一个基于Web技术的B/S结构的宠物网站,该网站建立在Spring和Struts2框架之上,前台使用JSP作为开发语言,后台使用MySQL数据库管理系统对数据进行管理,开发环境选用MyEclipse,应用服务器采用Tomcat。
    宠物网站系统为广大用户实现便捷的购买宠物的功能,实现宠物商店的网络化管理。网站前台系统主要负责与用户打交道,实现用户的注册、登录、宠物预览、提交订单等功能。网站后台系统主要实现管理员登录、会员中心、新闻动态、完成订单、系统维护等功能。结果表明,本系统能够实现所需的功能,并且运行状况良好。
    本文分为六个部分。在绪论里首先分析了课题的研究背景与研究现状;第二章介绍了本系统开发采用的技术;第三章根据软件开发流程,对系统进行可行性分析和需求分析;第四章为系统概要设计,本章提出系统总体功能模块的设计,并对数据库的结构进行设计;第五章着重介绍各个功能模块的实现方案;最后,第六章介绍系统单元测试和性能测试的设计,以及对测试结果的分析。
    关键词:宠物商店网站系统;JSP;Mysql数据库;Spring和Struts2框架
    ABSTRACTThis system is constructed by Java based on a B/S technology Web structure of the pet website, the website based on Spring and Struts2 framework, the use of JSP as a development language, the background using the MySQL database management system to manage the data, with the MyEclipse development environment, application server using Tomcat.
    Pet website system for the majority of users to facilitate the purchase of pet functions, pet shops to achieve network management. Website front desk system is mainly responsible for dealing with users, to achieve the user’s registration, login, pet preview, submit orders and other functions. Website backstage system mainly realizes the administrator login, the member center, the news dynamics, completes the order, the system maintenance and so on. The results show that the system can achieve the required functions and run in good condition.
    This paper is divided into sex parts. In the preface, firstly analyzes the research background and research status of the topic; the second chapter introduces the development of the technology of this system; the third chapter according to the software development process, feasibility analysis and requirement analysis of the system; the fourth chapter is the system design, this chapter presents the design of the overall system function module, and the structure of the database design; the fiveth chapter emphatically introduces the realization scheme of each functional module; finally, the sixth chapter introduces the system design of the unit test and performance test, and the analysis of test results.
    Keywords: Pet Web System; JSP; MySQL database; Spring and Struts2 Framework
    1 绪论1.1 研究的背景和意义随着社会的进步,人民生活水平的提高,特别是近些年来,宠物以突飞猛进的速度进入到百姓家里,成为人们生活中重要娱乐内容之一。以前宠物只是贵族人的娱乐项目,迄今,我国已经把宠物作为一种生活的方式已得到普遍认可,伴随着人民精神文明的提高,越来越多的宠物已经和我们成为了好朋友。但是,我们该怎么和他们去相处,该怎么样去呵护他们,毕竟他们和人类还有很大的区别,我们应该给他们用什么样的东西?我们应该给他们吃些什么好呢?大多数人都不知道,他们只是简单的知道应该像照顾孩子一样去照顾他们,但是他们并不会说话,甚至有些人并不会把他们当作孩子来呵护!由此可见宠物商品的相关信息已经成为重要的话题。
    宠物作为我们人类的友好的朋友动物是我们人类获得快乐幸福与健康的一个重要来源,而且饲养宠物可以让人们的生活的更丰富多彩,更加幸福充实,同时陪着宠物运动对身体有很大好处能够有效的降低身体里血压和血脂,在当前越发竞争激烈的社会中可以提供良好的精神支持特别当我们遇到挫折时,我们可以通过与宠物的交流,调节我们的心情有助于我们的心理健康管理,缓解我们生活中遇到的各种压力从而提高工作上的效率。另一方面养可爱的宠物可以培养我们后代的责任心和爱心以及社会社交能力。当我们的孩子与狗狗愉快的玩耍时,狗狗可以传递许多正能量。而且最关键的是养宠物可以保护我们的家庭财产安全,可以起到家庭防止被盗窃保护作用使我们整个家庭有一种安全放心感。宠物也可以给我们以及后代带来无限的欢乐乐趣成为幸福和快乐的源泉,并能够帮助人们积极出去促进进行体育锻炼,给我们提供了许多人与他人相互沟通交流的机会。目前养宠物的人数增加的非常迅速,越来越多的宠物信息的网站应运而生。将传统宣传与日益成熟的网络宣传结合在一起,打造一个兼具传统和电子商务特色的宠物销售网站,极具意义。
    随着电子商务的发展趋势日趋成熟伴随着社会发展的必然如何面对电子商务方式、以及如何适应数字化生存并积极参与电子商务时代的国际竞争中取得良好的机会。这是关系到每一个公民、每个公司企业和部门及国家发展与生存的重要的战略问题,而且也是我们国家管理部门现在应该规划、并鼓励其大力发展的关键问题。
    目前随着我们的科学技术的不断的发展提高,我们的计算机科学水平日益发展成熟,它给我们带来的好处已被我们深刻了解,而且它已经在我们人类生活社会的各个领域范围内发挥着越来越关键的作用。这主要归功与因为计算机商品信息具有着多人工管理所不具备的优势,比如:检索迅速、查找方便、可靠性高、存储量大、保密性良好等。这些优势极大的提高了信息管理的速度,这也正是将来公司企业的科学化、正规化管理,和世界接轨的至关重要的条件。所以,我们急需研制出开发一套宠物商品网站系统对有效管理相关信息是非常必要的。
    1.2 国内外研究现状目前社会由于随着人们的生活水平的日益提高改善以及城市化速度的快速向前发展以及城市家庭规模的缩小,宠物慢慢的成为我们生活中的关键部分。根据一些资料显示,而今中国都市拥有宠物数目已经超过1亿只,并且其数量增加速度越来越快,如日中天的宠物市场行业热吸引了越来越多的人的关注!接下来我们将大概的阐述我国目前宠物行业的发展现状。由此带来的问题和建议以及发展前景。
    最近这些年计算机和互联网建设获得了高速的发展。在中国,互联网已经是广大人民生活的一部分。现在中国社会提倡互联网加,互联网与传统行业结合,以提供效益和竞争力。使用计算机和互联网对线上销售平台进行管理,它有着很大的价值。同时有着特有的功能比如:检索快速、查看方便快捷、效率高、成本低、存储数据量大、使用寿命长、并且沟通成本低等,这些优点能为商品销售提供极大的便利。而且只要销售网站设计合理,就可以为手机厂商添加新的销售渠道,减少手机产品的库存,利用网络的共享、互动的优点,结合实体销售的优点,借助数据库管理技术实现手机产品网上销售规范化、个性化、人性化。宠物主要是以狗、猫为主。我们以狗为例,现在为什么社会越来越多的人喜欢它而且愿意养它呢?狗起源于狼,目前已经得到了共识,但围绕着具体的发源地和时间则是众说纷纭。到目前为止,最早的狗化石证据是来自于德国14000年前的一个下颌骨化石,另外一个是来源于中东大约12000年前的一个小型犬科动物骨架化石。这不过养宠物对我们人类来说有诸多的好处,比如说以下几个方面:

    日常生活中我们可以和狗狗玩耍,增加许多生活中的乐趣
    当我们工作或学习一天后,带着浑身疲惫的回到家中,看见绕膝承欢的小狗后,一切烦恼忧愁不愉快都抛到到脑后。目前有很多老人,很多家里只有一个儿女,而且儿女长期在外地工作不在身边,养一个狗或猫,能够给老年人带来很大的精神寄托,减少他们孤独的感觉,重新帮助他们对生活的信心。
    宠物也可以帮助小的孩子一颗积极纯洁向上的心,而且根据有关资料显示,狗狗也对治疗儿童痴呆症和自闭症等疾病都有莫大的帮助,每年都有很多的志愿者,带着他们的自己的狗狗到孤儿院或儿童心理疾病治疗中心去帮助那里的孩子,给哪里的孩子带来了许多快乐。甚至连一些患有高血压或者心脏病的病人靠和狗狗和猫咪的交流玩耍可以降低血压和减少心脏病的复发。
    宠物在救援社会活动中也扮演着至关重要的角色
    狗狗在我们社会中扮演者原来越重要的角色,狗因为天生具有良好的嗅觉,它的嗅觉极其发达和灵敏,利用此特性可以发掘猎物,枪支,弹药等。有专门的警犬用于帮助警察破案,而且发挥着至关重要的作用。

    这些年来,由于数据仓库技术,网络信息技术,电子商务信息技术的飞速发展,可视化技术已经涉及到人们生活的各个部分,人们提出进一步定义数据可视化概念,特别注重在可视化大型数据库或数据仓库中的可视化。这是在非空间数据领域中应用可视化技术,使人们不需要束缚于通过关系数据表来研究和理解数据,而且在一个比较直观的方式下查询数据和相关结构之间的关系。在当今社会随着互联网的高速普及,电子商务成为热点,由于淘宝和京东的存在,商家传统的销售渠道受到了极大的挑战,利润降低并且销量下降,传统的模式的商家情况不容乐观。而在线网络销售网站比实体店铺具有更高的优势,只需要很少的人工和互联网环境就可以实现在线购物,用户可以直接从网上查看购买所需要的网络产品,同时网络销售网站提供了广泛和快捷的搜索途径,方便用户查找,分类精确,购物良好、风险小,完善了消费体验。所以手机销售网站受到传统模式企业的关注,并且纷纷开通在线手机销售网站。消费者在网站注册后可以浏览网站信息、按需要搜索网络产品、找到想购买的产拼后通过下定单实现用户的在线购买,使交易更加迅速、准确;管理员登录后可以管理用户、信息和定单等实现系统的更新维护。

    1.3 研究内容和步骤本文主要分为六个章节:

    第一部分为前言,主要介绍了课题背景、研究意义、国内外研究现状、课题的研究方法、技术路线以及本文研究的主要内容等
    第二部分为相关技术简介,主要介绍了JSP技术、MyEclipse、Tomcat、以及Oracle数据库等
    第三部分为系统分析,主要介绍了可行性分析、包括技术可行性、经济可行性、操作可行性等
    第四部分为需求分析,主要进行了系统的功能需求分析和非功能需求分析等
    第五部分为系统概要设计,主要介绍了系统设计过程
    第六部分为系统详细设计,对系统详细设计实现进行了介绍
    第七部分为测试,主要对系统功能进行了测试

    2 基本技术方案2.1 系统采用的技术2.1.1 JSP技术Jsp技术sun倡导并联合其它公司创建的动态生成HTML,xml或其他文档的技术规范,JSP是一门技术规范,也是一门脚本语言,在Jsp中我们可以使用特定语言即Java语言编写html,xml,以及其他文档的编写规范。


    Jsp拥有java语言的所有特性,列入面向对象,健壮,安全,可移植,高性能,多线程等
    Jsp运行与jsp的容器之中,比较典型的有tomcat
    在开发项目过程中,jsp文件会转换成servlet文件,servlet会在转换成相应的class文件
    多样化和功能强大的开发工具支持。Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下
    支持服务器端组件。web应用需要强大的服务器端组件来支持,开发人员需要利用其他工具设计实现复杂功能的组件供web页面调用,以增强系统性能。JSP可以使用成熟的JAVA BEANS 组件来实现复杂商务功能

    内部对象说明:request 客户端请求,此请求会包含来自GET/POST请求的参数; response 网页传回客户端的响应;pageContext 网页的属性是在这里管理; session 与请求有关的会话; application servlet正在执行的内容;out 用来传送响应的输出流; config 代码片段配置对象;page JSP网页本身; exception 针对错误网页,未捕捉的例外。
    2.1.2 JavaScript技术JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。JavaScript的一个重要功能就是面向对象的功能,通过基于对象的程序设计,可以用更直观、模块化和可重复使用的方式进行程序开发。在HTML基础上,使用Javascript可以开发交互式Web网页。JavaScript的出现使得网页和用户之间实现了一种实时性的、动态的、交互性的关系,使网页包含更多活跃的元素和更加精彩的内容。在本系统中很多地方使用了JavaScript技术,比如说,检验用户输入数据的有效性,是否重复,是否为空等等。
    2.1.3 Servlet技术Servlet是servlet加applet的缩写,applet是运行Java客户端中的小程序,java诞生的时候也就是因为applet而闻名于世,不过现在applet现在很少有人使用了,而servlet在不断的发展和更新之中,现在已经成为很多技术的基础比如spring和strutes2等等。Servlet本质上也就是JAVA类,所以在编写时要尊崇java规则,不过servlet与普通的java类也有所不同,比如说,它没有main方法,他是靠服务器所运行的,它的创建和销毁都是由它自己的容器说产生的。这里说的容器我们这的是类似于tormat服务器。有自己的servlet规则,因此他有一些普通java类所不具有的特性。Servlet与http是紧密联系的,所以使用servlet可以处理所有与HTTP相关的类容,这也是servlet广泛应用的原因之一。

    我的项目中几乎每一个JAVA文件都要用到servlet,其中我们使用到的最主要的方法为service(httpServlet Request,httpServletResponse)方法。

    通过request与response的来实现前台与后台之间的数据传输。我们可以在xml文件中配置servlet属性,其中servlet用来注册个servlet,而它有两个主要元素一个是servalet—name和servlet-class,前者用来定义servlet的名称,后者用来确定servlet的完全限定名,还有映射servlet-mapping标签。下面是servlet的主要流程图:

    Servlet的生命周期主要有service,init,destroy等。
    使用Servlet的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。Servlet是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2002年3月成为ASF的顶级项目。它通过采用Java Servlet/JSP技术,实现了基于Java EE Web应用的Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是MVC经典设计模式中的一个经典产品。它的优点在于:

    Servlet基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程
    使用OGNL进行参数传递
    强大的拦截器
    易于测试
    易于扩展的插件机制

    全局结果与声明式异常。
    2.2 基于B/S的WEB应用体系结构Web,全称为World Wide Web,缩写为WWW。Web有许多译名,诸如环球网、万维网、全球信息网等。简单地说,Web是一种体系结构,通过它可以访问分布于Internet主机上的超文本页面。这一说法包含以下两层含义:第一, Web是Internet提供的一种服务。 第二,Web是存储在全世界Internet计算机中、数量巨大的文档的集合,或者可以说,Web是世界上最大的电子信息仓库[7] [8]。
    Web上的海量信息是由彼此关联的文档组成的,这些文档称为主页或页面,它是一种超文本信息,使其联接在一起的是超链接。
    Web的内容保存在Web站点中,用户可以通过浏览器访问Web站点。因此,Web是一种典型的基于B/S的体系结构。
    工作过程:如下图2-1所示描述了Web的工作原理。

    客户端浏览器的主要作用是向Web服务器发出请求,当接到Web服务器传送回来的数据以后,对这些数据进行解释和显示[14]。浏览器以URL为统一的定位格式,使用超文本传输协议HTTP接收采用HTML语言编写的页面,其基本结构如下图2-2所示:

    用户通过键盘或鼠标发出请求,该请求由浏览器中的控制器接收、检查并分析用户输入,根据用户请求执行相应动作。如果用户请求可以在本机解决,例如浏览已存在本机的页面,则输出到HTTP解释器或其他解释器,解释后通过驱动程序送入显示器显示。如果用户请求不能在本机解决,则通过HTTP客户机或其他客户机及网络界面与远程服务器通信,由远程服务器解决用户请求,将用户需要的HTML文档送回,然后通过HTTP解释器或其他解释器,解释后通过驱动程序送入显示器显示。
    目前两大主流浏览器是Netscape公司的Netscape Communication(简称NC)和Microsoft公司的Microsoft Internet Explorer(简称IE)。在使用这两种浏览器运行HTML文档时,只需在地址栏中输人文件的URL即可。NC和IE这两大浏览器可执行的程序并不完全相同。
    2.3 MyEclipse简介MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括完备的编码、调试、测试和发布功能,支持HTML,Struts,JSP,CSS,Javascript,Spring,SQL,Hibernate[1]。
    在结构上,MyEclipse的特征可以被分为7类:

    J2EE模型
    WEB开发工具
    EJB开发工具
    应用程序服务器的连接器
    J2EE项目部署服务
    数据库服务
    MyEclipse整合帮助

    MyEclipse 是一个十分优秀的用于开发Java, J2EE的 Eclipse 插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。MyEclipse目前支持Java Servlet,AJAX, JSP, JSF, Struts,Spring, Hibernate,EJB3,JDBC数据库链接工具等多项功能。可以说MyEclipse是几乎囊括了目前所有主流开源产品的专属eclipse开发工具。根据官方最新消息,MyEclipse 2013已经正式发布!MyEclipse 2013支持HTML5、JQuery和主流的Javascript 库。随着MyEclipse 2013支持Html5,你可以添加音频、视频和API元素到你的项目,从而为移动设备创建复杂的Web应用程序。你甚至还可以通过HTML5 可视化设计器设计令人难以置信的用户界面。同时,随着MyEclipse 2013支持JQuery,你可以通过插件提升性能,并添加动画效果到设计中。myeclipse 10.0系列 主要 有以下 改进:

    首先在eclipse 3.7.2(Indigo) 基础上构建 ,最大的特色是 完全支持 Java EE 6,With MyEclipse 10, you can now take advantage of Java EE 6features, such as:

    Servlet 3.0JSF 2.0JPA 2.0EJB 3.1JAX-RS 1.1
    其他的改进:

    支持maven3.0支持 64-bit Windows supportWebSphere Portal Server 7 and WebSphere 8JRebel for MyEclipseEJB Deployment Descriptor EditorExtended DB2 SupportExtended Application Client Project SupportInstant Deployment (Experimental)EJB DeployJ2EE Connector Architecture (JCA)

    2.4 Tomcat简介Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
    诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为8.0.0-RC1 (alpha) Released。
    Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。
    2.5 Struts 2框架Struts 2是由出色稳定的struts1和webwork框架整合而来,吸取了两大框架的优点,提高了开发效率和规范性,减少了非常多的冗余代码,更好的实现了mvc架构,层与层之间的关系更加明确直接,解除了与servlet的强耦合性,无需启动服务器便可以进行单元测试,功能测试,极大的节约了我们的时间。是在 struts 1和WebWork的技术基础上进行了合并的全新的Sruts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
    Struts2的意义:

    自动封装表单提交数据:属性驱动,模型驱动。提高了开发效率和简洁性
    便捷的实现上传文件:fileUpload
    使网站通用于国内化:国际化
    通过配置完成表单验证:校验器
    强大的标签库:struts2标签库,OGNl标签库
    更科学的管理:使用xml文件管理程序文件对应的关系,使我们的维护更加的简洁更加的安全和更加的迅速
    更安全的操作:

    安全的线程机制:每个action都是独立的,在我们使用JSP和servlet开发的时候,由于servlet是单列模式,导致线程是不安全的,在编程的时候应多加注意,才能避免线程混乱的情况。而strut2的action对于每一个请求就会生成对应的一个实例,所以线程是安全的,简化了开发,安全性也提高了不少防止数据重复提交:token令牌机制,该机制可以有效的防止用户因网速或者电脑卡等因素导致的统一表单数据被重复提交了两次甚至更多遍的问题,比如说注册界面,用户在填写完信息后点击提交按钮,由于网络阻塞而导致的电脑卡顿现象,用户不耐烦有反复的点击提交按钮,导致重复提交的现象异常处理机制:通过配置来完成,更便于管理
    先进的编程思路
    面向切面编程:拦截器(相当于过滤器的一种,不编写重复的代码,减少代码的冗余

    servlet的主要流程图

    struts2的主要流程图

    可以看出在struts2中用filter代替了servlet的作用,这是struts2的核心思想。
    本项目中到struts2的核心程序段为:
    在web.xml中配置filter:
    <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping>
    Struts.xml的代码:
    !--该标签用于Struts默认行为标签 --><!-- 开发模式下使用,这样可以打印出更加详细的错误信息 --><constant name="struts.devMode" value="true" /><!-- 默认我们struts2的请求后缀是action,如果我们不配置该元素,我们至拦截action文件,如果我们配置了,可以拦截action/do的wenjian --><constant name="struts.action.extension" value="do, action"/><constant name="struts.multipart.saveDir" value="d:/test"></constant><constant name="struts.configuration.xml.reload" value="true"/><!-- 该标签为包标签,用于区分不同的请求文件标签 --><package name="admin" extends="struts-default" namespace="/admin"><action name="usersmanager" class="com.daowen.action.UsersAction"></action>
    对于Struts1框架而言,由于与JSP/Servlet耦合非常紧密,因而导致了一些严重的问题。首先,Struts1支持的表现层技术单一。由于Struts1出现的年代比较早,那个时候没有FreeMarker、Velocity等技术,因此它不可能与这些视图层的模版技术进行整合。其次,Struts1与Servlet API的严重耦合,使应用难于测试。最后,Struts1代码严重依赖于Struts1 API,属于侵入性框架。

    从目前的技术层面上看,出现了许多与Struts1竞争的视图层框架,比如JSF、Tapestry和SpringMVC等。这些框架由于出现的年代比较近,应用了最新的设计理念,同时也从Struts1中吸取了经验,克服了很多不足。这些框架的出现也促进了Struts的发展。目前,Struts已经分化成了两个框架:第一个是在传统的Struts1的基础上,融合了另外的一个优秀的Web框架WebWork的Struts2。Struts2虽然是在Struts1的基础上发展起来的,但是实质上是以WebWork为核心的。Struts2为传统的Struts1注入了WebWork的先进的设计理念,统一了Struts1和WebWork两个框架。Struts1分化出来的另外一个框架是Shale。这个框架远远超出了Struts1原有的设计思想,与原有的Struts1关联很少,使用了全新的设计思想。Shale更像一个新的框架而不是Struts1的升级。
    2.6 Spring框架Spring就是为了解决企业的复杂性而创建的,它的特性之一就是基于分层架构,分成架构可以让我们决定使用哪个组件而开发的,同时也为我们J2EE的开发创建了条件。Spring是一个轻量级级控制反转(ioc)和面向切面(aop)的容器框架,他主要是为了解决企业应用开发的复杂性而诞生的:它的目的就是为了解决企业开发的复杂性,它的主要功能为使用基本的JAVABEAN来代替EJB,并且他提供了更多的企业级应用功能,它的适用范围是JAVA的任何应用,spring不简单单的是服务器端的开发,从简单性,可测试性,低耦合性的角度而言,任何的java应用都可以从spring中受益,sping的核心是面向切面和控制反转,spring存在有它得天都后的优势:

    它定位的领域是许多framework而没有的,spring致力于一个统一的方法来管理你的业务对象
    spring是全面的和模块化的,sping是分层结构的,这意味着你可以使用孤立与它的任何一个成分,它的框架依然是内在的和稳定的
    它的设计是从底部帮助你易于测试的代码。Spring是测试驱动的理想的framework
    spring是潜在的一站式解决服务,定位与典型应用的大部分基础结构,当然它也设计到了其他framework所考虑到的内容

    Spring有以下优点:

    低侵入式设计,代码污染率极低
    write once,Run anywhere
    DI有效的降低了耦合度
    aop提供了通用任务的管理
    ORM和DAO简化了数据库的访问
    高度的开放性,并不强制,它的这种优点贯穿与表现层,业务层,逻辑层,在实际的开发过程中,并不强制依赖spring。作为开发者你可选择使用spring一部分框架或者全部框架来进行你的全部开发

    正因为SPRING有上述优点和好处,可以给我们带来很多的好处,例如:可以有效的解决组织中间层对象,还可以减少许多对单列模式的使用。可以使用统一的配置文件,易于单元测试以及促进良好的编程习惯,减少编程代价。
    spring特点:

    方便解耦,简化开发
    Aop编程的支持,通过aop的支持。我们很容易使用面向切面的过程
    声明式事务支持,通过spring框架中我们可以从单调烦闷的事务中解救出来,痛过生命是方式灵活的进行事务管理,从而提高开发效率和开发的质量
    方便程序测试,可以进行非依赖容器的方法进行所有的测试工作,再spring框架中车上不再时昂贵的操作,而是一个随手可作的事情
    方便集成各种优秀的框架,在spring中不排除各种框架的使用,而是降低各种框架的使用难度

    Spring的核心模块:

    核心容器(spring core)
    应用上下文(spring context)
    Aop模块(spring aop)
    Jdbc和DAO模块(spring DAo)
    对象实体映射(spring orm)
    Web模块(spring web)
    Mvc模块(spring web mvc)


    2.6.1 软件应用分层架构标准三层架构:

    数据访问层:主要是对原始数据(数据库或者文本文件等存放数据的形式)的操作层,而不是指原始数据,也就是说,是对数据的操作,而不是数据库,具体为业务逻辑层或表示层提供数据服务
    业务逻辑层:主要是针对具体的问题的操作,也可以理解成对数据层的操作,对数据业务逻辑处理,如果说数据层是积木,那逻辑层就是对这些积木的搭建。具体的讲主要负责对数据层的操作。也就是说把一些数据层的操作进行组合
    表示层:主要表示WEB方式,如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务。主要对用户的请求接受,以及数据的返回,为客户端提供应用程序的访问

    IOC(inversion of control) 是spring的核心,贯始至终。所谓IOC,对于spring框架来说,就是由spring来负责生命周期和对象间的关系。

    传统开发模式:对象之间相互依赖
    IOC开发模式:ioc容器安排对象之间的依赖

    Ioc的另外的名字叫做依赖注入(DepenDency Injection),所谓的依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入和控制反转(IOC)是从不同的角度的描述的同一件事情。就是只通过引入ioc容器,利用依赖关系注入的方式,实现对象之间的解耦。
    Ioc在对象过程中不会对业务对象构成很强的侵入性,使用ioc之后,对象之间具有更好的可实现性,可重用性和可扩展性:

    降低对象之间的耦合度
    提高开发效率和产品质量
    统一标准,提高产品的复用性
    模块具有热插拔特性

    aop专门用于处理系统中分布与各个模块中交叉关注点的问题,在JAVAEE的应用中,常常通过AOp来处理一些具有横切性质的系统级服务,如事务管理,安全检查,缓存,对象池管理等,aop已经成为一种非常常用的解决方案。
    普通处理方法

    spring处理方法


    Spring core(包含spring基本工具类,其它组件都会使用到这个包里的类,是其它组件的核心)
    Java bean(是所有都需要用到的,它包含了访问配置文件,创建和管理bean,以及控制反转和依赖注入操作)
    Spring aop(包含了使用aop特性时所使用到的类)
    Spring context(为spring的核心提供了大量的扩展,能够找到使用application context的全部类)

    优点:

    开发人员可以只关注整个结构中的其中某一层
    可以很容易的用新的实现来替换原有层次的实现
    可以降低层与层之间的依赖
    有利于标准化
    利于各层逻辑的复用
    结构更加的明确
    在后期维护的时候,极大地降低了维护成本和维护时间

    缺点:

    降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成
    有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码
    增加了开发成本

    2.6.2 Spring相关概念轻量级的容器
    spring容器帮我们管理业务逻辑层,里边有很多业务逻辑对象,有对象就有对象的生命周期的管理(创建,销毁)。
    轻量级:容器给予的业务逻辑对象多少种服务?spring给用户提供的服务完全由用户自己决定,spring想用什么服务自己开启使用。但是重量级的都是只要你用就把所有的服务都给你,不能自己定制。
    spring容器从来不能独立运行,一定借助于其他容器启动,或者借助web容器启动,或者ejb容器启动。
    特点:应用模块之间耦合度小,组件都是可重用的,都是各自打包的
    why spring?

    动态解藕,方便开发,面向接口设计:通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用
    方便程序的测试TDD(Test-Driven Development):可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情
    降低Java EE API的使用难度:Spring对很多难用的Java EE API(如JDBC、JavaMail、远程调用等)提供了一个简单的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低
    方便集成各种优秀框架:Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持
    AOP编程的支持: Aop(aspect-oriented programming )面向方面的程序设计,是一种比较新颖的编程思想,aop将程序分为两个部分,核心业务逻辑以及横向的业务逻辑。在spring中提供了丰富的业务支持,允许通过分离业务的业务逻辑和系统级的服务,进行类聚性的开发Aop是对oop的一种延续,也是对oop的一种补充,oop是一种静态的过程,而aop是一种动态的过程,aop的主要功能为系统级别的功能,列入:系统日志,性能统计,安全控制,事务处理,异常处理等等这些主要功能,将实现上述功能的代码从业务逻辑层中划分出来,将它们独立到非业务指导性的代码当中,处理这些代码的时候不影响其它代码的处理。使用切面代码我们可以将面向切面的代码植入程序,可以有效防止代码的混乱。Aop专门用于处理系统中分布于各个模块中交叉关注点的问题,在JAVAEE应用中,常常通过aop来处理一些具有横切性质的系统级服务,如事务管理,安全检查,缓存,对象池管理等等,aop已经成为一种非常常用的解决方案。Aop代理其实是由aop动态生成的一个对象,该对象可作为目标对象使用,aop代理所包含的方法与目标对象方法如下图所示:



    声明式事务的支持:在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量
    对异常的处理方式,所有的都转换成Unchecked的
    它不是一个一体化的解决方案
    良好的设计,容易扩展,很多可重用的组件

    2.6.3 Spring核心组件(我们主要学习的是IOC和AOP模块)
    Spring Core(IOC) 核心容器,提供组件的创建、装备、销毁
    Spring Context Spring上下文,是一个接口ApplicationContext(继承自BeanFactory接口)的实现
    Spring Web容器,web应用上下文,是webApplicationContext接口的实现
    Spring DAO容器,是SpringDAO 支持模块,是为了简化DAO的使用
    Spring ORM
    Spring AOP ,对AOP编程支持的模块 [面向切面编程,扩展功能不是修改源代码实现]
    Spring MVC,类似于Spring表示层的一个框架

    2.6.4 spring ioc(must)
    IOC:Inversion of Control 控制反转
    一种说法:对象之间的依赖关系,由容器在运行时依据配置文件动态的建立
    另一种说法:对象的控制器转移了,转到外部容器了,避免了代码的纠缠,代码更容易被维护,模板之间的耦合性降低,容易测试

    比如:有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象。
    ioc是把对象的创建不是通过new方式实现,而是交给spring配置创建类对象。IoC 控制反转意味着将你设计好的类交给容器去控制,而不是在类的内部进行控制,即控制权由应用代码中转到了外部容器
    IoC包括两部分内容:

    DI:Dependency Injection依赖注入,组件不做定位查询,只提供相应方法,由容器创建对象,并调用相应方法设置所需对象需要的组件
    (不要求)DL:Dependency Loopup依赖查找,容器创建对象并提供回调接口和上下文环境给组件,需要时通过接口从容器中查找对象依赖查找,现在使用不太多。(EJB使用的更多,将对象创建好后,放到容器中)

    IOC解决:对象谁来创建的问题
    DI解决:对象间的关系如何建立的问题。
    org.springframework.beans及org.springframework.context包是IOC容器的基础。
    3 系统需求分析3.1 功能需求分析当我们对已有系统进行分析时,通过分析系统的功能和实现去确定系统的即将要达成的目的。因此,我们要收集足够的信息去验证我们的分析结果,在该次毕设中,我们获取的信息大多都是从网上,书库中了解到的。在任何的实践中获取的信息其实才是最可靠,最具有说服力的信息,所以,我们找到其他的宠物用品店,然后注册成为会员来获得有用信息。
    从用户角度来看:用户同时使用网站的注册登录功能,进入系统后可以获得一部分功能。在处理消息时,可以进行对宠物资料的浏览,进行购买宠物用品然后对订单进行单个购买或者取消,同时也可以清空购物车中的所有订单,或者全部进行结账等功能。
    从网站的角度看:

    网站应该包含宠物搜索功能
    订单处理功能,确认订单方式:

    电话通知方式E-mail方式
    管理员管理:其任务是查看用户订单,查看用户信息,并在根据查看了用户的信息和用户订单之后,将商品的发送到购买者的身边
    宠物浏览

    宠物名 宠物类型价格订购号

    通过分析,系统主要分为前台和后台两大模块,前台主要由用户体验使用,实现了用户登录、注册、查找商品、商品类别等功能导航;后台主要由系统管理员操作使用,用来维护系统,管理员主要实现了订单管理、商品管理、公告管理、会员管理、用户管理、个人信息维护等主要功能。

    3.2 系统设计规则无论哪个网站都要有它自己的设计规则。该系统也一样,它的主要设计规则有:

    简单性:在实现系统的功能的同时,尽量让系统操作简单易懂,这对于一个系统来说是非常重要的
    针对性:该系统设计是宠物商店网站系统及后台管理的定向开发设计,所以具有专业突出和很强的针对性
    实用性:系统接受来自系统管理员的请求,管理员可以对商品信息以及用户信息进行增、删、改、查等操作,具有良好的实用性

    3.3 系统的可行性分析3.3.1 技术可行性硬件可行性分析
    系统的硬件要求方面不存在特殊的要求,只需要在普通的硬件配置就能够轻松的实现,只是需要确保系统的正常工作即可,以及拥有较高的效率。如果有特别低的硬件,它可以导致系统的低性能以及效率低,从而导致整个系统的运行不顺畅。以目前普遍的个人计算机的配置而言,这是十分容易实现的 。因此,本系统的开发在硬件方面是可行的。
    软件可行性分析
    Java语言提供了一个共同的机制类似的借口动态模型,设计更集中。另外,在使用Java语言可以很容易实现模块化和存储信息。此外,代码复用,也可以很好的体现。因此,考虑到系统的实际情况,选择JAVA作为本系统开发语言的时候。通过上述分析,该系统的设计实现在软件方面是可行的。
    3.3.2 经济可行性如今是信息化时代,信息化管理可以使宠物商品管理工作更加系统化、快速化、全面化。这样可以为企业带来较高的工作效益和经济效益,在提高工作效率的基础上,可以考虑减少工作人员的数量,本系统对计算机配置的要求不高,企业机房更换下来的低配置电脑都可以完全满足需要,再者,企业在管理工作上的高效率和便捷性远远超过了开发本系统的成本,所以在经济上具有完全的可行性。
    3.3.3 操作可行性系统的登录界面简单和友好,采用常见的界面窗口的登录界面,而系统的开发则采用的是较为常用的JSP技术。这些策使得用户不需要很长的时间就能够快速熟悉系统,并掌握系统的操作方法。此外,为了方便系统管理维护人员,用户登录系统后会给出了一些提示,使得整个系统更加人性化,用户操作更简单方便。
    3.3.4 技术可行性分析本次宠物用品店系统的开发采用了java,jsp作为语言,采用了servlet,javaBeans技术,sqlserver2008作为数据库,Web服务器的选择是tomcat7.0。这次的开发对于一个即将毕业的我来说是一项复杂的系统工程。但是上述所用到的语言,我们在大学期间都有所接触过,在杰普基地实习的时候也都有所接触,所以很容易着手进行开发,但是为了保证系统开发的成功,我们只能采用工程化的系统开发方法,并且可以适当的研究有些符合标准的开发方法,并研究出一些符合工程化标准的开发方法。新研究出来的开发方法是为了加快系统开发的速度,在保证质量的同时尽可能的去降低开发的成本。对于任何一个物件来说,在质量有所保证的情况下,所消耗的资源越少越好。
    3.3.5 运行可行性分析现在的生活中计算机已经普遍到每个家庭的生活当中,自然也就越来越多的人掌握了使用计算机的基本使用方法和技能。因此,在这个信息时代中,必定会有越来越多的人利用网络足不出户就可以享受购物的便捷性,让人们可以更快的了解到自己的需求。
    3.3.6 经济可行性分析宠物食品店系统给人们带来了方便,成为一种全新的商务模式。因此,不用出门就可以在家购买宠物食品的新时尚已经到来,构建一个宠物食品店系统在经济上是完全可行的。就本系统而言,随着宽带网络进入校园,为宠物主在网络上进行购物提供有利的条件。商家可以从中获得利润,两全其美。通过以上的分析,开发宠物商品店系统是完全可行的。
    3.4 运行环境本系统是一个web版的应用程序,需要在服务器上部署中间件Tomcat、Oracle数据库,其他的客户端通过网络进行访问该服务器即可。

    开发硬件平台
    CPU:酷睿双核 3.2GHZ内存:4G以上硬盘:320GB

    服务器端硬件平台

    Web服务器参考配置:Intel Xeon Quad Core E5530 80W 2.40GHz/5.8GT/8MB Cache, 2x2GB DDR3-1066MHz, 2.5in HS 146GB SAS,HS 675W PSU, ServeRAID MR10i(RAID 5), 2*Giga Ethernet,Light Path, CD-RW/DVD Combo, 1U,3 Years Onsite Next Business Day. 146GB 10K 6Gbps SAS 2.5” SFF Slim-HS HDD x3550M2/x3650M2/HS22数据库服务器参考配置:Intel Xeon Quad Core E5504 80W 2.00GHz/4.8GT/4MB Cache, 2x2GB DDR3-800MHz, 2.5in HS 146GB SAS, 670W PSU, ServeRAID BR10i(RAID 0,1), 2*Giga Ethernet, DVD ROM,5U,3 Years Onsite Next Business Day. 146GB 10K 6Gbps SAS 2.5” SFF Slim-HS HDD x3550M2/x3650M2/HS22

    开发软件平台
    操作系统:Windows7以上均可数据库:mysql

    4 宠物网站系统概要设计4.1 系统功能结构图系统主要分为前台和后台两大模块,前台主要由用户体验使用,实现了用户登录、注册、查找商品、商品类别等功能导航;后台主要由系统管理员操作使用,用来维护系统,管理员主要实现了订单管理、商品管理、公告管理、会员管理、用户管理、个人信息维护等主要功能。系统功能图如下图5-1所示。

    4.2 系统交互图系统架构类的工作流程:

    当用户在jsp页面输入了相应的信息后,对象会根据用户的请求向请求业务处理类处理数据
    当业务处理类收到相应的请求后,会向相应的权限管理类对象发送验证请求
    通过权限管理类验证过后会把相应的验证权限结果返回给相应的业务代理类
    业务对象会根据接受到不同的验证权限结果进行两部不同的处理操作:若权限不符,这返回到相应的JSP用户界面,若权限相符,则进行到相应的业务逻辑类
    业务逻辑类的业务对象进行相应的业务处理。在业务处理中的数据持久化操作,靠访问数据库访问类进行操作,可以进行读取,写入等操作,期间若发生任何的异常,交给异常处理类来完成
    业务代理对象类最后将最终结果返回给jsp用户界面

    系统交互图如下图5-2所示:

    4.3 数据库设计在概念设计中,通常用下面的四种方法:

    自顶向下:把全局概念结构的框架定义好,之后再慢慢细化
    自底向上:把各局部应用的概念结构定义好,之后把他们再集合起来,最后得到全局的概念结构
    逐步扩张: 首先把概念结构里最核心的地方定义好,之后再向外面扩充,最后直到总体概念结构
    混合策略: 把自顶向下和自底向上两种相结合,设计一个全局概念,使用自顶向下的策略。结构的框架,设计的各局部概念结构,以它为骨架集成,使用自底向上的策略

    在物理结构设计阶段,首先应该分两步走:

    一是在关系数据库中,确定数据库的物理结构,主要是指存取方法和存储结构。时间和空间效率是对物理结构的评价
    二是要选取存取方法,并且是正确的关系模式,存取索引方法、聚簇存取、HASH存取方法等都是常用的方法。

    数据库的概念设计整体属性E-R图如下图5-3所示:

    宠物商店网站系统ER模型中的实体转换为物理表,得到物理表结构部分如下:
    宠物信息表book:表中显示了关于宠物的所有详细信息,对于字段的属性也有详细的描述。可以很明显的看出表中的内容显示的是哪方面的信息。



    列名
    数据类型
    长度
    允许空




    id
    int
    4



    name
    varchar
    50



    pic
    varchar
    50



    author
    varchar
    50



    chubanshe
    varchar
    50



    price
    varchar
    50



    leibie
    varchar
    50



    dise
    char
    10



    dazhe
    char
    10



    tuijianchengdu
    varchar
    50



    store
    int
    4



    flag
    char
    10



    addtime
    varchar
    50



    管理员表admin:表中显示了管理员的属性信息。表中的字段就是管理员所拥有的详细信息。



    列名
    数据类型
    长度
    允许空




    id
    int
    4



    name
    varchar
    50



    password
    varchar
    50



    addtime
    varchar
    50



    宠物类型表booktypes:



    列名
    数据类型
    长度
    允许空




    id
    int
    4



    type
    varchar
    50



    addtime
    varchar
    50



    用户注册表users:



    列名
    数据类型
    长度
    允许空




    id
    int
    4



    login
    varchar
    50



    password
    varchar
    50



    name
    varchar
    50



    sex
    char
    10



    email
    varchar
    50



    tel
    varchar
    50



    jibie
    float
    8



    定单详细信息表orderbook:



    列名
    数据类型
    长度
    允许空




    id
    int
    4



    number
    varchar
    50



    bookid
    int
    4



    shuliang
    int
    4



    定单表num:



    列名
    数据类型
    长度
    允许空




    id
    int
    4



    number
    varchar
    50



    name
    varchar
    50



    flag
    char
    10



    4.4 系统概要设计4.4.1 系统的前台系统的界面按照常规的WEB界面进行设计,设计的原则是界面友好,易于操作,容易上手,尽可能的贴切用户实际。系统主页界面如下图5-4所示。
    狗狗商城

    热卖商品推荐

    精品推荐

    所有的用户都可以进入该首页,想要使用购买商品等功能,需要进行登录操作,登录时需要输入用户名、密码进行验证,通过之后才能使用这些功能。系统登录功能界面如图4-5所示:
    系统登录界面图

    购买界面图

    订单信息图

    4.4.2 系统的后台系统后台登录界面图

    会员管理界面图

    网站后台管理菜单

    商品管理界面图

    5 系统的详细设计与功能实现5.1 应用层配置系统采用目前流行的Struts2框架进行开发。先来看看Struts2框架是如何配置到应用程序中的。在WEB-INF/web.xml文件的配置代码如下:
    < <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="myRequestParser" class="com.daowen.util.RequestParseWrapper" scope="default" optional="true" /> <package name="admin" extends="struts-default" namespace="/admin"> <action name="usersmanager" class="com.daowen.action.UsersAction"> </action> <action name="friendlinkmanager" class="com.daowen.action.FriendlinkAction"> </action> <action name="jiaodiantumanager" class="com.daowen.action.JiaodiantuAction"> </action> <action name="sysconfigmanager" class="com.daowen.action.SysconfigAction"> </action>
    5.2 登录功能的实现
    public class LoginAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { response.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); List userlist=null; Session s=HibernateSessionFactory.getSession(); Transaction t=s.beginTransaction(); String username=request.getParameter("username"); String password=request.getParameter("password"); String action=request.getParameter("action"); System.out.println("action="+action+"username="+username+"password="+password); SQLQuery query=s.createSQLQuery("select * from [users] where username='"+username+"'"); userlist=query.list(); String s1=""; if(!userlist.isEmpty()) s1="res=true"; else s1="res=false"; System.out.println("json="+s1); response.getWriter().write(s1); }
    5.3 注册功能的实现
    <script src="<%=SystemParam.getSiteRoot()%>/webui/jquery/jquery-1.5.2.min.js" type="text/javascript"></script> <script type="text/javascript" src="<%=SystemParam.getSiteRoot() %>/webui/jquery/jquery.validate.min.js"></script> <script type="text/javascript" src="<%=SystemParam.getSiteRoot() %>/webui/jquery/jquery.metadata.js" ></script> <script type="text/javascript" src="<%=SystemParam.getSiteRoot() %>/webui/jquery/messages_cn.js" ></script> <script type="text/javascript"> $(function(){ $.metadata.setType("attr","validate"); $("#form1").validate(); })
    5.4 商品管理功能的实现
    <tr> <td align="right">商品编号:</td> <td><input name="spno" validate="{required:true,messages:{required:'请输入商品编号'}}" value="${requestScope.shangpin.spno}" class="input-txt" type="text" id="spno" /> </td> </tr> <tr> <td align="right">商品类别:</td> <td><input type="hidden" name="sptype" /> <input type="hidden" name="sptypeid" /> <web:dropdownlist id="sptype" cssclass="dropdown" value="${requestScope.shangpin.sptypeid}" datasource="${sptype_datasource}" textfieldname="mingcheng" valuefieldname="id"> </web:dropdownlist></td> </tr> </div>
    5.5 订单管理模块的实现订单管理模块主要实现管理员对进行中的订单、历史订单信息的查询,进行退款、拒绝、介绍并发货等操作。订单管理模块如图6-2所示。

    <link href="<%=SystemParam.getSiteRoot() %>/webui/treetable/skin/jquery.treetable.theme.default.css" rel="stylesheet" type="text/css" /> <script src="<%=SystemParam.getSiteRoot() %>/webui/treetable/js/jquery.treetable.js" type="text/javascript"></script> <script src="<%=SystemParam.getSiteRoot() %>/webui/combo/combo.js" type="text/javascript"></script> <script type="text/javascript"> $(function() { $(".ui-record-table").recordTable(); $("#btnDelete").click(function(){ if($(".check:checked").length<1) { $.dialog.alert("请选择需要删除的记录"); return; }
    5.6 会员管理模块的实现
    <head><title>会员信息</title><link href="<%=SystemParam.getSiteRoot()%>/admin/css/common.css" rel="stylesheet" type="text/css" /><link href="<%=SystemParam.getSiteRoot()%>/admin/css/web2table.css" rel="stylesheet" type="text/css" /><script type="text/javascript" src="<%=SystemParam.getSiteRoot()%>/webui/jquery/jquery-1.9.0.js"></script><link href="<%=SystemParam.getSiteRoot()%>/webui/artDialog/skins/default.css" rel="stylesheet" type="text/css" /><script src="<%=SystemParam.getSiteRoot()%>/webui/artDialog/jquery.artDialog.source.js" type="text/javascript"></script><script src="<%=SystemParam.getSiteRoot()%>/webui/artDialog/iframeTools.source.js" type="text/javascript"></script>
    6 测试与性能分析6.1 系统测试目的与意义6.1.1 测试的重要性不管是什么技术,以及如何使用的方法,但该软件,该软件将仍然是放错了地方。减少引入的错误,您可以使用新的语言,先进的开发方法,改进开发过程,但这是不可能完全消除软件错误,由于需要进行测试,以找出引入的错误,你必须通过测试误差估计密度在软件中。对于可行性研究而言,其任务就是用最低的代价在最短的时间内做出一个判断当前系统实现后的价值。为了避免在花费了大量的资源之后才发现该功能的实现完成不了或者完成了之后也没有多少实用性的价值。从而造成更多的浪费。
    所有工程学科的基本单元是一个测试,这是软件发展的一个非常重要的组成部分。测试陪同,从编程本身的日子。统计显示,在一个典型的软件开发项目,往往占总工作量的测试软件的软件开发工作量的40%以上。但成本为这个测试是30%至50%的软件开发总成本的。如果考虑把维护阶段包含在内,在讨论整个软件的生存期时,有所降低的也许是测试的成本比例,但维护工作,实际上是相当于第二次的开发,甚至是多次开发,许多测试工作也一定包含在其中。这次的开发对于一个即将毕业的我来说是一项复杂的系统工程。但是上述所用到的语言,我们在大学期间都有所接触过,在杰普基地实习的时候也都有所接触,所以很容易着手进行开发,但是为了保证系统开发的成功,我们只能采用工程化的系统开发方法,并且可以适当的研究有些符合标准的开发方法,并研究出一些符合工程化标准的开发方法。新研究出来的开发方法是为了加快系统开发的速度,在保证质量的同时尽可能的去降低开发的成本。对于任何一个物件来说,在质量有所保证的情况下,所消耗的资源越少越好。
    在实践中,因为还有一个感知测试这是不正确的和错误的态度,难以在软件测试往往过高或敷衍,现在的生活中计算机已经普遍到每个家庭的生活当中,自然也就越来越多的人掌握了使用计算机的基本使用方法和技能。因此,在这个信息时代中,必定会有越来越多的人利用网络足不出户就可以享受购物的便捷性,让人们可以更快的了解到自己的需求。
    包括:

    假设测试,也很难带来成就试验人员从某种意义上说,作为设计和编码一样容易取得进展: 那个戒指是不是建立在自然破裂,找到软件错误作为测试的目标,他们负责的负面测试工作中发现错位
    测试可以不感兴趣,沉闷
    测试工作是困难的,艰苦的工作

    准备他们的信心盲目的过程,发现错误后,所表达的意见对他们的发展能力的担忧。 软件测试,这种观点是不赚钱,提高软件产品的质量,必须澄清认识,态度。
    6.1.2 测试的目的如果你说,要找出尽可能测试的目的是错误的,那么测试应直接向软件的一部分,是更复杂或更错误之前。
    该过程发现错误和软件测试的执行情况;该测试是为了证明其中的一个节目,而不是没有错误的认证程序;这就是它没有被发现的错误,这是一个很好的例子 ,发现一个测试没有找到一个成功的测试。
    为了测试错误,因为这个视图的中心可以提醒人们,而不是正常运作的演示软件。但可能会非常棘手,真的只是给这纯粹是为软件测试是为了发现错误,找不到错误的测试,其实不是这样的。
    首先,测试,而不是目的只是为了找到错误。但是,因误差分析和分配可以帮助项目经理更好的软件过程发现现在是在一个残疾的存在使用,以方便日后的改进。在同一时间,根据该分析还可以帮助我们设计的目标检测方法,以提高测试的效率。其次,没有在测试中发现的错误也是有价值的评估试验的质量的方式来完成测试。
    6.2 测试环境
    WIN7 64位
    FireFox
    TOMCAT6
    JDK1.6

    6.3 测试过程在测试之初,由于将数据库中的数据是随便输入,没有实用性,为了使系统更加完善,在系统测试的过程中,本系统将一开始编程随便输入的数据全部清理后,输入了一些有效的测试数据,这样可以更真实的反映系统的功能实现情况。
    测试的每个步骤在逻辑上与前一个步骤都有关联。准确来说是上一个步骤的继续。每个模块写的是不同的功能,多个模块,就相对于多个功能组成了一个系统,而多个小的系统组成了一个大型的系统,所以,大型的软件系统的测试是分布进行的,就类似如下所述:

    模块测试:该测试中发现的一般是编码和详细设计的错误
    系统测试:该测试中发现的一般是软件设计中的错误,也可能发现需求说明中的错误
    验收测试:该测试中发现的一般是系统需求说明书中的错误

    这样不断发现问题,经过反复的测试、调试,把问题一个个的解决,最终系统可以正常运行。
    6.4 测试的主要内容及结果6.4.1 单元测试单元测试是检查每个软件中单位最小的,通过检测去发现原来定义该模块的功能说明和本身所需要实现的实际的功能是不符合要求的状况,或者检测出模块的错误。
    身份认证时候要保证在以下输入情况时候系统能够健康运行:

    输入的用户ID:不存在
    输入的用户ID:重复
    输入的用户ID:输入信息为空。
    输入的用户ID:与密码不相符合
    输入的用户的信息 格式不正确

    测试结果:注册测试:输入的错误信息符合要求。



    模块名称
    测试用例
    预期结果
    实际结果
    是否通过




    登录模块
    用户名:null 密码:null
    弹出错误提示,请输入用户名
    登录失败,提示请输入用户名
    通过


    登录模块
    用户名:m1 密码:null
    弹出错误提示,请输入密码
    失败,提示输入密码
    通过


    登录模块
    用户名:m1 密码:1
    弹出错误提示,用户名或者密码错误
    登录失败,提示用户名或者密码错误
    通过


    商品管理模块
    添加商品信息后提交
    添加成功
    录入成功
    通过


    用户密码修改
    随意一个用户登录,修改密码
    修改成功,退出后用新密码登录,并登录成功
    修改成功
    通过



    总结与展望本文主要阐述了如何利用JSP技术的Struts2框架开发一个性能优化、可扩展性强和安全可靠的宠物商店管理系统。系统主要分为前台和后台两大模块,前台主要实现了用户登录、注册、查找商品、商品类别等功能导航;后台主要实现了订单管理、商品管理、公告管理、会员管理、用户管理、个人信息维护等主要功能。然后根据这些功能进行分析设计,对所有到的技术Struts2框架就行简要的介绍。接着进行需求分析的描述。接着是概要设计和详细设计。描述这个系统的部分功能的实现方案及过程。
    本设计所实现的是一个宠物商品系统,主要介绍了JSP,Struts2技术。系统按照总体设计、数据库设计、各个模块设计和代码分析,宠物商品系统的基本功能已得到实现。由于时间及本人所学有限,该系统还有许多地方需要改进,并且还有许多自己未起到的功能,本人会在以后的学习过程中进一步加强和完善。
    本系统具有以下优点:

    该系统可以运行在多个操作系统平台(Windows 7和Windows 8),数据库采用mysql,开发语言选择Java,可移植性好
    系统的用户权限进行划分,分为会员用户和管理员,不同的用户具有不同的操作权限。这不仅方便了用户,也保证了系统的安全性
    该系统界面简单,操作方便,容易使用

    但也存在以下缺点:

    界面跳转复杂,接口不能被刷新,可以改进
    功能比较简单,没有进一步提高一些选修的程序等,不能更好的为用户提供服务
    数据库设计有冗余,需要进一步优化

    参考文献[1] 刘志诚.JSP程序设计实例教程.北京:人民邮电出版社,2009.5
    [2 ] 孙卫琴.精通Struts:基于MVC的JavaWeb设计与开发.北京:电子工业出版社,2004.11
    [3] 李刚.整合Struts+hibernate+Spring应用开发详解.北京:清华大学出版.
    [4] 张桂元、贾燕枫.Struts开发入门与项目实践.北京:人民邮电出版社,2005.12
    [5]孙卫琴.Tomcat与Java Web开发技术详解.北京:电子工业出版社,2003.11
    [6] 吴其庆.Java模块设计实例经典.北京:冶金工业出版社2004.6
    [7] 刘斌.《精通Java Web整合开发》,电子工业出版社,2007.11
    [8] [美]Rogers Cadenhead. Java编程入门经典.梅兴文译.第4版.北京:人民邮电出版社,2007
    [9] 赵文靖.Java程序设计基础与上机指导.北京:清华大学出版社,2006
    [10] 赵毅.跨平台程序设计语言——Java.西安:西安电子科技大学出版社,2006
    [11] 王路群.Java高级程序设计.北京:中国水利水电出版社,2006
    [12] 雍俊海.Java程序设计习题集.北京:清华大学出版社,2006
    [13] 朱福喜.Java语言习题与解析.北京:清华大学出版社,2006
    [14] 吴其庆.Java程序设计实例教程.北京:冶金工业出版社,2006
    2 评论 24 下载 2020-08-02 13:20:38 下载需要13点积分
显示 0 到 15 ,共 15 条
eject