magipige的资源

  • 基于Java实现的RPG小游戏

    1.项目管理
    2.使用现代工具
    开发语言:JAVA
    开发工具:MYEclipse2014 JDK 1.8
    代码自动生成工具:WindowBuilder

    3.设计/ 开发解决方案3.1 总体设计设计一个登陆界面UI,并可通过桥梁模式分别实现不同功能,包括登陆,退出等。
    登陆后通过鼠标激活游戏,绘制地图,确定人物初始位置。而后可通过人物进行伴随动画移动操作,可通过观察者模式监控人物的移动情况、登陆情况并发送通知。。
    可根据地图砖块不同获得不同的移动速度,并设置不可跨越,具有碰撞体积地图装饰物,与人物产生互动。
    3.2 需求分析3.2.1 系统目标设计一个可以运行的RPG游戏,拥有人物,地图,地图装饰物。人物可以通过键盘控制进行移动,并对不同砖块产生不同速度反应,可与被特定砖块和地图装饰物阻碍,并有移动的动画效果。
    3.2.2 功能要求
    地图:显示地图,绘制地图,绘制不同砖块
    人物:显示人物,有动画效果移动,可对不同砖块和地图装饰物做出反应
    地图装饰物:在特定显示地图装饰物,可产生阻挡效果

    3.3 详细设计3.3.1 功能模块设计
    配置文件功能 MapConfig:存储配置信息,以供程序初始化使用。
    地图绘制功能:通过命令模式命令来自动绘制地图,在地图上添加不同砖块
    图片加载功能:可加载外部素材已完善地图、人物、地图装饰物
    人物移动功能:可显示,可以通过键盘控制移动,拥有动画效果,可观察,可对不同地图及地图装饰物做出反应
    地图装饰物功能:可在特定位置显示,置于砖块之上,可选择是否具有阻挡效果
    摄像机功能:始终将玩家定位于游戏框中央,镜头跟随玩家移动,不会显示地图边界外面的东西
    UI引导功能:UI设计引导玩家进行操作

    3.3.2 业务流程设计
    4. 系统测试
    测试环境:JAVA
    工具 :MYEclipse2014 JDK 1.8

    4.1 登陆界面UI
    4.2 桥梁模式-按键不同功能

    4.3 登陆,鼠标激发,地图绘制,显示人物初始位置



    4.4 观察者模式—服务器通知
    4.5人物移动及服务器通知

    4.6 阻挡碰撞-砖块


    4.7 阻挡碰撞-地图装饰物


    5. 所用模式的标准UML 图5.1 单态模式—game
    只定义一个game实例,并且拥有取得该实例的方法。
    5.2 抽象工厂模式—生成Map和Mapconfig组合成地图文件

    abstractFactory是抽象工厂,MapFactory ,mapCofigFactory是具体工厂
    Map和mapConfig是抽象产品,testMap和testmapCofig是具体产品

    上面的类的实现Kuuhakugame.order.Receiver1里面。
    5.3 桥梁模式——创建UI
    5.4 观察者模式——观察相应变化 observer
    (抽象)主题(backGroundServer)
    (抽象)观察者(Observer)
    具体主题(Concrete backGroundServer)
    具体观察者(ConcreteObserver)


    5.5 命令模式——-地图绘制
    5.6 适配器模式——-实现Observer接口
    5.7 责任链模式——处理相应的请求
    5.8 享元模式 ——维护地图上面的实体
    5.9 策略模式—-定义走路速度
    5.10 代理模式—-代替主类执行初始化
    1  留言 2021-01-07 09:25:01
  • 基于Java和MySQL实现的在线银行系统

    一、概述本系统提供客户端及服务器端两个可以独立运行的程序。在服务器开启的前提下,客户端可以进行注册、登录、存款、取款、查询余额、申请贷款、还款等操作。服务器端可以对客户端的消息进行相应的响应,并且将信息存在数据库中。
    二、客户端说明客户端提供控制台界面,在控制台中根据提示输入相应的数字即可进行操作。下面对客户端提供的功能作简单说明:

    注册:根据软件提示,输入要注册的用户名和密码即可注册
    登录:输入用户名密码即可登录,服务器会返回登录结果
    存款:向活期存款账户存入款项
    取款:从货期存款账户中取款,可能存在余额不足的情况
    查询余额:查询当前账户的活期存款账户与定期存款账户的余额
    贷款申请:根据要求,输入贷款数目与贷款期限,服务器会返回是否同意贷款。贷款审批通过后,所贷款项会被即时存入活期存款账户。具体贷款同意规则为: 客户为活跃用户,也就是去年有三次以上的交易(包括存款、取款、查询);客户当前没有其他未还清贷款;贷款申请额度不超过活期存款、定期存款总额之和
    还款:用于偿还贷款

    退出登录:退出当前登录的用户

    除了以上功能,当登录用户因为逾期未还款而处于冻结状态时,取款、查询、贷款申请操作将会被服务器拒绝,登录用户仅能通过存款、还款功能偿还欠款。当还清所有欠款后,账户会自动解冻。
    三、服务器端说明服务器端使用了多线程技术,使用了主线程控制至多10个客户端响应线程,以及用于增加利息、查询贷款状态、处理活跃状态等功能的管理线程。同时使用了JDBC进行数据库连接。此外,在具体细节的实现上,服务器端具有审批贷款和到期贷款按次序扣费的功能,并能会在登录时验证用户冻结状态。
    在用户端和服务器端的通信上,我使用了Java网络编程中的相关类,利用TCP/IP协议进行通信。同时约定了消息类型,用于请求和响应的识别。如A型消息用于用户创建请求与响应,B型消息用于登录请求与响应等等(具体消息类型的具体用途在类中有相关注释说明)。
    四、数据库说明数据库使用MySQl,在数据库onlinebanksystem中有三个表:account_information、loaniterms_information、savingiterms_information。
    其中,account_information用于存储用户的基本信息。存有帐户名的hashcode,帐户名,密码(hashcode),活期账户余额,定期存款项目数,有无贷款,是否被冻结,上一年度活跃操作数量。
    loaniterms_information用于存储所有的贷款信息。存有帐户名的hashcode,贷款金额,贷款类型,贷款开始时间,当前贷款已还金额,当前应还款金额。
    savingiterms_information用于存储所有的定期存款信息。存有账户的hashcode,金额,定期存款类型,定期存款开始时间,是该用户的第几笔定期存款。
    五、软件特点及部分细节5.1 软件特点
    程序采用UTF-8编码,如果数据库编码方式也全设置为UTF-8,则可以支持所有Unicode字符作为帐户名
    数据库存储中对重要信息进行了简单的加密(hashcode)
    服务器中提供运行日志功能,运行的各个函数会将关键信息打印在控制台上,可用于监控服务器运行状态。可以利用文件输入输出流将运行日志导出到文本文档中

    5.2 实现细节
    系统中设置1分钟为系统中的一年,活期账户加息、去年账户活动次数均是一年进行一次操作
    贷款偿还的方式为等额本息还款,即每期应还款金额=(贷款本金+贷款本金*年利率*贷款年限)÷ 贷款年限
    本系统不提供定期存款的自动转存功能,所有到期的定期存款自动连本金带利息存入货期存款账户

    数据库中的表



    使用实际情况截图


    测试过程中,不知什么原因,服务器端无法通过java -jar server.jar调用,但是在eclipse中运行正常。在eclipse正常运行服务器端的状态下,可通过java -jar client.jar在命令行中使用客户端。
    1  留言 2021-01-06 12:46:59
  • 基于JAVA的葫芦娃大战妖精

    一、综述葫芦娃是我国动画界经典IP,与《西游记》一样,经常被人拿来使用。正如六小龄童六老师所说:“戏说不是胡说,改编不是乱编”,葫芦兄弟大战妖精的游戏还是应当遵照动画的原意。
    游戏提供简单的GUI界面,帧率高达10帧,提供了简单易用的操作方式,菜单栏选择进行新对局或回放历史对局,当功能选择好后,用户只需按下空格键,程序便会开始进行新对局或播放历史对局。鉴于游戏并不复杂,谁胜谁负一眼就能看出,所以并没有做胜利界面。
    二、程序使用手册1、开始一场新战役1.1 首先在菜单栏选择该功能
    1.2 选择完后,自动摆放阵型,此时按下空格战斗开始
    2、回放历史战斗2.1 首先在菜单栏选择该功能
    2.2 在弹出的文件窗口选择要回放的文件,选择完后点击打开并按下空格开始回放。注意!所有战斗都会被自动保存,保存的文件名根据当前时间设置为年_月_日_时_分_秒.txt(yyyy_MM_dd_HH_mm_ss.txt)

    三、架构解析1、生物逻辑每个生物都有许多属性,包括位置、攻击力、防御力与血量,这些属性都是根据动画中的相关剧情决定的。生物可以在战场上自由走动,走动方向的确定是根据与该生物之间曼哈顿距离最短的生物所处位置决定的,战场上分为八方:编号为0,1,2,3,4,5,6,7

    生物按0~7的顺时针方向探测与自己曼哈顿距离最近的敌对生物,检测到后,会优先沿与该区域相邻的坐标防线前进,例如检测到曼哈顿距离最近的敌对生物在0区域,则首先会判断能否向上走,能则向上走一步,如果上方战场格子上有其他生物,则再判断能否向左走。
    这样游戏中的生物们很快就能进行战斗从而分出胜负。战斗时血量在70%以上血条为绿色,40%~60%为黄色,40%以下为红色

    葫芦娃🐸
    葫芦娃是葫芦兄弟阵营的主力输出,具有高攻击力和较高的防御力。

    爷爷👴
    爷爷年老体衰,攻击力与防御力是所有生物中最低的。

    蝎子精🦂
    蝎子精作为肉体最强生物,拥有远高(<300%)于其他生物的攻击力、防御力和血量。

    蛇精🐍
    蛇精攻击力,防御力与血量一般。

    小喽啰🕷🦇
    攻击力防御力弱,炮灰。
    2、战场设计战场为10*20的矩形,其中左边10*10的矩形是葫芦兄弟阵营(含7个葫芦娃和1个爷爷)的初始摆放处,右侧10*10的矩形是妖精们(含多个小喽啰,1个蝎子精和1个蛇精)的初始摆放处,当用户点击新对局按钮时,双方会在自己的初始摆放处列阵。战场的每个格子都是一个战场格子类引用,如果该格子上有生物,则会使该引用指向一个实例化的战场格子,实例化战场格子中存有该生物的引用,同时该生物自己也存有自己所在战场坐标。
    列阵遵循随机原则,葫芦兄弟团结一线,总是摆出一字长蛇阵,共同面对敌人,将葫芦七兄弟按照作业二排序后,随机生成一个葫芦兄弟阵地的坐标,检测从该坐标起向下沿伸(沿x坐标增大的方向),如果能放下,则将葫芦兄弟放置在战场上,否则再次生成随机坐标,重复上述步骤。
    爷爷在葫芦兄弟上场后登场,随机生成一个葫芦兄弟阵地的坐标,检测该位置,如果没有葫芦娃,则在此放下爷爷,否则重新生成随机坐标,重复上述操作。
    蝎子精带领小喽啰先排阵型。随机选择一个阵型(鹤翼、雁行、衡轭、鱼鳞、方门、偃月和锋矢)后,生成相应数量的蝎子精和小喽啰,按照阵型个体摆放顺序放置在一个向量Vector中,之后随机生成一个妖怪阵营阵地的坐标,检测以该坐标为阵型所占最小矩形的左上角,能否在阵地中放置该阵型,能容纳则摆放该阵型,如果不能则重新生成随即坐标重复上述步骤。
    蛇精的放置方式与爷爷相同,不做赘述。
    3、并发控制由于每个生物都是一个独立的个体,而且在现实世界中,每个个体的行为方式也都是不一样的,自然就需要将每个生物视为一个单独的线程,既然有了线程,就涉及到了并发,现在就来详细分析一下本程序中涉及到的并发问题。
    3.1 javaFX线程与Canvas线程javaFX线程与Canvas线程分属两个线程,Canvas对于UI的所有操作都应当在写在匿名内部类中。
    Platform.runLater(()->{ ...});
    3.2 同步问题同步问题主要发生在生物在战场中移动时。当生物想要移动时,它首先会检测要移动方向上有没有其他生物阻挡,如果没有,则移动,如果有,则不移动,考虑以下两种情况:1、当生物A检测到临近某格子空,想要移动到该格子,此时另一生物B恰好在A检测完但还没来得及移动时移动到了A想要去的格子上,但A并不知道此事,于是A也移动到了该格子上了,于是含有B的实例化战场格子类便被含有A的实例化战场格子类覆盖掉了。2、当生物A检测到临近格子空,想要移动到改格子,此时另一生物B恰好在A检测完但是还没来得及移动时,想要移动到A的格子上,此时由于A还未移动,所以B认为不能移动,然而实际上A马上就要移开,B是可以移动到A的原位置的。为了解决这两个问题,将检测格子为空和移动到改格子这两个动作整合在一个方法中,并且该方法只允许一个进程进行调用。
    //生物直接调用该方法,如果移动成功则返回true,不成功则返回falsepublic boolean SetBFPosition(int x, int y, Creature t) { synchronized(BattleFields.class){ if(!isEmpty(x,y))return false; else { BFs[x][y]=new BattleField<Creature>(t); return true; } }}
    注意:本文第三部分2中并未写出synchronized关键字
    类似的问题还有:1、例如生物A想要移动到某个格子,就在A检测完还未移动时,B对该格子进行攻击,但发现格子为空,攻击落空,但实际上A移动过来被B攻击了。2、生物想要移动到某个格子,就在A检测完还未移动时,B对A进行攻击,A掉血,但是实际上A离开了,B的本次攻击落空。这个问题可以将取得战场某格子生物引用的方法设置为同时只能由一个线程访问解决。
    还有一些其他的类似问题,解决方法和原理大都类似,不过多进行赘述。
    四、源码1、依赖关系凑合看看,实线代表继承自,虚线代表聚集

    2、类与方法
    package java2018.CalabashBrother.application
    Main.java
    package java2018.CalabashBrother.application;public class Main extends Application { //用以指示用户选择的功能 private int play;//菜单栏的高度,显示战场的时候要整体下移菜单栏高度 static int menuBarHeight = 35; //功能选择和MainCanvas类的实例化 @Override public void start(Stage primaryStage); //整个程序的入口 public static void main(String[] args) { launch(args); }}
    MainCanvas.java
    package java2018.CalabashBrother.application;public class MainCanvas extends Canvas{ //葫芦娃阵营人数,归0时战斗结束 private int goodboyCount = 8; //妖怪阵营人数,归0战斗结束。两阵营人数在新战役开始时都会被初始化,此处-1仅作为判断方便 private int badboyCount = -1; //指示战斗是否开始,用以忽略战斗过程中用户的空格输入 private boolean begin = false; //战场 private BattleFields BFs; //战场的上帝视角 private Director director; private GraphicsContext gc; //保存文件的路径 private String fileName; //指示战役是否结束 private boolean battleOver; //指示当前功能是新战役还是回放 int play; //写文件器,在接收到保存文件路径时初始化 private FileWriter writer; //读文件器,在接收到读入文件路径时初始化 private BufferedReader reader; //线程池 ExecutorService exec = Executors.newCachedThreadPool(); //菜单栏高度 static int menuBarHeight = 35; //存有各类图片资源。背景及各类人物图像 static Image BG; static Image CB1 = null; static Image CB2 = null; static Image CB3 = null; static Image CB4 = null; static Image CB5 = null; static Image CB6 = null; static Image CB7 = null; static Image GP = null; static Image LL = null; static Image SC = null; static Image SN = null; static {//加载图片 try { BG = new Image(new File("resource/background.jpg").toURI().toURL().toString()); CB1 = new Image(new File("resource/1.jpg").toURI().toURL().toString()); CB2 = new Image(new File("resource/2.jpg").toURI().toURL().toString()); CB3 = new Image(new File("resource/3.jpg").toURI().toURL().toString()); CB4 = new Image(new File("resource/4.jpg").toURI().toURL().toString()); CB5 = new Image(new File("resource/5.jpg").toURI().toURL().toString()); CB6 = new Image(new File("resource/6.jpg").toURI().toURL().toString()); CB7 = new Image(new File("resource/7.jpg").toURI().toURL().toString()); GP = new Image(new File("resource/Grandpa.jpg").toURI().toURL().toString()); LL = new Image(new File("resource/LouLuo.jpg").toURI().toURL().toString()); SC = new Image(new File("resource/Scopion.jpg").toURI().toURL().toString()); SN = new Image(new File("resource/Snake.jpg").toURI().toURL().toString()); }catch(Exception e) { e.printStackTrace(); } } //MainCanvas类本身也是一个线程,不断刷新UI private Thread thread = new Thread(new Runnable() { @Override public void run(); }); //构造函数,初始化 public MainCanvas(); //用户按下空格后,开始进行新战役或回放 public void flashBegin(); //绘制背景及格子 public void drawBackground(); //新战役,用以重新初始化各种属性和准备新线程 public void newWar(); //新战役中,画出当前战场情况 public void draw(); //战斗是否结束 public boolean isBattleOver(); //用户选择新战役并按下空格后会调用该方法,用以开始所有线程 public void creatureThreadRun(); //用户选择功能时会调用此方法设置功能 public void setPlay(int play); //用户选择回放时会传入文件路径,此方法用以接收文件路径 public void setFileName(String fileName); //回放一张画面 public void replay(); //将此时的战场情况写入文件 public void saveBattleField();}

    package Beings
    Beings.java
    package java2018.CalabashBrother.Beings;//生物的父类public class Beings { //坐标 protected int x, y; //移动 public void MoveToPos(int x, int y)}
    Creature.java
    //本类是葫芦娃、爷爷、蝎子精、蛇精、小喽啰的父类,是Beings的派生类package java2018.CalabashBrother.Beings;public class Creature extends Beings implements Runnable{ //攻击力Combat Effectiveness protected int CE; //防御力Defence protected int DEF; //血量Health Point protected int HP; //初始血量 protected int fullHP; //存活状态 protected boolean livingStatus; //取攻击力 public int getCE(int radio); //取防御力 public int getDEF(); //取血量 public int getHP(); //取初始血量 public int getFullHP(); //取存活状态 public boolean isLiving(); //攻击 public void Attack(Creature attackedBeing,int radio); //while循环,循环条件是该生物存活,循环体中生物不断移动并对周围敌对生物发起攻击。线程每执行一个循环都要随机sleep一到两秒 public void run();}
    Goodboy.java
    //葫芦娃和爷爷的父类,用以敌对阵营的鉴别package java2018.CalabashBrother.Beings;public class Goodboy extends Creature{ Goodboy(int CE, int DEF, int HP){ super(CE,DEF,HP); } Goodboy(int CE, int DEF, int HP, boolean Motivated){ super(CE,DEF,HP,Motivated); } Goodboy(int CE, int DEF, int HP, boolean Motivated, BattleFields BFs){ super(CE,DEF,HP,Motivated,BFs); }}
    Badboy.java
    //小喽啰、蛇精和蝎子精的父类,用以敌对阵营的鉴别package java2018.CalabashBrother.Beings;public class Badboy extends Creature{ Badboy(int CE, int DEF, int HP){ super(CE,DEF,HP); } Badboy(int CE, int DEF, int HP, boolean Motivated){ super(CE,DEF,HP,Motivated); } Badboy(int CE, int DEF, int HP, boolean Motivated, BattleFields BFs){ super(CE,DEF,HP,Motivated,BFs); }}
    NameAndColor.java
    //用enum类型将葫芦娃排行与颜色绑定package java2018.CalabashBrother.Beings;public enum NameAndColor {// RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE; String[] NAME = {"老大", "老二", "老三", "老四", "老五", "老六", "老七"}; String[] COLOR = {"赤", "橙", "黄", "绿", "青", "蓝", "紫"}; //取名字 String getName() { return this.NAME[ordinal()]; } //取颜色 String getColor() { return this.COLOR[ordinal()]; }}
    CalaBashBrother.java
    package java2018.CalabashBrother.Beings;public class CalabashBrother extends Creature{ private NameAndColor nc; //默认构造函数 CalabashBrother(); //带参构造函数 CalabashBrother(NameAndColor NC); CalabashBrother(int x, int y); CalabashBrother(int x, int y, NameAndColor NC); //取名字 public String getName(); //取颜色 public String getColor(); //设置颜色和名字,对应上面的enum类型 public void setNameAndColor(int index); //比较函数,用于作业二排序 public int compareTo(CalabashBrother brother);}
    CalabashBrothers.java
    package Beings;public class CalabashBrothers { //七个葫芦兄弟 private CalabashBrother[] calabashbrothers; //默认构造函数 public CalabashBrothers();//设置位置 public void SetCBPostion(int index, int x, int y); //作业二排序交换位置 public void SwapBrother(int index1, int index2); //取index位置的葫芦娃 public CalabashBrother getBrother(int index); //取index位置的葫芦娃的名字 public String getName(int index); //取index位置的葫芦娃名字 public String getColor(int index); //作业二输出当前葫芦兄弟队的情况 public void QueueNameStatus(); public void QueueColorStatus(); //作业二打乱葫芦兄弟队伍 public void Disorder();}
    GrandPa.java
    package Beings;public class GrandPa extends Creature{ //构造函数 public GrandPa();}
    Scorpion.java
    package Beings;//蝎子精public class Scorpion extends Creature{ //构造函数 public Scorpion();}
    Snake.java
    package Beings;public class Snake extends Creature{ //构造函数 public Snake();}
    LouLuo.java
    package Beings;public class LouLuo extends Creature{ //构造函数 public LouLuo();}

    package java2018.CalabashBrother.BattleField
    BattleField.java
    //泛型,可存放所有物体package java2018.CalabashBrother.BattleField;import Beings.*;public class BattleField<T extends Beings> { //本块场地中的物体 private T Being; //默认构造函数 BattleField(); //带参构造函数 BattleField(T t); //查看格子是否为空 public boolean isEmpty(); //取得本格子上的物体 public T getBeing(); //把格子上的物体移走 public T removeBeing();}
    BattleFields.java注意:本类中大部分方法不需要检测某位置是否为空就可以直接调用,为空或者越界时返回null
    package java2018.CalabashBrother.BattleField;import java.util.*;import Beings.*;public class BattleFields { //战场为M*N的矩形 //场地长 private int M; //场地宽 private int N; //场地 private BattleField BFs[][]; //默认构造函数 public BattleFields(); //带参构造函数 BattleFields(int m, int n); //初始化场地。实际上就是将所有格子都赋空指针 public void initializeBattleField(); //作业三,场地能否容纳阵型 public boolean Containable(int x, int y, int length, int height); //将某位置清空 public void remove(int x, int y); //生物要移动时,调用该方法寻找方向 public int findDirection(Creature c,int x, int y); //战场(x,y)位置是否空。本方法在下一个方法中被调用 public boolean isEmpty(int x, int y); //在战场(x,y)位置放置物体t public boolean SetBFPosition(int x, int y, Beings t); //取得战场(x,y)位置生物阵营 public String creatureType(int x, int y); //取得战场(x,y)位置生物具体名字 public String CBName(int x, int y); //取得战场(x,y)位置生物引用。位置空返回null public Creature getCreature(int x, int y); //命令行输出战场情况 public void BFOutput();}

    package java2018.CalabashBrother.Director
    Director.java
    package java2018.CalabashBrother.Director;public class Director { //战场 private BattleFields BFs; //葫芦兄弟们。这个对象实际上已经没有用了,是作业二的遗产代码 private CalabashBrothers CBs; //默认构造函数 Director(); //带参构造函数 Director(BattleFields bfs); //带参构造函数 Director(BattleFields bfs, CalabashBrothers cbs); //在某位置摆放。两个重载,第一个是摆放爷爷和蛇精,第二个是摆放葫芦兄弟和蝎子精与小喽啰们,他们储存在Vector向量中 public boolean setFormation(int x, int y, int biasY, Creature t); public boolean setFormation(int x, int y, int biasY, String formationName,Vector<Creature>list); //输出名字状态。两个重载 public void QueueNameStatus(); public void QueueNameStatus(CalabashBrothers calabashbrothers); //输出颜色状态。两个重载 public void QueueColorStatus(); public void QueueColorStatus(CalabashBrothers calabashbrothers); //冒泡排序。两个重载 public void BubbleSort(); public static void BubbleSort(CalabashBrothers calabashbrothers); //快速排序。两个重载 private int Partition(int p, int r); public void QuickSort(int p, int r); private static int Partition(CalabashBrothers calabashbrothers, int p, int r); public static void QuickSort(CalabashBrothers calabashbrothers, int p, int r); //将葫芦娃的顺序打乱 public void Disorder(); public CalabashBrother getBrother(int index); //列阵 public void setPos(); //显示战场情况 public void showBF(); //清空战场 public void clearBattleField();}

    package java2018.CalabashBrother.Randomnum
    package java2018.CalabashBrother.Randomnum;public class Randomnum { //Random类。只在第一次初始化 static Random r = new Random(); //产生一个在[0,upline)范围内的随机整数 public static int getRandom(int upLine);}
    五、其他我在这门课里面,主要的收获是学习并实践了并发,并且在另一门课里面使用到了并发排序。
    写大作业的过程很痛苦,但是总算是做了一个勉强能运行的程序。我发现一个程序的完成,不仅难在核心算法(本程序中是并发),更难在整体设计和细节完善上,很多我预想的功能最终都没有实现。很多小功能尽管乍眼一看不难,但是把这个功能添加进去却要经过编码和调试的两个过程,还要考虑怎么与已有数据结构和代码结构进行兼容。路漫漫其修远兮,吾将上下而求索。
    1  留言 2019-03-31 14:49:47
  • 基于C语言的交通咨询系统

    1 题目介绍1.1 问题描述出于不同目的的旅客对交通工具和交通路径有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个交通咨询系统程序,为旅客提供最优决策的交通咨询。
    1.2 需求分析
    提供对城市信息进行编辑的功能,包括交通信息的增加,删除,修改。
    城市之间有两种交通工具:火车和飞机。
    提供两种最优决策 : 最快到达或最省钱到达。全程只考虑一种交通工具。
    咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原则和交通工具 , 输出信息 : 最快需要多长时间才能到达或者最少需要多少旅费才能到达。

    2 系统功能分析2.1 概要分析交通咨询系统包括交通信息的查询,交通信息的增加与修改,最省时间与最省钱的路线的生成。
    2.2 功能结构分析为了实现交通咨询系统的作用,系统包含功能如图所示。

    3 数据结构设计3.1 抽象数据类型定义typedef struct unDiGraph{ int numVerts; //结点 costAdj cost; //邻接矩阵}unDiGraph,*UNG;
    基本操作:
    unDiGraph* CreateCostG()
    操作结果:构造带权(费用)图。
    unDiGraph* CreateTimeG()
    操作结果:构造带权(时间)图。构造飞机带权(费用)图。
    PathMat *Floyed(unDiGraph *D)
    操作结果:Floyed函数 求任意两点的最短路径。
    3.2 预存数据结构为了便于系统测试使用,在系统初始化时便存入了预留的数据。
    3.2.1 预存城市信息及编号1.成都
    2.兰州
    3.石家庄
    4.郑州
    5.武汉
    6.贵阳
    3.2.2预存交通信息成都与郑州之间的火车行程的时间为2,费用为4。成都与兰州之间的火车行程的时间为3,费用为5。成都与武汉之间的火车行程的时间为1,费用为3。武汉与郑州之间的火车行程的时间为1,费用为2。兰州与武汉之间的火车行程的时间为3,费用为6。兰州与石家庄之间的火车行程的时间为1,费用为3。武汉与贵阳之间的火车行程的时间为5,费用为2。贵阳与石家庄之间的火车行程的时间为2,费用为4。贵阳与兰州之间的火车行程的时间为4,费用为1。
    成都与武汉之间的飞机行程的时间为3,费用为3。成都与兰州之间的飞机行程的时间为1,费用为1。兰州与石家庄之间的飞机行程的时间为2,费用为5。兰州与贵阳之间的飞机行程的时间为4,费用为2。石家庄与贵阳之间的飞机行程的时间为3,费用为1。武汉与贵阳之间的飞机行程的时间为2,费用为3。武汉与石家庄之间的飞机行程的时间为3,费用为4。
    4 功能模块设计实现全国交通咨询模拟系统的开发,采用图结构类型存储城市的信息。其中,各城市间的邻接关系用图的邻接矩阵类型存储;城市信息用结构体数组存储,其中每个数组元素是一个结构体变量,包含时间和费用三个分量;图的顶点的个数和边的个数由变量费用、时间大小表示,它们是整型数据。
    4.1 主要功能模块设计全国交通咨询模拟系统由4个功能模块组成:添加城市、删除程序、采用火车出行、采用飞机出行下面给出功能模块图,如图所示。

    4.2 主要函数调用关系图ADT内基本操作函数之间的函数调用关系图,如图所示。

    4.3 费洛伊德算法求最小路径
    初始化:D[u,v]=A[u,v]
    For k:=1 to nFor i:=1 to nFor j:=1 to nIf D[i,j]>D[i,k]+D[k,j] ThenD[i,j]:=D[i,k]+D[k,j];
    算法结束:D即为所有点对的最短路径矩阵

    5 调试与运行结果5.1 主界面设计为了实现全国交通咨询模拟系统,需要设计一个含有多菜单项的主控菜单子程序,以链接系统中各个子项目的调用,为了方便用户使用本系统,本系统主控菜单的运行界面如图所示。

    5.2 运行结果及分析交通资讯系统调试成功后在本地运行结果如下:

    查看城市


    选择最短时间路线的两种方式


    选择以火车的方式出行


    坐火车从石家庄到贵阳的最短时间路线与所花费的金额


    从成都到贵阳的最少花费与时间


    管理员程序


    增添新城市 沧州


    增添石家庄到沧州的火车费用


    增添石家庄到沧州的火车时间


    坐火车从石家庄到沧州的最短时间
    4  留言 2019-01-31 17:19:38
  • 基于JAVA的实现学生卡管理系统

    一. 引言1.1 编写目的自出台“科教兴国”方针后,国家对教育领域的重视程度越来越大,资金投入也越来越多。人们已经意识到教育的重要性,各地高校如雨后春笋般涌现出来,导致在校学生这支队伍也日益壮大。这就意味着校园卡的使用越来越多,同时也加大了校园卡的管理难度。因此,设计一套行之有效的校园卡管理系统是十分有必要的。
    二. 详细设计2.1 领域模型图
    2.2 系统类图说明2.2.1 学生类
    类图说明
    // 更改密码public void modifyPassword(StringnewPwd);// 根据选择的商品消费,从余额中扣除对应金额public void consume();// 显示充值、消费记录public String[][] checkHistory();// 验证账号密码合法性然后登陆public void login();
    2.2.2 管理员类
    类图说明
    // 办理新卡,密码默认为1234,金额默认为0,状态默认为truepublic void createCard(String cardID,String userName);// 删除该学生卡public void destroyCard(String cardID);// 充值public void deposit(double money);// 显示充值、消费记录public String[][] checkHistory();// 设置是否停用该卡public void setState(Boolean b);// 验证账号密码合法性然后登陆public void login();
    2.2.3 学生卡类
    类图说明
    // 设置密码public void setPassword(String password);// 返回密码public StringgetPassword();// 返回卡号public** **String** getCardID();// 返回姓名public String getUserName();// 返回状态public** Boolean getState();
    2.2.4 学生卡信息类
    类图说明
    // 设置密码public void setPassword(String password);// 返回密码public StringgetPassword();// 返回卡号public String getCardID();// 返回姓名public String getUserName();// 返回余额public Double getBalance();// 返回状态public Boolean getState();// 余额增加public void addBalance(Double money);// 余额减少public void minusBalance(Doublemoney);
    2.2.5 数据库类
    类图说明
    // 得到学生卡信息public CardInfo[]getCardInfo();
    三. 模块功能详细设计3.1 办理新卡

    功能描述

    管理员为学生办理新卡,并把它存储到数据库中
    输入项

    学生的姓名、学号、密码默认1234、状态默认使用中

    3.2 销毁

    功能描述

    销毁学生卡,移除数据库中相应信息
    输入项

    学号

    3.3 修改密码

    功能描述

    修改密码
    输入项

    学号、新密码

    3.4 充值

    功能描述

    充值
    输入项

    金额

    3.5 消费

    功能描述

    消费
    输入项

    消费项目、数量

    3.6 查询余额

    功能描述

    查询余额
    输入项

    学号

    3.7 挂失

    功能描述

    挂失
    输入项

    学号、备注信息

    3.8 登录

    功能描述

    登录
    输入项

    账号、密码
    7  留言 2018-12-06 17:02:32
  • 基于JAVA的迷宫问题

    1 题目要求1.1 问题描述以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
    1.2 基本要求
    实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i, j, d)的形式输出,其中,(i, j)指示迷宫的一个坐标,d表示走到下一坐标的方向。
    编写递归形式的算法,求得迷宫中所有可能的通路;
    以方阵形式输出迷宫及其通路

    2 设计思路
    用‘穷举解法’方法解决迷宫问题 ,储存结构:用栈储存
    建立一个二维数组表示迷宫的路径(0表示通道,1表示墙壁)
    创建一个栈,用来存储“当前路径”,即“在搜索过程中某一时刻所在图中某个方块位置”。
    创建一个Int类型的二维数组intmaze[n1][n2],用来存放0和1 ;
    创建一个结构体用来储存数组信息(数组的横坐标X,数组的纵坐标Y,方向C)
    创造一个栈包括(top表示栈顶元素)

    类图

    3 测试
    测试环境

    Windows10JDK1.8IDEA2017.2
    输入数据



    测试结果
    2  留言 2018-12-06 16:44:52
  • 基于C++的学生选课管理系统的设计与实现

    一 需求分析
    系统添加课程:将一门课程加入到系统数据中。课程提交重复时给出提示信息
    系统删除课程:以课程编号为索引删除课程。系统无此课程时给出提示
    课程添加学生:把学生的姓名、学号等信息加入到课程中。学号重复时给出提示信息
    课程删除学生:以学号为索引从课程中删除学生。课程无此学生时给出提示
    课程添加教师:把教师的姓名、教工号等信息加入到课程中。教工号重复时给出提示信息
    课程删除教师:以教工号为索引从课程中删除教师。课程无此教师时给出提示
    课程输出数据:提供某课程的学生、教师信息

    二 程序设计2.1 功能结构图如下所示:

    2.2 数据设计数据架构如下图所示:


    Object(abstractbaseclass):抽象基类。定义了“姓名”和“编号”两种属性。它是Student(class),Teacher(class),Course(class) 最终的父类
    Person(class):表示人。没有额外定义属性。Student(class)和Teacher(class)直接继承这个类
    Teacher(class):表示教师。没有额外定义属性
    Student(class):表示学生。没有额外定义属性
    std::set(templateclass)
    Group(template class):对std::set作轻度封装
    Course(class):表示课程。包含成员Group<Student>和Group<Teacher>,定义一系列添加、删除、访问的操作
    System(class):表示整个系统的类。是整个程序的核心。包含成员Group<Course>。定义了一系列添加、删除、访问操作

    2.3 函数设计函数结构如下图所示:
    // 格式化输出的辅助函数。以上几乎所有函数都调用OutputHelpervoid OutputHelper(const string& s1, const string& s2);// 调用PrintTitle和PrintCourse以表格的形式打印所有的课程void PrintAllCourse(const System& sys);// 输入一个课程的全部信息void PrintCourse(const Course&crs);// 打印“>>> ”用以实现交互界面inline void PrintPromt();// 打印“… ”用以等待用户输入更多信息inline void PrintPromtForInput();// 打印指导信息。每次运行该系统都会输出该内容void PrintInstroduction();// 打印帮助信息。在系统中输入help会调用该函数输出帮助void PrintHelp();// 打印错误信息。该函数会将参数s直接打印出来(加上换行符)inline void PrintError(const string& s);// 打印表格的题头。执行实际的打印行为inline void PrintTitle();// 模板函数,接受Name和Id,返回T。T是应当是Student,Teacher,Course中的一个T InputNameAndId();// 模板函数,接受Id,返回T。同上T InputId();
    三 程序实现3.1 实现思路3.1.1 结构间关系系统中包含了一系列课程,课程由名称和编号构成;课程包含了任课教师和选课学生,学生和教师都含有名称和学号/教工号等信息。系统负责管理课程,课程负责管理教师和学生。
    3.1.2 具体逻辑“添加”操作需要“名称”和“编号”两项信息。“删除”操作只需要“编号”作为索引。编号保证唯一,是确定身份的凭证。
    3.2 数据流流向 数据流流向图如下所示:


    User指用户,即系统管理员
    User Interface指程序的交互层,包括文件main.cpp,IOHelper.*
    BusinessLogic指业务逻辑层,包括除上述文件以外的所有文件
    Dataaccess 数据访问层,系统采用文件IO的方式储存数据

    3.3 main函数算法流程如下图所示:


    输入:输入使用getline读取整行
    是否语法错误:使用正则表达式检查语法错误。若格式不匹配,输出错误提示信息,重新等待输入
    是否逻辑错误:调用System类并查看返回值。若返回false表示出现逻辑错误。输出提示信息,重新等待输入
    执行命令:命令被执行

    四 程序运行case1:

    case2:

    case3:

    case4:

    case5:

    case6:

    case7:
    2  留言 2018-10-19 16:30:49
  • 基于C#和SQL SERVER的汽车配件仓储管理系统

    摘 要汽车配件信息管理网站建设是汽车配件信息进行有效管理的重要工具。本次设计以建设汽车配件信息管理网站为目标,同时结合现今对信息管理相关网站建设方面的需求,建设相关后台数据库及相应的交互性界面。
    为了实现有效率的对汽车配件信息进行管理,本论文以网站建设为主体架构,详细的介绍了汽车配件信息管理网站的需求,具体描述了整个网站的开发过程,分析了汽车配件信息管理网站的功能。并以业务流程图的形式详细的介绍了系统的各个功能的模块及各个模块的数据库表,并详细的记录了各个功能测试的情况信息。对于汽车配件管理系统迅速发展的信息化时代,通过规范、统一的网站式管理对相关信息进行整合,不仅方便了管理,而且提高了工作效率。
    本毕业设计的内容是设计并且实现一个汽车配件信息管理网站设计,用Microsoft Visual Studio作为开发工具,以SQLServer作为数据库,使用C#语言开发。该系统界面友好、操作简单,容易维护,适合公司管理者以及员工使用。
    关键词:汽车配件信息;网站式管理;MicrosoftVisual Studio;SQL Server
    AbstractThe construction site is automobile fittings information management of autoparts information to efficient management. The design of the construction ofauto parts information management website as the goal, combined with thecurrent information management related to website construction needs, theconstruction of relevant background database and the corresponding interactiveinterface.
    In order to realize the efficient management of auto parts information, thewebsite construction as the main structure, detailed introduces the auto partsinformation management needs of the site, the specific description of thedevelopment process of the entire site, analysis of the auto parts information managementfunctions of the website. And the business process diagram in the form ofdetailed description of the module and each module of the system each functionof the database table, and detailed records of each function test information.In the information age, the rapid development of auto parts management systemthrough the website management standard, unified integration of relevantinformation, not only convenient management, but also improve the workEfficiency at
    The content of this graduation design is to design and implement an autoparts information management website design, using Microsoft Visual Studio as adevelopment tool, using SQL as the database Server, using C# languagedevelopment. The system has a friendly interface, simple operation, easymaintenance, suitable for company managers and employees.
    Key words: auto partsinformation; Web site management; Microsoft Visual Studio; SQL Server
    引言随着计算机技术的快速发展,许多企业事业单位的管理都实现了办公自动化,这种自动化管理方式不仅管理简单,而且效率非常高。为了能够高效而且有效地管理汽车配件的管理信息,汽车配件经营者提出使用计算机进行汽车配件信息的管理,使汽车配件管理科学化,最大限度地减少信息损失,提高汽车配件的利益。
    使用计算机管理汽车配件相对人工记录,有很多的有点。首先,用计算机进行金额计算时速度快,可信度高。而且查询时不必要逐个查找,只需要输入相关信息就可快速得到结果。然后,汽车配件信息存储在计算机,可以作到数据的永久保存,安全可靠。最重要的是,汽车配件数据存储在计算机中,由于计算机存储容量非常大,所以清单的内容在输入电脑后,对数据的操作是非常方便的,而且避免了频繁的使用清单。
    汽车部件仓储管理已经渐渐的走向稳定发展的趋势,更加具有企业化的概念,在体制上,汽车部件仓储管理已经开始慢慢的健全它的体制,对公司人员进行培训,将业务进行熟练化,这样大大的提高了汽车部件管理在世界中的发展,并且使它的地位明显的上升,也进一步的满足了大家的需求。为了更好的发展,企业渐渐的从整体中分离开来建立自己的发展模块,不断的寻求发展模式,扩大自己的经营模式。
    本网站使用.net+Microsoft Visual Studio+SQL Server的组合,使用计算机浏览器实现了网站的基本功能,网站对汽车配件的信息进行管理,不但可以使用工程的、规范的管理过程,而且可以有效的提高了工作人员的工作效率,直观的、科学的管理汽车配件信息,进而完成公司的业务,这对汽车配件信息的管理的发展及信息化的管理具有极其重要的意义。
    第1章 绪 论1.1 论文背景1.基于汽车配件管理的相关背景
    汽车配件管理系统的目的是为企业提供一个计算机化的管理平台,实践企业内部科学有效的管理,促进企业管理信息化,规范化,将能使管理人员从繁琐的杂务工作中解脱出来,真正从事管理工作。
    目前汽车配件销售企业大多数在其连锁店的管理还是手工进行,随着汽车配件行业的迅速发展,手工管理的种种弊端暴露无疑,给销售企业的发展带来了不必要的麻烦。为了规范企业内部管理,提高企业业务管理水平,更好的为客户服务,应采用计算机来管理汽车配件的进销存业务。
    汽车部件仓储管理已经渐渐的走向稳定发展的趋势,更加具有企业化的概念,在体制上,汽车部件仓储管理已经开始慢慢的健全它的体制,对公司人员进行培训,将业务进行熟练化,这样大大的提高了汽车部件管理在世界中的发展,并且使它的地位明显的上升,也进一步的满足了大家的需求。为了更好的发展,企业渐渐的从整体中分离开来建立自己的发展模块,不断的寻求发展模式,扩大自己的经营模式。
    2.数据管理技术
    随着互联网发展进程的加快, 信息资源网络化成为一大潮流。与传统信息资源相比, 网络信息资源在 数量、结构、内涵、类型、载体形态、分布和传播范围、控制机制、传递手段等方面都与传统信息资源有显著的差异, 呈现出许多新的特点。这些新的特点赋予网 络环境下信息资源管理许多新的内涵。网络信息资 源管理建立在新的社会基础结构即信息网络的基础之上, 适应了信息化社会信息组织和管理的需要是一个新的生长点。
    数据管理技术就是指人们对数据进行收集、组织、存储、加工、传播和利用的一系列活动的总和,经历了人工管理、文件管理、数据库管理三个阶段[4]。每一阶段的发展以数据存储冗余不断减小、数据独立性不断增强、数据操作更加方便和简单为标志,各有各的特点。其中现今就处于数据库管理为主流的阶段,节省的大量的人力资源,对于信息化网络化的现在数据库管理技术的共享性、大量数据存储显示、数据处理快速而且具有很高的安全性和完整性,其并发控制和恢复性都不会让数据轻易丢失
    3..NET技术
    ASP.NET是由微软在.NET Framework框架中所提供,开发Web应用程序的类库,封装在System.Web.dll文件中,显露出System.Web名字空间,并提供ASP.NET网页处理、扩充以及HTTP通道的应用程序与通信处理等工作,以及Web Service的基础架构。ASP.NET是ASP技术的后继者,但它的发展性要比ASP技术要强大许多。
    ASP.NET可以运行在安装了.NET Framework的IIS服务器上,若要在非微软的平台上运行,则需要使用Mono平台[2],ASP.NET在2.0版本已经定型,在.NET Framework 3.5上则加上了许多功能,像是ASP.NET AJAX、ASP.NET MVC Framework、ASP.NET Dynamic Data与Microsoft Silverlight的服务器控件等。
    很多人都把 ASP.NET 当做是一种编程语言,但它实际上只是一个由 .NET Framework提供的一种开发平台 (development platform),并非编程语言。也可认为ASP.NET是.NET组件,任何.NET语言,例如C#,可以引用该组件,创建网页或Web服务。
    为了因应云化所诱发的多作业平台集成与开发能力,微软特别开发一个新一代的 ASP.NET,称为 ASP.NET vNext,并于 2014 年命名为 ASP.NET 5,但随后于 2016 年将它更名为 ASP.NET Core,由于架构上的差异颇大,因此未来 ASP.NET 与 ASP.NET Core 将是分别发展与维护,Windows 平台的 ASP.NET 4.6 以上版本仍维持 Windows Only,但 ASP.NET Core 则是具有跨平台 (Windows, Mac OSX 与 Linux) 的能力。
    1.2 系统开发的意义随着计算机技术的快速发展,许多企业事业单位的管理都实现了办公自动化,这种自动化管理方式不仅管理简单,而且效率非常高。为了能够高效而且有效地管理汽车配件的管理信息,汽车配件经营者提出使用计算机进行汽车配件信息的管理,使汽车配件管理科学化,最大限度地减少信息损失,提高汽车配件的利益。
    使用计算机管理汽车配件相对人工记录,有很多的优点。首先,用计算机进行金额计算时速度快,可信度高。而且查询时不必要逐个查找,只需要输入相关信息就可快速得到结果。然后,汽车配件信息存储在计算机,可以作到数据的永久保存,安全可靠。最重要的是,汽车配件数据存储在计算机中,由于计算机存储容量非常大,所以清单的内容在输入电脑后,对数据的操作是非常方便的,而且避免了频繁的使用清单。
    1.3 研究现状和发展趋势1.研究现状
    现在我国的企业特别是汽车配件企业的管理水平还停留在纸介质或半自动(由电脑处理一部分数据,由人工处理一部分数据)的基础上,这样的机制已经不能适应时代的发展,因为它浪费了许多人力和物力,在信息时代这种传统的管理方式必然会被以计算机为基础的信息管理所取代。软件作为一项有力的工具,只能当此种工具,与我们的实践相结合起来的时候,才具有重大的社会价值及使用价值。因此根据企业目前实际的汽车配件管理系统情况开发一套汽车配件管理系统是十分有必要的。
    2.发展趋势
    汽车部件仓储管理已经渐渐的走向稳定发展的趋势,更加具有企业化的概念,在体制上,汽车部件仓储管理已经开始慢慢的健全它的体制,对公司人员进行培训,将业务进行熟练化,这样大大的提高了汽车部件管理在世界中的发展,并且使它的地位明显的上升,也进一步的满足了大家的需求。为了更好的发展,企业渐渐的从整体中分离开来建立自己的发展模块,不断的寻求发展模式,扩大自己的经营模式。
    通过计算机进行货物的进入和销售数量的统计,使管理者不必再为统计数量而感到烦恼,可以利用节省出来的时间全身心的投入到其他事情当中,也对管理制度进行了优化和改良,集中对零部件进行统计和分配,这样不仅减少我们使用的资源,也大大的降低了我们的劳动成本,节省了财力,使管理人员更加专心的从事管理工作,使管理制度更加合理化和规范化。
    1.4 论文的基本结构此次论文详细的介绍了汽车配件信息管理网站设计及实现的过程以及相关功能解说、研究思路、思想总结等部分。着重介绍了这个网站的设计思想、技术路线、开发平台的选择、总体框架、程序流程、本网站应实现的功能以及具体的实现方法和步骤,并且讨论类似网站存在的局限性和解决的思路。其主要基本结构如下:

    绪论,用来详细解说该系统的背景、研究意义及研究前景。
    系统开发平台的介绍,用来详细介绍该系统用到的开发工具,如Microsoft VisualStudio,SQLServer。
    第1章是需求分析,用来分析经济、技术、操作上的可行性,重点介绍系统的功能分析、业务流程图以及ER图等。
    第2章是系统设计,用来详细介绍各个模块的功能,并设计数据库,展示系统界面。
    第3章是实现部分功能的主要代码及系统的整体及相关功能测试,用来展示系统的核心代码以及展示系统测试的效果。

    第2章 系统开发工具及相关技术本章将对本次汽车配件信息管理网站的开发平台进行简要的介绍,同时介绍在开发过程中采用的一些Ajax技术。
    2.1 开发工具简介本次网站设计主要采用的是学校中通用的软件,操作系统是Windows,主要Web端和后端的开发都是在Microsoft Visual Studio中操作实现,数据库采用的是Sql Server数据库。下面将对两个软件简要介绍:
    1.Microsoft Visual Studio
    Microsoft Visual Studio(简称VS)是微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括MicrosoftWindows、Windows Phone、WindowsCE、.NET Framework、.NET CompactFramework和Microsoft Silverlight。
    而Visual Studio .NET是用于快速生成企业级ASP.NET Web应用程序和高性能桌面应用程序的工具。Visual Studio包含基于组件的开发工具(如Visual C#、Visual J#、VisualBasic和Visual C++),以及许多用于简化基于小组的解决方案的设计、开发和部署的其他技术。
    2.Sql Server
    SQL Server一开始并不是微软自己研发的产品,而是当时为了要和IBM竞争时,与Sybase合作所产生的,其最早的发展者是Sybase[1],同时微软也和Sybase合作过SQL Server 4.2版本的研发,微软亦将SQL Server 4.2移植到Windows NT(当时为3.1版),在与Sybase终止合作关系后,自力开发出SQL Server 6.0版,往后的SQL Server即均由微软自行研发。
    Sql Server是一个关系数据库管理系统。具有易用性、适合分布式组织的可伸缩性、用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等。为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势。
    维基百科给的解释是这样的,Microsoft SQL Server是由美国微软公司所推出关系数据库解决方案,最新的版本是SQL Server 2016,已经在2016年6月1日发布。 数据库的内置语言原本是采用美国标准局(ANSI)和国际标准组织(ISO)所定义的SQL语言,但是微软公司对它进行了部分扩充而成为作业用SQL(Transact-SQL)。几个初始版本适用于中小企业数据库管理,但是近年来它的应用范围有所扩展,已经触及到大型、跨国企业的数据库管理。
    2.2 .net 平台介绍.NET就是微软用来实现XML,Web Services,SOA(面向服务的体系结构service-oriented architecture)和敏捷性的技术。对技术人员,想真正了解什么是.NET,必须先了解.NET技术出现的原因和它想解决的问题,必须先了解为什么他们需要XML,Web Services 和 SOA。技术人员一般将微软看成一个平台厂商。微软搭建技术平台,而技术人员在这个技术平台之上创建应用系统。从这个角度,.NET也可以如下来定义:.NET是微软的新一代技术平台,为敏捷商务构建互联互通的应用系统,这些系统是基于标准的,联通的,适应变化的,稳定的和高性能的。从技术的角度,一个.NET应用是一个运行于.NET Framework之上的应用程序。(更精确的说,一个.NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时Common Language Runtime之上的应用程序。)如果一个应用程序跟.NETFramework无关,它就不能叫做.NET程序。比如,仅仅使用了XML并不就是.NET应用,仅仅使用SOAPSDK调用一个Web Service也不是.NET应用。.NET是基于Windows操作系统运行的操作平台,应用于互联网的分布式。
    2.3 相关技术1.B/S结构
    B/S结构是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。
    根据实际开发的需要,位置信息管理网站设计的开发中选择了B/S结构开发web应用程序,通过浏览器访问服务器的的方式实现远程操作和数据共享。
    2.Ajax技术
    AJAX即“AsynchronousJavaScript and XML”(异步JavaScript与XML技术),指的是一套综合了多项技术的浏览器端网页开发技术。Ajax的概念由杰西·詹姆士·贾瑞特所提出[1]。
    传统的Web应用允许用户端填写表单(form),当提交表单时就向网页服务器发送一个请求。服务器接收并处理传来的表单,然后送回一个新的网页,但这个做法浪费了许多带宽,因为在前后两个页面中的大部分HTML码往往是相同的。由于每次应用的沟通都需要向服务器发送请求,应用的回应时间依赖于服务器的回应时间。这导致了用户界面的回应比本机应用慢得多。
    与此不同,AJAX应用可以仅向服务器发送并取回必须的数据,并在客户端采用JavaScript处理来自服务器的回应。因为在服务器和浏览器之间交换的数据大量减少(大约只有原来的5%)来源请求,服务器回应更快了。同时,很多的处理工作可以在发出请求的客户端机器上完成,因此Web服务器的负荷也减少了。
    类似于DHTML或LAMP,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。虽然其名称包含XML,但实际上数据格式可以由JSON代替,进一步减少数据量,形成所谓的AJAJ。而客户端与服务器也并不需要异步。一些基于AJAX的“派生/合成”式(derivative/composite)的技术也正在出现,如AFLAX。
    第3章 系统需求分析3.1 系统业务描述根据相应的需求及对应功能的完善实现,汽车配件仓储管理网站设计业务流程主要包括以下几个方面:

    一级管理,通过登录界面,判定是一级管理员后,进入一级管理界面。可以查看配件信息,供应商信息,需求商信息,二管理员信息以及二级管理员的操作日志。并且可以通过切换不同的界面,可以对相应的信息进行添加,删除,修改各个部分的信息。在汽车配件信息界面,可以通过链接查看该零件的生产单位等多种操作。
    二级管理员管理,通过登录界面,判定是二级管理员后,进入二级管理界面。二级管理界面可以查询配件信息以及需求商的基本信息。主要进行入库/出库操作而且额外可以添加需求商户。

    至此,本系统业务流程结束。
    3.2 可行性分析可行性分析应从经济可行性,技术可行性和操作可行性三个方面考虑,以下是对本系统具体的可行性分析。
    1.经济可行性
    利用本校现有的校园网、计算机及配套设备就可使用本系统进行配件的信息管理;对系统的使用都是简单的操作;软件系统由本人在指导老师的帮助下完成的,不要任何费用。
    2.技术可行性
    系统采用B/S架构,前台采用html+css+js编码实现页面的可视化与交互性,后端使用C#实现对SQL Server数据库进行数据的存储、修改、删除等操作,该数据库具有方便、灵活的特点,适应该系统的开发。本系统要求的硬件标准不高,一般的硬件设备足够运行系统。
    3.操作可行性
    使用汽车配件仓储管理系统网站,只需要输入网址就能进入登录界面。然后就是管理首页,主要的管理功能是一级管理员对配件信息,供应商信息,需求商信息,二级管理员信息的增、删、改、查以及对操作日志的查看。其次功能是二级管理员的查询,入库、出库操作以及添加新的需求商功能,实用简单。
    综上所述,开发汽车配件仓储管理网站设计在经济上、技术上、操作上都是可行的。
    3.3 功能需求分析汽车配件仓储信息管理网站设计的使用和相关者有:

    一级管理员:一级管理员对配件信息,供应商信息,需求商信息,二级管理员信息的增、删、改、查以及对操作日志的查看。
    二级管理员:二级管理员能够对配件信息进行查询所搜,主要进行入库、出库操作。同时,可以对需求商的信息进行查询,得到是否有需求商正等待发货而进行出库,也可以添加新的需求商用户。

    汽车配件仓储信息管理网站设计应该满足如下功能需求:
    管理员登陆:能让管理员方便的使用密码登陆系统,从而进行一系列的操作。

    一级管理员可以对配件信息进行增、删、改、查,并且由该配件信息获取其生产单位的相关信息。
    一级管理员对供应商的信息管理。
    一级管理员对二级管理员的信息管理。
    一级管理员对需求商的信息管理。
    一级管理员对日志的查看。
    二级管理员进行出库、入库操作。
    二级管理员添加新的需求商。

    3.4 分析模型3.4.1 业务流程图业务流程图(Transaction Flow Diagram, TFD)就是用一些规定的符号及连线来表示某个具体业务处理过程。是一种物理模型。业务流程图主要是描述业务走向,比如说去ATM机取款,首先得打开自助银行的门走进去,然后找到 一台ATM机,再插入卡输入相应的密码,最后钱才能出来被你取走(当然需要余额充足)。利用它可以帮助分析人员找出业务流程中的不合理流向,业务流程图描述的是完整的业务流程,以业务处理过程为中心,一般没有数据的概念。
    1.数据管理
    数据管理业务流程图如图3-1所示:

    2.设备管理
    设备管理业务流程图如图3-2所示:

    3.汽车配件信息查看
    汽车配件信息查看业务流程图如图3-3所示:

    3.4.2 实体模型图(ER图)E-R图也称实体-联系图(EntityRelationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型。
    系统总ER图如图3-4所示:

    管理员实体用来存储管理员的基本信息,其ER图如图3-5所示:

    供应单位实体用来存储供应单位的相关信息,其ER图如图3-6所示:

    需求单位实体用来存储需求单位的相关信息,其ER图如图3-7所示:

    汽车配件实体存储汽车配件的相关信息,其ER图如图3-8所示:

    操作日志实体存储相关操作的信息,其ER图如图3-9所示:

    3.4.3 系统用例图1.总用例图
    总用例图如图3-10所示:

    2.子用例图
    一级管理员配件信息管理如图3-11所示:

    二级管理员配件信息管理如图3-12所示:

    第4章 系统设计4.1概要设计系统的各部分功能模块独立开发、调试,然后利用系统集成的方法将各个模块信息传入数据库。各个功能模块采用事件驱动的方式 与应用程序进行交互,系统部分程序的应用执行是在后台进行的。汽车配件仓储管理网站设计的系统总体结构设计如图4-1所示。

    各模块的结构:
    1.二级管理员管理模块:
    该模块有如下功能:二级管理员可添加需求商信息,并且可以对汽车配件进行出库入库操作。其模块功能图如图4-2所示:

    2.一级管理员管理模块:
    该模块有如下功能:一级管理员可对该模块进行管理,可以查看所有汽车配件,供应商,需求商,管理员的信息,并且可以对信息进行添加,修改,删除,而且可以查看日志信息。其模块功能图如图4-3所示:

    4.2 数据库设计通过以上的对网站的综合分析,本网站选择SQL Server作为网站的数据库,数据库中包括管理员信息、供应商基本信息、需求商基本信息、二级管理员信息、操作日志信息。
    管理员信息表



    表名:Users
    备注:管理员信息表







    字段名称
    数据类型
    自增主键
    允许为空
    默认值


    UserId
    int





    UserName
    nvarchar(50)





    Password
    nvarchar(50)





    Type
    nvarchar(50)





    LoginTime
    Datetime





    Department
    nvarchar(50)





    汽车配件信息表



    表名:CarParts
    备注:汽车配件信息表







    字段名称
    数据类型
    自增主键
    允许为空
    默认值


    PartId
    int





    PartName
    nvarchar(50)





    FromDepartId
    nvarchar(50)





    Num
    nvarchar(50)





    InTime
    Datetime





    UnitPrice
    decimal(18, 2)





    Quantity
    int





    供应单位信息表



    表名: Supplies
    备注:供应商信息表







    字段名称
    数据类型
    自增主键
    允许为空
    默认值


    Id
    int





    Name
    nvarchar(50)





    Principal
    nvarchar(50)





    Address
    nvarchar(50)





    Phone
    nvarchar(50)





    Ways
    nvarchar(50)





    Num
    nvarchar(50)





    供应单位信息表



    表名: NeedMerchant
    备注:需求商信息表







    字段名称
    数据类型
    自增主键
    允许为空
    默认值


    Id
    int





    Num
    nvarchar(50)





    Name
    nvarchar(50)





    Principal
    nvarchar(50)





    Phone
    nvarchar(50)





    IsDeliver
    bit





    Address
    nvarchar(50)





    NeedPartName
    nvarchar(50)





    NeedNum
    int





    操作日志信息表



    表名: Log
    备注:操作日志信息表







    字段名称
    数据类型
    自增主键
    允许为空
    默认值


    Id
    int





    Operator
    nvarchar(50)





    Time
    Datetime





    Details
    Nverchar(1000)





    Type
    nvarchar(50)





    IP
    nvarchar(50)





    4.3 功能模块设计流程图位置信息管理网站设计其功能已详细介绍,本节将详细介绍各个功能模块的设计流程图。其中登录界面程序流程图,如图4-9所示:

    网站中很多功能都涉及到修改数据,修改数据信息主要是实现前端数据与后台数据库的交互,以ID为判断条件将修改后的信息用SQL语句调用数据库修改相应的数据,刷新数据库及相应页面,显示数据库的信息。修改数据流程图如图4-11所示,

    删除数据信息,实现主要是根据删除按钮或是全选删除按钮的点击事件获取相应的要删除信息的ID,然后根据ID利用SQL语句删除数据库中的数据,更新数据库。删除程序主要流程图,如图4-12所示:

    增加数据信息的功能主要是将表单中的数据提交到后台数据库中,在由后台对数据做相应的判断,若不符合要求,则显示增加不成功,不保存到数据库,否则将数据保存到相应数据库。增加数据信息的程序流程图,如图4-14所示:

    4.4 软件界面设计本节将系统展示位置信息管理网站设计完成后页面的完成情况,及大致的布局。其中登录界面如图4-16所示:

    第5章 系统编码与测试5.1 系统编码1.数据库连接代码
    <add name="MainConn"connectionString="server=.;database=CarParts;user=sa;pwd=0301;Max Pool Size=512;" provider Name="System.Data.SqlClient"/>
    2.登录界面核心代码
    <form> <label for="username">用户名</label> <input name="username" type="text" placeholder="请输入用户名" id="name"/> <label for="pass">密码</label> <input name="pass" type="password" placeholder="请输入密码" id="password"/> <input value="登录" id="submit" /></form>
    3.登录后台核心代码
    using System.Data;using System.Data.SqlClient;using System.Linq;using System.Text;using System.Web;using System.Web.SessionState;namespace WebApp{ /// <summary> /// LoginHandler 的摘要说明 /// </summary> public class LoginHandler : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //获取用户名和密码 string name = context.Request["name"]; string password = context.Request["password"]; //获取数据库数据,放置在ds中 StringBuilder sb = new StringBuilder(); sb.AppendLine("SELECT TOP 1 UserId,UserName,Password,Type,LoginTime,Department "); sb.AppendLine("FROM Users"); sb.AppendLine("WHERE UserName = @UserName AND Password = @Password; "); SqlParameter[] pms = { new SqlParameter("@UserName",SqlDbType.NVarChar,50), new SqlParameter("@Password",SqlDbType.NVarChar,50) }; pms[0].Value = name; pms[1].Value = password; DataSet ds = DbHelperSQL.Query(sb.ToString(),pms); //判断表中是否存在数据,如果有数据则登录成功,如果没有数据,则登录失败 if (ds.Tables[0].Rows.Count > 0) { //根据判断选择进入哪个主页,无论进来的管理员或者是普通用户都记录下操作者的ID,方便记录日志 if (ds.Tables[0].Rows[0]["Type"].ToString() == "1") { context.Session["Id"] = ds.Tables[0].Rows[0]["UserId"].ToString(); context.Session["LoginTime"] = DateTime.Now.ToString(); context.Response.Write("ok1:登录成功"); } else { context.Session["Id"] = ds.Tables[0].Rows[0]["UserId"].ToString(); context.Session["LoginTime"] = DateTime.Now.ToString(); context.Response.Write("ok2:登录成功"); } } //验证失败弹出提示框 else { context.Response.Write("用户名或密码错误,请重新登录"); } } public bool IsReusable { get { return false; } } }}
    4.一级管理员首页界面前端核心代码
    <div class="easyui-layout" style="width:960px; height:800px;margin:50px auto;"> <%--采用easy-ui布局--%> <%--头部导航--%> <div data-options="region:'north',border:false" class="top_bar"> <h1>汽车仓储管理系统</h1> </div> <%--头部导航结束--%> <%--左侧的切换选择--%> <div data-options="region:'west',split:true,title:'信息总览'" class="left_nav"> <ul class="main_nv"> <li class="nv_item"><a href="javascript:void(0)" class="linkToPage" url="InfoPage/PartsInfo.aspx">配件信息</a></li> <li class="nv_item"><a href="javascript:void(0)" class="linkToPage" url="InfoPage/Supplies.aspx">供应商信息</a></li> <li class="nv_item"><a href="javascript:void(0)" class="linkToPage" url="InfoPage/NeedMerchant.aspx">需求商信息</a></li> <li class="nv_item"><a href="javascript:void(0)" class="linkToPage" url="InfoPage/Manager.aspx">管理员信息</a></li> <li class="nv_item"><a href="javascript:void(0)" class="linkToPage" url="InfoPage/Log.aspx">操作日志</a></li> </ul> </div> <%--左侧的切换选择结束--%> <%--底部标注信息--%> <div data-options="region:'south',border:false" class="bottom_bar"> <h3>此系统仅供本公司人员使用</h3> </div> <%--底部标注信息结束--%> <%--核心内容展示区域--%> <div data-options="region:'center',title:'信息管理'" class="right"> <div class="easyui-tabs" style="width:700px;height:250px;" class="right" fit="true" id="tt"> <div title="配件信息" style="padding:10px;overflow:hidden;"class="right"> <iframe src="InfoPage/PartsInfo.aspx" scrolling="no" width="100%" height="100%" frameborder="0"></iframe> </div> </div> </div> <%--核心内容展示区域结束--%></div>
    5.二级管理员首页界面核心代码
    <h1 class="top_title" style="margin-bottom:100px;text-align:center;">汽车配件的出库/入库</h1> <form id="form1" runat="server"> <div> <%--<asp:Button ID="btnAdd" runat="server" Text="添加" />--%><%---------------------------------需求商信息--------------------------------------------------%> <asp:GridView ID="gvNeedMer" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" AllowPaging="True" OnPageIndexChanging="gvParts_PageIndexChanging"> <Columns> <asp:CheckBoxField DataField="IsDeliver" HeaderText="已发货" /> <asp:BoundField DataField="Num" HeaderText="编号" /> <asp:TemplateField HeaderText="单位名称"> <ItemTemplate> <a id="linkToPartInfoEdit" target="_blank" href="javascript:linkToPart(<%# Eval("Id") %>)"> <%#Eval("Name") %> </a> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="Principal" HeaderText="负责人" /> <asp:BoundField DataField="Address" HeaderText="地址" /> <asp:BoundField DataField="Phone" HeaderText="联系电话" /> <asp:TemplateField HeaderText="添加"> <ItemTemplate> <input type="button" id="btnAdd" value="添加"/> </ItemTemplate> </asp:TemplateField> </Columns> <%--添加分页--%> <PagerTemplate> 当前第: <%--//((GridView)Container.NamingContainer)就是为了得到当前的控件--%> <asp:Label ID="LabelCurrentPage" runat="server" Text="<%# ((GridView)Container.NamingContainer).PageIndex + 1 %>"></asp:Label> 页/共: <%-- //得到分页页面的总数--%> <asp:Label ID="LabelPageCount" runat="server" Text="<%# ((GridView)Container.NamingContainer).PageCount %>"></asp:Label> 页 <%--//如果该分页是首分页,那么该连接就不会显示了.同时对应了自带识别的命令参数CommandArgument--%> <asp:LinkButton ID="LinkButtonFirstPage" runat="server" CommandArgument="First" CommandName="Page" Visible='<%#((GridView)Container.NamingContainer).PageIndex != 0 %>'>首页</asp:LinkButton> <asp:LinkButton ID="LinkButtonPreviousPage" runat="server" CommandArgument="Prev" CommandName="Page" Visible='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'>上一页</asp:LinkButton> <%--//如果该分页是尾页,那么该连接就不会显示了--%> <asp:LinkButton ID="LinkButtonNextPage" runat="server" CommandArgument="Next" CommandName="Page" Visible='<%# ((GridView)Container.NamingContainer).PageIndex != ((GridView)Container.NamingContainer).PageCount - 1 %>'>下一页</asp:LinkButton> <asp:LinkButton ID="LinkButtonLastPage" runat="server" CommandArgument="Last" CommandName="Page" Visible='<%# ((GridView)Container.NamingContainer).PageIndex != ((GridView)Container.NamingContainer).PageCount - 1 %>'>尾页</asp:LinkButton> 转到第 <asp:TextBox ID="txtNewPageIndex" runat="server" Width="20px" Text='<%# ((GridView)Container.Parent.Parent).PageIndex + 1 %>'/>页 <%--//这里将CommandArgument即使点击该按钮e.newIndex 值为3--%> <asp:LinkButton ID="btnGo" runat="server" CausesValidation="False" CommandArgument="-2" CommandName="Page" Text="Go"/> </PagerTemplate> </asp:GridView><%---------------------------------需求商信息结束--------------------------------------------------%><%---------------------------------配件信息表--------------------------------------------------%> <div class="input_info" style="width:620px;margin:15px auto;color:white;"> <span>操作类型:</span> <asp:DropDownList ID="ddlType" runat="server"> <asp:ListItem>入库</asp:ListItem> <asp:ListItem>出库</asp:ListItem> </asp:DropDownList> <span>编号:</span> <asp:TextBox runat="server" ID="txtNum"></asp:TextBox> <span>数量:</span> <asp:TextBox runat="server" ID="txtQuantity"></asp:TextBox> <div class="direction"> <span>需求商编号:</span> <asp:TextBox runat="server" ID="txtNeedMerchant"></asp:TextBox> </div> <asp:Button runat="server" Text="确认" ID="btnConfirm" OnClick="btnConfirm_Click"></asp:Button> </div> <asp:GridView ID="gvParts" runat="server" DataKeyNames="PartId" AutoGenerateColumns="False" AllowPaging="True" OnPageIndexChanging="gvParts_PageIndexChanging"> <Columns> <asp:BoundField DataField="Num" HeaderText="编号" /> <asp:BoundField DataField="PartName" HeaderText="名称" /> <asp:BoundField DataField="Name" HeaderText="生产单位" /> <asp:BoundField DataField="InTime" HeaderText="入库时间" /> <asp:BoundField DataField="Quantity" HeaderText="数量" /> <asp:BoundField DataField="UnitPrice" HeaderText="单价" /> </Columns> <%--添加分页--%> <PagerTemplate> 当前第: <%--//((GridView)Container.NamingContainer)就是为了得到当前的控件--%> <asp:Label ID="LabelCurrentPage" runat="server" Text="<%# ((GridView)Container.NamingContainer).PageIndex + 1 %>"></asp:Label> 页/共: <%-- //得到分页页面的总数--%> <asp:Label ID="LabelPageCount" runat="server" Text="<%# ((GridView)Container.NamingContainer).PageCount %>"></asp:Label> 页 <%--//如果该分页是首分页,那么该连接就不会显示了.同时对应了自带识别的命令参数CommandArgument--%> <asp:LinkButton ID="LinkButtonFirstPage" runat="server" CommandArgument="First" CommandName="Page" Visible='<%#((GridView)Container.NamingContainer).PageIndex != 0 %>'>首页</asp:LinkButton> <asp:LinkButton ID="LinkButtonPreviousPage" runat="server" CommandArgument="Prev" CommandName="Page" Visible='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'>上一页</asp:LinkButton> <%--//如果该分页是尾页,那么该连接就不会显示了--%> <asp:LinkButton ID="LinkButtonNextPage" runat="server" CommandArgument="Next" CommandName="Page" Visible='<%# ((GridView)Container.NamingContainer).PageIndex != ((GridView)Container.NamingContainer).PageCount - 1 %>'>下一页</asp:LinkButton> <asp:LinkButton ID="LinkButtonLastPage" runat="server" CommandArgument="Last" CommandName="Page" Visible='<%# ((GridView)Container.NamingContainer).PageIndex != ((GridView)Container.NamingContainer).PageCount - 1 %>'>尾页</asp:LinkButton> 转到第 <asp:TextBox ID="txtNewPageIndex" runat="server" Width="20px" Text='<%# ((GridView)Container.Parent.Parent).PageIndex + 1 %>'/>页 <%--//这里将CommandArgument即使点击该按钮e.newIndex 值为3--%> <asp:LinkButton ID="btnGo" runat="server" CausesValidation="False" CommandArgument="-2" CommandName="Page" Text="Go"/> </PagerTemplate> </asp:GridView> </div></form>
    6.二级管理员首页后台核心代码
    protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindData(); } } //绑定gvParts和gvNeed public void BindData() { //查询数据 StringBuilder sb = new StringBuilder(); sb.AppendLine("SELECT C.PartId,C.Num,C.PartName,S.Name,C.InTime,C.Quantity,C.UnitPrice"); sb.AppendLine("FROM CarParts AS C INNER JOIN Supplies AS S"); sb.AppendLine("ON C.FromDepartId = S.Id;"); DataSet ds = DbHelperSQL.Query(sb.ToString()); //将数据绑定到gvParts上展示 gvParts.DataSource = ds.Tables[0]; gvParts.DataBind(); //查询数据并绑定显示,绑定需求商表 string sql = "SELECT Id,IsDeliver,Num,Name,Principal,Address,Phone FROM NeedMerchant;"; DataSet dsNeed = DbHelperSQL.Query(sql); gvNeedMer.DataSource = dsNeed; gvNeedMer.DataBind(); } //分页 protected void gvParts_PageIndexChanging(object sender, GridViewPageEventArgs e) { // 得到该控件 GridView theGrid = sender as GridView; int newPageIndex = 0; if (e.NewPageIndex == -3) { //点击了Go按钮 TextBox txtNewPageIndex = null; //GridView较DataGrid提供了更多的API,获取分页块可以使用BottomPagerRow 或者TopPagerRow,当然还增加了HeaderRow和FooterRow GridViewRow pagerRow = theGrid.BottomPagerRow; if (pagerRow != null) { //得到text控件 txtNewPageIndex = pagerRow.FindControl("txtNewPageIndex") as TextBox; } if (txtNewPageIndex != null) { //得到索引 newPageIndex = int.Parse(txtNewPageIndex.Text) - 1; } } else { //点击了其他的按钮 newPageIndex = e.NewPageIndex; } //防止新索引溢出 newPageIndex = newPageIndex < 0 ? 0 : newPageIndex; newPageIndex = newPageIndex >= theGrid.PageCount ? theGrid.PageCount - 1 : newPageIndex; //得到新的值 theGrid.PageIndex = newPageIndex; //重新绑定 BindData(); } protected void btnConfirm_Click(object sender, EventArgs e) { //为操作日志做好准备 //获取输入编号数量和出库方向 string Num = txtNum.Text; int Quantity = Convert.ToInt32(txtQuantity.Text); string NeederNum = txtNeedMerchant.Text; //根据写入的编号获取配件的名称 string sqlGetPName = "Select PartName from CarParts where Num = @Num;"; SqlParameter[] pmsGetPName = { new SqlParameter("@Num",SqlDbType.NVarChar,50), }; pmsGetPName[0].Value = Num; DataSet dsGetPName = DbHelperSQL.Query(sqlGetPName, pmsGetPName); string pName = dsGetPName.Tables[0].Rows[0]["PartName"].ToString(); //根据写入的编号获取需求商的名称 string nName = ""; if (NeederNum != "") { string sqlGetNName = "Select Name from NeedMerchant where Num = @Num;"; SqlParameter[] pmsGetNName = { new SqlParameter("@Num",SqlDbType.NVarChar,50), }; pmsGetNName[0].Value = NeederNum; DataSet dsGetNName = DbHelperSQL.Query(sqlGetNName, pmsGetNName); nName = dsGetNName.Tables[0].Rows[0]["Name"].ToString(); } //获取用户登录的Id,并获取登录用户的相关信息 int id = Convert.ToInt32(Session["Id"]); DateTime date = Convert.ToDateTime(Session["LoginTime"]); if (id == 0) { id = 2; } string sqlUsers = "Select UserName,Department from Users where UserId = @id;"; SqlParameter[] pms = { new SqlParameter("@id",SqlDbType.Int), }; pms[0].Value = id; DataSet ds = DbHelperSQL.Query(sqlUsers,pms); string type = ddlType.SelectedValue; //插入日志列表 string sqlInsertLog = "insert into Log(Operator,Department,Type,Details,Time,IP)" + " Values(@Operator,@Department,@Type,@Details,getDate(),@IP)"; SqlParameter[] pmsInsertLog = { new SqlParameter("@Operator",SqlDbType.NVarChar,50), new SqlParameter("@Department",SqlDbType.NVarChar,50), new SqlParameter("@Type",SqlDbType.NVarChar,50), new SqlParameter("@Details",SqlDbType.NVarChar,50), new SqlParameter("@IP",SqlDbType.NVarChar,50) }; pmsInsertLog[0].Value = ds.Tables[0].Rows[0]["UserName"]; pmsInsertLog[1].Value = ds.Tables[0].Rows[0]["Department"]; pmsInsertLog[2].Value = type; if (type == "入库") { pmsInsertLog[3].Value = Num + pName + type + Quantity + "件"; } else { pmsInsertLog[3].Value = Num + pName + type + "至" + nName + Quantity + "件"; } pmsInsertLog[4].Value = GetIP(); DbHelperSQL.ExecuteSql(sqlInsertLog,pmsInsertLog); //根据下拉选择不同,有出库和入库两个选择,然后进行不同的操作 //入库操作 if (ddlType.SelectedValue == "入库") { //更改数据库数据 string sql = "update CarParts set Quantity = Quantity + @Quantity where Num = @Num"; SqlParameter[] pms2 = { new SqlParameter("@Quantity",SqlDbType.Int), new SqlParameter("@Num",SqlDbType.NVarChar,50) }; pms2[0].Value = Quantity; pms2[1].Value = Num; DbHelperSQL.ExecuteSql(sql,pms2); //插入操作日志 Response.Redirect("Index2.aspx"); } //出库操作 else { string sql = "update CarParts set Quantity = Quantity - @Quantity where Num = @Num"; SqlParameter[] pms1 = { new SqlParameter("@Quantity",SqlDbType.Int), new SqlParameter("@Num",SqlDbType.NVarChar,50) }; pms1[0].Value = Quantity; pms1[1].Value = Num; DbHelperSQL.ExecuteSql(sql, pms1); //更改需求商的是否发货状态 string sqlUpdate = "update NeedMerchant set IsDeliver = 'True' where Num = @NeedNum;"; SqlParameter[] pars = { new SqlParameter("@NeedNum",SqlDbType.NVarChar,50) }; pars[0].Value = NeederNum; DbHelperSQL.ExecuteSql(sqlUpdate,pars); Response.Redirect("Index2.aspx"); } } //获取Ip public string GetIP() { string result = String.Empty; result = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(result)) { result = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } if (string.IsNullOrEmpty(result)) { result = HttpContext.Current.Request.UserHostAddress; } if (string.IsNullOrEmpty(result)) { return "127.0.0.1"; } return result; }
    5.2 系统测试为了保证设计完成后的软件是有效的,健壮的,在软件开发的生命周期中要对软件进行测试,测试工作可以验证软件的需求是否都得以实现,软件是否正确地提供了需要的功能,以及软件是否能健壮稳定地运行。所以,本网站的测试主要以如下几方面为切入点:

    一、功能验收测试:对应软件的需求分析和详细设计文档,检查系统所应该实现的功能是否已经实现。对于一个软件,完成并能够使用的最基本条件是所有的功能都能覆盖,并且功能能够成功执行。 二、集成验收测试:在保证了每个功能都实现并可用之后,需要验证系统的每个功能的正确性,于是进一步的测试则要保证每一个功能的每种可能执行方式 都能得到正确的结果。这样我们才可以说,对外发布的系统是一个正确的系统。 三、健壮性、稳定性及性能测试:为了让系统能够稳定的高效运行,需要对系统进行以下的测试。如,选择一些非正常的输入,这时系统需要能继续稳定运 行,或者很容易从错误中自动恢复;当长时间的进行持续的操作时,系统对资源 的消耗应该处于稳定的,可接受的范围内,尤其要避免内存泄露等问题带来的风险;系统还要达到需求分析文档中所规定的性能指标,所以还要针对实际情况进 行性能测试;最后系统还要根据需要对不同平台、不同环境的兼容性进行测试。 整个系统需要测试的模块主要有登录模块,一级管理员的管理模块,二级管理员的管理模块。
    系统测试:功能测试、性能测试、验收测试。目的是为了保证所实现的系统确实是用户所需要的。
    登录验证,当用户名或密码不输入时提示用户重新输入,以及当用户输入的用户名和密码不匹配时,提示重新输入。当输入的是一级管理员则进入一级管理员首页,当输入的是二级管理员进入二级管理员首页。

    添加配件

    点击配件名称,弹出编辑界面

    勾选点击删除按钮便可以对信息进行删除

    填写入库信息后点击确定,该汽车配件数量增加
    参考文献[1] Karli Watson著,齐立波译,C#入门经典(第6版),2014-8
    [2] (美)内格尔(Nagel.C)等所著,C#高级编程,2008-10-1
    [3] 明日科技 著,ASP.NET从入门到精通,2012-09
    [4] 王珊,萨师煊.数据库系统概论(第四版).高等教育出版社,2006.5
    [5] ASP.NET 入门经典(第9版),2016-11
    [6] Baron Scbwartz.高性能MySQL(第3版)[M].电子工业出版社,2013
    [7] (美)加洛韦 等著,ASP.NET MVC5高级编程(第5版),2015-02
    [8] 构建之法 现代软件工程(第二版),2015-07
    [9] 王国辉,王毅.数据库系统开发案例精选[M].人民邮电出版社,2006
    [10] 软件工程:实践者的研究方法(原书第8版),2016-11
    1  留言 2018-09-26 18:38:29

发送私信

生活不会因为你是女孩子就善待你

11
文章数
15
评论数
eject