分类

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

资源列表

  • 基于JSP实现的网上书店管理系统

    一、需求分析随着时代的发展,电子商务已经成为人们生活中必不可少的一部分。网上书店系统主要用来在网上买东西。本系统要实现如下功能:

    前端页面通过table标签来展示书本信息,消费者可以看到书本的价格,书本的名称,作者,简介,书本所属的类型,以及对该类型的介绍
    用户使用该系统,需要先登录系统,没有账户的用户,需要先注册一个账户,注册需要提供用户名,密码,手机,地址,邮箱等信息,本系统承诺,个人信息严格保密,只用于本系统的登录,不用做其他用途
    加入购物车,当用户挑到喜欢的东西后可以加入购物车,可以在我的购物车中查看
    后台页面,可以对书本进行增删改查

    二、概要设计2.1 数据库设计Book表



    字段名
    类型
    说明
    备注




    id
    Int
    书的序号
    主键


    name
    Varchar(11)
    书名



    author
    Varchar(10)
    书的作者



    price
    Varchar(6)
    书的价格



    image
    Varchar(50)
    书的图片



    description
    Varchar(50)
    对书本的描述



    category_id
    Varchar(50)
    书本所对应的书本类型
    有军事,科学,古典名著



    User表



    字段名
    类型
    说明
    备注




    id
    bigint
    用户序号
    主键


    username
    Varchar(11)
    用户名



    phone
    Varchar(10)
    电话号码



    email
    Varchar(6)
    邮政编码



    address
    Varchar(50)
    详细地址



    type
    Int(1)
    类型
    1为管理员0为普通用户



    category表



    字段名
    类型
    说明
    备注




    id
    Varchar(11)
    用户序号
    主键


    type
    Varchar(11)
    书本类型



    category_description
    Varchar(10)
    类型描述



    ategory表将配合Book表一起,实现内联查询。
    视图

    2.1 系统账号和密码说明
    用户账户:zhangsan密码:123
    管理员账户:zhangsan密码:123

    三、详细设计3.1 登陆页面分为管理员登录和用户登录。用户登录界面加了一些样式,看起来较为美观。用户界面有验证码。可以选择用户类型。

    3.2 注册界面注册页面需要提供用户名,密码,email,手机号,地址等,点击注册后将会把数据发送到后台页面。

    3.3 用户首页界面在首页界面中,将会从数据库中读出数据,并在前台页面展示,在前台的页面展示用的是table标签,里面做了一些简单的样式,其中图片模块,是将图片的相对路径存在数据库中,然后在table中用一个img标签来显示出来,有了图片后,整个界面更美观。
    首页页面联合查询了两张表,一张book表,一张是category表

    3.4 管理员界面在管理员界面中,可以对商品进行增加删除修改。

    3.5 我的购物车Map<Integer,CartItem>cart我的购物车是Map来作为购物车的容器,用map而不用list,是因为map不允许有重复的key值,也就是不用像list手动去判断,map中有的话,我们只需要将他的数量加1即可。然后将map容器放入session中,放入session中的目的是让其他页面也可以访问到购物车中的数据。
    我的购物车中可以简单的计算价格总额。


    3.5 对书本的增删改查增加

    修改

    删除

    3.6 搜索结果本系统支持搜索商品,并将搜索结果以table的形式展示出来,搜索完成后,可以点返回返回首页。

    四、心得体会本系统的难点是,用MVC的思维去开发,项目的目录结构怎么划分,表与表之间怎么建立关系,通过这次实验,我学会了如何封装数据库连接过程,如何采用分层开发的思想来使项目代码简化,以及怎么在数据库中建立视图,怎么将几张表通过外键关联起来。
    3 评论 71 下载 2019-04-11 19:43:23 下载需要10点积分
  • 基于java和Sql Server数据库的停车场管理系统

    一、实验内容:实现停车场管理系统,应用于车辆的出、入管理。
    二、功能要求:包括车辆进出管理与系统管理等功能模块,可根据车辆停放时间及收费标准自动收费。用户需要事先办理停车卡并充值,停车卡分优惠卡和普通卡两类。

    车场管理:车辆入场、车辆出场
    信息查询:某时间段的出入场信息,当前在场信息,车辆历史停车记录及收费信息
    信息维护:用户及停车卡信息维护、充值等
    系统管理:车位信息,计费标准等

    系统包含两类用户:管理员用户和普通用户。
    管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息、停车卡充值,查询计费标准。
    三、实验环境:
    Windows XP
    JDK 1.6
    Eclipse
    SQL Server
    备注:

    在XP平台开发DK(JavaDevelopment Kit)是Sun Microsystems针对Java开发员的产品Eclipse进行前台和程序设计,开发图形用户界面和停车收费功能实施
    SQL建立数据库

    四、需求分析与设计:4.1 需求分析:本软件具有如下主要功能:

    本系统包括两类用户:管理员用户和普通用户。管理员可以使用系统所有功能,普通用户只能查询车辆历史记录、用户信息(只限于个人信息)、查询计费标准、查询当前在场信息、查询出入场信息、当前可用车位信息、口令修改。具体模块划分为如下模块:车场管理模块、信息查询模块、信息维护模块、系统管理模块。
    车场管理模块:(应该分为车辆入场和车辆出场两部分)

    车辆入场功能描述:车辆进入停车场时进行登记,记录入场时间并指定车位。只有具有停车卡的车辆才可进场,没有办理停车卡的车辆,应先办理车卡。如果没有相应车位,不能入场;如果卡中余额低于100元,应先充值后再入场。满足条件的车辆,为其指定车位并记录入场时间。车卡分两种类型普通型和优惠型。车辆出场功能描述:车辆开出停车场时进行登记,记录出场的时间并进行自动收费(从卡上扣除)。根据车辆进场时间,出场时间及收费标准自动计算车主应该缴纳的费用。如果停车时间包含不足一小时的时间,超过30分钟按一小时计算,不足三十分钟不计算。如果卡上余额足够则直接扣除;如果卡上余额不足,则应先充值后再扣除相应费用。
    信息查询模块功能描述:在这个模块里用户可以查询出入场信息、当前在场信息、用户个人信息、用户历史记录、收费标准以及当前可用车位信息
    查询出入场信息功能描述: 查询当前在场信息户可以在这里查询到两种车位的总量及当前可有的车位数量。
    查询用户个人信息功能描述:登录的管理员可以根据卡号和名字查询用户信息。登陆的普通用户只可以查到自己的信息。
    查询用户历史记录功能描述:用户可以输入卡号查询相应卡号的历史记录,包括车位号、开始停车时间、结束停车时间、停车总时间、相应收取的费用。
    收费标准功能描述:用户可以在这里查询不同种类的车位和不同卡的计费标准。
    当前在场信息功能描述:用户可以在这里查询到当前在场的车辆信息,包括卡号,车位号,开始停车时间。
    当前可用车位信息功能描述:在这里用户可以查询当前可用的车位的信息,包括车位号、车位类型。
    信息维护模块在这个模块里用户可以实现用户注册、用户修改及用户充值
    用户注册功能描述:在这里管理员可添加新的用户(普通用户)。
    用户修改管理员在这里可以修改用户。这里会以表的形式显示所有的用户信息,包括用户的停车卡信息维护,充值信息等。管理员点击相应的一行用户信息,这行信息会自动填充到表下的面板里,用户可以在面板里修改用户信息,面板下面有两个按钮,修改、删除,点击相应的按钮可以实现相应的功能。
    用户充值功能描述:用户可以再这里查到自己的余额,并且可以在这里完成充值。
    系统管理模块功能描述:在这个模块里可以修改相应的车位信息计费标准、注册管理员、更改用户口令以及查看系统声明信息。
    管理员注册功能描述:管理员可以在这里添加新的管理员。
    更改口令功能描述:用户可以在这里更该自己的密码。注:操作员只可以修改自己的密码。
    计费标准管理功能描述:管理员可以在这里不同车位类型、不同车卡类型的收费标准。
    关于功能描述:用户可以在这里看到系统声明。

    4.2 界面设计登陆界面

    管理员主界面

    普通用户主界面

    车辆入场界面

    车辆出场界面

    计费标准界面

    当场在场信息界面

    用户历史信息界面

    用户个人信息界面

    普通用户个人信息界面

    出入场信息界面

    当前可用车位信息界面

    用户注册界面

    用户修改界面

    用户充值界面

    管理员注册界面

    更改口令界面

    计费标准管理界面

    关于界面

    五、数据库设计5.1 数据库关系图
    5.2 数据表的结构设计


    用户表:users








    字段名称
    数据类型
    可空
    默认值
    说明


    cardid
    int
    不可

    主键,用户的停车卡号


    name
    Nvarchar(20)
    不可

    用户姓名


    password
    Nvarchar(20)


    用户密码


    cardtype
    Nvarchar(20)


    停车卡类型


    userstype
    Nvarchar(20)


    用户类型


    carid
    int


    用户车牌号


    tel
    int


    用户电话号码


    overage
    int


    用户余额






    车位信息表:sit_infor








    字段名称
    数据类型
    可空
    默认值
    说明


    stationid
    int
    不可

    主键,车位号


    stationtype
    Nvarchar(20)
    不可

    车位类型






    停车收费卡收费表:charger








    字段名称
    数据类型
    可空
    默认值
    说明


    cardtype
    Nvarchar(6)


    车卡类型


    stationtype
    Nvarchar(20)


    车位类型(车卡类型与车位类型一起作为主键)


    charge
    int


    价格






    停车表:park








    字段名称
    数据类型
    可空
    默认值
    说明


    cardid
    int


    车卡号(外键)


    stationid
    int


    车位号(外键)


    parkid
    int

    1,每次增加一
    停车号,主键


    startpark
    datetime


    停车开始时间


    endpark
    datetime


    停车结束时间


    fee
    int


    停车的收费


    sumpark
    int


    停车总时间



    六、关键技术介绍6.1 在其他类中得到当前登录用户对象 实现方法:在LoginFrame类中设置两个静态方法,在其他类中只需要引入LoginFrame类,然后调用他的静态方法即可。方法体如下:
    public static users getUser() { return user; } public static void setUser(users user) { LoginFrame.user = user; }
    6.2 实现用户类型不同,主界面不同的功能 可以定义静态方法disMenu().当用户是普通用户时,调用disMenu()方法即可。具体实现如下
    public void disMenu() { mnuPark.setEnabled(false); mnuSever.setEnabled(false); mnuManZhuCe.setEnabled(false); mnuManCharge.setEnabled(false); } if(user.getUserstype().equals("管理员")) { MdiFrame frame1 = new MdiFrame();//创建一个主窗体 frame1.setVisible(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 } else {//判断用户名是否为null MdiFrame frame = new MdiFrame();//创建一个主窗体 frame.disMenu(); frame.setVisible(true);//设置其可见 LoginFrame.this.setVisible(false);//设置登录窗体为不显示 }
    6.3 怎么得到系统时间 SimpleDateFormat myfmt=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String a4 = myfmt.format(new java.util.Date()).toString();
    6.4 怎么计算时间差值 try { java.util.Date now = myfmt.parse(a3);//a3是系统当前时间(即出场时间) java.util.Date date=myfmt.parse(a7);//a7是入场时间 int l=(int) (now.getTime()-date.getTime());//计算毫秒差值 day=l/(24*60*60*1000);//获取天数 hour=(l/(60*60*1000)-day*24);//获得小时 min=((l/(60*1000))-day*24*60-hour*60);//获得分钟 } catch (Exception e1) { JOptionPane.showMessageDialog(null,"消费计算错误"); } if(min < 30)//如果分钟小于30分钟 a8 = day*24+hour; else //如果分钟大于30分钟 a8 = day*24+hour+1;
    6.5 怎么让布局更优美 使用布局管理器; GridBagLayout,以更改密码界面为例:
    getContentPane().setLayout(new GridBagLayout()); setBounds(234, 129, 285, 223); final JLabel label_5 = new JLabel(); label_5.setText("登 录 名:"); final GridBagConstraints gridBagConstraints_11 = new GridBagConstraints(); gridBagConstraints_11.gridy = 2; gridBagConstraints_11.gridx = 0; getContentPane().add(label_5, gridBagConstraints_11);
    七、系统实现功能结构图
    20 评论 592 下载 2018-11-19 09:31:15 下载需要10点积分
  • 基于C++的图书管理系统

    1 需求分析图书管理系统的功能如下:

    用户查找书目,可按照书名或者作者名查找
    用户添加或删除数目,添加书目时若原来存在,则增加数目;若不存在,则新建书 目;添加时可选择添加本数
    用户借阅或归还书目,可提示用户数目库存并根据借阅情况修改书目列表

    2 实现思路2.1 功能结构图
    本图书管理系统主要分为增加或删除,借阅或归还,查询三大模块,分别对增加,删除,借阅,归还和查询的操作进行管理。

    增加或删除模块中,对于增加模块,如果列表中存在这种书目,则增加库存;若不存在,则新建书目;当增加书目时,可选择增加数量
    而对于借阅或归还模块,如果用户想要借阅的书不存在,会返回与管理员联系的提示,否则显示本书库存
    归还模块中,如果不存 在要归还的书,会先新建书目,然后记录入列表。对于查询模块,可以按照书名查找或者按 照作者名查找,为用户提供了方便

    3 数据设计struct Book{ stringname; // 书名 stringauthor; // 作者名 intnum=0; // 现有数量 inttotal=0; // 总库存 };
    4 函数设计voidcheckbook(stringstr); // 通过书名查找书目voidcheckauthor(stringstr); // 通过作者查找书目voidborrowbook(stringstr); // 用户借阅书目子函数voidreturnbook(stringstr); // 用户归还书目子函数voidaddbook(stringstr); // 增加书目 voiddelebook(stringstr); // 删除书目 voiddesktop(); // 主菜单界面显示 voidreadlist(); // 从 booklist 文档中读取书目列表 voidbaocun(); // 将新更改信息写入 booklist 文档中
    5 输入输出通过系统主菜单界面提示,用 cin 读取用户每步操作,用 cout 输出信息,其中包括书名,作者名,现有数量,总库存等信息。
    程序主界面
    1 评论 63 下载 2018-11-05 22:08:15 下载需要3点积分
  • 基于Python的PyGame库实现的贪吃蛇小游戏

    1 项目介绍1.1 简介键盘上下左右控制蛇的前进方向,每吃到一个食物,蛇的长度增加一个单位,并生成一个新的食物,得分scores加一;当蛇撞到边界或自己时,游戏结束。时间time随蛇的步子增加,每走一步time加一。游戏结束后,按下空格键重新开始游戏,按下回车键结束游戏,退出。全程有音乐,退出后音乐也停止。
    1.2 开发环境
    开发语言:Python,pyCharm,pygame
    2 方案2.1 模块
    pygame
    sys
    random
    pyglet

    2.2 数据
    蛇类和食物类
    初始化窗口为600*600
    像素块为25*25
    蛇和食物都是正方形的结点

    2.3 接口
    蛇的身体设置为列表,初始化蛇有5节身体,依次递增
    食物为小正方形,随机生成,一次一个
    字体显示为函数控制

    2.4 类
    蛇类:初始化了各种有关蛇的属性。一开始初始化方向为向右,初始化蛇身为长度为五的列表。接着在蛇头处添加结点。再删除最后一个结点,判断是否死亡
    食物类:初始化食物小方块,随机设置食物位置,如果蛇吃到了食物,则抹掉了该食物,重新设置食物
    字体:设置字体,并且可以在窗口中显示

    2.5 流程
    先绘制窗口,设置窗口名字为“Snake Game”,设置时钟
    初始化分数scores和time为0,是否死亡属性为false
    初始化蛇类与食物类
    当正常运行时,如果检测到键盘上下左右输入了,则改变蛇前进方向
    如果碰到四周或者自己的身体,则死亡
    死亡后如果按空格键,则重新开始
    如果按回车键,则结束进程,游戏结束

    3 关键技术3.1 蛇身设为一个列表self.body = [] for x in range(5): self.addnode()
    3.2 音乐的播放pygame.init()pygame.mixer.init()sound = pygame.mixer.Sound("music.wav")sound.play()
    3.3 蛇增长的函数def addnode(self): left, top = (0, 0) if self.body: left, top = (self.body[0].left, self.body[0].top) node = pygame.Rect(left, top, 25, 25) if self.dirction == pygame.K_LEFT: node.left -= 25 elif self.dirction == pygame.K_RIGHT: node.left += 25 elif self.dirction == pygame.K_UP: node.top -= 25 elif self.dirction == pygame.K_DOWN: node.top += 25 self.body.insert(0, node)
    3.4 改变方向但是左右上下不能被逆向更改def chdirection(self, head): LR = [pygame.K_LEFT, pygame.K_RIGHT] UD = [pygame.K_UP, pygame.K_DOWN] if head in LR + UD: if (head in LR) and (self.dirction in LR): return if (head in UD) and (self.dirction in UD): return self.dirction = head
    4 结果和效果

    5 总结和不足这次贪吃蛇的实现对我来说有很大收获,python虽然是一门陌生的语言,但是却与之前学习过的c和c++有很大的相似性,学习起来也就轻松了很多。但是python也确实是一门新的语言,有些规则与c,c++毕竟是不一样的,还是有难度的。而且python的运行环境与vs不一样,运行所需要的库也不一样,这些不一样就造成了python的难度。虽然有些难度,但是学习起来的时候,能把所有的问题挨个解决的感觉也还是很好的。
    编程过程中有很多的问题,例如,文字的内容无法直接判断得出,我是一个个的测试,最后找到了最佳位置。加音乐的问题,我修改了好久的bug,一开始使用的pygame.mixer一直都显示有问题,无法打开mp3等,后来请教了老师,老师表示不要用mp3格式。但是我修改了格式,还是显示打不开文件。然后我上网换了另一种方法,运用系统的os来播放音乐,但是os是调用了系统自身的软件,打开了音乐播放器,而且当我游戏结束的时候无法正常关闭音乐。后来又找到了pyglet的模块,尝试使用,问题出现在只能播放音乐或者游戏,二者不能兼得,播放了音乐,游戏就卡住;开始游戏就无法正常播放音乐。最后找到了的方法是换音乐,用了一个纯wav格式的音乐,再次使用pygame的方法,这才成功。最后的教训在于不能直接改后缀名,要么就用正规的软件修改,要么就使用纯正的格式。
    在这一次的编写小游戏的过程中,我上网查阅了很多资料,绝大部分是英文的,这让我明白了英文在计算机领域的重要性。并且我认识到了我的不足,在编程过程方面我还有很多不足之处的,以后的道路任重道远,要不断充实自己,丰富自己,感谢老师和同学对我的帮助,通过这次学习,我学习到了很多知识,以及深刻了解到自学和英语的重要性。
    2 评论 28 下载 2018-11-05 16:11:15 下载需要7点积分
  • 基于JAVA实现的超级马里奥(Super Mario)游戏

    一、项目简介刚进入的时候会有一个界面,为地图编辑器。可以使用此编辑器进行地图编辑,地图编辑器的内容包括:关卡、向左箭头、带有金币的砖块、带有花朵的砖块带有蘑菇的砖块、带有星星的砖块、普通砖块、向左运动的板栗仔、向右运动的板栗仔、向左运动的乌龟、向右运动的乌龟、金币、带有食人花的管道、普通管道、洞、向右的箭头、橡皮擦、可以使用鼠标点击图标然后拖动到面板上点击面板进行地图编辑,橡皮擦可以擦除已经建立好的模型。
    部署完地图之后可以选择下一关进行下一个关卡的编辑,也可以点击开始游戏开始游戏。游戏开始后从编辑的第一关卡开始进行闯关,人物可以移动通过ad键进行控制,可以跳跃,通过k控制,跳的时候可以跳到管子和砖块上面。
    人物有两种状态:大马里奥和小马里奥。小玛丽奥可以撞普通的砖块或者带有包含物的砖块使得砖块可以向上稍微移动,砖块上的一些包含物也会随着砖块移动。大马里奥可以顶破普通砖块。
    怪物分为三种,分别为:板栗仔、乌龟和食人花。马里奥可以通过跳跃的方式踩死怪物,板栗仔在被踩的时候会变扁,乌龟被踩的时候。走动状态会变成龟壳状态,龟壳状态被碰到可以变成跑动的龟壳状态,跑动的龟壳可以杀死马里奥。板栗仔和其他的乌龟。运动的龟壳在运动的时候被马里奥踩到会变成静止的龟壳,食人花长在管道中,会定时出现对管道上方的物体进行攻击,当马里奥踩在管道上的时候不会出现。
    还有三种物体是包含在砖块中的,分别是星星、蘑菇、花朵。马里奥自下向上顶砖块之后砖块上方会生长出相应的植物星星和蘑菇会向右方向行走,花朵会在原地。马里奥可以通过触碰的方式吃掉植物,不同植物有不同的加成效果。其中,吃掉蘑菇之后会变成大马里奥。吃掉星星之后会变成无敌状态。吃掉花朵之后会有发射子弹的技能。
    任何物品,尤其是可移动物,包括子弹,在碰到洞之后会掉落到洞中人物掉落之后会损失一命,人物一共有五条生命。每次正面碰到乌龟或者板栗仔,或者掉落到洞中之后便会损失一条生命,每次损失生命则该关卡从头开始当五条生命全部损失之后便会到game over状态。
    当马里奥走到地图的最后一个模型之后的位置的时候说明本关通过,本关通过时会有马里奥跳下拉动旗帜旗帜拉倒底端的时候会向右跑到城堡位置。跑到城堡位置即属于本关卡已经通过,则消除所有的加成状态转到下一关卡。
    最后通关所有的关卡即为game ends,跳跃的时候有重力效应,降落的会越来越快游戏界面上方会有剩余生命,当前时间为0的时候会损失一命,还有计分系统。当玩家杀死怪物,或者吃掉某种可生长物,或者过关的时候都会获取相应的分数加成。分数显示在面板上方。吃掉金币会有金币数量统计,统计结果在生命右边。本项目的亮点在于应用ioc技术的地图编辑器和精美的人物模型。
    二、需求分析人物跳跃的重力,条约落下的时候碰到其他的硬物可以停止下落。踩死怪物。怪物死亡方式不同展现的画面不同。吃东西,有属性加成。大马里奥顶破砖块。小玛丽奥顶砖块砖块可跟随移动。砖块上方的东西可以跟随移动。地图编辑功能。声音功能。人物胜利拉旗进城堡。
    三、系统设计
    本项目共有20个公共类,5个接口。分成三种类,分别是:控制类、模型类、工具类
    功能方面有两大块,分别是地图编辑器和正式游戏
    地图编辑器部分使用了spring框架的ioc技术

    程序功能流程图如下图所示:

    控制类中有两个类分别为Main和Control作用分别为控制地图编辑,地图编辑的思路如下:玩家点击图标之后鼠标的状态变成点击的图标的状态值,本类中有一个map键值分别为Integer和model鼠标移动到某位置点击之后会使integer加一。构造出相应的model然后put到map中如果用户点击的是橡皮擦。那么会计算哪一个类在橡皮擦点击的位置,并且把相应的位置的model设为忽略。最后解析这个map构造xml文件和保存着各个类的数量的一个properties文件Control类通过解析xml和properties文件解析关卡信息还原用户编辑的地图。
    还有一个全局的properties为game.properties保存着关卡数目。在点击开始游戏之后开始运行Control类中的work方法。Work方法的作用是初始化整个游戏的完整页面读入xml中的内容实例化对象存到容器中。然后启动paintThread线程画出面板,启动其他的必要线程进行工作,根据用户的操作对容器中的对象的一些参数进行改变呈现不同的视觉效果。
    四、系统实现本项目由于需要实现用户自由设计地图,所以应该尽量降低耦合度,从全局的角度出发,对类的设计应该分为实物模型,统筹控制,工具,抽象出来的接口。接下来一一介绍。类结构图如下图所示:

    统筹控制包含Main和Control在上一部分已经介绍。接口被抽象出来以下几种:

    Dangerous类所有的可以杀死主角的实物模型类应该去实现该接口
    Flint类,砖块和管子应该去实现该接口。Growable接口,所有的可以被马里奥从砖块中顶出的实物模型应该实现该接口。Kill接口,所有的可以伤害到别的实物模型类的类都应该实现该接口。Moveable接口,所有的可以移动的物体都应该实现该接口

    实物模型类一共有12个:

    Badflower类是食人花类,实现Dangerous接口
    Bullet类是子弹类,实现Moveable和Kill接口
    Flower类是吃了以后可以发射子弹的类,实现了Growable接口
    Hole类是地面上存在的洞类。没有去实现任何接口
    Mario类,是主角类,实现了Moveable,Kill接口
    Money类,因为可以直接被主角吃掉并且在砖块上被顶出之后不需要生长移动过程所以不实现任何接口
    Monster类是板栗仔,实现了Dangerous,Moveable接口
    Mushroom类是吃了以后变大的蘑菇类实现了Growable和Moveable接口
    Pipe是管道类实现了Flint接口
    Star是吃了以后变成无敌状态的星星,实现了Growable和Moveable接口
    Turtle是乌龟类,实现了Dangerous,Kill,Moveable接口
    Wall是砖块类,实现了Flint方法

    还有6个工具类,其中的方法和字段大部分是静态的和final的:

    ApplicationUtil类可以通过传入的关卡值去加载spring上下文,为程序提供对象实例
    CrashType定义了一些物体之间的碰撞类型的常量
    ImageTool类中包含了程序用到的所有的图片以及为了克服延迟加载而写的事先加载所有图片的方法
    Null类是一个Growable类的空实现,因为在构造砖块的时候定义构造方法里面应当传入所包含的可生长物,而在使用spring框架进行实例化得时候不允许出现null.本人又极不愿意在写另外一种构造方法,所以索性构造一个Growable接口的空实现类,通过传出特殊的Type值进行识别
    Property类,用于解析配置文件,获取数据
    SoundTool类包含所有的使用到的音乐,以及静态的播放音乐的方法

    五、调试改错在实现的过程中出现了很多错误。比如声音播放问题和人物碰撞检测的问题等。不过最后解决的还算满意。
    六、美工素材本项目是一个人写的,代码和图片美工都是自己实现的。由于互联网上找不到相关素材,所以本人现学的ps,通过录制游戏中的人物动作分帧截图,使用抠图等技术自己做的图。
    七、总结要有统筹整个项目的意识。对整个项目有总体的把握。类的编写应当事先分好类,分清楚每种类的任务。最大化解耦,以免改动的时候涉及到过多的地方。分清楚每个类的任务。合理设计避免冗余。
    八、关键代码碰撞检测部分代码:
    public int getCrashType(int down,int direction,Rectangle rec1,Rectangle rec2)//rec1为wall,rec2为Mario 获取撞击类型 { //rec1是硬物。rec2是移动物 if(die)return CrashType.NO_CRASH; int rec1X=(rec1.x+rec1.x+rec1.width)>>1; int rec1Y=(rec1.y+rec1.y+rec1.height)>>1; int rec2X=(rec2.x+rec2.x+rec2.width)>>1; int rec2Y=(rec2.y+rec2.y+rec2.height)>>1; int width=rec1.width+rec2.width; int hight=rec1.height+rec2.height; if(rec2Y>=rec1Y) { if(rec1X>=rec2X) { if(down!=1||(rec1X-rec2X)/((double)width)>((rec2Y-rec1Y)/(double)hight)+CrashType.POINT) return CrashType.WALL_L;else { if(control.getMario().isCanWork())work(); control.getMario().down(); return CrashType.WALL_D; } }else { if(down!=1||(rec2X-rec1X)/((double)width)>((rec2Y-rec1Y)/(double)hight)+CrashType.POINT) return CrashType.WALL_R;else { if(control.getMario().isCanWork())work(); control.getMario().down(); return CrashType.WALL_D; } } }else { if(rec1X>=rec2X) { if((rec1X-rec2X)/((double)width)>=((rec1Y-rec2Y)/(double)hight)+CrashType.POINT) return CrashType.WALL_L;else { return CrashType.WALL_U; } }else { if((rec2X-rec1X)/((double)width)>=((rec1Y-rec2Y)/(double)hight)+CrashType.POINT)return CrashType.WALL_R;else return CrashType.WALL_U; } } }
    马里奥跳跃代码:
    private class JumpThread extends Thread//跳的线程 { private int n=jumpHight; public void run() { if(down==-1)return; if(downThread!=null) { downThread.stop(); downThread=null; } if(jumpThread!=null) { jumpThread.stop(); jumpThread=null; } jumpThread=this; //while(!Control.isALL_START()){try{sleep(Control.TIME);} catch (InterruptedException e){}} SoundTool.play(SoundTool.jumpSound); try { int site=locaY; double count=Math.sqrt((2*0.085*n)); for(int i=site;count>0;i-=(count-=0.1))//向上跳的时候改变状态 { if(getCrashType()&&(crashType==CrashType.WALL_D||crashType==CrashType.WUWL||crashType==CrashType.WUWR))//如果发现从下撞击了硬物则跳出向上的过程改为向下 { down=-1; break; } locaY=i; sleep(10); down=1; } new Down().start(); }catch(Exception e) { e.printStackTrace(); } down=0; } }
    马里奥降落代码:
    private class Down extends Thread//二类下落线程 //控制最终下落的线程如果在正常下落时由于碰撞被打断则启动该线程监视是否需要再次落下 { public void run() { if(down==1)return; //while(!Control.isALL_START()){try{sleep(Control.TIME);} catch (InterruptedException e){}} if(downThread!=null) { downThread.stop(); } downThread=this; // System.out.println("enter down!"); // while(down!=-1&&locaY!=control.getCutLine())//没有落地面上一直在循环 while(locaY<control.getCutLine()) { boolean flag=false;// int site=locaY; // System.out.println(crashType+" "+down+" "+canWork); if((getCrashType()&&(crashType==CrashType.NO_CRASH)&&(down!=1))||canWork==false)//多线程重要判断应该靠紧 { flag=true;//已经下落 double count=1; for(int i=site;i<=control.getCutLine();i+=(count+=0.1)) { down=-1; locaY=i; downSpeed=count; // System.out.println(i+" "+control.getCutLine()); if(getCrashType()&&(crashType==CrashType.WALL_U||crashType==CrashType.PIPE_U||crashType==CrashType.WUWL||crashType==CrashType.WUWR))//如果在某个硬物的上方、启动二类下落线程且退出本线程 { down=0;//落道硬物上面则运动状态为0 downSpeed=0; downThread=null; new Down().start(); setCanWork(true); return; } try { sleep(10); } catch (InterruptedException e) { down=0; downThread=null; downSpeed=1; setCanWork(true); new Down().start(); } } locaY=control.getCutLine(); } if(flag)//在该线程中如果已经下落则跳出 { if(!control.getMario().isDownDie()) for(int j=0;j<control.getHoles().size();j++) { if(control.getHoles().get(j).canPaint()) control.getHoles().get(j).DownDie(control.getMario()); } if(!control.getMario().isDownDie())downSpeed=1; down=0; downThread=null; setCanWork(true); return; } } }
    2 评论 161 下载 2018-10-31 12:18:12 下载需要4点积分
  • 基于Android Studio实现的2048游戏

    1 需求分析1.1 背景与意义1.1.1 手机应用市场发展现状随着4G越来越普及以及手机应用的日益丰富还有智能水平的不断提高,从便携性和随身性这两方面来考虑,电脑所带来的体验已经不能跟手机相提并论了,它已经完美的超越了电脑。
    现如今Android、苹果等各智能手机已经基本占领整个手机市场,从而使得更多应用的出现,而手机游戏应用在其中占领主要位置。
    随着Android智能手机的普及以及游戏种类的多元化,使得Android手机游戏用户规模保持着稳步增长之势。
    1.1.2 国内外现状目前国内外的Android开发还是主要以应用开发为主,主要分成三类:企业应用、通用应用及游戏应用。企业应用的开发主要是一些大公司为了自己的品牌而开发的;通用应用主要是一些创业型公司或者独立开发者为了自己盈利开发的应用;游戏应用目前和通用应用相同。
    2048小游戏是一款最近风靡全球的手机游戏,简单的游戏模式和趣味的玩法,几乎游戏下载排行榜的前20名都可以看到“它的身影”。
    1.1.3 此游戏的意义现如今,手机游戏已在我们的生活中占据一席之地,并在一步步的壮大。可以说,随着它的迅猛发展,现今的手机游戏已经不单单是一种缓解压力的工具,而是形成了一种文化现象。随着游戏软件在市场的一步步壮大,与其有关的文化也随之传播。
    2048游戏的制作属于电子游戏中益智类小游戏,它做到了娱乐性、趣味性、教育性相统一。益智类的游戏即是需要去开动大脑思考从而获得游戏的胜利。简单的益智类游戏可以使玩家在娱乐中不断地开发大脑。这样一来就实现了在娱乐中学习。
    1.2 系统需求分析1.2.1 系统功能需求分析系统主要实现以下的几个功能:呈现游戏界面、重新开始游戏、当前分数和最高分数、游戏帮助等功能。
    重新开始游戏是当玩家无法满足当前进度时点击此按钮就会重新开始游戏,如果玩家处于不同关卡时提示重新开始游戏还是停留在此关卡。游戏帮助是当新手玩此游戏时无法知道游戏玩法时给予相应的提示。呈现游戏界面是游戏开始时主界面在游戏区域会生成4x4的矩阵同时在矩阵里面随机生成两个2或4的游戏卡片。当前分数和最高分数是显示此局玩家所获得的分数和历史上最高的分数,如果当前的分数超过最高的分数,那么最高分数显示当前的分数。如下图所示:

    1.2.2 游戏的基本规则在开始游戏后玩家通过滑动屏幕来操控卡片的移动方向,当卡片滑动中如果有两张卡片相同且他们中间也没有其他卡片时,在滑动的过程中这两张卡片会合并,显示为这两张卡片之和。在滑动过程中有三张卡片相同时只会合并向滑动方向两张卡片。在滑动中如果有两张卡片一样同时又有一张卡片的值跟这两张卡片相加的值时,滑动只会使那两张相同的卡片合并而不会接着让合并后的卡片和另一张卡片合并。
    2 系统分析与设计2.1 系统流程设计游戏进入开始页面,能够进入游戏的主界面并开始普通开局,从主界面能够重新开始游戏、查看帮助和进入关卡选择界面。当玩家点击重新开始按钮会弹出相应的对话框让玩家选择,如果玩家选择“是”时则重新开始游戏,如果选择“否”则返回游戏界面不做任何处理。在开始界面按返回按钮时则会退出游戏。
    游戏流程如下图所示:

    2.2 系统模块设计从总体出发,将该系统划分为三大模块:“菜单设计”、“界面设计”和“算法设计”。
    2.2.1 菜单设计菜单的实现是在游戏界面,可进一步划分为三个模块,分别是:“重新开始”、“退出游戏”、“游戏帮助”,如图所示:

    2.2.2 界面设计


    开始界面
    游戏界面









    2.2.3 算法设计当有两张卡片相同时,向它们可以碰撞的方向滑屏,卡片会移动到最底边并生成其两倍数字的卡片,并且生成一个“2”或者“4”的卡片。如图所示:



    生成2
    生成4









    当有两张卡片相同时,且在它们相同的方向有张跟他们之和的卡片,向它们可以碰撞的方向滑屏,相同的卡片会移动到无法移动的位置并生成其两倍数字的卡片,但合成的方向不会跟那两张数字的卡片合并,并且生成一个“2”或者“4”的卡片。如图所示:



    生成2
    生成4









    当界面上没有空位并且两两相邻的卡片不相同时游戏结束。如图所示:

    2.3 本章小结本章主要对游戏所实现的功能进行需求分析,分析了图形的特点和实现的可行性。对系统的性能进行了详细的分析。对系统的流程,系统所需的图形文件,系统的总体架构和系统用例进行了设计。通过本章的分析、设计能更加具体的了解系统功能,对系统所要实现的功能和图形文件有了更深的认识。为下一章系统功能的具体实现提供了可靠的参考依据。
    3 系统实现3.1 开始界面的实现游戏的主界面是按钮,只是为了实现界面的跳转,当玩家点击开始游戏就会调用loginActivity.java,此函数让页面跳转到游戏界面开始游戏,代码及图片如下所示:
    public class loginActivity extends MainActivity { protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.login); }}

    3.2 游戏界面的实现游戏界面主要是在activity_main.xml中当前分数、最高分数、重新开始按钮、退出游戏按钮、游戏帮助按钮、帮助按钮,当跳转到游戏界面时就会调用并执行MainActivity.java函数来展示游戏界面,代码及图片如下所示:
    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);}

    3.3 游戏滑动卡片移动的实现当玩家滑动屏幕时,主要通过GameView函数来监听玩家手指滑动的位置,先通过获取开始坐标和结束坐标,然后通过比较结束坐标跟开始坐标的差值来判断玩家是怎么滑动屏幕的。判断出玩家的滑动轨迹后,通过调用swipeLeft、swipeRight、swipeUp、swipeDown方法来实现卡片的移动,代码及图片如下所示:
    private void initGameView(){ setColumnCount(4); //将面板设置成4列 setBackgroundColor(0xffbbada0); System.out.println("initGameView"); setOnTouchListener(new View.OnTouchListener() { /* * startX:手机刚开始在屏幕上的X坐标 * startY:手机刚开始在屏幕上的Y坐标 * offsetX,offsetY,分别是手指在屏幕上的X,Y上的偏移量 */ private float startX,startY,offsetX,offsetY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_UP: offsetX = event.getX() - startX; offsetY = event.getY() - startY; if(Math.abs(offsetX) > Math.abs(offsetY)){ if(offsetX < -5){ swipeLeft(); System.out.println("Left"); }else if(offsetX > 5){ swipeRight(); System.out.println("Right"); } } else{ if(offsetY < -5){ swipeUp(); System.out.println("Up"); }else if(offsetY > 5){ swipeDown(); System.out.println("Down"); } } break; } return true; } });}//向左滑动public void swipeLeft(){ boolean meger = false; for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { for (int x1 = x+1; x1 < 4; x1++) { if(cardsMap[x1][y].getNum()>0){ if(cardsMap[x][y].getNum()<=0){ /* * 将下标为(x,y)所在位置的卡片上的数字 * 设置为,坐标为(x1,y)所在位置的卡片上的值; * 第二步,将坐标(x1,y)所在位置的卡片上的数字 * 设置为0 * (即:变成空卡片) */ cardsMap[x][y].setNum( cardsMap[x1][y].getNum()); cardsMap[x1][y].setNum(0); x--; meger =true; break; }else if(cardsMap[x][y].equals(cardsMap[x1][y])){ cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2); cardsMap[x1][y].setNum(0); MainActivity.getMainActivity(). addScore(cardsMap[x][y].getNum()); meger = true; } break; } } } } if(meger){ addRandomNum(); checkComplete(); }}//向右滑动public void swipeRight(){ boolean meger = false; for (int y = 0; y < 4; y++) { for (int x = 3; x >=0; x--) { for (int x1 = x-1; x1 >= 0; x1--) { if(cardsMap[x1][y].getNum()>0){ if(cardsMap[x][y].getNum()<=0){ /* * 将下标为(x,y)所在位置的卡片上的数字 * 设置为,坐标为(x1,y)所在位置的卡片上的值; * 第二步,将坐标(x1,y)所在位置的卡片上的数字 * 设置为0 * (即:变成空卡片) */ cardsMap[x][y].setNum( cardsMap[x1][y].getNum()); cardsMap[x1][y].setNum(0); x++; meger =true; break; }else if(cardsMap[x][y].equals(cardsMap[x1][y])){ cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2); cardsMap[x1][y].setNum(0); MainActivity.getMainActivity(). addScore(cardsMap[x][y].getNum()); meger =true; }break; } } } } if(meger){ addRandomNum(); checkComplete(); }}//向上滑动public void swipeUp(){ boolean meger = false; for (int x= 0; x< 4; x++) { for (int y = 0; y < 4; y++) { for (int y1 = y+1; y1 < 4; y1++) { if(cardsMap[x][y1].getNum()>0){ if(cardsMap[x][y].getNum()<=0){ /* * 将下标为(x,y)所在位置的卡片上的数字 * 设置为,坐标为(x1,y)所在位置的卡片上的值; * 第二步,将坐标(x1,y)所在位置的卡片上的数字 * 设置为0 * (即:变成空卡片) */ cardsMap[x][y].setNum( cardsMap[x][y1].getNum()); cardsMap[x][y1].setNum(0); y--; meger =true; break; }else if(cardsMap[x][y].equals(cardsMap[x][y1])){ cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2); cardsMap[x][y1].setNum(0); MainActivity.getMainActivity(). addScore(cardsMap[x][y].getNum()); meger =true; } break; } } } } if(meger){ addRandomNum(); checkComplete(); }}//向下滑动public void swipeDown(){ boolean meger = false; for (int x = 0; x< 4; x++) { for (int y = 3; y>= 0;y--) { for (int y1 = y-1; y1 >=0; y1--) { if(cardsMap[x][y1].getNum()>0){ if(cardsMap[x][y].getNum()<=0){ /* * 将下标为(x,y)所在位置的卡片上的数字 * 设置为,坐标为(x1,y)所在位置的卡片上的值; * 第二步,将坐标(x1,y)所在位置的卡片上的数字 * 设置为0 * (即:变成空卡片) */ cardsMap[x][y].setNum( cardsMap[x][y1].getNum()); cardsMap[x][y1].setNum(0); y++; meger =true; break; }else if(cardsMap[x][y].equals(cardsMap[x][y1])){ cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2); cardsMap[x][y1].setNum(0); MainActivity.getMainActivity(). addScore(cardsMap[x][y].getNum()); meger =true; } break; } } } } if(meger){ addRandomNum(); checkComplete(); }}



    效果1
    效果2









    3.4 重新开始游戏功能的实现当玩家点击游戏界面的重新开始游戏时,会弹出给玩家选择的对话框,让玩家选择“是”时游戏会重新开始,代码及图片如下所示:
    public void onClick(View view){ AlertDialog.Builder dialog3 = new AlertDialog.Builder(this); dialog3.setTitle("提示:"); dialog3.setMessage("你确定重新开始吗?"); dialog3.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dialog3.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dialog3.show(); }

    3.5 退出游戏功能的实现当玩家中途有事想退出游戏时会弹出给玩家选择的对话框,让玩家选择“是”时游戏会退出,代码及图片如下所示:
    public void onClick(View view){ AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setTitle("提示:"); dialog.setMessage("你确定要离开吗?"); dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { System.exit(0); } }); dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); dialog.show(); }

    3.6 游戏帮助功能的实现当新玩家进入到游戏且不知道此游戏玩法时,玩家可以点击游戏帮助按钮来了解游戏玩法,点击按钮时游戏会弹出对话框显示游戏玩法,代码及图片如下所示:
    public void onClick(View view){ AlertDialog.Builder dialog2 = new AlertDialog.Builder(this); dialog2.setTitle("hey,guy!"); dialog2.setMessage("这么简单的游戏你确定需要帮助?"); dialog2.setNegativeButton("继续玩~", new DialogInterface.OnClickListener({ @Override public void onClick(DialogInterface dialog, int which) { } }); dialog2.show();}

    3.7 本章小结本章主要阐述本游戏相关功能的实现,详细的讲述了主界面的实现和各按钮功能的实现。
    4 测试本章主要对系统的功能进行测试,此次测试只是进行简单的调试,来确定游戏的各项功能是否能够正常运行。
    4.1 游戏流程测试该测试主要验证游戏能否实现场景的切换,当界面在开始界面时只显示按钮画面,当玩家点击此界面的开始按钮时跳转到游戏界面,如图所示:



    效果1
    效果2









    4.2 游戏模式该测试主要是测试游戏能否正常运行,当玩家滑动屏幕时能否正常的移动和当卡片相同时是否能够相加,还有就是测试游戏是否能正常结束。



    效果1
    效果2









    4.3 本章小结本章是对游戏系统进行简单的测试,通过测试可以看出此游戏可以正常的工作,同时一些功能也能够实现。
    5 总结本次课程设计的内容大部分都是参照课堂所讲以及一些网站给出的各种建议写的,在写的过程中遇到了很多问题,学到了很多东西。期间大概是因为基础不够好,只是找错误就花了很长时间。不过正因为这些错误,才能学到更多的知识,才能把知识点掌握的更牢靠,对于一些没有实现的功能,之后我一定会多花费些时间研究出来。我的课程设计优化的空间还相当大,希望老师能给出指导!
    5 评论 306 下载 2018-12-20 18:49:18 下载需要8点积分
  • 基于C语言的AES加密系统

    一、课程设计功能简介题目
    对称算法AES的实现,在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统。
    功能要求

    编程实现算法的加密过程、解密过程和密钥生成过程
    完成一个明文分组的加密、解密,明文和密钥是ASCII码。进行加密后,能够进行正确的解密
    提供良好的用户界面,界面有有加密/解密选择、输入明文/密文栏、密钥栏、和加/解密结果显示栏

    二、技术要求运用所掌握的数据结构、以及编程语言对各种密码学算法进行分析和设计,加深学生对密码算法的理解,提高学生算法设计与分析的能力。提高学生在应用C语言、数据结构编写大型算法的能力。
    三、软件模块设计流程
    AES加密函数中,首先进行密钥扩展,然后把128位长度的字符串读进一个4*4的整数数组中,这个数组就是状态矩阵。例如,pArray[0][0] = S0,pArray[1][0] = S1, pArray[0][1] = S4。这个读取过程是通过 convertToIntArray()函数来实现的。每个轮操作的函数都对pArray进行修改,也就是对状态矩阵进行混淆。在执行完10轮加密后,会把pArray转换回字符串,再存入明文p的字符数组中,所以,在加密完后,明文p的字符串中的字符就是加密后的字符了。这个转换过程是通过convertArrayToStr()函数来实现的。

    3.1 密钥扩展的实现在开始加密前,必须先获得第一轮加密用到的密钥,故先实现密钥扩展。
    下面是密钥扩展函数的实现,这个函数传入密钥key的字符串表示,然后从字符串中读取W[0]到W[3],函数getWordFromStr()用于实现此功能。读取后,就开始扩展密钥,当i是4的倍数的时候,就会调用T()函数来进行扩展,因为T函数的行为与加密的轮数有关,故要把加密的轮数 j 作为参数传进去。
    3.2 字节代换的实现字节代换的代码很简单,就是把状态矩阵中的每个元素传进getNumFromSBox()函数中,然后取得前面8位中的高4位作为行值,低4位作为列值,然后返回S[row][col],这里的S是储存S盒的数组。
    3.3 行移位的实现行移位的时候,首先把状态矩阵中第2,3,4行复制出来,然后对它们行进左移相应的位数,然后再复制回去状态矩阵array中。
    3.4 列混合的实现列混合函数中,先把状态矩阵初始状态复制一份到tempArray中,然后把tempArray与colM矩阵相乘,colM为存放要乘的常数矩阵的数组。其中的GFMul()函数定义了矩阵相乘时的乘法,加法则直接通过异或来实现。GFMul()通过调用乘以各个数对应的函数来实现乘法。例如,S1 2 刚通过调用GFMul2(S1)来实现。S1 3 刚通过GFMul3(S1)来实现。在这里,主要实现GFMul2()函数就行了,其它的都可以通过GFMul2()的组合来实现。举个例子吧,为计算下面这条等式,需要像下面这样调用函数:
    s = GFMul3(0xC9) ^ 0x7A ^ 0x63 ^ GFMul2(0xB0)3.5 轮密钥加的实现轮密钥加的实现很简单,就是根据传入的轮数来把状态矩阵与相应的W[i]异或运算。

    AES解密过程,解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。
    四、测试结果


    五、总结本次课程设计,让我获益匪浅,不仅更深入的了解密码学这门学科,整个设计过程是不断学习,不断发现问题、分析问题、解决问题的过程使我受益良多。设计期间有很多感触、想法,使自己有了继续探索的兴趣,对以后的学习、工作有很大的益处。
    于个人而言,在程序设计的过程中,我深感“认真严谨”这个词的重要性,一点点小的马虎,便会导致整个程序不能正常运行。在今后的学习中,我定将“认真严谨”对待。总之,此次课程设计在我今后的学习生涯中起到了至关重要的作用。
    2 评论 15 下载 2019-06-04 09:36:13 下载需要11点积分
  • 基于Python的PyGame实现的横板动作小游戏

    游戏玩法玩家操纵主角进行移动和攻击,主角有四种攻击,不同操作惊醒不同的攻击和动画播放,敌人可以对玩家进行攻击
    代码思想利用精灵类绘制主角,自定义People类进行数据逻辑上的更新,Enemy类负责数据变更和绘图。利用列表模仿队列的方式,对玩家的攻击操作惊醒先后判断。UPDATE函数可以让玩家一次最多攻击一定数量的敌人,维持游戏平衡性。玩家类和敌人类中存在temp、clock变量和timetick函数,用来更新绘图上的数据。每个类都有JudgeList,避免敌人和玩家多次造成伤害,敌人的速度方向始终朝着玩家,利用三角函数实现。敌人用一个列表存储。
    2 评论 39 下载 2018-10-31 12:43:57 下载需要6点积分
  • 基于QT实现的飞机大战游戏

    一、课程设计内容与目标通过类的继承等来实现一个飞机小游戏,首先实现控制台版的飞机游戏,然后修改与显示相关的部分代码完成从控制台到图形界面的迁移过程。
    飞机游戏中要实现以下几个基本要素:

    玩家飞机发射子弹攻击敌机
    敌机可以发射子弹攻击玩家
    玩家飞机可以自由移动,敌机可以定向移动
    玩家飞机与敌机只有在真正边界相撞时才算相撞,且相撞时双方均要受到一定伤害

    在课程设计一中,我实现了上述的基本功能,并提供了向图形界面的接口函数,在课程设计一中,玩家飞机和敌机均可以通过简单的代码修改任意更改形态
    在课程设计二中,我添加了程序启动界面(就是此实验报告的封面),欢迎界面、背景音乐、暂停、玩家飞机技能、补给掉落、boss 等功能,游戏界面如下图:

    在此游戏中,右下角的 SCORE 为玩家当前击落的敌机数,绿色进度条为玩家飞机当前的血条,下面的蓝色进度条为玩家飞机当前的技能条。玩家可以使用消耗技能值实现一技能,如按 Q 可以三连发(如上图),按 E 可以一次性击落当前所有敌机,按 R 可以一次性消掉当前所有子弹。
    二、类层次关系和实现本次实验中,我总共设计了如下几个两个基类 Plane 和 Bullet。Plane 派生出MyPlane和 EnemyPlane 两个子类。还有一个 Control类管理全局。两次课程设计中主要使用的类没有发生变化,只是类之间的关系稍有变化。
    2.1 第一次课程设计(控制台版)第一次课程设计(控制台版)中各类关系如下:

    如图,Plane 类中聚集了 Bullet 类的实例 bullets 数组,用于记录该飞机发出去的子弹;Plane 类派生出两个子类,MyPlane 与 EnemyPlane,分别是玩家飞机与敌机。这两个类均聚集在 Control 类中,由 Control 类对所有飞机的状态进行管理。由于 Control 与 Plane、MyPlane、EnemyPlane 关系密切,故我将 Control类设置为这几个类的友元。
    在这个版本中,我通过一个循环来检测用户的按键输入和定时动作,如下:

    keyboardHandle是我自己写的一个函数,用于根据用户的不同按键获取用户输入。
    2.2 第二次课程设计(图形界面版)第二次课程设计(图形界面版)中对类的关系进行了一些优化。因为 Plane和 Bullet 类都有一些共同的属性,所以设计了一些共同的基类 Object,以实现一些共同的性质,如 synScreen,delScreen 等。第二次课程设计是用的是 Qt 的QGraphicsScene、QGraphicsItem、QGraphicsView 三组件,其中 Control 继承自QGraphicsScene,Plane 与 Bullet 继承自 QGraphicsItem,在 main 函数中创建QGraphicsView与QGraphicsScene 相关联,主要操作都在 Control中完成。
    类结构图如下:

    第二次课程设计中,Bullet 类不再聚集在 Plane 类中,而是直接实例化为两个数组,聚集在 Control中,便于管理。Object 类均需要使用图片来初始化,所以都是 Qt 提供的 QGraphicsPixmapItem 类的子类。而 Control 类抽象成为QGraphicsScene 类的子类,用于管理 Scene 中的各个 Item。
    除此之外,为了丰富游戏内容,还在增加了其他的一些组件,用以实现游戏启动界面、欢迎界面、背景音乐、血条、技能条、游戏暂停、游戏结束等功能。
    类名及相关游戏组件如下:

    QGraphicsTextItem 游戏标题、提示信息等
    QGraphicsWidget 游戏按钮、遮罩面板(用于在游戏暂停时达到场景变暗的效果)
    QGraphicsRectItem 血条、技能条。

    此外,检测玩家按键输入和定时动作的方式也使用了 QObject 提供的消息机制来实现,使用了如下事件函数:

    timeEvent() 用于接收计时器消息,实现飞机、子弹定时移动,敌机的定时生成
    keyPressEvent() 用于接收键盘控制,实现玩家控制

    三、课程设计一和二的关联与衔接课程设计一为了向课程设计二过渡,设计了一些共同的接口函数,在迁移过程中仅需修改参数即可。
    在过渡中优化了一部分类的设计,比如发现 Bullet、Plane、LifeSupply 都有共同的属性,故让这三个类均继承自 Object 类。
    Object 类与显示相关的函数变动如下表:

    delScreen 用于将子弹在屏幕上抹去,synScreen 用于将子弹显示在屏幕上,hit 用于子弹与飞机相撞时降低子弹生命值,生命值降为 0 时抹去子弹。
    Bullet 类只需要改动一个函数:

    其中 char **screen 为控制台版中 Control 类的一个成员变量,用于保存要在屏幕上显示的所有字符;在图形界面版中 Control类继承自 QGraphicsScene,本身就保存了所有要显示的信息,所以可以直接将 Control类指针传进去。
    Plane 类也只需改动一个函数:

    crash用于飞机与飞机或子弹相撞时降低生命值,生命值降为0时抹去飞机。
    Control类变化较多,因为 Qt中有一些现成的库函数,所以有些地方可以直接使用库函数,变化如下:(参数略去)

    另外,为了更好地适应图形界面,也对一些功能做出了修改,比如控制台版本的子弹相撞可以消掉,但是图形界面中玩家飞机子弹与敌机子弹不能消掉。
    除此之外,为了丰富游戏,增强游戏可玩性和趣味性,还添加了其他的函数以实现:游戏启动界面、游戏欢迎界面及帮助、游戏暂停、背景音乐、玩家技能、随机掉落补给等等功能。
    四、实验成果展示4.1 第一次课程设计(控制台版)控制台版的飞机大战较为简陋,但是可拓展性较好。敌机和玩家飞机的形状可以直接通过更改代码中定义的一个静态数组来改变,且碰撞也是按照实际形状来检测的。玩家可以通过一些按键来控制右侧栏中一系列参数:生命值、子弹威力、子弹速度等等。玩家子弹和敌机子弹相撞时会同时销毁。运行效果如下图 :

    4.2 第二次课程设计(图形界面版)我为我的程序设计了一个安装包,已在附件中。安装之后会在桌面创建一个快捷方式,双击便可运行。如下是启动画面 :

    欢迎界面如下 :

    点击开始游戏,右下方 SCORE 为分数,绿色进度条为生命值,蓝色进度条为技能值,可以使用 J、K、L 三个键释放技能。同时,敌机被击落的时候也会随机掉落声明补给(绿色的加号)。

    按空格键可以暂停,暂停时背景变暗。

    生命值耗尽时游戏结束,玩家可以选择重玩或者退出游戏。

    五、遇到的问题和思考5.1 代码复用的思考在这第一次设计中,类的继承主要体现在 Plane 派生出 MyPlane 与EnemyPlane 上,起到了不错的效果。但是还有可以改进的地方。
    在完成第二次课程设计的过程中,我考虑到在 Bullet 类和 Plane 类中都有delScreen、synScreen 函数功能也非常接近,且有一些共同的成员变量,如果要更好地复用的话,应该让 Bullet 类与Plane 类都继承自同一个 Object 类,于是设计了 Object 类,这样在后续添加新的游戏道具时也会更加方便。
    5.2 字符界面过渡图形界面遇到的困难由于之前没有图形界面编程的经验,所以不知道应该怎样为图形界面留出接口,后来决定用 Qt 之后,查了一些关于 Qt 的资料了解到 QGraphicsScene 与QGraphicsItem 提供的库函数,于是设计了上述的一些函数便于代码迁移。
    5.3 对文档-视结构的思考在 MFC 的文档-视结构中,程序的数据储存在文档类中,文档类是对数据的抽象表示。数据显示由视图负责,视图是程序窗口的客户区,框架窗口是客户区的框架,程序数据显示在窗口,用户通过视图与程序交互。
    在第二次课程设计中,我的代码结构与此类似。我使用的 QGraphicsScene(Control的基类)类似于文档-视中的 CDocument 类,保存的是程序的数据(飞机、子弹、提示信息等);QGraphicsItem 就是文档-视中的数据,通过QGraphicsScene 的 addItem 函数加入到场景中,由 QGraphicsScene 管理;QGraphicsView 类似于文档-视中的 CView 类,通过其 setScene 函数与QGraphicsScene 建立关联。
    5 评论 236 下载 2018-11-05 16:26:20 下载需要10点积分
  • 基于Face++的人脸融合及换脸系统

    1.项目介绍在本项目中,我们实现了对人脸图片数据的三种处理:人脸互换(face swap)、人脸融合(face morph)以及基于特征向量的人脸处理(eigen face)。
    1.1 人脸互换(face swap)人脸互换部分主要实现的功能是,给定任意两张人脸图片,通过一系列操作,使两个人的脸部交换,这部分需要的问题有:

    不同的人的脸部结构千差万别,同一个人也会因为角度、面部表情的不同而导致差别,即如何实现不同图片的人脸对齐
    不同人脸的肤色、光照不同,即不同图片的面部亮度不同,在换脸后如何与整体亮度统一
    不同人脸的纹理不同,比如老人的皱纹等,如何实现换脸后纹理的统一

    1.2 人脸融合(face morph)在人脸融合部分,我们需要实现给定任意两张人脸图片和融合度α,通过一系列操 作,实现两个人脸的融合。这一部分的困难在于:

    人脸结构的检测与分割。对于给定的人脸图片,人脸的结构差异很大
    人脸融合度的构建。对于给定的融合度 α,如何对两张图片的人脸取样与映射

    1.3 本征脸(eigen face)在这一部分,需要对较大的数据集(几百张,几千张人脸图片)进行处理,通过主成分分析的方法,得到一定数量的人脸主成分。这一部分的主要困难在于数据集的预处理,我们需要将不同图片中的人脸对齐,才能进行后续的处理。
    2.算法结构与处理过程2.1 人脸变换2.1.1 人脸关键点检测实现人脸变换的第一步,便是人脸关键点的检测,得到图片中的人脸的结构。在这 里,我们利用旷视face++的API来定位人脸关键的集合{V1,V2,…,Vn},其中关键点的数量可 以选择 83 或者 106。
    左:人脸关键点与凸包;右:德劳内三角集。

    2.1.2 计算凸包在获取人脸关键点集合后,我们需要计算这些关键点的凸包(convex hull)(凸包是一个计算几何(图形学)中的概念:在一个实数向量空间 V 中,对于给定集合 X,所有包含 X 的凸集的交集 S 被称为 X 的凸包。X 的凸包可以用 X 内所有点(X1,…Xn)的凸组合来构造.)在这里,我们计算凸包是为了获取这些人脸关键点组成的一个人脸区域。
    2.1.3 德劳内(Delaunay)三角划分在获得凸包以后,我们对凸包内的人脸关键点进行德劳内三角的划分。德劳内三角划分能将我们的凸包区域进行分割,并且更易于保留人脸的细节部分,并且因为获取仿射变换需要原图片和目标图片的各三个点,正好对应于原图和目标图的对应的德劳内三角。
    2.1.4 进行仿射变换在获得原图片和目标图图片的德劳内三角以后,我们需要寻找两张图对应的三角形对,对这样的每一对三角形,我们可以计算得到一个仿射函数。这个仿射函数将被用于三角形对之间的仿射变换。重复这个操作,直到所有区域都操作完毕,我们得到了人脸的位置变换。
    2.1.5 无缝融合在上述人脸仿射变换后,我们得到人脸结构和位置的变换,但我们没有对人脸区域亮度进行调整,这样会造成人脸区域和其他区域的颜色协调的问题。所以最后我们用 opencv 的无缝融合函数 seamlessClone()来实现无缝融合操作。
    2.2 人脸融合2.2.1 人脸关键点检测和 2.1.1 部分一样,我们首先需要确定给定图片的人脸的结构,所以需要检测人脸的关键点。在这里我们仍然使用旷视 face++的人脸关键点识别 API,选择 108 点检测。
    2.2.2 定义融合度要实现两张人脸的融合,我们还要定义融合度 α(0=<α<=1):

    M 是融合后的图像,I,J 是两张待融合图像。我们定义 α,使 α 趋于 0 使,越来越接近图 像 I;α 趋于 1 时,越来越接近图像 J;α 等于 0.5 时,相当于两张图像的平均。
    2.2.3 采样点加权在获得两张人脸的关键点后,我们再对两张人脸进行加权平均:

    通过这个式子,我们计算加权后的人脸关键点的位置。
    左:采样点加权后的人脸结构;右:德劳内三角划分。

    2.2.4 德劳内三角划分如同 1.1.3,我们对获取的人脸关键点进行德劳内三角划分,不同的是,我们为了获取人脸框架结构在整张图中的位置,需要手动添加图片四个角以及四边中心点作为辅助点,再进行德劳内三角划分。这样,我们就得到非常详细的人脸结构。
    2.2.5 图像融合在经过以上步骤后,我们进行人脸融合。首先,我们对源图像的人脸关键点对我们在 2.2.3 中得到的加权后的人脸关键点进行仿射变换。由对应的德劳内三角形确定的三个点,我们可以确定一个仿射变换;对所有的三角形进行这样的操作,我们就得到了仿射后的人脸图片。对两张源图进行这样的操作,我们就得到两个仿射后的人脸图片,再运用我们定义的融合度 α 进行加权平均,最终得到我们的目标图片。

    2.3 本征脸2.3.1 数据预处理此次我们用于测试的数据集有两个,一个是 NBA 现役球员,另一个是女外女明星。对于我们的人脸图片数据集,我们首先要做的是将它们的大小固定为统一的大小。然后,我们需要将每张人脸配准定位,一个方法是将每张图片的人的眼睛定位于同一水平线上,并且使每张图片的两眼中心点在相同的位置。
    2.3.2 主成分分析在预处理图片后,我们对图片的数据进行主成分分析。首先,对于每张 NxN 大小的图片,我们将其转化成一个(NxNx3)x 1 的向量。当有 M 张图片时,我们便有一个(NxNx3)x M 的矩阵。
    在计算主成分之前,我们先来对我们的图片矩阵数据求平均值向量,这是为了后面的方差和协方差准备的。在获取了平均值向量之后,我们来计算主成分。在数数学上,我们通过线性代数中的矩阵特征值分解,可以找到矩阵的特征值和相应的特征向量,我们将这些特征值按从大到小排列,越大的特征值说明数据在这个特征值对应的特征向量的方向上 的方差越大,这就是我们要找的主成分。在这里,我们可以设置参数,来选择主成分的数量。例如,我们选择前十大的特征值和对应的特征向量。
    2.3.3 获得本征脸在获得主成分之后,我们将选取的主成分矩阵,按原来图片矩阵转化为向量的逆操 作,将矩阵变成图片矩阵。
    3.代码结构3.1 人脸互换相关文件:faceswap.py

    get_points 函数。用于封装好 Face++的 API,得到图片的 83 个人脸特征点,并存储在一个列表当中,方便后续处理
    AffineTransform 函数。该函数输入源图、源图的德劳内三角、目标图的德劳内三角和给定的大小。通过计算获取仿射变换函数,并且进行仿射变换,输出变换后的图片
    DelaunayTriangles函数。用于计算我们人脸关键点的德劳内三角。我们应用openCV的Subdiv2D 函数,可以得到我们的德劳内三角
    warpTriangle 函数。通过德劳内三角的划分,我们定义这个函数,用来实现对德劳内三角的仿射变换,并且最终将左右变换后的三角形区域合并,得到我们的目标脸
    最后是主函数,调用这些定义好的函数,读取我们的图片进行处理

    3.2 人脸融合有关文件:morph.py

    detect 函数。用于封装好 Face++的 API,得到图片的 108 个人脸特征点,并存储在一个字典当中,方便后续处理
    addBorderPoints 函数。该函数功能是给处理图片准备要划分三角形的时候,把图片四个顶点和四条边的中点的坐标添加到带划分的点中,这让得劳内三角形能完整的划分 整张图片
    delaunaryTriangles 函数。由特征点的坐标生成其用来划分这些特征点的得劳内三角形
    affineTransform 函数。根据划分好的三角形,我们可以用来计算一张图的三角形到另外一张图所对应的三角形的仿射变换,该函数在 morphingTriangle 函数中使用
    morphingTriangle 函数。对两个仿射后的人脸图片,运用我们定义的融合度 α 进行加权平均,最终得到我们的目标图片


    morphing 函数。总的融合函数的接口,得到融合图片的脸部特征点的坐标,与新图片的脸部划分三角形坐标,调用 morphingTriangle 函数得到新的融合图片
    getPic 函数。用于实现 GUI 中根据 alpha 生成一张图片的功能
    get20Pics,create,sortKey,createGIF 函数。用于实现 GUI 生成一张 gif 图片的功能

    3.3 本征脸人脸相关文件:eigenface_origin.py

    readImages 函数。从指定的文件夹中读取图片文件,将其转化成 numpy 矩阵,放到一个 list 中。在此过程中,每张图片翻转后又保存了一次
    createdatamatrix 函数。将保存图片的 numpy 矩阵压平。(每张图片压平)
    createnewface 函数。产生特征脸并且用 opencv 可视化界面展示
    resetslidervalues 函数。在 opencv 可视化界面中,点击一下图片,就重置所有 bar
    总体思路:从文件夹中读取图片,变成矩阵,每张图片 flatten,用求平均向量,特征向量,再计算出 eigenface。

    3.4 GUI 部分有关文件:

    mainPage.py 主界面 GUI
    morphGUI.py 融合脸功能界面 GUI
    swapGUI.py 换脸功能界面 GUI
    eigenGUI.py 特征脸界面 GUI

    4.开发环境在本次项目中,算法几接口 API 都是由 pyhton3.5(python3.6)完成的,其中还使用了openCV 库。GUI 使用 pyqt 完成。API 使用 face++人脸关键点接口。
    5.可执行文件及使用的数据集5.1 数据集我们有 2 个数据集,其中一个 image_swap 是用于测试换脸操作的;另外一个 image_eigen 数据集是用来测试本征脸的,是 NBA 现役球员的图片。人脸融合测试图片,一定要是放在与该py文件夹中相同的文件夹,所以没有专门的数据集,可以从其他地方复制一些图片,进行测试。
    5.2 可执行文件及运行方式在 windows 下,我们有可执行文件 face#.exe。执行方式:双击打开,会看到我们 GUI 的初始界面。在界面中我们会看到三个按钮,这是我们 GUI 实现的三个功能,及人脸互换、人脸融合和本征脸。点击其中一个按钮,会进入下一层界面,具体的操作可以参考我们附加提交的操作演示视频。




    在 macOS 系统下,可以通过 python 文件名.py 命令运行我们的 python 文件。
    6.项目成果与反思6.1 项目成果6.1.1 人脸互换
    从测试结果图中,我们可以看到,我们的人脸互换效果还是非常好的:从前景图上截取的脸部,能够非常好地与背景图融合;在边缘部分,没有明显的边界;在人脸的姿势上,也根据背景的姿势得到了调整,能够与背景姿势相一致。当然我们也可以看到,在第二个结果中,由于前景脸和背景脸的脸部颜色相差太大,导致结果图中的脸部与额头等地方有明显的不一致,这是因为我们在做人脸互换的时候,只根据人脸关键点确定的凸包进行变换,而人脸关键点是没有包含额头及脖子部分的。这是我们人脸互换做的不好的地方
    6.1.2 人脸融合
    同样,对于我们人脸融合的结果,也非常好。在它融合度为 0.5 的情况下,包含了两张源图中一样多的特征,让我们能在结果图中能找到明显的属于两张源图的特征。但是同样存在一些问题,比如在上面一张结果中,我们可以看到头发部分有重影。这是因为两张源图片的头发差异部分存在白色的背景,当进行融合时,由于有两部分的特征,所以会造成重影;但是第二张结果图中,我们没有看到这个现象,这是因为两张源图的差异部分没有很白的背景颜色。
    6.1.3 本征脸
    对于我们的本征脸,我们在此解释一下左侧拖条的含义:首先我们这部分是对人脸数据集进行主成分分析,所谓的主成分就是数据中方差最大的一些方向,对应到人脸数据中,便是影响数据集中人脸的形态的最大的方向,或者说数据集中人脸变化最大的一些特征。比如,NBA 球员数据集中,球员的肤色有黑有白,这是变化非常大的特征,所以应该会有一个主成分只指向球员肤色的黑白的。而之所以右侧的结果会很模糊,正是因为我们计算出的主成分代表了人脸数据集中变化最大的特征,所以这些特征组成的图片必定是非常模糊非常不整齐的。
    6.2 项目思考与改进6.1.1 人脸互换我们的人脸互换算法依赖于人脸关键点锁定的区域,基本上限定于眉毛-两侧脸颊-下巴组成的区域,当两张源图的脸部颜色差别很大时,会出现结果图中脸部与额头差别很大的问题。所以,我们设想后续的优化是,将脸部的区域扩大到额头,乃至整个脖子,但是由于一般人脸检测的算法只限于原先的区域,如何检测这些扩展的区域,是一个较难解决的问题。
    6.1.1 人脸融合对于人脸融合中出现的结果图中脸部区域以外的重影问题,我们设想的优化是,将脸部以外的区域,全部设置成其中一张源图的背景区域。
    6.2.3 本征脸对于主成分分析得出来的若干个对人脸变化影响最大的特征,其中一些我们能够直观地看出来,例如肤色的黑白等,但有一些特征并不能很容易地得知与什么相关,需要我们进一步测试、观察与分析。
    6 评论 32 下载 2019-05-24 10:28:03 下载需要11点积分
  • 基于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 语句的练习不 够多而造成的,因此平常要注意多加练习。 当然我也认识到我们的系统还是有很多不足,除了数据库设计上的不足外,还有系统本身功能的不足, 例如顾客如果订很多张餐桌的话,每个单子的菜必须一致,且确定订单和结账都要操作多次,不利于用户体 验,再者不能重复点菜。各个表的主码中,只有订单号是系统自动生成,其他均由顾客自己输入,不利于管理。许多过程不可逆,例如无法没有取消订单功能等。还有很多细节上的还有缺陷,日后应当多加学习。
    4 评论 69 下载 2019-03-12 11:55:16 下载需要14点积分
  • 基于Android系统手机通讯录管理软件的设计与开发

    摘要谷歌在安卓领域投入了大量精力来开发,使得安卓技术得以广泛推广,现安卓移动平台设备在市场上已经得到大量推广及普及。在Android移动终端操作系统的快速发展,Android的各种手机软件也大量增长。当然,在手机终端中,手机通讯录是手机终端必不可少的基础功能,其质量直接影响着用户对手机使用的体验与感觉。手机通讯管理软件不仅仅只是能够简单添加联系人以及联系方式的功能,而今已发展成为多种形式,丰富了联系人的信息,存储了更多的内容。此课程设计研究的这个项目,主要实现添加联系人的多种联系方式的功能。
    本软件采用Android Studio+Android SDK集成环境,应用程序编程语言采用Java高级语言开发。通过对通讯录中的联系人的管理,来方便用户通讯更加便捷,联系人的数据保存更加安全。在对Android手机通讯管理软件进行详细的系统设计时,对功能进行详细的划分并对其功能做了详细的介绍,列出了一些主要功能流程图。
    关键词:通讯录 Android 数据库 SQLite
    第一章 绪论1.1 项目研究背景经过多年的发展,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。
    Android是一套真正意义上的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android最大特点在于它是一个开放的体系架构,具有非常好的开发和调试环境,而且还支持各种可扩展的用户体验,Android里面具有非常丰富的图形系统,对多媒体的支持功能和非常强大的浏览器。
    Android平台的开放性等特点既能促进技术的创新,又有助于降低开发成本,还可以使运营商能非常方便地制定特色化的产品。
    1.2 项目研究的目的及意义随着4G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。在Google和Android手机联盟的共同推动下,Android在众多手机操作系统中脱颖而出,受到广大消费者的欢迎。
    手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,有9成以上的消费者使用手机通讯录功能。随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展。通讯录从无到有,大大丰富了内容,同时结构也发生了革命性变化,而且随着手机的发展,相信更优秀的通讯录会越来越受到社会各层人士的喜爱。
    1.3 系统主要实现内容通过对Android技术的相关研究,了解Android源码实现原理以及过程,从而设计出一款能够使用的手机通讯录。
    这款手机通讯录实现的相关内容如下:

    简洁、实用的操作界面
    联系人的增删改查
    分类的增删改查
    呼叫联系人
    登录、注册、修改密码
    群组的增删改查
    导入导出联系人
    支持模糊查询手机通讯录

    第二章 系统分析2.1 系统可行性分析2.1.1 技术可行性Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java 应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。
    本软件用的是Java开发语言,在Android Studio集成开发环境下,调试容易。当前的计算机硬件配置或则现有安卓手机的硬件配置也完全能满足开发的需求,因此技术上是绝独可行的。
    2.1.2 经济可行性开发该系统所需的相关资料可以通过已存在的相关系统进行调查采集,所需的软件系统、硬件平台等都易于获得,且不需要Android平台机器,用模拟器即可实现开发研究,开发成本低,容易实现,从经济角度来看,该系统可行。
    2.1.3 操作可行性不管是安卓平台的手机,还是计算机,其成本的下降,导致计算机,安卓手机购买成本的降低.这套系统是利用自己的计算机,且使用安卓模拟器,使开发出来的系统有友好的用户界面、操作简单,因此在操作上是可行的。
    2.2 Android通讯录的使用意义该系统针对的主要用户是Android手机用户。Android手机通信管理系统包括以下主要内容:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等功能。要设计一个良好的手机通讯录,就必须首先明确该应用环境对系统的要求。
    第三章 系统概要设计3.1 系统总体设计Android手机通讯管理软件主要功能模块包括:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等。

    3.2 处理流程设计3.2.1 业务流程图用户首次进入手机通讯管理软件后,会进入用户注册界面,当用户注册成功之后,输入密码即可看到联系人列表界面。联系人列表界面右下方显示增加联系人按钮。上方可以进行联系人的多条件搜索。同时长按某个联系人可实现编辑删除功能。当然点击联系人也可以看到详细信息。界面中显示我的群组列表,打开之后即可进行群组的增删改查功能。点击菜单键,显示通讯录的导入导出功能以及修改密码功能。
    3.2.2 数据增加流程图添加联系人时,数据由用户输入,点击确定按钮,判断数据是否合法(及用户名是否为空),合法则插入到数据库;不合法,提示错误信息,让用户重新输入。流程如图所示:

    3.2.3 数据修改流程图编辑联系人时,点击编辑联系人菜单,输入修改后的数据,点击确定按钮,判断数据是否合法,合法,则更新数据库;不合法,则返回错误信息。 流程如图所示:

    3.2.4 数据删除流程当用户选定一个联系人时,单击删除联系人菜单,提示用户是否删除,点击确定按钮,则从数据库中删除此条记录。数据删除流程如图所示:

    3.3 数据库设计3.3.1 SQLite数据库简介SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低。
    本系统采用的是Android系统自带的SQLite轻型数据库数据库。因此占用资源非常小。
    3.3.3 数据库表结构首先创建数据库,在数据库中创建表用来存储联系人数据,其中包括联系人姓名、手机号、群组ID、地址等联系方式。创建群组表用来保存ID和群组名称等信息。两个表联合配合。表结构如图所示:

    第四章 系统详细设计4.1 联系人浏览模块进入手机通讯管理软件后,看到的第一个界面是联系人列表界面。该列表是由ListView控件生成的,打开数据库(如果数据库不存在则创建数据库,并创建数据表),查找数据库中所有的联系人,并把联系人姓名和移动电话号码以及职位这填充到ListView的adapter中。每一行显示一个联系人的姓名和手机号码,联系人的显示的顺序是根据插入数据库的顺序显示的。点击某个联系人会进入查看联系人界面,可以查看联系人的详细信息,对联系人进行编辑、删除、拨打电话、导入导出通讯录等。

    点击[菜单]按钮时,就会显示主菜单项,其中包括:修改密码、导出数据、导入数据。
    点击添加按钮,会进入添加联系人界面,可以输入联系人相关信息,完成联系人添加功能。点击上方搜索栏目,会进入联系人查找界面,可以进行联系人查找,搜索想要找的联系人。
    点击菜单按钮,打开修改密码、导出通讯录、导出通讯录等功能。

    长按列表的某一行时,会弹出长按菜单,其中包括:拨号、编辑联系人、删除联系人。点击查看联系人菜单会进入查看联系人界面。点击编辑联系人菜单会进入编辑联系人编辑界面。点击删除联系人时,会弹出对话框,询问是否删除联系人,点击确定,则从数据库中删除该联系人。

    4.2 查看联系人模块在联系人浏览界面点击某个联系人,则会跳转到该界面。该界面使用TextView把从数据库中调出的联系人的详细信息显示出来,这里面包括联系人姓名、手机号、地址等详细信息。

    4.3 编辑联系人模块编辑联系人界面使用EditView控件显示并修改联系人的详细信息。联系人的所有信息,处于可编辑状态,手机号和座机号的EditView设定为只能输入数字。修改完信息后点击确定按钮,触发确定按钮点击监听事件,从而对数据库中该联系人的信息进行更新, 然后自动返回联系人浏览界面。点击取消按钮会返回联系人浏览界面。

    4.4 查找联系人模块这里采用的查找方法是SQL模糊查询,可以只输入联系人姓名中的一部分,即可查找到所有包含该部分的联系人,并在ListView中显示出来所有的联系人的姓名和手机号码。可实现查找职位、手机号码、名字等信息。

    4.5 修改密码点击菜单,可以查看该软件的修改密码、导入导出等情况。并可实现全部功能。

    4.6 分类管理点击我的群组界面,可以查看群组并且显示群组。在里面可以对群组进行增删改查操作。
    6 评论 100 下载 2019-01-30 17:26:14 下载需要12点积分
  • 基于C#和Sql Server2008的疯狂的方言系统

    1 软件功能1.1 管理员功能
    查看:点击左上角导航“查看”,即可进入查看试题、用户资料,查看用户分数界面,对用户数据进行查看和修改
    修改试题:点击左上角导航“查看”,在下拉框选择查看试题,进入试题,对需要修改的试题进行修改并保存
    创建试卷:点击左上角导航“创建试卷”,即可进入创建试卷界面(见图4 创建试卷)点击“导入试卷”,选择需要导入的试卷excel表,下拉框“所属方言类别”内选择对应方言,点击“提交”,完成试卷的创建
    修改资料:点击左上角导航“修改资料”,即可进入资料编辑界面
    创建方言类别:点击左上角导航“查看”,在下拉框选择查看“方言类别”,进入方言类别界面,点击“新增”按钮,输入需要新增的类别名称,点击“确定”,完成方言类别的创建
    修改密码:点击左上角导航“修改资料”,进入资料编辑界面,点击“修改密码”,即可进入修改密码界面,进行密码的修改,按“确认”保存新密码
    退出登陆:点击左上角导航“退出登陆”,即可退出系统

    1.2 用户功能
    选择方言语种:点击左上角导航“查看”,在下拉框选择查看方言语种,即可进入选择方言语种
    选择试卷:点击对应方言类型的查看试卷,即可选择进入试题
    做试卷:进入相应类别的试卷界面后,点击一套试卷按钮,即可进入考试阶段
    修改用户资料:点击左上角导航“修改资料”,即可进入资料编辑界面
    修改密码:点击左上角导航“修改资料”,进入资料编辑界面,点击“修改密码”,即可进入修改密码界面,进行密码的修改,按“确认”保存新密码
    退出登陆:点击左上角导航“退出登陆”,即可退出系统

    1.3 功能结构图
    2 数据库设计说明2.1 数据字典2.1.1 用户数据字典(user)


    属性名
    存储代码
    类型
    长度
    备注




    用户编号
    user_id
    int

    系统用户编号


    用户昵称
    username
    string
    50
    系统用户真实姓名


    用户昵称
    userNickName
    string
    50
    系统用户昵称


    用户密码
    password
    string
    50
    系统用户密码


    用户身份
    identities
    string
    2
    系统用户身份


    用户性别
    sex
    int

    系统用户性别


    用户生日
    birthday
    timestamp

    系统用户生日


    用户qq
    qq
    string
    20
    系统用户qq


    用户邮箱
    email
    string
    50
    系统用户邮箱


    用户MSM
    MSM
    string
    50
    系统用户MSM


    用户相片
    picture
    image

    系统用户相片



    2.1.2 方言类型数据字典(class)


    属性名
    存储代码
    类型
    长度
    备注




    方言类型编号
    class_id
    int

    方言类型编号


    方言类型名称
    class
    string
    50
    方言类型名称


    管理员编号
    teacher_id
    int

    管理员编号


    创建时间
    regist_date
    timestamp

    班级创建时间



    2.1.3 用户选择加入方言类型数据字典(stu_class)


    属性名
    存储代码
    类型
    长度
    备注




    班级编号
    class_id
    int

    班级编号


    用户编号
    stu_id
    int

    用户编号


    加入时间
    join_date
    timestamp

    用户加入该方言类型的时间



    2.1.4 试卷数据字典(exam)


    属性名
    存储代码
    类型
    长度
    备注




    试卷编号
    exam_id
    int

    试卷编号


    试卷名称
    exam
    string
    50
    试卷名称


    管理员编号
    teacher_id
    int

    管理员编号


    创建时间
    create_date
    timestamp

    创建试卷时间


    方言类型编号
    class_id
    int

    试卷所属方言类型编号



    2.1.5 题目数据字典(question)


    属性名
    存储代码
    类型
    长度
    备注




    题目编号
    question_id
    int

    题目编号


    题目
    question
    text

    题目内容


    试卷编号
    exam_id
    int

    所属试卷编号


    答案
    answer
    text

    题目的答案


    选项
    option
    text

    题目提供的选项



    2.1.6 成绩数据字典


    属性名
    存储代码
    类型
    长度
    备注




    用户编号
    student_id
    int

    用户编号


    试卷编号
    eam_id
    int

    试卷编号


    成绩
    score
    float

    用户成绩


    用户答案
    answers
    text

    用户答案


    完成试卷日期
    answer_date
    timestamp

    完成试卷日期



    3 概念模型(E-R图)
    4 系统综述4.1 系统使用说明
    疯狂的方言系统包括:两个对象:管理员、用户
    用户功能:注册、登陆、修改密码、编制资料、选择方言类型、选择已加入方言类型试卷、做试卷、查看试卷分数、退出八个模块
    管理员功能:登陆、修改密码、编制资料、创建,编辑,修改方言类别、创建,删除试卷、查看用户资料、退出十个模块

    4.2 系统界面注册

    登录

    开始考试:进入选择方言类型页面


    点击查看考卷


    查看用户已做过试卷状态

    开始进入考试界面

    修改用户资料

    管理员首页

    查看方言类别

    查看所有试卷

    查看用户

    创建试卷

    5 系统测试报告5.1 系统编写过程存在的问题
    多线程循环播放背景音乐
    动态生成控件
    事件绑定

    5.2 如何解决
    通过查阅资料
    单步运行调试

    5.3 最后的系统存在哪些不足
    限制性:题库的导入文件格式限制为 xls,显得有些局限
    缺陷:

    登录界面没有“记住密码”这项功能没办法显示用户做完一道题的分数以及测试的计时
    建议:

    再添加一个控件,能够使得用户可以设置为每做完一道题自动跳到下一道题,方便用户做题按顺序摆放控件,以使可以通过TAB键跳到下一空格,方便用户填写资料按下“退出登录”控件时,添加提示“确认要退出吗”窗口,以避免用户由于不小心的原因按了退出所造成的麻烦登录之后可以直接跳转到主页面

    6 项目心得经过本次的数据库设计以及三层架构的运用,深深体会到要做好一个数据库系统的管理是那么的不容易。既要对需求进行详细的分析,又要对每一个table的属性进行严谨的思考,还要细致地把E-R图画出来,本数据库系统由于功能的需要,还需要利用HTML、PHP、JS以及SQL方面的知识来实现试题的上传、显示,界面的美化以及自动评分等功能。设计过程中,细心是最重要的,对属性的命名,修改的时候要特别注意把其他表格里也包含该属性名也一起修改,否则就会产生错误。
    1 评论 1 下载 2019-12-10 10:00:04 下载需要15点积分
  • 基于汇编语言实现的动画心程序

    一、软件背景介绍本程序是设计一彩色动画贺卡的程序,一个颜色方框从四周向中间由大变小,并留下痕迹,中心位置出现一颗红“心”。 其功能为:

    按任意键进入图形显示
    按空格键重复出现“心”
    按回车键将重复整个图形
    按q键退出程序

    由程序要实现的显示效果可见,程序中要引入多种图案,具体由方框、对角线、任意水平垂直线、“心”等来形成整个图案。所以要在程序中出现多次各种图案来填充整个图形。
    要显示出方框由大变小的效果程序采用绘制方框,再清除此方框,再显示更小一个方框的方法来实现。而方框本身和红心的绘制可采用字符拼凑和直接用图形模式制作。按q键退出的功能可以采用在动画执行完成后调用键盘输入中断,再判断输入的是否为q键,如果是则退出,不是则继续等待键盘输入。
    程序的运行过程:
    如图1所示,开始画面:

    如图2所示,按任意键,进入图形显示;按回车键,重新显示这个图形;绘制各个方格,进行下方颜色填充;按q键,则退出。

    本程序主要是利用BIOS功能调用的10H中断类型实现的。利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用dos功能调用的08号功能,从键盘输入字符。如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。
    该系统只是简单的运用字符进行设计组成相应的图像,运用masm编程工具、link连接程序在debug环境下进行调试而成。在系统中界面中,首先是按下任意键进入动画心界面。然后会按Q键退出的提示信息,其中包含2个隐藏信息:按空格键刷新心型图案,来实现动态心;按其余键是重复动画心的显示。
    其中主要运用的指令有:push(压入堆栈);Pop(从堆栈中释放首地址的内容);sub(减法指令);add(加法指令);mov(传送指令);call(过程调用指令);lea(地址传送指令);inc(加一指令);cmp(比较指令);jmp(跳转指令);jnz(条件跳转指令)。
    程序为一彩色动画的程序,一个颜色方框从四周向中间由大变小,并留下痕迹,中心位置出现一颗红“心”。
    本程序运行后的功能有:

    程序运行时显示提示信息,并提示按任意键进入动画心界面
    让一个方框向中间由大变小,并留下痕迹,然后出现一个心
    按空格键开始刷新心形图案
    按其他键首先清除图像,然后重复动画
    按Q键退出程序。

    二、核心算法思想本程序主要的模块有三个:第一是图形显示模块,构建基础的图形界面;第二是主程序,核心算法包括画方框子程序、画对角线子程序、画任意水平垂直线子程序、由大到小画方框子程序,填充子程序、画心子程序等;第三则是时间与界面控制程序,包括延迟子程序,清屏子程序。
    此处着重论述部分算法:
    画方框
    进入显示动画心的界面时,首先出现的是方框。采用了mov,sub,inc,cmp,jnz等指令进行了定义,来显示出方框的逐步显示。先是设置cx,dx,bx各个寄存器不同的初值,即设置像素点的颜色、坐标和个数,接着由大到小画方框,每画一个方框之前,各个寄存器都要设置不同的初值。
    画对角线
    和画方框差不多,每画一条对角线之前各个寄存器也要设置不同的初值。
    画任意水平垂直线
    画十字线之前,各个寄存器如cx,bx,dx也需要设定不同的初值。
    主程序设计
    先设置图形显示方式为320*200彩色图形方式、背景色为蓝色和设置彩色组,再利用其12号功能,设置像素点的颜色、坐标和个数,从而画出图形需要的线段,如画方框、画斜线、画水平垂直线,以及采用行、列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用dos功能调用的08号功能,从键盘输入字符。如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变“心”的大小;如果是“q”键,则退出。
    延时子程序
    先push cx,dx,即先让cx,dx进栈,接着设置dx寄存器的初值为25,利用其12号功能设置cx的初值为2801,利用其13号功能使之循环。在进行循环次数计数(即dx→dx-1)后,判断循环是否结束:如(dx)≠0,继续循环,转移到目标地址d12所在的指令,否则顺序执行。然后dx,cx顺序出栈。最后返回。
    清屏子程序
    先设置功能号al及寄存器bx,cx,dx的初值,接着进入line循环程序。在line循环程序中,先清除缓冲区并请求指定的输入功能,接着利用BIOS功能调用的10H中断类型实现显示器输出控制。在进行循环次数计数(即cx→cx+1)后,判断循环是否结束:如(cx)≠320,则继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次数计数(dx←dx+1)后,判断循环是否结束:如(dx)≠200,则继续循环,转移到目标地址line所在的指令,否则顺序执行。最后返回。
    三、核心算法流程图先设置图形显示方式为320*200彩色图形方式,背景为蓝色和设置彩色数组,在利用其12号功能,设置像素点的颜色,坐标和个数,从而画出图形需要的线段,如画方框,画斜线,画水平垂直线,以及采用行,列坐标连续写像素的方法填充图形等。画完图形之后延时,清屏。同时,利用dos功能调用08号功能,从键盘输入字符,如果是任意键,则进入图形显示;如果是回车键,则重新显示这个图形;如果是空格键,则改变心大小;如果是q键,则退出。以下是程序的核心算法流程图。
    主程序流程图

    程序流程图

    四、开发中遇到的问题在编写主程序时遇到了一些问题,我们在运行时发现了错误,后来发现在调用dos的08号功能时应该在AL中存放输入字符的ASCII码,而我们直接输入的字符。在画方框、对角线、任意水平线时先是设置cx,bx,dx各个寄存器赋予不同的初值,但我们在开始的时候没有把初值设置好,结果造成了程序的出错,后来经过调整才保证了程序的正常运行。
    然后最为重要的问题是,我们的函数执行顺序遇到了问题。期初,我们想的是先打印三个方框的同时进行画斜线的子程序,但这样的问题在于他们之间的执行顺序会在退出主程序造成麻烦,平添了许多代码,同时造成了资源浪费的问题。之后我们尝试着以更简单的思路线性执行子函数,并且构建了延迟子函数,以保证打印出效果很好,画面看起来也更加完善一些。
    延时子程序应该先push cx,dx,即先让cx,dx进栈,接着设置dx寄存器的初值为25,利用其12号功能设置cx的初值为2801,利用其13号功能使之循环。在进行循环次数计数(即dx→dx-1)后,判断循环是否结束:如(dx)≠0,继续循环,转移到目标地址d12所在的指令,否则顺序执行。然后dx,cx顺序出栈。最后返回。
    但我们在在编写延时子程序时,由于我没有压栈dx和cx,没有把外循环和内循环设置好,在运行程序时出现了错误。后来我对dx和cx进行压栈,把循环次数和循环语句设置好了,才把延时子程序编写好。
    进行清屏子程序时先设置功能号al及寄存器bx,cx,dx的初值,接着进入line循环程序。在line循环程序中,先清除缓冲区并请求指定的输入功能,接着利用BIOS功能调用的10H中断类型实现显示器输出控制。在进行循环次数计数(即cx→cx+1)后,判断循环是否结束:如(cx)≠320,则继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次(dx←dx+1)后,判断循环是否结束:如(dx)≠200,则继续循环,转移到目标地址line所在的指令,否则顺序执行。最后返回。
    而在编写清屏子程序时遇到的最大困难就是编写line循环程序了,我们开始没有把该循环程序的循环次数设置正确,后来经过一点点的改正才编写正确,(cx)≠320继续循环,转移到目标地址line所在的指令,否则再设置寄存器cx的初值,在进行循环次数计数(dx←dx+1)后,判断循环是否结束。
    最后进行调试的时候,代码的错误比我们想像的要多很多,而且犯了很多不该犯的错误,比如打错操作符等低级问题,这给我们敲响了警钟,做事确实要更认真才行。但有些BUG确实是难以寻找,绘制出来的图画完全不对,其中就有一段是该将cx寄存器的值给bx,但由于失误而写反了,这个问题我们找了很久才找到,确实让我们印象深刻。
    找到问题,修改问题,有时候确实要比写代码都复杂,细心真的很重要。最后的调试阶段中,很多错误我们都是闻所未闻的,百度了很多相关知识才能去修复一个错误,比如远程调用和近程调用就要加以区分。
    五、心得体会这次实训通过老师给的一些建议,经过自己的改写,实现要求。先做简单的输出,一步步的再做其它图案,在实际操作过程中犯的一些错误还会有意外的收获,感觉实训很有意思。在具体操作中对这学期所学的汇编语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之处,在以后的上机中应更加注意,同时体会到在整个程序的编写中,调试占了很大部分的时间。
    通过上机我发现上机实训更为重要,特别是要想写好汇编语言的程序,必须认真对待代码的每一个细节,还必须熟悉的掌握debug命令,这对程序的调试是非常重要的。
    通过实际操作,学会了汇编语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”,“不耻下问”等的寓意。
    2 评论 11 下载 2019-05-23 18:52:16 下载需要3点积分
  • 基于JAVA和MYSQL实现的清朝名人数据库系统

    摘 要清朝是中国历史最后一个大一统封建王朝,共传十帝,享国二百七十六年。为了能够将古代名人及各个朝代的皇帝的信息统一起来,使用数据库信息管理系统是很常见的 方法。数据库与 JAVA Swing 结合起来,既可以做出一个直观、简约的界面,也可以很容易实现添加、删除、查询和修改操作。同时也可以存储相当可观的资料。首先,利用 java 做出必要的界面,其中包括登录以及增删查改五个界面,其次,使用 JDBC 将已经存入名人、皇帝资料库的数据库连接起来,最后再加入指令代码,即可实现名人数据库 管理系统。在名人数据库管理系统设计完成之后,它必须具备界面中所对应的功能,即可以完成登录、注册、添加、删除、查询和修改操作,并且在数据库中会得到相应的反映。名人数据库管理系统相对于之前的管理方法及途径更方便管理,易于更新,最大化 的简化了管理员的管理工作,同时也让使用者更容易接受该系统。
    关键词:古代名人;管理系统;javaswing 开发;mysql 储存
    AbstractThe Qing Dynasty was the last unified feudal dynasty in Chinese history. It was handed down to ten emperors for 276 years. In order to unify the information of ancient celebrities and emperors of different dynasties, the use of database information management system is a common method. The combination of database and JAVA Swing can not only make an intuitive and concise interface, but also make it easy to add, delete, query and modify operations. At the same time, considerable data can be stored. Firstly, we use java to make the necessary interfaces, including login, add, delete and modify five interfaces. Secondly, we use JDBC to connect the databases already stored in celebrities and emperors’databases. Finally, we add instruction codes to realize the celebrity database management system. After the design of celebrity database management system is completed, it must have corresponding functions in the interface, that is, it can complete login, registration, addition, deletion, query and modification operations, and it will be reflected in the database accordingly. Celebrity database management system is easier to manage and update than the previous management methods and ways, which simplifies the management of administrators and makes users more receptive to the system.
    Keywords:Ancient celebrities; Management system; JavaSwing development; Mysql storage
    第一章 课题背景以前对古代名人管理的主要方式是基于文本、表格等纸介质的手工处理,对于数据信息处理工作量大,容易出错;随着网络的发展很多资料由纸质迁移到了网络上,但是 由于数据繁多,杂乱且良莠不齐,不易查找[1]。采用数据库技术生成的名人管理系统 将会极大地方便古代名人管理和使用人员,使得需要查找整理此类资料的人员从繁忙、复杂的工作进入到一个简单、高效的工作中。
    1.1 课题介绍进入 21 世纪,随着计算机和网络技术的飞速发展,数字资源越来越显现其重要作 用,依托计算机中的资源,建立具有文化特色的专题资源数据库,已成为许多机构的重要任务之一[1]。名人数据库就是其中的一种以收集、整理、开发、利用具有公众效应的 名人资料,并对名人资源进行重组、整合和分层次加工,实现多途径的管理和深层次地揭示名人资料的一种专题数据库[2]。
    名人数据库是一种以收集、整理、开发、利用具有公众效应的名人资料,并对名人 资源进行重组、整合和分层次加工,利用多个软件实现检索和增删查改的功能。建设名人数据库应具备资源、数据、技术和网络等方面的基础[2]。名人专题数据库的组织结构应以人为主线,并充分发挥 JAVA 的性能,集多功能为一体,具体结构框架可由 MYSQL 中建立的数据库、JAVA 的功能和 JDBC 连接构成。
    网络中虽然存贮大量古代名人资料,但是其中的内容也是鱼龙混杂。所以让当用户 们在网上查询名人资料时,虽然网页上囊括的知识比较多,但是事实上见效甚微[3]。为 了能够使得用户们可以更高效的查询到自己想要的知识内容,名人数据库管理系统应运而生。现代计算机可以帮助人们实现这些看似并不复杂的而实际操作起来非常不顺心的工作。试想一下,当用户想要查询某个人的资料时,只需要输入人物名字,就可以看到 该人的详细资料。设计名人数据库的目的便在于在计算机软件支持下,实现对名人资料信息采集、输入、输出,便于管理,便于检索的技术系统[4]。
    1.2 工具介绍1.2.1 java 语言Java 是一门面向对象编程语言,不仅吸收了 C++语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程[5]。
    Java 具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java 可以编写桌面应用程序、Web 应用程序、分布式系统和嵌入 式系统应用程序等。
    1.2.2 Eclipse 介绍Eclipse 是著名的跨平台的自由集成开发环境(IDE)。最初主要用来 Java 语言开发, 通过安装不同的插件 Eclipse 可以支持不同的计算机语言,比如 C++和 Python 等开发工具。Eclipse 的本身只是一个框架平台,但是众多插件的支持使得 Eclipse 拥有其他功能相对固定的 IDE 软件很难具有的灵活性。许多软件开发商以 Eclipse 为框架开发自己的 IDE[6]。
    Eclipse 最初由OTI和IBM两家公司的IDE产品开发组创建,起始于1999年4月。IBM 提供了最初的 Eclipse 代码基础,包括 Platform、JDT 和 PDE。Eclipse 项目 IBM 发起,围绕着 Eclipse 项目已经发展成为了一个庞大的 Eclipse 联盟,有 150 多家软件公司参与到Eclipse项目中,其中包括Borland、Rational Software、Red Hat及Sybase 等。Eclipse 是一个开放源码项目,它其实是Visual Age for Java的替代品,其界面跟先前的Visual Age for Java 差不多,但由于其开放源码,任何人都可以免费得到,并可以在此基础上开发各自的插件,因此越来越受人们关注[7]。随后还有包括 Oracle 在内的许多大公司也纷纷加入了该项目,Eclipse 的目标是成为可进行任何语言开发的 IDE 集成者,使用者只需下载各种语言的插件即可。
    1.2.3 SQL Server 简介SQL Server 是由 Microsoft 开发和推广的关系数据库管理系统(DBMS),目前最新版本是2012年3月份推出的SQL SERVER 2012。SQL是英文(Structured Query Language) 的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。SQL被作为关系型数据库管理系统的标准语言[8]。SQL语句可以用来执行各种 各样的操作,例如更新数据库中的数据,从数据库中提取数据等。
    1.3 章节安排本报告总共分为四个章节:

    第一章:主要写的是名人管理系统的背景、设计目的、使用的工具介绍等
    第二章:主要介绍该系统的实现的主要功能以及相应的模块
    第三章:主要介绍 MySQL 中主要的数据格式,以及实现各个功能的伪码
    第四章:主要写的是该系统的测试以及结果分析

    第二章 设计简介及设计方案论述整个应用系统的设计严格按照数据库设计的方法来进行,包括数据库的设计和应用程序的设计,两部分相辅相成[9]。数据库设计过程包含以下步骤:需求分析:系统的目 的、用户需求、功能流程图;概念结构设计:用 E-R 图来描述实体及实体间的联系;逻辑结构设计:确定关系模式,各种约束的声明,同时给出系统的功能模块组成图,系统 各模块功能;物理结构设计。数据库的实施阶段:数据库用 SQL SERVER 等创建,前端开发使用 JAVA 实现。
    2.1 需求分析所谓”需求分析”,是指对要解决的问题进行详细的分析,弄清楚问题的要求,包括需要输入什么数据,要得到什么结果,最后应输出什么。可以说需求分析是做系统之前必做的。需求分析是软件工程中的一个关键过程[10]。在这个过程中,系统分析员和软件工程师确定顾客的需要。只有在确定了这些需要后,设计者才能够分析和寻求新系统的 解决方法。需求分析阶段的任务是确定软件系统功能。
    2.1.1 用户需求在构造系统时,首先从需求出发构造数据库表,然后再由数据库表结合需求划分系统功能模块。这样,就把一个大的系统分解成了几个小系统。这里把系统划分为了三个模块:登录模块,管理员模块,用户模块。模块分别能够实现以下功能:

    登录模块,实现登录功能,注册功能
    管理员模块,实现管理员对名人的增删改减功能
    读者模块,实现用户查询功能

    2.1.2 系统目标根据需求分析及用户的沟通,该系统应达到以下目标:

    界面设计友好,美观
    数据存储安全,可靠
    信息分类清晰,准确
    强大的查询功能,保证数据查询的灵活性
    操作简单易用,界面清晰大方
    系统安全稳定
    开发技术先进,功能完备,扩展性强
    占用资源少,对硬件要求低
    提供灵活,方便的权限设置功能,使整个系统的管理分工明确

    2.2 概要设计数据库系统主要使用面向对象的分析方法,采用 JAVA、SQL语句来详尽地描述清朝历代皇帝和名人的详细资料,名人数据库管理系统可以分为两个大型模块:用户登录和 管理员登录[11]。
    用户登录是名人数据库系统中的一个重要部分,它虽然不能像管理员一样对数据库进行更新操作,但是管理员的存在也正是服务于用户,管理员的操作能够让用户查询到 相对准确的信息,同时也提高了用户查询的效率。同时给予用户查询功能可以防止一些不良用户对系统的恶意使用,进而保证了系统的安全性[12]。
    Swing 程序表示 JAVA 的客户端窗体程序,除了通过手动编写代码的方式设计 Swing 程序之外,Eclipse中还提供了一种Window Builder工具,该工具是一种非常好用的 Swing 可视化开发工具,有了它,开发人员就可以通过拖放组件的方式编写 Swing 程序了。
    当名人、皇帝的资料表导入 MYSQL之后,需要在 Eclipse 中做出几个必要的界面: 登录界面和增加、删除、查询、修改界面,同时也需要必须的管理员选择界面。在界面中设计采用 Window Builder 插件,进而在后台自动生成代码。
    数据库管理系统是在管理员对系统进行更新操作之后,数据库内的数据随之发生改 变。登录操作已经完成,其中包括用户登录与管理员登录。两种身份登陆之后出现的界面是不同的,用户登录成功之后只能进入查询界面,而管理员登录之后进入一个选择界面,可以自主选择增加、删除、查询、修改操作。
    登录操作已经完成,其中包括用户登录与管理员登录。两种身份登陆之后出现的界面是不同的,用户登录成功之后只能进入查询界面,而管理员登录之后进入一个选择界面,可以自主选择增加、删除、查询、修改操作。
    在管理员登录成功之后,进入一个选择界面,在这个界面中包含增删查改四个功能。在添加界面中,必须先输入人物的名字,并在文字提示框后输入相应的内容,进而通过系统将输入的信息录入数据库。
    增加、删除、修改三个操作中,无论其中哪一种进行操作,数据库中的数据也需要发生相应改变,这一点可以在基本实现系统中进行操作,操作完成之后打开 MYSQL的 表进行验证。
    管理员登录的数据需求分析用户的需求具体体现在各种信息的提供、保存、更新和查询上,这就要求数据库结构能充分满足各种信息的输出和输入。其主要模块示意图如 图 2.1 所示。


    增加信息(管理员身份):在界面上输入相应的名人信息后,经过系统确认即可以在数据库中存储名人的信息,并且在查询界面可以查询到相应的信息
    查询信息(管理员身份):输入人物名字,选择该人物的身份(皇帝或者名人),经过系统查询之后即可在界面上显示相应内容
    删除名人(管理员身份):在相应界面中输入需要删除的名人姓名,确认之后系统将删除该名人信息,并在数据库中清除该名人信息
    修改信息(管理员身份):在修改界面中输入名人姓名及相应的信息,系统确认之后即可修改信息,并且在数据库中得以修改,在查询界面亦可查询到更新后的信息
    查询信息(用户身份):输入人物名字,选择该人物的身份(皇帝或者名人),经过系统查询之后即可在界面上显示相应内容
    登录验证(用户身份):输入用户名字和密码,点击登录,通过验证即可登录跳转用户查询界面,假如密码错误,则显示“该用户不存在”
    登录验证(管理员身份):输入管理员名字和密码,点击登录,通过验证即可登录跳转用户查询界面,假如密码错误,则显示“该管理员不存在”
    用户注册(用户身份):在用户登录界面点击用户注册,输入用户名和密码以及 Id,点击确定,即可注册成功

    第三章 详细设计概念设计是由分析用户需求到生成概念产品的一系列有序的、可组织的、有目标的设计活动,它表现为一个由粗到精、由模糊到清晰、由抽象到具体的不断进化的过程。概念设计即是利用设计概念并以其为主线贯穿全部设计过程的设计方法。概念设计是完整而全面的设计过程,它通过设计概念将设计者繁复的感性和瞬间思维上升到统一的理性思维从而完成整个设计。
    3.1 逻辑设计逻辑设计就是把一种计划、规划、设想通过视觉的形式通过概念、判断、推理、论证来理解和区分客观世界的思维传达出来的活动过程。逻辑设计比物理设计更理论化和抽象化,关注对象之间的逻辑关系,提供了更多系统和子系统的详细描述。
    3.1.1 关系模型概念结构设计所得的 E-R 模型是对用户需求的一种抽象的表达形式,它独立于任何一种具体的数据模型,因而也不能为任何一个具体的 DBMS 所支持。为了能够建立起最终的物理系统,还需要将概念结构进一步转化为某一 DBMS 所支持的数据模型,然后根据逻辑设计的准则、数据的语义约束、规范化理论等对数据模型进行适当的调整和优化,形成合理的全局逻辑结构,并设计出用户子模式。这就是数据库逻辑设计所要完成的任务。
    数据库逻辑结构的设计分为两个步骤:首先将概念设计所得的 E-R 图转换为关系模 型;然后对关系模型进行优化,如图 3.1 所示。

    关系模型是由一组关系(二维表)的结合,而 E-R 模型则是由实体、实体的属性、实体间的关系三个要素组成。所以要将 E-R 模型转换为关系模型,就是将实体、属性和联 系都要转换为相应的关系模型。
    本系统的关系模型转换如下:
    user (id,username,password)people(id,name,national,place,time,work,message)emperor(id,name,national,yearname,place,miaohao,overtime,message,shihao)3.1.2 系统功能总框图书馆管理系统功能总框图,如图 3.2 所示。

    3.2 物理设计数据库在物理上的存储结构与存储方法称为数据库的物理结构,它依赖于选定的数据库管理系统。为一个给定的逻辑数据模型选取一个最适合应用要求的物理结构的过程, 就是物理设计。
    3.2.1 基本表设计由于名人数量过于繁多,需要先从网络中收集名人信息,并按照一定的属性存放在 Excel 工作表中。清朝名人分为皇帝、名人两个表,并在收集工作完成之后导入 MYSQL 中,在 MYSQL 同样需要两个表进行存储[10]。
    皇帝表需要的属性有 Id、姓名、在位时间、民族、年号、庙号、成就,在 MYSQL 存储方式如表 3-1 所示。



    属性
    存储类型
    是否可为空




    Id
    Var char(10)



    姓名
    Var char(10)



    在位时间
    Var char(10)



    民族
    Var char(10)



    年号
    Var char(10)



    庙号
    Var char(10)



    成就
    Long text




    名人表需要的属性有 Id、姓名、时期、民族、官职、出生地、成就,在 MYSQL 存 储方式如表 3-2 所示。



    属性
    存储类型
    是否可为空




    民族
    Var char(10)



    Id
    Var char(10)



    时期
    Var char(10)



    姓名
    Var char(10)



    官职
    Var char(10)



    成就
    Long text



    出生地
    Var char(10)




    对于数据库中的皇帝表和名人表存在一定联系,其中的实体与属性的联系如图 3.1 所示。

    3.2.2 系统功能设计当名人、皇帝的资料表导入 MYSQL之后,需要在 Eclipse 中做出几个必要的界面: 用户和管理员登录界面、用户注册界面、增加、删除、查询、修改界面,同时也需要必须的管理员选择界面。在界面中设计采用 Window Builder 插件,进而在后台自动生成代码[10]。
    在用户和管理员登录界面中,在键盘上输入用户名和密码,如果为空或者用户名与 密码不匹配都会给出错误提示并无法登录,且在登陆之前需要选择登录身份,即选择“管理员”或者“用户”。如果登陆错误次数超过一定数目,同样会导致无法登陆。如果登 录成功则进入相应的界面。故可以写出登录伪码:
    If 用户名=空 Then 输出 "登录用户名不能为空,请重新填写!" ExitEnd IfIf 密码= 空 Then 输出"登录用户密码不能为空,请重新填写!"End If If 选择身份=空 Then 输出 "你没有选择用户身份,请选择!" Exit End If连接数据库之后,核对过账号密码; 输出"祝贺你!你已经成功登录!" "如果账号密码不匹配,输出"对不起!你输入的用户密码不正确,请重新输入!" 次数 + 1;重新输入; 如果连续三次不正确,则输出“对不起,你已经连续三次输入错误,不能继续登录 程序就退出!" End ELSE If 身份 = "管理员" Then 出现选择界面 Else If 身份= "用户" Then 出现查询界面 End If此时,登录操作已经完成,其中包括用户登录与管理员登录。两种身份登陆之后出 现的界面是不同的,用户登录成功之后只能进入查询界面,而管理员登录之后进入一个选择界面,可以自主选择增加、删除、查询、修改操作。
    在管理员登录成功之后,进入一个选择界面,在这个界面中包含增删查改四个功能。在添加界面中,必须先输入人物的名字,并在文字提示框后输入相应的内容,进而通过系统将输入的信息录入数据库。
    If 身份= "皇帝" Then 查找皇帝名字; 更新信息; End If If 身份 = "名人" Then 更新信息 If 信息错误 输出"添加失败",Else 输出"添加成功" End If对于增加操作,实际上是在系统中键入皇帝或者名人的资料,在 UTF-8 格式中的信 息会被系统识别,所以在文本框内添加信息会被系统录入。在选择了身份之后,系统会根据代码将信息录入对应的表中,进而将存入的信息放入数据库中,在添加之后,就可以在查询界面中查到相应结果。
    同样的,在实现删除功能之前,首先要通过 SQL 语句连接上数据库,在管理员输入了人物姓名之后,系统查找出相应的人物,进而删除掉该任务的所有信息,有删除界 面伪代码如下:
    连接数据库; If 身份= "皇帝" Then 查找皇帝名字; 删除; End If If 身份 = "名人" Then 删除; If 信息错误 输出"添加失败" Else 输出"添加成功" End If删除功能实际为系统在识别查询出管理员键入的人物名字之后,在数据库中将相应的信息更新为空,同时将姓名置空,所以在删除之后,数据库中该人物的资料已经被清除,无法再被查询出来。
    在修改功能中,管理员首先通过输入人物名字并选择相对应的身份(皇帝或者名人),在相对应的文本框内输入更改后的信息,在输入完成之后,点击修改,系统则会自动修改数据库内的人物信息。修改界面伪代码如下:
    连接数据库; If 身份= "皇帝" Then 查找皇帝名字; 修改信息; End If If 身份 = "名人" Then 修改信息; If 信息错误 输出"修改失败" Else 输出"修改成功" End If修改功能中同样是经过识别之后,找到相应的人物,将其中的信息更新为管理员键入的新内容,伪代码中的“修改信息”实际上是将管理员键入的内容代替原来的资料,从而做到信息更改。
    用户或者管理员都可以使用查询界面,在此界面中,需要在文本框内输入人物名字,再选择人物的身份(皇帝或者名人),点击查询,系统则会输出对应的人物信息,如果信息错误则无法输出。查询界面伪代码如下:
    连接数据库; If 身份= "皇帝" Then 查找皇帝名字; 输出信息; End If If 身份 = "名人" Then 输出信息; If 姓名错误 输出"查询失败"Else 输出"查询成功" End If查询信息的运作方式与其他操作类似,在用户或者管理员选择人物身份之后,系统在数据库的表中查询对应的人物名字,查询成功之后在界面上显示出内容。伪代码中的“输出信息”实为将表中的某一项内容特定输出,在不同的文本框内输出不同的内容。
    增加、删除、修改三个操作中,无论其中哪一种进行操作,数据库中的数据也需要发生相应改变,这一点可以在基本实现系统中进行操作,操作完成之后打开 MYSQL的表进行验证。
    四种操作已经基本完成,也就是 MYSQL 和 Eclipse 两个软件的工作已经完成,此时需要使用 JDBC 将二者进行连接,才能在 Eclipse 中的界面实现对应的功能。打开 NAVICAT FOR MYSQL 后,建立连接,新建数据库,在 JDBC 的连接 MYSQL。即完成了 Eclipse 与 MYSQL 的连接。
    第四章 设计结果及分析系统有 3 个模块:登录模块,管理员模块和用户模块。登录模块实现登录功能, 注册功能;管理员模块实现名人的增删改查;用户模块实现名人查找功能。
    4.1 功能测试在 Eclipse 打开工程,即可进入用户登录界面,登录界面显示如图 4.1 所示。

    选择用户身份进行登录操作时,点击注册用户,注册用户账号密码,即可完成注册,显示如图 4.2 所示。

    注册用户账号密码及序号填写完毕后,即可完成注册,具体结果显示如图 4.3 所示。

    使用数据库中已经存储的用户账号密码,进行登录,登录成功界面如图 4.4 所示。

    查询界面选项界面,在此界面中,需要选择人物的身份(皇帝或者名人),在文本框内输入人物名字,再点击查询,显示如图 4.5、4.6 所示。


    选择人物的身份(皇帝或者名人)之后,在文本框内输入人物名字,再点击查询,系统则会输出对应的人物信息。显示如图 4.7、4.8 所示。


    选择以管理员身份进入系统,显示管理员登录验证界面,输入管理员帐号和密码,点击登录按键,如图 4.9 所示。

    管理员帐号、密码和数据库管理员信息表比对后,验证成功,即可出现管理员主界面如图 4.10 所示。

    选择皇帝中的查询,即可看到添加窗口,名人和此界面一样,如图 4.11,图 4.12 所 示。

    点击添加皇帝,即可成功添加皇帝 选择皇帝中的查询,即可看到查询窗口,名人和此界面一样,如图 4.13 所示。

    搜索刚才的添加皇帝,即可进入皇帝的删,改界面,如图 4.14 所示。

    加入新的文字,或者修改旧信息,即可做到修改皇帝的功能,如图 4.15所示。

    直接点击删除按钮,即可做到删除当前页面皇帝的功能。
    4.2 结果分析一款好的名人数据库管理系统是在管理员对系统进行更新操作之后,数据库内的数据随之发生改变。在这一款清朝名人管理系统中,经过增加、删除、更改之后,再次查询人物信息都能得到正确的结果,说明在各种操作之后,数据库中的数据同样改变,可以评价为这一款名人管理系统是相对比较成功的。
    管理员增加、删除、修改三个操作中,无论其中哪一种进行操作,数据库中的数据也需要发生相应改变,这一点可以在基本实现系统中进行操作,操作完成之后打开 MYSQL 的表进行验证。四种操作已经基本完成,也就是 MYSQL和 Eclipse 两个软件的 工作已经完成,此时需要使用 JDBC 将二者进行连接,才能在 Eclipse 中的界面实现对应的功能[11]。
    总 结经过两周的努力,清朝名人管理系统终于完成,经过这次综合设计,自己总结了这个名人数据库管理系统的一些问题,不过收获还是颇为丰富的,再有理论知识上结合实践,使我学到了更多知识。
    首先,更进一步的了解了系统分析与设计、JAVA、JDBC 的基本操作,在这之前,系统分析与设计的学习仅仅刚开了个头,我们只是在了解一些概念性的东西。在做这个系统之前,我连基本的系统分析与设计,界面设计等这些东西都不熟练。现在对于系统中的增删改查操作比较熟练了。
    对于初学者来说,比较头疼的就是对于数据库连接的处理。我的建议是如果不理解先把按照课本上正确的语句敲,然后在多次进行数据库的链接,增删改查操作中不断总结规律。
    这次设计的名人数据库管理系统,全在自己所掌握的知识下,进行系统分析与设计,完全体现了自己在系统分析与设计中设计课程学习状况,充分地为自己以后更深入了数据库语言奠下深厚的基础。 纵观此名人数据库管理系统的整体概况,目前,自我认为设计良好,相关功能都能够实现,功能强大,条理清晰,界面可观性比较好。并且特色在于,所设计的表单都在一个表单系统桌面中运行,比较符合系统的观念。 在系统设计的过程中,我从中发现,学习系统分析与设计要细心和有耐性,并且要不断地从外界学习更多的技术才能设计出一套完美的系统。
    参考文献[1] 余丽君.关于建立沈阳名人数据库的设想[J].图书馆学刊,1999,21 (6):19-20.
    [2] 赵志刚,王伟.使用 SQL Server 管理应用程序服务数据[J].沈阳师范大学学报(自然 科学版),2010,28(2):233-235.
    [3] 黄欣欣.浅谈权限管理系统的需求分析[J].科技信息,2010(16):69-70.
    [4] 杨华.基于 B/S 模式的高校仓库管理系统的需求分析[J].无线互联科技,2014(8): 71-71.
    [5] 周龙.分布式数据库管理系统实现技术[M].科学出版社,1998.15-16.
    [6] 张慎明,卜凡强,姚建国.遵循 IEC61970 标准的实时数据库管理系统[J].电力系 统自动化,2002,26(24):26-30.
    [7] 廖卫东.陈梅. JAVA 程序设计[M].机械工业出版社,2008.268-346.
    [8] 李素若.JAVA 面向对象程序设计[M].北京化学工业出版社,2008.126-136.
    [9] 傅仕星.JAVA Swing 设计基础[M].清华大学出版社,2003.68-89.
    [10] 刘彦明.数据库基础设计与开发[M].西安电子科技大学出版社,2009.56-67.
    [11] 华轩逸.JAVA 面向对象程序设计(第二版)[M].北京:中国铁道出版社,2012.21-29.
    [12] 郑国果.JAVA 语言程序设计(第 4 版)[M].北京:清华大学出版社,2010.33-38.
    2 评论 13 下载 2019-02-25 17:35:27 下载需要16点积分
显示 0 到 15 ,共 15 条
eject