分类

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

资源列表

  • 基于JAVA和SQL SERVER实现的图书借阅管理系统

    1 引言1.1 课程设计目的按照关系型数据库的基本原理,综合运用所学的基本知识,设计开发一个小型的管理信息系统。通过对一个实际问题的分析、设计与实现,将原理与应用相结合,使学生学会如何把书本上学到的知识用于解决实际问题,培养学生的动手能力,另一方面,使学生能深入理解和灵活掌握教学内容。
    1.2 本选题的设计背景当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。
    尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好图书馆信息而设计的。
    图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,现今己有很多图书馆都配备了图书借阅管理系统(在高校图书馆尤为常见),方便读者对所需图书的查找借阅及管理员对图书的管理。据调查,在未引入图书借阅管理系统之前,图书馆对信息管理的主要方式是基于文本、表格等纸介质的手工处理,对于图书借阅情况(如借书天数、超过限定借书时间的天数)的统计和核实等往往采用对借书卡的人工检查进行,对借阅者的借阅权限、以及借阅天数等用人工计算、手抄进行。数据信息处理工作量大,容易出错;由于数据繁多,容易丢失,且不易查找。总的来说,缺乏系统,规范的信息管理手段。因此,随着技术的发展,开发适合图书馆自身情况的图书借阅管理系统便成了一种趋势。本课设就是在这样的背景下,参考多数高校的图书借阅管理系统而进行开发的。
    1.3 相关技术介绍1.3.1 数据库技术介绍数据库技术是信息系统的一个核心技术。是一种计算机辅助管理数据的方法,它研究如何组织和存储数据,如何高效地获取和处理数据。是通过研究数据库的结构、存储、设计、管理以及应用的基本理论和实现方法,并利用这些理论来实现对数据库中的数据进行处理、分析和理解的技术。即:数据库技术是研究、管理和应用数据库的一门软件科学。
    1.3.2 Java开发技术Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点,可编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等项目,是当前使用最广的计算机语言之一。
    1.3.3 面向对象编程技术面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。Java开发技术就是属于一种面向对象编程的技术。
    1.3.4 软件需求分析技术软件需求分析就是把软件计划期间建立的需求可行性分析求精和细化,分析各种可能的解法,并且分配给各个软件元素。需求分析是软件定义阶段中的最后一步,是确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。
    1.4 项目开发环境与工具
    系统开发环境:Windows 10
    编程开发语言:Java
    Java JDK版本:JDK 1.7
    编译软件: Eclipse
    数据库软件:SQL Server 2014

    2 需求分析2.1 信息需求
    用户信息

    用户ID(ID)用户名(Username)用户密码(Password)用户权限(Power)
    书籍信息

    书籍ID(BookID)书名(BookName)出版社(Press)作者(Author)地址(Address)出版日期(PressDate)价格(Price)备注信息(Com)书本数目(books_count)被借数(borrowed_count)
    书籍借阅信息

    借阅序列号(ID)用户ID(ID)学生姓名(StudentName)书籍ID(BookID)书名(BookName)归还日期(ReturnDate)借书日期(BorrowDate)备注信息(Com)是否已归还(Is_Returned)

    2.2 系统需求概述设计图书馆信息管理系统要考虑的问题很多。本程序的实例对实际系统作了适当的简化。需求概述如下:

    系统能对书籍信息进行管理。书籍的信息包括:书籍名称、出版社、作者、出版社地址、出版日期、价格、书籍数量、书籍借出数量。书籍管理功能包括:添加书籍、修改书籍信息、删除书籍。添加书籍时,可设定新书数目,几本完全相同的书籍作为一条记录管理
    系统不需要管理借阅者除姓名外的信息。对每一名借阅者最多可借阅的书籍数目不做限定
    借书时,管理人员记录借书者ID、借书者姓名、书籍ID、借阅书籍名称和借阅日期
    还书时,管理人员记录还书者姓名、归还书籍名和还书日期。系统暂时不设定书籍的最长借阅时间
    操作人员可以根据书籍名称、作者、出版社三者之一或者三者的任意组合查询书籍信息。系统暂时不具备模糊查询的功能
    操作人员可以查询借阅某书籍的所有借阅者姓名;也可以查询借阅者借阅的所有书籍名称;还可以根据借阅者姓名、书籍名称查询借阅者的借书时间、还书时间
    系统由图书馆工作人员操作、图书馆工作人员分为系统管理员、书籍管理员和学生三类。系统管理员具有所有操作权限;书籍管理员具有书籍管理、查询信息权限但不具备管理借书还书事宜及管理用户权限;学生具有管理借书还书、查询信息权限,但不具备管理书籍和用户的权限
    系统管理员负责管理系统用户,可以增减用户、修改用户密码和删除用户
    所有操作人员凭账号和密码登陆系统

    2.3 功能需求
    用户管理:该功能又包含以下三项子功能:

    用户登录添加用户修改用户密码删除用户
    书籍管理:书籍管理功能包括以下三项子功能:

    添加书籍修改书籍删除书籍
    借书管理:该功能包括以下两项子功能:

    书籍出借出借信息修改
    还书管理:该功能包括以下两项子功能:

    书籍还入书籍还入信息修改信息查询:该功能包括以下三项子功能:书籍信息查询借阅信息查询系统用户列表

    2.4 安全性与完整性需求
    实体完整性约束:关系中的主属性不能为空,在数据库中使用Primary Key实现
    参照完整性约束:读者与书籍、出版社与书籍、读者与读者身份、借还情况与读者和书籍表之间采用级联更新和级联删除
    用户自定义的完整性约束:规定姓名、书名和借书日期不为空
    设计表间关系:用户表通过用户ID与表联系,书籍表通过书籍ID与表联系,借阅表通过书籍ID、读者姓名与书籍表和用户表联系
    限制的设置:只有管理员可实现对用户及书籍信息的管理,其他实体都不行,防止系统遭到管理员外的人员破坏;用户或管理员必需登录帐号才能进行操作,防止非法人员进入使用系统
    实现自主存取控制:数据库创建了两个登录名Yujie_Yang和UserLogin,用Yujie_Yang登录SQL Server,具有超级管理员权限,用UserLogin登录,则只具有部分权限。两个用户都只能对LibraryBase数据库进行操作,无法操作其他数据库,保证了其他数据库的安全性

    2.5 数据字典数据项



    数据项名
    别名
    数据 类型
    数据长度
    取值范围
    简述




    用户ID
    ID
    整型
    5位
    由不同的数字组成
    唯一标识用户身份


    用户名
    UserName
    字符型
    40位
    只能由汉字或者英文字母组成
    用户登录时的用户名


    用户密码
    Password
    字符型
    40位
    40位以内数字或英文字母
    用户登录密码,与用户账号对应使用


    用户权限
    Power
    字符型
    40位
    系统管理员、书籍管理员、学生
    标识登录用户的权限


    书籍ID
    ID
    整型
    5位
    由不同的数字组成
    书籍的唯一标识


    书名
    BookName
    字符型
    20位
    由汉字或英文字母组成
    书籍的名字


    出版社
    Press
    字符型
    20位
    由汉字或英文字母组成
    书籍的出版社信息


    作者
    Author
    字符型
    20位
    由汉字或英文字母组成
    书籍的作者名


    地址
    Address
    字符型
    20位
    由汉字或英文字母组成
    书籍的出版地址


    出版日期
    PressDate
    字符型
    10位
    日期表示
    书籍的出版日期


    价格
    Price
    字符型
    10位
    由数字和汉字组成
    书籍的价格


    备注
    Com
    字符型
    20位
    由字符,数字以及汉字组成
    书籍的备注信息


    总数量
    books_count
    字符型
    2位
    由数字组成
    每本书籍的总数量


    被借书数量
    borrow_count
    字符型
    2位
    由数字组成
    每本书籍被借阅数量


    还书日期
    ReturnDate
    字符型
    10位
    日期表示
    每本书籍被借阅时间


    借书日期
    BorrowDate
    字符型
    10位
    日期表示
    每本书籍被归还时间


    已还
    Is_Returned
    字符型
    2位
    是、否
    标识书籍是否被归还



    数据结构



    名称
    别名
    含义
    组成




    用户表
    UserTable
    用户的基本信息
    用户ID,用户名,用户密码,用户权限


    书籍表
    books
    书籍的基本信息
    书籍ID,书名,出版社,作者,地址,出版日期,价格,备注,总数量,被借书数量


    借阅表
    booksBrowse
    借阅信息
    借阅信息ID,学生姓名,书名,还书日期,借书日期,备注,已还



    数据流



    名称
    用户信息




    含义
    系统管理员、借阅管理员、学生的基本信息


    来源
    用户输入电脑的用户名、密码、用户权限


    去向
    系统主菜单


    组成
    用户名,用户密码、用户权限






    名称
    书籍信息




    含义
    管理员录入的书籍信息


    来源
    管理员在电脑上录入的书籍信息


    去向
    书籍记录


    组成
    书籍ID,书名,出版社,作者,地址,出版日期,价格,备注,总数量,被借书数量






    名称
    借阅信息




    含义
    管理员录入的借阅信息


    来源
    管理员在电脑上录入的借阅信息


    去向
    借阅记录


    组成
    ID,学生姓名,书名,还书日期,借书日期,备注,已还






    名称
    查询书籍信息




    含义
    查询图书管理系统中的书籍信息


    来源
    管理员在电脑上录入的书籍信息


    去向
    输出框中的书籍信息


    组成
    书名,出版社,作者,地址,出版日期,价格,备注






    名称
    查询借阅信息




    含义
    查询图书管理系统中的书籍借阅信息


    来源
    管理员在电脑上录入的书籍借阅信息


    去向
    输出框中的书籍借阅信息


    组成
    借阅者,书名,借阅日期,归还日期,备注






    名称
    查询用户信息




    含义
    查询该系统的所有用户信息


    来源
    数据库和系统管理员输入的信息


    去向
    输出框中的用户信息


    组成
    用户名,权限



    数据存储



    名称
    用户记录




    含义
    用户的基本信息


    组成
    用户ID,用户名,用户密码,用户权限


    关键字
    用户ID


    关联处理
    书籍借阅,书籍归还,查询用户信息






    名称
    书籍记录




    含义
    书籍的基本信息


    组成
    书籍ID,书名,出版社,作者,地址,出版日期,价格,备注,总数量,被借书数量


    关键字
    书籍ID


    关联处理
    查询书籍信息,书籍出借,书籍归还






    名称
    借阅记录




    含义
    书籍借阅信息


    组成
    ID,学生姓名,书名,还书日期,借书日期,备注,已还


    关键字
    ID


    关联处理
    查询借阅信息



    处理过程



    名称
    查询用户信息




    含义
    查询系统中的用户信息


    输入数据流
    用户信息


    处理
    在数据库中查询所有的用户信息,显示到用户信息表格


    输出数据流
    用户信息表格






    名称
    查询书籍信息




    含义
    查询系统中的书籍信息


    输入数据流
    书籍信息


    处理
    在数据库中查询所有的书籍信息,显示到书籍信息表格


    输出数据流
    书籍信息表格






    名称
    查询借阅信息




    含义
    查询系统中的书籍借阅信息


    输入数据流
    借阅信息,学生名字,书名


    处理
    在数据库中查询所有的借阅信息,显示到书籍借阅信息表格


    输出数据流
    书籍借阅信息表格






    名称
    书籍出借




    含义
    书籍出借


    输入数据流
    ID,学生姓名,书名,还书日期,借书日期,备注,已还


    处理
    将输入信息整理汇总到书籍借阅记录中


    输出数据流
    书籍借阅记录






    名称
    书籍归还




    含义
    书籍归还


    输入数据流
    还书者姓名,书名,日期,备注


    处理
    将输入信息整理汇总到书籍借阅记录中


    输出数据流
    书籍借阅记录



    3 概念结构设计3.1 概念模型:ER图实体及属性

    学生(用户ID,用户名,用户密码,权限)管理者(用户ID,用户名,用户密码,权限)图书(书籍ID,书名,作者,数量,出版社,价格,地址,出版日期)
    关系及属性:帐号管理,书籍管理,借阅(借书日期、还书日期)
    根据以上信息,编制如下的E-R模型图:
    书籍ER图

    学生ER图

    管理员ER图

    总E-R模型图

    4 逻辑结构设计4.1 关系模型:所有表结构及范式分析等采用C/S逻辑结构的设计。管理员直接通过数据库登录密码登录,其他每一个用户登录都要输入用户名和密码以验证身份。然后在后台数据库系统查询用户是否存在,返回给用户一个结果。用户根据自己的权限进行相应的操作。
    关系模型为(满足第三范式3NF):

    用户表UserTable(用户ID,用户名,用户密码,用户权限)
    书籍表books(书籍ID,书名,出版社,作者,地址,出版日期,价格,备注,总数量,已借走数量)
    借阅表booksBrowse(ID,书名,学生姓名,出版社,作者,地址,借/还书日期,价格,备注,总数量,已借走数量)
    备注:a. ID字段均被设置为“标识”,标识种子为1,增量为1。被设置为“标志”的字段的数据必须为数值类型;b. 下划线表示主键。

    4.2 用户子模式该管理系统只有一个图书借阅子模式,如下所示:

    程序中应用:

    4.3 应用程序功能模块图
    4.4 安全性(用户类别和权限)设计和实现说明
    系统管理员

    拥有系统的所有权限(即系统管理、书籍管理、借书管理、还书管理、信息查询、帮助)
    书籍管理员

    拥有管理书籍的权限(即书籍管理、信息查询、帮助)
    学生

    拥有借阅书籍的权限(借书管理、还书管理、信息查询、帮助)

    用户权限说明




    系统管理员
    书籍管理员
    学生




    用户登录





    添加用户

    ×
    ×


    修改用户密码

    ×
    ×


    删除用户

    ×
    ×


    添加书籍


    ×


    修改书籍


    ×


    删除书籍


    ×


    书籍出借

    ×



    修改书籍借阅信息

    ×



    书籍还入

    ×



    修改书籍还入信息

    ×



    书籍信息查询





    借阅信息查询





    查看用户列表

    ×
    ×



    4.5 完整性(主、外码和用户自定义的完整性约束)设计和说明
    实体完整性约束:关系中的主属性不能为空,在数据库中使用Primary Key实现
    参照完整性约束:借阅表中设置用户ID和书籍ID为外码,限制借阅表中出现非法的数据
    用户自定义的完整性约束:规定姓名、书名和借书日期不为空

    5 数据库物理设计5.1 所有索引的定义
    在用户编号上建立索引,加快查询速度:
    create unique index user_num on UserTable(ID);
    在书籍编号上建立索引,加快查询速度:
    create unique index book_num on books(BookID);

    5.2 数据的存放位置说明本地磁盘:
    C:\Program Files\Microsoft SQL Server\MSAS12.MSSQLSERVER\OLAP\Data

    5.4 模块设计(模块IPO图)
    6 数据库实施6.1 数据库备份右键数据库->任务->备份:

    将完整的数据库进行备份,选择备份磁盘路径:

    备份完成:

    7 数据库运行与维护7.1 系统使用说明管理员登陆界面

    书籍出借

    借书管理提供书籍借阅服务,借书者可通过该服务查询借阅相关书籍(还书管理与此类似,故不赘述)。
    书籍查询

    用户登录

    核心代码:
    public void actionPerformed(ActionEvent e) { if (e.getSource() == cancelBtn) { //取消按钮 mainFrame.setEnable("else"); this.dispose(); } else { char[] password = passwordTextField.getPassword(); String passwordSTR = new String(password); if (userTextField.getText().trim().equals("")){//用户名为空 JOptionPane.showMessageDialog(null, "用户名不可为空!"); return; } if (passwordSTR.equals("")) { //密码为空 JOptionPane.showMessageDialog(null, "密码不可为空!"); return; } String strSQL; strSQL = "select * from usertable where UserName='" + userTextField.getText().trim() + "'and Password='" + passwordSTR + "'"; rs = db.getResult(strSQL); boolean isExist = false; try { isExist = rs.first(); } catch (SQLException sqle) { System.out.println(sqle.toString()); } if (!isExist) { JOptionPane.showMessageDialog(null, "用户名不存在或者密码不正确!"); mainFrame.setEnable("else"); } else { try { rs.first(); mainFrame.setEnable(rs.getString("power").trim()); db.closeConnection(); this.dispose(); } catch (SQLException sqle2) { System.out.println(sqle2.toString()); } }
    借阅信息查询

    核心代码:
    public void actionPerformed(ActionEvent e) { if (e.getSource() == clearBtn) { borrowedBookStudentTextField.setText(""); borrowedBookNameTextField.setText(""); borrowedDateTextField.setText(""); borrowedCommentTextField.setText(""); } else if (e.getSource() == cancelBtn) { this.dispose(); } else if (e.getSource() == yesBtn) { try { String strSQL = "select studentName,bookName,borrowDate,com from BookBrowse where studentName='" + borrowedBookStudentTextField.getText().trim() + "'and bookName='" + borrowedBookNameTextField.getText().trim() + "'"; rs = db.getResult(strSQL); if (!rs.first()) { JOptionPane.showMessageDialog(null, "此学生没有借过书!或者没有此书!"); } else { borrowedBookStudentTextField.setText(rs.getString(1).trim()); borrowedBookNameTextField.setText(rs.getString(2).trim()); borrowedDateTextField.setText(rs.getString(3).trim()); borrowedCommentTextField.setText(rs.getString(4).trim()); updateBtn.setEnabled(true); } } catch (Exception ex) { System.out.println(ex.toString()); } } else if (e.getSource() == updateBtn) { String strSQL = "update bookBrowse set borrowDate='" + borrowedDateTextField.getText().trim() + "',com='" + borrowedCommentTextField.getText().trim() + "' where studentName='" + borrowedBookStudentTextField.getText().trim() + "'and bookName='" + borrowedBookNameTextField.getText().trim() + "'"; if (db.updateSql(strSQL)>0) { JOptionPane.showMessageDialog(null, "更新成功!"); db.closeConnection(); this.dispose(); } else { JOptionPane.showMessageDialog(null, "更新失败!"); db.closeConnection(); this.dispose(); }}
    7.2 系统测试方案和测试报告7.2.1 系统测试方案这次课设的主要目的是数据库的设计与对数据库基本操作的实现,所以采用黑盒测试,测试系统的功能实现。
    7.2.2 测试报告在数据库中有系统管理员、书籍管理员、学生三类用户,方便操作。

    管理员登录

    激活系统菜单:系统菜单全部激活,系统管理员可以进行所有操作

    添加管理员:添加小明为书籍管理员,密码初始化为0000,数据库发生对应变化


    添加书籍:添加书籍《编译原理》及相应信息,数据库对应发生变化


    借阅书籍:书籍借出,点击下拉框可以选择要借的书籍


    借阅信息查询:选择借阅信息查询,可以看到名叫张三的学生借了一本书

    归还书籍:输入还书者姓名和日期进行书籍归还,数据库发生对应变化


    用户列表:管理员可查看用户列表信息

    7.3 测试评价7.3.1 总体评价本图书借阅管理系统基本实现了一个图书馆中的基本功能。在界面上还是做得一般的,没有凸显出一个图书馆界面,但是总体上的感觉还行。各大功能模块的基本功能足够满足每一个用户的需要,能实现对数据库的增删改查功能,基本上实现了系统的总体功能。但由于自身的数据库水平和Java水平的有限,所以在开发一个图书借阅管理系统时还是显得比较乏力,在开发的过程中也凸显出许多不足,如UI设计不是很好等,以后会针对本次课设的不足和问题进行对应的学习,希望下次能开发出更好的系统出来。
    7.3.2 缺陷与不足本系统缺点也是比较多的,如UI做的不过好,精简了很多图书馆的实际管理功能,数据库设计的不够规范,数据库的逻辑结构和物理结构设计没有考虑完整。虽然只是模拟图书馆的借阅管理系统,但是实际还应该考虑更多因素,如发生故障如何处理、用户超期未归还书籍如何处理,等等。在逻辑结构优化方面做的也不够好,没有提供一个合理的逻辑结构,仍需做很多优化,这些留待以后对数据库及软件开发知识的深入学习后再继续改进。
    8 系统安装说明本系统需要在JDK环境下进行使用,建议使用MyEclipse或Eclipse进行安装使用,具体步骤如下:

    MyEclipse或Eclipse导入工程文件,查看环境是否有错,有的话进行调整
    用SQL Server导入数据库文件
    创建一个数据源,该数据源必须属于某一个数据库用户,然后通过JDK本身自带的JDBC ODBC驱动器加载驱动然后指明路径,连上数据库
    编译运行程序,弹出图书借阅管理系统界面,开始使用

    9 收获和体会这次数据库的实验可以来说是所有课程设计中最难的了,因为要设计成一个小型数据库来实现某一个现实生活中存在的工作系统,涉及到数据库知识和数据库与某一些高级语言的知识,所以要设计好一个好的小型数据库是不容易的。
    总体来说我选择的是我熟悉的Java搭配上实验课所学的SQL Server的知识来构建一个图书馆管理系统。在两个星期的设计过程中可以来说是困难重重,因为完全没用过Java的JDBC功能,所以要不断的查找Java的API文档才能了解它的工作原理,在重复无数次后最终实现了与数据库的链接。在图形界面上也就是GUI上面我用Java的图形界面功能,所以大部分时间主要是链接数据库方面,反而在图形界面上我做的不是很好,只是简单设计了一下图形界面,包括各个菜单选项的实现,比较简洁的风格。
    这次在数据库的链接方面花了很大功夫,主要是不明白JDBC如何才能连上SQL Server,通过不断的找资料和上网查资料最后明白了,我们要先创建一个数据源,该数据源必须属于某一个数据库用户,然后通过JDK本身自带的JDBC ODBC驱动器加载驱动然后指明路径,就可以连上数据库了。虽然花了两天功夫才弄明白,不过我觉得还是值得的,毕竟我以后就不会再犯同样的错误了,而且对于Java有了更深的了解了。
    最后终于成功了,还是觉得收获很大的。对于以后我们了解一个数据库软件的如何实现有很大的帮助。数据库在我们生活中到处都存在,所以要设计好一个数据库要在逻辑结构设计方面下够功夫才行,否则的话会在后面实现阶段吃很大的苦头!
    改进建议:

    改进UI界面,使界面体验更良好,交互性更强
    优化数据库,建立多几张表,使数据库功能不会过于集中在三张基本表上,加强各张表之间的联系
    优化程序,加多必要的注释,方便他人阅读时理解程序
    优化测试,解决系统潜在的漏洞

    10 附录以附录形式给出创建数据库及数据库对象的SQL脚本文件;
    use LibraryBase; CREATE TABLE UserTable( ID int, UserName char(40) not null, Password char(40) not null, Power char(40) not null, CONSTRAINT ID_User_Containt PRIMARY KEY (ID));CREATE TABLE books( BookID int, BookName char(20) not null, Press char(20), Author char(20), Address char(20), PressDate char(10), Price char(10), Com char(20), books_count char(2), borrowed_count char(2), CONSTRAINT ID_Contraint_PK PRIMARY KEY (BookID));CREATE TABLE bookBrowse( ID int identity, StudentID int, StudentName char(40), BookID int, BookName char(20), ReturnDate char(10), BorrowDate char(10), Com char(40), Is_Returned char(2), CONSTRAINT ID_BookBrowse_Containt PRIMARY KEY (ID), CONSTRAINT FK_StudentID foreign key(StudentID) references UserTable(ID), CONSTRAINT FK_BookID foreign key(BookID) references books(BookID),);create unique index user_num on UserTable(ID);create unique index book_num on books(BookID); create view Student_Borrow(ID,UserName,BookID,BookName,ReturnDate,BorrowDate,Com)as select UserTable.ID,UserTable.UserName,books.BookID,books.BookName,ReturnDate,BorrowDate,bookBrowse.Com fromUserTable,books,bookBrowse where UserTable.ID = bookBrowse.StudentID and books.BookID = bookBrowse.BookID;select * from Student_Borrow;select * from UserTable;select * from books;select * from bookBrowse;INSERT INTO UserTable values (1,'yang','123456','系统管理员');INSERT INTO UserTable values (2,'小明','1111','学生');INSERT INTO UserTable values (3,'小红','6666','学生');INSERT INTO UserTable values (4,'杨劲','6666','学生');INSERT INTO UserTable values (5,'许伟杰','6666','学生');INSERT INTO UserTable values (6,'yuan','6666','书籍管理员');INSERT INTO books values (1,'C语言','华南理工出版社','谭浩强','中国广州','2015/1/1','20元','可借出','20','0');INSERT INTO books values (2,'编译原理','清华大学出版社','王生原','中国北京','207/1/2','18元','可借出','10','0');INSERT INTO books values (3,'数据结构','华南理工出版社','张三','中国广州','2011/1/1','40元','可借出','20','0');INSERT INTO books values (4,'算法导论','电子工业出版社','李四','中国深圳','2012/1/1','30元','可借出','20','0');INSERT INTO books values (5,'Android','华南理工出版社','王五','中国广州','2014/1/1','40元','可借出','20','0');INSERT INTO books values (6,'计算机图形学','电子工业出版社','赵六','中国香港','2012/1/1','30元','可借出','20','0');INSERT INTO bookBrowse values (2,'小明',1,'C语言','2018/1/9','2018/1/8','西区','是');INSERT INTO bookBrowse values (3,'小红',1,'C语言','2018/1/9','2018/1/5','西区','是');INSERT INTO bookBrowse values (5,'许伟杰',2,'编译原理',null,'2018/1/5','西区','否');create login Yujie_Yang with password='123456', default_database=LibraryBase;create user user1 for login Yujie_Yang with default_schema=dbo;exec sp_addrolemember 'db_owner', 'user1';create login UserLogin with password='666', default_database=LibraryBase;create user user2 for login UserLogin with default_schema=dbo;GRANT INSERT, UPDATE, DELETE, SELECTON booksTO user2GOGRANT INSERT, UPDATE, DELETE, SELECTON bookBrowseTO user2GO
    7 评论 844 下载 2018-11-05 21:12:55 下载需要15点积分
  • 基于C++的全国交通咨询系统

    一. 设计目的全国交通咨询模拟。处于不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能的短,出门旅游的游客则期望旅费尽可能省,而老年旅客则需要中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
    二. 设计内容提供用户以及管理员功能,用户可以对交通图进行查询,而管理员可以对交通图进行增删查改,同时管理员可以登陆、修改密码等待操作,界面采用字符界面。这样操作,更加真实地模拟了交通咨询系统。关于要求的功能,实现了城市线路的增加、删除、显示,基于 Dijkstra 的从源点到汇点的最小费用算法与最小时间算法。
    三.概要设计3.1 功能模块图
    3.2 各个模块详细的功能描述
    查询城市编号:头结点建立顶点表时存储的是城市对应的序号

    手动添加城市从文件读取以添加城市
    删除城市:删除城市时需要删除与该城市相关的所有线路

    输出所有城市
    更新城市列表:当新建城市个数加原本已存在城市个数大于 MAXSIZE 时,需要开辟空间存储新城市并 ++MAXSIZE

    手动添加线路
    插入线路:由于线路信息存于表结点里,所以需要新建表结点并加入对应起始城市的边表

    从文件中读取线路删除线路求最少花费路径求最少时间路径

    四.详细设计4.1 功能函数的调用关系图
    4.2 各功能函数的数据流程图



    4.3 重点设计及编码用优先队列优化的基于dijkstra 算法的最小费用与最小时间算法,代码如下:
    //最少花费路径struct Node{int id; //源顶点 idfloat money; //估算距离(费用)//由于stl 中优先队列的第三个参数是greater,而我们需要的是小顶堆,所以因重载运算符 <friend bool operator < (struct Node a, struct Node b) { return a.money > b.money;}};void ALGraph::dijkstra_Money (int v0, int *parent, Node *dis) { priority_queue<Node> q;//优化插入(更新)和取出最小值两个操作,队列存储最短距离与索引的编号//parent[]记录每个顶点的父亲结点//dis[]记录源点到每个估算距离,最后更新为源点到所有顶点的最短距离bool visited[MaxCityNum]; //判断下标对应的顶点是否算出最短路径或者说是否在最短路径树中//初始化int i;for (i = 0; i < CityNum; ++i){ dis[i].id = i; dis[i].money = INF; parent[i] = -1; //每个顶点都没有父结点 visited[i] = false; //都未找到最短路}dis[v0].money = 0; //源点到源点最短路权值为 0 q.push(dis[v0]); //压入队列while (!q.empty()){ //队列空说明完成了求解v0 到其余各顶点的最短路径 Node cd = q.top(); //取最小估算距离顶点q.pop(); int u = cd.id; if (visited[u]) { //被标记了,就无需对其进行更新最短距离等等操作continue; } visited[u] = true; LineNode *p = CityList[u].FirstLine; //松弛操作 while(p) { //找所有与它相邻的顶点,进行松弛操作,更新估算距离,压入队列int v = searchCityNum(p->EndName); float m = p->Info->SpendMoney; if (!visited[v] && dis[v].money > dis[u].money + m) { dis[v].money = dis[u].money + m;parent[v] = u; q.push(dis[v]); } p = p->NextLine; }}// while (!q.empty()) }//dijkstra_Money//最少时间路径struct Node1 { int id; //源顶点 id int tt; //估算距离(时间) Time et; //到达时间 friend bool operator < (struct Node1 a, struct Node1 b) { return a.tt > b.tt; }};int ALGraph::timeTransWeight (const Time& t) { return (t.day*24 + t.hour)*60 + t.minute;}void ALGraph::dijkstra_Time (int v0, int *parent, Node1 *dis) { priority_queue<Node1> q1;//parent[]记录每个顶点的父亲结点//dis[]记录源点到每个估算距离,最后更新为源点到所有顶点的最短距离 bool visited[MaxCityNum]; //判断下标对应的顶点是否算出最短路径或者说是否在最短路径树中 int i; for (i = 0; i < CityNum; ++i) { dis[i].id = i; dis[i].tt = INF; dis[i].et = {0, 0, 0}; parent[i] = -1; //都一个顶点都没有父结点 visited[i] = false; //都未找到最短路径 } dis[v0].tt = 0; q1.push(dis[v0]); while (!q1.empty()) { Node1 cd = q1.top(); //取出最短距离的点的序号q1.pop(); int u = cd.id; if (visited[u]) { continue; } visited[u] = 1; LineNode *p = CityList[u].FirstLine; //找出所有相邻点,进行松弛操作,即更新 dis while (p) { int v = searchCityNum(p->EndName); int t = timeTransWeight(p->Info->SpendTime); Time st = p->Info->StartTime; //本条线路开始时间 //计算中转的时间开销 if (u != v0) { //注意源点到任何点都没有中转时间 int change = timeTransWeight(st - dis[u].et); //当前路线的开车时间-始发站的上一到站时间 t += change; } if (!visited[v] && dis[v].tt > dis[u].tt + t) { dis[v].tt = dis[u].tt + t; dis[v].et = p->Info->EndTime; parent[v] = u; q1.push(dis[v]); } p = p->NextLine; }//while (p) }//while (!q1.empty())}//dijkstra_Time
    五. 测试数据及运行结果5.1 正常测试数据和运行结果要求提供 3 组正常测试数据和运行结果

    昆明 成都 (最小花费)


    导入线路


    删除线路


    5.2 异常测试数据及运行结果显示所有线路:输出格式异常
    2 评论 173 下载 2018-11-09 15:14:54 下载需要8点积分
  • 基于JAVA和SQL SERVER数据库实现的个人财务管理系统

    一、需求分析个人财务管理系统是智能化简单化个人管理的重要的组成部分。并且随着计算机技术的飞速发展,计算机在管理方面应用的旁及,利用计算机来实现个人财务管理势在必行。本文首先介绍了个人财务管理系统的开发目的,其次对个人财务管理系统的需求分析做了详细的描述。接着,又对系统数据库设计和功能结构的划分做了详细论述。然后又对个人财务管理系统的实现做了详尽的说明。在报告的最后给出了项目的测试结果以及结果分析。
    本系统是对个人的收支情况做一个简单的管理,其中宝库哦个人信息管理以及收支信息管理。 其中,个人信息管理包括用户对自己的信息进行增删查改的一些操作,同样,收支信息管理包括用户对收支情况的信息进行增删查改的管理。
    1.1 系统业务需求该系统具体需求应该有用户登录模块,用户修改信息模块,用户修改信息模块,收支查询模块,收支删除模块,收支添加模块,收支修改模块。
    1.2 系统技术目标该系统的目标主要是能对个人信息以及收支信息进行较快的增删查改,同时也能对收支信息进行各种方式的查询。
    1.3 系统的具体需求根据以上对系统的任务和目标的分析,系统的具体需求如下:

    个人信息:用户名(唯一),密码,姓名,性别,出生日期,工作,身份证号,电话号码
    收支信息:收支编号(唯一),收支日期,收支方式,收支项目,收入金额,支出金额,,总金额

    二、软件功能结构分析由需求分析可知,软件的功能应包括:个人信息管理,收支信息管理。其中,个人信息应包括,个人信息的增删查该,登录时候验证功能。收支信息管理应包括对对收支信息的各种方式查询,以及对收支信息的增加,修改以及删除功能。当然,每个用户应对应其各自的收支信息。
    2.1 个人信息功能在登录界面用户输入用户名以及密码,如果用户与密码都输入正确则可以登录进系统,如果其中任何一项与数据库中的数据不匹配则要求重新输入。当用户没有账户时候,可以点击登录界面的注册按钮注册。成功进入系统后,可以进行个人信息的查询以及修改。
    具体流程图如下:

    2.2 收支管理功能用户登录成功后进入主界面后可以选择查询方式,全部查询:查询用户所有收入支出的信息;收入查询:查询用户收入信息;支出查询:查询用户支出信息;按日期查询:查询用户当天的收入支出信息。用户也可以对收入支出信息进行修改和删除以及添加。
    具体流程图如下:

    三、数据库设计经过以上的需求的分析以及系统功能的分析,需要建立出该系统数据库的各种模型,为建立一个好的,完善的数据库做准备。
    3.1 概念模型由于该系统涉及的较少,只涉及到用户以及财务管理,所以设计比较简单。一个用户可以有多条收支记录,所以用户表与收支表是一对多的关系。通过PowerDesigner工具设计出的概念数据模型如下:

    其对应的E-R模型如下图:

    3.2 逻辑模型联系转换
    一个用户可以有多条记录,而一条记录只能对应一个用户,所以用户与记录之间是一对多的关系。
    其逻辑结构设计如下

    个人信息(用户名,密码,姓名,性别,出生日期,工作,身份证号,电话号码)
    收支信息(收支编号,收支日期,收支方式,收支项目,收入金额,支出金额,总金额)

    关系模式

    个人信息(用户名,密码,姓名,性别,出生日期,工作,身份证号,电话号码)
    收支信息(收支编号,收支日期,收支方式,收支项目,收入金额,支出金额,总金额)

    3.3 物理模型通过PowerDesigner中的概念模型生成物理模型如下:

    3.4 表结构设计用户表

    收支信息表

    四、软件代码设计本系统是对个人财政的管理,下面给出具体的功能模块以及代码实现。
    4.1 功能模块登录界面模块

    说明:

    该界面为登录界面,如果没有账户,则可以点击注册按钮注册
    当用户输入的用户名或者密码输入错误时,会提示用户名或者密码输入错误
    当点击登录时,如果用户名以及密码都正确则会提示登录成功,并跳转到主界面

    用户注册模块

    说明:

    该界面为用户注册模块
    用户填入信息,其中用户名唯一,当用户名重复时会提示“用户名已存在,请重新输入”

    主界面模块

    说明:
    该界面为用户主信息界面

    用户可以有多种查询方式:全部查询(查询全部收支信息)、收入查询(只查询收入信息)、支出管理(只查询支出信息)、日期查询(查询当天收支信息)
    显示用户所有的收入总计、支出总计以及收入支出总计

    个人信息显示模块

    说明:

    该界面为用户显示模块
    用户如果不想使用该系统可以注销掉自己的账户

    个人信息修改模块
    说明:

    修改界面与个人信息查询界面在同一模块
    用户名不能修改

    收支信息插入模块
    说明:

    该界面为添加收支信息界面
    当点击主界面的插入按钮时候,会跳转到该界面
    收支编号不能重复


    收支信息修改界面

    说明:

    该界面为收支信息修改界面
    当点击主界面中的修改按钮时(必须选中一行),跳转到该界面
    收支编号不能修改

    收支信息删除界面
    说明:

    该功能与在主界面上
    选中一行,然后点击删除,即可提示删除成功

    4.2 代码实现登录界面主要功能实现(Login.java)
    jb1.addActionListener(new ActionListener() {//登陆按钮 public void actionPerformed(ActionEvent e) { jLabel5.setVisible(false); String ad = jf1.getText(); String pass = jf2.getText(); int i=0; String sc = "select userName,passWord from admin where userName='"+ad+"'"; try { ResultSet rs = st.executeQuery(sc); while (rs.next()) { i++; String userName = rs.getString("userName"); System.out.println(userName+"sdgdfgdf"); String password = rs.getString("passWord"); if (!ad.equals(userName)||userName.equals("")) { jLabel5.setVisible(true); } else if (!pass.equals(password)) { jLabel6.setVisible(true); } else { JOptionPane.showMessageDialog(null, "登陆成功!"); Show show = new Show(); show.s=jf1.getText(); show.setVisible(true); setVisible(false); } } System.out.println(i+"sdfd"); } catch (SQLException ex) { Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex); } if(i==0){ jLabel5.setVisible(true); } } });
    说明:该代码实现了登录界面的登录、判断用户名与密码输入是否正确。当用户名或者密码输入错误的时候会提示用户名或者密码错误。同时还添加了一个注册按钮让没有账户的用户注册账户。
    用户注册功能实现(UserInsert.java)
    jb1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { String s1 = jf1.getText();//y用户名 String s2 = jf2.getText();//姓名 String s12 = jf7.getText();//密码 String s3 = (String) jcb.getSelectedItem();//性别 String s5 = jf4.getText();//职业 String s6 = jf5.getText();//身份证号码 String s7 = jf6.getText();//电话号码 String s8 = (String) jcb1.getSelectedItem(); String s9 = (String) jcb2.getSelectedItem(); String s10 = (String) jcb3.getSelectedItem(); String s11 = s8 + "-" + s9 + "-" + s10;//出生日期 ResultSet rs; String str ="select userName from admin where userName='"+s1+"'"; rs = st.executeQuery(str); int i=0; while (rs.next()) { i++; } if (i == 0) { if (s6.length() != 18 || s7.length() != 11) { if (s6.length() != 18) { jLabel5.setVisible(true); } if (s7.length() != 11) { jLabel14.setVisible(true); } } else { String sql = "insert into admin Values ('" + s1 + "','" + s12 + "','" + s2 + "','" + s3 + "','" + s11 + "','" + s7 + "','" + s5 + "','" + s6 + "')"; st.executeUpdate(sql); JOptionPane.showMessageDialog(null, "注册成功"); setVisible(false); } } else{ jLabel15.setVisible(true); } } catch (SQLException ex) { Logger.getLogger(UserInsert.class.getName()).log(Level.SEVERE, null, ex); } } });
    说明:该代码实现了个人信息的注册,其中用户名唯一,重复会给出提示“用户名已存在”,并且判断身份证与电话号码填写的格式是否正确。*
    全部查询实现函数(Show.java)
    jb1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    收入查询实现函数(Show.java)
    jb2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    支出查询实现函数(Show.java)
    jb3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    日期查询实现函数(Show.java)
    jb4.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    个人信息查询功能模块(Show.java)
    jb9.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    个人信息修改功能模块(User.java)
    jb2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    个人信息删除功能模块(User.java)
    Jb3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    收支信息插入功能模块(UserInsert.java)
    jb1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    收支信息添加功能模块(Insert.java)
    jb1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    收支信息删除功能模块(show.java)
    Jb7.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ....... ....... } });
    五、总结通过该课程设计,我认识到软件设计是基于需求分析和可行性分析的基础上的,软件设计阶段需要合理的分析需求分析中的细节部分的实现,既要考虑到关键处代码的可实现性,又要考虑到开发过程中遇到的问题。刚开始觉得该 项目建立的数据库比较简单,没有认真进行需求分析,所有导致后面举步维艰。后来重新进行需求分析,一步一步来,最终完成了该课程设计。软件设计是把需求分析中的问题抽象化,又要把抽象化了的需求形象的从预期的实现中体现出来。 本小组的个人财务管理系统系统的设计实现了预期的功能,对个人消费进行记录,个人的收入进行统计,对个人收支进行汇总并给出相应的理财提示信息。在这次的个人财务管理系统设计中将理论知识应用到实际中使得对理论知识的理解有了更进一步的理解,如果仅仅只是运用理论知识,是远远不够的。必须理论联系实际,才能很好的将各门课程学好,并用于实际案例中。
    这次设计使我的编程水平提高了一大步。由于这次设计涉及到数据库,我的学到了不少编程工具与数据库连接的知识,对数据库的操作有了进一步的了解。这次设计对我的综合能力是一次很好的锻炼,自己的能力和知识还很有限。所以今后我的学习道路还是很漫长的。
    9 评论 298 下载 2018-10-25 21:36:27 下载需要15点积分
  • 基于PHP和MySQL数据库实现的学生成绩管理系统

    一、项目介绍1.1 课程设计的题目学生成绩管理系统
    1.2 系统的总体功能描述1.2.1 基本要求学校希望建立一个学生成绩在线公布系统,对学生成绩信息进行存储、管理和发布,并能通过分类、查询、统计等操作从数据库中获取有效信息,在方便学生了解自己各科考试成绩的同时,各院系可对学生成绩有直接和明确的掌握。
    1.2.2 基本功能
    系统设置:考试科目、等级分值等参数的设置、权限设置、更改密码等
    学生查询:通过学号和密码,学生可查询每学期各科成绩
    成绩录入:提供学生成绩的添加功能,并能从表格和其他数据库文件中导入信息
    信息更新:提供学生成绩信息的删除和修改和功能
    信息统计:按院系、专业、班级分类汇总、统计。可查询学生的成绩分布,不及格人数,最低分、最高分和平均分
    信息打印:主要提供成绩的分类打印功能

    1.2.1 登录功能
    输入管理员,老师,学生的id和密码会登录到不同界面,与之对应有不用的功能和权限。
    1.2.2 管理员功能
    添加考试

    在输入框输入需要添加的考试科目,点击添加,完成添加考试科目内容
    删除分数

    输入要删除分数的名字和对应的科目,点击删除即可删除分数
    修改分数

    输入需要需改分数的姓名和对应的科目对应的新成绩,点击修改完成修改分数功能
    修改密码

    管理员可以修改任何id的密码
    1.3 开发工具本系统后台数据库采用MySQL 数据库,该数据库系统在安全性、准确性和运行速度方面有绝对的优势,并且处理数据量大,效率高;前台sublime text作为主要开发工具,使用B/S模式,开发简单。
    1.4 开发环境
    编辑器:Sublime Text
    系统开发语言:HTML + CSS + PHP
    数据库:MySQL

    二、需求分析2.1 概括描述随着在校大学生人数的不断增加,教务系统的数据量也不断的上涨。学校工作繁杂、资料重多,虽然各类管理信息系统已进入高校,但还未普及,而对于学生成绩管理来说,目前还没有一套完整的、统一的系统。因此,开发一套适和大众的、兼容性好的系统是很有必要的。
    2.2 用户特点本系统有管理员,老师,学生。系统的管理员主要是对学生信息以及学生成绩进行一些操作。这些操作包括对学生信息的添加、对学生成绩的录入以及对学生成绩进行分析等。老师对学生成绩的录入,自己密码的修改,学生查询自己的成绩和统计自己的成绩,修改自己密码。
    2.3 可行性分析目前,随着办公信息化的开展,高校的扩招,新生入学以及期末考试结束后,学校都需要对一些繁琐的流程进行管理,通过一个基于B/S架构的管理系统,可以很好的将这一个过程进行化繁为简。此项目具有普遍性,能够应用于很多学校。因此,该类型系统可以大量投入使用。
    2.4 数据项管理员id,密码,老师id,密码,学生id密码,考试科目,考试成绩
    2.5 数据结构
    管理员:权限最高,管理员ID,管理员登录密码
    老师:老师ID,老师登录密码
    学生:学生ID,学生密码,学生考试科目,考试成绩

    2.6数据存储管理员ID,管理员登录密码,老师ID,老师登录密码,学生ID,学生密码,学生考试科目,考试成绩
    三、数据库概念结构设计3.1 局部ER图
    管理员(ID,密码)
    老师(ID,密码)
    学生(ID,密码,科目,成绩)

    四、数据库逻辑结构设计4.1 关系模式
    管理员(ID,密码)
    老师(ID,密码)
    学生(ID,密码,科目,成绩)

    4.2 存储过程信息->数据库
    4.3 触发器建立触发器以实现分数删除功能,当删除一个学生的分数时将此学生的相关信息全部删除。
    4.4视图这部分主要是考虑使用方便性和效率问题,主要借助视图手段实现。
    4.5索引使用经典存取方法,建立索引:

    学生成绩经常用到而且按其排序,在学生成绩名称属性建立索引。
    用户ID是本软件的重要的数据,在ID属性建立索引。

    五、应用系统功能结构图
    六、各功能模块程序流程图及其说明6.1 添加考试输入框获取用户输入的考试科目,通过post方法发送到服务器,添加到数据库
    6.2 删除模块输入框获取用户输入要删除的分数,通过post方法发送到服务器,MqSQL数据库匹配对应的分数,然后删除
    6.3 修改密码模块通过更新数据库达到修改密码的功能
    6.4 查询模块查询对应的分数,使用对应的MySQL语句
    七、程序源代码及其说明7.1 登录
    7.2 查询

    7.3 服务器端对数据库的读取和写入操作采用JDBC进行数据库的连接与操作。
    7.4 客户端与服务器端的通信采用Socket进行通信。
    7.5 系统主界面管理员主界面

    学生主界面

    教师主界面

    八、总结课程设计中遇到的主要问题和解决方法;创新和得意之处;课程设计中存在的不足,需进一步改进的设想;课程设计的感想和心得体会。
    8.1 主要问题和解决方法界面的排版问题,还有用户输入的数据怎样传给数据库和php处理。
    排版问题使用css的定位解决,绝对定位能让控件定位到我想要的地方。数据传输使用post方法,在php要使用_POST+name接受控件输入的内容。
    8.2 创新和得意之处系统界面简单单调,但是功能齐全,开发容易,使用XAMPP集合环境,不需要单独安装数据库和web服务器,使用起来方便简单。
    8.3 不足之处功能过域简单,更加复杂的功能没有实现,系统存在SQL注入等安全问题,界面也不够美观,进一步的学习和研究,学习更多css、html、php、mysql,进一步掌握安全问题,维护更好的网站。
    8.4 心得体会在这次课程设计中,重点是要掌握数据库设计方法。数据库设计特点:三分技术,七分管理,十二分基础数据。在数据库建设中不仅涉及技术,还设计管理。要建设好一个数据库应用系统,开发技术固然重要,但相比之下则管理更重要。
    进行数据库的设计首先必须了解与分析用户需求。需求分析是整个设计过程的基础,是最困难、最耗时的一部分。需求分析做的不好,甚至会导致整个数据库设计返工重做。需求分析的任务是通过详细的调查现实世界要处理的对象,充分了解用户的各种需求,然后在此基础上确定系统功能。系统还必须充分考虑今后可能的扩充和改变。
    概念结构设计是整个数据库设计的关键,他通过对用户需求进行综合、归纳与抽象,形成一个独立与具体DBMS的概念模型。逻辑结构设计是将概念结构转换为某个DBMS所支持的数据模型,并对其进行优化。概念结构的特点:能真实、充分的反映现实世界,包括失误和事物之间的联系,能满足用户对数据的处理要求,是对现实世界的一个真实模型;易于理解,从而可以用它和不熟悉计算机的用户交流意见,用户的积极参与是数据库设计成功的关键;易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充;易于向关系、网状、层次等各种数据模型转换。
    本系统主要针对的用户是学生、教务员和老师。该设计的优点是:不同用户的功能都单独存储在数据库中相应的表中使他们可以很方便地满足自己的需求。不足是:存在部分数据冗余,不利于该数据库向大型数据库扩展。但该设计基本能满足三类的用户的需求,完成简单的功能。时间有限,部分功能还没有实现,有待完善!
    通过将近一个星期的设计,我对数据库在生活中的广泛应用有了更深的体会,同时也加深了对MySQL的认识,了解了相关的SQL的知识,尤其是对数据库的原理与开发程序的应用有了更进一步的认识和了解。 课程设计是我们数据库专业课程知识综合应用的实践训练,在课设中也遇到了很多问题,经过向老师询问和跟同学们交流,认真的思考,积极解决问题,终于解决了那些问题。在解决问题的过程中,我也学到了很多知识,更是让我把课本的知识应用到实际之中,让我了解了我们学习的知识有什么用,增强我的自信心和学习的动力。同时感谢老师和同学在课程设计过程中的帮助!
    九、参考文献[1] 王珊.数据库技术与应用[M].北京:清华大学出版社,2005.
    [2] 姚卿达.数据库设计[M].北京:高等教育出版社,1987.
    [3] 戴维尔.JavaScript程序员教程[M].电子工业出版社.2010.333-334.
    [4] 武欣 PHP和MySQL Web开发(原书第4版)机械工业出版社9787111262817
    4 评论 411 下载 2018-11-30 19:10:29 下载需要14点积分
  • 基于JSP实现的学生成绩管理系统

    1 引言1.1 任务简介
    多用户管理:用户分管理员,学生
    网页界面设计:利用HTML和CSS实现客户端前台设计
    类间关系的设计、数据库表格设计
    数据库数据的增(录入)、删、改、查等基本功能
    JSP中Requests Response内置对象的使用;
    数据库表格结构的生成(SQL脚本)
    前台JS校验设计
    DOM技术实现
    其他扩展功能
    开发环境与技术:IDEA、Java 语言、JDK 1.7、MySQL 6.0

    1.2 需求分析本学生成绩管理系统分为管理员登录,学生登录,其中管理员可以实现增加学生成绩信息,删除学生成绩信息,修改学生成绩信息,查找学生成绩信息,按照学生GPA进行排名,其中学生可以实现登录查询成绩功能,能否成功登录取决于数据库中是否有该学生。
    2可行性分析2.1 社会可行性分析成绩是每一个大学生都会接触到的东西,不仅学生为之心动,为了管理学生的成绩,如果不用计算机来实现,老师们也会感觉很头疼麻烦,开发学生成绩管理系统后,让学生的成绩管理变的更加方便,学生也可以实现自助查询成绩功能,老师们也可以对学生成绩进行排名等。
    2.2 经济可行性分析该系统的开发调查主要是需要软件,这些软件都是免费的。主要的花销在于服务器的维护,除此之外没有其他的花销。
    2.3 法律可行性分析系统开发及维护所使用工具和技术及数据信息不违反法律。
    3系统设计3.1 系统功能设计学生成绩管理系统具备以下功能:管理员学生分权限登录,增加学生成绩信息,删除学生成绩信息,修改学生成绩信息,查询学生成绩,按照学生GPA进行排名。

    分权限登录:系统分为管理员和学生用户两个权限,因为管理员就一个,所以账号秘密固定,但是学生有很多,所以在学生登录的过程中要对数据库中的学生进行查询,如果存在,而且密码正确,才能成功登录
    增加学生成绩:该功能可以将学生的姓名,学号,一系列成绩,登录密码等信息录入系统
    删除学生成绩:该功能可以将学生的信息全部列举出来,然后选择想要删除的学生的信息
    修改学生成绩:该功能可以将学生的所有信息全部列举出来,然后再选择想要修改的学生的信息,然后弹出一个修改框,再做仔细的修改
    查询学生成绩信息:该功能可以在输入学号后显示出学生的各项成绩信息
    按照学生GPA进行排名:该功能可以将所有学生按照GPA进行排名,并显示出来

    3.2 算法流程设计根据需求分析,将本系统分为以下模块,模块图如下:

    4 关键技术及代码实现4.1 基本功能4.1.1 Web前端设计与实现4.1.1.1 HTML关键技术及应用include file技术
    <html> <head> <title> 学生成绩管理系统 </title> </head> <body bgcolor="#FFFFFF"> <%@ include file="include_head_JSP2.jsp"%> </body></html>
    Bootstrap 框架技术
    <%@page contentType= "text/html; charset=UTF-8" language= "java" errorPage=""%> <!DOCTYPE html><html> <head> <style> body{ background-image: url("1281116171866201.jpg"); } </style> <title>学生管理系统</title> <meta name= "viewport" content = "width=device-width, initial-scale= 1.0"> <!-引入Bootstrap-> <link href="bootstrap.css" rel="stylesheet"> </head> <body> <center> <hi>学生成绩管理系统</hi></center> <br> <center> <div class ="container"> <a href= "selectLogin .j sp" class= "btn btn-info" role= "button">管理员</a> <a href= "studentLogin.jsp" class= "btn btn-info" role= "button">学生</a> </div></center> <!– jQuery (Bootstrap 的 JavaScript 插件需要引⼊ jQuery) –> <script src=”jquery-3.2.1.min.js”></script> <!– 包括所有已编译的插件 –> <script src=”bootstrap.min.js”></script> </body> </html>
    4.1.1.2 CSS关键技术及应用Bootstrap.css技术
    大量运用Boostrap前段框架中的CSS样式,美化登录界面,表格,按钮。
    响应式表格:
    <table class=”table table-condensed table-hover” >
    美化按钮:
    <a href=”Findinfo2.jsp” class=”btn btn-info” role=”button”> 返回 </a>
    4.1.1.3 JS校验设计及应用登录界面的校验
    <script language=”javascript” type=””> function checkform() { //验证输⼊数据的合法性 if (form1.teacherName.value==””) { alert(” ⽤户名不能为空。”); return false; } if (form1.teacherPassword.value==””) { alert(” 密码不能为空。”); return false; }}</script>
    往数据库写⼊数据的检验
    function checkform(){ //验证输⼊数据的合法性 if (form1.id.value==””) { alert(” 学号不能为空。”); return false; } if (isNaN(form1.id.value)) { alert(” 学号只能为数字”); return false; } if (form1.name.value==””) { alert(” 姓名不能为空。”); return false; } if (form1.cppstring.value==””) { alert(”C++ 成绩不能为空。”); return false; } if (isNaN(form1.cppstring.value)) { alert(”C++ 成绩只能为数字”); return false; } else { var num=parseFloat(form1.cppstring.value); if (num<0||num>100) { alert(”C++ 成绩必须在 0-100 之间!”); return false; } } if (form1.cirstring.value==””) { alert(” 电路成绩不能为空。”); return false; } if (isNaN(form1.cirstring.value)) { alert(” 电路成绩只能为数字”); return false; } else { var num=parseFloat(form1.cirstring.value); if (num<0||num>100) { alert(” 电路成绩必须在 0-100 之间!”); return false; } } if (form1.Ewritestring.value==””) { alert(” 英语读写成绩不能为空。”); return false; } if (isNaN(form1.Ewritestring.value)) { alert(” 英语读写成绩只能为数字”); return false; } else { var num=parseFloat(form1.Ewritestring.value); if (num<0||num>100) { alert(” 英语读写成绩必须在 0-100 之间!”); return false; } } if (form1.Elistenstring.value==””) { alert(” 英语听说成绩不能为空。”); return false; } if (isNaN(form1.Elistenstring.value)) { alert(” 英语听说成绩只能为数字”); return false; } else { var num=parseFloat(form1.Elistenstring.value); if (num<0||num>100) { alert(” 英语听说成绩必须在 0-100 之间!”); return false; } } if (form1.physicsstring.value==””) { alert(” ⼤学物理成绩不能为空。”); return false; } if (isNaN(form1.physicsstring.value)) { alert(” ⼤学物理成绩只能为数字”); return false; } else { var num=parseFloat(form1.physicstring.value); if (num<0||num>100) { alert(” ⼤学物理成绩必须在 0-100 之间!”); return false; } } if (form1.prostring.value==””) { alert(” 概率论成绩不能为空。”); return false; } if (isNaN(form1.prostring.value)) { alert(” 概率论成绩只能为数字”); return false; } else { var num=parseFloat(form1.prostring.value); if (num<0||num>100) { alert(” 概率论成绩必须在 0-100 之间!”); return false; } } if (form1.hisstring.value==””) { alert(” 近代史成绩不能为空。”); return false; } if (isNaN(form1.hisstring.value)) { alert(” 近代史成绩只能为数字”); return false; } else { var num=parseFloat(form1.hisstring.value); if (num<0||num>100) { alert(” 近代史成绩必须在 0-100 之间!”); return false; } } if (form1.xingzhengstring.value==””) { alert(” 形势与政策成绩不能为空。”); return false; } if(isNaN(form1.xingzhengstring.value)) { alert(” 形势与政策成绩只能为数字”); return false; } else { var num=parseFloat(form1.xingzhengstring.value); if (num<0||num>100) { alert(” 形势与政策成绩必须在 0-100 之间!”); return false; } } if (form1.pestring.value==””) { alert(” 体育成绩不能为空。”); return false; } if (isNaN(form1.pestring.value)) { alert(” 体育成绩只能为数字”); return false; } else { var num=parseFloat(form1.pestring.value); if (num<0||num>100) { alert(” 体育成绩必须在 0-100 之间!”); return false; } } if (form1.discretestring.value==””) { alert(” 离散数学成绩不能为空。”); return false; } if (isNaN(form1.discretestring.value)) { alert(” 离散数学成绩只能为数字”); return false; } else { var num=parseFloat(form1.discretestring.value); if (num<0||num>100) { alert(” 离散数学成绩必须在 0-100 之间!”); return false; } } if (form1.rank.value==””) { alert(” 查询密码成绩不能为空。”); return false; } if (form1.rank.value.length<1||form1.rank.value.length>20) { alert(” 密码超出了范围(1 ~ 20)”); return false; }}</script>
    4.1.1.4 DOM 关键技术及应用DOM 实际上是以面向对象方式描述的文档模型。DOM 定义了表⽰和修改⽂档所需的对象、这些对象的⾏为和属性以及这些对象之间的关系。可以把 DOM 认为是页面上数据和结构的一个树形表示,不过页面当然可能并不是以这种树的方式具体实现。 通过 JavaScript,您可以重构整个 HTML 文档。您可以添加、移除、改变或重排页面上的项目。 例如使用 Dom 技术来进⾏ Js 校验:
    <script language=”javascript” type=””> function checkform() { //验证输⼊数据的合法性 if (form1.teacherName.value==””) { alert(” ⽤户名不能为空。”); return false; } if (form1.teacherPassword.value==””) { alert(” 密码不能为空。”); return false; }} </script>
    4.1.2 Web 后台设计及实现本学生管理系统后台设计使用了 Java 脚本,Java servlet 过滤器,以及 Java 数据库技术等。
    4.1.2.1 数据库设计及 SQL 脚本生成数据库脚本
    CREATE TABLE ‘grade‘ ( ‘id‘ varchar(30) NOT NULL, ‘name‘ varchar(30) NOT NULL, ‘cpp‘ varchar(30) NOT NULL, ‘circuit‘ varchar(30) NOT NULL, ‘Ewrite‘ varchar(30) NOT NULL, ‘Elisten‘ varchar(30) NOT NULL, ‘physics‘ varchar(30) NOT NULL, ‘probability‘ varchar(30) NOT NULL, ‘history‘ varchar(30) NOT NULL, ‘xingzheng‘ varchar(30) NOT NULL, ‘pe‘ varchar(30) NOT NULL, ‘discrete‘ varchar(30) NOT NULL, ‘overall‘ varchar(30) DEFAULT ’0’, ‘gpa‘ varchar(30) DEFAULT ’0’, ‘rank‘ varchar(30) DEFAULT ’0’ )
    4.1.2.2 增删改查功能实现增加学生成绩信息
    String idstring=ChangeEncoding(request.getParameter(”id”).trim()); String namestring=ChangeEncoding(request.getParameter(”name”).trim());String cppstring=request.getParameter(”cppstring”); String cirstring=request.getParameter(”cirstring”); String Ewritestring=request.getParameter(”Ewritestring”);String Elistenstring=request.getParameter(”Elistenstring”); String physicsstring=request.getParameter(”physicsstring”);String prostring=request.getParameter(”prostring”);String hisstring=request.getParameter(”hisstring”); String xingzhengstring=request.getParameter(”xingzhengstring”);String pestring=request.getParameter(”pestring”);String discretestring=request.getParameter(”discretestring”); String overallstring=getOvarall(cppstring,cirstring,Ewritestring,Elistenstring, physicsstring,prostring,hisstring,xingzhengstring,pestring,discretestring); String gpastring=getGPA(cppstring,cirstring,Ewritestring,Elistenstring, physicsstring,prostring,hisstring,xingzhengstring,pestring,discretestring); String rankstring=request.getParameter(”rank”); //构造 SQL 语句 Stringsql=”insertintograde(id,name,cpp,circuit,Ewrite,Elisten,physics,probability,history,xingzheng”+”,pe,discrete,overall,gpa,rank)”+”VALUES(’”+idstring+”’,’”+namestring+”’,’”+cppstring+”’,’”+cirstring+”’,’”+Ewritestring+”’,’”+Elistenstring+”’,’”+physicsstring+”’,’”+prostring+”’,’”+hisstring+”’,’”+xingzhengstring+”’,’”+pestring+”’,’”+discretestring+”’,’”+overallstring+”’,’”+gpastring+”’,’”+rankstring+”’)”; String DBDRIVER = ”org.gjt.mm.mysql.Driver” ; // 定义 MySQL 数据库的连接地址 String DBURL = ”jdbc:mysql://localhost:3306/student”; // MySQL 数据库的连接⽤户名 String DBUSER = ”root” ;// MySQL 数据库的连接密码String DBPASS = ”xzk520521”;try { Class.forName(DBDRIVER).newInstance();} catch (ClassNotFoundException e) { out.print(” 错误”); e.printStackTrace();}try { Connection conn=DriverManager.getConnection(DBURL, DBUSER, DBPASS); Statement stmt=conn.createStatement(); stmt.executeUpdate(sql); out.print(”<center>”); out.println(”<P><font size=2’>”+” 向数据库增加学⽣信息”+”</font>”); out.println(”<P><font size=2’>”+” 该学⽣信息数据已经成功添加到数据库。”+”</font>”); out.print(”</center>”); stmt.close(); conn.close(); } catch(SQLException e) { out.print(” 错误”); e.printStackTrace(); }
    删除学生成绩
    String DBDRIVER = ”org.gjt.mm.mysql.Driver” ;// 定义 MySQL 数据库的连接地址String DBURL = ”jdbc:mysql://localhost:3306/student”; // MySQL 数据库的连接⽤户名 String DBUSER = ”root” ; // MySQL 数据库的连接密码 String DBPASS = ”xzk520521”; String id=codeToString(request.getParameter(”id”).trim());//构造 SQL 语句 String sql=”delete from grade where id=’”+id+”’”; try { Class.forName(DBDRIVER).newInstance(); } catch (ClassNotFoundException e) { out.print(” 错误”); e.printStackTrace();} try{ Connection conn=DriverManager.getConnection(DBURL, DBUSER, DBPASS); Statement stmt=conn.createStatement(); stmt.executeUpdate(sql); out.print(”<center>”); out.println(”<P><font size=2 color=’blue’>”+” 向数据库删除学⽣信息数据”+”</font>”); out.println(”<P><fontsize=2’>”+”学号为:”+id+”的学⽣数据信息已经被成功删除。”+”</font>”); out.print(”</center>”); stmt.close(); conn.close(); }catch(SQLException e) { out.print(” 错误”); e.printStackTrace(); }
    查找学生成绩信息
    String DBDRIVER = ”org.gjt.mm.mysql.Driver” ; // 定义 MySQL 数据库的连接地址 String DBURL = ”jdbc:mysql://localhost:3306/student” ; // MySQL 数据库的连接⽤户名 String DBUSER = ”root” ; // MySQL 数据库的连接密码 String DBPASS = ”xzk520521”; String id=request.getParameter(”id”); String sql=”select * from grade where id=’”+id+”’”;//设置查询 SQL 语句try { Class.forName(DBDRIVER).newInstance(); } catch (ClassNotFoundException e) { out.print(” 错误”); e.printStackTrace(); } try { Connection conn=DriverManager.getConnection(DBURL, DBUSER, DBPASS); Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery(sql); if(!rs.next()) { out.print(”<center>”); out.println(”<P><fontsize=2color=’blue’>”+”该学⽣尚未录⼊系统,请前去录⼊!”+”</font>”); } else{ dec.idField.setText(rs.getString(”id”)); dec.nameField.setText(rs.getString(”name”)); dec.cppField.setText(rs.getString(”cpp”)); dec.cirField.setText(rs.getString(”circuit”)); dec.EwriteField.setText(rs.getString(”Ewrite”)); dec.ElistenField.setText(rs.getString(”Elisten”)); dec.phyField.setText(rs.getString(”physics”)); dec.proField.setText(rs.getString(”probability”)); dec.historyField.setText(rs.getString(”history”)); dec.xingzhengField.setText(rs.getString(”xingzheng”)); dec.peField.setText(rs.getString(”pe”)); dec.discreteField.setText(rs.getString(”discrete”)); dec.overallField.setText(rs.getString(”overall”)); dec.gpaField.setText(rs.getString(”gpa”)); } rs.close(); stmt.close(); conn.close();}catch (SQLException e) { e.printStackTrace(); }
    修改学生成绩信息
    String idstring=ChangeEncoding(request.getParameter(”id”).trim()); String namestring=ChangeEncoding(request.getParameter(”name”).trim()); String cppstring=request.getParameter(”cpp”); String cirstring=request.getParameter(”circuit”); String Ewritestring=request.getParameter(”Ewrite”); String Elistenstring=request.getParameter(”Elisten”); String physicsstring=request.getParameter(”physics”); String prostring=request.getParameter(”probability”);String hisstring=request.getParameter(”history”);String xingzhengstring=request.getParameter(”xingzheng”);String pestring=request.getParameter(”pe”);String discretestring=request.getParameter(”discrete”); Stringoverallstring=getOvarall(cppstring,cirstring,Ewritestring,Elistenstring,physicsstring,prostring,hisstring,xingzhengstring,pestring,discretestring); Stringgpastring=getGPA(cppstring,cirstring,Ewritestring,Elistenstring,physicsstring,prostring,hisstring,xingzhengstring,pestring,discretestring); String rankstring=request.getParameter(”rank”); String DBDRIVER = ”org.gjt.mm.mysql.Driver” ; // 定义 MySQL 数据库的连接地址 String DBURL = ”jdbc:mysql://localhost:3306/student” ; // MySQL 数据库的连接⽤户名 String DBUSER = ”root” ; // MySQL 数据库的连接密码 String DBPASS = ”xzk520521”; String id=ChangeEncoding(request.getParameter(”id”).trim());//构造 SQL 语句 Stringsql=”updategradesetid=’”+idstring+”’,name=’”+namestring+”’,cpp=’”+cppstring+”’,circuit=’”+cirstring+”’,Ewrite=’”+Ewritestring+”’,Elisten=’”+Elistenstring+”’,physics=’”+physicsstring+”’,probability=’”+prostring+”’,history=’”+hisstring+ ”’,xingzheng=’”+xingzhengstring+”’,pe=’”+pestring+”’,discrete=’”+discretestring+”’,overall=’”+overallstring+”’,gpa=’”+ gpastring+”’,rank=’”+ rankstring+”’where id=’”+id+”’”; try { Class.forName(DBDRIVER).newInstance();} catch (ClassNotFoundException e) { out.print(” 错误”); e.printStackTrace();}try { Connection conn=DriverManager.getConnection(DBURL, DBUSER, DBPASS); Statement stmt=conn.createStatement(); stmt.executeUpdate(sql); out.print(”<center>”); out.println(”<P><font size=2 color=’blue’>”+” 向数据库修改学⽣信息数据”+”</font>”); out.println(”<P><fontsize=2’>”+”学号为:”+id+”的学⽣数据信息已经被成功修改。”+”</font>”); out.print(”</center>”); stmt.close(); conn.close();} catch(SQLException e) { out.print(” 错误”); e.printStackTrace(); }
    显⽰——按照学⽣的 GPA 进⾏排名并打印
    <% String DBDRIVER = ”org.gjt.mm.mysql.Driver” ; // 定义 MySQL 数据库的连接地址String DBURL = ”jdbc:mysql://localhost:3306/student” ; // MySQL 数据库的连接⽤户名 String DBUSER = ”root” ; // MySQL 数据库的连接密码 String DBPASS = ”xzk520521”; int realrank=1; String sql=”select * from grade ORDER BY gpa DESC”;//设置查询 SQL 语句 try { Class.forName(DBDRIVER).newInstance();}catch (ClassNotFoundException e) { out.print(” 错误”); e.printStackTrace(); } try { Connection conn=DriverManager.getConnection(DBURL, DBUSER, DBPASS); Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery(sql); %> <center><h1> 学⽣成绩 GPA 排名表 </h1></center> <hr> <table class=”table table-condensed table-hover” > <thead> <tr > <th> 学号 </th> <th> 姓名 </th> <th>C++ 成绩 </th> <th> 电路成绩 </th> <th> 英语读写 </th> <th> 英语听说 </th> <th> ⼤学物理 </th> <th> 概率论 </th> <th> 近代史 </th> <th> 形势与政策 </th> <th> 体育 </th> <th> 离散数学 </th> <th> 总分 </th> <th>GPA</th> <th> 排名 </th> </tr> </thead> <% while (rs.next()){ //获取学⽣数据表中的记录 %> <tr > <td><%=rs.getString(”id”)%></td> <td><%=rs.getString(”name”)%></td> <td><%=rs.getString(”cpp”)%></td> <td><%=rs.getString(”circuit”)%></td> <td><%=rs.getString(”Ewrite”)%></td> <td><%=rs.getString(”Elisten”)%></td> <td><%=rs.getString(”physics”)%></td> <td><%=rs.getString(”probability”)%></td> <td><%=rs.getString(”history”)%></td> <td><%=rs.getString(”xingzheng”)%></td> <td><%=rs.getString(”pe”)%></td> <td><%=rs.getString(”discrete”)%></td> <td><%=rs.getString(”overall”)%></td> <td><%=rs.getString(”gpa”)%></td> <td><%=realrank++%></td> </tr> <% } rs.close(); stmt.close(); conn.close(); } catch (SQLException e){ e.printStackTrace(); } %> </table>
    4.1.3 Java-Serviet设计与实现Java-Serviet技术主要用于过滤器的实现,过滤器就是不能再未登录的情况下直接用URL 地址访问操作界面,用Java-Serviet技术实现如下:
    userLoginCheckFilter.java
    package mywebapp; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.FilterConfig;import javax.servlet.ServletException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession; public class userLoginCheckFilter implements Filter { public static final Stringloginpage = ”index.jsp”; public void destroy(){ } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; String currentURL = request.getRequestURI(); String ctxPath = request.getContextPath(); //除掉项⽬名称时访问页⾯当前路径 String targetURL = currentURL.substring(ctxPath.length()); System.out.println(targetURL); List<String>info = new ArrayList<String>(); HttpSession session = request.getSession(false); //对当前页⾯进⾏判断,如果当前页⾯不为登录页⾯ if(!((”/index.jsp”.equals(targetURL)) || (”/selectLogin.jsp”.equals(targetURL)) || (”/studentLogin.jsp”.equals(targetURL)))){ //在不为登陆页⾯时,再进⾏判断,如果不是登陆页⾯也没有 session 则跳转到登录页⾯ if(session == null || session.getAttribute(”admin”) == null){ info.add(”You are not logged in!”); request.setAttribute(”info”,info); request.getRequestDispatcher(loginpage).forward(request,response); return; } else{ //这⾥表⽰正确,会去寻找下⼀个链,如果不存在,则进⾏正常的页⾯跳转 filterChain.doFilter(request, response); return; } } else{ //这⾥表⽰如果当前页⾯是登陆页⾯,跳转到登陆页⾯ try{ filterChain.doFilter(request, response); } catch (Exception e){ throw e; } return; } } public void init(FilterConfig filterConfig)throws ServletException{ }}
    web.xml ⽂件
    <?xml version=”1.0” encoding=”UTF-8”?> <web-app xmlns=”http://xmlns.jcp.org/xml/ns/javaee” version=”3.1”><filter> <filter-name>userLoginCheckFilter</filter-name> <filter-class>mywebapp.userLoginCheckFilter</filter-class></filter> <filter-mapping> <filter-name>userLoginCheckFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> </web-app>
    4.1.4 JSP内置对象的使用本成绩管理系统用了4种JSP内置对象,分别是Request、Response、Out、Session。下面分别列出:
    4.1.4.1 RequestString idstring=ChangeEncoding(request.getParameter(”id”).trim()); String namestring=ChangeEncoding(request.getParameter(”name”).trim()); String cppstring=request.getParameter(”cpp”); String cirstring=request.getParameter(”circuit”);String Ewritestring=request.getParameter(”Ewrite”); String Elistenstring=request.getParameter(”Elisten”); String physicsstring=request.getParameter(”physics”);String prostring=request.getParameter(”probability”); String hisstring=request.getParameter(”history”);String xingzhengstring=request.getParameter(”xingzheng”); String pestring=request.getParameter(”pe”); String discretestring=request.getParameter(”discrete”);
    4.1.4.2 Responseresponse.sendRedirect(”teacharMenu.jsp”);
    4.1.4.3 Outout.print(”<center>”); out.println(”<P><font size=2 color=’blue’>”+” 管理员⽤户或密码错误”+”</font>”);
    4.1.4.4 Sessionsession.setAttribute(”teacherName”,name); session.setAttribute(”teacherPassword”,password); String user=(String)session.getAttribute(”teacherName”); String pwd=(String)session.getAttribute(”teacherPassword”);
    4.1.5 多用户管理设计与实现首先进入系统时出现选择用户,如果选择管理员需要知道管理员账号密码,如果选择学生, 需要该学生的学号在数据库中而且密码正确。
    5 系统演示登录

    增加


    删除


    查找


    修改

    排名

    6 总结6.1 系统缺陷与不足
    系统运用的查找算法都是暴力算法,如果面对很多数据的话,系统运行会缓慢,可以运用二分查找算法或者改变存储的数据结构进行优化
    系统编码不够灵活,编码转换方面容易产生乱码

    6.2 系统可扩展功能
    增加选课功能
    增加多个管理员功能
    增加学生自助修改密码功能
    增加一系列功能做成教务系统
    4 评论 422 下载 2018-11-05 12:31:35 下载需要14点积分
  • 基于C语言的课程信息管理系统

    一、 设计内容及要求每门课程包含以下信息项:课程编号,课程名称,课程性质,学时,授课学时,实验或上机学时,学分,开课学期。系统的主要功能包括:

    创建课程信息文件,根据提示输入课程的各项信息,然后将课程信息存储到一个文件中。增加课程信息,在原有课程信息文件的基础上增加新的课程信息,要求继续保存至原文件,并提示用户选择是否继续进行增加操作。删除课程信息,提示用户输入要进行删除操作的课程编号,如果在文件中有该信息存在,则将该课程编号所对应的课程信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。修改课程信息,提示用户输入要进行修改操作的课程编号,如果在文件中有该信息存在,则将提示用户输入该编号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作。按不同条件对课程信息进行查询操作,输出满足条件的课程信息。

    按课程名称查询,输入课程名称。
    按开课学期查询,输入开课学期。

    按不同条件对课程信息进行统计工作。

    按课程性质统计课程门数(例:选修课:5门;必修课:10门)。
    找出学分大于等于3分的课程,并输出他们的信息。


    二、设计思路2.1 系统概述
    系统名称:课程信息管理系统
    根据系统开发所提出该《课程信息管理系统》所应具备的系统功能包括以下六点:

    创建课程信息文件;
    增加课程信息;
    删除课程信息;
    修改课程信息;
    按不同条件对课程信息进行查询操作,输出满足条件的课程信息;
    按不同条件对课程信息进行统计工作。

    用户人群:学校课程信息管理人员及在校学生。

    2.2 需求概述2.2.1 系统目标本系统的总体目标是通过该系统的实施,可以对学生课程信息更加有效地进行管理。系统设计实施过程中,力争做到以下几点:

    能够实现各个要求的功能;
    具有较高的可靠性和可用性;
    系统易于管理维护;
    使用方便,易学易用。

    2.2.2 系统用例图根据需求分析,分析出系统的具体操作步骤及功能,此系统应当包括输入、修改、查询、添加、删除、储存。详细使用见下图—系统整体用例图。

    2.2.3 系统功能描述该系统可以输入记录保存于文件中,之后可以对记录进行修改、查询、添加、统计、删除。
    2.2.4 程序界面大纲主程序是显示给用户的一个进入的界面,包含着该课程信息管理系统的各个应用功能,并通过调用函数的形式来实现。用户通过主函数中给出的各个功能提示,来进行相应的选择。如图所示:

    2.2.5 存储和读取可以用存储函数将输入及修改的数据保存至文本文档中,也可用读取函数读取文本文档中所有的数据。
    三、设计结果及分析
    为了使程序设计更适合面向对象,使用getch()等函数使得程序的使用更加便利,多处设计防误触循环、清屏函数、屏幕暂停函数等,同时在程序编写时尽量多的考虑使用对象可能遇到的情况,增加提示,使得程序更加人性化。
    充分利用链表,对结构体数据实现增删改查等操作,整体而言就是通过多次对链表的建立和释放,每次需要操作文件时都会将数据全部提取到链表,对链表进行操作,再写入文件,使操作与文件数据实时切合,由于fwrite的特点,能覆盖旧数据,同时也能防止丢失数据以确保数据的完整性。
    当程序运行出现崩溃、报错或停止运行时,通过单步调试寻找问题所在,找到程序出现问题所在行时,再分析代码,寻找原因,不断解决程序的问题。
    数据的读取与存储:在数据保存到文件当中,以及从文件当中读取出来这两个部分,需要考虑到存储形式、内存分配,还有如何确保结构体的数据能够整块的移动,在调整过程中,曾存在存储数据不当导致出现“屯”等乱码,读取文件数据崩溃等情况。最后决定采用fwrite以二进制的形式保存到dat类型文件中,运用fread读取到链表中,同时为了防止内存分配存在问题,多次调整自定义函数read()当中的代码。
    运用模块化的思想,对于程序的多个自定义函数进行了划分,分为负责主要操作功能的和辅助主要操作功能的两类,使得程序的模块划分清晰明了。
    5 评论 317 下载 2018-10-20 21:39:10 下载需要7点积分
  • 基于Jsp和Mysql的电子产品销售管理系统

    1 绪论随着科技水平的飞速发展,计算机走进了千家万户,人们开始越来越多地利用计算机解决和日常生活相关的各种问题。因此,开发一个界面友好,易于操作的电子产品销售管理软件进行产品销售管理程序自动化处理变得十分必要。本系统采用B/S模式[1],使用Eclipse、SQL数据库等工具设计开发。系统分为超级管理员、普通管理员与员工三个部分,超级管理员使用账号密码登录成功后,可以对管理平台的用户,商品信息,供应商信息,库存信息,利润信息,客户信息,个人信息,员工信息,员工考勤信息,员工工资信息,退货信息,数据备份信息,相关表单信息的打印等进行管理。普通管理员不可修改用户管理信息。员工可查看修改个人信息,查看个人考勤信息与工资信息。
    1.1 背景随着计算机的普及和计算机科学技术的飞速发展,人们开始越来越多地利用计算机解决实际问题。电子产品销售管理是商业信息管理的重要部分面对大量的商品信息,采用人力处理将浪费大量的时间、人力和物力,且数据的准确性低。因此,开发一个界面友好,易于操作的销售管理软件进行自动化处理变得十分重要,这正是本系统开发的目的和意义。
    一套比较系统的电子产品销售管理理念,并建立了一整套比较规范的销售管理方法。在积极建立商业现代商业管理机制的今天,仅仅靠原始的手工管理或简单的单机管理,商品部门面对大量的信息,无法有效率地将其中的重要部分提取出来,并做出相应的判断和处理。公司管理者的决策只能依据报表数据,在浪费大量人力、物力的同时无法做到实时监控,难以保证数据的准确性和及时性。因此,先进的管理思想在商业中实现就成为了一个可望而不可及的目标。公司集团非常急需一套既有先进管理思想又适合国内大商业的手机销售管理信息系统,作为实现目标和提高现有水平的一种重要手段! 电子产品销售管理系统是一个公司不可缺少的部分,它的内容对于公司的决策者和管理者来说都至关重要, 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
    1.2 国内外现状当今社会已经进入信息社会时代,信息已经受到社会的广泛关注,被看做社会和科学的技术发展的三大支柱。信息管理的基础,是进行决策的基本依据。在一个组织里,信息已经被作为人力、物力、财力之外的第四种能源[2],占有重要的地位。然而,信息是一种非物质的,有别于基本资源的新形势的资源。信息也是管理的对象,必须进行管理和控制。
    “电子产品销售管理系统”开发的主要任务是对各种电子商店销售、员工、仓库的数据进行修改、查询、插入等管理。开发功能完善及可靠的管理系统,运用计算机进行信息处理。能有效的提高资源利用率、快速准确的获取重要的信息,有利于数据分析,有利于提高工作效率、充分发挥人员的工作潜力,从而根据市场需求制定合理的计划。
    现在电子产品越来越普及,越来越多的有购买电子产品的打算。所以,电子产品的市场需求量是很大的。而对于一个电子产品的大商场,会有多家电子产品品牌的若干机型。售价、库存、进货、销售、员工和客户等这些信息量庞大而繁琐。如果单靠人工记录和管理这些信息,不仅工作量大,而且效率低下。设计出符合商场实际情况的电子产品销售数据库系统,能够有效、快速、简单、准确的管理这些信息。
    1.3 系统开发的目标与意义1.3.1 系统开发目标建立健全产品销售管理体制,解决销售管理简单化问题,开发出一项具有实用价值和功能的电子产品销售管理系统,最大化的满足管理者的需求。
    设计如下的系统开发目标:

    电子产品销售管理系统分为三个角色:超级管理员、普通管理员、员工
    超级管理员功能模块有:管理员用户管理、商品类别添加与查询、商品信息添加与查询、供应商添加与查询、入库记录添加与查询、出库记录添加与查询、库存查询、利润出现、客户添加与查询、修改密码、员工信息添加与查询、考勤记录添加与查询、员工工资添加与查询、退货记录添加与查询、数据备份,相关表单信息的打印
    普通管理员不可修改用户管理信息
    员工可查看修改个人信息,查看个人考勤信息与工资信息

    1.3.2 意义电子产品销售管理系统是一个公司不可缺少的部分,它的内容对于公司的决策者和管理者来说都至关重要,随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。

    2 开发技术背景本系统的完成主要采用了Java语言、JDBC、JavaBean、Popup[3]弹框 JS库、LigerUI js库、JavasScript、JSP和Mysql数据库。下面对这几项技术进行详细说明。
    2.1 Java语言Java是一种可以实现跨平台的面向对象的程序设计语言[4],是由Sun公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性;广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网[5]。在全球云计算和移动互联网的产业环境下,Java具备了显著优势和广阔前景。
    Java 不同于一般的编译执行或解释执行计算机语言[5]。它首先将源代码编译成二进制字节码,然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性[6]。
    一句话概括:Java编程语言是个简单的面向对象、分布式、健壮、解释性、安全与系统无关、高性能、可移植[7]、多线程和动态的语言。
    2.2 JDBCJDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类[8]和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
    2.3 Mysql数据库MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统[9]之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
    MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性[10]。
    MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策[11],分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
    由于其社区版的性能卓越,搭配 PHP [12]和 Apache [13]可组成良好的开发环境。
    2.4 JavaBeanJavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。
    2.5 JavasScriptJavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。

    是一种解释性脚本语言[14](代码不进行预编译)
    主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为
    可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离
    跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)

    Javascript脚本语言同其他语言一样,有它自身的基本数据类型,表达式和算术运算符及程序的基本程序框架。Javascript提供了四种基本的数据类型和两种特殊数据类型用来处理数据和文字。而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。
    2.6 JSPJSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
    它实现了Html语法中的java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。
    JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计的显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 JSP(JavaServer Pages)是一种动态页面技术,它的主要目的是将表示逻辑从Servlet中分离出来。
    Java Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
    2.7 PopupPopup.js 是一个很不错的javaScript 弹出窗口js库。POPUP是弹窗的意思。弹窗是指打开网页的时候,自动弹出的窗口,目前主要流行的弹出式是快速进入网页游戏的快捷形式。
    弹窗形式有:

    普通弹出式:用户上线时分时段主动推送广告窗口(网页、flash、流媒体)
    定向性弹出式:用户访问特定的网址时弹出广告窗口
    强制性弹窗:

    DNS劫持,弹出广告页面(DNS强制弹窗) 用户访问网页时,运营商已经在DNS域名系统上做了手脚,DNS服务器会先给用户发一个广告IP地址,5到10秒后才重新发送真正应该返回的IP地址会话劫持(TCP弹窗) 它的出现没有时间规律,经常在用户上网的无意之间出现这类广告。这种强制广告会根据用户上网的活跃度自动增减弹出数

    2.8 LigerUIliger ui,是基于jQuery开发的一系列控件组[15],包括表单、布局、表格等等常用UI控件,使用LigerUI可以快速创建风格统一的界面效果。
    LigerUI视图简洁明了,操作较为简便,采用json格式传递数据。具有不错的grid表格处理能力。甚至可以达到web桌面的能力。
    2.9 开发环境2.9.1 JDK软件我们要开发Java EE的系统,需要安装的是Java SE。Java SE的JDK是开发任何Java系统必须安装的工具包。我选用1.7的版本进行开发。
    2.9.2 Web服务器TomcatTomcat是Apache-Jarkarta的一个子项目,是一个免费的、开源[16]的、支持JSP和Servlet技术的容器,它同时又是一个Web服务器软件。
    Tomcat很受广大程序员的喜欢,因为它运行时占用的系统资源小、扩展性好、支持负载平衡与邮件服务等开发应用系统常用的功能。Tomcat是一个小型的轻量级应用服务器,是开发和调试JSP程序的首选。
    在本系统中选用稳定版本Tomcat7.0进行开发。
    2.9.3 Eclipse开发工具Eclipse企业级工作平台(Eclipse Enterprise Workbench)。利用它我们可以在数据库和JavaEE的开发、发布以及应用程序服务器的整合方面极大地提高工作效率。Eclipse是一个十分优秀的用于开发J2EE、Java的Eclipse 插件集合。Eclipse的功能十分强大,支持也非常广泛,尤其对各种开源产品的支持十分不错。
    本系统中我将选用eclipse-jee-mars-2作为开发工具。

    3 系统需求分析和设计随着销售量增多,公司销售的规模不断扩大,传统的管理模式存在着很大的缺陷,若是人为的处理销售管理记录的信息,这个速度是非常慢的,并且更新信息速度也慢,不能保证信息的及时与有效,人工计算大量信息势必会影响到信息的准确性;管理者想统计、查询起来是很困难的并且不能够分类查询,不方便对信息进行统计分析,因此传统的管理方式已经不能适应现代公司销售管理的发展趋势。为了能够更好的提高管理员的效率,使得管理的开销缩减,并对产品销售管理信息进行方便的管理等多方面的考虑,通过网络的应用,建立完善的电子产品销售管理系统,提高管理者的效率。鉴于上述理由我选择使用Eclipse以及Mysql等设计实现了一个电子产品销售管理系统。
    3.1 系统的基本需求结合现阶段互联网技术的发展和产品销售管理者的需求,《电子产品销售管理系统》应具有合理科学的管理员管理系统,通过管理员完善的信息更新和处理,能够更好、更快的管理电子产品销售管理系统。超级管理员能够管理用户管理、商品类别添加与查询、商品信息添加与查询、供应商添加与查询、入库记录添加与查询、出库记录添加与查询、库存查询、利润出现、客户添加与查询、修改密码、员工信息添加与查询、考勤记录添加与查询、员工工资添加与查询、退货记录添加与查询、数据备份,相关表单信息的打印等操作。普通管理员不能对用户管理进行操作。员工可查看修改个人信息,查看个人考勤信息与工资信息。
    3.2 系统的设计思想设计要求系统功能全面,同时操作简单。系统页面作为与用户交互的重要界面,在考虑实现页面功能的同时也要考虑到操作的可行性和方便性,主要目的是让管理者能够享受到网上查询信息与处理相关事务的快乐与便利。
    3.3 系统功能需求分析本系统适用于管理员通过网络进行电子产品销售管理相关事务的处理,对管理员而言,实现了系统设置、商品信息管理、供应商管理、库存管理、客户管理、个人资料管理、员工信息管理、退货管理、系统数据备份管理,相关表单信息的打印等功能。
    在需求分析的基础上,结合电子产品销售管理系统的总体目标,从信息系统目标、系统功能、技术性能等方面进行分析,最终确定了可行的、合理的系统功能需求。系统主要功能需求如下:

    登录功能:输入用户名、密码,进行登录验证
    超级管理员用户管理:超级管理员可对系统普通管理员的添加与删除
    商品类别添加/查询:管理员可对商品类别进行添加,查询,删除、修改与打印
    商品信息添加/查询:管理员可对商品信息进行添加,查询,删除、修改与打印
    供应商添加/查询:管理员可对供应商信息进行添加,查询,删除、修改与打印
    入库/出库的添加/查询:管理员可对入库/出库记录进行添加,查询,删除、修改与打印
    库存查询:管理员可对库存进行查询与打印
    利润查询:经过对入库出库的比较,管理员可对销售利润进行查询与打印
    客户的添加/查询:管理员可对客户进行添加,查询,删除、修改与打印
    修改密码:管理员可对当前登录密码进行修改
    员工信息添加/查询:管理员可对员工信息进行添加,查询,删除、修改与打印
    考勤记录添加/查询:管理员可对员工考勤记录进行添加,查询,删除、修改与打印
    员工工资添加/查询:管理员可对员工的工资记录进行添加,查询,删除、修改与打印
    客户退货记录添加/查询:管理员可对退货记录进行添加,查询,删除、修改与打印
    数据备份:管理员可对当前系统数据进行快捷备份
    员工查看:查看修改个人信息,查看个人考勤信息与工资信息

    3.4 系统的功能模块电子产品销售管理系统由登录、系统管理、员工模块三部分组成。

    查看登录功能模块:超级管理员、普通管理员与员工
    系统管理功能模块:系统设置、商品信息管理、供应商管理、库存管理、客户管理、个人资料管理、员工信息管理、退货管理、系统数据备份管理等功能
    员工模块:个人资料管理、我的考勤、我的工资

    电子产品销售管理系统框架图如图3.1所示。

    3.5 系统的工作流程电子产品销售管理系统的工作流程如图3.2所示。

    3.6系统模块详细设计3.6.1 登录
    3.6.2 管理员用户管理
    3.6.3 修改密码
    3.6.4 出库记录添加
    3.6.5 退货记录添加
    4 数据库设计4.1 数据库需求分析在本系统中,数据库发挥着重要的作用,设计好数据库能够增加系统的运行效率,优化用户浏览网页的效果。数据库应当解决如下需求:

    利用数据库保存用户信息
    利用数据库保存退货信息
    利用数据库保存出库信息
    利用数据库保存入库信息
    利用数据库保存供应商信息
    利用数据库保存员工考勤信息
    利用数据库保存客户信息
    利用数据库保存商品类别信息
    利用数据库保存商品信息
    利用数据库保存员工工资信息
    利用数据库保存员工信息

    4.2 数据表的结构设计通过数据库需求分析,该系统需要创建十一个数据表:
    allusers表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    username
    VarChar
    50

    255


    3
    pwd
    VarChar
    50

    255


    4
    cx
    VarChar
    50

    255


    5
    addtime
    DateTime
    8

    23



    chukujilu表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    bianhao
    VarChar
    50

    255


    3
    mingcheng
    VarChar
    50

    255


    4
    kucun
    VarChar
    50

    255


    5
    chukushuliang
    VarChar
    50

    255


    6
    kehu
    VarChar
    50

    255


    7
    beizhu
    VarChar
    50

    255


    8
    caozuoyuan
    VarChar
    50

    255


    9
    addtime
    DateTime
    8

    23



    gongyingshangxinxi表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    bianhao
    VarChar
    50

    255


    3
    gongsimingcheng
    VarChar
    50

    255


    4
    dianhua
    VarChar
    50

    255


    5
    chuanzhen
    VarChar
    50

    255


    6
    youxiang
    VarChar
    50

    255


    7
    dizhi
    VarChar
    50

    255


    8
    zhuyingchanpin
    VarChar
    50

    255


    9
    beizhu
    VarChar
    50

    255


    10
    addtime
    DateTime
    8

    23



    kehuxinxi表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    bianhao
    VarChar
    50

    255


    3
    xingming
    VarChar
    50

    255


    4
    gongsimingcheng
    VarChar
    50

    255


    5
    dianhua
    VarChar
    50

    255


    6
    chuanzhen
    VarChar
    50

    255


    7
    youxiang
    VarChar
    50

    255


    8
    dizhi
    VarChar
    50

    255


    9
    beizhu
    VarChar
    50

    255


    10
    addtime
    DateTime
    8

    23



    rukujilu表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    bianhao
    VarChar
    50

    255


    3
    mingcheng
    VarChar
    50

    255


    4
    kucun
    VarChar
    50

    255


    5
    rukushuliang
    VarChar
    50

    255


    6
    gongyingshang
    VarChar
    50

    255


    7
    beizhu
    VarChar
    50

    255


    8
    caozuoyuan
    VarChar
    50

    255


    9
    addtime
    DateTime
    8

    23



    shangpinleibie表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    leibiemingcheng
    VarChar
    50

    255


    3
    addtime
    DateTime
    8

    23



    shangpinxinxi表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    bianhao
    VarChar
    50

    255


    3
    mingcheng
    VarChar
    50

    255


    4
    leibie
    VarChar
    50

    255


    5
    tupian
    VarChar
    50

    255


    6
    beizhu
    VarChar
    50

    255


    7
    addtime
    DateTime
    8

    23


    8
    jiage
    VarChar
    50

    255


    9
    kucun
    Int
    4

    10



    baosunjilu表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    bianhao
    VarChar
    50

    255


    3
    mingcheng
    VarChar
    50

    255


    4
    sunhuaichengdu
    VarChar
    50

    255


    5
    sunhuaishiyin
    text





    6
    sunhuaishuliang
    VarChar
    50

    255


    7
    caozuoren
    VarChar
    50

    255


    8
    xingming
    VarChar
    50

    255


    9
    addtime
    datetime
    8

    23



    kaoqinjilu表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    gonghao
    VarChar
    50

    255


    3
    xingming
    VarChar
    50

    255


    4
    kaoqin
    VarChar
    50

    255


    5
    riqi
    VarChar
    50

    255


    6
    beizhu
    VarChar
    50

    255


    7
    addtime
    datetime
    8

    23



    yuangonggongzi表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    gonghao
    VarChar
    50

    255


    3
    xingming
    VarChar
    50

    255


    4
    nianfen
    VarChar
    50

    255


    5
    yuefen
    VarChar
    50

    255


    6
    gongzi
    VarChar
    50

    255


    7
    beizhu
    VarChar
    50

    255


    8
    addtime
    datetime
    8

    23



    yuangongxinxi表



    序号
    字段名称
    字段类型
    大小
    允许为空
    最大长度




    1
    ID
    Int
    4
    自增编号
    10


    2
    gonghao
    VarChar
    50

    255


    3
    xingming
    VarChar
    50

    255


    4
    xingbie
    VarChar
    50

    255


    5
    chushengnianyue
    VarChar
    50

    255


    6
    dianhua
    VarChar
    50

    255


    7
    youxiang
    VarChar
    50

    255


    8
    addtime
    datetime
    8

    23


    9
    jiguan
    VarChar
    50

    255


    10
    zhaopian
    VarChar
    50

    255


    11
    shenfenzheng
    Text





    12
    mima
    VarChar
    50

    255



    5 系统实现与编码5.1 管理员角色模块实现5.1.1 登录页面登录页面用于管理员与员工的登录,管理员、员工输入账号,密码信息进行登录。登录成功自动转入主页面,失败则提示。登录主页面如图5.1所示,账号密码输入错误页面如图5.2所示,权限类型错误页面如图5.3所示。
    登录主页面

    管理员权限类型选择错误

    账号密码输入错误

    不同用户类型登录判断的设计的关键代码如下:
    if(!RS_result.next()){ out.print("<script>alert('你输入的用户不存在或密码错误,请重新登录!');window.history.go(-1);</script>");}else{ if(cx.equals("员工")) { session.setAttribute("username",uid); session.setAttribute("cx","员工"); response.sendRedirect("main.jsp"); } else { System.out.println(cx.trim()); System.out.println(RS_result.getString("cx").trim()); if(cx.trim().equals(RS_result.getString("cx").trim())){ session.setAttribute("username",uid); session.setAttribute("cx",RS_result.getString("cx")); response.sendRedirect("main.jsp"); } else{ out.print("<script>alert('你输入的权限类型不符,请重新登录!');window.history.go(-1);</script>"); }
    5.1.2 管理员首页页面系统主界面简洁,最上方显示的是系统名称与当前登录用户及当前时间信息。紧接着左边为管理员操作业务导航,右边为显示信息。系统主页面如图5.4所示。

    系统主页的业务导航关键代码如下:
    function showsubmenu(sid){ whichEl = eval("submenu" + sid); if (whichEl.style.display == "none") { eval("submenu" + sid + ".style.display=\"\";"); } else { eval("submenu" + sid + ".style.display=\"none\";"); }}
    5.1.3 管理员用户管理点击业务导航“系统设置”,下方显示出管理员用户管理功能条。修改管理员用户信息页面如图5.5所示,普通管理员无此权限如图5.6所示。
    管理员用户管理

    普通管理员无此权限

    管理员用户管理关键代码如下:
    if (request.getSession().getAttribute("cx").equals("超级管理员")){ }else{ out.print("<script>alert('对不起,您没有这个权限!!');history.back();</script>");}String username=request.getParameter("username");String pwd=request.getParameter("pwd1");ResultSet RS_result=connDbBean.executeQuery("select * from allusers where username='"+username+"'");
    5.1.4 商品类别添加/查询/修改/删除点击业务导航“商品信息管理”,下方显示出商品类别添加与查询功能条。添加商品类别页面如图5.7所示,商品类别查询修改删除如图5.8所示。
    添加商品类别

    商品类别查询修改删除

    商品类型查询页面关键代码如下:
    String sql="";sql="select * from shangpinleibie where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and leibiemingcheng like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}sql=sql+" order by id desc";
    5.1.5 商品信息添加/查询/修改/删除点击业务导航“商品信息管理”,下方显示出商品信息添加与查询功能条。添加商品信息页面如图5.9所示,商品信息查询修改删除如图5.10所示。
    添加商品信息

    商品信息查询修改删除

    商品信息添加上传关键代码如下:
    var pop=new Popup({ contentType:1,isReloadOnClose:false,width:300,height:50});pop.setContent("contentUrl","upload.jsp?Result="+tt);pop.setContent("title","文件上传");pop.build();pop.show();int file_size = myFile.getSize(); //取得文件的大小 (单位是b) file_name=myFile.getFileName();System.out.println("文件大小:"+file_size+"文件名称:"+file_name);newFile1Name=new Date().getTime()+file_name.substring(file_name.indexOf("."));System.out.println("新文件名称:"+newFile1Name);String saveurl = request.getSession().getServletContext().getRealPath("upload");saveurl = saveurl+"/"+newFile1Name;myFile.saveAs(saveurl, mySmartUpload.SAVE_PHYSICAL);
    5.1.6 供应商信息添加/查询/修改/删除点击业务导航“供应商管理”,下方显示出供应商信息添加与查询功能条。添加供应商信息页面如图5.11所示,供应商信息查询修改删除如图5.12所示。
    添加供应商页面

    供应商查询修改删除页面

    供应商查询关键代码如下:
    sql="select * from gongyingshangxinxi where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and bianhao like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}if(request.getParameter("mingcheng")=="" ||request.getParameter("mingcheng")==null ){}else{ sql=sql+" and gongsimingcheng like '%"+new String(request.getParameter("mingcheng").getBytes("8859_1"))+"%'";}sql=sql+" order by id desc";
    5.1.7 入库记录信息添加/查询/修改/删除点击业务导航“库存管理”,下方显示出入库记录添加与查询功能条。添加入库记录信息页面如图5.13所示,入库记录信息查询修改删除如图5.14所示。
    添加入库记录

    入库记录查询修改删除

    入库记录关键代码如下:
    sql="select * from rukujilu where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and bianhao like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}if(request.getParameter("mingcheng")=="" ||request.getParameter("mingcheng")==null ){}else{ sql=sql+" and mingcheng like '%"+new String(request.getParameter("mingcheng").getBytes("8859_1"))+"%'";}sql=sql+" order by id desc";
    5.1.8 出库记录信息添加/查询/修改/删除点击业务导航“库存管理”,下方显示出出库记录添加与查询功能条。添加出库记录信息页面如图5.15所示,出库记录信息查询修改删除如图5.16所示。
    添加出库记录

    出库记录查询修改删除

    出库记录关键代码如下:
    sql="select * from chukujilu where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and bianhao like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}if(request.getParameter("mingcheng")=="" ||request.getParameter("mingcheng")==null ){}else{ sql=sql+" and mingcheng like '%"+new String(request.getParameter("mingcheng").getBytes("8859_1"))+"%'";}sql=sql+" order by id desc";
    5.1.9 库存查询点击业务导航“库存管理”,下方显示出库存查询功能条。库存查询信息页面如图5.17所示。

    库存查询关键代码如下:
    $("#riqi").ligerDateEditor({format: "yyyy-MM-dd", width:133});sql="select * from shangpinxinxi where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and bianhao like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}if(request.getParameter("mingcheng")=="" ||request.getParameter("mingcheng")==null ){}else{ sql=sql+" and mingcheng like '%"+new String(request.getParameter("mingcheng").getBytes("8859_1"))+"%'";}sql=sql+" order by id desc";
    5.1.10 利润查询点击业务导航“库存管理”,下方显示出利润查询功能条。利润查询信息页面如图5.18所示。

    利润查询关键代码如下:
    sql="select * from rukujilu where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and bianhao like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}if(request.getParameter("mingcheng")=="" ||request.getParameter("mingcheng")==null ){}else{ sql=sql+" and mingcheng like '%"+new String(request.getParameter("mingcheng").getBytes("8859_1"))+"%'";}
    5.1.11 客户添加/查询/修改/删除点击业务导航“客户管理”,下方显示出客户添加与查询功能条。客户添加信息页面如图5.19所示。客户信息查询修改删除页面如图5.20所示。
    客户添加

    客户信息查询修改删除

    客户信息关键代码如下:
    sql="select * from kehuxinxi where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and bianhao like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}if(request.getParameter("mingcheng")=="" ||request.getParameter("mingcheng")==null ){}else{ sql=sql+" and xingming like '%"+new
    5.1.12 个人资料管理点击业务导航“个人资料管理”,下方显示出修改密码功能条。修改密码页面如图5.21所示。

    修改密码关键代码如下:
    if(pwd.equals(ymm)){ String sql="update allusers set pwd='"+xmm1+"' where username='"+request.getSession().getAttribute("username")+"'"; connDbBean.executeUpdate(sql); out.print("<script>alert('修改成功!!');window.history.go(-1);</script>");}else{ out.print("<script>alert('对不起,您的原密码不正确,请重试!');window.history.go(-1);</script>");}
    5.1.13 员工信息添加/查询/修改/删除点击业务导航“员工信息管理”,下方显示出员工信息添加与查询功能条。员工信息添加信息页面如图5.22所示。员工信息查询修改删除页面如图5.23所示。
    员工信息添加

    员工信息查询修改删除

    员工信息关键代码如下:
    $(function() { $("#chushengnianyue").ligerDateEditor({format: "yyyy-MM-dd", width:133});});
    5.1.14 员工考勤添加/查询/修改/删除点击业务导航“员工信息管理”,下方显示出员工考勤添加与查询功能条。员工考勤添加信息页面如图5.24所示。员工考勤查询修改删除页面如图5.25所示。
    员工考勤信息添加

    员工考勤信息查询修改删除

    员工考勤关键代码如下:
    sql="select * from kaoqinjilu where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and gonghao like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}if(request.getParameter("mingcheng")=="" ||request.getParameter("mingcheng")==null ){}else{ sql=sql+" and xingming like '%"+new String(request.getParameter("mingcheng").getBytes("8859_1"))+"%'";}if(request.getParameter("kaoqin")=="" ||request.getParameter("kaoqin")==null ){}else{ sql=sql+" and kaoqin like '%"+new String(request.getParameter("kaoqin").getBytes("8859_1"))+"%'";}sql=sql+" order by id desc";
    5.1.15 员工工资添加/查询/修改/删除点击业务导航“员工信息管理”,下方显示出员工工资添加与查询功能条。员工工资添加信息页面如图5.26所示。员工工资查询修改删除页面如图5.27所示。
    员工工资添加

    员工工资查询修改删除

    员工工资关键代码如下:
    sql="select * from yuangonggongzi where 1=1";if(request.getParameter("bianhao")=="" ||request.getParameter("bianhao")==null ){}else{ sql=sql+" and gonghao like '%"+new String(request.getParameter("bianhao").getBytes("8859_1"))+"%'";}if(request.getParameter("mingcheng")=="" ||request.getParameter("mingcheng")==null ){}else{ sql=sql+" and xingming like '%"+new String(request.getParameter("mingcheng").getBytes("8859_1"))+"%'";}if(request.getParameter("nianfen")=="" ||request.getParameter("nianfen")==null )
    5.1.16 退货记录添加/查询/修改/删除点击业务导航“退货管理”,下方显示出退货记录添加与查询功能条。退货记录添加信息页面如图5.28所示。退货记录查询修改删除页面如图5.29所示。
    退货记录添加

    退货记录查询修改删除

    退货记录关键代码如下:
    int curpage=1;//当前页int page_record=10;//每页显示的记录数int zgs=0;int zys=0;//用下面的方法(sql查询完成,速度快)String hsgnpage=request.getParameter("page");String fysql="select count(id) as ss from baosunjilu";ResultSet RS_resultfy=connDbBean.executeQuery(fysql);
    5.1.17 数据备份点击业务导航“系统管理”,下方显示出数据备份功能条。数据备份成功页面如图5.30所示。

    数据备份关键代码如下:
    System.out.println("开始.....");String command = "c:\\mysqldump -uroot -proot jspspxsglqe> D:/jspspxsglqe.sql"; //mysqldump -h[host] -u[name] -p[pass] --opt[option] [database]>[path]//我试过mysqldump -h 127.0.0.1 --opt test > c:/test.txt -u -p *** 这样虽然能通过,但是里面是没有代码的。Runtime.getRuntime().exec("cmd /c "+command); System.out.println("备份成功");out.print("<script>alert('操作成功!!,您的数据库已成功备份于D:/jspspxsglqe.sql');location.href='sy.jsp';</script>");
    5.2 员工模块实现5.2.1 个人资料管理点击业务导航“个人资料管理”,下方显示出个人资料管理功能条。个人资料管理页面如图5.31所示。

    5.2.2 我的考勤点击业务导航“我的考勤”,下方显示出我的考勤功能条。我的考勤页面如图5.32所示。

    5.2.3 我的工资点击业务导航“我的工资”,下方显示出我的工资功能条。我的工资页面如图5.32所示。

    6 系统测试6.1 界面测试界面测试是系统测试中最基本的部分,主要包括以下两个方面的内容:

    内容布局是否合理,系统界面是否美观,是否符合用户需求
    页面在窗口中的显示是否正确,表单样式大小、格式是否合适

    6.2 功能测试登录账号密码校验测试页面如图6.1所示。

    登录管理员权限测试页面如图6.2所示。

    添加普通管理员用户名已存在测试页面如图6.3所示。

    修改密码原密码输入错误测试页面如图6.4所示。

    出库库存不足测试页面如图6.5所示。

    Popup弹框图片上传成功并重命名测试页面如图6.6及6.7所示。
    图片上传成功并重命名测试页面1

    图片上传成功并重命名测试页面2

    数据库数据备份成功测试页面如图6.8及6.9所示。
    数据库数据备份成功测试1

    数据库数据备份成功测试2

    利润打印测试页面如图6.10所示。

    7 总结经过两个多月的努力,系统已经基本开发完毕。虽然本系统只是一个电子产品销售管理系统,但是也实现了许多基本功能,比如本系统能够实现管理员对公司产品的信息,供应商,入库,出库,客户,员工,数据等信息进行维护。员工可登录系统进行查询个人信息,考勤,工资等信息。但是毕竟个人能力有限,系统仍然存在许多不完善的地方,比如功能实现不够全面,用户界面不太美观等,仍都有待改进提高。在整个毕业设计的过程中,我又重新回顾了Web等相关方面的知识,进一步了解了需求分析的重要性;丰富了我软件开发的经验,加深了我对书本知识的掌握程度,同时也学到了许多新的知识。
    随着互联网技术的不断发展,生活必将和Web越来越紧密的联系起来。电子产品销售管理系统是新时代的产物,同时也是互联网技术高速发展的有力证据,以后的发展也必将更加趋于完美。
    参考文献[1] 刮代玉.房地产销售管理系统设计与实现[D].成都:电子科技大学,2014.
    [2] 刘鹏.中铁二局房地产楼盘销售管理系统的设计与实现[D]. 成都:电子科技大学,2015.
    [3] 林莹.某公司信息管理之销售管理系统的设计与实现[D]. 成都:电子科技大学,2014.
    [4] 余强.基于B/S的房屋中介系统的设计与实现[D]. 成都:电子科技大学,2014.
    [5] 宗良平.基于JavaEE构架的房产公司销售管理系统设计与实现[D].成都:电子科技大学,2014.
    [6] 赵卓媛.房屋销售管理信息系统[D].长春:吉林大学,2014.
    [7] 姜萍.基于MySqlServer的房地产销售管理系统设计与开发[D].长春:吉林大学,2014.
    [8] 刘伟.楼盘销售管理系统的设计与实现[D]. 长春:吉林大学,2014.
    [9] 孙德忠,徐鸣.新时期房地产管理系统应用与研究[J].信息与电脑(理论版),2016,01:51-52.
    [10] 成琳.不动产登记与房屋交易管理[J].中国房地产,2015,31:33-35.
    [11] 周俊男.房地产销售管理系统的设计与实现分析[J/OL].电脑知识与技术,2016(06).http://www.cnki.net/kcms/detail/10.14004/j.cnki.ckt.2016.0687.html
    [12] 张雨.房屋销售管理信息系统之探微[J].科技风,2015,02:258-259.
    [13] 刘世杰.中小型房地产企业销售管理系统的设计和实现[D].兰州:兰州大学,2013.
    [14] 蔡海杰.移动售楼系统的设计与实现[D]. 长春:吉林大学,2014.
    [15] 刘喆.基于Web的三维立体可视化房地产销售管理信息系统[D].天津:天津大学,2014.
    [16] 史肖杏.基于ADDIE模式的企业快速网络课程研究[D].上海:上海外国语大学,2014.
    1 评论 1 下载 2020-08-27 10:16:25 下载需要13点积分
  • 基于ThinkPhp框架的高校图书馆藏书借阅系统

    一、概述使用了ThinkPHP,虽然本人觉得该框架实在有点反人类,但是也算是第一次使用PHP的框架。可以对于MVC有更深的理解。
    前端界面

    后台界面

    登录后台的默认管理员是:2333333333,密码:admin。
    二、功能设计2.1 数据库设计2.1.1 需求分析(1)系统任务我们所要做的是一个高校图书馆藏书借阅系统,用于读者对图书的检索、浏览、借阅。因此,需要的功能包括对图书的检索查询、借阅、预约、续借、安全性保障。
    而在拓展功能板块,我们的考虑为以图书为中心建立起图书与图书之间的关系,图书与人之间的关系,以图书为中心的推荐系统强调的是如何建立起有效的链接关系。
    (2)有需求的用户组成对此系统有需求的用户是有浏览、借阅图书需求的读者——由教师、学生、普通游客组成。其中,教师、学生是有借阅/预约图书资格的用户,而且借阅权限有所不同;普通游客是那些非本校的、可以浏览、检索此系统所藏图书而没有借阅和预约资格的用户。
    (3)用户的信息要求教师与学生使用此系统主要用于检索、浏览、借阅图书,包括查询书目信息,借书、还书,预约与续借。教师与学生为获得借阅资格,需要在此系统上进行用户注册并登陆,然后通过检索,并根据每本书的书目信息——其ISBN、标题、摘要、封面图、出版者、出版年份、中图法的图书分类号、价格来确定所借阅的图书。
    教师与学生还有对自身用户状态的信息需求,包括借阅记录、预约记录、信用值、是否被罚款等。同时,还有对所需图书的借阅状态的信息需求,比如只有知道此书是否已被他人预约而确定能否续借等。额外的需求还有图书推荐等。
    普通游客不需要进行用户注册和登陆,只是浏览,其需求包括了解此系统内所含图书的大体信息,比如标题、封面图、摘要等从而了解馆藏的大致情况。
    (4)系统边界对此系统的人工操作包括供图书馆管理员操作的图书的录入,新用户的等级,图书的修改,用户的修改等,而数据库管理员拥有上述的所有权限,并且能够定义用户的权限等。总体而言,DBA拥有对于系统的全部掌握。
    2.1.2 概念结构设计首先分析数据库描述的主要对象中有哪些实体,最主要的便是书和用户,此外还有拥有最高操作权限的数据库管理员。

    书和用户存在着:借阅、(反复)预约关系
    借阅会有如下情形:按时归还与逾期还书、丢失、续借

    预约则有如下要求:

    仅能在到期时间前5天进行续借
    如果此书已被人预约,则不可续借
    多人续借同一本书则按照预约时间进行排队

    特别注意的地方:

    作者和译者本是书的两个属性,但是现实中存在一本书存在多个作者和译者的情形,所以需要单独为作者和译者建立一个表(由于作者和译者没有属性上的差别,且同一个人既可能是作者有可能是另外书籍的译者),另外建立书-作者表和书-译者表
    图书有ISBN号作为同一版本同一书籍的唯一标识码,但是图书管中存在同一本书的多个复本,由此建立书目表和复本表。书目表记录同一书籍的书目信息,复本表记录各个复本的流通情况
    用户分为三类:学生读者、教师读者、图书馆管理员。其中学生读者和教师读者的借阅权限有所不同;图书馆管理员可以修改学生和教师的权限,修改书目信息,但不能修改自己的权限;数据库管理员可以修改三类用户的权限和数据库的其它信息

    E-R图如下:

    2.1.3 逻辑结构设计共有10张表:

    图书书目表
    图书复本表
    著者(即作者与译者)表
    书-作者表
    书-译者表
    用户表
    借阅记录表
    预约记录表
    数据库管理员表
    评论表

    各表的具体属性如下:
    图书书目表:yzz_book



    id
    ISBN
    abstract
    title
    cover
    publisher
    publish-year
    type
    price




    主码,图书的流水编号,用于唯一标记书。相对于ISBN更加易于修改和查询。
    国际标准书号,可以唯一标识书
    文摘
    标题
    图书封面
    出版者
    出版年份
    中图法的图书分类号
    书的价格



    图书复本表:yzz_copy



    id
    book_id
    is_borrowed
    is_booked
    location




    主码,复本的流水编号
    相应的图书的书目编号
    此复本是否被借出
    此复本是否被预约
    复本的馆藏位置



    著者(即作者与译者)表:yzz_creator



    id
    Name
    country
    birthday




    著者的流水编号
    姓名
    国家
    出生年份



    书-作者表:yzz_author



    author_id
    book_id




    作者的流水编号
    书目的流水编号



    书-译者表:yzz_translator



    translatorr_id
    book_id




    译者的流水编号
    书目的流水编号



    用户表



    id
    password
    name
    role
    gender
    depart
    birthday
    email
    credit
    book_num




    用户的密码
    密码
    姓名
    用户类别:教师/学生/图书馆管理员
    性别
    院系
    生日
    电子邮件
    信用值(如果读者逾期还书,则信用值下降,低于10则不可再借书,需要充值恢复信用)
    可借阅图书上限



    借阅记录表:yzz_book_borrow



    id
    userid
    bookid
    borrowtime
    returntime
    status
    xjcs




    借阅记录流水编号
    用户的账号
    复本的编号
    借出时间
    归还时间(未还则为NULL)
    还书:0未归还,1已归还
    续借次数



    预约记录表:yzz_book_booked



    id
    userid
    bookid
    booktime
    status




    预约记录流水编号
    用户的号
    复本的编号
    预约时间
    预约是否有效:仍在预约1,借书成功0



    数据库管理员表:DBA



    id
    password




    DBA账号
    密码



    评论表:remark



    id
    userid
    content
    bookid
    replyid




    评论的流水编号
    用户账号
    评论内容
    评论的书目的编号
    被复的评论的编号,如果为原创话题则为NULL



    2.2 RBAC角色结构2.2.1 RBAC:基于角色的访问控制(Role-Based Access Control)共有4个角色:普通游客,教师/学生,图书馆管理员,DBA。

    普通游客:可以进行检索、浏览,不能借阅或者预约
    教师/学生:除了检索或者浏览之外,登陆之后可以借阅/预约图书
    图书馆管理员:除了拥有“教师/学生”的角色的权限外,可以对“教师/学生”的操作记录、借阅和预约、信用值、借书上限进行修改

    DBA:数据库管理员对数据库拥有最高权限,可以修改教师/学生和图书馆管理员这两类角色的相关记录
    2.2.2 页面模块
    Admin:供图书馆管理员操作
    DBA:供数据库管理员操作
    User:供登录的在校用户操作
    Home:检索,在前端使用
    PublicUse:函数、功能部分,在登录时使用

    2.3 MVC我们采用了MVC软件构建模式, MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。其中:

    Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据
    View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的
    Controller(控制器)是应用程序中处理用户交互的部分。可以接受访问并对访问做出应答。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

    MVC的主要优点有:

    MVC 分层有助于管理复杂的应用程序。这是因为可以在一个时间内专门关注一个方面。例如,可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易
    MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑

    2.4 系统安全2.4.1 密码安全:MD5使用了MD5(Message Digest Algorithm 5),是目前应用最广泛的Hash算法,具有单向性、抗冲突性、映射分布均匀性和差分分布均匀性等关键特性。
    它的算法的特征是不可逆性,并且才计算的时候所有的数据都参与了运算,其中任何一个数据变化了都会导致计算出来的Hash值完全不同,所以通常用来校验数据是否正确或用作身份验证。
    我们数据库中的密码是经过MD5等Hash算法算出来的Hash值进行保存的。用户登录时将根据实时输入得到一个Hash值,与数据库中密文储存的密码相匹配。
    2.4.2 防止重复登录:Session记录Session相当于服务器端的缓存,通过Session的记录判断用户是否已经登录,如果不存在相应的记录则跳转到登陆界面。
    2.5 查找功能
    系统支持多字段进行检索,检索字段包括标题、文摘、作者等等
    图书检索的显示结果会分页显示,便于用户浏览

    2.6 图书的相关操作不同用户可以进行图书相关的操作如下:



    普通访客
    教师/学生
    图书馆管理员
    DBA




    查询书目信息





    借书、还书





    预约与续借





    书目信息修改






    注:DBA负责整个数据库的宏观维护,不参与具体的书籍流通过程。
    2.7 用户相关操作对用户的相关操作,仅对图书馆管理员和DBA两类角色开放:

    两类角色都可以进行新用户的注册与用户的删除
    修改数据库记录:图书馆管理员可以修改“教师/学生”的相关记录,但不能修改自己或者其他管理员的记录;DBA可以对用户授权,并修改其它所有用户的记录
    用户的借书上限和信用值和角色类型有关。比如教师、学生、图书馆管理员的借书上限分别为40、30、50。之后可由图书馆管理员和DBA进行修改。信用值默认为均为100

    2.8 记录的保存小组的数据库会存储借书、预约和续借的记录,这些日志记录可以用于之后的数据分析,进一步应用于文献的推荐,分析书籍与读者的内在联系,使得图书的流通过程成为可以强化图书馆服务职能的工具。
    2.9 还书提醒、罚款与缴费如果读者距离应还书时间仅有5天时,系统会提醒读者应该及时还书,并提供网上续借的跳转网页链接。当此复本没有被预约时,读者可以进行续借。
    如果读者逾期还书,那么相应地会产生罚款与催款两种体系。我们使用的是信用额,在其归还书的时候根据其超时进行超时的罚款。

    罚款:如果逾期还书,那么超时1天信用值下降1。信用值默认为100,当信用值下降到10以下时读者不可再借阅其他书籍
    缴费:当信用值下降到10以下时,读者需要向图书馆管理员缴纳欠款,由图书馆管理员手动修改回信用值

    三、数控设计3.1 参照完整性为了保证数据库系统正常运行,我们在系统内设置了外键,提供参照完整性方案。
    如在book_borrow、book_booked和book三个表中,book_borrow表中的bookid不是该表的主键,但和book表中的id对应,是外键。这种设定能保证在book_borrow中出现的书籍条目在数据库中都能找到,即被借出的书都是图书馆中存在的书。
    同样的,book_booked表中的bookid也是外键,这保证了在图书馆系统中被预定的书都是图书馆中存在的书。
    另外,在translator表和author表中的bookid也都是外键,这两个外键确保了在译者、著者表中的作者都能和系统中的书籍相对应。
    其中,translator是允许为空的,因为中文的书籍不需要翻译,而author是不允许为空的,因为各个图书都有对应的作者(编纂集体)。
    3.2 Ajax保证完整性在设计注册、借还等页面时,我们使用了异步javascript和XML技术,保证局部刷新时不影响整体页面,也不需要用户来回登录注册页面。
    Ajax是用于创建快速动态网页的技术,通过在后台和服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着不需要重新载入整个网页来显示新内容,而只需要进行局部的刷新来获得变更内容。
    在我们的系统中,用户注册时会被要求输入用户名,因为实际情况中可能使用的用户是非常多的,难免造成用户名一致的问题。当用户名与之前注册的用户一致时,会直接显示错误提示,要求用户更换用户名,而不需要在注册提交时再告知重复,让用户重新填写所有内容。
    另外,在借书时系统会要求用户登录自己的帐号,此时如果用户未注册,却输入了已经存在的用户名,也会提示用户名被注册。
    这种设计主要目的在于为用户节省时间,一方面保证了系统中的注册用户是唯一的,实现了系统完整性的要求;另一方面方便用户注册,不需要一次次输入全部注册信息。
    3.3 时间戳时间戳是一个字符序列,唯一地标识某一刻的时间。数字时间戳技术是数字签名技术的一种变种。在电子商务交易中,时间戳是重要信息,它和签名一样能防止文件或合同被篡改。
    在数据库中,在表上加时间戳来制作索引,能方便我们在后台查找某一时间内被借走的图书,方便管理员的工作。由于时间戳是按格林威治时间至今换算为秒来计算,基本上能够保证唯一性,在检查图书流通记录时是很好的依据。
    四、关键功能的算法设计4.1 ThinkPHP框架ThinkPHP是快速兼容简单的php开发框架,使用面向对象的开发结构和MVC模式,融合了Struts的思想和标签库、ROR的ORM映射和ActiveRecord模式。ThinkPHP能解决应用开发中的大多数需要,包含了底层架构、兼容处理、基类库、数据库访问层、模版引擎、缓存机制、插件机制、角色认证、表单处理等常用组件。
    在使用ThinkPHP框架时,我们能将更多的精力放在图书馆系统的逻辑设计、功能实现上,因为繁琐的基本功能或需要多次使用的程序段都能直接从组件中调用。在图书管理系统中,图书管理员的身份相对于用户和图书记录来说是长期身份,在保存到数据库后一段时间内不会变动。
    ThinkPHP中的静态模型功能能在访问数据库后生成缓存,之后再次查看管理员记录表时就不需要再次链接数据库,而直接从缓存文件中查看,能节省时间提高效率。
    另外,它还提供了灵活和方便的数据操作方法,实现了对数据库的创建、读取、更新和删除,方便在数据库构建过程中使用。
    4.2 ORM对象关系映射(ORM)是用于实现面向对象编程语言里不同类型系统的数据转换时采用的技术。面向对象是从计算机编程技术的角度衍生的,而关系数据库是从严格的数学模型推导衍生的,ORM为这两个不同领域工具的衔接提供了帮助。
    这使得我们在开发图书馆管理系统时,减少数据访问层的代码编写数量,不用频繁地涉及数据库的保存、删除、更新和插入操作。使用ORM保存、删除和更新对象,我们能更集中于功能的实现和解决逻辑问题,而SQL语句的输入和调用都能交给ORM来实现。
    4.3 CURDCURD表示创建、更新、读取和删除四个基本操作。它们在数据库中处于基础位置,主要通过关系型数据库系统中的结构化查询语言(SQL)实现的。
    我们的图书馆管理系统能为读者提供基本的读取查询操作,方便其浏览图书。图书管理员和系统管理员则可以参与到图书表内容的创建、更新和删除中。
    4.4 RBACRBAC是基于角色的访问控制。在RBAC中,权限与角色相关联,用户通过成为适当角色成员来获得这些角色的权限,能极大地简化权限的管理。在一个组织中,角色为了完成某种工作而创造,用户则依据他的责任和资格被委派相应的角色,并可以很容易的在角色之间转换。同时,角色可以因实际需要被赋予新的权限,也能随时收回被赋予的权限。
    在我们的图书馆系统中,使用者被分为了四个主要权限:系统管理员、图书管理员、学生和老师。他们分别使用不同的权限。如教师和学生都是直接用户,他们的权限包括浏览、借阅、预定和续借等;图书管理员还需要对图书进行登记,在归还时改变图书的状态,因而有操作图书表的权限;系统管理员对整个数据库进行维护,其权限范围更广。
    通过对不同的角色赋权,再将角色赋予用户,能极大地减少管理员工作,提高效率。
    4.5 文件上传在图书管理员后台,可以进行增加图书的操作。我们的系统不仅支持文字的录入,即书目相关信息、作者相关信息等内容的记录;还支持图片上传功能,当管理员登记一本图书时,他还可以选择上传图书封面图片,这样在读者借阅时就能直接浏览图书封面,来确定是否是自己需要的图书。
    文件上传功能还为图书馆功能拓展提供了帮助。如可以增加儿童图书馆,儿童在选择书籍时可能更关注书的颜色,对他们而言,鲜亮卡通的颜色搭配更能提高他们的注意力。这时因为我们在图书登记时就加入了封面,能很方便的进行图书颜色分类,实现功能拓展,而不需要重新对每本书的外观进行描述。
    4.6 其他4.6.1 分页在本次课程作业中,我们的初步设想是向图书馆系统中增加100本书,跟实际情况相比,100本书是很少的量,完全可以通过平铺浏览的方式直接显示出来。
    但考虑到实际工作中,图书馆系统面对的常常是十万册、百万册的图书,即便是精确检索的记录也会提供诸多近似结果。这时分页就显得尤为重要了。
    分页可以选择相关性最高的图书优先显示在第一页,如果这一页中有读者需要的书本,就能大量减少读者的使用时间,提高借阅效率。同时,如果读者采用的查询词不够精确,返回了大量结果,则可以分页显示来减少视觉压力,也能提高系统的反应速度,每一次响应时间变短,但切换页面时的响应次数变多,变相地减少读者的等待时间,提高用户体验。
    4.6.2 验证码验证码可以自动区分使用方是人还是计算机,可以防止恶意破解密码、刷票等恶意行为。对图书馆管理系统来说,在注册、借阅环节采用验证码,可以防止某些用户使用机器高频率、重复注册来破坏系统,或者对一个用户的密码进行多次尝试暴力破解,也能在借书和预定环节的逻辑判断上更加公平。
    在我们的系统中,注册时,用户需要参照给出的图片输入其中的数字和字母,如验证正确则判断是人工注册,可以进行下一步环节;如因机器注册而不能识别,则不允许进入注册环节。另外,用户还可以手动刷新验证码来选择有较高清晰度的图片进行验证。
    4.6.3 日志记录我们的图书馆系统在图书的每次变动后都会增加一条新记录。如读者A借阅了图书1,日志文件中就会生成一条新纪录。当图书1的借阅时间到期,而读者A还没有看完时,他可以选择续借,这时会生成新记录。而读者B需要图书1,则可以在我们的前端预定这本书,此时新增booked记录。当一本图书被预定又被借阅时,系统会判断先后,被预定的图书不允许再次续借,而预定会排在之前的续借完成后才会提醒。通过日志文件,我们就能清楚的分析图书流通过程。
    另一方面,当图书馆系统出现问题,如数据丢失、数据库损坏、病毒或人为破坏时,我们可以读取日志记录来恢复之前的借阅,并在新的记录中延续旧日志,实现图书记录工作长期化和有效化。
    五、进一步扩展完善的设想5.1 图书的近似匹配5.1.1 摘要的切词处理由于时间有限,无法收集图书全文信息,而只是录入了相应的摘要信息。因此本图书馆系统的全文检索实质上是根据用户输入的检索词与摘要的匹配来实现的。单纯的全文匹配显然无法满足用户需求,很有可能会遗漏许多和用户需要有高度相关性却和检索词稍有区别的图书。于是我们便不可避免的遇到了摘要的切词处理问题,只有通过合适的中文切分词算法,将摘要自动切分,便可以进行精准的词匹配。
    而进行切词之前,还需要使用停用词表,去掉在每篇文摘中都会出现的高频词,如“的”,“本书”之类的词语。当去掉这些词语之后,倒排档的规模会得到极大的缩减,从而使得整个系统的运算速度大幅度提高。
    具体的操作步骤便为对照《哈工大停用词表》,去掉在每篇文献中出现频道都很高的词,如“一些”,“啊”,“的”等词语。之后再使用《NLPIR/ICTCLAS汉语分词系统2015版》,对我们的所有文摘进行切分词,进而得到所有出现过的词语的倒排档统计。并进一步利用倒排档统计进行接下来的工作,如tf*idf的计算。
    5.1.2 tf*idf通过前文阐述的中文切分词技术,我们已经实现了较为精准的匹配,保证用户输入检索词之后所发起的搜索得到的结果都是和用户实际需求有较高相关性的,接下来需要处理的便是排序的问题。
    比如用户输入“信息管理系统”,如何将相关度最高的图书排在最前列的位置,如何使得《管理信息系统》这本书的排序高于《信息管理系历史回顾》。这便是需要通过tf*idf来解决的问题。此外,比较两本书的相关程度,也是通过向量空间模型来计算tf*idf,从而发现不同图书之间的相关性,进而为读者做图书推荐。
    通过自动切分词结合通用词表,便可以把所有图书的文摘中出现的关键词提取,进而建立倒排档。而tf(I,j)是指关键词i在文献j中出现的次数,意即其词频。Idf则是分配给关键词的相对权重,其中常用词的idf值较低,而使用较少的词idf值较高。常用的idf公式为idf=log(N/n),其中N为总的文献篇数,n指某一词语在全部N篇文献中出现了n次。如果某个词语在全部N篇文章中都有出现,则其idf值等于log(1),等于0。而如果某个关键词则全部N篇文献中总共只出现在某一篇文献中,则其idf值等于log(N)。
    此外,我们还需要考虑摘要长度不同带来的问题,200字的摘要中和20字的摘要中,“信息”一词都出现了3次,显然“信息”在20字文摘中的重要程度更高。因此,我们需要将文摘长度归一化。在此处理的办法即为通过文摘中每个词语的绝对词频除以其文摘向量的长度。
    当以上三项准备就绪之后,我们便可以通过计算检索词与文摘之间的tf*idf值来进行检索结果的排序。若关键词与文摘的tf*idf结果为0,则统一不显示在检索结果中;其他情况下,则通过比较,将tf*idf值较高的摘要代表的图书排在靠前的位置,将tf*idf值较低的排在靠后的位置。
    并且,我们可以用向量空间模型来计算两篇文摘之间的相似度,若两篇文摘完全一样,则其相关度为1,若两篇文摘之间没有任何共同的关键词,则其相关性为0,而在为读者进行相关图书推荐时,我们便只需要将与用户借阅或收藏的图书的相关性较高的图书展现出来即可。
    5.2 通过图书找人的模式进行可视化通过图书找人的模式是我们图书馆系统的创新所在。传统的思维方式为通过读者的借阅历史记录分析读者感兴趣的话题内容,并根据向量空间模型为读者推荐与该书相似度较高的其他图书。
    我们的想法为:

    首先,通过数据可视化的方式来展现图书和读者之间的联系,运用到传统的推荐模式上,便是用线条粗细等方式反应读者和图书之间联系的强弱,图书与图书之间联系的强弱。这样读者便可以清楚明了的看到与自己联系较为密切的图书,以及与自己借阅的图书关系较为密切的其他图书
    其次,我们希望突破传统的方式,不仅是为读者推荐图书,而是与此同时做到为书推荐读者。文献领域的二八率表示80%的读者经常借阅的为整个文献资源20%的图书,而剩下的80%的图书则并不常用,很有可能只是被剩下的20%的读者借阅,因而面临着利用率低,甚至是资源浪费的问题。而我们通过帮图书推荐读者这一新颖的思维方式,便可以有效的辅助这一问题的解决

    而且,为书找合适的读者也是出版社和书商特别关注的话题。而如果能准备的为图书推荐合适的读者,对书商和出版社来说也很有可能增加其利润。比如,若借阅《白夜行》的读者有A,B,C,D等四名读者,而出版社即将出版与《白夜行》为同一作者,相似题材的《解忧杂货铺》。为了减小宣传成本,使得广告投放起到最大的效果,出版社通过借阅记录,发现A,B,C,D四名读者与和《解忧杂货铺》相似度很高的《白夜行》的联系非常密切,便将广告投放的重点放到这些读者上。
    以这样的方式来有效的节约成本,增加利润。提高文献资源的利用率采取的相似的方法:图书馆经常面临着图书利用率不足的问题,而且经常会面临图书利用率的审核。因此,以这样的方式来获取对新书可能感兴趣的潜在读者,便可以有效的提高图书馆文献资源的利用率。与此同时,还可以使读者阅读到自己感兴趣的图书,相当于一举两得。
    综上,我们将数据可视化与为图书推荐读者联结起来,用简单明了直接的方式显示图书与读者的联系,从而为书商、出版社和文化服务机构提供帮助,提高他们的利润或是绩效考核业绩。
    参考文献
    [1] 王珊,萨师煊,数据库系统概论第四版[M]. 北京,高等教育出版社,2006年.
    [2]孟楠. 分布式内存数据库系统设计实现与应用[D].南京理工大学,2005.
    [3]郭丽英. 高校图书馆数据库系统中SQL语句的查询重写研究[J]. 科技信息(学术研究),2008,04:220+223.
    [4]胡鹰. 中小型图书馆数据库管理系统的设计[J]. 图书馆,1989,02:33-36+17.
    [5]胡根桥. 图书馆流通数据仓库的设计与实现[J]. 现代情报,2007,07:68-70.
    1 评论 5 下载 2020-07-10 11:16:07 下载需要13点积分
  • 基于html的火柴人羽毛球游戏

    火柴人羽毛球
    一、游戏简介
    火柴人羽毛球灵感来自于flash小游戏
    游戏中,玩家可操作画面中的火柴人来进行羽毛球比赛
    通过键盘上的左右键控制火柴人的左右移动,按上键跳跃,按下键挥拍击球
    当某一方分数达到7分即判定取胜
    玩家可以选择与其他玩家对战、与不同难度AI对战,以及观看AI对战

    二、游戏实现2.1 绘图部分该游戏为实时性游戏,为保证流畅,采用了游戏常用的60fps的帧率。每一帧绘制的内容包括背景图片、当前比分、火柴人以及羽毛球。下面分别介绍绘图部分的各个细节:

    半透明图片常见的GDI库只能绘制BMP图片,其附带的透明选项也只是选取图片左上角像素作为透明颜色,并不能实现真正的半透明绘图,画出的图片常会带有丑陋的白边。为了解决这一问题,我们使用了GDI+库,它支持各种各样的图片格式,当然也就包括含有透明通道的PNG格式。有了GDI+,我们也就实现了更为精美的游戏画面。
    双缓冲绘图绘制出图片并完成一些简单的动画后,我们发现在刷新一帧时,画面会出现闪烁。想到以前使用MFC编程时曾接触过双缓冲绘图方法。画面出现闪烁的原因是绘图时多次把像素转移到屏幕上,而双缓冲可以先在内存中建立起一块画布,等到在内存中全部绘完,再调用BitBlt函数将像素逐个复制到屏幕上。这样便避免了画面的闪烁。
    局部刷新GDI+固然比GDI功能强大,但它绘图效率低是不容忽视的问题。与Direct2D使用显卡绘图不同,GDI+使用的是CPU,再加上我们的游戏需要绘制很多元素,对绘图优化就显得很有必要。我们注意到,切换一帧时,并不是全部元素都需要重新绘制,因此也就可以使用局部刷新技术,只重绘更新了的区域。
    人物动画在FLASH中,开发者可添加一种名为影片剪辑的元素,它可以做与主时间轴异步的动画,影片剪辑可以极大地方便动画的制作。然而,汇编语言并没有强大的动画制作工具,实现精细的动画也就需要很复杂的处理。例如,绘制人物时,手臂挥拍、脚步移动、跳起时阴影保留在地面上,这些是各自独立的。我们将小人的图像拆解开来,分别画四个部分,这就实现了游戏中小人复杂的运动。



    图片旋转游戏中的羽毛球并不是圆球,因此也就涉及到了旋转。我们并没有简单地制作许多张不同角度的羽毛球素材,而是只用了一张图片。使用GDI+中的函数GdipImagePointsI,可以以图片左上、右上、左下三点为基准,规定三个新的基准点,对原有矩形做线性变换,以此来完成图像的旋转。
    2.2 逻辑部分
    运动模型现实中,羽毛球由于受到的空气阻力较大,其的运动轨迹不同于其他球类,不呈现抛物线。我们在游戏中为了还原真实性,使用了如下运动方程:
    \\[\vec a=\vec g-\gamma\cdot \vec v=\frac{{\rm d}\vec v}{{\rm d}t}\\]式子中,\(\gamma\)为空气的粘滞系数。
    碰撞判定羽毛球涉及的碰撞判定有很多:球网、地面、墙壁(球可以反弹回来!)都具有碰撞判定。在游戏中,球的运动是离散、不连续的,因此在每一帧计算时,球的判定点很难恰好处于墙壁等障碍物的平面上。对于球撞击障碍物反弹的动作,我们的处理方法是:

    使球的坐标做关于平面的对称变换
    使球垂直于平面方向的速度分量反向
    不同平面有不同的弹力系数,对应于不同的反弹速度

    有了这样的处理,球的运动才会精确反弹。
    击球判定击球是游戏中角色最主要的动作。游戏中击球的判定也很独特:人的可击球区域是球拍面挥动起来可达到的扇形圆环区域,羽毛球飞出的角度与速度是在击球瞬间由人与球的相对位置决定的。此外,根据球的高度不同,角色也可以自动判断应该从上方还是从下方击球。
    AIAI的设计可以说是本游戏的一个亮点。游戏中,分别有两个函数leftAIconsider与rightAIconsider,这些函数会根据包括羽毛球位置在内的游戏状态信息,指挥小人的行为(移动、跳跃、击球)。游戏内置了两个不同难度的AI,玩家亦可自行修改AI决策函数,利用AI-AI对战模式与内置的AI进行PK。

    三、其他亮点
    实现了背景音乐播放,并且为击球动作添加了音效
    可以屏蔽中文输入法,避免点击字母时跳出输入法
    创建窗口时,获取到屏幕分辨率,使窗口处于屏幕正中央
    1 评论 46 下载 2019-06-22 22:15:55 下载需要13点积分
  • 基于JAVA实现的坦克大战游戏

    一、课程题目实现一个java版本的坦克大战游戏。
    功能提示:

    游戏要有图形用户界面,界面能够反映游戏所有的细节
    界面中要有坦克,墙,树林,河流
    界面中要有一个“家”,“家”被攻击中则输了游戏
    坦克分两种,敌方和我方
    墙也分为两种,可以穿透的普通墙,不可以穿透的铁墙
    树和河流均只有一种,树林坦克可以通过
    坦克可以发射子弹,敌我方的子弹属性一样
    我方子弹可以杀死敌方坦克,敌方子弹也可以杀死我方坦克,但需要多枪子弹才可以杀死
    敌方之间不可以杀死对方
    子弹击中坦克要有爆炸,但击中墙不能爆炸
    我方可以吃血包增加生命
    游戏可以暂停,重新开始,游戏帮助等功能

    二、题目分析与设计2.1 需求分析设计一个图形用户界面,将所有游戏的元素都能在此用于界面上表现出来,界面能够接受用户的操作,具有人机交互功能。用户可以选择重新开始游戏,退出游戏,暂停游戏和查找游戏帮助。
    界面中包含坦克,树,河流,阻挡墙和游戏用户所要保护的“家”。
    坦克:坦克分为两种,敌方坦克和用户控制的坦克。用户方和敌方坦克均可以发射子弹,可以改变路径的行走,且在行走过程中遇到墙等阻碍物和游戏边界时要改变方向,而不能一直顶着障碍物不放。坦克之间不能穿越,碰撞到后自动调换方向。
    树:界面中要包括树林,作为遮掩物体和修饰物体,以便增加游戏的元素,使得游戏更加贴切人性化。树的数目不限,以游戏整体界面清晰美观来决定数目。
    河流:界面中要包括河流,河流作用与树林相同,同样河流的数目不限,以游戏界面整体美观度来决定数目。
    墙:墙体分为两种,普通的墙和铁墙,普通的墙在受到子弹袭击时会损坏,而铁墙可以阻碍子弹的穿越。两方的坦克均不能穿越两种墙体,但都可以摧毁普通墙体。普通墙体的数目配合其他元素合理安排,铁墙则不宜过多,不然游戏难度太低甚至因为坦克不能穿越铁墙而使得游戏无法进行下去。
    家:用户方除了有一辆自己的坦克外还有一个要保护的家,家由普通墙体包围,家受到子弹攻击后游戏立即结束,用户方则输了本局游戏。
    子弹:子弹可以由敌方和用户方发射,且发射出去的子弹可以直线移动,直到碰到障碍物就消失,子弹可以穿越树林和河流。敌方坦克受到一颗子弹攻击会爆炸从而导致死亡,死亡后坦克消失。用户方受到子弹攻击后会减少寿命,且受到四次攻击则死亡,此时如还有敌方坦克存在,则用户方输掉本次游戏。
    爆炸:当子弹射击到坦克身上时,要产生爆炸效果。
    方向:坦克和子弹都有方向,可以选择上下左右四个方向,且子弹的方向从属于坦克的方向。
    2.2 具体设计以下的论述均根据上面需求分析的顺序来安排:
    2.2.1 图形用户界面图形用户界面要用到Java课程里的第六章的知识,需要用到抽象窗口工具集即AWT和Swing来设计实现,由于游戏需要有功能按键来控制游戏的重新开始,退出,暂停,帮助等,所以在实现过程中,设计菜单项。
    坦克,河流,树,家,墙等都是调用各自类里面的draw函数来画出来,最后new一个图形面板出来,把所有的元素都add进面板就可以了。界面的构造在程序中由TankClient类的构造方法来完成,即没构造一个用户类都会产生这样一个包含各种游戏元素在内的界面。由于画面是静止的,而我们游戏的画面要求是动态的,游戏中的坦克和子弹都是在不断的动,可穿透的普通墙体也在“动”,所以对于画面,必须要不断的更新,重画才能产生动态的效果。
    在程序中,此部分功能也是由TankClient类里的update函数和framPaint函数共同实现,将“动”的元素进行重画,而不动的元素如菜单项就不用重画,所以这也是为什么把菜单项设计进TankClient类的构造方法中。当然,图形用户界面中也包括对各种界面元素的大小,位置和颜色等设计,细节问题这里就不赘述。
    2.2.2 界面中的元素界面中的元素都是在构造界面的时候用界面实例对象的add方法加入进去的,且“动”的元素要不断更新重画。
    2.2.3 坦克坦克主要由Tank类来实现。坦克的属性:速度(有X轴和Y轴速度之分),坦克大小,坦克所在新的位置(X坐标和Y坐标),坦克是否还活着,行动方向等。所有的这些属性都有一个初始化值,从而在游戏一开始就可以运行。
    在设计过程中,坦克出现的位置由坐标而定。用户方之后的位置由键盘监听方向,按指定方向以恒定的速度前进——此速度为全局静态变量,当没有接受到键盘的控制时,则保持静止。敌方的坦克则是根据随机数来控制随机的方向和路径的,当敌方坦克撞到阻碍物时,会转回到前一步的位置,从而解决了坦克撞到阻碍物不回头的问题,这个功能由Tank类里的changToOldDir()方法实现。
    坦克的方向和子弹发射以及游戏的重新开始都是由键盘来控制的,所以在Tank类里面必须要实现这些功能。
    Tank类的keyPressed()方法用于接受键盘的按键监听,接收到相应的键盘信息后,如接收到F,则表示发射子弹,所以此时要调用Tank类里的fire()方法,fire()方法不带传递参数,因为子弹的方向总是从属于坦克的方向和位置。
    由于坦克在碰到墙,界面边界和“家”等阻碍物时要改变方向,所以在Tank里面必须对于每一种阻碍物要设计一个方法来作为应对策略,当然解决方法是把下一步的位置调整到上一步的位置。
    用户方Tank还可以吃红心来增加自己的生命值,得到一个红心,增加100生命值。所以在程序中坦克必须要有一个方法来判断当坦克接触到红心时,生命值增加的方法。程序中用eat()方法来实现“吃”红心并且增加生命值,当然,这其中要使得坦克的生命值不会超过自己生命的极限值200,所以判断的时候,当生命小于等于100时,直接加100生命值,但是当生命值大于100时,就只能使生命值加满到极限值200.当然,说到生命值,一定要在图形用户界面中显示出来,所以在Tank类里面一定要设计一个方法,来画出生命的增减过程,在Tank类里面是用DrawBloodbBar()来刻画。
    2.2.4 树林树林主要是用来做修饰物体的,具有不透明性。由一个Tree类来描述,Tree有两个属性,位置和长宽。树的类里有一个自己的构造方法,当然还有一个必不可少的draw()方法。
    2.2.5 河流河流的作用与树林类似,这里不再赘述。
    2.2.6 墙体墙体分为普通墙和铁墙。普通墙可以被子弹损坏,而铁墙则不会。
    普通墙
    普通墙有以下几个属性:墙的固定长度和宽度,墙的位置坐标,墙体是由图片加入到图形用户界面来表示的。程序中用CommonWall类来描述普通墙,此类里有一个构造方法,用于传递参数,还有一个draw()方法,来画指定位置的墙,另外还有个getRect()方法来构造长方形实例。
    金属墙
    金属墙的参数和普通墙完全类似,只不过金属墙不能被子弹穿破,但这个属性在接下来讨论的子弹的属性里面,由于上面已经给出里普通墙的属性,所以这里将不再赘述金属墙的属性了。
    2.2.7 家家是由Home类来抽象的,具体的属性有:家的大小,家的位置,家的存活状态,与树林和河流一样,家还有draw()和自己的构造方法,作用也和前面的一样,但是家还有一些新的方法,因为可以在游戏中重新开始游戏,所以要有设置方法让家重新“活”起来,当然,有时候要判断家现在的存活状态,所以就必须要isLive()和setLive()两个方法了。除此之外,还要有一个游戏结束界面的清理工作和提示工作,gameover()方法就是解决这个问题的。
    2.2.8 子弹子弹的属性:子弹前进的X轴和Y轴的速度——初始速度都为10,子弹的长度和宽度——初始的长宽都为10,子弹的位置,子弹的方向,子弹是否live等。由于不同方向的子弹其实是图片,所以这里要考虑不同图片的选择用对应的方向来指定,所以要建立Map键值对,用String属性的方向来指定不同的图片。如:imgs.put(“L”, bulletImages[0]);
    类里面惯例有个构造方法,用来默认传递位置和方向,当然这里用到了同构,另外一个构造函数来取得子弹的状态和界面。darw()方法和move()方法来控制画子弹和移动子弹。
    接下来就是要考虑到子弹打到个=各元素上的反应,敌方的子弹打到敌方时,不会杀死自己人,所以这里只要直接return true就可以了,不用移除子弹碰到的坦克,更不用调用爆炸来显示爆炸效果。
    具体代码:
    public boolean hitTanks(List<Tank> tanks) {//当子弹打到坦克时 for (int i = 0; i < tanks.size(); i++) { if (hitTank(tanks.get(i))) { //对每一个坦克,调用hitTank return true; } } return false;}
    子弹打到其他坦克上时用hitTank(Tank t) 方法,子弹打到墙上时用hitWall(CommonWall w)方法,打到金属墙上hitWall(MetalWall w),打到家hitHome(),当然在这些方法里,都要作相应的操作来表示接受到子弹的后果,普通墙要移除对应的位置,所以在方法里面又要调用remove()方法来移除,如打到家上,就要吧home的生命设置为false,从而结束游戏。实现如下:
    public boolean hitHome() { //当子弹打到家时 if (this.live && this.getRect().intersects(tc.home.getRect())) { this.live = false; this.tc.home.setLive(false); //当家接受一枪时就死亡 return true; } return false;}
    还有,当子弹射击到对方(用户方对敌方)时,当敌方射击到用户方,用户方要减少生命值,没接受一枪,就执行 t.setLife(t.getLife() - 50); // 受一粒子弹寿命减少50,接受4枪就死,总生命值200,当然方法里面还要做其他很多的判断,如生命值是否小于0,如果是的话就执行t.setLive(false);从而结束游戏。
    2.2.9 爆炸坦克的爆炸效果独立出来用一个类来描述,爆炸的属性:位置和存活状态,另外,画爆炸效果的时候要取得用户界面控制,所以要定义private static Toolkit tk = Toolkit.getDefaultToolkit();其他的方法只能的大同小异。
    2.2.10 菜单功能菜单功能包括游戏的重新开始,暂停,退出等。这些功能的用户界面放在了TankClient的构造方法里,用到的是面板类和相应的监听功能,实现出来很简单。
    2.3 类的介绍Direction是一个枚举类,有L、U、R、D、STOP表示左、上、右、下和静止五个状态。
    River描述河流的类,属性:



    riverWidth
    河流的宽度




    riverLength
    河流的长度


    x
    X轴坐标


    y
    Y轴坐标


    TankClient tc
    TankClient对象


    riverImags
    河流的图片


    River(int x, int y, TankClient tc)
    河流的构造方法


    draw(Graphics g)
    画河流的方法


    Rectangle getRect()
    长方形实例


    int getX()
    取得x坐标


    void setX(int x)
    设置x坐标


    int getY()
    取得y坐标


    void setY(int y)
    设置y坐标


    int getRiverWidth()
    取得河流的宽度


    int getRiverLength()
    取得河流的长度



    Home表示用户方的家的类,属性:



    width=30
    家的静态全局宽度




    length=30
    家的静态全局长度


    x
    X轴坐标


    y
    Y轴坐标


    TankClient tc
    TankClient对象


    homeImags
    家的图片


    boolean live
    初始存活状态为true 表示家的存活状态


    Home(int x, int y, TankClient tc)
    家的构造方法


    void draw(Graphics g)
    画出家的方法


    Rectangle getRect()
    长方形实例


    void gameOver (Graphics g)
    游戏结束方法,做清理工作和相应的提示


    boolean isLive()
    判断是否存活


    void setLive(boolean live)
    设置存活状态,以便从新开始游戏



    Tree描述树林的类,属性:



    width=30
    树林的静态全局宽度




    length=30
    树林的静态全局长度


    x
    树林在界面中X轴坐标


    y
    树林在界面中Y轴坐标


    TankClient tc
    TankClient对象


    Toolkit tk
    取得界面的控制


    treeImags
    树林的图片


    Tree(int x, int y, TankClient tc)
    家的构造方法


    void draw(Graphics g)
    画出树林的方法



    Bullets描述子弹的类,属性:



    speedX = 10
    子弹的全局静态速度 x轴方向的




    speedY = 10
    子弹的全局静态速度 y轴方向的


    width = 10
    子弹的全局静态宽度


    length = 10
    子弹的全局静态长度


    Direction diretion
    子弹的方向


    x
    X轴坐标


    y
    Y轴坐标


    TankClient tc
    TankClient对象


    bulletImages
    子弹的图片


    boolean live
    初始存活状态为true 表示家的存活状态


    Bullets(int x, int y, Direction dir)
    子弹的构造方法,带三个参数


    Bullets(int x, int y, boolean good, Direction dir, TankClient tc)
    子弹的构造方法,带五个参数的


    void draw(Graphics g)
    画出子弹的方法


    move()
    刻画子弹运动的方法


    Rectangle getRect()
    长方形实例


    void gameOver (Graphics g)
    游戏结束方法,做清理工作和相应的提示的方法


    boolean isLive()
    判断是否存活


    boolean hitTanks(List<Tank> tanks)·
    子弹打到地方自己的时候的方法


    boolean hitTank(Tank t)
    子弹打到对方的方法


    boolean hitWall(CommonWall w)
    子弹打到普通墙的方法


    boolean hitWall(MetalWall w)
    子弹打到金属墙的方法


    boolean hitHome()
    子弹打到家的方法



    GetBlood血包描述类,属性:



    width=36
    血包的静态全局宽度




    length=36
    血包的静态全局长度


    x
    X轴坐标


    y
    Y轴坐标


    TankClient tc
    TankClient类实例化对象


    Random r
    用于产生随机数


    Toolkit tk
    tk获得用户界面


    bloodImags
    家的图片


    poition
    位置数组


    boolean live
    初始存活状态为false 表示初始化时无血包


    void draw(Graphics g)
    画出血包的方法


    void move()
    血包移动的方法


    Rectangle getRect()
    长方形实例


    boolean isLive()
    判断是否存活,是否有血包


    void setLive(boolean live)
    设置存活状态,设置血包的存在



    CommonWall普通墙的类,属性:



    width=20
    普通墙的静态全局宽度




    length=20
    普通墙的静态全局长度


    x
    普通墙在界面中X轴坐标


    y
    普通墙在界面中Y轴坐标


    TankClient tc
    TankClient类实例化对象,因为画墙要取得界面的控制权


    Toolkit tk
    tk获得用户界面


    wallImags
    普通的图片


    CommonWall(int x, int y, TankClient tc)
    普通墙的构造方法,用于传递墙的位置参数和TankClient


    void draw(Graphics g)
    画出普通墙的的方法


    Rectangle getRect()
    长方形实例



    MetalWall金属墙的类,属性:



    width=30
    金属墙的静态全局宽度




    length=30
    金属墙的静态全局长度


    x
    金属墙在界面中X轴坐标


    y
    金属墙在界面中Y轴坐标


    TankClient tc
    TankClient类实例化对象


    Toolkit tk
    tk获得用户界面


    wallImags
    金属墙的图片


    MetalWall(int x, int y, TankClient tc)
    金属墙的构造方法,用于传递墙的位置参数和TankClient


    void draw(Graphics g)
    画出金属墙的的方法


    Rectangle getRect()
    长方形实例



    BombTank坦克爆炸类,属性:



    x
    坦克爆炸效果在界面中X轴坐标




    y
    坦克爆炸效果在界面中Y轴坐标


    TankClient tc
    TankClient类实例化对象


    Toolkit tk
    tk获得用户界面


    Image[] imgs
    爆炸效果的图片


    BombTank(int x, int y, TankClient tc)
    爆炸效果的构造方法,用于传递爆炸效果的位置参数和TankClient


    void draw(Graphics g)
    画出爆炸效果的的方法



    Tank描述Tank的类,属性:



    speedX = 6
    坦克的全局静态速度 x轴方向的




    speedY = 6
    坦克的全局静态速度 y轴方向的


    width = 35
    坦克的全局静态宽度


    length = 35
    坦克的全局静态长度


    Direction diretion
    坦克的状态 ,初始化为静止


    Direction Kdirection
    坦克的方向,初始化为向上


    Int x
    X轴坐标


    Int y
    Y轴坐标


    int oldX
    旧状态的X轴坐标


    int oldY
    旧状态的Y轴坐标


    boolean live
    坦克是否存活,初始化为活着的


    TankClient tc
    TankClient对象


    int life
    初始化生命值为200


    Random r
    随机数,用于控制坦克的方向


    int step
    路径


    Image[] tankImags
    各个方向坦克的图片数组集合


    Tank(int x, int y, boolean good)
    坦克的构造方法1 ,带三个参数


    Tank(int x, int y, boolean good, Direction dir, TankClient tc)
    坦克的构造方法2 ,带五个参数的


    void draw(Graphics g)
    画出坦克的方法


    move()
    描述坦克运动方向的方法


    void changToOldDir()
    转换到旧方向,


    void keyPressed(KeyEvent e)
    键盘监听方法


    void decideDirection()
    决定移动方向方法


    void keyReleased(KeyEvent e)
    监听键盘释放方法


    Bullets fire()
    坦克开火方法


    Rectangle getRect()
    长方形实例的方法


    boolean isLive()
    判断是否存活的方法


    void setLive(boolean live)
    设置坦克存活方法


    boolean isGood()
    用于返回是否是good状态


    boolean collideWithWall(CommonWall w)
    坦克碰到普通墙的解决方法


    boolean collideWithWall(MetalWall w)
    坦克碰到金属墙的解决方法


    boolean collideRiver(River r)
    坦克碰到河流的解决方法


    boolean collideHome(Home h)
    坦克碰到家的解决方法


    Boolean collideWithTanks(java.util.List <Tank> tanks)
    坦克撞到坦克的解决方法


    int getLife()
    获得坦克的生命状态的方法


    void setLife(int life)
    设置坦克的生命状态的方法


    boolean eat(GetBlood b)
    坦克吃红心血包的方法


    int getX()
    确定X的位置的get方法


    int getY()
    确定Y的位置的get方法



    TankClient坦克用户类,继承Frame,实现ActionListener接口。
    实例化各个类的容器:
    List<River> theRiver = new ArrayList<River>();List<Tank> tanks = new ArrayList<Tank>();List<BombTank> bombTanks = new ArrayList<BombTank>();List<Bullets> bullets = new ArrayList<Bullets>();List<Tree> trees = new ArrayList<Tree>();List<CommonWall> homeWall = new ArrayList<CommonWall>(); // 实例化对象容器List<CommonWall> otherWall = new ArrayList<CommonWall>();List<MetalWall> metalWall = new ArrayList<MetalWall>();
    下面列表只列出主要方法和变量,属性:



    int Fram_width
    游戏用户界面的全局静态变量宽度,初始化为800




    int Fram_length
    游戏用户界面的全局静态变量长度,初始化为600


    void update(Graphics g)
    图形用户界面的更新方法


    void framPaint(Graphics g)
    画图形用户界面的方法,需要重画的界面元素都在这个方法里面


    void actionPerformed(ActionEvent e)
    监听菜单项的方法


    static void main(String[] args)
    主函数,启动整个程序



    用户类主要是综合调用各个类来协作完成完成游戏的设计。
    2.4 程序流程逻辑图下图是程序运行的逻辑流程图,只是表示逻辑,并没有具体到每一个细节:

    2.5 开发环境Myeclipse
    三、测试分析3.1 阐述扩展包本程序没有用到SUM的扩展包,也未涉及到数据库的建立
    3.2 程序效果图测试3.2.1 菜单项测试菜单项可以选择开始新游戏,退出,暂停,继续,帮助功能,对于开始新游戏,退出两个功能,要给出提示,用户是否真的想继续操作!
    菜单效果图

    开始新游戏功能测试

    当点击确认后开始新游戏,当点击取消后恢复到原来的页面。这里不再附图给出点击确定和取消后的效果。
    暂停功能测试

    帮助模块测试图

    退出功能测试

    点击确认后将退出游戏,点击取消后不会退出游戏。
    3.2.2 游戏信息测试游戏标题栏给出游戏名称和制作人相关信息

    3.2.3 子弹射击到对方坦克后爆炸效果测试
    图中的红色类似爆炸状的图像是用户方击中地方坦克后的爆炸效果显示
    3.2.4 子弹撞击到普通墙后,会使得墙消失一块的测试
    图中画红箭头的地方时受到子弹攻击后的效果。墙体被破坏。
    3.2.5 金属墙受到子弹攻击的测试如图为子弹攻击金属墙体前:

    如右图为子弹攻击金属墙后的效果图:

    综上两个可以看出,金属墙都到子弹的攻击后不会被损毁,但是当在把程序中子弹碰撞金属墙的语句改变后,会损毁金属墙!如下:
    原来的代码段
    public boolean hitWall(MetalWall w) { //子弹打到金属墙上 if (this.live && this.getRect().intersects(w.getRect())) { this.live = false; return true; } return false;}
    修改后的代码段
    public boolean hitWall(MetalWall w) { //子弹打到金属墙上 if (this.live && this.getRect().intersects(w.getRect())) { this.live = false; this.tc.metalWall.remove(w); //子弹可以穿越金属墙了 return true; } return false;}
    修改后的效果:从下图可以看出,修改后金属墙也可以被摧毁!

    3.2.6 血包效果图血包会随机的移动,以下是血包所在的两次不同位置:
    所在位置1

    所在位置2

    3.2.7 坦克吃血包增加生命值测试没有吃血包前:可以看出血包在用户方附近,当用户方去接近血包时,就可以增加生命值。

    吃完血包后加满生命值:

    3.2.8 当家被攻击后结束游戏
    游戏结束是调用gameover()方法,在方法里面会清除所有的页面元素。
    3.2.9 快捷键的测试R键为重置游戏:如下为重新开始后的页面:

    提示:由于上下左右和开火等快捷方式键都是动态的效果,所以这里不方便给出,用户可以自行测试!
    3.2.10 坦克撞击边缘的效果撞击前

    撞击后

    提示:这里只给出撞击边缘的效果,其他坦克撞击坦克,家,普通墙,金属墙等效果用户可以自行测试!
    3.2.11 用户赢得游戏后的效果测试
    注释:由于坦克大战的画面都是动态的,所以不可能全部截图来测试每一个功能,如有需要,用户可以自行测试。
    下面改变程序中的一些典型的数据,看修改后的效果:
    3.3 典型数据测试3.3.1 家的位置测试由于程序中的界面位置是严格嵌套设计的,即家是刚好落在它外面的一层保护墙能,当修改家原来的位置参数Home home = new Home(373, 545, this);后,会走出达不到预期的效果:如下图:

    图示为把373改为了450后的效果!
    3.3.2 坦克全局静态速度的改变坦克的全局速度原来是x轴方向为6,y轴方向为6,修改后,坦克的前进速度会加快,当然这样一来可以加大游戏的难度,可以作为游戏的扩展功能来实现,由于坦克的速度是动态的,这里无法测试,用户可以在Tank类里修改speedX和speedY来测试。
    子弹的速度的性质同坦克相同,这里不再赘述。
    3.3.3 墙体的部分测试改变墙体的界面布局:如改变普通墙的界面布局,是界面中没有普通墙,只要将程序中的如下代码屏蔽掉就可以了:
    for (int i = 0; i < 32; i++) { if (i < 16) { otherWall.add(new CommonWall(220 + 20 * i, 300, this)); // 普通墙布局 otherWall.add(new CommonWall(500 + 20 * i, 180, this)); otherWall.add(new CommonWall(200, 400 + 20 * i, this)); otherWall.add(new CommonWall(500, 400 + 20 * i, this)); } else if (i < 32) { otherWall.add(new CommonWall(220 + 20 * (i - 16), 320, this)); otherWall.add(new CommonWall(500 + 20 * (i - 16), 220, this)); otherWall.add(new CommonWall(220, 400 + 20 * (i - 16), this)); otherWall.add(new CommonWall(520, 400 + 20 * (i - 16), this)); }
    屏蔽后效果如下:

    从图中可以看出,没了界面中的除开家以外的普通墙体了,其他的金属墙体,树林,河流等也是一样的道理.
    3.3.4 子弹撞击其他物体如坦克的改变当改变子弹射击坦克的方法时,如将子弹射击到坦克,不将坦克的生命结束,则游戏将永远打下去,谁都打不死谁.改变Bullets类里的hittank方法里的t.setLive(false);语句,只要将这个语句中的false改为true就可以了,当然对于其他的hit*方法,也只要作相应的修改就可以了。
    3.4 完善功能:3.4.1 已完善的功能血包可以让我们知道还剩下多少生命值,但是有时候不是很直观,所以在界面中加入一行信息来实时更新用户坦克的生命值,让用户有直观的感觉。修改后的效果如下图:

    3.4.2 游戏级别的设置游戏的级别只做了简单的级别设置,可以设置四个级别,级别1,级别2,级别3和级别4,默认进入游戏是级别1,当然可以在游戏的过程中切换级别。
    级别的设置主要是把前面的Tank类和Bullets类的全局静态最终变量改成全局静态变量,利用监听来设置坦克的速度和子弹的速度来设置游戏的难度,从而形成了级别的设置。
    修改后的画面效果为:

    3.4.3 还可以进一步完善的功能
    可以为游戏加入声音,由于在尝试的时候失败了,所以程序中就没有来实现这些功能
    存储游戏结果
    联网功能等
    3 评论 85 下载 2019-05-30 11:01:59 下载需要13点积分
  • 基于80x86汇编的俄罗斯方块游戏

    一、游戏背景介绍1.1 背景知识俄罗斯方块原本是前苏联科学家阿列克谢·帕基特诺夫所开发的教育用软件,之后开始提供授权给各个游戏公司,造成各平台上软件大量发行的现象。Game Boy 版的俄罗斯方块在日本卖出 424 万套,是 Game Boy 史上卖最好的游戏。海湾战争时,也是前线美军最常拿消磨时间的游戏之一。由于俄罗斯方块具有的数学性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。
    俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而 家喻户晓,风靡世界。俄罗斯方块原名是俄语Тетрис(英语是 Tetris),这个名字来 源于希腊语 tetra,意思是“四”,而游戏的作者最喜欢网球(tennis)。于是,他把两个词 tetra 和 tennis 合而为一,命名为 Tetris,这也就是俄罗斯方块名字的由来。自此俄罗斯方块游戏一直火热至今。在各种经典小游戏分区和分类,我们不难见其身影,经常被用来怀旧或是娱乐。
    1.2 基本功能部分游戏有单格方块,可以穿透固定的方块到达最下层空位。其他的改版中出现更多特别的造型。方块会从区域上方开始缓慢继续落下。玩家可以做的操作有:以 90 度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。本游戏中按 W 键可以旋转方块,控制方向。按 A 键可以左移,按 D 键可以右移,当左移或者右移到边界时,不能再移动整体的方块,按 q 键可以让方块加速下落,但不会直接下落,这种操作是为了让方块下落的更快,但不至于直接落下而失误导致游戏失误,按 S 键可以让方块直接落下,以此来节省玩家的时间。方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。每一行必须由所有行中所有列的当区域中某一列横向格子全部由方块填满,否则会一直累加直至方块行排满了所有的游戏界面,此游戏就会结束,并记录分数,如果某一行所有列都填满了方块,则该列会消失并成为玩家的得分。同时删除的列数越多,得分指数上升。当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。
    1.3 风靡全球的原因俄罗斯方块风靡的原因在于,未完成的任务与潜在的解决方法并存——徐徐降临的每一 种方块都有各自的安插方式。俄罗斯方块是一个简单的可视世界,通过操纵五个按键(当然是向左、向右、左转、右转和降落)能够迅速地得出解决方案。对俄罗斯方块玩家的研究结果显示,人们普遍喜欢通过旋转方块来看它们是否匹配,而不是一边看着方便降落一边思考。当然这两种方法都可行,但在俄罗斯方块的世界里永远是动作领先——这是吸引人的关键。和生活中不太相同的是,俄罗斯方块将我们处理问题时的所见所想直接联系到了一起,我们能立即对问题采取行动。
    1.4 作用可以增强人们对图形的感性认识和对位置感的锻炼,日常生活压力大。用游戏来减轻压力。许多人无聊,来打发时间。在游戏世界中相当于另外一个你,在现实生活中做不到的在游戏看可以做到,得不到的在游戏中却可以得到,获得满足感和成就感。游戏的世界可以从侧面另外玩家的道德素质。思想素质,让你可以方面的接触各种各样的人。游戏玩家群体在社会中是各个行业,各个阶层的人。你可以在里面很方便的了解到其他东西。也可以学会许多东西。益智游戏可以锻炼你的脑力,敏捷游戏可以锻炼你的敏捷能力。策略游戏可以提高你的智力等。
    进入界面后可以选择三种不同的游戏速度的游戏模式:

    Fast 为最快速度,游戏难度最高,方块下落很快,很考验反应速度,同时游戏乐趣也最大
    middle 为中等速度的模式
    slow 为缓慢游戏模式,都比较适合新手练习和平时娱乐


    选择任意一个速度的游戏模式后,游戏便进入了主界面,界面左边是游戏运行的游戏动画界面,右面有记分板和下一方块的提示,还有基本操作的提示,方便新手玩家操作。出现图形后,A 左移 D 右移 W 旋转 S 为直接下落,直至填满界面后会结束游戏。

    最后如果方块累计触到上顶线,则游戏结束,退出主程序,如图 3。

    二、核心算法思想游戏区域由许多等面积的小方块构成,这些区域状态只有满或空两种。将空间以静态二维数组实现,并预先定义其状态值。满为 1,空为 0,以此来完成游戏地图区域的空间分配。
    小方块的实现是由一个 4*2 的小数组表示,用四个存储单位空间存储当前下坠物的每一个子 块的位置来对整个下坠物件的位置进行标识,每个存储空间的大小就是一个点的坐标。每个 方块都有其对应的编号,编号按由上到下,由左到右的顺序编排。有了这些编号,方块的变 换实现起来就方便多了。再由一个宏去标识下坠物的位置。
    游戏进程需要定时器的驱动,所以很有必要在程序当中加入一个定时器机制。方块随着时间的自动下落需要一个定时器来计算时间下落,若下落速度小于屏幕时间的刷新速度,则会出现屏幕的闪动等问题,因此我们只需定义一个时间类,设置好时间间隔即可。同时,也需要控制屏幕的刷新速度,而刷新速度必须比方块下落时间间隔快。而且计时器可以对游 戏运行时间进行如此对游戏的开始,暂停,结束控制便能够得到实现。
    游戏开始后便开始掉落方块,并且会在游戏区域上方出现下一个下坠物的形态,因此有随机物件产生这个操作。此时用户可根据需要来变换方块,向左或向右移动来调整方块位置,然后通过按下使方块加速下落。这就涉及到了四个主要操作。当方块向左或向右移动时,需要判定方块是否达到了游戏区域的边界;当方块下落时需要判定方块是否到了游戏区域的底部,或是碰到了别的方块。开始后便可用键盘上的“上下左右”来对方块进行操作。方块移动之前,要对方块的横纵坐标计算,我们在核心算法中,用两次嵌套的循环来实现横纵坐标的计算,外层对横坐标进行判断和计算,内层对纵坐标进行判断和计算,首先用大循环去计算横坐标的增减,因为横坐标要考虑的问题较多,而纵坐标比较容易实现,纵坐标只需考虑图形是否撞到了底线或者其他方块,出现触碰底线和触碰其他方块的问题后,用中断保存改变后的值即可跳出循环。首先设置一个栈,数据先入栈,中断保存信息,x 轴和 y 轴的坐标分别进各自对应的寄存器,与之前中断值作比较,纵坐标自增,此处有一个循环,若 DX 寄存器值小于 b 的纵坐标,则继续调用中断 INT 10H;用循环来实现整个纵坐标增长或减少的计算,跳出循环后 CX 寄存器值加一,进入第二个循环,该循环包括上一个循环体,判断 CX 值是否小于纵坐标,若小于,将新的纵坐标数据放入 DX 寄存器中。方块的实现七种下物都有一个共同点,就是它们占据的空间一样,都是由四个等面积的小方块构成,因此用一个整型的数组来存储每个下坠物的四个小方块的坐标位置。每个下坠物中的方块都有编号,编号按从左到右,从上到下的顺序排列。从代码中可以看出程序首先获取了当前下坠物的四个小方块坐标,然后所有纵坐标递减一格,由函数计算出改变数据的区域。这样便可完成左移命令。右移和下移的道理也是一样。但是这里涉及到一个问题,就是要对移动是否到达游戏区域的边界做出判断。左、右移的限制原理是一样的,只是方向和坐标数据有点区别。根据各种不同形态的下坠物最左边的小方块的正左(右)方区域是否为非被占用状态来判断它是否可以移动。
    界面绘制,定时器任务的发生,用户的输入(如开始,暂停,结束,级别设置,左移,右移,旋转,快速下移)的命令的响应需要用到多线程。在屏幕的绘制中,首先应该修改屏幕的颜色,其次要定义一个方块类,将生成的小方块放入其中。将前景色和背景色设置为同一种颜色,一个字符显示在屏幕上就是一个小方块。控制方块的下落速度是设计中必须实现 的功能,方块的下落速度也就是时间间隔,因此我们只需定义一个时间类,设置好时间间隔即可。同时,也需要控制屏幕的刷新速度,而刷新速度必须比方块下落时间间隔快。因此,如何在一个程序中体现两种不同的时间控制是此模块的一个难点我们需要对键盘中上、下、 左、右键的读取实现对方块的变形、下落、右移和右移的功能。
    三、核心算法流程图进入程序后先进行屏幕初始化,之后显示调用显示边框函数,再显示新方块。检测按键状态,之后再度检测键盘状态。为了保证整个程序结构性能良好,不会出现与其他函数体同时用一个寄存器而使得程序跑飞。其中分别四个主要操作按键 WASD 都对应不同的操作,W 旋转,A 左移 D 右移,S 下落,如果键盘输入的对应寄存器的值,则输出对应的操作的值,否则便进入下一个判断条件进行判断,否则操作失效。在进入程序后先将几个主要寄存器推入堆栈,当程序退出时,又将寄存器值从堆栈中送回。堆栈采用的是先进后出的算法,所以应当注意顺序。这样接口,便于向后兼容,使用起来方便。如下,图 4。

    首先设置一个栈,数据先入栈,中断保存信息,x 轴和 y 轴的坐标分别进各自对应的寄存器,与之前中断值作比较,纵坐标自增,此处有一个循环,若 DX 寄存器值小于 b 的纵坐标,则继续调用中断 INT 10H;用循环来实现整个纵坐标增长或减少的计算,跳出循环后 CX 寄存器值加一,进入第二个循环,判断 CX 值是否小于纵坐标,若小于,将新的纵坐标数据放入 DX 寄存器中,再将坐标计算得得值传回寄存器,完成方块的消除和累积。如下,图 5。

    四、开发中遇到的问题如何能够让下落的方块在检测到下方有原先掉下来的方块或者已经到达游戏界面的底部从而停下来呢?
    建立一个静态数据二维表与游戏界面映射。栅格部分初始化为1,之后不对该静态数据位置操作。栅格部分是不会显示在屏幕上,只是在静态数据表中存在,以此方便对方块的出界,叠加等的判断。
    当一格中的方块堆满后如何实现消除?
    解决此问题的方法是用消行算法,当有出现方块不可动作,即 NOTDONECAN 对应值的为 1 时,先将 QUANOW 对应的值当前位置在静态数据表中的映射数值置为1,之后判断静态数据表 中是否有一整行为1,是则将该行以上数据整体下移一行,之后刷新显示,即通过判断静态数据表中的各个位置是否为1,为1则刷新为洋红色否则刷为黑色;如若该行有0存在,则进行下一行的判断。
    当一个或几个方块出界、叠加时候,如何判断这种情况?
    先将 QUANOW 对应的传送给与寄存器,等长的一维数据表 QUATEMP。当再将 QUATEMP 进行 一次操作,比如向下操作:将 QUATEMP 对应的中的Y 轴坐标加1,X 轴坐标不变,再调用NOTDONE 函数分别找到 QUATEMP 中四个方块位置在静态数据表中的映射,判断该位置数据是否为1,如若有一个1则,将NOTDONECAN 标志位置为1,即不可动作,否则将其置为0。
    DOWNGOON则 通过判断 NOTDONECAN 标志位来选择是否将 QUATEMP 的值传送给 QUANOW,如若NOTDONECAN为 0,即可以动作,则传送数据,同时刷新显示。否则不可动作,则将 QUANOW 当前位置在静态数 据表中的映射数据置为1,即跟新静态数据二维表。其他判断依此类推。
    如何控制下落的时间?
    一开始做游戏界面的时候,设置的默认下落时间间隔和屏幕刷新时间不合适,游戏界面消除和下落方块的时候,总是会出现闪屏的情况,对游戏影响不大,但是对玩家游戏体验影响很大,经过查阅资料和研究,我们发现屏幕的刷新速度必须快于方块的下落速度,否则会出现上述情况。控制方块的下落速度是设计中必须实现的功能,方块的下落速度也就是时间间隔,因此 我们只需定义一个时间类,设置好时间间隔即可。同时,也需要控制屏幕的刷新速度,而刷新速度必须比方块下落时间间隔快。因此,如何在一个程序中体现两种不同的时间 控制是此模块的一个难点。
    如何控制按键不重复按下向下的按键时,下落速度会加快,即放置间隔的运行间隔会减小存在问题:无论是在放置间隔外部还是内部更改速度值,都只能在清除间隔之后,才能生效,无法满足需求解决方式:将放置间隔更改为放置时间,在放置时间里调用自身,形成递归,即可实现需求, 如何检测方块位置?
    没有方块存在时,直接下落到界面底部。有方块阻挡时,停在方块上面。存在问题:如何记录已有方块的位置解决方式:获取每一个方块的 top 和left 位置,拼接成字符串,存入数组。每一次掉落时,都检测每一个方块的下一个位置是否已经存在在数组中,如果没有,就允许下落。否则停止下落,生成下一个方块。按键按下时,如何禁止重复触发?按键按下时,速度在当前值的基础上减少300,速度减少300存在问题:按键一直按住不放时,速度就会一直持续执行减法。解决方式:设置一个 flag,按键按下,flag 值就改变,当事件触发时,flag 才会变回原值。
    如何让玩家适当操作?
    根据相应的提示进行一些功能上的选择,如修改音乐,方块颜色和游戏难度。当游戏开始时,计算机将随机抽取方块的放到方格上。此游戏允许玩家旋转方块,左右移动,加速向下。程序要实现对满行的消除并记录得分以及对游戏的结束判断。
    如何更便利玩家体验该游戏?
    在 windows 环境下建立一个简单的用户界面,用户可以进行功能性的菜单选择,我们选择了fast,middle,solw 三种游戏速度模式,由难到易三种游戏模式选择。简单明了,不需要玩家输入多余命令,仅输入 1,2,3,4 即可控制界面的选择以及退出游戏。
    游戏开始后,通过指定的功能键控制方块,方块可以左右移动、落下、旋转。AD 分别为左移和右移,W 为旋转当前的方块,S 为使方块快速落下,方便于玩家的技巧性游戏。此操作在游戏运行界面右方记分板的下方显示出,方便玩家的操作。
    界面上要显示分数和游戏已经开始的时间和游戏的难度,并且预显示出下一个方块的形状,使玩家可以通过下一步的形势推断现在进行的操作,以此来增加游戏的难度和趣味性,让游戏有更多的技巧可言,游戏方式多元化,否则游戏便很枯燥单调,不会很好的吸引其他玩家。
    能进行简单的参数设置:修改音乐,改变方块颜色和难度等。
    对三个主要游戏数据的处理方块的下落,相应键盘:需要判断下键是否按下,并加快时钟周期。完成下落后,还原到原来的时钟周期形状的下落, 实现旋转:不同旋转角度显示不同方向的方块来完成的。 消去主游戏区底部填满的行:查看主游戏区底部的每行是否填满的方式是,在游戏区图 形框可以看成是由许多的小方块组成,方块运动的过程就是造型里方块显示或者隐藏,就像现在的霓虹灯效果一样,由时钟控件控制改变的速度,上一层的消失,下一层的显示,这样, 从视觉效果可以看到方块的下落运动效果方块在下落的过程中会自动判断每一行方块的属性,如果此行方块属性全部为是时,就会将这一行小方块的 visible 属性全部变成否, 同时消去此行,在将上面的小方块向下移动,利用循环语句进行判断,将所有这样情况的行改变小方块属性。当有多行同时出现这样情况时使用递归调用,实现连续消行。
    六、心得体会在这本次编写俄罗斯方块汇编游戏的中,在收获知识的同时,还收获了阅历,收获了成熟, 在此过程中,我们通过查找大量资料,请教老师和同学。使我再专业知识和动手实践方面都得了到很好的提升。在此次程序设计中,接触到了我们熟知的网络,在设计过程中总觉得好难实现,但在实现过程中,发现只要用心探索,一切皆有可能。通过课程设计,我对汇编语言有了更深一 步的了解,发现其用起来不是十分的方便,但确实是比较适合我们初学者学习的语言。这次课程设计我对游戏编程有了一定的了解,虽然自己只用了汇编,但在实际操作的过程中,也和同学们交流探讨了好多其他语言关于游戏设计的思想,集思广益,拓宽了自己的眼界。增强了自己的实际动手能力,增加了学习计算机语言的兴趣,另外在课程设计中也得到了一定的成就感。决定再今后的学习中,多看一些这类方面的书籍,来进一步的了解相关的游戏编程知识,为以后的应用做准备。
    经过本次汇编语言的学习与实践,体验了之前没有尝试过的学习模式,这种自学加上老师辅导,并和同学一组独立做出课程作业的模式,让我丛中收获到许多。首先,经过在课本上学习、在图书馆中查阅资料和在互联网上查询,我学习了不少汇编语言的基础知识和一些小技巧与应 用,与此同时,因为汇编语言这门语言更接近于硬件,它直接面向机器,我也学习和了解到不少关于计算机硬件的一些知识。其次,我们在开发过程中,先设计框架和思路,然后一起查阅相关的资料,一边学习一边测试部分的小程序,检测代码功能和编译器环境问题,虽然有不少的小麻烦和一些棘手的问题,但是经过和同学一起调试交流,成功解决了这些问题。一开始认为开发程序很简单,但在制作的过程中,感受到做一个完整完善的小程序原来也是很不容易,有很多问题要面对和解决,通过本次项目我们学习到了一种临危不乱,顽强渐进的精神,为以后的学习和 工作积累了经验,打下了良好的基础。
    1 评论 38 下载 2019-06-20 23:54:00 下载需要11点积分
  • C语言实现的基于Huffman哈夫曼编码的数据压缩与解压缩

    一、实验题目用哈夫曼编码实现文件压缩
    二、实验目的
    了解文件的概念
    掌握线性链表的插入、删除等算法
    掌握Huffman树的概念及构造方法
    掌握二叉树的存储结构及遍历算法
    利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理

    三、实验设备与环境微型计算机、Windows 系列操作系统 、Visual C++6.0软件
    四、实验内容根据ASCII码文件中各ASCII字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。
    五、概要设计5.1 数据结构类型定义/*****Huffman结构定义**********/typedef struct node { long w;//w为权值 short p,l,r; //p为parent,l为左孩子,r为右孩子}htnode,*htnp;//动态分配数组存储哈夫曼树/*****Huffman编码表结构定义*****/typedef struct huffman_code { unsigned char len;//长度 unsigned char *codestr; }hufcode;typedef char **huffmancode;//动态分配数组存储哈夫曼编码表
    5.2 程序构成本程序的构成,共有 14 个函数,1 个菜单函数。
    // 1.初始化文件名int initial_files(char *source_filename,FILE **inp,char *obj_filename,FILE **outp);// 2.创建文件名char *create_filename(char *source_filename,char* obj_filename);// 3.压缩文件int compress(char *source_filename,char *obj_filename);// 4.频率数据long frequency_data(FILE *in,long fre[]);// 5.选取结点权值最小的树int search_set(htnp ht,int n,int *s1, int *s2);// 6.创建哈夫曼树int create_hftree(long w[],int n,htnode ht[]);// 7.编码哈夫曼树int encode_hftree(htnp htp,int n,hufcode hc[]);// 8.把字符串用二进制数字表示:运用位运算的知识unsigned char chars_to_bits(const unsigned char chars[8]);// 9.写入压缩文件int write_compress_file(FILE *in,FILE *out,htnp ht,hufcode hc[],char* source_filename,long source_filesize);// 10.解压缩int decompress(char *source_filename,char *obj_filename);// 11.构造微型哈夫曼树void get_mini_huffmantree(FILE* in,short mini_ht[][2]);// 12.写入解压缩int write_decompress_file(FILE *in,FILE* out,short mini_ht[][2],long bits_pos,long obj_filesize);// 13.重新变成原始文件int d_initial_files(char *source_filename,FILE **inp,char *obj_filename,FILE **outp);// 14.菜单函数void main()
    5.3 写文件压缩的基本思路文件压缩的基本思路:

    打开需压缩文件
    创建Haffman树
    将需压缩文件中的每个ascii码对应的haffman编码按bit单位输出(此过程需要运用位运算的知识点)
    文件压缩结束

    最后,通过解压缩来验证是否失真现象。
    六、详细设计6.1 文件的初始化及其创建创建文件是使用了字符串的知识,构造临时文件夹temp,运用字符串的复制strncpy,连接strcat函数来实现对文件名的创建,我把文件压缩的格式定义为”.zip”。

    6.2 构造Huffman树的方法——Huffman算法6.2.1 构造Huffman树步骤
    根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树,令起始权值为wj
    在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和
    在森林中删除这两棵树,同时将新得到的二叉树加入森林中
    重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。

    下面给出中实现的Haffman树的结构及创建算法,有两点说明:

    这里的Haffman树采用的是基于数组的带左右儿子结点及父结点下标作为存储结点的二叉树形式,这种空间上的消耗带来了算法实现上的便捷
    由于对于最后生成的Haffman树,其所有叶子结点均为从一个内部树扩充出去的,所以,当外部叶子结点数为m个时,内部结点数为m-1,整个Haffman树的需要的结点数为2m-1
    初始化Haffman树分两步进行,先将所有结点赋值,再将前m个叶子结点赋初值
    在查找权值最小并且父结点为空的两个结点时,通过逐个比较,将两结点的位置下标与权值分别保存。方便在与其父节点建立联系时调用


    6.2.2 Huffman编码:数据通信用的二进制编码
    思想:根据字符出现频率编码,使电文总长最短
    编码:根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列

    6.3 压缩过程的实现压缩过程的流程

    打开需压缩文件
    创建Haffman树
    将需压缩文件中的每个ascii码对应的haffman编码按bit单位输出
    文件压缩结束

    在实际编码中,压缩函数是通过多次函数调用实现的。
    我的代码中,位运算的小函数:把字符串用二进制表示。在写入压缩函数中起到压缩的功能。
    七、测试结果及分析压缩后的程序运行结果截图

    解压缩后的运行结果截图

    压缩后的结果截图

    解压缩后的结果截图

    请注意修改时间的比较,文件wangyun.doc确实完成了从压缩到解压缩的过程,而且初步看,解压后的doc文件大小是一样的。
    接下来进一步说明:
    下图是被压缩文件和压缩文件的属性比较,原本有28.5KB的文件压缩成了9.79KB的文件


    下面两幅图是压缩前的文本文件wangyun和解压后的文本文件wangyun的比较,两图的内容都相同说明没有失真。
    压缩前的源文件

    压缩后的源文件

    八、总结这次实验确实是让自己特别头疼,代码中有关于C程序语言中文件知识如打开,关闭等的操作,这些知识点是我上个学期学习的薄弱环节,因为没有怎么运用,所以也没怎么看文件的知识点。我通过翻阅图书馆书籍和上个学期C程序设计书,还有同学的解释,看懂了基本的文件操作。
    值得高兴的是,我知道了一些小知识,怎样把调试框变颜色的的函数,感觉非常有趣。
    代码中的使用字符串处理函数:strcat,strcpy,strcmp等也是我忘记的知识点,翻阅书籍之后,就记起它们的具体操作和运用实现了。
    还有一个大的问题,就是位运算的使用,通过运行,明显出现压缩的比率不高,而且还出现了越压越大的问题,询问老师发现,是自己没有用位运算的知识,知道问题的所在,老师说这不是重点。在我的代码中,老师还是耐心的帮我找到了我的位运算的小程序。也知道了,为什么有时候压缩程序出现错误,有可能是压缩的文件越界了,可能是统计频率出现小问题,不同的程序有不同的限定范围。同时,我也发现,不同的文件扩展名有着不同的压缩比例,这有可能和自己代码里频率函数有错误。在我的压缩程序中,小文件txt文件是不适用的,该比例是越压越大的,doc文件是适用的,且文件越小,压缩比例越小,该压缩程度越好,且解压缩后程序是不失真。
    当然,我的不足是很多的,但是比起刚开始着手的迷茫,现在是大致了解了。所以,平时要注意知识的积累,能举一反三。
    4 评论 361 下载 2018-10-31 11:34:38 下载需要8点积分
  • 基于JAVA和SQL SERVER实现的图书信息管理系统

    1 前言该系统为图书馆书记管理系统,为高校、企业的相关书籍管理工作提供了一个方便的电子平台。该系统分为两个部分,即客户端及服务器,系统功能模块分为图书管理模块、图书信息查询模块、读者信息管理模块、借阅信息管理模块等。该系统是一套功能比较完善的图书数据管理软件,具有数据操作方便高效迅速等优点。
    该系统使用SQL Server2014、Visual Studio开发工具进行开发,可以运行于目前主流的Windows平台上,具有良好的可移植性和可操作性。
    2 数据库设计2.1 需求分析目前市场主流的图书管理系统有ALEPH500、北邮Melinets、深圳ILAS等,但是缺少一个通用的、集成的系统。根据市场这一需求,该项目开发一款可移植的、易操作的通用集成图书管理系统。
    在该系统中,管理员要为每一个读者建立一个借阅账户,用于存储读者的各种信息。读者通过已经建立的借阅账户,获得借阅图书并登记以及查询相关信息的权限,从而达到信息化管理的目的。
    借阅图书时,先登记读者的相关信息,并将借阅日期等信息登记在数据库中,供管理员进行核对。另外,读者根据相关的图书编号能够查询图书的相关信息,可以根据相关的信息进行借阅或者预约登记等操作。如果有超期或者图书损坏等情况,管理员可以进行相应的登记以供日后查询。
    归还图书时,输入相关读者的编号或者图书号即可进行图书的归还登记。另外管理员可就此次还书情况进行备注,记录相应的情况。
    图书管理员可以定期或者不定期地对图书信息进行入库、删除、修改等操作,相关标号的规定根据国家标准制定。
    为系统维护人员提供权限管理、数据备份等通用功能。
    2.2 数据流图数据流图如下所示(由于系统维护为通用功能,此处不做具体分析):

    2.3 数据词典相关数据项如下所示:

    2.4 数据库概念结构及相应Power Designer概念模型相关E-R图如以下power designer模型所示

    2.5 数据库逻辑结构及相应Power Designer物理模型
    2.6 数据库物理设计相应SQL语句包括生成创建数据库的脚本,包括数据库结构定义 ,建立索引、视图语句,存储过程(如果使用)的结构和定义,主要的查询语句等。
    相关SQL语句如下所示:
    create database Libraryuse Librarycreate table admin( ad_id int not null primary key, ad_password nvarchar(20) not null, ad_name nvarchar(20) )use Librarycreate table bookuser( user_id int not null primary key, user_name nvarchar(20), user_password nvarchar(20) not null, user_cardno nvarchar(8) not null )use Librarycreate table bookcard( card_no nvarchar(10) not null primary key, card_userno int not null)use Librarycreate table borrowmessage( card_no nvarchar(10) not null primary key, book_no nvarchar(10) not null, book_name nvarchar(20), borrow_date date, return_date date)use Librarycreate table bookmessage( book_no nvarchar(10) not null primary key, book_author nvarchar(10), book_price money, book_typecode int, book_amount int)select * from admin where ad_id = ? and ad_password = ?insert into admin (ad_id, ad_password) values (" + i + "," + password + ")select * from bookmessageselect * from bookuseronedelete from bookuserone where user_id = " + user_id + ""select * from bookcard"insert into bookmessage (book_no, book_author, book_price, book_typecode, book_amount, book_name) values (" + "'"+bookno+"'" +"," + "'"+bookauthor+"'" + "," + "'"+bookprice+"'" + "," + code + "," + amount + "," + "'"+bookname +"'"+")";select * from borrowmessageuse master backup database Library to disk = 'F:\\database_backup\\Library.bakuse master restore database Library from disk = 'F:\\database_backup\\Library.bak' with replacedelete from bookmessage where book_no = '" + book_id + "'"update bookmessage set book_author = '" + update_mes + "' where book_no = '" +update_id +"'"update bookmessage set book_price = '" + update_mes + "' where book_no = '" +update_id +"'"update bookmessage set book_typecode = " + update_mes + " where book_no = '" +update_id +"'"update bookmessage set book_amount = " + update_mes + " where book_no = '" +update_id +"'"update bookmessage set book_name = '" + update_mes + "' where book_no = '" +update_id +"'"select * from bookmessageselect * from borrowmessage where card_no = '" + borrow_id + "'"select book_amount from bookmessage where book_no = '" + borrow_book_id +"'"select * from bookmessage where book_no = '" + borrow_book_id + "'update bookmessage set book_amount = " + book_final_account + "where book_no = '" + borrow_book_id + "'";insert into borrowmessage(card_no, book_no, book_name, borrow_date) values ('" + borrowercard_id + "','" + borrow_book_id +"','" + book_name +"', getdate())"select * from bookmessage where book_no = '" + return_book_id + "'update bookmessage set book_amount = " + bookcount + "where book_no = '" + return_book_id + "'""update borrowmessage set return_date = getdate() where card_no = '" + returnercard_id + "' and book_no = '" + return_book_id + "'"select * from bookuserone where user_id = " + user_login_id"insert into bookuserone (user_id, user_password) values(" + user_logon_id + ", '" + user_logon_password + "')update bookuserone set user_cardno = '" + cardid + "' where user_id = " + useridinsert into bookcard(card_no, card_userno) values ('" + cardid +"'," + userid +")"
    3 系统功能3.1 程序的运行环境
    Windows 10
    JAVA SE 1.8
    SQL Server 2015

    3.2 系统功能模块图系统功能模块图如下所示:

    3.3 主要功能描述本系统能够执行的功能有一下几点:

    管理员注册、登陆
    管理员查询借阅、图书、借书卡、注册用户信息
    图书入库
    图书信息修改
    数据库备份、恢复
    普通用户注册、登陆
    普通用户查询图书信息
    普通用户注册借书卡并登录
    持有借书卡用户查询自己的借阅信息及图书信息
    持有借书卡用户借书、还书

    3.5 主要运行界面的截图运行界面截图如下:















    4 程序调试情况
    系统未能正确进行数据库连接,更改相关连接情况即可解决
    系统不能正确处理查询请求,修改相关数据库定义即可
    系统不能正确显示查询的结果集,使用JTable解决相关问题

    5 系统的安装使用说明
    为确保系统安装,需安装JAVA SDK 1.8并正确配置
    机器需在本地安装SQL Server2015并存有数据库文件
    打开相关JAVA文件即可进行安装、使用

    6 系统总结本系统具有操作简便、界面整洁、对用户操作友好等特点,易于上手且学习门槛低,而且运行所需资源相对较少,可以流畅运行。
    该系统还存在一些问题,例如相关信息显示界面存在问题,而且查询功能方面还不是很完善,有待改进。
    改进意见有:修复相关显示界面的bug,增加更加精确的查询功能,界面优化。
    7 课程设计总结通过做本次课程设计,让我更加深入的了解了数据库相关技术及其应用,提高了个人的编码水平和解决问题的能力。同时,通过这次课程设计,让我了解到更深入的数据库技术,同时学习到了将数据库技术和其他编程语言结合在一起的相关技术,并且在解决相关bug的时候通过不断地学习走出了一些认识误区,并且将以前学习的知识更加的深入化、细致化。
    本次课程设计让我受益匪浅,收获成果远比单单看书要来得更多。
    8 参考文献[1] 柳玲、徐玲、王成良编著,数据库原理与设计实验及课程设计教程,重庆大学出版社,2016.5
    [2] 王成良、柳玲、徐玲,数据库技术与应用,清华大学出版社,2011.11
    [3] Patrick O’ Neil, Elizabeth O’ Neil. Database: Principles, Programming and Performance, 2nd ed. (数据库——原理、编程与性能). Morgan Kaufmann Publishers. 2000 (北京:高等教育出版社.2001,5)
    4 评论 206 下载 2018-11-06 16:38:21 下载需要14点积分
  • 基于C语言的学生住宿信息管理系统

    一、系统需求分析学生住宿信息管理系统主要包括宿舍楼信息,在住学生基本信息,在住学生缴纳住宿费信息等三方面的信息。
    系统要求

    能对以上三类信息进行录入,修改,删除功能,并且在录入时系统应提供快捷和方便的数据录入方式,避免重复操作,降低数据冗余度。同时还应提供自动数据校验功能,满足数据正确性、合理性、有效性和依耐性等要求,避免录入无用或非法数据
    能对三种数据进行查询,并且能按一下多种条件分别进行查询:

    按宿舍楼编号查询宿舍楼信息按楼栋管理员姓名查询其所管理的宿舍楼信息按学号查询学生基本信息以学生姓名、学生类别、班级等组合条件查询学生基本信息,并能进行模糊查询以学号为条件,查询学生缴纳住宿费信息查询某时间段内所有学生的缴费信息
    能提供统计功能,具体包括:

    统计所有宿舍楼可住学生数、在住学生数、空床位数、入住率(保留两位小数),按入住率从高到低排序后输出分性别统计所有年级各种类别学生的在住人数,按年级从高到低输出统计四年来各宿舍楼住宿费收入统计并输出欠缴住宿费信息,按缴费金额从高到低排序后输出
    数据存取功能。要求程序在运行时,三种信息以链表形式存在于内存中,数据存储采用动态储存分配方式。同时在外存上以数据文件对数据进行存储,且保证在内存和外存两种存储介质上内容的一致性

    二、总体设计学生住宿信息管理系统由五大功能模块组成:文件模块,编辑模块,查询模块,统计模块,帮助模块。如下图所示:


    文件模块包括四个子模块:数据保存,数据备份,数据恢复,退出
    编辑模块包括九个子模块:添加宿舍楼,修改宿舍楼,删除宿舍楼,添加学生基本信息,修改学生基本信息,删除学生基本信息,添加住宿缴费信息,修改住宿缴费信息,删除住宿缴费信息
    查询模块包括三个子模块:查询宿舍楼信息,查询学生基本信息,查询学生住宿缴费信息
    统计模块包括四个子模块:统计各宿舍楼入住率,统计在住学生分类信息,统计宿舍楼年度收入情况,统计住宿费欠缴情况
    帮助模块包括二个子模块:帮助主题,关于系统

    三、数据结构设计3.1 宿舍楼信息链结点结构(DORM_NODE)及用法typedef struct dorm_node { char dorm_id[5]; /**< 宿舍楼号*/ char name[10]; /**< 姓名*/ char tel[20]; /**< 联系电话*/ short room_amount; /**< 房间数目*/ short bed_amount; /**< 床位数目*/ float fee; /**< 每床位每年住宿费*/ struct stu_node *snext; /**< 指向学生基本信息支链的指针*/ struct dorm_node *next; /**< 指向下一结点的指针*/} DORM_NODE;



    数据项名称
    数据类型及长度
    数据项标识
    举例




    宿舍楼号
    char[5]
    dorm_id
    D13


    姓名
    char[10]
    name
    张三


    联系电话
    char[20]
    tell
    13777855768



    3.2 学生基本信息链结点结构(STU_NODE)及用法typedef struct stu_node { char stu_id[12]; /**< 学号*/ char name[10]; /**< 姓名*/ char sex[4]; /**< 性别*/ char birthday[12]; /**< 出生日期*/ char type[5]; /**< 学生类别*/ char term; /**< 学制*/ char enroll_date[10]; /**< 入学年月*/ char class_id[10]; /**< 班级*/ char dorm_id[5]; /**< 宿舍楼号*/ char room[5]; /**< 房间号*/ char tel[20]; /**< 联系电话*/ struct charge_node *cnext; /**< 指向缴费信息支链的指针*/ struct stu_node *next; /**< 指向下一结点的指针*/} STU_NODE;



    数据项名称
    数据类型及长度
    数据项标识
    举例




    学号
    char[1]
    stu_id
    1514588


    姓名
    char[10]
    name
    张三


    性别
    char[4]
    sex



    出生日期
    char[12]
    birthday
    19970923


    学生类别
    char[5]
    type
    本科


    学制
    char
    term
    4


    入学年月
    char[10]
    enroll_date
    20150901


    班级
    char[10]
    class_id
    CS1504


    宿舍楼号
    char[5]
    dorm_id
    D13


    房间号
    char[5]
    room
    525


    联系电话
    char[20]
    tel
    17777309475



    3.3 缴费信息链结点结构(CHARGE_NODE)及用法typedef struct charge_node { char stu_id[12]; /**< 学号*/ char name[10]; /**< 姓名*/ char date[12]; /**< 缴费日期*/ float sum; /**< 缴费金额*/ char payee[10]; /**< 收费人*/ char notes[5]; /**< 备注*/ struct charge_node *next; /**< 指向下一结点的指针*/} CHARGE_NODE;



    数据项名称
    数据类型及长度
    数据项标识
    举例




    学号
    char[12]
    stu_id
    1514588


    姓名
    char[10]
    name
    张三


    缴费日期
    char[12]
    date
    20150901


    缴费金额
    float
    sum
    1000


    收费人
    char[10]
    payee
    陈老师


    备注
    char[5]
    notes
    贷款



    3.4 宿舍楼入住率统计信息链结点结构(USE_RATE_NODE)及用法typedef struct use_rate_node { char dorm_id[5]; /**< 宿舍楼号*/ unsigned short total_num; /**< 可住学生数*/ unsigned short used_num; /**< 在住学生数*/ unsigned short free_num; /**< 空床位数*/ float use_rate; /**< 入住率*/ struct use_rate_node *next; /**< 指向下一结点的指针*/} USE_RATE_NODE;



    数据项名称
    数据类型及长度
    数据项标识
    举例




    宿舍楼号
    char[5]
    stu_id
    D13


    可住学生数
    unsigned short
    total num
    400


    在住学生数
    unsigned short
    used num
    100


    空床位数
    unsigned short
    free num
    300


    入住率%
    float
    use rate
    25%



    3.5 在住学生分类统计信息链结点结构(STU_TYPE_NODE)及用法typedef struct stu_type_node { char grade[5]; /**< 年级*/ unsigned short school_boy1; /**< 男专科生数*/ unsigned short school_girl1; /**< 女专科生数*/ unsigned short school_boy2; /**< 男本科生数*/ unsigned short school_girl2; /**< 女本科生数*/ unsigned short school_boy3; /**< 男硕士生数*/ unsigned short school_girl3; /**< 女硕士生数*/ unsigned short school_boy4; /**< 男博士生数*/ unsigned short school_girl4; /**< 女博士生数*/ unsigned short school_boy5; /**< 其他男生数*/ unsigned short school_girl5; /**< 其他女生数*/ struct stu_type_node *next; /**< 指向下一结点的指针*/} STU_TYPE_NODE;



    数据项名称
    数据类型及长度
    数据项标识
    举例




    年级
    char[5]
    grade
    2014


    男专科生数
    unsigned short
    school_boy1
    212


    女专科生数
    unsigned short
    school_girl11
    86


    男本科生数
    unsigned short
    school_boy2
    540


    女本科生数
    unsigned short
    school_girl12
    112


    男硕士生数
    unsigned short
    school_boy3
    900


    女硕士生数
    unsigned short
    school_girl13
    760


    男博士生数
    unsigned short
    school_boy4
    500


    女博士生数
    unsigned short
    school_girl14
    280


    其他男生数
    unsigned short
    school_boy5
    860


    其他女生数
    unsigned short
    school_girl15
    980



    3.6 宿舍楼年度住宿费收入统计信息链结点结构(INCOME_NODE)及用法typedef struct income_node { char dorm_id[5]; /**< 宿舍楼号*/ float year1_income; /**< 年度1收入*/ float year2_income; /**< 年度2收入*/ float year3_income; /**< 年度3收入*/ float year4_income; /**< 年度4收入*/ struct income_node *next; /**< 指向下一结点的指针*/} INCOME_NODE;



    数据项名称
    数据类型及长度
    数据项标识
    举例




    宿舍楼号
    char[5]
    stu_id
    D13


    年度1收入
    float
    year1_income
    2000


    年度2收入
    float
    year2_income
    8000


    年度3收入
    float
    year3_income
    10320


    年度4收入
    float
    year4_income
    28000



    3.7 在住学生欠费统计信息链结点结构(UNCHARGE_NODE)及用法typedef struct uncharge_node { char stu_id[12]; /**< 学号*/ char name[10]; /**< 姓名*/ char dorm_id[5]; /**< 宿舍楼号*/ char room_num[5]; /**< 房间号*/ float amount; /**< 欠缴金额*/ struct uncharge_node *next; /**< 指向下一结点的指针*/} UNCHARGE_NODE;



    数据项名称
    数据类型及长度
    数据项标识
    举例




    学号
    char[12]
    stu_id
    1514588


    姓名
    char[10]
    name
    张三


    宿舍楼号
    char[5]
    dorm_id
    D13


    房间号
    char[5]
    room_num
    525


    欠缴金额
    float
    amount
    320



    3.8 三方向十字交叉链表结构图
    四、详细设计4.1 主程序运行流程图
    打开系统后首先进入的是欢迎界面,然后按任意键进入系统。继而加载文件中储存的链表数据信息,文本菜单界面初始化,生成可视化窗口。
    系统的功能主要包括数据维护,数据查询以及数据统计三大方面,最后保存链表数据信息,退出系统。
    4.2 数据保存流程图
    在数据保存过程中,首先访问的是宿舍楼主链信息,遍历主链指针,当指针不为空时在宿舍楼信息链中插入新的结点并正确输入宿舍楼信息;然后以插入的结点指针为学生基本信息链的头指针,遍历学生基本信息链表指针,当不为空时,以该指针为第三条链缴费信息链的头指针,最后遍历住宿缴费信息链表,插入新的结点作为该学生的住宿缴费信息。
    4.3 数据加载流程图
    在数据加载过程中,首先加载的是宿舍楼信息,动态创立一个宿舍楼结点,以此为头指针遍历链表,读入宿舍楼信息;
    然后动态创立学生基本信息结点,在宿舍楼链中找到该学生所在的宿舍楼结点,在该节点下建一条学生基本信息链,遍历链表,读入学生基本信息;
    最后动态创立住宿缴费信息结点,在学生基本信息来链中找到该学生的基本信息,在该结点下建一条住宿缴费信息链,遍历链表,读入住宿缴费信息。
    4.4 宿舍楼信息插入流程图
    4.5 宿舍楼信息修改流程图
    4.6 宿舍楼信息删除流程图
    4.7 学生基本信息插入流程图
    4.8 学生基本信息修改流程图
    4.9 学生基本信息删除流程图
    4.10 住宿缴费信息插入流程图
    4.11 缴费信息修改流程图
    4.12 住宿缴费信息删除流程图
    五、运行测试与结果分析进入系统欢迎界面

    数据保存

    添加宿舍楼信息

    宿舍楼信息查询

    学生基本信息查询

    宿舍楼入住率统计

    六、总结刚开始我看到题目完全不知该从何处下手,因为平时学的C根本没有写过大型程序,根本不知该用哪方面的知识来实现文本菜单界面,因为平时只做过一些输入输出的普通小程序,根本没有界面的概念。于是我就想如果先运行一下老师给的样例程序,脑中大概也就有了一些概念和想法。可是把老师给的几个代码拿来一运行编译error就有几十行,面对那上千行的代码,我就不知该怎么下手了。后来快要开学了了,我又开始行动起来。首先我拿起那本《C语言实验与课程设计》,我就反复看,大概懂了一些控制台函数的用法,可是还是不知道怎么动手写代码,我就开始将书上的代码一段一段的输入进去跑一跑,慢慢的就大概懂了怎么来实现那些界面。
    课设中最重要的部分是如何一一实现所要求的功能。我参考实验书上给的源代码,编写了链表的创建,之后是将链表的内容写入到文件中保存,并将文件中写入的内容再次逐条读取出来,显示在屏幕上。这个主体写完了,接下来就开始写宿舍楼、学生基本信息信息的查询函数,书上有完整的例子,这个就比较容易点。
    最后就是调试程序了。这个应该是整个课程设计中最为复杂和难搞的部分。首先是整个系统,光是函数就有几十个,而且经常是一个函数中又调用着若干其它函数,这样调试起来就比较困难,因为就算一个函数里,一点小小的错误就会引起连锁反应导致其它函数都出错,而且有些错误时隐性的,就是可能在这个函数中运行没问题,可在哪个函数中运行起来又有大问题。所以调试也是最耗时间和精力的一个环节,有时候我为了测试一个函数的功能是否稳定,得将程序跑很多次,一遍又一遍的运行,看看有没有一些不足的地方,有没有一些隐藏的问题,然后又得静下心来仔细分析问题原因所在并慢慢地纠正并再次调试运行,直到满意为止。在调试程序过程中我也体会调试员真还得过硬的基础知识,能敏锐觉察出代码中的错误,而且还得有足够的精力和耐力。
    尽管程序系统算是完成了,但是当我开始写报告时才发现原来课程设计才刚完成了一半而已。由于书上给了很多完整的例子,所以很多时候我就直接将书上的代码写了上去,有很多自己也不是很懂,到学校后在完善程序的过程中又问了不少同学,有些代码我觉得别人写的比较好于是我便直接借鉴过来了,这样便造成了一个后果,虽然我的程序可以跑起来,可是有很多地方我自己都不是很懂,导致在演示时老师问了我好几个问题我竟没回答上来。所以我明白了不管我们以后写程序是不是借鉴了别人的或者网上的代码,我们首先得把它完完全全搞懂才能为自己所用。
    2 评论 40 下载 2019-04-14 10:44:47 下载需要8点积分
  • 基于JSP和SQL SERVER数据库实现的图书信息管理系统

    一、功能概述图书信息管理系统是建立在信息技术基础上,以系统化的管理思想,为普通读者和管理员提供图书查看,增加,删除,修改图书信息功能的平台,。它整合了回到首页、普通用户注册,用户登录,图书基本信息查看,图书的增加,图书的删除,和图书的修改七个功能模块。图书信息管理系统以图书信息的管理为核心,进行用户的注册、登录、查看等功能。
    1.1 登录登录这一模块,主要功能有:用户输入用户名和密码,并对账号与密码的输入情况进行处理和判断,新用户注册以及对注册内容的审核,提交和重置。其中除了重置,其余各个部分都与数据库进行了连接与相应的增、查、匹配工作。
    1.2 登录确认登录确认模块从登录模块接收数据,来显示在屏幕上,用户可以进行确认与重新修改。
    1.3 用户注册这一模块,主要是采集新员工的信息,包括账号,密码,学历,地区,电话。同时,系统自动将其存入SQL数据库,便于以后查看与使用。
    1.4 忘记密码这一模块,从用户登录页面进入,用户输入要找回密码的账号,系统通过查询数据库,来判断是否有对应的密码,来进行找回操作。
    1.5 图书主页显示出图书的详细信息,包括书名,作者,价格信息,登录模块不同的账号,通过查询数据库,进入不同的图书主页。普通用户只可以进行查看,管理员可以进行图书的增删改查操作,均与数据库进行相应连接。
    1.6 图书增加增加图书模块,由管理员进行操作,可以输入图书的信息来进行图书的增加操作,新增加的图书信息会增加到相应的图书信息数据库。
    1.7 图书删除图书的删除,管理员在图书操作页面进行图书信息的删除,后台会在数据库中进行相应图书信息的删除。
    1.8 图书修改图书的修改操作,管理员点击修改,然后可以修改图书的详细信息,确定之后,修改之后的信息会显示在图书主页,进行数据库信息的修改。
    二、数据库设计2.1 bookinfo (图书信息表)


    属性名
    属性含义
    数值类型
    是否可为空
    是否为主码
    是否引用外码




    id
    书号
    int
    No
    Yes
    No


    bookname
    书名
    varchar(45)
    No
    No
    No


    author
    作者
    varchar(45)
    No
    No
    No


    price
    价格
    float
    No
    No
    No



    2.2 personinfo(用户信息表)


    属性名
    属性含义
    数值类型
    是否可为空
    是否为主码
    是否引用外码




    username
    用户名
    varchar(10)
    No
    Yes
    No


    userpass
    密码
    varchar(10)
    No
    No
    No


    degree
    学历
    varchar(10)
    No
    No
    No


    local
    地区
    varchar(8)
    No
    No
    No


    phone
    电话
    char(11)
    No
    No
    No



    三、界面设计3.1 登录界面
    3.2 用户注册界面
    3.3 主界面
    3.4 用户图书界面
    3.5 管理员图书界面
    3.6 用户信息确认界面
    3.7 图书添加界面
    3.8 图书修改界面
    3.9 找回密码界面
    四、小结通过此次数据库的小学期,我了解了一些jsp的基本语法知识,根据自己掌握的知识和借鉴其他相似网页的结构,自己独立写了几个jsp的页面,并且实现了jdbc与数据库的连接,在jsp页面中写了一部分数据库的操作语句,进行了数据库的增删改查功能,但是语法结构和语句的书写还是经常出错误,但是通过反复的琢磨与同学的帮助,完成了图书管理系统的数据增删改查功能,前面还有一些注册和登录的功能,在以前网页知识的基础上,又扩展了一些知识,比如网页的跳转,页面之间数据的传递,还有很少的一些页面效果知识内容。
    但是写的越多,才发现与同学的差距还是很大,在后面的学习过程中,要增强自己的动手能力,多多实践动手写程序,才能熟练掌握,不敢说融会贯通,但是下次知道该怎么写,不至于什么都不会。
    1 评论 211 下载 2018-12-03 09:44:24 下载需要8点积分
显示 45 到 60 ,共 15 条
eject