分类

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

资源列表

  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思JAVA和SQL SERVER数据库实现的人力资源管理系统

    一、系统开发平台1.1 介绍人力资源管理系统, 通过提高内部员工的满意度、忠诚度,从而提高员工贡献度,即绩效,帮助管理者通过有效组织管理降低成本和加速增长来创造价值链利润。随着企业的规模不断扩大,员工数量急剧增加,有关员工的各种信息量也成倍增长。面对庞大的信息量需要有人力资源管理系统来提高员工管理工作的效率。一个完善的人力资源信息管理系统能够极大地提高员工信息管理的效率。
    1.2 开发环境
    开发语言:Java

    用Java做设计流程清晰、结构合理,有良好的可扩充性和耦合性
    开发工具:Eclipse V4.5.0 JDK 1.8
    数据库:Microsoft SQL Sever 2012
    操作系统:Microsoft Windows 10

    二、数据库规划2.1 任务陈述人力资源管理系统是一个企业不可缺少的部分,它的内容对于企业的决策者和管理者来说都至关重要。随着企业的规模不断扩大,员工数量急剧增加,有关员工的各种信息量也成倍增长。面对庞大的信息量需要有人力资源管理系统来提高员工管理工作的效率。一个完善的人力资源信息管理系统能够极大地提高员工信息管理的效率,具有检索迅速、查找方便、可靠性高、存储量大、更新快、寿命长、成本低等优点。
    企业在正常的运营中需要对员工档案信息、部门资料、企业报表进行管理,利用人力资源管理系统及时了解各个环节中信息的变更,有利于提高管理效率。
    2.2 任务目标本系统主要可以实现以下任务目标:

    系统在员工进入公司时为员工建立人事档案,人事档案应该包括:

    员工基本信息:编号、姓名、性别、邮箱、电话、员工进入公司的时间、员工级别、员工所在部门和员工级别等员工技能情况:员工接受的培训、具备的技能等
    员工的工资应该包括基本工资和奖金两个部分:

    基本工资根据员工的级别划分(试用员工、普通员工、组长、部门经理、总经理)奖金应根据员工的业绩由其直接或更高级领导确定
    员工在来到公司上班时应该首先登录公司系统签到,离开公司时登录系统签离。如果办事外出或者出差应由上级领导确认考勤情况。缺勤或者迟到按一定数额罚款,迟到2小时以上算缺勤
    员工离职应保留员工的历史信息,以备日后查询
    系统还应该提供强大数据统计、查询、报表生成以及打印等功能
    用户权限管理
    异常处理

    三、需求分析3.1 用户需求说明3.1.1 数据需求公司有一名总经理,多名试用员工、普通员工、组长、部门经理。总经理负责公司的管理,部门经理与组长负责按级别管理员工,分配工作,管理员负责更新信息。
    职工号在公司内唯一。

    员工基本信息:职工号、密码、姓名、性别、邮箱、电话、员工进入公司的时间、员工职位级别(FK)、员工所属部门(FK)、是否离职
    公司部门:部门号、部门名字、部门经理
    公司职位:职位号、职位名、职位级别、部门号(FK)
    员工工资:职工号、职位级别、基本工资、业绩等级、奖金
    培训表:培训号、培训名、培训描述
    技能表:技能号、技能名、技能描述
    培训联系:员工号、培训号、培训名、成绩
    技能联系:员工号、技能号、技能名、熟练度

    员工在来到公司上班时应该首先登录公司系统签到。缺勤或者迟到按一定数额罚款,迟到2小时以上算缺勤。由管理员定时统计签到情况。

    签到表:职工号、年份、月份、日期、时刻、是否迟到
    考勤表:职工号、迟到次数、缺勤次数、罚款数

    3.1.2 事务需求
    管理员

    数据录入

    录入新员工基本信息录入公司部门信息录入职位信息录入员工业绩工资信息录入员工受培训信息录入员工技能信息录入员工考勤情况
    数据更新

    更新/删除员工基本信息更新/删除公司部门信息更新/删除职位信息更新/删除员工业绩工资信息更新/删除员工受培训信息更新/删除员工技能信息更新/删除员工考勤情况
    数据查询

    查询员工基本信息查询公司部门信息查询职位信息查询员工业绩工资信息查询员工受培训信息查询员工技能信息查询员工考勤情况查询员工签到情况

    员工

    查询员工基本信息查询公司部门信息查询职位信息查询员工业绩工资信息查询员工受培训信息查询员工技能信息查询员工考勤情况查询员工签到情况进行签到修改下级员工的工资

    3.2 系统需求说明3.2.1 初始数据库大小
    大约有1000名员工,分属于约20个部门中,每个部门有5个以下的职位
    公司提供10余种培训,员工最多可选择5种
    员工技能10余种,每人最多5种
    很多考勤条目

    3.2.2 网络和共享需求
    所有部门必须安全的和总部中央数据库网络互连
    必须能够支持至少100名成员同时访问.需要考虑大数量并发访问的许可需求
    3.2.3 性能单个记录查询时间少于1秒,高峰期少于5秒
    多个记录查询时间少于5秒,高峰期少于10秒
    更新/保存记录时间少于1秒,高峰期少于5秒

    3.2.4 安全性
    数据库必须有口令保护
    每个用户分配特定的用户视图所应有的访问权限
    用户只能在适合他们完成工作的需要的窗口中看到需要的数据

    3.2.5 备份和恢复
    每天24点备份
    用户界面

    菜单驱动联机帮助
    法律问题

    对员工信息管理,遵守法律

    四、数据库逻辑设计4.1 ER图
    该ER图包括员工、部门、职位、工资、培训、技能、考勤七个实体和工作于、包含、属于、得到、选择、拥有、进行七个关系。
    4.2 数据字典4.2.1 系统实体描述员工表



    属性
    描述
    数据类型和长度
    是否允许空值




    Employee_id
    职工号
    Varchar 50



    Password
    密码
    Varchar 50



    Sex
    性别
    Varchar 2



    Name
    姓名
    Varchar 50



    Position_rank
    职位级别
    Int 4



    Branch_id
    部门号 (外码)
    Varchar 32



    Position_id
    职位号 (外码)
    Varchar 32



    Email
    邮箱
    Varchar 50



    Phone
    电话
    Varchar 50



    Hiredate
    入职时间
    Varchar 50



    Service_state
    是否离职
    Varchar 2




    部门表



    属性
    描述
    数据类型和长度
    是否允许空值




    Branch_id
    部门号
    Varchar 50



    Branch_name
    部门名
    Varchar 50



    Manager_id
    经理职工号 (外码)
    Varchar 50




    职位表



    属性
    描述
    数据类型和长度
    是否允许空值




    Position_id
    职位号
    Varchar 50



    Position_rank
    职位级别
    Int 4



    Position_name
    职位名
    Varchar 50



    Branch_id
    部门号 (外码)
    Varchar 50




    培训表



    属性
    描述
    数据类型和长度
    是否允许空值




    Course_id
    培训课程号
    Varchar 50



    Course_name
    培训课程名
    Varchar 50



    Course_detail
    培训描述
    Varchar 128




    技能表



    属性
    描述
    数据类型和长度
    是否允许空值




    Skill_id
    技能号
    Varchar 50



    Skill_name
    技能名
    Varchar 50



    Skill_detail
    技能描述
    Varchar 128




    工资表



    属性
    描述
    数据类型和长度
    是否允许空值




    Employee_id
    职工号
    Varchar 50



    Position_rank
    职位级别
    Int 4



    Base_salary
    基本工资
    Int 4



    Achievement
    业绩级别
    Varchar 50



    Bonus
    奖金
    Int 4




    考勤表



    属性
    描述
    数据类型和长度
    是否允许空值




    Employee_id
    职工号
    Varchar 50



    Late
    迟到次数
    Int 4



    Absence
    缺勤次数
    Int 4



    Fine
    罚款数额
    Int 4




    签到表



    属性
    描述
    数据类型和长度
    是否允许空值




    Employee_id
    职工号
    Varchar 50



    Year

    Varchar 50



    Month

    Varchar 50



    Day

    Varchar 50



    Time
    时间
    Varchar 50



    Late
    是否迟到
    Varchar 50




    4.2.2 从数据字典中抽取出来的联系的描述:


    实体
    多样性
    联系
    多样性
    实体




    员工
    m
    工作于
    1
    部门


    员工
    m
    属于
    1
    职位


    员工
    m
    选择
    n
    培训


    员工
    m
    拥有
    n
    技能


    部门
    1
    包含
    m
    职位



    4.3 关系表
    五、应用程序设计5.1 功能模块5.1.1 管理员
    登录系统
    查询员工基本信息、公司部门职位、员工技能培训、员工工资、签到考勤信息
    添加以上信息的新条目
    修改以上数据
    定时查询签到表并对员工迟到缺勤情况进行更新

    5.1.2 员工
    登录系统
    查询以上信息
    签到并查询签到和考勤情况
    根据职位级别赋予修改下级员工奖金的权限

    5.2 界面设计5.2.1 登录根据职位等级,管理员与用户账号进入的界面不同,操作权限也不同。

    若用户名或密码为空。

    若用户名不存在。

    若密码错误。

    5.2.2 用户界面填写上方条件进行查询。

    不填写条件则默认为查询整个表。


    只能修改下级员工的奖金。

    每天签到一次,第二次不再更新时间。

    5.2.3 2.管理员界面管理员可以添加修改信息。



    管理员定时进行员工迟到缺勤情况的考勤并罚款。

    六、总结6.1 经验体会本次课程设计使我深切体会到了知识面狭窄的弊端,痛心地吸取了教训。由于对网页程序的编写一窍不通,此前也没有学习过任何有关html、css等的相关知识,我对开发网页数据库界面的信心不足,导致我最终只编写出一个连接了数据库的Java程序,采用了Java自带的图形界面功能,既不美观也不方便用户使用,我对此感到十分惭愧难过。
    但在为期两周的设计过程中,我也学习到了不少技巧。例如,设计数据库应该实事求是,与时俱进,妄想一次性将理论设计完成、写完文档再去实现功能代码是不正确的,应该一边编写一边修改,逐渐将程序和文档都完善起来。但是一味地进行实践而不去分析理论也是不可行的,最基本的要做到按照老师给的设计提纲,先进行目标明确,任务分析,再是需求分析,ER图,关系表,然后才是数据库逻辑设计,数据库物理设计,最后是应用的实现与完善。把握好用户需求,并不断地修改完善,才能设计开发出优秀的软件。
    6.2 系统特色本程序基本实现了人力资源管理中所应用的大体功能。对于用户来说可以查询本公司各部门各职位各个职员的基本信息、工资情况、签到考勤等,上级职位等级还可以决定下级员工的奖金情况。对于管理员具有各种查询修改添加信息的权限,并进行签到考勤评测。
    主要倾向于统计和展示人力资源的基本信息,界面简洁清晰,操作简便明了。
    6.3 系统完善系统除了展示添加修改信息与签到考勤外没有其他的功能,用作公司的人力资源管理系统尚显不足。如果需要完善,应添加信息注销删除、工资发放、出差安排、职位部门调动、报表生成以及打印、权限管理及异常处理等功能。
    5 评论 195 下载 2018-11-26 21:51:22 下载需要5点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思PHP的网上商城

    第一章 需求分析1.1 引言伴随着Internet的蓬勃发展,网络购物中心作为电子商务的一种形式正以其高 效、低成本的优势,逐步成为新兴的经营模式和理念,人们已不再满足于信息浏览 和发布,而是渴望着能够充分享受网络所带来的更多的便利。的确,客户足不出户 便可以方便快捷的选购自己喜欢的商品,这正是网络购物中心为客户带来的好处。 网络商城将传统的商务流程电子化、数字化,一方面以电子流代替了实物流,可以大量减少人力、物力,降低了成本;另一方面突破了时间和空间的限制,使得 交易活动可以在任何时间、任何地点进行,从而大大提高了效率网络商城所具有的 开放性和全球性的特点,为企业创造了更多的贸易机会。网络商城使企业可以以相 近的成本进入全球电子化市场, 使得中小企业有可能拥有和大企业一样的信息资源, 提高了中小企业的竞争能力。网络商城重新定义了传统的流通模式,减少了中间环节,使得生产者和消费者的直接交易成为可能,从而在一定程度上改变了整个社会 经济运行的方式。网络商城一方面破除了时空的壁垒,另一方面又提供了丰富的信 息资源,为各种社会经济要素的重新组合提供了更多的可能,这将影响到社会的经 济布局和结构。 现在的购物商场成蓬勃向上发展的。
    1.2 需求分析一个网络购物系统,首先我们要保证客户能够很方便进行商品选择,系统应该具有分类选择商品功能,系统要实现购买功能。在系统的后台,管理员能够管理商品,商品分类,以及客户购买订单。 因此分析,本系统主要由前台和后台两部分组成,前台为客户端,顾客可以在此处购买商品,后台为商品管理端,实现对商品和订单的管理。
    第二章 系统分析2.1 开发环境根据用户的需求和实际的考察与分析,确定商城的开发环境,具体如下:

    服务器:从稳定性、广泛性及安全性方面综合考虑,采用市场主流的Web服务器软件Apache服务器
    数据库:采用最受欢迎的开源SQL数据库管理系统和被誉为PHP黄金搭档的MySQL
    开发框架:选用具有快速、兼容、开源、简单易学等特点的轻量级国产PHP开发框架—ThinkPHP

    2.4 系统运行环境该网上商城可运行在分辨率为1920×1080的chrome浏览器下。
    2.3 功能结构商城分为前台模块和后台模块。下面分别给出前、后台的功能结构图。


    2.4 目录结构目录结构即为think php 目录结构,再次不做介绍。
    第三章 数据库设计3.1 商品分类表(itcast_category)


    字段名
    数据类型
    描述




    cid
    Int unsigned
    主键ID,自动增长


    cname
    varchar(20)
    商品分类名称


    pcname
    varchar(20)
    父类分类名称



    3.2 商品表(itcast_goods)


    字段名
    数据类型
    描述




    gid
    varchar(255)
    主键ID,自动增长


    gname
    varchar(255)
    商品名称


    price
    int
    商品价格


    thumb
    varchar(255)
    商品图片路径


    status
    Enum(‘no’,’yes’)
    是否上下架,上架为yes,否则为no


    description
    text
    商品描述


    stock
    int
    商品库存


    cid
    Int unsigned
    商品分类ID


    sales
    int
    商品销量


    turn
    Int unique
    排序码,自动增长



    3.3 会员信息表(itcast_member)


    字段名
    数据类型
    描述




    mid
    Int unsigned
    主键ID,自动增长


    user
    varchar(20)
    会员昵称


    email
    varchar(30)
    会员电子邮件地址


    pwd
    char(32)
    会员登陆密码


    birthday
    date
    会员生日



    3.4 会员收货地址表(itcast_address)


    字段名
    数据类型
    描述




    aid
    Int unsigned
    主键ID,自动增长


    mid
    Int unsigned
    会员ID


    consignee
    varchar(20)
    收货人姓名


    phone
    varchar(11)
    电话号码


    postcode
    varchar(6)
    邮政编码


    address
    varchar(255)
    收货地址


    freight
    int
    运费



    3.5 购物车表(itcast_shopcart)


    字段名
    数据类型
    描述




    scid
    Int unsigned
    主键ID,自动增长


    mid
    Int unsigned
    会员ID


    addTime
    timestamp
    加入购物车时间


    gid
    varchar(255)
    商品ID


    num
    tinyint(3)
    商品数量



    3.6 购买记录表(itcast_record)


    字段名
    数据类型
    描述




    rid
    Int unsigned
    主键ID,自动增长


    mid
    Int unsigned
    会员ID


    time
    timestamp
    购买时间


    gid
    varchar(255)
    商品ID


    num
    tinyint(3)
    商品数量


    price
    Int unsigned
    商品单价



    3.7 折扣商品表(itcast_discountgoods)


    字段名
    数据类型
    描述




    dgid
    Int unsigned
    主键ID,自动增长


    gid
    varchar(255)
    商品ID


    discount
    int
    折扣



    第四章 具体功能实现4.1 前台具体功能4.1.1 公共部分

    显示登录后的用户昵称、退出登录
    分类搜索商品
    进入各个功能模块
    登录按钮
    登录后查看购买记录、进入购物车



    购物车简要信息:总价(折扣前)、数量
    商品分类,点击即可查看该分类下的商品



    显示当前销量最高的商品


    网站相关信息
    联系方式

    4.1.2 主页
    滚动广告


    推荐商品


    新品推荐

    4.1.3 商品列表页
    商品列表页
    例如,在任一页面的导航栏的搜索框中输入关键词——手机,选择“手机”分类,点击“搜索”按钮。

    之后就可进入商品列表页,该页面显示了所有在指定分类下与关键词相关的商品。

    此时可点击排序下拉菜单,对商品进行排序(默认按照新品排序),例如按照价格升序排列

    类似还可进行:“新品”、“价格降序”、“销量”方式排序。

    折扣商品列表页
    若点击导航栏的“特价优惠”链接,即进入折扣商品列表页

    4.1.4 商品详情页
    查看商品信息
    在任何页面的商品列表点击指定商品,即可查看该商品的详细信息。

    此时,点击“相关商品”按钮,可查看该与该商品相关的其他商品。
    有两种查看方式:



    加入购物车
    会员登录后,在详情页选择购买数量,点击“加入购物车”按钮即可将选择的商品加入购物车。
    4.1.5 会员注册、登录在任一页面的导航栏点击“登录”按钮,即可进入下图所示页面:

    左部为注册框,右部为登录框。

    注册
    在注册框中输入要创建账户的邮箱地址,点击“创建”按钮

    进入下图所示页面填写会员详细信息。

    点击“注册”按钮,即完成了会员注册操作。

    登录
    在登录页面填写正确的邮箱、密码和验证码,点击“登录”按钮即可成功登录。

    若验证码填写错误,页面将显示如下提示信息,并返回登录页面。
    若用户名或密码填写错误,页面将显示如下提示信息,并返回登录页面。
    4.1.6 购物车
    简介
    登录成功后即进入购物车页面(新用户购物车为空),用户可在该页面对加入购物车的商品进行购买。

    假设会员已将自己心仪的商品加入到购物车,购物车页面将自动计算总价。


    更改购物车商品
    此时,会员可通过点击每个商品的“+”、“-”按钮对该商品数量进行增加和减少操作。

    若会员不想购买某件商品,可点击“×”按钮从购物车中删除该商品。


    购买商品
    点击“购买”按钮即将购物车中的商品全部购买。

    4.1.7 购买记录点击上方导航栏的“购买记录”按钮或点击下方页脚的“购买记录”超链接

    即可进入购买记录页查看购买记录。

    4.2 后台具体功能4.2.1 登录页面在登录页面填写正确的用户名、密码和验证码,点击“登录”按钮即可成功登录。

    若验证码填写错误,页面将显示如下提示信息,并返回登录页面。
    若用户名或密码填写错误,页面将显示如下提示信息,并返回登录页面。
    4.2.2 公共部分
    显示标题
    显示管理员名称
    “前台首页”超链接
    “退出登录”按钮



    左部导航栏,点击链接可进入相对应模块
    4.2.3 首页欢迎页面,引导管理员进行操作。

    4.2.4 商品添加在左侧导航栏点击“商品添加”链接进入商品添加页面。
    依次按要求填写商品信息,上传图片。

    点击“确定”按钮,即完成商品添加操作。
    若商品编号重复,则不添加该商品,直接进入商品修改页修改该商品。

    4.2.5 商品查看、修改、删除
    查看
    在左侧导航栏点击“商品列表”链接进入商品列表页面。

    管理员可对指定分类下的商品进行排序(默认对所有商品按照新品排序),例如对“手机—手机”分类按照价格升序排序:


    修改
    点击“修改”可以对指定商品属性进行修改(商品编号不可修改)。


    删除
    点击“删除”

    点击“确定”

    可以看到商品列表中编号为“562390304003”的商品已经被删除。

    4.2.6 查看、添加、删除商品分类
    查看商品分类
    在左侧导航栏点击“商品分类”链接进入商品分类列表页面


    添加商品分类
    点击商品分类列表页的“添加分类”按钮,即可进入商品分类添加页面。例如,选择一级分类为“电脑/办公”,分类名称为“服务器”


    删除商品分类
    点击商品分类列表页每一个商品分类对应的的“删除”
    可以看到商品分类列表页中名为“服务器”的商品分类已经被删除。

    查看会员信息
    在左侧导航栏点击“会员管理”链接进入会员信息列表页面

    点击每个会员的“查看详情”操作,可以查看该会员的详细信息和购买记录

    第五章 总结与心得体会通过这次网上商城开发,让我清楚认识到软件工程的重要程度,软件项目涉及到以下阶段,即计划阶段、需求分析、软件设计、编码、测试阶段、运行维护等。经过一段时间的努力,我们终于完成了网上商城网站系统,基本实现了题目的基本要求。总的来说,在做这个毕业设计的过程中,我们查阅了大量关于网上销售的相关资料,切实地按照软件工程的步骤,从需求分析,概要设计,详细设计,数据库设计,再到编码,调试运行,测试等步骤。从中我学到了很多东西,对我们来说,无论是理论还是实践上都是一个较大幅度的提高,可以说是理论到实践的一个飞跃。我还了解了软件开发的大体过程,在当今竞争激烈的社会中只有学到本领才能有立足之地,通过这次综合实验也使我们知道做软件开发的辛苦,首先要有足够的耐心,要勇于面对密密麻麻的代码,无数遍的调试,和无数遍的修改,但是,当调试成功时,你就会感到这些努力的意义,成功的喜悦。软件开发,还要注意借鉴,查看已有的例子的代码,这样可以节省大量的时间,同时也实现了代码重用。此外,我知道了基础课的重要,要学好一门编程语言,一定要动手,实践是最好的方法!
    2 评论 44 下载 2019-05-23 17:50:58 下载需要13点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思C#和Sql Server的餐厅点餐系统

    1 需求分析1.1 信息要求目前大多数酒店由于规模的限制,忽略了点菜系统的重要性。点菜系统专为具有一定规模和经济条件的 大型酒店设计,通过集成从顾客定桌、点菜、上菜到结账等一系列功能,为每个环节明确分工,并通过可视 化的软件支持,有效减小人为差错的概率,代之以高效、便捷、准确的数字化服务系统,使酒店的管理更加 规范化。 因此该系统应当可以对餐桌信息、菜谱信息、职工信息以及顾客信息进行管理,同时点菜系统少不了订 单,因此也应该能对订单包括过去、现在、未来订单进行管理。
    1.2 处理要求系统应当允许对服务员信息、菜单信息、厨师信息、房间信息、餐桌信息的管理:

    查询、增、删、改及预定服务:顾客可以根据自己的需求,预定不同型号的房间或大厅,餐桌和时间就餐
    点菜功能:顾客可以自行点菜,也可以让管理员代为服务,点菜后能生成订单为对其进行后序的做菜上菜结账评价等服务
    厨师做菜服务:厨师会根据订单状态主动工作。厨师和菜分别分组,每组厨师和一组菜一一对应,该组 每位厨师会做该组所有的菜。厨师做菜管理:厨师可以获得自己的待做菜单,并对已做的菜进行标记
    结账、评价服务:审核菜单,协助顾客结账。结账完成后可以对订单进行评价,选出自己喜欢的菜。在查看自己个人信息时可以看到自己常点的菜。评价除了是对菜的评价,也是对做这道菜的厨师进行评价,方便日后拓展对厨师业绩进行考核的功能

    1.3 安全性与完整性要求顾客能对自己的信息进行编辑,不能对其他信息进行任何编辑。对于房间和餐桌信息也只能看到可用的 房间和餐桌。而且无法获取职工的信息包括其工作状态。同时顾客没有任何删除数据的权限,即使是自己的 数据也无法删除。管理员用于几乎对所有实体信息进行编辑,包括增、删、查、改。当然在操作前应当检查操作的数据是 否合法,例如增加顾客时,顾客联系方式应当是数字,且固话应当是 8 位或 12 位,手机应当是 11 位等。 这些理应属于数据库的用户定义完整性约束,但在此交由高级语言实现。 但是对于部分信息只能由系统产生和修改,例如订单号的生成是自动完成的,管理员也无法干预。顾客评价后系统会对相应的菜谱和厨师进行业绩属性的修改,这也是系统自动完成的。与订单相关的信息目前 只能由系统增加和更改其状态(是否上菜或结账),这部分信息为了保证完整新和安全性,是无法删除的。 再例如房间和餐桌的信息,房间中的餐桌数和使用情况也是有系统自动更新完成,为防止用户不当操作,不允许管理员直接对这部分信息进行修改。 数据库设计时应当考虑实体有实体完整性约束,实体之间联系产生的表具有参照完整新约束,对于部分 属性有根据语义定义的用户定义完整性约束。
    2 概念结构设计2.1 六个实体根据需求分析,本系统共有六个实体,即服务员,厨师,顾客,房间,餐桌,菜谱,他们的属性如
    2.3 中的 E-R 图所示2.2 实体之间的联系大部分联系是多对多的联系,如服务员服务顾客等;也有一对一联系,如一个顾客只能坐一张桌子;一 对多的联系主要体现在一个房间可以有多张餐桌。大部分联系是二元联系,而且会产生其他属性,如顾客和餐桌的联系会产生一个订单号。
    2.3 完整 E-R 图
    3 逻辑结构设计3.1 实体对应的关系模式
    Chref ( COid, COname, COsex, COjob, COifwork, CObethumbup )
    Waiter (Wid, Wname, Wsex, Wifwork )
    Desk ( Did, Droomid, Dpersoncount, Difuse )
    Room (Rid, Rname, Rdeskcount, Rpersoncount, Rusedesks )
    Customer ( Ctellphone, Cname, Csex, Ccometimes, Cregularfood1, Cregularfood2, Cregularfood3 )
    Menu ( Fid, Ftype, Fname, Fprice, Fcooktime, Fthumbup )

    3.2 联系对应的关系模式
    厨师工作记录:ChrefMenu (COid, Fid, Ordernum, Ifthumbup )
    订单记录:CustomerDesk ( Ctellphone, Did, Ordernum, Orderdate, Ifcheckout, Ordermoney)
    顾客点菜历史:CustomerMenu (Ctellphone, Fid, Lastordertime, Ordercount, Ifthumbup )
    上菜状态记录:DeskMenu (Did, Fid, Ordernum, Ifservedish )

    4 数据库实施4.1 数据库的创建4.1.1 表的创建其中包含了实体完整性,即主码必须唯一且不为空。默认违约处理是拒绝插入和修改。详细表的建立见 如下截图。


    4.1.2 用户定义完整性(CHECK)对于部分属性,其值有语义要求,因而需要定义 CHECK 约束,如顾客、职工的性别(只能是男或女), 职工的工作状态(只能是空闲或繁忙),上菜状态和订单结账(只能是是或否),部分截图如下:



    4.1.3 参照完整性参照完整性约束主要是外键的定义。在本系统中,除顾客表外其他表的顾客联系方式都是外键,被参照 关系是顾客表。除订单表外的订单号都是外键,被参照关系是订单表,厨师编号、菜编号、房间号同理,它 们对应的被参照关系是厨师表,菜谱表,房间表。下图是 sql server 中自动生成的数据库关系图,比较直观 地看到参照完整性情况。

    4.2 数据库的操作根据需求分析知道具体要对具体表的操作。
    4.2.1 增(插入,insert)顾客预订或点菜后,实际上是只要顾客选择好座位后会生成订单并插入到订单表中,对应的的插入语句 是:为了方便日后维护,参数化 sql 的语句的建立不用 string 类而是用 StringBuilder 类,该类在处理大量字 符串时效率低,但是应对 sql 语句这种不长的字符串不会对效率产生副作用,而且建立过程十分直观,方便日后维护。
    4.2.2 删(delete)删除操作顾客是没有的,只有管理员,而且仅仅限于对顾客信息,职工信息,餐桌信息,房间信息。其 他信息是无法删除的。由于考虑到参照完整性约束,这些删除操作都不是独立的,应当考虑到参照表。
    4.2.3 查(select)查询是最常见的数据库操作,本系统允许用户根据需求查询,例如点击某类菜的种类,就能看到该种类 下的菜谱,再例如点击对应的厨师,应当能显示该厨师的工作记录等。同时点菜时支持对菜名的模糊查询。
    4.2.4 改(update)管理员对数据的修改和删除一样限制在几个表中,顾客其实也可以间接修改数据,例如点赞某道菜的时 候实际上是在修改点赞情况。其他的修改操作均有系统自动完成,例如上菜状态更新,账单状态更新等,还有对顾客常点的菜的更新和厨师被点赞的次数都是系统完成。
    5 数据库运行和维护5.1 数据库与 C#的连接将连接字符串保存在配置文件中,调用时直接调用配置文件中的信息这样做的好处是程序移植时只需要修改配置文件中的连接字符串即可,不需要修改任何程序,同时也方便程序编写时的调用。连接字符串的修改也非常简单,可以有系统自动生成。

    连接字符串使用 C#提供的 SqlConnection 类,包含在命名空间 system.Data.SqlClient 中,调用构造函数时 需要传参,参数是连接字符串。
    5.2 高级语言 C#对数据库的操作引用较为典型的 ADO.NET 结构图,其中为了能尽可能的练习 sql 语句,本次实验没有用到 DataAdapter 下的 4 个 Command 对象,这些方法是系统根据用户直接在 DataAdapter 上的修改操作自动生成对应的 sql 语句去更新数据库,但仅限于当个表的数据。同时也没有使用右边的 DataSet 和 XML,因为 DataSet 是针对 需要连接外服务器数据库而设定的本地高速缓冲区,但实验所用的数据库是本地的,而且操作量不大, DataSet 本身也比较占用资源。

    5.3 防止非法数据插入数据库的提示这部分主要是通过 C#提供的 MessageBox 控件和下拉框完成。非法数据的来源主要是用户的不正当操 作,例如数据长度不正确,格式不正确等。下面展示在新增顾客时,顾客输入联系方式时意外输入非数字字 符的情况,这是通过 MessageBox 完成提示。以及新增餐桌时需要输入餐桌所在的房间,这是通过下拉框实 现。


    5.4 意外退出系统后重起系统的初始化操作由于厨师做菜等功能并非由数据库完成,而是存放在内存中,系统一旦退出数据无法存入到数据库(例如做菜剩余的时间)。如果再次进入系统时不对还没完成的订单进行检索,那么这些订单的没上的菜在系统 中将一直不会被厨师烹饪。因此进入系统后会先检索是否还有没上的菜,有的话会加入到做菜队列,并触发 厨师做菜的事件。核心代码如下:
    5.5 正常退出系统的数据库更新操作正常注销退出系统时,会对已完成订单和菜进行归总,更新厨师被点赞次数以及更新顾客常点的菜,保证数据的完整性。
    6 系统演示、使用手册6.1 开始界面开始界面有当前时间,欢迎词,还有使用者身份选择。进入管理员需要输入账号和密码。

    6.2 顾客界面6.2.1 添加顾客信息不需要注册,顾客只需要输入自己的信息,系统会自动检索数据库,如果没有则自动插入,有则把信息 查找出来并显示。信息包括姓名、联系方式、常点的菜。

    6.2.2 修改顾客信息点击修改信息,左边的框会可以以输入,修改完信息后点击确定即可。
    6.2.3 预定功能在菜单栏中选择“进入用户界面”

    在弹出的窗口中输入信息,点击“确定”

    选择“预定”

    填写预定信息,然后点击“预约”,即可完成预约

    6.2.4 就餐(选座,就餐)就餐步骤前两步同预约操作前两步,完成后进入如下页面





    6.3 管理员界面上面是菜单栏,点击对应的按钮会显示相应的界面,下面是状态栏,显示单位、时间以及作者。详细功 能见下面描述。

    6.4 房间和餐桌管理6.4.1 增加和修改房间信息

    若要修改房间信息,只需要选中要修改的房间,点击“修改房间信息”,然后修改房间名即可。
    6.4.2 增加餐桌进入“房间和餐桌信息”页面,在“当前房间的餐桌概况”中选择“添加餐桌”,录入餐桌信息后,点 击“确定”,即可完成操作

    6.4.3 删除房间和餐桌
    6.5 职工管理6.5.1 界面介绍职工管理界面分为三部分:服务员信息,厨师基本信息,做菜历史。“服务员信息”栏和“厨师基本信息”栏都提供三种功能:雇佣、解雇、编辑功能。管理员可以雇佣和解雇员工,或者修改员工的信息。“做 菜历史”栏可以查看厨师的做菜信息,查看该厨师做的菜是否被点赞。

    6.5.2 对职工信息的操作(增、删、改)以添加厨师信息为例:点击“雇佣”,在弹窗输入员工信息,点击添加,即可完成操作。删除操作只需 要选中要删除的员工,点击解雇,即可删除。编辑操作只需选中要修改信息的员工,点击修改,填写新的信息,即可完成 。

    6.6 订单管理6.6.1 界面介绍当在用户界面内,完成前面的操做提交订单之后,即可点击“订单管理”进入订单管理页面对订单进行 管理。如下图所示:在“当前订单”页面我们可以看到当前正在处理的订单,点击正在处理的订单,我们可 以在右侧查看该订单内所点的菜是否已经全部上菜。若菜已经全部显示“是”则表示菜已全部上齐,则顾客结账时可以点击结账按钮,进行结账。除此之外我们同样可以在订单管理页面对历史订单进行查看(该部分 在下面会单独介绍)。

    6.6.2 查看历史订单在订单管理中我们同样可以查看历史订单的情况,方便餐厅管理人员对老顾客所喜爱的菜色进行统计, 以达到可以为用户推荐菜色的功能。在“历史订单”窗口中我们可以对历史订单进行点击查看历史订单中所 包含的菜的种类以及菜的价格。在历史订单中我们可以对日期进行选择查看具体某一天之前的订单,当取 消对该项的选择时,则表示只查看当天的订单情况。

    6.6.3 点菜功能订单管理页面中同样存在点菜的选项,该选项是为了给使用预约功能的顾客点菜所使用的。当根据订单 号查询到该预约信息时,我们可以点击点菜,为该订单进行点菜。

    6.6.4 结账功能当订单中的菜,全部上完后。点击结账(如下图:)会弹出下图左侧的页面,方便用户对订单中的菜进行核对,以及对价格存在问题的菜进行查看,确定所应付款金额。

    6.6.5 点评功能
    6.7 顾客管理6.7.1 界面介绍在主页面中点击“顾客管理”页面可以对顾客的信息进行操作和分析。顾客管理页面由所有顾客信息, 当前顾客信息,顾客的光顾记录,和点菜历史四部分组成。通过这四部分我们可以完成对所有顾客的信息和订单进行管理。各部分具体的功能在下面会有具体的介绍:

    6.7.2 对顾客信息的操作(增、删、改)在所有顾客信息部分我们可以对顾客的信息进行增加、删除、和修改的操作。下面,我们以删除顾客信 息的操作进行详细讲解。在所有顾客信息窗口中点击要删除的用户,就可以在当前顾客信息中看到顾客的 具体信息,此时,点击删除顾客信息,就会弹出操作确认的信息窗口,避免使用者错误操作,造成用户信息 的丢失。若该操作无误,则点击确认即可删除当前所选的顾客的信息;点击顾客之后即可在当前顾客信息处 完成对顾客信息的修改;点击新增顾客后输入当前顾客信息即可完成新增顾客的操作。

    6.7.3 光顾功能选中顾客信息后,点击光顾即可为顾客添加新的订单。在当前顾客信息下面点击光顾按键,则会弹出房间和餐桌信息界面,此界面下的操作和介绍我们在之前都有介绍,在此处就不再赘述。

    6.7.4 光顾历史记录在所有顾客信息部分,点击某个顾客。在光顾记录部分会显示该顾客在本餐厅的所有的订单情况。以及 该顾客的所有点菜历史,其中包括每种菜被点的次数和该顾客对这种菜的评价信息。该部分主要被用于数 据库有用信息的挖掘,了解顾客对每种菜的喜爱程度,从而做到为顾客推荐本店所添加的新的菜色,以及对餐厅未来菜色的发展策略提供理论依据。

    6.8 菜谱管理6.8.1 界面介绍菜谱管理主要是为了完成对餐厅菜谱的菜进行增加、删除、和修改而创建的,该页面除了完成最初设立 的功能外,还可以根据不同菜的具体信息对菜进行查找。同时还可以查询点过这道菜的顾客都有哪些。最主要的是该也也可以调用已有的用户信息为用户点菜提供便利。

    6.8.2 对菜谱的基本操作(增、删、改)在菜谱中点击一种菜之后点击修改,会弹出图中所示的窗口,使用者只要输入所要修改的信息之后,再 次点击修改菜谱窗口中的修改,即可确认对菜的信息进行修改,此时菜谱中就会显示修改后的信息。点击添 加按键,录入菜的信息后再次确认即可完成对菜的添加;对菜的删除,选中一种菜后点击删除再次确认即可 完成对菜的删除。

    6.8.3 快速查找和模糊查找快速查找和模糊查找,是为了避免客户点菜时总是要翻阅全部菜单浪费时间而设计的。因为快速查找只 要输入菜的名字就可以对菜进行定位比较简单,所以这里我们对它不再做过多的介绍;模糊查找用户只要 输入部分信息,系统既可以对数据库进行访问,然后返回能够匹配到用户输入的关键字的菜。

    6.8.4 快速下单快速下单是为了方便用户的点菜而设计的。只要在菜谱管理页面,点击“点菜”,即可选择数据库中已 有的顾客,为他选择餐桌。在该页面直接就可以为顾客点菜。因为具体点菜操作在前面我们都已经详细介绍 过了,在这里我们就不再对其进行赘述。
    7 体会一开始走入了一个误区,那就是为了省空间而尽量少的建立表,其实这是一个极端。举个例子,当时我 一致认为顾客的订单中的菜可以通过视图来查看,因为视图在数据库中属于外模式,不会占用磁盘存储空 间,而且能用有效地限制用户的权限,而视图名就是订单号,这样通过订单号就能对订单进行操作。实际上 这个想法是不好的,因为订单承载了很多信息,从系统可拓展性来说,这是不利的,而且实际上对视图的操 作不仅仅会限制用户的操作,也会限制自身编程的操作。因此我们前后期大部分修改了我们的需求分析和 概念结构设计。
    对于数据库的建立,我深深地每个表建立一个唯一的 id 标识是很重要的,这个 id 标识是主属性。即使 实体中原本的属性就有能唯一标识元组的属性,但也不应该直接设置为主码,而应该再设置一个 id,使用关 系数据库自身提供的自增长类型即可,这样无论什么用户都不能对这个 id 修改,插入元组时数据库会自动 生成。这样做的好处是因为主码的值是可能修改的,例如顾客的联系方式,没有 id 的话不利于参照完整性 的实现,尤其是修改操作。
    本次实验的核心工作是高级语言 C#编码与数据库的连接,之前没接触过 C#,纯属是现学现用,感觉学 到了很多,也提高了自己的自学能力。同时让我基本入门了一门语言,C#真是一门有趣的高级语言。也就是 在编程的时候和书上所学的知识结合起来,才进一步领略到数据库的重要性和数据库的应用,以及进一步 理解书上的知识,例如游标的概念,其实和高级语言中的流是一个道理的,这种东西在使用时有一定的规则 需要注意,例如不能两个同一对象流一起使用等。实验使我对高级语言的编写和调试以及一个项目的过程,
    数据库的设计都有了进一步的掌握。实际应用中的数据库设计会比我们课程设计要复杂得多,这次实验也 让我们对流程有所了解,方便日后的深入学习。 在实际编程时候,sql 语句往往是动态的,需要根据动态参数设定,这当中最容易出错的是字符串,由 于 sql sever 查询语句中的字符串时用单引号的,但是高级语言一般都是双引号的,这方面容易出错。在者 就是再编辑 sql 语句的时候容易把单引号漏掉,导致数据库操作异常。该问题本质上还是 sql 语句的练习不 够多而造成的,因此平常要注意多加练习。 当然我也认识到我们的系统还是有很多不足,除了数据库设计上的不足外,还有系统本身功能的不足, 例如顾客如果订很多张餐桌的话,每个单子的菜必须一致,且确定订单和结账都要操作多次,不利于用户体 验,再者不能重复点菜。各个表的主码中,只有订单号是系统自动生成,其他均由顾客自己输入,不利于管理。许多过程不可逆,例如无法没有取消订单功能等。还有很多细节上的还有缺陷,日后应当多加学习。
    5 评论 91 下载 2019-03-12 11:55:16 下载需要14点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思JAVA实现的农夫过河问题

    1 题目要求一个农夫带着一只狼,一只羊和一个白菜,身处河的两岸。他要把这些东西全部运到北岸。他面前只有一条小船,船只能容下他和一件物品,另外只有农夫才能撑船。如果农夫在场,则狼不能吃羊,羊不能吃白菜,否则狼会吃羊,羊会吃白菜,所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开。请求出农夫将所有的定西运过来的方案。
    最终的状态表描述出来就可以了。
    测试与运行
    使用状态表,程序应在屏幕上得到如下表所示的结果。

    2 设计思路利用九个硬币的原理,设计农夫过河问题
    类图

    3 测试
    测试环境

    Windows10JDK1.8IDEA2017.2
    测试结果

    1 评论 17 下载 2018-12-06 14:53:35 下载需要6点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思C#实现的电影院售票管理系统

    一、引言1.1选题背景随着互联网和电子商务的快速发展,网上购物已经成了现代人生活中很重要的一种方式,如:数码产品、生活用品、化妆品护肤品等,只要是人们需要到的东西,基本都可以在网上购买。除了购买各种物品,现代人的生活也不再向过去一样单调,除了学习和工作之余,人们的娱乐生活也逐渐丰富,最普遍的娱乐休闲方式之一就是到电影院看电影,那么传统的电影订票窗口显然已经不能满足人们的需要了,所以开发一个电影院网上订票系统是非常必要和可行的。以前传统的电影票订票方法是去电影院的购票窗口查看电影的上映时间、场次、可选座位等信息再进行购票,人们往往需要排队才能买到电影票,这样不仅浪费了人们宝贵的时间,而且电影院工作人员的工作量也很大,对于这种低效率、浪费时间的事情,完全可以以网上购票的方式来改变。
    为了提高劳动的效率、节约成本、提高服务质量,我们小组开发了此款系统,用以方便影院的售票和客户的购买,通过这个系统,可以很快的实现会员注册、登录、购票,后台管理员可以新增影片、排片等基本操作。
    二、需求分析2.1 用户需求需要在网上购买电影票的用户可使用本系统,进行会员的注册登陆之后可以进行网上查询电影、购买电影票等操作,省去了去电影院实体窗口排队买票的繁 琐程序。
    2.2 系统功能分析
    新用户的注册、登录,用户数据能存在后台数据库中
    电影的录入、删除、查询、修改
    电影的排片
    管理员查询会员级别等信息
    会员查询影片信息
    会员购买电影票

    2.3 条件与限制系统可以实现一些基本的购票功能,但系统较简单,尚存在很多缺陷,不能实现完善和全面的功能。
    缺陷:

    首先要使用admin进行登录才能开始注册会员
    购票后无法查看购票信息
    不可以支持选座
    购票时不能通过搜索影片名字等来查找影片

    三、模块设计3.1 系统流程图系统流程图如图一所示:

    系统功能图如图二所示:

    3.2 系统使用指南对于用户
    首先,系统使用者先通过admin登录,进入到新用户注册页面,以管理员的身份为用户注册一个新的会员账号,已注册好的账号密码自动保存在后台数据库中,用户下次可以直接使用已注册的会员账号登录本系统进行电影的查询、购票等操作。
    对于管理员
    首先,管理员可以为新用户注册不同级别的会员账号、查看会员的信息。其次,管理员可在系统后台做电影的录入、删除、查询、修改等基本操作,除此之外,添加好影片后可以对电影进行的排片。
    四、数据库设计及实现4.1 系统E-R图E-R图如图三所示:

    4.2 逻辑结构设计(关系数据库设计)
    顾客(Cus、CusCard、CusType、CusTel(key))
    登陆(UserName、UsePwd、UserType)
    电影(Mname(key)、MBZ、MLanguage、MTYPE、MDirector、MACT、MTime)
    排片(MName(key)、MPrice、MRoom、Mcount、MTime、MBRQ、MERQ)
    上映(ID(key)、MName、MPrice、MRoom、MCount、MTime、MRQ)
    购票(PID(key)、Cname、GPCount、GPJE、MName、SYRQ、FYT、GPRQ、CZY)

    4.3 数据库主要代码及触发器会员信息
    CREATE TABLE [dbo].[Cus]( [CusTel] VARCHAR(50) NOT NULL PRIMARY KEY, [CusName] VARCHAR(50) NOT NULL, [CusCard] VARCHAR(50) NULL, [CusType] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[InsertULogin] on [dbo].[Cus]after insertasdeclare @username varchar(50)declare @userpwd varchar(50)select @username=CusTel from inserted select @userpwd= right(CusCard,6) from inserted insert into ULogin values(@username,@userpwd,'C')
    购票信息
    CREATE TABLE [dbo].[GP]( [PID] VARCHAR(50) NOT NULL PRIMARY KEY, [CName] VARCHAR(50) NOT NULL, [GPCount] INT NULL, [GPJE] FLOAT NULL, [MName] VARCHAR(50) NULL, [SYRQ] VARCHAR(50) NULL, [GPRQ] VARCHAR(50) NULL, [CZY] VARCHAR(50) NULL, [FYT] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[UpdatePP] on [dbo].[GP]after insertasdeclare @MName varchar(50)declare @SYRQ varchar(50)declare @count intselect @MName= MName,@SYRQ=SYRQ,@count=GPCount from inserted update MovieSY set mcount=mcount-@count where MName=@MName and MRQ=@SYRQ
    电影信息
    CREATE TABLE [dbo].[Movie]( [MName] VARCHAR(50) NOT NULL PRIMARY KEY, [MLanguage] VARCHAR(50) NOT NULL, [MDirector] VARCHAR(50) NULL, [MAct] VARCHAR(50) NULL, [MName] INT NULL, [MBZ] VARCHAR(255) NULL, [MType] VARCHAR(50) NULL)
    上映信息
    CREATE TABLE [dbo].[MovieSY]( [ID] INT NOT NULL PRIMARY KEY, [MName] VARCHAR(50) NOT NULL, [MRoom] INT NULL, [MCount] varchar(50) NULL, [MName] INT NULL, [MTime] VARCHAR(50) NULL, [MRQ] VARCHAR(50) NULL)
    排片信息
    CREATE TABLE [dbo].[PP]( [MName] VARCHAR(50) NOT NULL PRIMARY KEY, [MPrice] INT NOT NULL, [MRoom] VARCHAR(50) NULL, [MCount] INT NULL, [MTime] VARCHAR(50) NULL, [MBRQ] VARCHAR(50) NULL, [MERQ] VARCHAR(50) NULL)
    触发器
    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER TRIGGER [dbo].[InsertPP] on [dbo].[PP]after insertasdeclare @MName varchar(50)declare @BRQ varchar(50)declare @ERQ varchar(50)declare @MTime varchar(50)declare @MRoom varchar(50)declare @MPrice intdeclare @MCount intdeclare @MBRQ datetimedeclare @MERQ datetimedeclare @RQ varchar(50)select @MName= MName,@BRQ=MBRQ,@ERQ=MERQ,@MTime=MTime,@MRoom=MRoom,@MPrice=MPrice, @MCount=MCount from inserted set @MBRQ=CONVERT (datetime,@BRQ)set @MERQ=CONVERT (datetime,@ERQ)while @MBRQ<=@MERQbegin set @rq=CONVERT(varchar(50), @MBRQ, 112)insert into MovieSY values(@MName,@MPrice,@MRoom,@MCount,@MTime,@RQ) set @MBRQ=DATEADD(DAY,1,@MBRQ)endCREATE TABLE [dbo].[MovieSY]( [UserName] VARCHAR(50) NOT NULL PRIMARY KEY, [UserPwd] VARCHAR(50) NOT NULL, [UserType] VARCHAR(50) NULL)
    五、系统设计与实现5.1系统开发环境
    硬件环境

    Intel Pentium 166MHz或以上;内存:需要至少512MHZ;
    软件环境

    运行于Windows2010版的操作系统之上;SQL Server2008数据库;Visual Studio2013;

    5.2 功能模块
    输入功能模块
    查询显示功能模块
    查询、售票功能模块
    登录、注册功能模块

    5.3 系统主要页面展示登录、注册页面

    登陆后的页面

    会员注册页面

    会员信息查询页面

    添加影片页面

    查询修改影片页面

    排片页面

    “排片”页面通过连接数据库,可以搜索影片的名字、导演、主演来选择影片,再输入票价,放映大厅,座位数,放映时间等信息,最后确认排片。
    购票页面

    购票页面通过对获得的已经被排片的电影进行选择而进行购票这一操作。在购票前需填入购票数量、联系电话,系统会自动计算合计金额。之后点击购票按钮则能进行购票操作。但一旦购票成功则不能进行退票操作,也不能查看所购买的电影票。
    数据库页面

    六、主要特色6.1 系统实用性系统首先可以进行新用户的注册,用户数据能存在后台数据库中。管理员可以进行电影的录入、删除、查询、修改,添加好影片后进行电影的排片。退出登录后再使用之前注册的会员登录,可以购买电影票。
    6.2 突出优势和特色(创新点)
    购票时可以看到影片的导演、主演等信息
    用户分为钻石用户,白金用户和普通用户,对用户进行了分类

    7 小结数据库技术课程设计是一次对课堂所学知识的灵活应用,是理论知识与实践的相结合。经过了一周的课程设计,本系统基本达到了当初的设计要求,设计上也基本合理。我们不仅对数据库系统的认识更加深入,同时也掌握了面向实体的系统分析的基本方法,对VS也有了新的认识,也知道了要有坚持不懈,不惧困难的精神,才能取得成功。一个简单的系统,每一个细节都需要在实践中去挖掘并进行进一步的修改完善。本次课设让我们受益匪浅,在分析问题以及解决问题等方面的能力有所提高,也是一次很好的同学之间交流合作的机会。数据库技术的用途很广,还有很多值得我们学习,希望今后能有更多这样的机会。
    10 评论 105 下载 2019-01-01 18:20:12 下载需要18点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思JSP和MYSQL的学生选课管理系统

    第一阶段:开发前的设置和思考1.1 题目要求建立一个学生选课系统, 编写应用程序完成系统开发。
    1.1.1 建立基本表
    学生(学号,姓名,性别,年龄,系别)
    课程(课程号,课程名,开课系,任课教师)
    学习(学号,课程号,成绩)

    1.1.2 要求有以下子系统
    基本信息查询子系统:能够显示出学生表、课程表、带参数学生详细信息和选课情况
    学生、课程信息维护子系统:能够维护学生表和课程表
    学生选课子系统:考虑参照完整性以及用户自定义完整性,实现学生选课功能
    系统维护

    1.2 需求分析根据描述,这个系统不仅是选课系统,而是有其他教务管理和信息查询和维护的教务管理系统,选课系统只是这个教务管理系统的一个子系统。
    使用教务管理系统的用户有三种,一种是学生,一种是任课教师,另外一种损失教务处的老师,可以认为是管理员,所以可以将用户也分为这三种,不同的用户登录到这个系统中要有不同的界面,不同的功能。
    学生登录后有相关的信息查询和部分信息修改的权限,信息查询包括查询自己的个人信息,(自己的学号,班级,专业,籍贯,政治面貌,邮箱,联系方式等)选课信息(选了哪些课,课程表查看,每门课上课的时间,地点,任课教师,教学周起始等),成绩信息(查看自己的成绩信息,包括课程名称,分数,哪一个学期选修的这门课,任课教师等)。修改权限包括学生部分个人信息的修改(比如学生的联系电话,qq和微信,家庭住址,政治面貌等),在选课阶段修改自己的所选课程信息(在选课阶段,自由的增加选课和取消选课),修改自己的登录密码等。另外,仿照现有教务管理系统,增加私信老师的功能,使得学生可以向老师提交反馈,老师可以根据反馈进行相应的操作,学生可以不用打电话或者到教务处办公室寻求帮助。
    任课教师登录后功能和学生不同,任课教师可以查看自己现在这个学期教授哪些课程,可以查看这门课的详细教学安排时间表,这门课的上课地点等信息,可以查看选修了这门课的所有学生的信息(教务相关等基本信息,其他私人信息不会看到,另外,只有选修了自己所教授课程的学生的信息老师才可以查看,其他学生的不可以),查看自己的个人信息,和学生一样。任课教师可以修改自己部分的个人信息,修改自己的登录密码,在一个时间范围内给选修了自己课程的学生进行评分以及修改分数等操作,另外,任课教师还可以申请新开一门课程,在得到教务处的允许后方可成为正式的课程。
    教务处教师登录后的功能比较多,可以审核通过任课教师提出的新课的审核,可以发布系统公告,查看学生的求助并作出相应的处理,可以进行课程的安排,可以创建每个专业的选课清单,可以对每个选课清单进行控制(停止选课和开始选课等),可以添加新的教职工信息和学生信息。
    所有的信息查看功能都有搜索功能,可以在信息比较多的情况下根据用户输入的学号,工号,专业,以及状态等进行结果的缩减,达到快速检索到信息的目的,支持模糊搜索。
    1.3 概念结构设计系统的ER图如下:

    1.4 逻辑结构设计1.4.1 实体(加粗表示主键)
    学生(学号,姓名,性别,学院,专业,班级,状态等)
    教师(工号,姓名,性别,学院,职称,地址,电话,类别等)
    管理员(工号,姓名,性别,学院,职称,地址,电话,类别等)
    课程(课程号,课程名称,开课学院,先修课程号,开课学院,简介,状态)

    1.4.2 联系(加粗表示主键)
    选修(学期,学号,课程号,成绩)
    教授(学期,工号,课程号,教学开始周,教学结束周,教学班容量,教室地址,状态)
    求助(消息id,学号,发送时间,标题,内容,状态)
    安排(学期,工号,课程号,教学开始周,教学结束周,教学班容量,教室地址,状态)

    1.5 数据库物理结构设计数据库名称为DB,数据表数量为11个。

    1.5.1 学生表
    1.5.2 教师表
    1.5.3 管理员(根据逻辑结构设计部分发现,教师和管理员其实可以合并)
    1.5.4 课程表
    1.5.5 选课表
    1.5.6 课程安排表
    1.5.7 教师授课表(研究发现,可以和安排表合并)
    1.5.8 课程时间表
    1.5.9 学期表
    1.5.10 消息表
    1.5.11 公告表
    1.5.12 选课清单表
    1.5.13 用户登录信息表
    第二阶段:开发编码调试工作2.1 开发环境相关
    开发后台服务语言:Java 版本1.8
    服务器: Tomcat 版本 9.0.14
    数据库:MySql 5.7
    操作系统:Windows10
    开发工具:Jetbrains Intelij IDEA

    2.2 开发所用技术
    Web前端:HTML,CSS,JavaScript,Jquery,Bootstrap
    Web后端:原生Java Web,Servlet,JDBC,JSTL,数据库连接池DHCP,JSP

    2.3 源代码目录简介
    .idea:IDEA编译器的配置文件,系统默认生成,无序关心
    lib和libs:自己下载的驱动包和第三方jar包,包括数据库驱动和jstl
    out:字节码文件,为Java虚拟机实际运行的文件,编译之后生成,无需关心
    sql:数据库备份文件,完整的数据表结构和部分数据
    src:Java代码编写处

    DB:存放有关数据库操作的类model:存放数据表结构相关的Java bean类servlet:存放业务逻辑处理的servlet类
    web:存放静态资源和网页模板的类

    app:放所有的jsp网页模板css:放所有的层叠样式表文件js:放所有的JavaScript脚本文件WEB-INF:系统自动生成 ,无需关心,是网站的配置信息文件


    2.4 项目典型代码讲解2.4.1 数据库连接工具类:DBpackage DB;import java.sql.*;public class DB { //初始化连接参数; public static String url="jdbc:mysql://localhost:3306/db?serverTimezone=UTC&useSSL=false&characterEncoding=utf8"; public static String user="root"; public static String password="root"; //初始化驱动加载: static{ try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() { try { Connection connection=DriverManager.getConnection(url,user,password); return connection; } catch (SQLException e) { e.printStackTrace(); } return null; } public static void close(Connection connection,Statement st,ResultSet rs) { try { connection.close(); st.close(); rs.close(); } catch(Exception e) { e.printStackTrace(); } } public static void close(Connection connection,PreparedStatement st) { try { connection.close(); st.close(); } catch(Exception e) { e.printStackTrace(); } } public static void close(Statement st) { try { st.close(); } catch(Exception e) { e.printStackTrace(); } } public static void close(Connection connection) { try { connection.close(); } catch(Exception e) { e.printStackTrace(); } } public static void close(ResultSet resultSet) { try { resultSet.close(); } catch(Exception e) { e.printStackTrace(); } }}
    以上类用于数据库的连接,获取连接对象,然后还有关闭连接的函数,对关闭连接的函数进行了重载,可以关闭连接对象,语句对象,结果集对象的任何一个子集组合,完善的异常处理机制,可以简化其他用到数据库连接的地方,减少代码量。
    2.4.2 登录Servletpackage servlets.publicfun;import DB.SemesterDB;import DB.StudentDB;import DB.TeacherDB;import DB.UserDB;import model.Student;import model.Teacher;import model.User;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.io.PrintWriter;import java.sql.SQLException;@WebServlet("/LoginServlet")public class LoginServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String account=request.getParameter("account"); String password=request.getParameter("password"); String type=request.getParameter("type"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html"); if(account==""||password=="") { PrintWriter printWriter=response.getWriter(); printWriter.println("您的用户名或者密码为空,请重新登陆"); printWriter.flush(); printWriter.close(); } else { UserDB userDB=new UserDB(); User user=userDB.login(account,password,type); if(user==null) { PrintWriter printWriter=response.getWriter(); printWriter.print("<script type='text/javascript'>alert('用户名或者密码错误!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>"); printWriter.flush(); printWriter.close(); } if(type.equals("student".toString())) { //查询学生表详细信息,并设置session StudentDB studentDB=new StudentDB(); Student student=studentDB.getInfo(user.getAccount()); if(student==null) { PrintWriter printWriter=response.getWriter(); printWriter.print("<script type='text/javascript'>alert('没有您的登录信息,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>"); printWriter.flush(); printWriter.close(); } else { SemesterDB semesterDB=new SemesterDB(); String semester=null; try { semester=semesterDB.getCurrentSemester(); } catch (SQLException e) { e.printStackTrace(); } if(semester==null) { PrintWriter printWriter=response.getWriter(); printWriter.print("<script type='text/javascript'>alert('学期列表出现错误,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>"); printWriter.flush(); printWriter.close(); response.setStatus(500); } HttpSession session = request.getSession(); session.setAttribute("userinfo", student); session.setAttribute("type","student"); session.setAttribute("semester",semester); //重定向到另外一个servlet response.setStatus(302); response.sendRedirect("content"); } } else if(type.equals("teacher")) { //查询教师表详细信息,并设置session TeacherDB teacherDB=new TeacherDB(); Teacher teacher=teacherDB.getInfo(user.getAccount()); if(teacher==null) { PrintWriter printWriter=response.getWriter(); printWriter.print("<script type='text/javascript'>alert('没有您的登录信息,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>"); printWriter.flush(); printWriter.close(); } else { SemesterDB semesterDB=new SemesterDB(); String semester=null; try { semester=semesterDB.getCurrentSemester(); } catch (SQLException e) { e.printStackTrace(); } if(semester==null) { PrintWriter printWriter=response.getWriter(); printWriter.print("<script type='text/javascript'>alert('学期列表出现错误,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>"); printWriter.flush(); printWriter.close(); response.setStatus(500); } HttpSession session = request.getSession(); session.setAttribute("userinfo", teacher); session.setAttribute("type","teacher"); session.setAttribute("semester",semester); response.setStatus(302); response.sendRedirect("content"); } } else if(type.equals("root")) { TeacherDB teacherDB = new TeacherDB(); Teacher teacher = teacherDB.getInfo(user.getAccount()); if (teacher == null) { PrintWriter printWriter = response.getWriter(); printWriter.print("<script type='text/javascript'>alert('没有您的登录信息,请联系管理员!');window.location.href='" + request.getContextPath() + "/index.jsp'</script>"); printWriter.flush(); printWriter.close(); } else { //设置管理员身份标识 teacher.setType("root"); //设置管理员登录标识 SemesterDB semesterDB=new SemesterDB(); String semester=null; try { semester=semesterDB.getCurrentSemester(); } catch (SQLException e) { e.printStackTrace(); } if(semester==null) { PrintWriter printWriter=response.getWriter(); printWriter.print("<script type='text/javascript'>alert('学期列表出现错误,请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp'</script>"); printWriter.flush(); printWriter.close(); response.setStatus(500); } HttpSession session = request.getSession(); session.setAttribute("userinfo", teacher); session.setAttribute("type","root"); session.setAttribute("semester",semester); //重定向到另外一个servlet response.setStatus(302); response.sendRedirect("content"); } } } }}
    这里登录只是验证一下是不是用户名和密码都正确,同时保存用户登录的信息到session中,设置登录状态的标志,以后的所有界面如果没有session的话都会自动跳转到登录界面,保证了只有是系统已经登录成功的用户才可以进行相关的查询和修改操作。
    2.4.3 首页初始化Servlet因为所有首页登录进去之后都有一些数据是在数据库中取到的,所以要在加载页面之前从数据库中取出数据加到request域中,让前端可以访问并显示这些数据。因为教师,学生,管理员的首页界面不同,所以需要进行判断身份,然后连接不同的数据库,发送不同的信息到前端。
    package servlets;import DB.*;import model.*;import view.Course_select;import view.Course_teach;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.io.PrintWriter;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;@WebServlet("/content")public class content extends HttpServlet { protected void doPost(HttpServletRequest request, ttpServletResponse response) throws ServletException, IOException { HttpSession session=request.getSession(); try { String type = (String) session.getAttribute("type"); if (type.equals("root")) { MessageDB messageDB = new MessageDB(); List<Message> result = messageDB.getAllUncomplete(); CourseDB courseDB = new CourseDB(); List<Course> courseapp = courseDB.getAllUncompleCourse(); request.setAttribute("helpList", result); request.setAttribute("newcourse", courseapp); request.getRequestDispatcher("app/content.jsp").forward(request, response); } else if (type.equals("student")) { Student student =(Student) session.getAttribute("userinfo"); String sno=student.getSno(); String semester=(String) session.getAttribute("semester"); if(semester==null) { response.setStatus(500); PrintWriter printWriter =response.getWriter(); printWriter.print("<script>alert('学期表出现错误!请联系管理员!');window.location.href='"+request.getContextPath()+"/index.jsp';</script>"); printWriter.flush(); printWriter.close(); } NoticeDB noticeDB = new NoticeDB(); StudyCourseDB studyCourseDB=new StudyCourseDB(); try { List<Notice> result = noticeDB.getNotice(); List<Course\_select> course\_table=studyCourseDB.getCourseTableList(sno,semester); List<StudyCourse> gradelist=studyCourseDB.getGradeList(sno,semester); request.setAttribute("noticelist", result); request.setAttribute("course\_table\_list",course_table); request.setAttribute("grade_list",gradelist); request.getRequestDispatcher("app/content.jsp").forward(request, response); } catch (SQLException e) { e.printStackTrace(); } } else if (type.equals("teacher")) { String semester=(String) session.getAttribute("semester"); Teacher teacher=(Teacher) session.getAttribute("userinfo"); String tno=teacher.getTno(); NoticeDB noticeDB = new NoticeDB(); Course\_teacheDB db=new Course\_teacheDB(); ArrayList<Course\_teach> teach\_list=db.getTeachList(semester,tno); List<Notice> result = noticeDB.getNotice(); request.setAttribute("noticelist", result); request.setAttribute("teachlist",teach_list); request.getRequestDispatcher("app/content.jsp").forward(request, response); } } catch (Exception e) { PrintWriter printWriter=response.getWriter(); printWriter.println("<script>window.location.href='"+request.getContextPath()+"'</script>"); printWriter.flush(); printWriter.close(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }}
    第三阶段:系统演示和说明3.1 用户登录
    3.2 学生相关3.2.1 学生首页
    3.2.2 修改密码
    3.2.3 选课

    3.2.4 查看课表
    3.2.5 查看个人信息
    3.2.6 联系老师
    3.2.7 成绩查询
    3.3 教师相关3.3.1 教师首页
    3.3.2 个人信息维护(同学生版页面)
    3.3.3 修改密码(同学生版页面)
    3.3.4 申请新课
    3.3.5 课程评分和修改

    3.3.6 查看公告
    3.3.7 查看学生信息(需要选课之后才可以看)
    3.3.8 授课查看

    3.4 管理员相关3.4.1 管理员首页
    3.4.2 安排课程
    3.4.3 添加人员
    3.4.4 运行控制
    3.4.5 创建选课清单
    3.4.6 新课审核
    3.4.7 学生求助信息
    3.4.8 发布公告
    3.4.9 课程信息
    第四阶段:总结与反思通过学习数据库原理这门课,我学到的不仅仅是技术方面的东西,更加重要的是学会了如何去进行需求分析,对系统开发有了一个清晰的认识,对数据库的设计有了更深层次的认知,或许只有真正自己开发了之后才会有很深刻的理解吧,或许这就是数据库原理课程设计的目的所在。这门课程我从零开始学习Java web开发,从零开始学习JDBC,感谢老师给了我机会在同学们面前展示自己,锻炼自己。
    2 评论 15 下载 2019-11-17 11:39:36 下载需要15点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思C++实现校园卡管理系统

    1 实验目的
    本实验面向 C++语言的初学者
    主要让实验者熟悉面向对象的编程思想以及类的使用

    2 实验环境本实验可狗万 赢钱ok_狗万新闻_狗万什么意思意思Visual Studio 或Eclipse 或Devc++平台开发,参考主流的编码规范,如Google C++Style Guide(中文版)
    2.1 编程语言和开发工具
    编程语言: ANSI C++
    开发工具: dev cpp

    2.2 编码规范要求遵循良好的程序设计风格来设计和编写程序。基本编码规范:

    标识符的命名要到达顾名思义的程度
    关键代码提供清晰、准确的注释
    程序版面要求:

    不同功能块用空行分隔一般一个语句一行语句缩进整齐、层次分明

    3 实验内容编写校园卡管理系统,进行对校园卡,储蓄卡的管理和绑定,其中包括新建,消费,转账,查询,存款等操作。
    4 分析与设计简要描述程序设计的过程,包括设计思路,设计要点及特色;程序的不足与改进等。要求画出程序的简单流程图。
    4.1 需求分析校园卡的消费,查询;储蓄卡的消费,转账,查询,其中可转账给其他储蓄卡或者校园卡,可以透支;绑定卡的校园卡可以在无存款时透支储蓄卡上的金额。
    4.2 类结构设计类关系图

    4.3 细节设计数据成员
    class Account{ //流水账类 public: string adress; double amount; long id; long time; bool xaiofei=0; bool zhuanru=0; bool zhuanchu=0; bool cunru=0; };class Card{ //基类 card 类 public: card(){} long id; string name; double overage; int listnum; Account *listarray; virtual void pay(){} virtual void inquire(){} };class Campuscard:public Card{ //继承类校园卡类 public: campuscard(); void pay(string adress, double amount); void inquire(); string school; bool isbinding; long bindid;};class Debitcard:public Card{ //继承类储蓄卡类 public: debitcard(); void pay(string adress,double amount); void inquire(); void transfers1(Debitcard &othercard); void transfers2(Campuscard &othercard); void debit(double amount); int getYear(){ return year; } int getMon(){ return mon; } int getDay(){ return day; } private: long timee; double limit; //透支额度 double moneyed; //已用透支数额 double surplus; //剩余额度 };
    成员函数
    virtual void pay(){} virtual void inquire(){} card(){}campuscard(); void pay(string adress,double amount); void inquire();debitcard(); void pay(string adress,double amount); void inquire(); void transfers1(Debitcard &othercard); void transfers2(Campuscard &othercard); void debit(double amount);
    5 设计心得上课要认真听讲,下来要多练习,然后其实也不太会。其实还是学到了很多,尤其是在不太懂的地方请教别人。本来说用文件输入输出,结果发现自己还是不会,然后就放弃了。感觉看看自己前两个项目又会收获很多。
    6 程序主界面
    2 评论 111 下载 2018-11-05 21:43:13 下载需要5点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思JAVA和SQL SERVER数据库实现的医院病房信息管理系统

    1 系统设计1.1 设计目标医院病房管理系统是一种以窗体界面为基础的多功能平台,本系统最根本的目的是让使用者与数据库能够通过系统达到交互,以此来进行医院病房的管理等相关操作。管理员可以通过该平台对医生、病人、科室、病房、病床进行增加、删除、修改、查询操作,普通用户可以通过该平台查看修改自己的个人信息、进行病人住院登记、查询病人和床位信息、根据病人的住院日期、出院日期和所住病房的收费标准进行出院结算,然后删除该病人的信息。本系统在全面提高医院的整体工作效率、为病人提供快捷的服务、为医生提供人性化的管理、减轻医院工作人员的负担等方面发挥着重要作用。
    1.2 需求分析信息要求:医生基本信息包括工作证号、密码、姓名、性别、职称、年龄、联系电话、所属科室,病人基本信息包括病历号、姓名、性别、诊断结果、病房号、病床号、主治医生工作证号、联系电话、入院日期、出院日期,科室基本信息包括科室名称、科室地址、科室电话,病房基本信息包括病房号、所属科室、收费标准,病床基本信息包括病房号、病床号、目前状态。
    处理要求:一名医生可以诊治多名病人,一名病人只能被一名医生诊治。一个病房可以住多名病人,一名病人只能住在一个病房。一个科室有多名医生,一个医生只属于一个科室。一个科室包含多个病房,一个病房只属于一个科室。一个病房拥有多张病床,一个病床只能位于一个科室。
    安全性与完整性要求:管理员和医生只有输入正确的工作证号和密码才能登录系统,如果还没有注册,先输入相关信息进行注册。对于管理员,管理主页列出了管理员所能实现的功能,包括对医生、病人、科室、病房、病床的增加、删除、修改、查询,管理员根据需要选择对应的项目。对于用户,即医生,管理主页列出了医生所能实现的功能,包括查看修改自己的个人信息、登记病人基本信息、查询病人和床位信息、根据病人的住院日期、出院日期和所住病房的收费标准进行出院结算,然后删除该病人的信息。为了保证系统的安全性,系统提供对工作证号和旧密码的验证,来修改登录密码。
    1.3 开发和运行环境选择
    开发工具:前台开发语言为Java编程语言
    后台数据库为SQL Server 2014
    运行环境:Windows 10

    2 数据库设计2.1 数据库概念设计根据需求分析,可以确定该系统中的实体、属性和联系之间的关系,并画出如下所示的E-R图。
    实体及属性如图2.1所示。

    病人实体及属性如图2.2所示。

    科室实体及属性如图2.3所示。

    病房实体及属性如图2.4所示。

    病床实体及属性如图2.5所示。

    由该项目的处理需求可知,“医生”和“病人”之间的“治疗”联系为1:n,即一名医生可以诊治多名病人,一名病人只能被一名医生诊治。“病房”和“病人”之间的“入住”联系为1:n,即一个病房可以住多名病人,一名病人只能住在一个病房。“科室”和“医生”之间的“属于”联系为1:n,即一个科室有多名医生,一个医生只属于一个科室。“科室”和“病房”之间的“包含”联系为1:n,即一个科室包含多个病房,一个病房只属于一个科室。“病房”和“病床”之间的“拥有”联系为1:n,即一个病房拥有多张病床,一个病床只能位于一个科室。系统的实体联系图,如图2.6所示。

    2.2 数据库逻辑结构设计2.2.1 关系模式根据转换规则和医院病房管理系统E-R图,可以得到医院病房管理系统的关系模式如下。
    医生(工作证号、密码、姓名、性别、职称、年龄、联系电话、所属科室)为医生实体对应的关系模式,其中工作证号是主码,科室的主码科室名称是医生的外码。
    病人(病历号、姓名、性别、诊断结果、病房号、病床号、主治医生工作证号、联系电话、入院日期、出院日期)为病人实体对应的关系模式,其中病历号是主码,医生的主码工作证号是病人的外码属性,病床的主码病房号、病床号是病人的外码属性。
    科室(科室名称、科室地址、科室电话)为科室实体对应的关系模式,其中科室名称是主码。
    病房(病房号、所属科室、收费标准)为病房实体对应的关系模式,其中病房号是主码,科室的主码科室名称是病房的外码。
    病床(病房号、病床号、目前状态)为病床实体对应的关系模式,其中病房号、病床号是主码。
    2.2.2 结构设计表医生结构设计表如表2.1所示。

    病人结构设计表如表2.2所示。

    科室结构设计表如表2.3所示。

    病房结构设计表如表2.4所示。

    病床结构设计表如表2.5所示。

    2.2.3 数据字典数据项描述如表2.3所示。

    数据结构描述如表2.4所示。

    3 医院病房管理系统详细设计3.1 系统功能医院病房管理系统主要分为用户模块和管理员模块(分为医生、病人、科室、病房、病床信息增删改查功能)。其中用户模块包括查看修改自己的个人信息、进行病人住院登记、查询病人和床位信息、根据病人的住院日期、出院日期和所住病房的收费标准进行出院结算,然后删除该病人的信息。管理员模块包括对医生、病人、科室、病房、病床进行增加、删除、修改、查询操作。
    3.2 数据库以及表的建立医院病房管理系统数据库中包含五张表,分别为医生(Doctor)、病人(Patient)、科室(Department)、病房(Ward)、病床(Bed),相关代码如下。
    CREATE TABLE Doctor (Dno CHAR(10) PRIMARY KEY, Dpassword VARCHAR(15) NOT NULL, Dname CHAR(20) NOT NULL, Dsex CHAR(2) NOT NULL, Dtitle CHAR(10) NOT NULL, Dage SMALLINT NOT NULL, Dtel CHAR(11) NOT NULL, Deptname CHAR(20) NOT NULL, FOREIGN KEY(Deptname) REFERENCES Department(Deptname) );CREATE TABLE Department (Deptname CHAR(20) PRIMARY KEY, Deptaddress CHAR(20) NOT NULL, Depttel CHAR(11) NOT NULL );CREATE TABLE Ward (Wno CHAR(9) PRIMARY KEY, Deptname CHAR(20) NOT NULL, Wcharge INT NOT NULL, FOREIGN KEY(Deptname) REFERENCES Department(Deptname) );CREATE TABLE Bed (Wno CHAR(9), Bno CHAR(9), Bstate CHAR(20) , PRIMARY KEY(Wno,Bno), FOREIGN KEY(Wno) REFERENCES Ward(Wno) );CREATE TABLE Patient (Pno CHAR(10) PRIMARY KEY, Pname CHAR(20) NOT NULL, Psex CHAR(2) NOT NULL, Pdiagnose CHAR(20) NOT NULL, Wno CHAR(9) NOT NULL, Bno CHAR(9) NOT NULL, Dno CHAR(10) NOT NULL, Ptel CHAR(11) NOT NULL, Pindate DATE NOT NULL, Poutdate DATE , FOREIGN KEY(Wno,Bno) REFERENCES Bed(Wno,Bno), FOREIGN KEY(Dno) REFERENCES Doctor(Dno) );
    3.3 连接数据库连接数据库的代码及设置和连接操作的相关代码如下。
    package linkdatabase;package linkdatabase;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class linkdatabase { static Connection connection; public linkdatabase(){ //数据库驱动 String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //连接的数据库 String url="jdbc:sqlserver://localhost:1433;DatabaseName=HWMS"; String user="sa"; String password="yyl13593519418"; //加载JDBC-MySQL数据库驱动 try { Class.forName(driverName); connection = (Connection) DriverManager.getConnection(url,user,password); System.out.println("数据库连接成功"); } catch(Exception e) { e.printStackTrace(); System.out.println("数据库连接失败:"+e.getMessage()); } } public static Connection getConnection(){ new linkdatabase(); return connection; } public void setConnection(Connection connection){ this.connection = connection; } public static void closeAll(ResultSet rs,PreparedStatement ps,Connection con){ if(rs != null){ try{ rs.close(); }catch(SQLException e){ e.printStackTrace(); } } if(ps != null){ try{ ps.close(); }catch(SQLException e) { e.printStackTrace(); } } if(con != null){ try{ con.close(); }catch(SQLException e){ e.printStackTrace(); } } }}
    3.4 登录系统登录系统为进入系统的首要操作,相关代码如下。
    package Hospitallogin;import java.awt.Button;import java.awt.Color;import java.awt.Cursor;import java.awt.Font;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import Doctorfunction.Main;import Hospitaladmin.admin_frame;import Hospitalresponse.Alter;import Hospitalresponse.Register;import geng.handle.HandleLogin;import geng.model.Login;import linkdatabase.linkdatabase;public class LoginFrame extends JFrame implements ActionListener{ String sql; Login login = new Login(); HandleLogin handleLogin = new HandleLogin(); JLabel l1 = new JLabel("欢迎登陆医院病房管理系统"); JLabel l2 = new JLabel("账号:"); JLabel l3 = new JLabel("密码:"); JLabel l4 = new JLabel("账号不存在!"); JLabel l5 = new JLabel("<HTML><U>"+"注册账号"+"</U></HTML>"); JLabel l6 = new JLabel("<HTML><U>"+"修改密码"+"</U></HTML>"); JTextField t1 = new JTextField(); JTextField t2 = new JTextField(); Button b1 = new Button("登陆"); Button b2 = new Button("取消"); public LoginFrame() { // TODO Auto-generated constructor stub //设置标题 super("欢迎登陆医院病房管理系统");//创建标题为欢迎登陆医院病房管理系统的窗口 setBounds(300,100,910,500);//设置窗口在屏幕上的位置及大小 String path = "lib/login.jpeg"; ImageIcon backgroundimage=new ImageIcon(path);//使标签有图片,用此创建背景图片 JLabel jLabel = new JLabel(backgroundimage);//标签为用户提示信息 jLabel.setBounds(0, 0, this.getWidth(), this.getHeight());//标签在窗口上的位置及大小 JPanel jPanel1 = (JPanel) this.getContentPane();//初始化一个内容面板,这样才可以把内容面板设置成透明的 jPanel1下面是我们要添加的图片,上面是我们的组件 jPanel1.setOpaque(false);//使组件不会显示其中的某些像素,允许组件下面的像素显现出来,即设置透明 jPanel1.setLayout(null); this.getLayeredPane().add(jLabel,new Integer(Integer.MIN_VALUE)); setVisible(true); // 登陆界面配置 l1.setBounds(450, 70, 450, 35); l1.setFont(new Font("宋体", Font.BOLD, 30)); l2.setBounds(470, 140, 70, 25); l2.setFont(new Font("宋体",Font.BOLD,23)); l3.setBounds(470, 200, 70, 25); l3.setFont(new Font("宋体",Font.BOLD,23)); l4.setBounds(120, 200, 150, 20); l4.setFont(new Font("宋体",Font.BOLD,23)); l5.setBounds(730,140,70,25); l5.setFont(new Font("微软雅黑",Font.BOLD,15)); l5.setForeground(Color.blue); l5.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); l5.addMouseListener(new Register()); l6.setBounds(730,200,70,25); l6.setFont(new Font("微软雅黑",Font.BOLD,15)); l6.setForeground(Color.blue); l6.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); l6.addMouseListener(new Alter()); t1.setBounds(540, 140, 160, 25); t1.setFont(new Font("宋体",0,18)); t2.setBounds(540, 200, 160, 25); t2.setFont(new Font("宋体",0,18)); b1.setBounds(540, 260, 70, 30); b1.setFont(new Font("宋体",0,15)); b1.addActionListener(this); b2.setBounds(660, 260, 70, 30); b2.setFont(new Font("宋体",0,15)); b2.addActionListener(this); super.add(l1); super.add(l2); super.add(l3); super.add(l5); super.add(l6); super.add(t1); super.add(t2); super.add(b1); super.add(b2); super.setLayout(null); super.setVisible(true); //当单击窗口右上方的关闭图标时,监视器调用windowClosing方法,如果在该方法中使用System.exit(0)退出程序的运行 super.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub super.windowClosing(e); System.exit(0); } }); super.setResizable(false); } public static void main(String[] args) { // TODO Auto-generated method stub new LoginFrame(); } @Override //事件源触发ActionEvent事件后,监视器调用接口中的此方法对发生的事件做出处理 public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Object source = e.getSource();//返回添加事件监听的对象 Connection con = null; PreparedStatement ps = null; ResultSet rs = null; if(source == b1) { String name = t1.getText(); String pass = t2.getText(); Login login = new Login(); login.setDno(name); try { con = linkdatabase.getConnection(); if("".equals(name.trim()) || "".equals(pass.trim())) { JOptionPane.showMessageDialog(null, "请输入完整的登陆信息!","系统提示",JOptionPane.ERROR_MESSAGE); }else if(name.equals("admin") && pass.equals("123456")) { new admin_frame(); super.dispose(); }else { login.setDno(name); login.setDpassword(pass); login = handleLogin.queryVerify(login); if(login.getLoginSuccess() == true) { System.out.println("登录成功了!"); new Main(login); super.dispose(); }else { System.out.println("登录失败了!"); JOptionPane.showMessageDialog(null, "登录失败,请重新登录","系统提示",JOptionPane.WARNING_MESSAGE); } } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); }finally { linkdatabase.closeAll(rs, ps, con); } } if(source == b2) { System.exit(0); } }}
    4 系统测试以及界面4.1 订书单位信息查询测试测试注册账号,界面如图4.1所示。

    注册账号成功,结果如图4.2所示。

    4.2 病人出院结算测试进入病人出院结算界面,点击查询与结算,得出病人出院费用,结果如图4.3所示。

    结算出院成功,结果如图4.4所示。

    5 总结在本次数据库课程设计中,我设计开发了一个小型的医院病房管理系统,实现了对病人的住院登记、出院结算、信息查询,对医生信息、病人信息、科室信息、病房信息、病床信息的增加、删除、修改、查询的功能。设计过程中曾经遇到了不少难点和问题,如:将界面和后台数据库连接起来时出错;对数据库中信息操作时有时忽略了参照完整性;病人出院结算时无法调用数据库中存储的信息;页面间参数传递实现不了;还出现了一个语法错误,对一些控件的属性及方法不熟悉等。对于上述这些难点,我花了很多时间去解决,查阅数据库教材和理论课的课件、并借来相关书籍辅助学习,注意数据库中各个所建表的主外键约束,上网搜索也让我学到很多知识,还有些问题是与同学之间的相互讨论,最终将难点一一克服。
    6 评论 227 下载 2018-11-06 15:43:53 下载需要5点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思α-β剪枝算法实现的AI五子棋游戏

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

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

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

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

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

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

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

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

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

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

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

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

    六、实验总结通过本次实验,加强了组员之间的沟通协调能力,同时也提高了我们对αβ减枝算法的了解。我们更了解了五子棋相关的游戏规则以及一些技巧,拓宽了我们的知识面,有助于我们在未来的生活中更好的与人交流。
    同时,经过此次实验,我们深入了解了棋类人工智能算法,进一步的提升了我们的专业水平,有助于我们在未来的就业与科研岗位上走的更远。
    虽然α-β减枝实现起来非常容易,但是五子棋的局势估计却十分的有挑战性,其局势估计的准确与否直接影响了程序的运行结果是否令人满意,AI是否能够展现出足够的智能。
    2 评论 46 下载 2019-06-20 11:16:55 下载需要12点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思JAVA的局域网聊天软件的设计与实现(仿制QQ)

    一、系统分析1.1 问题描述
    客户端

    实现简易版的局域网聊天器实现富文本内容聊天智能聊天机器人群发消息传送文件等功能
    服务器端

    实现群发通知管理聊天线程

    1.2 系统功能分析
    客户端功能

    登陆注册发送表情消息发送文本消息截取图片图片处理震动效果发送文件群发消息设置聊天文本样式
    服务器端

    广播通知

    1.3 开发平台及工具介绍
    Eclipse Mars2
    二、系统设计2.1 系统总体结构设计系统采用自己设计的网络消息传输协议,系统采用CS架构模式实现数据传送。


    2.2 系统各个类及类之间关系设计


    注:

    界面一般是继承了JFrame或JWindowJList、JTable所用的model和渲染器renderer都是自己重写的其余的一些比较琐碎的关系理起来比较复杂程序中的控件大多是自己自定义改写的
    2.3 数据存储的设计(文件等)
    采用键值对的方式存储账号密码
    截图默认保存在ScreenCut/+文件名.jpg
    用到了多种流操作,以及网络传输最关键的套接字操作

    2.4 界面设计
    自定义渲染和数据模型,实现JList、JTable的外交改变
    最长用的是在渲染器中继承JTable实现Renderer接口


    三、系统实现


    四、系统测试模块测试与系统测试:
    4.4 登陆测试
    4.5 注册测试
    4.6 表情测试
    4.7 震动测试震动效果无法截图!
    4.8 截图测试

    4.9 滤镜效果测试


    4.10 设置测试
    4.11 机器人聊天测试

    4.12 文件传输测试



    4.13 服务器管理界面测试

    五、总结通过这次的课程设计,可以说是开阔了自己的眼界,可以总结为以下几个方面:

    对JAVA体系的更深入的了解、对JAVA图像处理初步认识、对JAVA网络通信流的操作、流的套接更进一步深刻了解
    对网络通信的理解,CS、BS架构模式的了解
    对设计模式的初步认识与使用,线程管理这块单例模式的功能
    对JAVA的MVC模式的更深刻了解,层与层的分工明确,效率高,易管理,让人惊叹
    对线程的理解更深刻了,深谙UI主线程与处理耗时操作的子线程的逻辑处理关系
    对网络协议的初步了解,关于协议的定义了解,以及各种传送协议的效率比较有了大体。印象,Socket通信UDP和TCP通信机制初步了解
    对系统的架构设计有了初步认识,缓存机制,分布式系统等,虽然代码中还未实现,程序也并不是面向抽象编程和面向接口编程,代码低耦高聚效果一般,但仍然受益

    知识方面,在课程设计的任务中主要负责jlist jtable覆盖重写、基础类的继承重写、接口实现、界面设计与美化等。玩了半个假期后很多学过的知识都记不清楚了,所以打码的过程中经常翻书,让我又重温了知识;一部分知识书上没有,还需要上网查询或者找同学帮忙解决。有很多瓶颈时候,但坚持过去,看到一起完成的作品会有很大的满足感;其他方面:经过这次课程设计任务,我又一次认识到了团队合作的力量和重要性。一起讨论问题:苦恼过,失落过,兴奋过,到最后的成就感,让我成长,也对自己有了很大的信心。
    在这次课程设计,我们一起讨论要实现这个系统的哪些功能,把各自的想法说出来研究,我们还根据各自所学之长来分配工作,让我意识到在团队合作里每个人都能分享自己的想法、找到自己的位置发挥所长很重要,这样才能让我们更好地完成我们的工作。在完成我们的任务的过程中,我把每个功能逐步实现,比如在实现登录功能的时候,我会先把输入正确的账号和密码登录成功的功能实现,然后再实现判断输入的账号和密码是否一致,若不一致就返回重新输入账号密码这一功能,这让我在发现错误的时候更加容易找出并解决。在此过程虽然遇到许多困难,但是我都会去研究课本和课件里的例题或者上网去看教学视频,一步一步测试,自己实在无法解决了就去找同学帮助。
    经过这次课程设计,我对Java有了更深的了解,但这还远远不够,为了未来的发展,我必须更加努力地去学习更广更深的知识。
    4 评论 105 下载 2018-11-06 09:45:15 下载需要7点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思JSP SSM框架的城市公交查询系统的设计与实现

    摘 要公交查询系统是为了方便人们查询公交的信息,并且能够及时的做到信息更新,其主要是要做到方便人们的使用,信息的可维护性和程序的稳定性 。本系统采用了JAVA编程语言,数据库使用Mysql。计算机技术不断发展,逐渐适应用于各领域,给人们的学习工作生活带来了便利,在公交查询系统也是这样。纸质的公交指南或繁杂的网络版公交指南,都在不同程度上限制了市民出行的方便性。本论文介绍的是一个城市的公交查询系统,方便市民用最简约的方式,查询到最实用的公交信息。本论文是在此系统经过测试并且所有功能都实现的基础上完成的,主要涉及软件,数据库与网络技术等。
    关键词:城市公交查询系统;数据库;JAVA;SSM
    AbstractThis city buses inquiry system aims to make the resident inquire city buses information more convenient and must achieve the information not too lag, but its main idea is the system administrate user-friendly, the data processes reliability, the maintainability, as well as procedure toughness. The system uses the JAVA programming language and MYSQL as database. Along with computer technology’s unceasing development, the computer applies in each big domain, and has brought the enormous convenience to people’s life, the city buses referral system is also. The departed paper city buses guide or the numerous and diverse online edition city buses guide, has limited the conveniences which in the different procedure when a resident goes on a journey. This thesis introduces a city buses referral system, by facilitates the resident with the briefest way and inquires the most useful city buses information. This thesis that is based on the system has been tested and functions all come true mainly involves software, database and networking and so on.
    Key words: City Buses inquiry system; Databases; JAVA; SSM
    1 概述1.1 项目开发背景和现状的研究1.1.1 开发背景随着城市建设的飞速发展,生活节奏的加快,公交系统对城市来说越来越重要。而政府在这方面的投入也是加大了力度,城市中的公交系统也是日益完善,公交系统的不断更新,却又导致了市民无法从原来的公交指南上看到现如今的信息,从而产生了很多不必要的麻烦。所以需要提供一个高效的公交查询系统,才是问题的根本所在。
    现在,随着计算机技术和通信技术的发展,与网络相结合是现如今的重要发展方向,特别是在网络普及,上网极为方便的网络信息时代,通过上网来查询公交信息是公交查询系统的发展方向。
    1.1.2 研究现状公交查询系统是为了方便人们查询公交的一些信息,并且能够做到信息的及时更新,主要是要方便人们的使用,信息的可维护性和程序的稳定性 。本系统采用JAVA,数据库使用的是Mysql。计算机技术的不断发展,逐渐适应用于各领域,给人们的学习工作生活带来了便利,在公交查询系统也是这样。纸质的公交指南或繁杂的网络版公交指南,都在不同程度上限制了市民出行的方便性。本论文介绍的是一个城市的公交查询系统,方便市民用最简约的方式,查询到最实用的公交信息。
    1.2 项目开发目的与意义1.2.1 系统开发的目标本系统是狗万 赢钱ok_狗万新闻_狗万什么意思意思J2EE的公交查询系统,其中包括了公交查询系统的基本功能,并提供了用户留言的功能,方便根据用户提供的留言信息或是提出的建议对系统进行修改和完善,并提供了管理员用户后台维护公交信息的功能,做到能够实时添加和删除公交车次站点。除主要功能以外本系统还附带发布寻物启示与失物招领模块,方便用户。 本系统目标是方便市民进行公交信息查询,并且要做到信息不滞后,其主要思想是做到系统管理的人性化,数据处理的可靠性,可维护性,以及程序的健壮性[2]。系统提供了用户留言的功能,根据用户提供的留言信息或提出的建议提高公交公司的服务质量。狗万 赢钱ok_狗万新闻_狗万什么意思意思J2EE的城市公交查询系统,它采用B/S模式。该系统不仅可以用于公交公司管理系统中,也可以单独作为公交管理系统的一个模块存在,并可以制作成城市公交信息系统查询网,放置于城市的主要场所[3]。这样不仅可以体现出一个城市的智能公交系统的水平,更显示出城市的数字化,信息化水平。
    1.2.2 系统开发的意义Internet 是城市公交信息查询系统得以实现的基础。在当今社会,网络大为普及,上网极为方便,通过网络查询公交信息更是城市公交信息查询系统的发展方向,与网络相结合是大势所趋[4]。城市公交信息查询系统旨在应用现代的信息网络化为广大乘客提供一种方便快捷的乘车线路服务,让网络惠及更多的人。提高市民的出行效率,促进社会的和谐。
    本论文主要涉及软件,数据库与网络技术等。涵盖知识面广,可有效地提高学生综合运用所学知识分析解决问题的能力,增强学生对事物的理解与掌握能力,培养学生掌握科学的研究方法,正确的设计思想,独立思考,勇于进取,探索创新,为今后进一步学习与工作奠定了良好的基础。
    1.3 本论文研究的主要内容本论文采用软件工程思想来进行城市公交信息查询系统的设计与实现。
    首先,介绍当前形势下大多数城市公交路线查询系统存在的诸多问题。在此基础上提出本系统的现实意义以及必要性。对城市公交信息查询系统进行了可行性分析,确定了本系统的功能、性能、界面等。
    其次,对城市公交信息查询系统进行模块分解,确定软件结构,模块功能和模块间的接口,以及数据库的设计。及根据需求分析中提出的思路来设计系统,对各个模块的设计进行了描述。然后给出了城市公交信息查询系统的整体结构图以及各个模块的实现流程图以及数据库设计时需要的表结构。
    再次,对本系统进行详细设计,在此基础上对各个模块的实现进行了介绍,给出了本系统的效果图,并且对重要功能给出了主要代码。
    最后,对系统进行了测试及分析。本文对软件测试的概念和方法进行了概要说明,并对系统的设计和实现进行了总结,提出了对城市公交信息查询系统的展望和具体的改进建议。
    2 需求分析2.1 需求分析2.1.1 系统需求由于本系统面向广大市民和公交公司管理本系统等非计算机专业人士的需求,因此要求硬件配置不能太高,任何一个普通的计算机用户都能很快的熟悉整个软件的使用。本系统要做到所耗费的资源常小,任何用户只需要在一般的电脑上面,就能够通过浏览器使用这个软件。公交公司管理人员能够简单、方便、快捷、远程的实现对系统实时维护和管理。
    2.1.2 技术需求本系统是以互联网为基础,采用SSM框架MySQL数据库开发模式,服务器采用Tomcat 6.0。服务器由数据库服务器、Web服务器等服务器组成,通过客户端网络连接进行系统的管理和维护,数据库服务器中的数据要实现实时更新,数据库要可靠稳定。
    2.1.3 安全需求本系统面向社会,因此对系统的安全性有较高的要求。对数据库要设置不同的用户权限,数据的操作需要用户身份验证,只有取得合法的身份才能进行操作,还应避免数据并发现象,防止数据库无法响应操作。
    2.2 系统可行性分析2.2.1 技术可行性现在,随着计算机技术和通信技术的发展,与网络相结合是以后的重要发展方向,特别是在网络大为普及,上网极为方便的网络信息时代,通过网络查询公交信息更是公交查询系统的发展方向。特别是在网络大为普及,上网极为方便的网络信息时代,通过网络查询公交信息更是查询系统的发展方向。狗万 赢钱ok_狗万新闻_狗万什么意思意思Web的新型公交信息查询系统,数据信息更新更为准确、及时,用户可以利用计算机、手机等平台通过有限或无线的网络连接方式对系统进行访问,得到快捷的服务[5]。SSM(Spring + Springmvc +Mybatis)框架中Mybatis提供了多种常用的数据库应用程序,通过少量代码的编写,就能够实现数据库的访问[6]。系统采用MYSQL作为开发数据库。MYSQL是一种客户机/服务器结构的关系数据库管理系统[7]。在技术难度方面,有指导老师的指导、周围同学的热心帮助,加上对很多相关文献的参考,能够解决开发过程中所遇到的困难。因此,技术是可行的。
    2.2.2 经济可行性如今,随着计算机的大量普及,各种软件的开发成本越来越低,价格也越来越底。本系统也是这样,开发成本较低,只是需要一台配置一般的计算机,该系统运行时占计算机的资源也不多,但并不会因为开发成本低而造成系统功能性能的下降。相反,随着计算机技术的发展,各种实用软件的性能日渐提高。任务管理系统廉价的开发成本,却能够为用户带来相当大的实惠和方便。主要表现在:

    本系统可以说是一个拥有多种实用功能的系统,它集成了多种功能,具有较强的实用性和方便性
    本系统的运行可以大大提高查询信息的效率,减少不必要的人力和物力

    2.3 功能分析要设计一个良好的公交查询系统,就必须首先明确该应用环境对系统的要求。公交查询系统的应用背景为:方便市民搭乘公交车出行;手动(目前)、自动(将来)、及时更新查询数据。
    2.3.1 查询功能分析系统需要提供几种不同方式的查询手段,以实现灵活方便地管理整个系统。其中包括:

    线路查询:可以获得要查询公交所通过的所有站点
    站点查询:通过输入指定站点查询经过该站点的公交车
    公交换乘模块:主要体现那些不可直达需要转车的线路的所有换发

    2.3.2 数据的更新以及修改分析
    更新:系统允许管理员级别的用户对数据进行更新、修改并且存盘操作
    编辑:系统允许管理员级别的用户对数据进行编辑、删除的操作,保证数据的真实性与实时性

    系统采用采用B/S(Browser/Server)结构。整个系统最关键的就是数据库系统,一个强大的数据库可以支持完善一个优秀的软件设计,通过软件系统与数据库系统的连接来实现通过软件界面观察和处理操作数据[8]。通过软件系统与数据库系统的连接来实现通过软件界面观察和处理操作数据,如图2-1所示。

    系统采用三层结构,在客户端用户通过浏览器完成数据下载与模拟操作,浏览器端的表现逻辑通过JAVA网页完成[9]。而系统内部复杂的业务逻辑主要通过JavaBean的组件(Component)实现,JavaBean组件在WWW服务器上运行,通过JAVA返回到客户浏览器。通过表现逻辑与业务逻辑的分离,使网页内容简洁,系统的可维护性和可扩充性增强。在服务器端,系统使用JDBC中间件访问数据库,数据库服务器定义了本系统所需要的事务逻辑和数据逻辑。本系统使用JAVA技术作为表现手段,服务器采用Tomcat6.0作为JAVA引擎,系统业务逻辑由JavaBean 组件完成,使用JDBC 3.0 驱动程序访问数据库[10]。由于系统测试需要成熟的数据库支持,因此系统采用MySQL数据库作为数据库服务器。
    3 系统关键技术3.1 JAVA技术JAVA是由Sun微系统公司于1999年6月推出的一项技术,是狗万 赢钱ok_狗万新闻_狗万什么意思意思JavaServlet以及整个Java体系的Web开发技术,利用这一技术可以建立先进、安全和跨平台的动态网页技术[11]。JAVA技术在多个方面加速了动态Web页面的开发。
    与微软公司的ASP技术相比,JAVA具有如下优点:

    开放的技术:JAVA技术狗万 赢钱ok_狗万新闻_狗万什么意思意思平台和服务器的相互独立,技术支持来自广泛的、专门的、各种工具包,有服务器的组件和数据库产品开发商提供。相比之下,JAVA技术主要依赖MICROSOFT支持
    平台和服务器的独立性:JAVA编写的代码可运行在任何符合JAVA语法结构的环境中。这样JAVA就能够运行在多种WEB服务器上并支持来自多家开发商提供的各种工具包
    开放的开发过程,开放的源码:自1995年以来,SUN用开放过程方法同国际JAVA组织合作开发和修改JAVA技术和规范
    JAVA标记可扩充性:JAVA技术能够为开发者扩展JAVA标记,充分利用与XML兼容的标记技术强大的功能,大大减少对脚本语言的依赖
    JAVA跨平台的可重用性:JAVA组件(EJB,JavaBean或定制的JAVA标记)都是跨平台可重用的

    3.2 Java Bean技术JAVA作为一个很好的动态网站开发语言得到了越来越广泛的应用,在各类JAVA应用程序中,JAVA + JavaBean的组合成为了一种事实上最常见的JAVA程序的标准[12]。JavaBean是描述Java的软件组件模型,有点类似于Microsoft的COM组件概念。在Java模型中,通过JavaBean可以无限扩充Java程序的功能,通过JavaBean的组合可以快速的生成新的应用程序。对于程序员来说,最好的一点就是JavaBean可以实现代码的重复利用,另外对于程序的易维护性等等也有很重大的意义。JavaBean通过Java虚拟机(Java Virtual Machine)可以得到正确的执行,具有平台无关性[13]。一个JavaBean有三个部分组成:
    属性(Property)
    Bean的属性就是对象的属性,但提供了属性读取和设置的接口支持。例如一个时钟Bean可以有时区和镇铃属性,日历Bean可以有年份和月份属性。每个属性通常遵守简单的方法命名规则。这样可以很方便的找出Bean提供的属性,然后查询属性值或改变属性值,对Bean进行操作。
    方法(Method)
    由于Bean本身是Java对象,调用这个对象的方法是与其交互作用的唯一途径。JavaBean严格遵守面向对象的类设计逻辑,不让外界访问其任何实例字段(没有Public字段)。这样,方法调用的是接触Bean的唯一途径。
    事件(Event)
    Bean与其他软件组件交流信息的主要方式是发送和接收事件。这与对象之间通过消息通信类似。JavaBean传统的应用在于可视化的领域,如AWT下的应用。自从JAVA诞生后,JavaBean更多的应用在非可视化领域,在服务器端应用方面表现出来了越来越强的生命力。利用非可视化JavaBean, 来封装事务逻辑、数据库操作等等,可以很好地实现业务逻辑和前台程序(如JAVA)的分离,使得系统具有更好的健壮性和灵活性。
    3.3 JDBC技术JDBC是Java的开发者——Sun的Java Soft公司制定的Java数据库连接Java Data Base Connectivity技术的简称,是为各种常用数据库提供无缝联接的技术[14]。JDBC在Web和Internet应用程序中的作用和ODBC在Windows系列平台应用程序中的作用类似。JDBC有一个非常独特的动态连接结构,它使得系统模块化。使用JDBC来完成对数据库的访问包括以下四个主要组件:Java的应用程序、JDBC驱动器管理器、驱动器和数据源。简单地说,JDBC能完成下列三件事:

    同一个数据库建立连接
    向数据库发送SQL语句
    处理数据库返回的结果

    JDBC是一种可用于执行SQL语句的Java API(Application Programming Interface,应用程序设计接口)。它由一些Java语言写的类、界面组成。JDBC给数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。
    通过使用JDBC,开发人员可以很方便地将SQL语句传送给几乎任何一种数据库。也就是说,开发人员可以不必写一个程序访问MySQL,写另一个程序访问Oracle,再写一个程序访问Microsoft的SQLServer。用JDBC写的程序能够自动地将SQL语句传送给相应的数据库管理系统(DBMS)。不但如此,使用Java编写的应用程序可以在任何支持Java的平台上运行,不必在不同的平台上编写不同的应用。Java和JDBC的结合可以让开发人员在开发数据库应用时真正实现“Write Once,Run Everywhere![15]”。
    Java 具有健壮、安全、易用等特性,而且支持自动网上下载,是一种很好的与数据库线连接而使用的编程语言。它所需要的是Java应用如何同各种各样的数据库连接,JDBC正是实现这种连接的关键。
    JDBC扩展了Java的能力,如使用Java和JDBC API就可以公布一个Web页,页中带有能访问远端数据库的Applet。或者企业可以通过JDBC让全部的职工(他们可以使用不同的操作系统,如Windows, UNIX)在Internet上连接到几个全球数据库上,而这几个全球数据库可以是不相同的。
    3.4 Springmvc技术Springmvc虽然是在Struts1的基础上发展起来的,但它实质上是以WebWork为核心的,其次它为传统的Struts1注入了WebWork的先进设计理念,是在Struts和WebWork的技术基础上进行合并后的一种全新框架。它全新的体系结构与Struts1的体系结构差别很大,Springmvc以WebWork为核心,在Springmvc中大量使用拦截器机制来处理用户请求,采用这种设计的优势表现在:业务逻辑控制器能够与Servlet API 完全分离,避免了Struts1与Servlet API的严重耦合。
    Springmvc对Struts1进行了巨大的改进,主要表现在以下几个方面:

    线程模型方面:Springmvc的Action是一个请求对应一个实例,而Struts1用一个Action的实例处理所有的请求,它的Action工作在单例模式,存在线程安全问题
    Action实现方面:Struts1要求统一扩展自Action类,而Springmvc中可以是一个普通的POJO(Plain Old Java Objects)。POJO指简单的Java对象,实际就是普通Java Beans
    Servlet依赖方面:Struts1的Action依赖于Servlet API,例如Action的execute方法的参数包括request和response对象,使得程序难以测试,而Springmvc的Action不再依赖于Servlet API,便于测试
    封装请求参数:在Struts1中强制使用ActionForm对象封装请求参数而在Springmvc中可以直接使用Action的属性或者选择使用JavaBean来封装要请求的参数
    在数据校验方面: Struts1中支持覆盖validate方法或者使用Validator框架,而在Springmvc中支持重写validate方法或者使用XWork的验证框架
    在Action执行控制方面:Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期,而Springmvc支持通过拦截器堆栈为每一个Action创建不同的生命周期

    3.5 Mybatis技术Mybatis是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得开发人员可以随意的使用对象编程思想来操纵数据库,最具特色的是它可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任[16]。
    Mybatis 核心接口有Session、SessionFactory、Transaction、Query、Criteria和Configuration等6个。通过这六个核心接口,不仅可以对持久化对象进行存取,还能够进行事物控制。以下是对这6个核心接口的介绍:

    Session接口:该接口负责执行持久化对象的CRUD(Create Read Update Delete)操作,需要特别指出的是Session对象时非线程安全的
    SessionFactory接口:该接口负责初始化Mybatis。它的职能是负责创建Session对象,并充当数据存储的代理。这里用到了工厂模式,需要注意的是SessionFactory 并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory 就够了,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory
    Transaction接口:该接口负责事物相关的操作。它是可选的,开发人员可以根据自己的需要来编写自己的底层事物处理代码
    Query和Criteria接口:Query和Criteria接口负责各种数据库查询。它们可以使用SQL语句和HQL语言两种方式,本系统采用SQL语句

    3.6 JavaScript技术JavaScript是适应动态网页制作的需要而诞生的一种脚本语言。它具有交互性,能够包含更多活跃的元素,如今已经广泛地应用于Internet网页制作[17]。JavaScript是由Netscape公司开发的一种脚本语言(Scripting Language)。在HTML基础上,使用JavaScript可以开发交互式网页。它的出现使得网页和用户之间实现了一种实时性的、动态的、交互性的关系,使网页包含更多活跃的元素和更精彩的内容。
    JavaScript可以嵌入到HTML文件中,它的出现增强了网页的互动性,JavaScript简化了HTML文段中的有规律重复的部分,缩短了网页加载时间。
    3.7 MVC设计模式MVC模式是目前广泛流行的设计模式,包括三类对象。它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器[18]。
    3.7.1 模型(Model)模型就是业务流程、状态的处理以及业务规则的制定,业务流程的处理过程对其它层来说就是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件。在MVC的三个部件中,模型处理的任务最多。模型的好处在于代码可以被多个视图重用,因此简化了代码。
    3.7.2 试图(View)视图代表用户交互界面,对于Web应用来说,可以概括为HTML界面。由于一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上业务流程的处理。业务流程的处理交予模型处理。
    3.7.3 控制器(Controller)控制器可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。
    3.8 系统运行环境服务器端的最低配置是由建立站点所需要的软件来决定的,在最底配置的情况下,服务器的性能往往不进人意,现在硬件性能已经相当出色,而且价格也很便宜,因此通常应给服务器端配置高性能硬件。
    本系统的配置要求如下:

    处理器:1.5GHZ以上
    内存:512MB
    硬件空间:160GB

    题目主要采用的开发环境及技术:

    开发环境

    Windows XP Professional(以上版本)Internet Explorer6.0(以上版本)
    开发工具包:JDK Version1.6
    脚本语言:JavaScript
    数据库工具:MYSQL
    JAVA开发工具:MyEclipse8.5

    4 系统总体设计4.1 系统总体设计概述本系统设计使用了面向对象技术和模块化技术。面向对象技术是一种软件开发和程序设计技术,其所开发的程序是面向对象程序,直接描述客观世界的对象及其相互关系。对象是封装了数据和操作的程序块。所谓封装是为这个程序块建立显示的界面,其它对象只能向这个界面发消息,不能访问内部的私有数据和操作。因此,内部的数据和实现操作的算法若有改动,对其它程序对象没有任何影响。封装使程序局部化、易修改、好维护,但许多对象有相同的功能时免不了重复,所以面向对象技术有继承的机制。此外,由于对象自己操作自己的数据,对同一消息不同的对象均以自己的方式响应使得一种消息可有多种响应方式,这就是多态性。封装、继承、多态是面向对象程序的主要特征[19]。正是这些特征使程序安全、可靠、可重用、易维护。因而面向对象技术也成为当今计算机的新兴技术。
    4.2 系统功能结构图根据上述设计思想进行分析,确定了系统的基本框架,如图4-1所示。

    可以看出城市公交信息查询系统的相关功能,这为系统开发及功能模块化提供了清晰地设计思路与方向,狗万 赢钱ok_狗万新闻_狗万什么意思意思系统需求分析,以下为该系统的详细功能:
    登录模块
    普通登陆成功后进入用户个人主界面并选择各种操作,否则会返回到登录界面重新进行登录。管理员登录成功进入管理员主界面选择相应操作。
    公交系统查询模块
    无需登录,进入系统首页根据自己需要进行公交查询。有包括车次查询、站点查询和查询公交换乘方案等。车次查询即为根据车次号查询车次经过的站点,该车次开收车时间,等基本信息;站点查询为经过该站点的车次信息;公交换乘方案查询即分别输入起始站点和目的站点并查询公交乘车方案。
    公告管理模块
    普通用户登录系统后,进入公告管理模块,用户可以提出自己的一些看法意见和对本公交系统的建议,能查看以前的留言。除此之外系统还提供事物认领模块。
    用户个人信息管理模块
    用户登录成功后即可进入到用户的个人主界面,在个人主界面中,用户可以查看个人详细信息,包括用户名账号,保护邮箱等信息,并可以自行修改密码等个人信息,最后注销登录返回到系统登录界面。
    站点信息管理模块
    管理员登录系统后进入相应管理员主界面,在管理员主界面中,可对公交站点信息进行添加和删除,实时更新公交变动信息。
    车次信息管理模块
    管理员登录系统后进入相应管理主界面,在管理员主界面中,可对公交车次信息进行添加和删除,实时更新公交变动信息。
    4.3 系统流程图4.3.1 系统操作流程系统操作流程图详细阐述了该系统的整体操作流程,如图4-2所示。

    用户进行登录,选择登录身份是普通用户或者管理员,如果用户名和密码正确则进入到相应的用户个人主界面,否则返回登录界面重新进行登录。在用户个人主界面,用户可以进行各自需要的操作。若用户为普通用户,则可以进行查询公交信息,留言,注销和更改个人信息等操作;用户为管理员,可添加删除公交信息。最后,用户操作完毕,即可退出本系统,整个系统操作流程到此结束。
    4.3.2 数据增加流程添加信息时,编号字段由系统自动生成,且不能修改,其他信息由用户输入,之后对数据进行合法判断, 合法则写入保存至数据库,不合法则重新输入数据。数据增加流程图如图4-3所示。

    4.3.3 数据修改流程在修改信息时,先选中一条待修改的记录,然后直接输入数据,判断合法性,合法则保存至数据库,不合法重新输入。数据修改流程图如图4-4所示。

    4.3.4 数据删除流程当用户选定一条记录时,单击删除按钮,会提示用户是否确定删除,然后删除数据库相关内容。数据删除流程图如图4-5所示。

    4.4 数据流分析管理员登录系统后,可进行车次管理、站点管理、线路管理、删除用户等操作。普通用户注册登录后,进入查询界面通过系统数据库,可进行公交信息查询、留言版留言。如图4-6所示。

    4.5 业务流分析城市公交信息查询系统工作流程为:输入首页网址进入首页界面,游客只能查询公交信息,游客可以通过注册成为普通用户。普通用户除了具备游客权限外还可以管理个人资料以及发布信息。管理员拥有最高权限,可以对系统信息增删改查,以及对普通管理员的管理,系统业务流程图如图4-7所示。

    5 系统详细设计5.1 后台数据库设计数据库技术是信息资源管理最有效的手段。数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求[20]。
    毕业设计城市公交信息查询系统需要对大量的数据完成搜集、分析、整理、存储、交换等工作,这就需要设计一个较为强大的数据库来对这些数据进行管理。在这里本着实用、方便、安全、可靠的原则,采用MySQL作为本系统数据库的支持。本系统主要数据表有:普通用户表、管理员表、车次信息表、站点信息表、中间站点关联表、留言信息表等。
    为了满足系统存储数据需要,方便进行插入,更新,统计分析等操作,数据一共设计为两个部分,第一部分为满足插入,更新,删除较多的数据存储。第二部分为满足查询和统计分析。
    管理员信息表:该表主要保存管理员信息,包含管理员编号、管理员姓名、账户名、密码。



    列名
    数据类型
    字段大小
    可否为空
    说明




    id
    int


    管理员编号(主键)


    adminName
    varchar
    50

    管理员姓名


    loginName
    varchar
    50

    账户名


    passWord
    Varchar
    50

    密码



    公交线路信息表:该表主要保存公交线路信息,包含线路编号、正向途经站点、反向途经站点、公交线路名称、始发时间与末班时间。



    列名
    数据类型
    字段大小
    可否为空
    说明




    id
    int


    线路编号(主键)


    content
    varchar
    255

    正向途径站点


    content2
    varchar
    255

    反向途径站点


    name
    varchar
    50

    线路名称


    title
    varchar
    255

    始末发车时间



    失物信息表:该表主要保存用户发布的信息,包括启示编号、启示内容、发布时间、启示标题、启示类别。



    列名
    数据类型
    字段大小
    可否为空
    说明




    id
    int


    启示编号(主键)


    contents
    varchar
    20

    启示内容


    inputTime
    varchar
    255

    发布时间


    title
    varchar
    255

    启示标题


    type
    int


    启示类型



    找回密码表:该表主要保存找回密码所需信息,包括编号、问题答案内容、问题类型。



    列名
    数据类型
    字段大小
    可否为空
    说明




    id
    int


    编号(主键)


    content
    varchar
    255

    答案内容


    title
    int


    问题类型



    公告表:该表主要保存发布的公告信息,包括公告编号、公告内容、发布时间、公告标题。



    列名
    数据类型
    字段大小
    可否为空
    说明




    id
    int


    公告编号(主键)


    contents
    varchar
    20

    公告内容


    inputTime
    varchar
    255

    发布时间


    title
    varchar
    255

    公告标题



    用户信息表:该表主要保存用户注册信息,包括编号、用户地址、用户邮箱、用户姓名、登录密码、用户名、用户电话、附加信息。



    列名
    数据类型
    字段大小
    可否为空
    说明




    id
    int


    用户编号(主键)


    address
    varchar
    255

    用户地址


    contents
    varchar
    255

    附加信息


    email
    varchar
    50

    邮箱


    loginName
    varchar
    255

    用户名


    passWord
    varchar
    50

    密码


    userName
    varchar
    50

    用户姓名


    tel
    varchar
    20

    用户电话



    5.2 系统模块设计5.2.1 注册与登录用户注册界面,要求用户必须输入姓名、用户名、密码、联系电话以及邮箱等必填信息以及联系地址等选填信息。当信息填完后点击保存按钮完成注册工作,进入用户登录界面,点击返回按钮返回到首页,如图5-1所示。

    登录界面,分为普通用户登录和管理员登录。普通用户或系统管理员在用户对应的文本框中输入用户名,在密码对应的文本框中输入密码,然后选择相应的用户类型。如果用户名和密码同时与数据库中的用户名和密码相对应,点击确定后进入系统主界面,如果输入的信息不正确,则给出提示。
    用户要登录本系统需要提供用户名和密码,在这里就是要检验用户是否满足输入的要求,即检验用户名和密码文本框是否为空,若为空,则提示用户输入用户名和密码。检验用户名是否存在或密码是否正确,即是否存在用户输入的用户名,并且密码是否正确,如图5-2所示。

    输出:登录成功,进入用户的系统使用资源页面,不成功则显示错误信息页面,管理界面如图5-3所示。

    5.2.2 公交信息查询用户根据自己的实际情况选择按站点查询、按线路查询也可以根据其实位置和终点位置进行查询,在相应的位置进行输入,然后提交给系统,系统会自动查找线路表所有相匹配的信息,并返回给用户要查询的公交信息,如图5-4所示。

    查询公交信息数据库相关操作代码:
    public String zz() throws Exception { String cd = request.getParameter("textfield3").trim(); String zd = request.getParameter("textfield4").trim(); ArrayList al = (ArrayList) indexDao.checkCDZD(cd, zd); System.out.println("al.size=" + al.size()); HttpSession session = request.getSession(); if (al.size() > 0 && al != null) { //如果有直达的车辆(也就是不用转车) session.setAttribute("zzMore", al); //直达的车辆的信息 session.setAttribute("zzMorecd", cd); //您输入的起点名 session.setAttribute("zzMorezd", zd); //您输入的终点名 return "zzone"; } else { ArrayList arrMiddleAll = indexDao.checkMiddle(cd, zd); if (arrMiddleAll.size() > 0 && arrMiddleAll != null) {//查询一个中转站可以到达目的地的方法 session.setAttribute("zzMoreMiddleAll", arrMiddleAll); //得到一个中转站可以到达目的地的所有信息 session.setAttribute("zzMorecd", cd); //您输入的起点名 session.setAttribute("zzMorezd", zd); //您输入的终点名 System.out.println("=======================zztwo"); return "zztwo"; } else { //也就是要倒两次以上车 ArrayList arrTwoMiddleAll=indexDao.checkTwoMiddle(cd,zd); if (arrTwoMiddleAll.size() > 0 && arrTwoMiddleAll != null) { session.setAttribute("zzMorecd", cd); //您输入的起点名 session.setAttribute("zzMorezd", zd); //您输入的终点名 session.setAttribute("zzMoreTwoMiddleAll", arrTwoMiddleAll); //得到二个中转站可以到达目的地的所有信息 System.out.println("=======================zzthree"); return "zzthree"; }else{ System.out.println("======================= - zzerror - "); return "zzerror";}
    5.2.3 寻物启事和失物招领普通用户进入该模块可以发布寻物启示以及失物招领信息,如图5-5所示。

    数据库操作相关代码:
    public String noteSSMow() throws Exception { if (request.getSession().getAttribute("loginmessage") == null) return "noLogin";//判断是否登录 NotesEntity pe = indexDao.noteSSMow(request); request.setAttribute("NotesEntity", pe); return "noteSSMow"; } // 公告管理:修改信息 public String notesUpdList() throws Exception { if (request.getSession().getAttribute("loginmessage") == null) return "noLogin";//判断是否登录 List list = indexDao.notesList(request); request.setAttribute("notesUpdList", list); return "notesUpdList"; } // 公告管理:修改单个信息 public String notesUpd() throws Exception { if (request.getSession().getAttribute("loginmessage") == null) return "noLogin";//判断是否登录 NotesEntity notesEntity = indexDao.noteSSMow(request); request.setAttribute("getNotesView", notesEntity); return "notesUpd"; } // 公告管理:修改保存到数据库 public String notesUpdDB() throws Exception { if (request.getSession().getAttribute("loginmessage") == null) return "noLogin";//判断是否登录 indexDao.notesUpdDB(request); return "notesUpdList"; } // 公告管理:删除信息 public String notesDelList() throws Exception { if (request.getSession().getAttribute("loginmessage") == null) return "noLogin";//判断是否登录 List list = indexDao.notesList(request); request.setAttribute("notesDelList", list); return "notesDelList"; } // 公告管理:删除单个信息 public String notesDel() throws Exception { if (request.getSession().getAttribute("loginmessage") == null) return "noLogin";//判断是否登录 indexDao.notesDel(Long.valueOf(request.getParameter("id"))); return "notesDelList"; }
    5.2.4 用户个人信息管理普通用户登录成功后可以进入到个人主界面,该界面实现的功能为:查看个人详细信息、修改个人信息,如图5-6所示。

    5.2.5 公交线路管理此模块需要系统管理员权限,在管理员主界面中,可对公交线路进行添加、删除以及对公交变动信息实时更新。如图5-7所示。

    5.3 连接池配置在城市公交信息查询系统中采用数据库连接处技术提高访问数据库的效率。在数据源中建立了多个数据库连接,这些连接保存在数据库连接池中。Java程序访问数据库时,只需要从连接池中取出空闲的数据库连接,程序访问数据库完毕之后,再将数据库连接池放回连接池,具体实现是在applicationContext.xml中加入:
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://127.0.0.1:3306/buscity</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value></value> </property></bean>
    5.4 SSM框架的整合为实现Spring 整合Mybatis和Springmvc,需要配置applicationContext.xml文件,配置完成后系统就可以通过Springmvc的action直接调用了。Mybatis访问数据库的操作都在Spring中实现了,而Spring的调用是在Springmvc的action中实现。SSM框架整合具体如下:
    首先在web.xml文件中添加Spring配置、新增一个监听器(Linstener)。监听器的作用是启动 Web 容器时,自动装配 ApplicationContext 的配置信息。因为它实现了ServletContextListener这个接口,在Web.xml完成这个监听器的配置后,启动容器时,就会默认执行它实现它的方法。实现代码如下:
    <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:/applicationContext.xml </param-value> </context-param><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
    配置数据源、SessionFactory。连接池的数据源和分配 sessionFactory 对象是通过Spring 管理的。Spring 通过建立一个LocalSessionFactory对象来完成对Mybatis 的配置,这是一个工厂 bean 的实现。然后就可以通过继承 Spring 为 我们提供MybatisDaoSupport(MybatisDao层都需要继承extends它)来对数据库的 DAO 模式管理。代码如下:
    <!-- 配置数据源 DBCP 提供的BasicDataSource --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://127.0.0.1:3306/buscity</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value></value> </property> </bean> <!-- Mybatis配置 --> <bean id="sessionFactory" class="org.springframework.orm.Mybatis3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="MybatisProperties"> <props> <prop key="Mybatis.dialect">org.Mybatis.dialect.MySQL5Dialect</prop> <prop key="Mybatis.show_sql">true</prop> <prop key="Mybatis.format_sql">true</prop> <prop key="Mybatis.hbm2ddl.auto">update</prop> </props> </property> <property name="packagesToScan" value="com.Mybatis" /> </bean>
    将sessionFactory 对象作为属性注入到这个服务类中去。代码如下:
    <bean id="indexDao" class="com.struts.dao.IndexDao"> <property name="sessionFactory" ref="sessionFactory"></property></bean>
    装配事务管理器,使用annotation定义事物、自动注册bean。代码如下:
    <!-- 事务管理器配置,单数据源事务 --> <bean id="transactionManager" class="org.springframework.orm.Mybatis3.MybatisTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <context:annotation-config /> <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --> <context:component-scan base-package="com.*"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context:component-scan>
    配置struts.xml的Action。
    6 系统调试与测试6.1 程序调试在设计系统的过程中,存在一些错误是必然的。对于语句的语法错误,在程序运行时自动提示,并请求立即纠正,因此,这类错误比较容易发现和纠正。但另一类错误是在程序执行时由于不正确的操作或对某些数据的计算公式的逻辑错误导致的错误结果。这类错误隐蔽性强,有时会出现,有时又不出现,因此,对这一类动态发生的错误的排查是耗时费力的。
    6.2 程序的测试6.2.1 测试的重要性及目的测试的重要性
    软件的测试在软件生命周期中占据重要的地位,在传统的瀑布模型中,软件测试学仅处于运行维护阶段之前,是软件产品交付用户使用之前保证软件质量的重要手段。近来,软件工程界趋向于一种新的观点,即认为软件生命周期每一阶段中都应包含测试,从而检验本阶段的成果是否接近预期的目标,尽可能早的发现错误并加以修正,如果不在早期阶段进行测试,错误的延时扩散常常会导致最后成品测试的巨大困难。
    测试是所有工程学科的基本组成单元,是软件开发的重要部分。自有程序设计的那天起测试就一直伴随着。统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工作量的40%以上。而在软件开发的总成本中,用在测试上的开销要占30%到50%。如果把维护阶段也考虑在内,讨论整个软件生存期时,测试的成本比例也许会有所降低,但实际上维护工作相当于二次开发,乃至多次开发,其中必定还包含有许多测试工作。
    在实践中,软件测试的困难常常使人望而却步或敷衍了事,这是由于对测试仍然存在一些不正确的看法和错误的态度,这包括:
    认为测试工作不如设计和编码那样容易取得进展难以给测试人员某种成就感;
    以发现软件错误为目标的测试是非建设性的,甚至是破坏性的,测试中发现错位是对责任者工作的一种否定;
    测试工作枯燥无味,不能引起人们的兴趣;
    测试工作是艰苦而细致的工作;
    对自己编写的程序盲目自信,在发现错误后,顾虑别人对自己的开发能力的看法。
    这些观点对软件测试工作是极为不利的,必须澄清认识、端正态度,才可能提高软件产品的质量。
    测试的目的
    如果测试的目的是为了尽可能多地找出错误,那么测试就应该直接针对软件比较复杂的部分或是以前出错比较多的位置。
    软件测试是为了发现错误而执行程序的过程,测试是为了证明程序有错,而不是证明程序无错误,一个好的测试用例是在于它能发现至今未发现的错误,一个成功的测试是发现了至今未发现的错误的测试。
    这种观点可以提醒人们测试要以查找错误为中心,而不是为了演示软件的正确功能。但是仅凭字面意思理解这一观点可能会产生误导,认为发现错误是软件测试的唯一目,查找不出错误的测试就是没有价值的,事实并非如此。
    首先,测试并不仅仅是为了要找出错误。通过分析错误产生的原因和错误的分布特征,可以帮助项目管理者发现当前所采用的软件过程的缺陷,以便改进。同时,这种分析也能帮助我们设计出有针对性地检测方法,改善测试的有效性。其次,没有发现错误的测试也是有价值的,完整的测试是评定测试质量的一种方法。
    6.2.2 测试的步骤与内容与开发过程类似,测试过程也必须分步骤进行,每个步骤在逻辑上是前一个步骤的继续。大型软件系统通常由若干个子系统组成,每个子系统又由若干个模块组成。因此,大型软件系统的测试基本上由下述几个步骤组成:

    模块测试:在这个测试步骤中所发现的往往是编码和详细设计的错误
    系统测试:在这个测试步骤中发现的往往是软件设计中的错误,也可能发现需求说明中的错误
    验收测试: 在这个测试步骤中发现的往往是系统需求说明书中的错误

    测试的主要内容:
    为了保证测试的质量,将测试过程分成几个阶段,即:代码审查、单元测试、集成测试、确认测试和系统测试[21]。
    单元测试
    单元测试集中在检查软件设计的最小单位—模块上,通过测试发现实现该模块的实际功能与定义该模块的功能说明不符合的情况,以及编码的错误。
    集成测试
    集成测试是将模块按照设计要求组装起来同时进行测试,主要目标是发现与接口有关的问题。如一个模块与另一个模块可能有由于疏忽的问题而造成有害影响;把子功能组合起来可能不产生预期的主功能;个别看起来是可以接受的误差可能积累到不能接受的程度;全程数据结构可能有错误等。
    确认测试
    确认测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是确认测试的任务,即软件的功能和性能如同用户合理期待的那样。
    系统测试
    软件开发完成以后,最终还要与系统中其他部分配套运行,进行系统测试。包括恢复测试、安全测试、强度测试和性能测试等。
    6.2.3 单独对系统的测试单独对系统的测试主要从以下几个方面入手:

    功能测试:测试是否满足开发要求,是否提供设计所描述的功能,是否用户的需求都得到满足。功能测试是系统测试最常用和必须的测试,通常还会以正式的软件说明书为测试标准
    强度测试及性能测试:测试系统能力最高实际限度,即软件在一些超负荷情况下功能实现的情况
    安全测试:验证安装在系统内的保护机构确实能够对系统进行保护,使之不受各种非常的干扰。针对本系统主要是对权限系统的测试和对无效数据、错数据、和非法数据干扰的能力的测试

    6.3 测试分析本系统主要实现了公交查询功能,并附有用户留言的功能,同时具有管理员后台维护公交信息等功能。但由于本人能力不足以及所学知识的缺乏,再加上时间有限,该系统还不够健全。该系统虽然基本实现了所要求的功能,但是还存在很多不足,有待于进一步的完善和改进。经过上述的测试过程对软件进行测试后,软件基本满足开发的要求,测试宣告结束。
    结束语本文通过本系统设计与开发感触颇深,总结如下:
    学习一门新技术,最重要的是实践,只有多动手才能尽快掌握它。一个系统的开发,经验是最重要的,经验不足,就难免会有许多考虑不周之处。要想吸引更多的用户,系统的界面必须要美观、有特色、友好,功能要健全。不过由于经验不足,我设计的图形界面比较简单。只是对基本功能进行了开发。
    本次开发,我参考了很多本系统的例子,吸取了一些别的本系统的长处,对自己的毕业设计进行了完善,但是还有很多的不足之处,有待以后进一步学习。实践证明,本系统有着很好的发展前景,经测试运行。本文所制作的系统界面友好、使用灵活、操作简单、功能齐全、表现方式独特,已基本具备了成熟的技术理论。
    由于时间仓促,本次设计由我完成本系统的制作,对我这样一个JAVA新手而言所制作的模块还有不完善的地方。数据库的设计也比较简单。还有很多毕业设计中用到JAVA语言的知识也不够全面,还有很多地方不能够作到完全的理解和掌握。通过这次毕业论文的设计制作使本人受益匪浅。由于是毕业设计是独立完成的,因此在毕业设计的过程遇到了很多的困难,我求教了不少老师和同学,在这个过程中让我体会到了,一个团队的重要性。
    参考文献[1] BruceEckel. JAVA编程思想[M].北京:机械工业出版社,2003
    [2] 赛奎春. JAVA工程应用与项目实践[M]. 北京:机械工业出版社, 2002
    [3] 陈守学、刘电霆.中小城市公交线路查询系统设计方法研究[M]. 桂林航天工业高等专科学校学报,2007.12
    [4] 刘晓妍. 狗万 赢钱ok_狗万新闻_狗万什么意思意思J2EE公交查询系统的研究[D].上海:华东师范大学软件学院,2010.4
    [5] 吴永军、蔡永香、郭庆胜. 城市公交查询系统的设计与实现[D].武汉:武汉大学资源与环境科学学院,2006.5
    [6] 周继芳. 狗万 赢钱ok_狗万新闻_狗万什么意思意思J2EE的公交线路查询系统的设计与实现[D].西昌:西昌卫星发射基地,2009.5
    [7] 孙一林,彭波. JAVA数据库编程实例[M]. 北京:清华大学出版社,2002
    [8] 萨师煊,王珊. 数据库系统概论[D].高等教育出版社,2002
    [9] 耿祥义,张跃平. JAVA实用教程[M]. 北京:清华大学出版社,2003
    [10] 蔡剑,景楠. Java Web应用开发J2EE和Tomcat[M]. 北京:清华大学出版社, 2005
    [11] Brown等. JAVA编程指南(第二版)[M]. 北京:电子工业出版社 ,2003
    [12] 沈雄. 狗万 赢钱ok_狗万新闻_狗万什么意思意思SSM的分布式公交运营管理系统设计与实现[EB/OL].http://wenku.baidu.com/view/c49946293169a4517723a3cc.html,2011-05-09/2012-03-28
    [13] JAVA 程序设计论坛http://techbbs.zol.com.cn/subcate_list_8.html,2010-11-04/2012-03-29
    [14] 徐国志,汪孝宜等. SQL Server数据库开发实例精粹[M].北京:电子工业出版社,2006
    [15] 岳昆、王晓玲、周傲英. Web服务核心支撑技术[J]:研究综述.软件学报,2004,18(1):16-20
    [16] 冯锐. SSM权威指南[M].北京:中国电力出版社,2003
    [17] 月影. JavaScript王者归来[M].北京:清华大学出版社,2008
    [18] 孙卫琴. 精通Struts:狗万 赢钱ok_狗万新闻_狗万什么意思意思MVC的Java Web设计与开发[M]. 北京:电子工业出版社,2004
    [19] 张存保等. 狗万 赢钱ok_狗万新闻_狗万什么意思意思WebGIs的城市公交问路系统.武汉理工大学学报,2004,23(1):20-24
    [20] Paul Simith. Database Appliction[J]. 北京:电子工业出版社,2001
    [21] 王水,张晓民.软件工程素质导论[M].河南:河南科学技术出版社,2011
    3 评论 48 下载 2019-05-14 11:17:31 下载需要16点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思C++的库存管理系统设计与实现

    一 需求分析1.1 总体要求运用面向对象程序设计知识,利用C++语言设计和实现一个“库存管理系统设计”,主要完成对商品的销售、统计和简单管理。在实现过程中,需利用面向对象程序设计理论的基础知识,充分体现出C++语言关于类、继承和封装等核心概念,每一个类应包含数据成员和成员函数。
    1.2 功能分析超市中商品分为四类,分别是食品、化妆品、日用品和饮料。每种商品都包含商品名称、价格、库存量和品牌等信息。
    本系统要求具备如下主要功能:
    1.2.1 商品简单管理功能
    添加功能:主要完成商品基本信息的添加
    查询功能:可按商品类别、商品名称、生产厂家、进货日期进行查询。若存在相应信息,输出所查询的信息,若不存在该记录,则提示“该记录不存在!”
    修改功能:可根据查询结果对相应的记录进行修改
    删除功能:主要完成商品信息的删除。先输入商品类别,再输入要删除的商品名称,根据查询结果删除该物品的记录,如果该商品不在物品库中,则提示“该商品不存在”

    1.2.2 进货功能按要求添加相应商品的信息到库存中。可按要求输入商品编号,商品名称,生产厂家,商品价格,商品数量,商品类别,入库时间等商品基本信息。
    1.2.3 出货功能出货时可按照商品名称查找相应商品,显示相关商品库存量等基本信息。若有库存量则输入出售数量,出售价格以及出库时间,计算销售额,利润。如果库存量不足则提示出货失败,结束出货。
    1.2.4 统计功能输出当前库存中所有商品的总数及详细信息;能统计每种商品一周时间内的销售额和利润;能统计每类商品的一周时间内的销售额和利润。输出统计信息时,要按从大到小进行排序。(根据个人能力,至少实现一种统计功能)
    二 程序设计与实现2.1 概要设计在定义商品的类别时采用了枚举类型,并定义Food=1,因此在程序中阿拉伯数字1,2,3,4即分别代表食品,化妆品,日用品,饮料这四种商品。
    系统类的关系图如下所示:

    2.1.1 系统的类层次在定义商品基本信息时采用了结构体类型,即定义了一个structGoods,其中包含类别,名称,品牌,价格,数量等信息,同时包含struct Date表示入库时间,包含enum GoodsType表示商品类别。
    定义class GoodsManage包含各成员函数进行对商品信息的管理,其中包含DisplayMainMenu(),AddGoodsInfo(),DisplayGoodsInfo(),SearchByCode()等成员函数。
    系统的类层次关系图如下图所示:


    2.1.2 主程序流程如下图所示:

    2.2 详细设计2.2.1 各类的描述商品类别
    //商品类别enum GoodsType{ Food=1, //食品 Cosmetic, //化妆品 Commodity, //日用品 Drink //饮料};
    入库时间
    //入库时间struct Date{ int year; int month; int day;};
    ((商品基本信息**
    //商品基本信息struct Goods{ string code; //商品编号 string name; //商品名称 string brand; //生产厂家 double price; //商品价格 int num; //商品数量 GoodsType type;//商品类别 Date date; //入库时间 Goods *next;};
    商品售出信息
    //商品售出信息struct SellRecord{ Goods sellGoods; //已出售的商品 int sellNum; //出售数量 double sellPrice;//出售价格 Date date; //出库日期 SellRecord *next;};
    商品管理
    //商品管理class GoodsManage{public: GoodsManage(); ~GoodsManage(){} void DisplayMainMenu(); //主菜单显示 void AddGoodsInfo(); //添加商品信息 void DisplayGoodsInfo();//浏览商品信息 void SearchByCode(); //按照商品编号搜索商品信息 void SearchByName(); //按照商品名称搜索商品信息 void SearchByType(); //按照商品类别搜索商品信息 void SearchByBrand(); //按照商品品牌搜索商品信息 void EditGoodsInfo(); //编辑商品信息 void DeleteGoodsInfo(); //删除商品信息 void SellGoodsInfo(); //出售商品信息 void SaveGoodsInfo(); //保存商品信息private: int amount; //商品量 int DeleteAmount; Goods *head; Goods *DeleteHead;};
    2.2.2 成员函数定义构造函数
    //定义构造函数GoodsManage::GoodsManage(){ amount=0; DeleteAmount=0; head=new Goods; head->next=NULL; DeleteHead=new Goods; DeleteHead->next=NULL;}
    2.主菜单显示函数
    //定义主菜单函数void GoodsManage::DisplayMainMenu(){ cout<<" ━═☆┈━═☆┈━═☆┈━═☆┈━═☆┈━═☆┈━═☆┈━═☆━═☆\n"; cout<<" ┋ ┋\n"; cout<<" ┋ 欢迎使用商品库存管理系统 ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ 【商品进货】…(a) ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ 【商品编辑】…(b) ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ 【商品删除】…(c) ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ ┋【按照编号查询】…(d) ┋\n"; cout<<" ┋ ┋ ┋\n"; cout<<" ┋ ┋【按照名称查询】…(e) ┋\n"; cout<<" ┋ 【商品查询】┋ ┋\n"; cout<<" ┋ ┋【按照类别查询】…(f) ┋\n"; cout<<" ┋ ┋ ┋\n"; cout<<" ┋ ┋【按照品牌查询】…(g) ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ 【商品出货】…(h) ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ 【商品统计】…(i) ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ 【信息保存】…(j) ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ ┋\n"; cout<<" ┋ 退出系统…(k) ┋\n"; cout<<" ┋ ┋\n"; cout<<" ━═☆┈━═☆┈━═☆┈━═☆┈━═☆┈━═☆┈━═☆┈━═☆━═☆\n"; cout<<"\n 请输入你要进行的操作编号:";}
    添加商品信息函数
    //定义添加商品信息函数voidGoodsManage::AddGoodsInfo(){ char c,c1; Goods tail=head,p; bool flag; cout<<" ☆☆☆☆☆☆现在进行商品信息的添加☆☆☆☆☆☆ "<<endl; while(tail->next!=NULL) tail=tail->next; do { flag=0; p=new Goods; cout<<"请选择商品类别:"<<endl; cout<<"1.食品 2.化妆品3.日用品 4.饮料"<<endl; cout<<"请输入相应编号:"; do { cin>>c1; if(c1>='1'&&c1<='4')//判断用户输入编号是否存在 flag=1; else { cout<<"您输入的编号不存在!"<<endl; cout<<"请选择正确的商品类别:"<<endl; } }while(flag==0);//输入编号存在时跳出循环 if(c1=='1') p->type=Food; if(c1=='2') p->type=Cosmetic; if(c1=='3') p->type=Commodity; if(c1=='4') p->type=Drink; cout<<"商品类别("<<p->type<<")"<<endl;//表示商品类别 cout<<"请输入商品编号: "; cin>>p->code; do { Goods *q=head->next; while(q!=NULL&&q->code!=p->code) q=q->next; if(q==NULL) flag=1; else { cout<<"存在该编号的货物!!!请重新输入编号:"; cin>>p->code; } }while(flag==0); cout<<"请输入商品名称:"; cin>>p->name; cout<<"请输入生产厂家:"; cin>>p->brand; cout<<"请输入商品价格:"; cin>>p->price; cout<<"请输入商品数量:"; cin>>p->num; cout<<"请输入入库时间(年/月/日):"; cin>>p->date.year>>p->date.month>>p->date.day; tail->next=p; p->next=NULL; tail=p; amount++;//商品量加一 cout<<"数据输入成功!!!想继续添加吗(y/n):"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!!!<请输入y/n>"<<endl; cout<<"数据添加成功!!!想继续输入吗(y/n):"; cin>>c; } }while(c=='y'); cout<<endl; cout<<"……信息处理完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar();}
    统计商品信息函数
    //定义商品信息浏览函数void GoodsManage::DisplayGoodsInfo(){ Goods *p=head; cout<<" ☆☆☆☆☆☆现在进行商品信息的浏览☆☆☆☆☆☆ "<<endl; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; while(p->next!=NULL) { p=p->next; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; } cout<<endl; cout<<"……信息统计完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar();}
    按照编号查找商品信息函数
    //按照商品编号查找商品信息void GoodsManage::SearchByCode(){ char c; Goods *p; bool flag; string FoundCode; cout<<" ☆☆☆☆☆☆现在进行商品信息的查找☆☆☆☆☆☆ "<<endl; do { p=head; flag=0; cout<<"请输入您要查找的商品编号:"; cin>>FoundCode; while(p->next!=NULL) { p=p->next; if(p->code==FoundCode) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; break; } if(flag==0) { cout<<"对不起,您查询的商品不存在!!!"<<endl; cout<<"您想要继续查找吗(y/n):"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!<请输入y/n>:"<<endl; cout<<"您想要继续查找吗(y/n):"; cin>>c; } } } }while(c=='y'); cout<<endl; cout<<"……信息查找完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar();}
    按照名称查找商品信息函数
    //按照商品名称查找商品信息void GoodsManage::SearchByName(){ char c; Goods *p; bool flag; string FoundName; cout<<" ☆☆☆☆☆☆现在进行商品信息的查找☆☆☆☆☆☆ "<<endl; do { p=head; flag=0; cout<<"请输入您要查找的商品名称:"; cin>>FoundName; while(p->next!=NULL) { p=p->next; if(p->name==FoundName) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; break; } if(flag==0) { cout<<"对不起,您查询的商品不存在!!!"<<endl; cout<<"您想要继续查找吗(y/n):"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!<请输入y/n>:"<<endl; cout<<"您想要继续查找吗(y/n):"; cin>>c; } } } }while(c=='y'); cout<<endl; cout<<"……信息查找完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar();}
    按照类别查找商品信息函数
    //按照商品类别查找商品信息void GoodsManage::SearchByType(){ char c; Goods *p; bool flag; int FoundType; cout<<" ☆☆☆☆☆☆现在进行商品信息的查找☆☆☆☆☆☆ "<<endl; do { p=head; flag=0; cout<<"请输入您要查找的商品类别:"; cin>>FoundType; while(p->next!=NULL) { p=p->next; if(FoundType==1&&p->type==Food) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; } else if(FoundType==2&&p->type==Cosmetic) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; } else if(FoundType==3&&p->type==Commodity) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; } else if(FoundType==4&&p->type==Drink) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; } if(flag==0) { cout<<"对不起,您查询的商品不存在!!!"<<endl; cout<<"您想要继续查找吗(y/n):"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!<请输入y/n>:"<<endl; cout<<"您想要继续查找吗(y/n):"; cin>>c; } } } }while(c=='y'); cout<<endl; cout<<"……信息查找完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); etchar();}
    按照品牌查找商品信息函数
    //按照品牌查找商品信息void GoodsManage::SearchByBrand(){ char c; Goods *p; bool flag; string FoundBrand; cout<<" ☆☆☆☆☆☆现在进行商品信息的查找☆☆☆☆☆☆ "<<endl; do { p=head; flag=0; cout<<"请输入您要查找的商品品牌:"; cin>>FoundBrand; while(p->next!=NULL) { p=p->next; if(p->brand==FoundBrand) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; break; } if(flag==0) { cout<<"对不起,您查询的商品不存在!!!"<<endl; cout<<"您想要继续查找吗(y/n):"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!<请输入y/n>:"<<endl; cout<<"您想要继续查找吗(y/n):"; cin>>c; } } } }while(c=='y'); cout<<endl; cout<<"……信息查找完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar();}
    编辑商品信息函数
    //定义编辑商品信息函数void GoodsManage::EditGoodsInfo(){ char c; Goods *p; bool flag=0; string EditCode; cout<<" ☆☆☆☆☆☆现在进行商品信息的编辑☆☆☆☆☆☆ "<<endl; do { p=head->next; flag=0; cout<<"请输入您要修改的货物编号:"; cin>>EditCode; while(p->next!=NULL&&p->code!=EditCode) p=p->next; if(p->code==EditCode) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; cout<<"确认修改吗?<y/n>"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!!<请输入y/n>:"; cin>>c; } if(c=='y') { cout<<"请输入商品名称:"; cin>>p->name; cout<<"请输入生产厂家:"; cin>>p->brand; cout<<"请输入商品价格:"; cin>>p->price; cout<<"请输入商品数量:"; cin>>p->num; cout<<"请输入入库时间(年/月/日):"; cin>>p->date.year>>p->date.month>>p->date.day; cout<<"修改成功!"<<endl; } else cout<<"取消成功!"<<endl; } if(flag==0) { cout<<"对不起,您修改的货物不存在!!"<<endl; } cout<<"您想要继续修改吗?(y/n):"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!<请输入y/n>:"<<endl; cout<<"您想要继续修改吗?(y/n):"; cin>>c; } }while(c=='y'); cout<<endl; cout<<"……信息编辑完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar();}
    删除商品信息函数
    //定义商品信息删除函数void GoodsManage::DeleteGoodsInfo(){ Goods q=head,p,*tail=DeleteHead; p=new Goods; char c; string Dename; bool flag=0; while(tail->next!=NULL) tail=tail->next; cout<<" ☆☆☆☆☆☆现在进行商品信息的删除☆☆☆☆☆☆ "<<endl; do { cout<<"请输入您要删除的商品名称:"; cin>>Dename; while(q->next!=NULL&&q->next->name!=Dename) q=q->next; if(q->next!=NULL) { flag=1; cout<<"确认删除吗?<y/n>"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!!<请输入y/n>:"; cin>>c; } if(c=='y') { p=q->next; q->next=q->next->next; tail->next=p; tail=p; tail->next=NULL; DeleteAmount++; amount--; cout<<"删除成功!!"<<endl; } else cout<<"取消成功!!!"<<endl; } if(flag==0) { cout<<"对不起,您删除的商品不存在!!!"<<endl; } cout<<"您想要继续删除吗?(y/n):"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!<请输入y/n>:"<<endl; cout<<"您想要继续删除吗?(y/n):"; cin>>c; } flag=0; q=head; }while(c=='y'); cout<<endl; cout<<"……信息删除完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar();}
    出售商品信息函数
    //定义商品出库函数void GoodsManage::SellGoodsInfo(){ int sellNum,year,month,day; doublesellPrice,sum=0.0,profit=0.0; char c; Goods *p; bool flag=0; string EditName; cout<<" ☆☆☆☆☆☆现在进行商品的出售☆☆☆☆☆☆ "<<endl; do { p=head->next; flag=0; cout<<"请输入您要出售的商品名称:"; cin>>EditName; while(p->next!=NULL&&p->name!=EditName) p=p->next; if(p->name==EditName) { flag=1; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; cout<<"确认出售吗?<y/n>"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!!<请输入y/n>:"; cin>>c; } if(c=='y') { cout<<"请输入出售的商品数量:"; cin>>sellNum; if(sellNum<=p->num) { p->num=p->num-sellNum; cout<<"请输入出售的商品价格:"; cin>>sellPrice; cout<<"请输入出货日期:"; cin>>year>>month>>day; sum=sellNum*sellPrice; profit=sellNum*(sellPrice-p->price); cout<<"此次销售额为: "<<sum<<endl; cout<<"此次利润为: "<<profit<<endl; cout<<"出货日期为:"<<year<<"/"<<month<<"/"<<day<<endl; } else { cout<<"库存不足!出库失败!"<<endl; } } else cout<<"取消成功!"<<endl; } if(flag==0) { cout<<"对不起,您出售的货物不存在!!"<<endl; } cout<<"您想要继续出售吗?(y/n):"; cin>>c; while(c!='y'&&c!='n') { cout<<"指令错误!!!<请输入y/n>:"<<endl; cout<<"您想要继续出售吗?(y/n):"; cin>>c; } }while(c=='y'); cout<<endl; cout<<"……出库完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar();}
    保存商品信息函数
    //定义商品信息保存函数void GoodsManage::SaveGoodsInfo(){ Goods *p=head; cout<<" ☆☆☆☆☆☆现在进行商品信息的保存☆☆☆☆☆☆ "<<endl; ofstream output("货物信息.txt",ios::out);//定义输出文件"货物信息.txt" if(!output) { cerr<<"打开文件<货物信息.txt>失败!!!"<<endl; } output<<amount<<"\n"; cout<<setiosflags(ios::left)<<setw(10)<<"编号"<<setw(16)<<"名称"<<setw(10)<<"生产厂家"<<setw(10)<<"价格"<<setw(10)<<"商品类别"<<setw(10)<<"数量"<<setw(10)<<"入库时间"<<endl; while(p->next!=NULL) { p=p->next; output<<p->code<<"\t"<<p->name<<"\t"<<p->brand<<"\t"<<p->price<<"\t"<<p->num<<"\t"<<p->type<<"\t"<<p->date.year<<"\t"<<p->date.month<<"\t"<<p->date.day<<"\n"; cout<setiosflags(ios::left)<<setw(10)<<p-code<<setw(16)<<p->name; cout<<setw(10)<<p->brand<<setw(10)<<p->price<<setw(10)<<p->type; cout<<setw(10)<<p->num<<p->date.year<<"/"<<p->date.month<<"/"<<p->date.day<<endl; } cout<<endl; cout<<"成功将货物信息保存到<货物信息.txt>"<<endl; cout<<"……信息保存完毕……"<<endl; cout<<"……按任意键返回主菜单……"<<endl; getchar(); getchar(); output.close();//关闭输出文件}
    2.2.3 算法流程图添加商品信息函数流程如下所示:

    浏览商品信息函数流程如下所示:

    按照商品编号搜索商品信息函数流程如下所示:

    按照商品名称搜索商品信息函数流程如下所示:

    按照商品类别搜索商品信息函数流程如下所示:

    按照商品品牌搜索商品信息函数流程如下所示:

    编辑商品信息函数流程如下所示:

    删除商品信息函数流程如下所示:

    出售商品信息函数流程如下所示:

    保存商品信息函数流程如下所示:

    三 运行测试程序主菜单

    添加商品信息

    编辑商品信息

    删除商品信息

    按照编号搜索商品信息

    按照类别搜索商品信息

    按照名称搜索商品信息

    按照品牌搜索商品信息

    出售商品信息

    保存商品信息

    统计商品信息
    5 评论 75 下载 2018-10-18 22:21:00 下载需要14点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思JAVA和Oracle数据库实现的项目信息管理系统

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

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

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

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


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




    w_id
    VARCHAR2
    4
    员工编号


    w_name
    VARCHAR2
    16
    员工姓名


    sex
    CHAR
    2
    员工性别


    age
    CHAR
    20
    员工年龄


    contract_date
    DATE

    合同日期


    d_id
    VARCHAR2
    4
    部门编号


    d_name
    VARCHAR2
    12
    部门名称


    post
    VARCHAR2
    6
    员工职务



    2.2.2 部门表


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




    d_id
    VARCHAR2
    4
    部门编号


    d_name
    VARCHAR2
    12
    部门名称


    m_id
    VARCHAR2
    4
    部门经理编号


    m_name
    VARCHAR2
    8
    部门经理姓名


    w_num
    NUMBER

    员工人数



    2.2.3 项目表


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




    p_id
    VARCHAR2
    4
    项目编号


    p_name
    VARCHAR2
    16
    项目名称


    d_id
    VARCHAR2
    4
    部门名称


    w_id
    VARCHAR2
    4
    项目经理编号


    fund
    FLOAT
    126
    项目经费


    type
    VARCHAR2
    4
    项目类型


    signing_time
    DATE

    签订时间


    complete_time
    DATE

    应完成时间


    check_time
    DATE

    验收时间


    remarks
    VARCHAR2
    8
    备注



    2.2.4 设备表


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




    e_id
    VARCHAR2
    4
    设备编号


    e_name
    VARCHAR2
    12
    设备名称


    fee
    FLOAT

    设备费用


    supplier
    VARCHAR2
    12
    供应商


    p_id
    VARCHAR2
    4
    项目编号


    remarks
    VARCHAR2
    8
    备注



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

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

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

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

    6 用户手册6.1 安装及配置本系统狗万 赢钱ok_狗万新闻_狗万什么意思意思Java开发,要使用本系统在本机上必须安装有Java开发环境,数据库使用Oracle。
    6.2 使用方法登录界面

    主界面

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

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

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

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

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

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

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


    在项目页面

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

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

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

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

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

    1、概述
    开发环境

    Windows10EclipseTomcat 9.0Mysql 8JDK 10
    运行环境

    Tomcat 9.0Mysql 8Chrome 71

    2、系统的需求分析2.1 系统可行性分析本系统是采用Java Web技术的B-S架构的网站,用到的技术有Java EE 、CSS、JavaScript、Ajax。为了使用的效果以及开发的简便,在前端使用了CSS的Bootstrap及其UI组件框架,JS的Jquery库以及Ajax技术。在线音乐是获取的外部站点的API提供查询服务,并且每一次播放在线音乐会将其数据保存到本地数据库。本地音乐是从本地数据库中获取数据展现到用户界面。
    2.2 系统功能描述2.2.1 用户管理
    用户注册:用户可以点击注册按钮进入注册界面,注册属于自己的账号
    用户登录:用户使用自己的账号登录系统
    用户设置:可点击个人设置,修改个人信息,例如昵称,头像等

    2.2.2 播放界面
    音乐播放[播放与暂停]:对在播放器中的音乐进行播放和暂停
    音量调节:对正在播放器中的音乐的音量大小进行调节

    2.2.3 歌单与音乐管理
    歌单管理:对歌单的增删查改
    音乐管理:将音乐添加进歌单,将音乐从歌单中删除

    2.2.4 音乐搜索
    在线搜索:在网络上搜索获取音乐资源
    系统乐库:获取系统所在服务器上的音乐资源

    2.3 系统的数据流图
    2.4 系统UML建模设计
    2.5 系统的状态图登陆模块状态图

    登陆模块状态图

    2.6 系统的UML类图本系统后台总共使用了四个包,其功能与关系如下。

    utils:封装了连接数据库和关闭数据库的操作
    dto:包含封装了某个对象的所有信息的类
    dao**:封装了对数据库的操作
    servlets:包含处理前端发送的各种信息的servlet

    以上四个包都位于cn.edu.whpu.music包下,它们的关系如下图所示。

    3、系统总体设计3.1 系统结构方框图
    3.2 各模块功能用户信息模块
    包含功能有用户的注册,用户的登录,用户个人信息的修改和用户个人信息的展示。
    搜索音乐模块
    包含功能有在线音乐搜索,本地乐库搜索。
    歌单管理模块
    包含功能有添加新的歌单,修改歌单信息,删除歌单。
    收藏歌曲模块
    包括添加音乐到指定歌单,从歌单中删除音乐。
    3.3 详细的UML类图用户信息模块


    DBManager:封装了连接数据库和关闭数据库的操作
    UserDTO:封装了用户个人信息的类
    UserDAO:封装了操作用户个人信息的类
    UserRegistServlet:用户注册的servlet
    UserLoginServlet:用户登录的servlet
    EditUserInfoServlet:修改用户个人信息的servlet

    搜索音乐模块(本地乐库)


    DBManager:封装了连接数据库和关闭数据库的操作
    MusicDTO:封装了音乐信息的类
    MusicDAO:封装了操作音乐信息的类
    LocalMusicServlet:处理点击本地乐库按钮后的请求并返回数据的servlet

    注:在线音乐搜索是用ajax请求的网络上的API接口获取数据并渲染到主页面,与该处的servlet无关。
    歌单管理模块


    DBManager:封装了连接数据库和关闭数据库的操作
    MusicListDTO:封装了歌单信息的类
    MusicListDAO:封装了操作歌单信息的类
    AddMusicListServlet:添加歌单信息的servlet
    InitMusicListServlet:通过用户ID查询并返回其对应的歌单的servlet
    DeleteMusicListServlet:删除歌单的servlet
    UpdateMusicListServlet:更新歌单的servlet
    ShowMusicsFromListServlet:通过用户ID和歌单ID查询并返回其对应的歌单的servlet

    收藏歌曲模块


    DBManager:封装了连接数据库和关闭数据库的操作
    MusicDTO:封装了音乐信息的类
    MusicDAO:封装了操作音乐信息的类
    ListMusicRelationDTO:封装了音乐与歌单对应关系信息的类
    ListMusicRelationDAO:封装了操作音乐与歌单对应关系信息的类
    CollectionMusicServlet:收藏音乐进入指定歌单的servlet
    CancelCollectMusicServlet:从歌单取消某音乐收藏的servlet

    3.4 设计数据管理子系统因为使用java编写的并发量不是特别大的后台程序,所以使用了更为轻量级的mysql 8。其好处有如下几点:

    普及性:MySQL在过去两年已经获得了25%的市场份额。相比其他的开源数据库和闭源数据库,越来越多的开发者将继续选择MySQL。MySQL在业界的流行所带来的另一个好处是,人们总可以很轻松地发现本行业的解决方案
    简单性:对于MySQL数据库,无论是在开发方面,还是支持方面,现在有大量强大的工具可以选择。每一个新手开发者可以轻松地使用MySQL数据库进行开发。甚至一个有经验的Windows管理者也可以轻松部署并开始学习它,不需投入一分钱来了解这个数据库
    低成本:MySQL数据库归MySQL AB公司所有,但是这个软件是开源的,有一个社区版可以免费下载。稍俱常识的新入门者都可以轻松实现在一个常见硬件上安装和配置MySQL。MySQL对硬件的较低要求是其最大的优势之一,不过需要注意的是:内存越多越好,因为所有的重要数据存储都在内存中完成。一个免费的数据库意味着,更多珍贵的资金可以用于其他业务的启动,诸如市场、广告或调研和开发等

    3.5 系统E-R图
    系统E-R图如上图所示。主要逻辑有:

    一个用户在某一时刻只能播放一首歌曲
    一个用户可以创建n个歌单
    一个音乐可以被n个歌单收藏,一个歌单也能收藏n首音乐

    3.6 数据库表
    本系统该次设计了四张表:

    tb_users表记录用户信息
    tb_musiclists表
    tb_list_music表
    tb_musics表

    3.7 数据库表之间的关系关系1
    tb_users表和tb_musiclists表是一对多的关系。其中tb_musiclists中表的list_uid字段必须遵照tb_users表中的user_id。即一个用户可以有多个歌单,而一个歌单只能由一个用户。

    关系2
    tb_musiclists表和tb_musics表是多对多的关系,并且tb_list_music表记录了它们之间的对应关系。tb_list_music表中lid参照tb_musiclists中的list_id字段,tb_list_music表中mid参照tb_musics中的music_id字段。并且lid与mid作为该表的联合主键。即一个歌单可以收藏多首音乐,一个音乐也能被多个歌单收藏。

    3.8 数据库表结构tb_users表

    tb_musics表

    tb_musiclists表

    tb_list_music表

    3.9 设计人机交互子系统3.9.1 登陆界面登录界面引用了jquery.video库,将登录的背景设置为一个动态的循环播放的视频,极具科技感和新鲜感。
    3.9.2 注册界面注册界面沿袭登陆界面的大体设计,并在注册信息上使用了jquery.validate库对于用户输入注册所需要的信息进行了初步的判断,避免录入冗余、错误的信息。
    规则有:

    用户名:必须输入,长度为6-20个字符
    密码:必须输入,长度为8-16个字符
    重复密码:必须输入,必须与密码一致
    用户昵称:必须输入,长度为20字符以内
    性别:必须选择
    头像:必须上传

    3.9.3 主界面整体布局
    使用一个界面避免用户进行跳转。采用bootstrap框架的栅栏式布局。大致布局如下图所示。

    顶部导航栏
    整体采用bootstrap的导航栏样式,如下图所示。左侧依次为Logo区,在线搜索区和本地乐库区。当在在线搜索的输入框中输入内容,并点击搜索按钮后,会在主界面呈现出搜索内容。当点击本地乐库按钮后,会在主界面呈现出系统自带的音乐列表。

    右侧为用户栏,点击歌单按钮会弹出“添加歌单”、“管理歌单”功能按钮。点击“添加歌单”按钮会弹出模态框。点击管理歌单会在歌单栏出现编辑和删除按钮。点击消息按钮会弹出“查看消息”功能按钮。点击用户按钮会弹出“修改信息”和“退出”功能按钮。点击修改信息会弹出修改用户信息的模态框。详情在模态框中介绍。
    主区域

    主界面大致分为左、中、右三个区域。按照1:2:1的分配区域。在点击导航栏中的“管理歌单按钮后”,歌单区域进入编辑模式。点击主区域的播放按钮和收藏按钮,歌单区的编辑和删除,用户区的头像均会弹出模态框。详情在模态框中介绍。
    唱片CD会在歌曲播放的时候旋转如下图所示。

    播放器区域
    播放器方面我们开发小组认为原生的AUDIO标签还有市面上找到的播放器插件不契合我们的样式,于是从5sing音乐网站的播放器部分借鉴了样式,并为静态的样式添加了拖动歌曲进度,实时显示已经播放时间,和调节音量大小的动态效果。其主要布局和功能如下图所示。

    模态框
    为了使界面不发生跳转,我们将主界面中所有的操作运用了bootstrap的模态框UI组件。在点击“歌单➡添加歌单”,“用户➡修改信息”,“歌曲➡收藏按钮”,“用户➡头像”,“歌单列表➡修改”,“歌单列表➡删除”时均会弹出相应的模态框组件。


    整体效果

    4、详细设计4.1 登陆注册模块流程图
    4.2 在线搜索模块流程图
    4.3 本地乐库模块流程图
    4.4 歌单管理模块流程图
    5、总结通过为期五天的课设,我收获颇多。最直观的感受就是在这次在线音乐网站的开发中能够系统性的运用从大一到现在所学到的知识。新学习到的Servlet的知识更是让我明白了为何之前写过的html只能叫做静态页面,还有一个网站的前端是如何与后台进行数据交互。同时这次也让我从平时的文件级别的代码编写上升到了工程级别的项目开发。在其中更好了理解了这个学期学过的关于软件开发的步骤。认识到了文档编写在软件项目开发中不可替代的重要性。我觉得收获最深的地方就是以前只觉得写代码才是最重要的部分,现在明白了项目管理、需求分析、文档编写才是项目开发中更重要的部分。让我把眼界从代码拓宽到了更高的层次。同时还深刻认识到自己在项目开发领域还存在着诸多的不足,明白了以后要学习的地方还有许多。
    当然,在项目开发期间也遇到过许多问题:
    老师教授的是用后台修改动态数据,而我们想将前端和后台完全分离,这就存在了一个如何将后台数据打包成JSON发送到前端的问题。
    解决方案:在老师的指导下使用了阿里巴巴公司的fastjson这个jar包来打包数据。同时在前端使用了axios来实现通信和局部页面刷新。
    因为一开始没有编写规范的文档,导致在开发途中想要增加功能的时候会发现不知道更改项目的哪个地方。他人接手编写的时候还要重新看一遍代码,效率低下。
    解决方案:停下开发工作,转头编写规范的文档,统一了数据库和测试数据。并且集中到一起开发,使得遇到什么问题小组成员之间可以很快的交流并解决。
    每个人有自己的代码编写风格,而为了赶时间没有在文件中书写规范的注释。结果在互相测试小组成员单元时发现看不懂对方的代码,导致浪费极多时间。
    解决方案:就算再赶时间也要书写规范的注释,写明类的用途,写明方法的用途以及接受参数和返回参数的类型、作用,这样在测试或者修改的时候会节省大量时间。
    在开发过程中想要对功能进行增加、删除、修改或者是想要复用一段代码时发现代码编写冗余没有规范。导致代码难以维护、复用程度低,重构成本极高。
    解决方案:在将来的项目开发中一定要灵活运用设计模式,设计模式是前辈留给我们的解耦、复用代码的成功经验,虽然使用设计模式在编写的时候可能会造成困难,但是在维护、更新的时候会体现出设计模式的优越性。
    4 评论 59 下载 2019-04-16 15:00:02 下载需要14点积分
  • 狗万 赢钱ok_狗万新闻_狗万什么意思意思ASP.NET和Sql Server实现的读书平台网站

    1 课程设计目的综合运用软件工程思想、面向对象分析和设计方法、ASP.NET、数据库等基础知识,完成一个B/S架构的Web应用程序,掌握应用ASP.NET技术开发中小型网站的相关知识和技术。
    2 课程设计内容针对一个咸鱼读书网系统项目需求,利用数据库管理系统(Microsoft Sql Server 2012),构建项目数据库系统。利用 Visual Studio 集成开发环境,采用ASP.NET技术、C#语言、WEB Forms窗体设计技术、LINQ数据访问技术、三层架构等,完成系统界面设计和功能开发,并对系统进行功能测试。
    3 课程设计工具和平台
    Microsoft Sql Server 2012
    Microsoft Visual Studio 2013
    Windows 7操作系统
    PC机一台
    实验/课程设计项目指导书和相关参考书籍,网络资源等

    4 项目开发步骤逻辑层的逻辑判断和数据层的部分判断。大致有用户登录信息的匹配,用户注册是否重复,用户留言是否多次对同一本留言,按时间或者评分对图书的排序,评分的计算方法,留言内容的写入。
    一开始的时候只想到数据层访回图书类组给逻辑层,但是没想到当查询数量为空时的返回值,所以当时我就走去在数据层自己写几个关于结果为空时的返回函数,这也是分工前对自己的需求不明确导致后来大家都有点乱和耽误了进度。
    4.1 需求分析(功能模块分析与数据库设计)4.1.1 系统功能分析从实体类中得知类的类名和有关的数据类型,完成以下逻辑功能。
    当进入页面的导航栏有三个有关按序查书的功能


    读书:按数据库的默认查询排序
    最新书籍:按图书的上传时间排序(由大到小)
    精彩书籍:按图书的评分排序(由高到低)

    其中首页中的图书显示也是根据这两个排序取靠前几个来完成展示:最新书籍的六本流水形式展示的图书是按照最新书籍的类组的前六个类组显示,同理,精彩图书则按照精彩书籍的类组的前三个类组显示。
    用户登录与留言评分
    在查询书本信息之前需要登录用户,评论的信息将会存到一个表中,如果重复评论打分一本书则会出现相应的提示。

    图书信息

    通过页面反馈ISBN码进行图书信息查询,获得图书类,图片显示和作品简介都是以文件路径的形式在数据库储存,所以获取之后还要进行一番读文件流。

    按需查询书籍
    通过LINQ进行模糊查询,自动适应书名、作者或者ISBN的关键字查询功能。

    4.1.2 数据库和表设计建立构建数据库:主要有书籍信息表,留言表和用户表。

    书籍信息表:书名,作者,出版社,时间,页数,价格,ISBN,图片地址,评分,简介地址。



    字段名
    数据类型
    备注




    BookName
    varchar(50)
    主键


    Writer
    varchar(50)



    PublishingHouse
    varchar(50)



    Time
    date



    Page
    int



    price
    float



    ISBN
    char(15)



    Photo
    varchar(500)



    Score
    float



    Introduction
    varchar(500)



    留言表:有ISBN码标识所留言的书本,留言板会显示用户名,留言信息,时间和打分分数,最后在设置一个自增的number,如果没有这个自增number作为主键。起初使用UserID为主键,可能所有书都存在都一表中,所以写留言到数据库留言表的时候,会发生主键冲突,所以设置这个自增量number。



    字段名
    数据类型
    备注




    ISBN
    char(40)



    UserID
    char(5)



    TextContent
    char(100)



    PostTime
    date



    Score
    float



    number
    int
    主键



    用户表:用户的账号和密码,其中可填写Email。



    字段名
    数据类型
    备注




    UserID
    char(5)
    主键


    PassWord
    char(15)



    Email
    char(20)
    允许为空



    在最后一天整合代码时发生一个关于图片的路径的问题,因为我在逻辑层写函数使用GridView控件调试数据,在GridView中图片路径使用“~\img\xxxx.jpg”带有波浪号形式的路径是可以在GridView中正确显示相对路径的图片,但在前端的src上就显示不了,得使用“\img\xxx.jpg”去掉“~”的形式才能正确找到相对路径的图片。
    数据库导入关系和各表的主键设计

    4.2 系统设计与实现4.2.1 用户逻辑的实现用户登录与注册的信息判断(ID和密码匹配,注册账号不重复)。
    从数据库中通过LINQ 在表中查询是否存在匹配的信息,返回return或者false用户处理信息。相关代码如下:
    public class UserOperation{ //登录操作 public bool Sign_in(Customer register) { UserData user = new UserData(); //判断登录是否成功 if (user.JudgeUser(register)) { return true; } else { return false; } } //注册操作 public bool Sign_up(Customer register) { UserData user = new UserData(); //账号或者密码不能为空 if(String.IsNullOrEmpty(register.UserID) || String.IsNullOrEmpty(register.PassWord)) { return false; } //当前账号不存在时 if (user.JudgeRegister(register)) { user.Add(register); return true; } else { } }
    4.2.2 图书排序的实现图书的排序(最新图书和精彩图书)
    //时间比较int CompareTime(BookMessage a, BookMessage b){ return b.Time.CompareTo(a.Time);}//评分比较int CompareScore(BookMessage a,BookMessage b){ return b.Score.CompareTo(a.Score);}
    4.2.3 模糊查询的实现模糊查询

    相关代码如下:
    //模糊查询(ISBN,书名,作者)public IList<BookMessage> Fuzzy_Search(string text){ List<BookMessage> search_books = new List<BookMessage>(); //定义书本数组 //根据书本的ISBN、书名、作者 关键字 进行查询 var result = from r in BookDB.Book where (r.ISBN.Contains(text)) || (r.BookName.Contains(text)) || (r.Writer.Contains(text)) select r; foreach(var r in result) { BookMessage bookmessage = new BookMessage(); bookmessage.ISBN = r.ISBN; //ISBN bookmessage.BookName = r.BookName; //书名 bookmessage.Writer = r.Writer; //作者 bookmessage.Time = r.Time; //上传时间 bookmessage.Page = r.Page; //页数 bookmessage.PublishingHouse = r.PublishingHouse; //出版社 bookmessage.Price = (float)r.price; //价钱 ??(不强转float报错)?? bookmessage.Photo = r.Photo; //书本图片路径 bookmessage.Introduction = r.Introduction; //简介 bookmessage.Score = (float)r.Score; //评分默认为0 search_books.Add(bookmessage); //增加这个书本到数组 } return search_books; //返回书本BookMessage的数组}
    4.2.4 留言评分的实现发送留言以及分数计算

    相关代码如下:
    //发送留言public void PostLWord(LWord lword){ string LwordContent = lword.Leave_word; float LwordScore = lword.Score; string LwordISBN = lword.Getbook.ISBN; string LwordUserID = lword.Getcustomer.UserID; string LwordEmai = lword.Getcustomer.Email; DateTime LwordPostTime = new DateTime(); LwordPostTime = DateTime.Now; (new UserData()).PostLeaveWord(lword); (new BookData()).Average_Score((new BookData()).GetBook(LwordISBN)); //更新书本评分}//评分计算public void Average_Score(BookMessage book){ var result = from r in BookDB.LeaveWord where r.ISBN == book.ISBN select r; float sum = 0; //总分 float aver; //平均分 foreach(var r in result) { sum = sum + (float)r.Score; } aver = sum / (result.Count()); //算出平均分数 //找出图书 var result_book = from r in BookDB.Book where r.ISBN == book.ISBN select r; foreach(Book r in result_book) { r.Score = aver; //修改评分 } BookDB.SubmitChanges();}
    5 系统运行结果及测试分析成功完成咸鱼读书网系统的开发,并对系统进行了功能测试,系统运行和测试结果如下:

    留言系统能够正确录入数据库,但是时间获取失败。
    按需查询排序能够正确显示:

    原本打算读取文本在逻辑层完成,但是狗万 赢钱ok_狗万新闻_狗万什么意思意思实力原因在相对路径问题上出现些解决不了的问题,在逻辑层的相关测试代码如下:
    // 读取书本简介文本转换string类型public string GetIntroductionByISBN(string isbn){ string content = ""; BookMessage getbook = (new BookData()).GetBook(isbn); // 获取书本信息 string filepath = getbook.Introduction; // 获取文本路径 using (FileStream fs = new FileStream(filepath, FileMode.open, FileAccess.Read)) { interface fsLen = (int)fsLen.Length; byte[] heByte = new byte[fsLen]; int r = fsLen.Read(heByte, 0, heByte.Length); content = System.Text.Encoding.UTF8.GetString(heByte); } return content; }protected void Button1_Click(object sender, EventArgs e){ BookOperation introduction = new BookOperation(); string i = introduction.GetIntroductionByISBN("9787510862885"); Response.Write(i);}
    不知道出于什么原因,相对路径是在IIS的路径下,但当这些代码在.aspx中写的时候,便能正确访问相对路径,最终我们将代码写在aspx以实现功能,其原因还在探讨。

    6 总结和展望这次的ASP.NET程序设计实训,虽然时间比较紧凑,却让我所学到了很多实际运用的技能和拓展了很多课外的知识,特别是我第一次用三层架构形式小组合作,虽然在结合功能那天我们出现了一些因为沟通的漏缺和主键的问题的Bug,但是我们都积极修改代码一起合作将网站以最好的形式展现,在修改的时候更能发现小组合作的重要性,只要沟通理解正确,他们在改前端或数据库的同时我只要知道哪个值需求有更改就去改哪个值和返回什么值,在这种合作的形式下很多Bug都修好了。
    虽然这次的实训实现的功能未能如期实现,例如用户的收藏图书功能和管理员增删改图书的功能,因为这些代码在合并时都出现未能及时解决的Bug,这也是一种遗憾未能将我们的读书网以更好的形式展示,但是从中我也体会到合作成员之间明确的需求沟通重要性,在项目开始之前我们必须清楚自己需要什么参数,需要得到什么类型的值,需要返回什么类型的值等等。这些本来可以避免的问题最终还是出现了,经一事长一智,我相信通过本次三层架构的小组合作,在以后的合作实训项目会变得更好更清楚自己需要什么自己要做什么。
    2 评论 30 下载 2019-03-19 10:28:59 下载需要15点积分
显示 0 到 15 ,共 15 条
eject