精华内容
下载资源
问答
  • python课程设计仓库管理系统,包含源码,文档,ppt
  • c语言课程设计,无窗口设计,变换的彩屏界面,以数组操作为主。。
  • C语言课程设计 食品仓库管理系统程序,C语言课程设计 食品仓库管理系统程序
  • 设计思想 ①新建账号密码,然后通过二者的匹配登录系统,这样可以保证是本校同学才能使用,另外还可以修改密码。 ②添加图书的基本信息,如 书号,书名,作者,出版社,类别,进库量; ③删除图书,通过图书的书名...
  • 数据库课程设计 仓库管理系统 给出详细的数据流图和E-R模型图以及代码界面
  • 可完全做为毕业设计、课程设计使用,界面美观、功能齐全。
  • Access仓库管理系统课程设计报告 仓库管理是一项繁琐复杂的工作,每天要处理大量的单据数据。为及时结清每笔业务,盘点库存和货物流动情况,保证企业生产用料以及货物安全,库管人员要花费大量人力物力和时间作数据...
  • 实训题目 仓库管理系统 专业 班级 姓名 成绩 一需求分析 1:问题 该系统所应包含的信息有以下一些: 产品仓库 根据需求该系统所应实现的功能有以下一些 输入密码进入操作界面 产品入库产品出库 查询指定仓库编号的...
  • 人生苦短,我用Python,咱们今天就来分享一个用Python语言开发的基于Django框架的图书管理系统吧。项目前台和后台界面模板都是自己编写,前台采用Bootstrap框架UI,后台EasyUI框架UI,没有采用Django自动生成的那个...
  • 可完全做为毕业设计、课程设计使用,界面美观、功能齐全。
  • 数据结构课程设计的完成报告,包括设计背景,目的,内容(需求分析,概要设计,测试界面),并附有 仓库管理系统 的全部代码。。。有何不足请指教
  • 基于java的数据库设计,是大学生的数据库和java学习后的课程设计的必要题目,有助于你们更好的学习和借鉴。
  • 仓库管理系统.rar

    2019-11-05 10:06:17
    用GUi界面写的仓库管理系统,简单的Demo,配有sql文件
  • 仓库管理系统/课程设计/ASP.NET/

    千次阅读 2020-04-05 18:23:53
    4.1系统登录界面设计及实现 4.1.1登录的界面及实现 用户登录的用户名和密码验证:先在数据库中创建用户的表,表中有用户名和密码,实现和数据库的连接,通过后台代码实现从Users表中查找密码和用户名。若没有,则...

    【ASP.NET课程设计作品】

    仓库管理系统
    源码:https://download.csdn.net/download/bugle_call/12305688

    • 大二 / ASP.NET / 课程设计作品
    • 仿照github上的项目,页面使用html+css搭建, 后端使用asp.net实现功能。
    • 未使用框架,仅仅实现增删改查的简单功能

    1、登录的界面及实现
    在这里插入图片描述
    用户登录的用户名和密码验证:先在数据库中创建用户的表,表中有用户名和密码,实现和数据库的连接,通过后台代码实现从Users表中查找密码和用户名。若没有,则返回的结果集为空,则提示用户名不能为空,若存在,则有结果集,密码和验证码都对了,就会跳转到用户首页。如果验证码和密码有一个不对的,就会有相应的提示。

    2、员工管理界面设计及功能
    在这里插入图片描述
    这是员工管理的界面,用户表是对仓库管理系统的使用人员进行控制的表,主要涉及到了对用户的增加和删除,以及查看功能。并且通过角色表的控制对系统的访问做一定的访问控制,该页面只有管理员才有权限访问

    3、角色管理界面设计及功能
    在这里插入图片描述
    这是角色管理的界面,主要是提供给管理员对员工信息的新增、修改、删除、查询,
    其中新增和修改将会弹出模态框,在模态框中提供了新增和修改的文本输入框,搜索按钮可以提供模糊搜索,导入导出按钮可以提供Excel表格的批量导入和导出。

    4、产品类别管理界面设计及功能
    在这里插入图片描述

    这是部门管理的界面,主要是提供给仓库管理者对产品类别信息的新增、修改、删除、查询,
    其中新增和修改将会弹出模态框,在模态框中提供了新增和修改的文本输入框,搜索按钮可以提供模糊搜索,导入导出按钮可以提供Excel表格的批量导入和导出。

    4.1、入库管理界面设计及功能
    在这里插入图片描述
    在这里插入图片描述
    这是入库管理的界面,主要是提供给业务员对入库订单信息的新增、删除、查询、审核。
    点击新增将会进入新增页面,进行添加入库单信息和产品信息。其中添加产品信息是个模态框,在模态框中提供了新增和修改的文本输入框,搜索按钮可以提供模糊搜索,导入导出按钮可以提供Excel表格的批量导入和导出。点击审核按钮将会进行审核。

    4.2、出库管理界面设计及功能
    在这里插入图片描述
    在这里插入图片描述
    这是出库管理的界面,主要是提供给业务员对出库订单信息的新增、删除、查询、审核。
    点击新增将会进入新增页面,进行添加入库单信息和产品信息。其中添加产品信息是个模态框,在模态框中提供了新增和修改的文本输入框,搜索按钮可以提供模糊搜索,导入导出按钮可以提供Excel表格的批量导入和导出。点击审核按钮将会进行审核。

    展开全文
  • 本项目是一套基于JavaWeb的仓库管理系统,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本、软件工具、项目说明等,该项目可以直接作为毕设使用。 项目都...
  • 期末课程设计——仓库管理系统

    千次阅读 2019-05-14 01:25:00
    如今,仓库变得越来越庞大,以至于人力已经不足以胜任如此繁多的管理工作,为了更方便的管理仓库的运行,以及出入库的统计,所以需要一个信息化的管理系统,来统一的查看和管理仓库的运行。 1.2 可行性分析 1.2.1 ...

    1.1     用户需求

    1.1.1   业务需求

    如今,仓库变得越来越庞大,以至于人力已经不足以胜任如此繁多的管理工作,为了更方便的管理仓库的运行,以及出入库的统计,所以需要一个信息化的管理系统,来统一的查看和管理仓库的运行。

    1.2     可行性分析

    1.2.1   技术可行性

    Mysql + Spring + IntelliJ IDEA + GlassFish + Java

     

    Spring 框架是一个继承的框架,因此使用Spring框架可以省去很多时间开发

    1.2.2   经济可行性

    此系统仅仅需要人工编写代码就能解决仓库管理的问题,能省去许多的人工管理费用,因此在经济上可行

     

    1.3     系统功能

    1. 首页,显示每天和每月的出入库记录

    2. 符合查询,查找相关记录

    3. 入库,可视化仓库容量,并设有智能推荐,能一键入库

    4. 出库界面实现了裤子的出厂,其中引用了前面查询的方法来选择想要出库的种类,后端将按到仓时间的前后顺序返回给前端有哪些包裹可以出,出库后生成出库记录。

    5. 盘点,盘点分为全部位置和变动位置,全部位置是对于所有的货架每个位置都要进行盘点,这个主要是用来每个月对整个仓库进行一次检查。而变动盘点则是每天一次,主要是对每天有变动的位置进行检查,其中只要有货物进出的位置都算是一个有变动的位置,我们后台会进行标记并在变动盘点时将这一部分位置告诉盘点员。

    6. 人员管理,需要管理员权限,当账号为管理员时才能进入该页面

     

    第2章       概要设计

    本章写作简要说明(在正式文档中请删除):

    l  介绍集成了各种功能的系统总体设计模式,可以用架构图的方式来表达。

    l  介绍持久层设计思想以及PO的设计。

    l  (本章推荐使用E-R图、用例图、架构图。每个图表都需要用文字加以说明)

     

    2.1     系统设计模式

     

    2.2     系统总体结构

    首页:

    能够查询每天的出入库的货物数量(线性显示),以及当前库存的使用情况(百分比显示),以及当前年的每月仓储出入统计(表格显示)

     

    查询:

            能够查询当前货物的货物信息、出入库记录,待入库货物,其中

     

            货物信息

                     能够通过货物的ID,或者根据一系列的标签来检索相应货物的信息

            出入库记录

                     能通过用户、包裹的ID,以及包裹的位置、出入库时间来检索相应的货物

            待入库货物

                     能通过包裹的ID来查看相应的未入库的货物

     

    入库:

            分为 新包裹、重新入库、批量入库

           

    出库:

            分为 智能推荐 和 自定义出库

            其中智能推荐可以自动的把货物放入推荐的地方,而自定义的出库则需要填写相关的信息来将货物根据信息放到相应的位置

     

    盘点:

            分为 全部货架 和 变动位置

            全部货架:

                     显示当前所有货架的存储情况,并且能够看到相应的信息详情,以及打印相关信息

            变动位置:

                     显示当前的仓库中还有那些货物的位置有过变动并作出记录

    统计图:

          通过选择相应的模板来查看相应的货架的历史重量(线性统计图显示)

    E-R图:

    架构图:

     

    转载于:https://www.cnblogs.com/Teay/p/10860028.html

    展开全文
  • C语言课程设计——仓库物资管理系统

    千次阅读 多人点赞 2019-10-17 23:01:16
    仓库物资管理系统前言系统功能设计代码运行截图总结 前言 此系统为博主大一上学期C语言课程设计的大作业,由于当时初步接触C语言,现在来看程序写的太烂了,简直不忍直视……但是还是想通过博客的形式记录下来,也...

    前言

    此系统为博主大一上学期C语言课程设计的大作业,由于当时初步接触C语言,现在来看程序写的太烂了,简直不忍直视……但是还是想通过博客的形式记录下来,也可以给刚接触学习C语言的人一些参考吧!

    系统功能设计

    • 仓库初始化
    • 查询库存
      *按电器名查询
      *按品牌名查询
      *按送货人查询
      *按提货人查询
      *按电器名称由大到小顺序输出所有库存
      *按库存数量由高到低输出所有库存
    • 物资存入
    • 物资取出
    • 统计物资
      *入库电器总价值
      *出库电器总利润
      *统计某月每种电器的出库数目
      *统计某月每种品牌的电器的出库数目

    代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    //------------------------------------------------------结构体区域
    typedef struct
    {
    	char name[20];             //电器名称
    	char brandName[20];	       //品牌名称
    	int num;                   //库存数量
    	int unitPrice;             //单价
    	int year;
    	int month;
    	int day;
    	char manName[20];
    }stock;	                                 //库存
    stock s[10000],t[10000],x[10000],y[10000],in[10000],out[10000],no[10000],no1[10000],no2[10000];                //全局变量
    //-------------------------------------------------------函数声明区域
    void menu(void);//主菜单函数
    void write(void);//创建仓库函数
    void find(void);//查询库存函数
    void findPart(void);//部分查询函数
    void findOne(void);    //按电器名查询
    void findTwo(void);    //按品牌名查询
    void findThree(void);  //按提货人查询
    void findFour(void);   //按送货人查询
    void findFive(void);   //按电器名称大小顺序输出所有库存
    void findSix(void);    //按库存数量由高到低输出所有库存
    void deposit(void);//存入仓库函数
    void takeout(void);//取出仓库函数
    void tongji(void);//统计函数
    void tongji1(void);//第一种统计函数
    void tongji2(void);//第二种统计函数
    void tongji3(void);//第三种统计函数
    void tongji4(void);//第四种统计函数
    int readFile(void);//读取库存记录文件中所有结构体的数目
    int readFile1(void);//读取入库记录文件中所有结构体的数目
    int readFile2(void);//读取出库记录文件中所有结构体的数目
    void end(void);//结束退出函数
    //-------------------------------------------------------主函数
    int main()
    {
    	menu();
    	return 0;
    }
    void menu(void)
    {
    	int n,l=0;
    	printf("============================================================\n");
    	printf("                                                            \n");
    	printf(" -----*****欢 迎 使 用 仓 库 物 资 管 理 系 统 ! *****----- \n");
    	printf("                                                            \n");
    	printf("============================================================\n");
    	printf("                                                            \n");
    	printf(" 您可以进行以下操作:                                       \n");
    	printf("                                                            \n");
    	printf("         1.    仓库初始化                                   \n");
    	printf("                                                            \n");
    	printf("         2.    查询库存                                     \n");
    	printf("                                                            \n");
    	printf("         3.    物资存入                                     \n");
    	printf("                                                            \n");
    	printf("         4.    物资取出                                     \n");
    	printf("                                                            \n");
    	printf("         5.    统计物资                                     \n");
    	printf("                                                            \n");
    	printf("         0.    退出系统                                     \n");
    	printf("                                                            \n");
    	printf("                                                            \n");
    	printf("============================================================\n");
    	printf("现在请选择您要进行的操作:(请输入操作前的数字)");
    	while(scanf("%d",&n)!=EOF)
        {
            switch(n)
    		{
    			case 1:system("CLS");write();break;
    			case 2:system("CLS");find();break;
    			case 3:system("CLS");deposit();break;
    			case 4:system("CLS");takeout();break;
    			case 5:system("CLS");tongji();break;
    			case 0:system("CLS");end();exit(0);
    			default :printf("没有此选项!\n  请重新输入!\n");
            }
        }
    
    
    
    
    
    
    
    }
    void write(void)        //right
    {
    	FILE *fp;
    	int i,n;
    	fp=fopen("库存记录.dat","wb");
    	rewind(fp);
    	printf("============================================================\n");
    	printf("请输入仓库中电器信息的组数!\n        ps:相同电器但是不同品牌电器算多种!\n");
    	scanf("%d",&n);
    	for(i=0;i<n;i++)
    	{
    		printf("开始写入第%d组\n",i+1);
    		printf("请输入电器名称:");
    		scanf("%s",s[i].name);
    		printf("请输入电器品牌名称:");
    		scanf("%s",s[i].brandName);
    		printf("请输入电器数量:");
    		scanf("%d",&s[i].num);
    		printf("请输入电器单价:");
    		scanf("%d",&s[i].unitPrice);
    		printf("请输入存货时间: <年月日之间用空格隔开>例:2016 12 01\n");
    		scanf("%d%d%d",&s[i].year,&s[i].month,&s[i].day);
    		printf("请输入存货人:");
    		scanf("%s",s[i].manName);
    	}
    	fwrite(s,sizeof(stock),n,fp);
    	fclose(fp);
    	printf("当前库存记录:(请仔细核对)\n");
    	for(i=0;i<n;i++)
        {
          printf("%s\n%s\n%d\n%d\n%d.%d.%d\n%s\n",s[i].name,s[i].brandName,s[i].num,s[i].unitPrice,s[i].year,s[i].month,s[i].day,s[i].manName);
        }
    
    	printf("电器信息写入完成!\n  请按回车键返回主界面!\n");
    	getchar();getchar();
    	system("CLS");
    	menu();
    }
    void findOne(void)
    {
    	char name[10],ch='y';
    	int i,k,n,bn;
    	bn=readFile();
    	do
    	{
    		system("CLS");
    		printf("============================================================\n");
    		printf("请输入要查询的电器名称:\n");
    		getchar();
    		gets(name);
    		k=-1;
    		for(i=0;i<bn;i++)
    		{
    			if(strcmp(t[i].name,name)==0)
    			{
    				printf("该电器信息如下:\n");
    				k=i;
    				printf("电器名称:%s,电器品牌:%s,库存数量:%d,电器单价:%d,入库时间:%d.%d.%d,存货人:%s\n",t[k].name,t[k].brandName,t[k].num,t[k].unitPrice,t[k].year,t[k].month,t[k].day,t[k].manName);
    			}
    		}
    		if(k==-1)
    		{
    			printf("抱歉,本仓库中无此电器!\n");
    		}
    		printf("\n是否继续查询?<y/n>\n");
    		ch=getchar();
    	}while(ch=='y'||ch=='Y');
    	printf("将返回上一级菜单!\n  请按回车键确认!\n");
    	getchar();getchar();
    	system("CLS");
    	findPart();
    }
    void findTwo(void)
    {
    	char brandName[10],ch='y';
    	int i,k,n,bn;
    	bn=readFile();
    	do
    	{
    		system("CLS");
    		printf("============================================================\n");
    		printf("请输入要查询的品牌名称:\n");
    		getchar();
    		gets(brandName);
    		k=-1;
    		for(i=0;i<bn;i++)
    		{
    			if(strcmp(t[i].brandName,brandName)==0)
    			{
    				printf("该电器信息如下:\n");
    				k=i;
    				printf("电器名称:%s,电器品牌:%s,库存数量:%d,电器单价:%d,入库时间:%d.%d.%d,存货人:%s\n",t[k].name,t[k].brandName,t[k].num,t[k].unitPrice,t[k].year,t[k].month,t[k].day,t[k].manName);
    			}
    		}
    		if(k==-1)
    		{
    			printf("抱歉,本仓库中无此电器!\n");
    
    		}
    		printf("\n是否继续查询?<y/n>\n");
    		ch=getchar();
    	}while(ch=='y'||ch=='Y');
    	printf("将返回上一级菜单!\n  请按回车键确认!\n");
    	getchar();getchar();
    	system("CLS");
    	findPart();
    }
    void findThree(void)           // 按送货人查询  入库
    {
    	char manName[10],ch='y';
    	int i,k,n,bn1;
    	bn1=readFile1();
    	FILE *fp1;
    	fp1=fopen("入库记录.dat","rb+");
    	if(fp1==NULL)
    	{
    		printf("该仓库中未添加任何电器!\n");
    		exit(0);
    	}
    	fread(&y,sizeof(stock),bn1,fp1);
    	fclose(fp1);
    	do
    	{
    		system("CLS");
    		printf("============================================================\n");
    		printf("请输入要查询的存货人:\n");
    		getchar();
    		gets(manName);
    		k=-1;
    		for(i=0;i<bn1;i++)
    		{
    			if(strcmp(y[i].manName,manName)==0)
    			{
    				printf("该电器信息如下:\n");
    				k=i;
    				printf("电器名称:%s,电器品牌:%s,库存数量:%d,电器单价:%d,入库时间:%d.%d.%d,存货人:%s\n",y[k].name,y[k].brandName,y[k].num,y[k].unitPrice,y[k].year,y[k].month,y[k].day,y[k].manName);
    			}
    		}
    		if(k==-1)
    		{
    			printf("抱歉,本仓库中无此存货人存入的电器!\n");
    
    		}
    		printf("\n是否继续查询?<y/n>\n");
    		ch=getchar();
    	}while(ch=='y'||ch=='Y');
    	printf("将返回上一级菜单!\n  请按回车键确认!\n");
    	getchar();getchar();
    	system("CLS");
    	findPart();
    }
    void findFour(void)          //按提货人查询   出库
    {
    	char manName[10],ch='y';
    	int i,k,n,bn2;
    	bn2=readFile2();
    	FILE *fp2;
    	fp2=fopen("出库记录.dat","rb+");
    	if(fp2==NULL)
    	{
    		printf("该仓库中未提出任何电器!\n");
    		exit(0);
    	}
    	fread(&x,sizeof(stock),bn2,fp2);
    	fclose(fp2);
    	do
    	{
    		system("CLS");
    		printf("============================================================\n");
    		printf("请输入要查询的提货人:\n");
    		getchar();
    		gets(manName);
    		k=-1;
    		for(i=0;i<bn2;i++)
    		{
    			if(strcmp(x[i].manName,manName)==0)
    			{
    				printf("该电器信息如下:\n");
    				k=i;
    				printf("电器名称:%s,电器品牌:%s,库存数量:%d,电器单价:%d,出库时间:%d.%d.%d,提货人:%s\n",x[k].name,x[k].brandName,x[k].num,x[k].unitPrice,x[k].year,x[k].month,x[k].day,x[k].manName);
    			}
    		}
    		if(k==-1)
    		{
    			printf("抱歉,本仓库中无此提货人提出的电器!\n");
    
    		}
    		printf("\n是否继续查询?<y/n>\n");
    		ch=getchar();
    	}while(ch=='y'||ch=='Y');
    	printf("将返回上一级菜单!\n  请按回车键确认!\n");
    	getchar();getchar();
    	system("CLS");
    	findPart();
    
    
    }
    void findFive(void)       //电器名称大小顺序输出所有库存
    {
    	int bn;
    	bn=readFile();
    	printf("============================================================\n");
    	FILE *fp;
    	fp=fopen("库存记录.dat","rb+");
    	if(fp==NULL)
    	{
    		printf("该仓库中无库存!\n");
    		exit(0);
    	}
    	fread(&s,sizeof(stock),bn,fp);
    	int i,j;
    	for(i=0;i<bn-1;i++)
    		for(j=0;j<bn-1-i;j++)
    		{
    			if(s[j].name<s[j+1].name)
    			{
    				t[1]=s[j+1];
    				s[j+1]=s[j];
    				s[j]=t[1];
    			}
    		}
    	for(i=0;i<bn;i++)
    		printf("%d.  电器名称:%s,电器品牌:%s,库存数量:%d,电器单价:%d,入库时间:%d.%d.%d,存货人:%s\n",i+1,s[i].name,s[i].brandName,s[i].num,s[i].unitPrice,s[i].year,s[i].month,s[i].day,s[i].manName);
    	printf("\n输出完成!请按回车键返回上一级!\n");
    	getchar();getchar();
    	system("CLS");
    	findPart();
    }
    void findSix(void)        //按库存数量由高到低输出所有库存
    {
    	int bn;
    	bn=readFile();
    	printf("============================================================\n");
    	FILE *fp;
    	fp=fopen("库存记录.dat","rb+");
    	if(fp==NULL)
    	{
    		printf("该仓库中无库存!\n");
    		exit(0);
    	}
    	fread(&s,sizeof(stock),bn,fp);
    	int i,j;
    	for(i=0;i<bn-1;i++)
    		for(j=0;j<bn-1-i;j++)
    		{
    			if(s[j].num<s[j+1].num)
    			{
    				t[1]=s[j+1];
    				s[j+1]=s[j];
    				s[j]=t[1];
    			}
    		}
    	for(i=0;i<bn;i++)
    		printf("%d.  电器名称:%s,电器品牌:%s,库存数量:%d,电器单价:%d,入库时间:%d.%d.%d,存货人:%s\n",i+1,s[i].name,s[i].brandName,s[i].num,s[i].unitPrice,s[i].year,s[i].month,s[i].day,s[i].manName);
    	printf("\n输出完成!请按回车键返回上一级!\n");
    	getchar();getchar();
    	system("CLS");
    	findPart();
    }
    void findPart(void)
    {
    	int n;
    	printf("============================================================\n");
    	printf("1. 按电器名查询\n");
    	printf("2. 按品牌名查询\n");
    	printf("3. 按送货人查询\n");
    	printf("4. 按提货人查询\n");
    	printf("5. 按电器名称由大到小顺序输出所有库存\n");
    	printf("6. 按库存数量由高到低输出所有库存\n");
    	printf("0. 返回主菜单\n");
    	while(scanf("%d",&n)!=EOF)
    	switch(n)
    	{
    		case 1:system("CLS");findOne();break;
    		case 2:system("CLS");findTwo();break;
    		case 3:system("CLS");findThree();break;
    		case 4:system("CLS");findFour();break;
    		case 5:system("CLS");findFive();break;
    		case 6:system("CLS");findSix();break;
    		case 0:system("CLS");menu();break;
    		default :printf("没有此选项!\n  请重新输入!\n");
    	}
    }
    void find(void)
    {
    	int i,bn;
    	FILE *fp;
    	fp=fopen("库存记录.dat","rb+");
    	if(fp==NULL)
    	{
    		printf("该仓库中无库存!\n");
    		exit(0);
    	}
    	rewind(fp);
    	bn=readFile();
    	fread(&t,sizeof(stock),bn,fp);
    	getchar();
    	findPart();
    	fclose(fp);
    }
    void deposit(void)   //入库
    {
    	printf("============================================================\n");
    	int bn,bn1;
    	stock jia;
    	FILE *fp1,*fp;
    	int i=0,j,n=0;
    	char ch='y';
    
    	printf("请输入要加入仓库的电器信息:\n");
    	do
    	{
    		fp1=fopen("入库记录.dat","ab+");
    		if(fp1==NULL)
    		{
    			printf("该仓库中未添加任何电器!\n");
    			exit(0);
    		}
    		fp=fopen("库存记录.dat","ab+");
    		bn=readFile();
    		bn1=readFile1();
    		printf("请输入电器名称:");
    		scanf("%s",jia.name);
    		printf("请输入电器品牌:");
    		scanf("%s",jia.brandName);
    		printf("请输入电器数量:");
    		scanf("%d",&jia.num);
    		printf("请输入电器单价:");
    		scanf("%d",&jia.unitPrice);
    		printf("请输入送货时间: <ps: 年月日之间用空格隔开>  例:2016 12 01\n");
    		scanf("%d%d%d",&jia.year,&jia.month,&jia.day);
    		printf("请输入送货人:");
    		scanf("%s",jia.manName);
    		fwrite(&jia,sizeof(stock),1,fp1);
    		fwrite(&jia,sizeof(stock),1,fp);
    		fclose(fp1);fclose(fp);
    		printf("是否继续输入?<y/n>\n");
    		getchar();
    		ch=getchar();
    	}while(ch=='y'||ch=='Y');
    	printf("将返回上一级菜单!\n  请按回车键确认!\n");
    	getchar();
    
    	system("CLS");
    	menu();
    }
    void takeout(void)     //出库
    {
    	stock jian;
    	printf("==============================================================\n");
    	int bn,bn2,i,j;
    	char ch='y';
    	FILE *fp,*fp2;
    	bn=readFile();
    	bn2=readFile2();
    
    	printf("请输入要提出仓库的电器信息:\n");
    	do
    	{
    		fp=fopen("库存记录.dat","rb+");
    		if(fp==NULL)
    		{
    			printf("无法打开此文件!\n");
    			exit(0);
    		}
    		for(i=0;i<bn;i++)
    		{
    			fread(&s[i],sizeof(stock),1,fp);
    		}
    		fclose(fp);
    		fp2=fopen("出库记录.dat","wb+");
    		if(fp2==NULL)
    		{
    			printf("无法打开此文件!\n");
    			exit(0);
    		}
    		printf("请输入电器名称:");
    		scanf("%s",jian.name);
    		printf("请输入电器品牌:");
    		scanf("%s",jian.brandName);
    		printf("请输入电器数量:");
    		scanf("%d",&jian.num);
    		printf("请输入电器单价:");
    		scanf("%d",&jian.unitPrice);
    		printf("请输入提货时间: <ps: 年月日之间用空格隔开>  例:2016 12 01\n");
    		scanf("%d%d%d",&jian.year,&jian.month,&jian.day);
    		printf("请输入提货人:");
    		scanf("%s",jian.manName);
    		getchar();
    		fwrite(&jian,sizeof(stock),1,fp2);
    		fclose(fp2);
    		for(i=0;i<bn;i++)
    		{
    			if((strcmp(jian.name,s[i].name)==0)&&(strcmp(jian.brandName,s[i].brandName)==0))
    			{
    				if(jian.num<=s[i].num)
    				{
    					s[i].num=s[i].num-jian.num;
    				}
    				else
    				{
    					printf("库存不足!无法提出!\n");
    					printf("请按回车键返回!");
    					getchar();
    					system("CLS");
    					menu();
    				}
    			}
    		}
    		fopen("库存记录.dat","wb+");
    		for(i=0;i<bn;i++)
    		{
    			fwrite(&s[i],sizeof(stock),1,fp);
    		}
    		fclose(fp);
    
    		printf("\n出库完成! 是否继续输入?<y/n>\n");
    		getchar();
    		ch=getchar();
    	}while(ch=='y'||ch=='Y');
    	printf("将返回上一级菜单!\n  请按回车键确认!\n");
    	getchar();
    
    	system("CLS");
    	menu();
    
    }
    void tongji(void)
    {
    	int n;
    	system("CLS");
    	printf("==============================================================\n");
    	printf("1. 入库电器总价值\n");
    	printf("2. 出库电器总利润\n");
    	printf("3.统计该月每种电器的出库数目\n");
    	printf("4.统计该月每种品牌的电器的出库数目\n");
    	printf("0. 返回主菜单\n");
    	printf("请选择要进行的操作:(0到4)\n");
    	scanf("%d",&n);
    	getchar();
    	while(n!=0&&n!=1&&n!=2&&n!=3&&n!=4)
    	{
    
    		printf("没有此选项!\n  请重新输入!\n");
    		scanf("%d",&n);
            getchar();
       }
       switch(n)
    		{
    			case 1:tongji3();break;//第三种统计函数
    			case 2:tongji4();break;//第四种统计函数
    			case 3:tongji1();break;//第一种统计函数
    			case 4:tongji2();break;//第二种统计函数
    			case 0:system("CLS");menu();break;
    		}
    }
    void tongji2(void)//第二种统计函数
    {
         FILE *fp;
        int bn1,i,year,month,k=0;
        bn1=readFile1();
        system("CLS");
        printf("==============================================================\n");
    	fp=fopen("出库记录.dat","rb+");
    	if(fp==NULL)
    	{
    		printf("无法打开此文件!\n");
    		exit(0);
    	}
    	for(i=0;i<bn1;i++)
    	{
    		fread(&s,sizeof(stock),bn1,fp);
    	}
        printf("请输入一个日期(年 月 如 2017 01):\n");
    	scanf("%d%d",&year,&month);
    
            for(i=0;i<bn1;i++)
           {
               if((s[i].year==year)&&(s[i].month==month))
               {
                   printf("电器名称:%s\n品牌名称:%s\n出库数目:%d\n",s[i].name,s[i].brandName,s[i].num);
                   k+=1;
               }
           }
               if(k==0)
                printf("库存记录中不存在此种电器!\n");
    
    
        fclose(fp);
        printf("统计完成,请按回车键返回!\n");
    	getchar();
    	getchar();
    	system("CLS");
    	tongji();
    
    }
    void tongji1(void)//第一种统计函数
    {
        FILE *fp;
        int bn1,i,year,month,k=0;
        bn1=readFile1();
        system("CLS");
        printf("==============================================================\n");
    	fp=fopen("出库记录.dat","rb+");
    	if(fp==NULL)
    	{
    		printf("无法打开此文件!\n");
    		exit(0);
    	}
    	for(i=0;i<bn1;i++)
    	{
    		fread(&s,sizeof(stock),bn1,fp);
    	}
        printf("请输入一个日期(年 月 如 2017 01 ):\n");
    	scanf("%d%d",&year,&month);
    
           for(i=0;i<bn1;i++)
           {
               if((s[i].year==year)&&(s[i].month==month))
               {
                   printf("电器名称:%s\n出库数目:%d\n",s[i].name,s[i].num);
                   k+=1;
               }
           }
               if(k==0)
                printf("库存记录中不存在此种电器!\n");
    
    
    
        fclose(fp);
        printf("统计完成,请按回车键返回!\n");
    	getchar();
    	getchar();
    	system("CLS");
    	tongji();
    
    
    }
    void tongji3(void)//第三种统计函数
    {
    	FILE *fp;
    	int bn1,i;
    	long long int total=0;
    	bn1=readFile1();
    	system("CLS");
    	printf("==============================================================\n");
    	fp=fopen("入库记录.dat","rb+");
    	if(fp==NULL)
    	{
    		printf("无法打开此文件!\n");
    		exit(0);
    	}
    	for(i=0;i<bn1;i++)
    	{
    		fread(&s[i],sizeof(stock),1,fp);
    	}
    	fclose(fp);
    	for(i=0;i<bn1;i++)
    	{
    		total+=(s[i].num*s[i].unitPrice);
    	}
    	printf("商品总价值为%d\n",total);
    	printf("统计完成,请按回车键返回!\n");
    	getchar();
    	system("CLS");
    	tongji();
    }
    void tongji4(void)//第四种统计函数
    {
    
    	FILE *fp1,*fp2;
    	int bn,bn2,i;
    	long long int money=0;
    	bn=readFile();
    	bn2=readFile2();
    	system("CLS");
    	printf("==============================================================\n");
    	fp1=fopen("库存记录.dat","rb+");
    
    	if(fp1==NULL)
    	{
    		printf("无法打开此文件!\n");
    		exit(0);
    	}
    	for(i=0;i<bn;i++)
    	{
    		fread(&s[i],sizeof(stock),1,fp1);
    	}
    	fclose(fp1);
    	fp2=fopen("出库记录.dat","rb+");
    	if(fp2==NULL)
    	{
    		printf("无法打开此文件!\n");
    		exit(0);
    	}
    	for(i=0;i<bn2;i++)
    	{
    		fread(&t[i],sizeof(stock),1,fp2);
    	}
    	fclose(fp2);
    
    	for(i=0;i<bn2;i++)
    	{
    		money+=((t[i].unitPrice-s[i].unitPrice)*t[i].num);
    	}
    	printf("总利润为%d\n",money);
    	printf("统计完成,请按回车键返回!\n");
    	getchar();
    	system("CLS");
    	tongji();
    }
    void end(void)
    {
    	printf("==============================================================\n");
    	printf("                                                              \n");
    	printf("                                                              \n");
    	printf("                                                              \n");
    	printf("            感 谢 使 用 本 系 统 !                           \n");
    	printf("                                                              \n");
    	printf("             再 见 !                                         \n");
    	printf("                                                              \n");
    	printf("                                                              \n");
    	printf("                                                              \n");
    	printf("                                                              \n");
    	printf("==============================================================\n");
    }
    int readFile(void)//库存记录文件中结构体的个数
    {
    	FILE *fb;
    	int bn=0;
    	fb=fopen("库存记录.dat","rb+");
    	if(fb==NULL)
    	{
    		return bn;
    	}
    	while(!feof(fb))
    	{
    		if(fread(&no[bn],sizeof(stock),1,fb))
    			bn++;
    	}
    	fclose(fb);
    	return bn;
    }
    int readFile1(void)//入库记录文件中结构体的个数
    {
    	FILE *fb;
    	int bn1=0;
    	fb=fopen("入库记录.dat","rb+");
    	if(fb==NULL)
    	{
    		return bn1;
    	}
    	while(!feof(fb))
    	{
    		if(fread(&no1[bn1],sizeof(stock),1,fb))
    			bn1++;
    	}
    	fclose(fb);
    	return bn1;
    }
    int readFile2(void)//出库记录文件中结构体的个数
    {
    	FILE *fb;
    	int bn2=0;
    	fb=fopen("出库记录.dat","rb+");
    	if(fb==NULL)
    	{
    		return bn2;
    	}
    	while(!feof(fb))
    	{
    		if(fread(&no2[bn2],sizeof(stock),1,fb))
    			bn2++;
    	}
    	fclose(fb);
    	return bn2;
    }
    
    

    运行截图

    主菜单

    总结

    两年前写的程序了,大体运行了一下,存在一点小bug,还有一些设计不合理的地方以及没有解决非法输入的问题……

    展开全文
  • 课程设计仓库管理系统,C++做的,功能齐全,界面友好
  • 这是一个word 文档而已,但里面是包含了在Vc++上运行成功的代码,如果你也是想在DOC界面上显示功能而已,这是一个很好的代码,而不是在什么高级平台上才能运行,简单,方便!
  • (1)实现不同的管理员通过相应的用户名和密码登录图书仓库管理系统,进入菜单界面,方便的实现图书仓库管系统的相关功能; (2) 在图书仓库系统里实现图书的入库功能; 在入库界面,将图书的所有信息输入,在数据库里...
  • 基于Web的仓库管理系统设计与实现

    万次阅读 多人点赞 2019-07-02 20:27:48
    摘 要 仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展,改革开放的不断深入,企业要想在...在此篇文章中严格按照软件工程思想,设计并实现了一个仓库信息管理系统。介绍了系统从...

    摘 要
    仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展,改革开放的不断深入,企业要想在激烈的市场竞争中立于不败之地,要想继续的发展与生存,没有现代化的管理方式与方法是万万不行的,仓库管理的全面信息化、自动化则是在其中占有极其重要的地位。仓库管理信息系统则是在此需求背景下开始研制并开发的。在此篇文章中严格按照软件工程思想,设计并实现了一个仓库信息管理系统。介绍了系统从需求分析,逻辑设计,总体设计,详细设计以及系统测试、实施各阶段的主要内容和成果,包括系统结构图、业务流程图数据流程图、物理表实现及其关系、功能模块算法流程、界面设计等等。
    关键字 仓库; 软件工程; 系统开发

    Design and implementation of warehouse management system based on Web
    Abstract
    Warehouse management is a major issue is closely related to our daily life. With China’s rapid economic development and the deepening of reform and opening up, the enterprise to be in an invincible position in the fierce market competition, want to continue development and survival, no modern management methods and methods is absolutely out, warehouse management and comprehensive information, automation is where you play a very important role. Warehouse management information system is started research and development in the context of this demand. This article strictly according to the software engineering, design and implementation of a warehouse management system. Introduced from requirements analysis, logic design, General design, detailed design and system testing, implementation of the content and results of each stage, including charts, business process data flow chart, functional modules algorithms, physical form and its process, interface design and so on.

    Key warehouse Software engineering; System development

                      目  录
    

    摘 要 i
    Abstract ii
    目 录 iii
    1. 绪论 1
    1.1 系统背景 1
    1.2 开发目的 1
    1.3 开发工具 2
    1.3.1 Eclipse 2
    1.3.2 Oracle 2
    1.3.3 PowerDesigner 2
    1.4 相关技术介绍 3
    1.4.1 JSP技术 3
    1.4.2 JavaScript技术 5
    1.4.3 Tomcat 5
    1.4.4 软硬件需求 6
    1.5 可行性研究分析 6
    1.5.1 系统目标可行性分析 7
    1.5.2 系统的经济可行性 7
    1.5.3 系统的技术可行性 7
    1.5.4 系统的法律可行性 7
    2. 软件需求分析 8
    2.1 需求分析 8
    2.1.1 用例图 8
    2.1.2 类图 9
    2.2 功能需求分析 9
    2.3 业务流程分析 10
    2.3.1 管理员模块业务流程 10
    2.3.2 客户模块业务流程分析 10
    2.4 数据流程分析 11
    2.4.1 顶层数据流 11
    2.4.2 一层数据流图 11
    2.4.3 二层数据流图 12
    2.5 数据字典分析 13
    2.5.1 数据存储条目 13
    2.5.2 加工条目 14
    3. 软件总体设计 16
    3.1 软件结构设计原则 16
    3.1.1 软件的结构体系 16
    3.1.2 软件模块设计原则 16
    3.1.3 软件的模块化 17
    3.2 系统任务概述 17
    3.2.1 系统的功能设计 17
    3.2.2 系统功能结构 18
    3.3 系统架构 18
    3.4 系统主要子模块设计 19
    3.4.1 用户登录子模块设计 19
    3.4.2 商品入库子模块设计 19
    3.4.3 商品出库子模块设计 19
    3.4.4 用户注册子模块设计 19
    4. 数据库设计 21
    4.1 数据库概念 21
    4.2 数据库分析 22
    4.2.1 数据库的完整性分析 22
    4.2.2 数据库的安全性分析 22
    4.3 数据库的设计 23
    4.3.1 概念结构设计 23
    4.3.2 逻辑结构设计 23
    4.4 数据库的连接 25
    4.4.1 连接工具 25
    4.4.2 工厂类配置文件主要内容 26
    4.4.3 Mapper类配置文件主要代码 26
    5. 软件详细设计 28
    5.1 登录模块 28
    5.2 入库模块 30
    5.3 出库模块 31
    5.4 用户注册模块 32
    5.5 个人信息管理模块 34
    6. 系统的测试 38
    6.1 测试简述 38
    6.1.1 测试目的及重要性 38
    6.1.2 测试原则 39
    6.2 测试方法 40
    6.2.1 黑盒测试 40
    6.2.2 白盒测试 40
    6.2.3 单元测试 40
    6.2.4 集成测试 41
    6.3系统模块的测试 41
    6.3.1 登陆模块测试: 41
    6.3.2 出库模块测试 41
    6.4.3 用户信息模块测试结果 44
    总 结 45
    致 谢 46
    参考文献 47
    附件1:外文文献(原文) 48
    附件2:外文文献(译文) 57

    1. 绪论
    现如今,计算机技术飞速发展,社会经济也在伴随着不断发展,各行各业也面临着各种各样的挑战与困难。为了能够在这个信息化的时代继续发展下去,就必须紧跟上时代的脚步。在这个计算机技术飞速发展的年代里,智能化的商品存储管理技术也在随着不断地发展。之前的那些古老的仓库管理化的方法已经难以满足现代化发展的需求,因为许多些原因,企业要想在这个现代化的社会中生存下去都必须有一个良好的仓库管理系统。仓库是每个企业都必须谨慎管理的地方,一个企业的最基本是货物,所以一个企业的货物必须得得到很好的保管,在这片竞争激烈的土地上面才能谋得一块生地。本课题正是根据这一理念,开发了一个功能比较完善,基本能满足企业要求的仓库管理系统。
    1.1 系统背景
    在这个科学技术不断发展的年代里,世界已经变的越来越高科技化越来越智能化,一个智能化的时代已经到来。到现在为止,在我们生活的周围你可以随处见到各种各样的智能化管理的系统[7]。
    一个企业所拥有的商品是他所生存发展的根本,而仓库是企业用来保存商品的所在。所以说,一个好的仓库对于企业来说占有举足轻重的地位。总而言之,一个成功的企业必定会有一个好的仓库,但是一个好的仓库没有一个合理的管理系统是不完美的[7]。可是一个静态化的简单的仓库管理的系统,因为他不具备信息共享的功能,而且还不能够保证货物的正常运转中所遇到的一些问题,还不能保证企业所拥有资源的正常的运转与利用;还有一些传统的仓库管理系统在维护时非常的困难开发起来也是十分复杂,所以在人力物力上有极大的浪费,已经远远的脱离了时代的轨道。因此,一个成功的企业,如果拥有了一个现代化的仓库管理的系统,会大大的提高企业生产的效率,降低使用的成本。
    1.2 开发目的
    仓库是所有企业都不可缺少的部分,对于一个成功的企业来说,想要在未来的市场中获得发展得优势,拥有一个完善的仓库管理系统是十分重要的。可是企业中的商品总是在不断地流动的,仓库中的商品也随之不断变化。所以,商品就需要不停的被记录保存。在使用传统的人工记录时存在着各种各样的问题,查询的效率低下,而且保密性不高。因此,对于一个想要不断发展的企业来说,这种人工记录的方式必须淘汰。
    在现代化科技的不断发展前景之下,智能化的东西已经遍布各地,电脑更是遍布在各个角落。计算机技术的应用对库存信息进行管理与人工管理技术相比较拥有无可比拟的优势,如:添加删除快捷、安全性高、查询便捷等。
    在以上这些社会与技术的背景之下,我决定开始开发了这个系统。在开发的这个系统能够保证对货物进行正确的出库与入库擦偶哦、库存控制和发货。而且,这个系统比较小维护起来简单,能够节省一定的人力物力,对企业中仓库的管理是百利的。
    1.3 开发工具
    1.3.1 Eclipse
    Eclipse 开发工具是一款源代码完全开放的、主要用于可扩展性开发Java语言的一种开发工具。对Eclipse本身来说,他仅仅只是一种服务和框架,主要是通过一些插件与组件来组成开发的环境。主要的优势有Eclipse自身带有一种标准化的组件集合,含有Java的主要开发工具JDK。Eclipse具有十分丰富的开发环境,主要包括有超强的编码能力、拥有玩备的调试功能、发布能力与测试功能等,全部支持了Hibernet、Struts、Mybatis、JSP、Spring、SQLPlus等等的一系列的框架。
    1.3.2 Oracle
    oracle是一家公司的名字(甲骨文公司),世界上屈指可数的,是国际上非常大的巨型IT公司,是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989年正式进入中国市场。2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大软件公司最有名的产品是DB,database,RDBMS,关系型数据库系统。
    1998年9月,ORACLE公司正式发布ORACLE 8i。“i”代表Internet,这一版本中添加了大量为支持Internet而设计的特性。这一款版本为数据库的用户提供了更加全面的全方位的Java技术支持。ORACLE 8i成为第一个完全整合了本地Java运行时环境的数据库。
    然后有9i,10g。在这个版本更新的最佳看点是一起加入了网格,然后是11g,现在发展到12c,c代表cloud,也是现在炒的非常火的概念。
    1.3.3 PowerDesigner
    在数据库的设计过程中,运用Power Designer作为数据库模型的主要的建模工具。在庞大的赛贝斯公司旗下的主要的CASE开发工具集之一就是PowerDesinger,运用这个工具的最大看点是更加快捷并且方便的对仓库管理系统进行开发,数据库开发所需要的模型与需要的经历基本全部都能实现。例如数据流程图、概念数据模型、物理数据模型等一系列的模型都可以通过使用PowerDesigner来实现,可以生产出各种各样的PC端开发出来的应用软件,也可以给系统的设计制作出系统的结构模型,也能够为一些开发团队的系统模型进行调控。Power Designer还可以跟各种现如今使用比较多的用来设计数据库的软件,比如:Power Builder,StartUML,VB等相互配合来使用,以便于用来减少开发的时间与优化系统的设计。

    1.4 相关技术介绍
    1.4.1 JSP技术
    JSP技术使用起来是非常灵活的,可以用来便携JAVA程序的。本技术还可以用来对一些编程的动态的网页来进行封装。网页还可以访问一些在服务器端的各种资源的一些逻辑应用。JSP技术还可以将一些网页的逻辑与网页的设计和还有显示进行分离,对于一些可重用的基础的组件的开发进行支撑,更加容易的对基于Web的应用程序进行设计。
    在现今,计算机技术在不断发展,Web 技术也随之不断的发展,产生了许多方法来解决动态页面的生成问题,目前用于声称动态网页的技术有CGI、ASP、PHP及JSP。JSP技术可以为做动态网页的创建提供一个更加方便快捷的方法。JSP 是Java Server Page 的缩写,是Sun 公司于1999年6月推出的新技术,该技术由Sun 公司主导,采取了了一些在电脑的软件与硬件、数据库、还有通信等领域的多个家厂家的建议与意见而一起制定出来的一种在Java与Web基础上的一种动态的网页技术。
    JSP技术与之前传统的网页制作技术相比较,它有着明显的优点。JSP 不像CGI、ISAPIH 和NSAPI 那样难于编写和维护,不像PHP 那样只能适应中小流量的网站,也不像ASP 那样受到跨平台的限制,JSP 体现了当今最先进的网站开发思想。
    在服务器端接收到客户端发送出来的请求时,开始运行的程序段,接下来将JSP文件中的代码还有代码在运行之后效果同时回馈给用户。通过Java文件的插入能够对数据库、网页的一系列多重的定向等运行,从而满足构建动态网页所需要的程序。JSP是Servle的一种动态表现,而且都可以通过服务器端来运行。由于能够将一个HTML文本返回给用户端,所以用户端具备浏览器就可以进行浏览。HTML程序与穿插在其内部的Java程序可以共同构建动态的JSP网页。在服务器被用户的客户端访问的时侯,能够同时处理相应的Java代码,然后将产生的HTML页面再返回给用户端的浏览器。JSP的设计关键是Servlet,通常大型的Web应用程序的设计成果也通过Java Servlet与JSP相结合来实现的。JSP既拥有了方便快捷的Java程序,又统统的面向用户,既实现了平台的无关性危险还比较小,可以具备互联网的全部优势。JSP技术的优点:
    (1)能够一次性完成编写,到处运行。不包括系统在内,代码基本不需要在写。
    (2)系统的多平台支持。通常情况下,能够在所有情况下的全部平台上进行设计,能够安排在任一情况中,也能够在所有的情况下进行发展。相比ASP/.net来说,优点是十分明显的。
    (3)强大的可塑性。通过一个不大的Jar程序能够对Servlet/JSP进行运行,也能够通过很多服务器进行集群和负载平衡,甚至能够通过多台Application解决问题。单个的服务器到多个的服务器,Java展示了一个强大的功能。
    (4)Java已经有了很多的设计方法,何况大部分工具都是没有花费的,这中间有很多都在多种平台之下顺畅的进展。
    (5)支持服务器端组件。只有很有力的服务器端组件才能支撑web运行,因此开发者可以在调用web页面时通过另外的开发工具来达成纷乱效用的组件,来加强系统的可操作性。JSP可以通过完善的JAVA BEANS 组件来达成纷乱的商务功能。
    在JSP的内部对象中会表现出来:客户端发送请求使用request,这个请求会涵盖到来自于GET/POST参数的请求; 服务器端传回客户端的回馈使用response;管理pageContext 网页的属性;session 与请求相关的会话;application servlet正在进行的内容;输送响应的输出流使用out;config代码片段配置对象;page JSP网页本身。
    JSP 与ASP(Active Server Page) 的区别
    从上面的基本介绍中,乍一看觉得JSP 与微软的ASP 十分相似,但事实上,两者有着本质的不同,我们主要从以下几个方面对其进行比较:
    1、Web 服务器的支持
    大部分的支持WEB的服务器段例如:Apache、IE、Netscape 和Microsoft IIS 等一系列服务器都可以运行JSP 。ASP的却很难再除了微软之外的平台上继续的运行与移植。
    2、平台的支持
    平台具有一定的独立性,所有的能够支持java程序的平台,都可以支持JSP的运行。Windows 平台可以很好的支持ASP, 但ASP 难于移植到其它平台上。
    3、组件模型
    JSP 所在的平台是建立在跨平台的、这上面的所有的组件都是可是重新利用的。而ASP 使用的平台却是建立在Win32的COM 组件模型之上的,所使用的组件没有JSP的灵活。
    4、脚本语言
    JSP是比较万能的能够灵活的使用JAVA语言或着与其他的脚本语言如javascript相互配合使用。可是ASP使用起来比较局限,只能使用Jscript 或者是VBScript两种语言来作为脚本语言,不够灵活。
    5、安全性
    JSP的安全模式是使用Java 的安全模型,但是ASP的安全模式使用的是Windows NT的安全模式两者各不相同。
    6、与Access数据库的连接
    Access 数据库在与JSP 相连接的时候使用的连接方式是JDBC连接,而Access 数据库与ASP相连接的时候使用的是Data Active Objects。
    7、用户定制的标签
    JSP有一个很好的功能是用户可以自己定义一个属于自己的标签库,并且可以灵活运用。然而ASP 中用户却不能自己定制标签库,原因是在 ASP 中用户是不可以对标签库进行扩充的。
    8、JSP 与Servlet 的区别
    从某种意义上讲,JSP 并不是一种新技术,因为JSP 可以完成的工作,都可以通过编写Servlet 程序来实现。而且,JSP 页面中动态的、交互的部分最终也都是需要再编译为相对应的Servlet程序来实现。所以,可以说,JSP其实是Servlet 的一种抽象,它提供了更加方便有效的方式来编写Servlet。
    9、JSP 与CGI 的区别
    JSP 与CGI 两者之间有一个很明显的最大的差异点,JSP在编写时与编译HTML时是很相似的两者的差异不大,在语法上有些不同只要了解JSP的语法即可,不需要对JAVA、JScripety等语言有过多的了解。而编写CGI 程序要求对脚本语言十分熟悉,因为CGI 程序基本上是用脚本语言直接写的。除此之外,在使用CGI 程序的时侯,对每一次的访问他都会进行处理,可是这样的结果会造成在多个用户的请求被处理时,会造成力不从心的局面,不会得到满意的结果。可是JSP在编译时只能编译一次,在此之后会驻留在内存中,再次调用时,不必重新处理,适于应付多用户情况。
    1.4.2 JavaScript技术
    JavaScript语言是脚本语言中直译式的一种,属于动态类型、弱种类型、原型为基础的语言,支持类型的语言。JavaScript引擎是他的解释器语言,属于浏览器中的内容,常常用在客户端的一种脚本的语言,早期常常在HTML所编译的网站上面运用,主要的功能是在HTML的基础之上增加一些动态的功能。 在1995年时,由Netscape公司的Brendan Eich,在一个叫做网景导航者的浏览器上第一次实现而成。由于Netscape的合作者是SUN,所以在Netscape的管理层们希望把他的外观做起来像JAVA,出于种种的原因给他取名叫做JavaScript。可是在实际上多了解了解它的语法风格会发现是与Self及Scheme比较接近的。为了取得技术优势,微软推出了JScript,CEnvi推出ScriptEase,与JavaScript同样可在浏览器上运行。
    为了能够将规格得到统一,因为JavaScript兼容于ECMA标准,因此,也称为ECMAScript。
    JS技术特征:1、脚本语言2、解释性语言3、弱类型语言4、事件驱动5、动态性6、安全性7、跨平台性(兼容性)。
    1.4.3 Tomcat
    Tomcat 从一定的意义上面来说他并不只是一个APP Server, 它仅仅只是一个可以支持并且运行Serlvet/JSP 的Web 的容器,而且他还具有一些传统的Web 服务器所具有的一系列的功能。可是他跟Apache 相对比,Tomcat处理静态的HTML 的能力就比不上Apache。 因此,我们可以把Tomcat与Apache 集成到一块,然后运用Apache 处理静态HTML, 最后在利用Tomcat 处理JSP 还有Servlet。这几种技术之间相互配合。这种集成只需将Apache 和Tomcat 的配置文件作出修改就可以了。
    Tomcat 也扩展了一些App Server 的功能,如JNDI, 数据库连接池,用户事务处理等等。Tomcat 被非常广泛的应用在中小规模的Java Web 应用中。在Tomcat5中,在Servlet2.3 中拥有一些事件监听器的功能我们可以利用这些功能来对事应用或者Session 等进行一些列的实行监听。Tomcat 还有好多其他的一些特征,如与SSL 集成到一块,实现安全传输。很多中小应用不需要采用EJB 等技术,JSP 和Servlet 已经足够,这时如果用应用服务器就有些浪费了,我们自然会选择Tomcat。
    JSP 和Servlet的开发主要是在Tomcat的基上来进行开发的,JSP 与Servlet的开发并没有想象中的麻烦,一般的一些文本编辑器或着IDE都是可以开发的, 最后,把这些东西压缩为成WAR格式的就可以了。另外,也可以利用标签库实现Java 代码与HTML 文件的分离,使JSP 的维护更方便。
    Tomcat 也可以与其它一些软件一起来实现更多的功能,如与JBoss 集起来开发EJB, 与Cocoon 集成起来开发基于XML 的应用,与OpenJMS 集成起来开发JMS 应用,除了这几种,可以与Tomcat 集成的软件还有很多。
    1.4.4 软硬件需求
    硬件需求:
    CPU:Pentium以上计算机
    内存: 512M以上
    软件需求:
    操作系统版本:Windows XP /vista/Win7
    开发工具:MyEclipse 6.0.1
    后台服务器:Apache Tomcat 6.0
    开发语言:Java
    浏览器:F6.0

    1.5 可行性研究分析
    可行性分析能够让系统用最低的开发成本来获得最高的经济效益。可行性分析目的是根据所开发系统的用户需求,明确研究方向,明确目标[1] 。通过一些社会上的调查以及一些系统的框架设计功能模块的分析,找到可行的方法。对要设计实现的仓库管理系统从技术上、经济上、操作上、法律上进行可行性研究调查,这样既能够保证信息资源的合理利用,也能够避免在设计程序过程中因失误而导致的系统错漏问题,协助我们对设计做出更加合理和可惜的抉择[6]。
    对所有系统完成设计,都可能受到时间以及空间上的制衡。因此,在开始设计每一个项目的时候,我们必须对系统进行可行性需求分析,只有这样才能够降低项目所带来的危害,减少人力、物力以及财力方面的损耗。在这里简单了解一下对技术、经济、系统和发展方面的可行性分析。
    可行性研究这一部分的主要目的是探讨问题是在定义阶段所确定的问题有没有可行的解,可行性研究是必须的。在这个主要的阶段是从经济可行性、技术可行性、操作可行性和法律可行性等几个可行性来讨论项目是否能够解决及是否值得去解决。通过可行性研究可以减少一些不必要的损失。

    1.5.1 系统目标可行性分析
    本系统可以用最小的时间、经费充分帮助仓库管理人员进行仓库货品的数量进行管理,可以对商品的类型、出入库时的数目、还有时间方面进行查询。也可以对客户使用货物查看货物,货物与供应商之间进行辅助。
    1.5.2 系统的经济可行性
    仓库管理系统是基于JSP技术来开发,采用的软件都是开源的,这样能够削减很多的精力和资源,降低开发成本,同时也能够提升设计的作用,所以系统在开发人力、财力要求不高,具有经济可行性。
    1.5.3 系统的技术可行性
    在本系统的开发包含有前端的程序开发与后台的数据库的连接与数据库的维护。对于应用程序的开发则是要使用起来比较简单上手而且要兼具各方面的功能,而对于数据库的建立和维护必须要求有一套完整的数据库、数据必须要安全稳定。本系统开发的重点就是对数据库的设计和操作。在大学对软件工程,软件测试,UML统一建模语言等课程进行过系统的了解,也能够对这些课程进行开发,能让我们能够进一步辨别、开发与检验系统。所以,本仓库管理系统系统的开发在技术方面必定是高效的。
    仓库管理系统是一个数据库的管理查询系统,要求运行环境、硬件、软件不高,操作简单,完全可以运用我们的技术实现系统的功能。
    1.5.4 系统的法律可行性
    本系统完全是自己设计的管理系统,对于本人来说具有重大的实际意义。开发环境软件和使用的数据库都是开源代码,因此对这个系统进行开发与普通的系统软件设计存在很大不同,没有侵权等问题,在法律上完全具有可行性。
    综上所述,设计一个仓库管理系统具有效率高,操作简便,降低成本等优点,是必要可行的。

                     2.  软件需求分析
    软件需求分析是开发的第一个阶段,也是软件开发周期中的一个非常重要的阶段,根本任务是确定用户对软件系统的需求。它是项目开发的基础,它确定软件系统做什么,具有什么功能性能,有什么约束条件等。在软件的需求分析阶段所得到的结果在后期的软件开发的过程中是十分重要的,经过严格评审并得到用户确认是必须经过的。
    

    2.1 需求分析
    需求分析是系统开发的首要步骤,直接影响系统整体性能和功能的最主要的步骤。系统的需求分析最重要的是对系统的可行性、性能和功能等方面进行具体地分析。不合理的需求分析,会使系统的开发环节出现许多错误和走许多弯路,导致系统开发时间长,效率低,系统质量受到影响[8]。
    2.1.1 用例图
    仓库管理系统分为系统管理员和客户等不同种类的用户角色。在本系统的整个的用例功能模块包括管理员管理、用户管理等模块,管理员模块的主要功能包括查看库存信息,修改信息,用户管理,产品入库,产品出库等功能,如图2-1所示为仓库管理员用例图。

    图2-1 管理员用例图

    用户模块的功能主要包括有库存信息的查找,用户信息的修改,用户管理等功能,如图2-2所示为客户用例图。

    图2-2 客户用例图
    2.1.2 类图
    仓库管理系统中有管理员、客户、还有货物三大类。如图2-3所示为仓库管理系统的三大类之间的类图关系。

    图2-3 系统类图
    2.2 功能需求分析
    1、登录验证功能:为了保证仓库管理系统信息的安全性,进入系统时需要对用户身份进行验证,如果验证无误可成功进入系统,如果用户名或者密码不正确将返回错误提示要求重新输入。
    2、管理员管理功能:此功能属于系统的管理员功能,他实现了对所有用户的管理操作,可以添加一个新的用户,也可以对已经添加的业务员进行删除的操作。
    3、用户的查询功能模块:此项功能属客户管理员功能,用户可以根据条件查询客户信息,也可以对客户信息进行修改。
    4、仓库存储的查询管理功能:此功能属系统管理员与客户共有的功能,客户可以实现查看、入库以及出库等功能,两者都可以查看库存信息。
    5、用户的信息管理模块:此项功能属于用户管理员的功能,业务员可以对自己的客户信息进行管理与修改。
    2.3 业务流程分析
    仓库管理系统主要分为两大用户功能,两种功能所实现的功能流程如下所示。
    2.3.1 管理员模块业务流程
    仓库的管理员可以通过帐号和密码验证之后进行登录,登录到系统之后主要的功能是对商品与用户的信息进行管理,主要流程如图 2-4 所示。

    图2-4 管理员程序流程图
    2.3.2 客户模块业务流程分析
    管理员可以通过帐号和密码进行登录,登录后的主要功能是对用户与品信息的管理,主要的功能包括查看用户信息、修改用户信息、对库存商品进行查看等。主要业务流程图如图 2-5 所示。

    图2-5 客户程序流程图
    2.4 数据流程分析
    基于对业务流程的分析,对数据流分析。
    2.4.1 顶层数据流
    现行的顶层数据流图如图2-6所示。

    图2-6 顶层数据流图

    2.4.2 一层数据流图
    具体分析第一层数据流图,包括有商品的管理、用户信息的管理。商品管理,主要包括用户对产品的入库操作、查询操作、出库操作等一系列的处理以及管理员对产品的管理。用户管理,管理员能对用户的信息来操作。详细流程图如图2-7所示。

    图2-7 一层数据流程图

    2.4.3 二层数据流图
    具体分析第二层数据流图,包括的功能信息有用户注册、用户登录,产品入库,产品查询,产品出库等功能。
    用户注册模块数据流图如图2-8所示:

    图2-8 用户注册功能的数据流图

    用户登录功能的数据流图如图2-9所示:

    图2-9 用户登录功能模块的数据流图

    商品入库功能模块的数据流图如图2-10所示:

    图2-10 商品入库模块
    如图2-11所示为商品查询功能模块的数据流图:

    图2-11  商品查询模块
    

    如图2-12所示为商品出库模块的数据流图:

                       图2-12  商品入库模块
    

    2.5 数据字典分析
    2.5.1 数据存储条目
    文件名:用户信息表
    组成:本次刚刚注册用户 + 之前注册过的用户
    组织方式:索引类型的文件,以用户名为索引
    文件名:商品库存表
    组成:本次新入库商品+以前入库商品
    组织方式:索引文件,以商品编号为索引
    2.5.2 加工条目

    加工名:商品存储处理
    编号:无
    输入:商品信息
    输出:库存信息表

    加工名:商品入库处理
    编号:无
    输入:商品信息
    输出:库存信息表

    加工名:商品出库
    编号:无
    输入:商品信息
    输出:库存信息表

    加工名:用户信息存储
    编号:无
    输入:用户信息
    输出:用户信息表

    加工名:用户查询处理
    编号:无
    输入:用户名
    输出:用户信息表

    加工名:用户信息验证
    编号:1.1
    输入:用户信息
    输出:用户信息表

    加工名:验证用户是否存在
    编号:1.2
    输入:用户名
    输出:用户信息表

    加工名:录入用户信息
    编号:1.3
    输入:用户信息
    输出:用户信息表

    加工名:登陆系统时的信息验证
    编号:2.1
    输入:用户名、密码
    输出:用户信息表

    加工名:个人信息查询
    编号:2.2
    输入:用户名
    输出:用户信息表

    加工名:审查商品信息
    编号:3.1
    输入:商品名称
    输出:商品信息表

    加工名:验证是否为新商品
    编号:3.2
    输入:商品名称
    输出:库存信息表

    加工名:录入商品
    编号:3.3
    输入:商品信息
    输出:库存信息表

    加工名:查询商品
    编号:4.2
    输入:商品名称
    输出:库存信息表

    1. 软件总体设计
      软件系统的设计是在整个系统在实现软件开发过程中的十分重要的一个环节。本章将主要介绍一下仓库管理系统的总体结构与系统的架构[2]。总体设计的结构实际上介绍了各个模快相互产生的关系,数据库的设计主要说明了表的建立与数据之间的关系。
      系统怎样实现是在总体设计阶段的阶段的基本目标。所以总体设计又被叫做为概要设计。在经历过这个阶段的工作,开发人员又将可以组成系统的物理元素,例如有文件、程序、还有数据库等。但是这些物理元素还处于黑盒子的形式。总体设计的另一项任务是设计软件的总体结构,即为了找出系统中的每一样程序都是由那些模块组成的,每个模块的功能及模块和模块之间的接口、调用关系等,但所有这些都不要求设计模块的内部过程的细节。
      容易看出,软件设计的结构是基于模块之上的,根据分析阶段得到的数据流图来设计软件结构。数据流图是设想各种可能方案的基础。首先,分析员从提供的方案中选出若干个设计方案,然后对这些方案进行筛选,从而选出一个合理方案。对于复杂的大型系统要进行功能分解,为确定软件结构,把一些设十分复杂的处理功能适当地分解成一系列比较简单复杂的功能,然后在进行软件结构设计。最后制定测试计划,书写文档并复审。
      3.1 软件结构设计原则
      软件总体设计的任务是软件的结构体系设计与软件的模块化设计。为了提高软件设计质量,人们在长期的计算机软件开发过程中积累了丰富经验,对这些经验做出总结会进一步得出一下软件设计准则。
      3.1.1 软件的结构体系
      软件的体系结构是在整个软件系统中最基层的。设计准则如下:
      1.体系结构是一种抽象的结构。
      2.软件的体系结构能够保持一定时间的稳定。
      3.良好的体系结构意味着普通、高校和稳定。
      3.1.2 软件模块设计原则
      在软件开发过程中,软件的模块化式设计关键,软件模块化设计需要遵循的总则如下:
      1.模块的耦合性降低,模块的内聚性要提高。
      2.模块的作用范围需要能够控制。
      3.模块接口设计要简单,以便降低复杂程度和冗余度。
      4.设计功能可预测并能得到验证的模块。
      5.适当划分模块规模,已保持其独立性。
      3.1.3 软件的模块化
      模块是软件结构的基础,是软件元素,是能够单独命名、独立完成一定功能的程序语句的集合,如高级语言中的过程、函数、子程序等。广义的将,在面向对象的方法学中其中的对象也属于模块,模块是构成程序的基本构件,在程序设计中有很重要的地位。
      模块化是使得软件能够对付复杂问题所具备的属性。使用模块化是为了使软件的复杂性能够降低,能简单的操作软件的设计、维护、还有测试。模块化技术的运用还可以防 止错误蔓延,从而可以提高系统的可靠性。关于模块可以降低软件复杂性的事实。
      3.2 系统任务概述
      一个成功的网站应明确为什么要建立这个网站,确定网站所拥有的功能,明确网站所有的规模、投资花费的费用等[8],了解这些都需去市场进行调查。只有经过详细的策划,才能够免去在网站的建设中出现的很多问题网站的建设才会顺利[4]。同时,一个大型的计算机网站系统,需要有一个十分明确的思想做指导,并且通过一系列合理的结构设计,就能够充分发挥出仓库管理系统的巨大优势。
      在仓库管理系统系统的实现时首先我们要考虑下面几点:
      安全性。现在社会是一个信息的社会,信息就是宝贵的财富,保证信息的安全,特别是个人信息更加的需要安全性。
      先进性。结合当前流行趋势,开发要符合用户的需求,适合用户进行网上预约挂号的系统。本系统采用的这些技术完全基于微软平台进行开发,从来有效的降低了系统的运营成本,大大提高了该医院预约挂号系统的稳定性和易维护性。
      可扩展性。本系统给用户带来了极大的便利,提高了网站的管理效率,因此在开发系统的功能过程中,我们要考虑到系统的可扩展性,便于将来系统的升级、更新。
      有效性。实际上这里所说的有效性包括了两个方面的意思,即有用性和可用性。其中有用性是指的是站点能满足用户需求的潜在功能,而可用性指的是能够通过站点来操作实现系统的体现功能。所以实现在仓库管理系统的功能时一定要尽最大的可能满足用户的需求。
      3.2.1 系统的功能设计
      仓库管理系统主要分为两个个用户角色,主要是管理员角色与用户角色,其功能如下:
      1.管理员
      管理员可以通过帐号和密码进行登录,登录到系统后主要功能是对库存信息的管理,主要包括个人信息管理、商品进行入库、出库、查询操作、客户的信息进行查看修改、退出系统等功能。
      2.用户
      用户可以注册登录成为会员,其中的系统功能包括系统首页,查询库存,注册登录,我的信息,退出系统等一些功能。
      3.2.2 系统功能结构
      根据上述分析,得出的功能结构图有,如图3-1所示。

    图 3-1 系统总体结构图
    3.3 系统架构
    B/S系统对客户机的工作量做了极大的简化,对数据库的访问以及应用程序的执行都将由服务器来完成。B/S架构主要使用WWW浏览器技术,根据各种基于浏览器的脚本语言。在B/S架构基础上软件结构的安装、修改与维修的需要在服务器端解决。使用该系统时,只需要一个浏览器用户可以运行所有的模块,从而实现了“零客户端”功能,很容易在运行时自动升级。B/S架构也有一个均质机,网上异构网络,异构应用服务的联机[10]。
    B/S系统由以下三层构成,三层是相对独立又相互关联,在这里我们在三个层面上做一个介绍:
    1.表示逻辑层提出一个服务请求到网络上的Web服务器,并且开始验证身份,主页信息被HTTP给传送给客户端,主页文件会被客户机收到,并将主页文件信息显示在Web浏览器上。
    2.用户的数据请求会被控制逻辑层接受到,数据库与程序相互连接,并进行数据处理请求的数据库服务器,然后Web服务器开始接受数据库服务器的数据处理的结果,最后再返回给客户端。
    3.数据表示层接受Web服务器请求的数据库操作,以实现对数据库操作的一系列的功能, Web服务器来接收操作结果。
    3.4 系统主要子模块设计
    在对系统的功能设计进行分析,在对系统的小模块在进行划分,即系统的模块化。建立系统的整体的结构了解模块之间的关系如何。系统的功能需求分析和企业仓库管理的有各自不同的特点。
    3.4.1 用户登录子模块设计
    系统中用户登录验证相对比较简单,可以将其流程概括如下:
    在用户登录时,系统要求在用户名的输入框与密码的输入框输入相应的信息,然后再由系统将其传送至相应的服务器端。服务器端处理程序时,服务器会根据提交的内容将用户名中的内容以及密码框的内容进行分离,再与数据库中的数据进行比对判断。如果输入的内容能够相互匹配会进入到登录首页;若不能正常匹配则系统会跳转到报错界面。
    3.4.2 商品入库子模块设计
    首先,入库申请人需要向仓库管理员提交一份入库申请单和相应的货物,仓库管理员会根据所提交的清单进行对比。如果发现货物与入库申请单中的数据有所差异,那么则拒绝货物入库操作;如果发现库存中有该商品存在,还需考虑入库货物的数量加上现有的库存量是不是超过了该仓库的最大库存量,若超过则暂时禁止入库。没有超过的话,仓库的管理员进行入库操作。如果该库存中没有该商品存在,则需要重新添加该商品,计算该商品可在库存中所能存放的最大库存量,重新考虑入库货物的数量加上现有的库存量是不是超过了该仓库的最大库存量,若超过则暂时禁止入库。货物存入仓库之后,该仓库管理员需要给入库申请人开具一份货物入库单,入库单中的内容必须严谨。至此该系统的入库流程全部完成。
    3.4.3 商品出库子模块设计
    在进行出库操作时,首先,出库申请人需要向仓库管理员提交一份申请单。若申请单不真实,则取消出库操作,不再继续进行出库。对真实有效的出库单,仓库管理员再对照其要求出库的货物名称查询该货物的信息和库存量。如果此货物的库存量达未到所需要数量则取消出库操作。如果此货物的库存量达到所需要数量,可以执行出库操作并且记录。随后仓库管理员给该申请人开出库单据,仓库管理系统出库流程全部完成。
    3.4.4 用户注册子模块设计
    系统中用户登录验证相对比较简单,可以将其流程概括如下:
    在用户注册时,需要在注册的页面各框中输入用户名、密码、姓名、性别、年龄、联系方式、email、联系地址等一系列信息,系统将其提交至服务器端。服务器端处理程序时,服务器根据提交的内容将用户名与其他信息进行分离判断。如果没有找到所注册的用户名,系统会进一步进行注册;当在注册的过程中有空的情况下系统会有相应的提示。在进行email注册时,在注册的栏中输入的不正确时,系统会提示出错误。当输入的内容符合要求时会继续注册。还可以选择清空,从头开始在注册一遍内容。

    1. 数据库设计
      数据库的设计在开发的过程中占有一个十分关键的作用,在这里强调数据库重要性的作用,原因是数据库是软件开发过程的根基,前期的建设不牢固,会使得后期的建设出现大批量的问题,在后期的处理过程中会非常的困难。
      通常概念设计的主要目标是设计并反映出某一个组织部门的信息需求中的要求,数据库系统通常是独立的并主要存在于:数据库系统的逻辑结构、DBMS即数据库管理系统、计算机系统等模式。
      概念模式的设计方法是在需求分析的基础上,通常使用E-R模型来表示数据以和数据之间的联系,开发出能够解决用户信息要求和处理要求的数据库的模式。数据库概念设计的主要目标是能够准确的描述应用领域的信息模式,并且支持用户的不同应用,并方便转换为数据库系统逻辑模式以及方便用户理解。该模型是不能够直接的用于数据库系统的实现的,因为它主要是面向现实世界的数据模型。在此阶段,用户可以参与和评价数据库系统的设计,从而有利于保证数据库系统的设计能够满足用户的需求。
      4.1 数据库概念
      数据库技术从年代中期至今只有不到年的历史,但其发展速度之快是其它技术所不及的。数据库的发展已经从刚开始的网状型数据库发展到后来的的关系型数据库现如今已经变为以面向对象为主要模型的数据库。数据库技术现如今已经与网络的通信技术、现如今流行的人工智能技术以及面向对象的编程思想等技术之间互有融合,并且使得其得到了广泛的发展与应用。
      数据库的原理管理方式根据的是数据结构的方式进行的管理还有存储数据的数据仓库,在本次系统中的作用主要是用来查询仓库管理系统的系统设计与实现数据的存储。使用数据库可以带来许多好处:使得数据的冗余度得到了减少,而且在一定的程度上使得数据的存储的空间得到了充分的利用,让数据资源能够最大程度的得到共享等等。尤其在最近的一些年中计算机的关系数据库的不断地发展,使得编程方面更大限度的得到便利,在处理数据的过程中更加方便快捷,操作更容易上手。
      数据库设计的目的是指在特定的环境下能够在建立好的应用模式与好的应用环境之下使得用户的各种需求得到满足。
      数据库在一个完整的网站中是必不可少的,原因是在网页被访问的过程中都会有数据保存下来,网站会是这些数据保存在一个文件中。可是在实际的网站建设当中,这些文件所能保存的数据往往是不够的,无法满足各种数据的需求[5]。因此一个完美的网站的建设必须拥有一个完美的数据库。我们现在可以使用的数据库有很多种,如数据库、数据库等等,在本次设计中,选择了ORACLE数据库作为后台数据库工具。自从ORACLE数据库推出一来,得到了快速的发展,很快便在应用市场中占有了十分重要的地位。在时代的不断发展过程中,ORACLE数据库已经在发展的过程中占据了牢固的地位,在下如今工作的前景之下,以数据库为背景的应用发展,为用户的应用提供了款完善的数据管理和数据分析解决方案。数据库是一种具有属于自己的结构与管理的方式数据的仓库。数据库简单来说是是属于一种文件柜电子化的一种存储工具(主要用于电子文件的存储),用户可以对其中的文件进行一定的操作。它能够把以一种属于自己的方式进行存储、而且能够使得多个用户之间的数据相互的分享、还能使得用户数据的冗余度能够最大程度的减少、在应用程序之间的各种数据能够分离。
      4.2 数据库分析
      数据的模型属于在数据库当中中用来存储数据的一种方式,是数据库系统的基础。
      数据模型经历了:
      1、层次模型:是数据库系统中最早使用的一种模型,它的数据的结构是一棵“有向树”
      2、网状模型:网状模型以网状结构表示实体之间的联系。网中的每一个结点代表一个记录类型,联系用链接指针来实现。网状模型可以表示许多不同的联系,还能表示不同的数据之间的交流,即数据间的横向关系与纵向关系,属于扩展之后的层次模型。网状模型可以方便地表示各种类型的联系,但结构复杂,实现的算法难以规范化
      3、关系型:在关系模型中基本数据结构就是二维表,不用像层次或网状那样的链接指针。
      4.2.1 数据库的完整性分析
      数据的正确性与数据之间的相容性即为数据哭库的完整性。用来管理数据库的系统,需要用一定的机制来检查现存的数据库中的数据是否满足规定的条件,数据的约束条件是基于仓库管理系统设计与实现语义的体现,会作为模式的一部分存入数据库之中。本系统中定义了表与表之间的联系有助于实现完整性规则,一般在程序中实现具体的完整性控制。数据库的完整性约束能够在一定的程度上防止终端的用户输入一些错误的数据,以此来保证所有的数据库中的数据都是合法的、完整的。
      在设计数据库表时采用数据库完整性约束,它是数据库完整性的一种机制,他会在之前用来定制一些规则,用来约束数据库,而这些数据规则存放于数据库中,具体来说,这种约束有以下几种非空约束缺省值约束唯一性约束主键约束外部键约束规则约束。由于这种约束是加在数据库的表的定义上的,因此,不需要有大的代价便可以取得一些高的性能。
      4.2.2 数据库的安全性分析
      能够保证数据的网整性、合法性还有安全性是数据库重要的安全性能的指标。数据能够在数据库中大量的存放并且能够实现数据之间的共享,这都属于数据库的宝贵的资源。
      数据库的安全和服务器的安全是仓库管理系统安全的重要性能。采用管理员表示和鉴定的方法实现数据库的安全,此安全管理措施并不在前台开发工具中实现,而是在后台数据库中实现。在登录数据库时,系统让管理员户表示自己的身份,不同的管理员权限不同,系统进行核实,分辨出此管理员是否能够与系统匹配,若是,系统进一步核实用户,通常要求重新输入,系统和用户重新输入的信息用来鉴别用户的身份。服务器的安全也是通过判断用户在登录服务器时输入信息是否与数据库中的信息相匹配来验证的[3]。这种方法比较容易实现,实现起来也比较方便。没有采用更加复杂的系统安全管理措施是因为本管理系统一般是应用在校园网中,采用安全管理措施主要是为了防止没有修改权限的用户无意间修改了数据,因此采用用户标识和鉴定的安全管理措施就能够保障数据库的安全性。
      4.3 数据库的设计
      4.3.1 概念结构设计
      在次结构的设计过程当中,E-R模型法是最常见的设计方法。
      在次结构设计当中中,有以下几种方法方法:
      自下往上、从上往下、逐步扩张、相互结合,以这种方式为模型然后烦别实现各个结构的模型。
      在物理结构设计阶段首先分两步走:
      确定数据库的物理结构,是用来说明数据在数据库中怎么样存储的。
      选取正确的关系模式存取方法有好多种方法进行选择。
      概念设计通常是从系统的需求出发,常常将对象使用数据流的形式表达成为完整的抽象实体。而与模块内部的细节无关。E-R图为主要的工具,如下图4-1。

    图4-1 系统E-R图
    4.3.2 逻辑结构设计
    (1) 管理员信息关系模式,里面的主键是管理员ID。
    管理员(管理员ID、用户名、email、密码、联系方式、姓名、联系地址、性别)
    (2) 客户信息关系模式,里面的关系主键是客户ID。
    客户(客户ID、用户名、email、密码、联系方式、姓名、联系地址、性别)
    (3) 商品信息关系模式,里面的关系主键是商品编号。。
    商品(商品编号、商品价格、商品名、类别、生产产地、商品数量)

    表3-1 管理员信息表
    列名 数据类型 可否为空 说明
    id number NOT NULL 管理员编号
    account varchar NOT NULL 帐号
    Password varchar NOT NULL 密码
    name varchar NOT NULL 姓名
    sex varchar NOT NULL 性别
    age varchar NOT NULL 年龄
    phone varchar NOT NULL 联系方式
    email varchar NOT NULL E-mail
    address varchar NOT NULL 地址

    表3-2 客户信息表
    列名 数据类型 可否为空 说明
    id number NOT NULL 客户编号
    account varchar NOT NULL 帐号
    password varchar NOT NULL 密码
    name varchar NOT NULL 姓名
    sex varchar NOT NULL 性别
    age varchar NOT NULL 年龄
    phone varchar NOT NULL 联系方式
    email varchar NOT NULL E-mail
    address varchar NOT NULL 地址

    表3-3 商品信息表
    列名 数据类型 可否为空 说明
    id number NOT NULL 库存编号
    name Varchar NOT NULL 商品名称
    goodsid varchar NOT NULL 商品编号
    price varchar NOT NULL 商品价格
    sort varchar NOT NULL 商品分类
    num varchar NOT NULL 商品数量
    address varchar NOT NULL 生产厂商
    4.4 数据库的连接
    本系统与数据库的连接方式,包括对数据库中的信息进行添加、删除、修改,都使用的数据持久化层(persistence layer)的开源框架Mybatis,它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。以便仓库管理人员在计算机上运行本系统时,对数据库进行必要的操作.
    4.4.1 连接工具
    本系统采用mybatis数据持久化层的开源框架与数据库进行连接,包括对数据库中的信息进行添加、删除、修改. MyBatis简化与实现了在变成中的数据的持久化层(persistence layer),并且它抽象出了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。MyBatis的前身是iBATIS,iBATIS于2002年由ClintonBegin创建。MyBatis3是iBATIS的另一个版本,而且支持注解还有Mapper。
    MyBatis具有简单性和易使用性,所以,才会开始流行起来。在Java应用程序中,将从数据库查询到的数据生成所需要的Java对象;将Java对象中的数据通过SQL长期保存到数据库中,都是数据库的设计中所涉及到的。MyBatis通过抽象底层的JDBC代码,自动化SQL结果集产生Java对象、Java对象的数据持久化数据库中的过程使得对SQL的使用变得容易。
    使用Mybatis的具有一下几点的优势:

    1. 它消除了大量的不必要的重复代码。

    2. 学习和使用起来非常简单。

    3. 能与其他的一些数据库在一起共同使用。

    4. 它可以接受SQL语句。

    5. 具有与其他的一些框架一起使用的集成支持。

    6. 提供了与第三方缓存类库的集成支持。

    7. 引入了更好的性能
      4.4.2 工厂类配置文件主要内容



















      4.4.3 Mapper类配置文件主要代码


      select * from admin
      where account=#{account}


      select * from admin
      where id=#{id}



      select admin_seq.nextval from dual

      insert into admin values(#{id},#{account},#{password},#{name},#{sex},#{age},#{phone},#{email},#{address})


      update Admin set account=#{account},password=#{password}, name=#{name}, sex=#{sex}, age=#{age}, phone=#{phone}, address=#{address}, email=#{email}
      where account=#{account}

    8. 软件详细设计
      在软件的详细设计的这个阶段确定应该使用什么样的方式来实现整个系统使这个阶段的根本目的,通过这一阶段的具体的努力基本上能够明确整个系统所需要实现的所有的功能,具体的就是微软件结构图中每个模块确定采用的算法和块内数据结构,用某种选定的详细设计工具更清晰的描述。经过这一阶段的努力可以在编码阶段直接翻译成为源程序。
      在这个阶段中,考虑到的程序代码的质量时必须注意,程序的“读者”有两个,即计算机和人。在整个软件生存周期中,软件的测试与诊断出的程序的错误还有程序错误的修改等都必须先读程序。实际上对于任何一个经常使用的软件系统,程序员在之后的过程中,读程序所花费的时间可能比写程序所花费的时间还要长的多。因此,衡量程序的质量不仅仅看他的逻辑是否正确,性能是否满足要求,更重要的是看他是否一度易理解。详细设计的目的不仅仅看他的逻辑上是否正确,性能是否满足于要求,更重要的是看他是否易读、易理解。结构化的程序设计技术是实现这些问题所使用的关键性技术,更是详细设计的基础。
      在本次仓库管理系统说实现的这些基本功能。仓库管理的人员或者是客户在登录后可以进入系统使用主界面进行相应的操作。
      5.1 登录模块
      在本次的仓库管理系统中有两个不同的入口。仓库管理人员使用用户名和密码之后可以对应有相应的操作。用户的登录所需的用户名和密码已经在之前的用户信息表中建立,用户的个人信息由管理员提前录入或者自己注册。由于用户信息需要先从所对应的数据库中进行读取,所以在读取之前需要先于数据库进行连接。在本系统当中,有两个登陆模块的入口。如下图所示确认文件审核用户提供的用户名和密码。
      管理员登录图片如下:

                    图5-1  管理员登录
      

    管理员登陆模块主要逻辑代码如下:
    AloginServlet.java文件主要代码如下:
    String account = request.getParameter(“in_be”);
    String password = request.getParameter(“pass”);
    HttpSession session = request.getSession();
    session.setAttribute(“account”, account);
    AdminService adminService = new AdminService();
    SqlSession sqlSession = MybatisSessionFactory.getSession();
    AdminDaoImp aDaoImp = new AdminDaoImp();
    try {
    List fadmin = aDaoImp.findAdminByName(account);
    sqlSession.clearCache();
    sqlSession.commit();
    //session.close();
    System.out.println(“用户名不存在,ADS开始注册”+fadmin);
    for(Admin fAdmin2:fadmin)
    {
    if( password.equals(fAdmin2.getPassword()))
    {
    response.sendRedirect(“AFirstLog.jsp”);
    session.setAttribute(“Admin”, fAdmin2);
    //System.out.println(“帐号密码正确!”);
    find=true;
    }
    }
    if (fadmin.size()==0) {
    System.out.println(“用户名不存在,ADS开始注册”+fadmin);
    response.sendRedirect(“AloginFail.html”);
    throw new AdminServiceException(“用户名不存在!”);
    }

    	 else {
    		 if(find==false){
    			 response.sendRedirect("AloginFail.html");
    			 throw new AdminServiceException("密码错误!");
    		 }
    	       }
    		   
    	 } catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	 }
    

    5.2 入库模块
    商品入库模块这是系统设计得最好最完善的模块之一。系统提供两种入库方式可供选择一次是录入库存中已经录入的商品,或者录入库存中没有录入的商品
    ,另外添加新商品。录入已存在商品方式时,可自由选择录入某种商品。己录入的商品的信息会在相应的信息的框中显示出来。在此模块的编程中,使用了非常多的编程技巧来提供上述功能做到了与完美的配合。此种方式便于管理员掌握相应商品的情况。按商品名查询可以在选定撒谎能够品后,查询某一次或多次商品信息。
    添加已有上商品模块如图5-2所示:

    图5-2 添加已有商品图片
    当有新的商品进入仓库中时,仓库管理人员需点击入库界面的“添加新商品”选项。在对现有的商品进行入库操作时,商品的信息都是重新输入的。当将新入库的商品的信息填写完毕之后,系统会自己将新入库的一些商品的信息添加到管理商品信息的数据表“goods”中。
    添加新商品模块如图5-3所示:

    图5-3 添加新商品模块
    5.3 出库模块
    商品出库模块这是系统设计得最好最完善的模块之一。系统提供出库方式是在库存表中已经储存有商品基础上才能可以出库的。若是在库存中商品品的数量小于所要出库的输了时,系统会显示出库存数量不足。在进行出库的操作过程时,若是出库的商品在库存中的数量小于0时,系统会报出出库商品出错。此时都不可以正常出库。在正常出库之后,库存中商品的数量会发生改变。

    图5-4 出库管理模块图片
    在出库商品的管理模块中的主要逻辑代码如下:
    GoodsDaoImp goodsDaoImp = new GoodsDaoImp();

          OutGoodsDaoImp outGoodsDaoImp = new OutGoodsDaoImp();
          for(Goods goods2:goods){
        	  String GoodsNum =  goods2.getNum();
        	  System.out.println("goods2值为:"+goods2);
        	  Integer IntGoodsNum = Integer.valueOf(GoodsNum);
        	  Goods goods3 = goods2;
        	  System.out.println("IntGoodsNum :"+IntGoodsNum);
        	  if (IntOutNum>IntGoodsNum) {
        		 System.out.println("出库数量不足!");
    			response.sendRedirect("OutStockFail.jsp");
    		   }else{
    
    			goods2.setNum(String.valueOf(IntGoodsNum-IntOutNum));
    
    			try {
    				//goods3.setNum(String.valueOf(IntOutNum));
    				goodsDaoImp.updateGoods(goods2);
    				sqlSession.commit();
    				goods3.setNum(String.valueOf(IntOutNum));
    				outGoodsDaoImp.saveOutGoods(goods3);
    				sqlSession.commit();
    			} catch (Exception e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    			response.sendRedirect("Goods.jsp"); 
    			System.out.println("出库成功!");
    		   }  
          }
    

    5.4 用户注册模块
    在用户需要访问此系统时,用户需要在登录框中输入相应的信息,然后系统在后台服务器中与数据库进行匹配。所以在进入系统之前需要进行帐号密码的注册,在注册的过程中需要输入输入用户名、密码、姓名、性别、年龄、联系方式、email、联系地址等一系列信息,系统将其提交至服务器端。服务器端处理程序时,服务器会获取到系统提交的内容,然后系统会将获取的信息与数据库中所存储的表格中的信息进行对比,得出相应的结果。若是输入的用户名是在数据库的库存中已经存在的,系统会终止注册,然后系统会提示用户名已经被使用,请重新注册的提示。如果在进行继续注册的过程中出现某一项信息没有填写时,系统会发出此项信息没有填写请重新填写的提示。在进行email注册时,若输入的格式与系统定义的格式不匹配的情况下,系统会作出相应的警告在重新注册。若注册的信息不满足要求时,可以将信息清空再重新注册。

    图5-5 用户注册系统

    用户注册模块的逻辑代码如下:

    String account = request.getParameter(“in_be”);
    String password = request.getParameter(“pass”);
    HttpSession session = request.getSession();
    session.setAttribute(“account”, account);
    //System.out.println(“账户为:”+account);
    //System.out.println(“密码为:”+password);
    AdminService adminService = new AdminService();
    SqlSession sqlSession = MybatisSessionFactory.getSession();
    AdminDaoImp aDaoImp = new AdminDaoImp();
    try {
    List fadmin = aDaoImp.findAdminByName(account);
    sqlSession.clearCache();
    sqlSession.commit();
    //session.close();
    // /session.flush();
    for(Admin fAdmin2:fadmin)

    {
    if( password.equals(fAdmin2.getPassword()))
    {
    response.sendRedirect(“AFirstLog.jsp”);
    session.setAttribute(“Admin”, fAdmin2);
    //System.out.println(“帐号密码正确!”);
    find=true;
    }
    }
    if (fadmin.size()==0) {
    System.out.println(“用户名不存在,ADS开始注册”+fadmin);
    response.sendRedirect(“AloginFail.html”);
    throw new AdminServiceException(“用户名不存在!”);
    }

    	 else {
    		 if(find==false){
    			 response.sendRedirect("AloginFail.html");
    			 throw new AdminServiceException("密码错误!");
    		 }
    	       }
    		   
    	 } catch (Exception e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    

    }
    、}
    5.5 个人信息管理模块
    当管理员或用户进入到主界面之后,管理员可以选择信息管理选项,会进入到用户信息的管理模块。管理员或者用户在系统中具有两项功能,第一项功能是可以对管理员或用户的个人信息进行一些列的操作。在此界面上面可以查询到用户全部的个人信息。第二项功能是能够管理全部的用户的信息。在进入信息管理模块对个人的信息可以进行查看,可以修改自己的信息。在点击修改之后会完成所对应的个人信息。
    管理员信息模块图片如图5-6所示:

    图5-6 管理员信息
    此信息模块的主要逻辑代码如下:
    request.setCharacterEncoding(“UTF-8”)
    response.setCharacterEncoding(“UTF-8”);
    String account = request.getParameter(“userid”);
    String password = request.getParameter(“password”);
    String name = request.getParameter(“name”);
    String sex = request.getParameter(“sex”);
    String age = request.getParameter(“age”);
    String phone = request.getParameter(“phone”);
    String email = request.getParameter(“email”);
    String address = request.getParameter(“address”);
    Admin admin = new Admin();
    admin.setAccount(account);
    admin.setPassword(password);
    admin.setName(name);
    admin.setSex(sex);
    admin.setAge(age);
    admin.setPhone(phone);
    admin.setEmail(email);
    admin.setAddress(address);
    System.out.println(“AInfServlet获取的信息:”+admin);
    SqlSession sqlSession = MybatisSessionFactory.getSession();
    HttpSession session = request.getSession();
    AdminDaoImp aDaoImp = new AdminDaoImp();
    try {
    aDaoImp.updateAdmin(admin);
    sqlSession.commit();
    session.setAttribute(“admin”, admin);
    response.sendRedirect(“AInf.jsp”);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    在这个模块当中,管理员可以对所有的信息进行修改,所有的用户的信息也可以被查询到。在客户的需求之下,管理员可以随意的进入到某一位客户的信息界面之下,可以对所有的信息进行管理。修改之后用户可使用最新一次更新的信息进行登录,进入主界面之后可以更新自己信息。
    系统中全部的用户信息块如图5-7所示:

    图5-7 管理员对客户信息管理
    实现此模块的主要逻辑代码如下:

    String password = request.getParameter(“password”);
    String name = request.getParameter(“name”);
    String sex = request.getParameter(“sex”);
    String age = request.getParameter(“age”);
    String phone = request.getParameter(“phone”);
    String email = request.getParameter(“email”);
    String address = request.getParameter(“address”);

      	   Customer customer = new Customer();
      	   customer.setAccount(account);
      	   customer.setPassword(password);
      	   customer.setName(name);
      	   customer.setSex(sex);
      	   customer.setAge(age);
      	   customer.setPhone(phone);
      	   customer.setEmail(email);
      	   customer.setAddress(address);
    
    	   System.out.println("AInfServlet获取的信息:"+customer);
    	   SqlSession sqlSession = MybatisSessionFactory.getSession();
    	   HttpSession session = request.getSession();
    	   CustomerDaoImp customerDaoImp = new CustomerDaoImp();
    		try {
    			customerDaoImp.updateCustomer(customer);
    			sqlSession.commit();
    			//response.sendRedirect("ACInf.jsp");
    			session.setAttribute("customer",customer);
    			response.sendRedirect("ACInf.jsp");
    		} 
    

    catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    1. 系统的测试
      系统测试是软件设计过程中最后的一部分,也是非常重要的一步。用于检查软件的质量、性能、可靠性等是否符合用户需求。一套严谨的、规范的、完善的测试过程将大大提高软件的质量、可信度、可靠性,降低软件的出错率,降低用户风险系数。
      软件测试就是用户希望能够通过软件测试寻找出软件当中的一些错误,以考虑该产品能不能被广大的用户所接受。而软件测试者则是替用户受过。而今,人们已认识到,用户能够得到最为满意的产品是软件测试的最终的目的,尽可能多的发现系统的问题并改正,然后交给客户使用。
      在测试的过程中主要需要实现一下几点要求:
      1)要完成并实现在前期承诺所需要实现的功能,并且在系统中的每一项功能都需要有说明书。
      2)所做出来的产品的性能要得到满足。
      3)产品应该能够适应所有的用户的环境。
      总之,软件测试的最终的目标是希望能够找出系统中所存在的一些不足与缺陷,而且要求与软件需求阶段所提出的要求相匹配。要注意的是:软件的测试并不能说明软件中没有错误,只能发现并尽可能的减少错误。
      6.1 测试简述
      软件测试,是在软件的完整性、安全性、正确性以及质量是否过关的一种描述。也可以说成是输出比较的一种过程。软件测试的经典定义是:在一定的条件之下来操作并使用软件,在这个过程中来发现并且找出软件自身的错误,以此来评价一个软件的质量。
      在经过查询一系列的资料表明出,软件的测试工作在软件的整个开发的过程当中占有极其重大的一部分。在一些情况表明之下,如果所设计的软件关系到人的生命安全的情况下,软件的测试会变的即为的重要,并且还需要有成倍的工作量来增加测试的目的,以此来说明程序能正确的执行它应有的功能,还有表明程序没有错误。如果抱有这样的目的,就不会轻易地发现错误,从而导致选择一些不易暴露错误的例子。
      6.1.1 测试目的及重要性
    2. 测试目的
      系统的测试是一个在开发过程中十分重要的一个阶段。在系统的测试阶段找出程序的错误,并提高系统的性能是测试阶段的主要任务。主要目的是检验系统“做得怎样”。通过软件的测试会发现一系列的问题,还能找出问题的原因,然后再对这些问题进行修改。
      Grenford J.Myers在以前提出过一下的软件问题:
      1.找出程序中尽可能多的问题。
      2.设计出一个非常好的测试方案,有可能发现一些到目前为止没有能发现的错误。
      3.如果能够找出之前并未发现的错误,算是设计出了一个成功的方案。
      4.测试不是单独的找出错误。而是通过分析错误,来找出产生错误的原因,来避免发生错误,帮助程序员找出软件开发过程中的缺陷,以便及时进项改正。
      2.测试重要性
      不管是什么技术,以及如何使用的方法,但该软件,该软件将仍然是放错了地方。为了减少引入的错误,您可以使用最新的语言,最领先的开发方法,详细的改进开发过程,可是就算是这样也不能够完全的消除软件上面的错误,还要进行详细的测试过程,以找出引入的错误,你必须通过测试误差估计密度在软件中。所有工程学科最根本的所在是一个测试,是在软件开发中占有很重要的一个部分。测试陪同,从编程本身的日子。统计显示,软件测试这个阶段所花费的成本为这个测试是30%至50%的软件开发总成本的。要是也考虑了维护的阶段,在软件开发的整个周期中,有所降低的也许是测试的成本比例,可是维护的工作,实际上是相当于对软件进行了第二次的开发,还有可能是多次,许多测试工作也一定包含在其中。
      在实践中,因为还有一个感知测试这是不正确的和错误的态度,后导致一系列的问题,主要包括有:
      假设测试,也很难带来成就试验人员从某种意义上说,作为设计和编码一样容易取得进展:
      那个戒指是不是建立在自然破裂,找到软件错误作为测试的目标,他们负责的负面测试工作中发现错位;
      测试工作是一种比较乏味、缺少技术性的工作;
      有时候开发人员在开发出软件之后自信心会比较强大,在发现错误后,所表达的意见与他们的自尊心会有所冲突、矛盾。
      软件测试,不赚钱、技术含量低不需要专门去做的错误认知。

    6.1.2 测试原则
    在软件测试中人们所具有的经验非常重要,但人们的心理因素也更加的很重要的。根据软件测试的目标确定一些测试原则,将一些容易被人们忽视的、实际上又是显而易见的问题作为原则来加以重视,所以测试有以下几大原则。
    1.测试用力既要有合理的数据的输入,又需要有一定合理的输出结果。
    2.合理的用例固然重要,但是却不能忘却一些不合理的用例。
    3.检查程序时,需要检查程序该做的与不该做的事情。
    4.测试的计划需要早早的开始制定。
    5.测试计划、测试用例、测试报告需要进行长期的保存,以免以后出问题可以解决。
    6.遵守二八原则。
    7.软件的开发人员应该尽量避免不要亲自去进行测试。
    6.2 测试方法
    测试的过程是一个执行程序的过程,即要求被测试程序能够在各种环境下运行。其实,不再记起上运行也可以发现程序的错误。为了便于区分,一般把被测程序在机器上运行称为动态测试,不再机器上运行称为静态测试,广义上讲都属于软件测试。动态分析方法又分为黑盒测试和白盒测试两种方法。以下的两种方法是即为典型的测试方法。
    6.2.1 黑盒测试
    黑河测试,即功能测试。他的工作重点不是考虑程序应该是怎么编写的。往往将被测试的程序看成一个黑盒,只是在软件的接口处开始进行测试,根据前期制定的需求说明,来检查所做出来的程序是否满足了所有的功能要求。程序梭边写出来的每一项功能,都能不能满足用户在输入数据之后所要达到的目的与要求。并且保持外部信息的完整性。在黑盒测试中会有以下的错误。
    1.发现一些没有实现的功能。
    2.在接口上,数据能不能正确的别接收,结果是否合理。
    3.性能上是否满足要求。
    4.所做出来的界面是不是很清晰、美观。
    6.2.2 白盒测试
    白盒测试,即结构化的测试,主要测试程序的内部组成。白盒测试与黑盒测试法不同,测试人员将程序视为一个透明的盒子,测试人员需要检查处理过程的中一些细微的程序,要求对程序的结构性做到一定程度的覆盖,以此来检验程序内部的一些组成。
    白盒测试法也不可能完全测试,也做不到对所有的路径都挨个测试一遍。例如要测试一个循环20次的嵌套if语句,循环体中有5条路径,这样的测试程序会产生很多种情况。如果每1ms完成一条路径的测试,测试完这样的一个程序需要花费很多的时间,因此可能做到完全覆盖。
    总之,无论哪种测试的方法,对于一个大的软件系统完全测试是不可能的,所以我们要找出更多更合适的方法进行测试,使得软件产品达到一定的质量标准的要求。
    6.2.3 单元测试
    单元测试(unit testing),对软件设计中的一些细小的结构单元进行测试。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的测试单元与其他部分相隔离的情况下进行测试。
    6.2.4 集成测试
    集成测试,即软件的联合测试。以单元测试为基础,把系统中所做出来的一些模块结合起来进行测试。
    6.3系统模块的测试
    6.3.1 登陆模块测试:
    在首次进入系统时,首次进入的是登陆注册的界面,在输入的信息有效的情况下会进入到首界面。如图6-1所示为系统的登录界面的测试:

    图6-1 管理员登录测试
    在当帐号密码出错时,系统会自动跳转到一个报错的页面如图6-2所示:

    图6-2 登录出错界面
    6.3.2 出库模块测试

    系统在进入主界面之后会有一个出库模块的入口,在进入到出库模块时,在输入的出库数量小于库存数量商品能够进行正常出库操作,查询库存结果随之更新。出库的数量比库存中的数量躲得情况下,会跳转一个出库出错的界面,提示库存数量不足。该模块之下的测试用例如下:
    库存中的信息如图6-3所示:

    图6-3 出库前库存信息
    以华为手机出库为例先存量为103,出库数量20(如图6-4所示):

    图6-4 出库信息图
    在进行完出库的操作之后,如图6-5所示:

    图6-5 出库后库存信息图

    出库数量超出库存数量,以铅笔为例,出库25个如图6-6所示:

    图6-6 铅笔出库信息图
    铅笔进行出库操作后库存中的信息图如图6-7所示:

    图6-7 库存不足出库后信息图
    用户信息模块测试:
    此模块的信息如图6-8所示:

    图6-8 用户信息图
    修改后信息图如图6-9所示:

    图6-9 修改后用户信息图
    6.4.3 用户信息模块测试结果
    当在操作中,进入到系统中的这个模块时,可以查看到本人的所有登录信息。可以对此模块中的所有的信息都进行修改操作,然后在对所作出的操作进行更新。

    总 结
    基于Web的仓库管理系统在之后的市场发展中有着非常广阔的前景,会对传统的一些理念造成巨大的冲击。本文是运用了计算机学科中的两项重要的技术即计算机网络技术和数据库技术出发,分析了Web数据库及JSP技术在本次仓库管理系统中的应用。本文的主要工作如下:
    1、探讨了数据库应用系统所经历的主机/服务器—浏览器/服务器模式,重点讨论了三层结构的工作原理及其特点,其中有中间件技术(CGI和API), Java技术、JSP技术、JScript技术、Mybatis技术、PowerDesiner技术等,而且还从一定的方面评价分析了其中的优缺点。
    2、探讨了怎么合理的运用在软件工程中所学习的一些基本原理去分析和设计实现仓库管理系统的过程。并对系统的开发原理、功能设计和模块的设计做出系统的分析。
    3、论文中详尽的介绍了仓库管理系统的总体框架和使用的主要技术、以及功能的实现。
    本文通过理论联系实际,对三层架构结构上的Web数据库的不同实现方法作了详尽的分析,同时使用JSP技术开发的一个仓库管理系统。

    致 谢
    衷心感谢我的指导老师,老师渊博深厚的学识,敏锐的眼光,精辟的见解,创新的开拓精神,严谨认真的治学风范,勤奋谦逊的工作态度,以及忘我的工作精神是我终身的学习楷模,导师对我耐心的指导和严格的要求使我的学习有了不断提高和许多收获,并将继续激励我在今后的工作中克服困难,迎接挑战。真诚的向尊敬的老师致以崇高的敬意!
    本人的论文得以完成,与所有的授课老师以及全体同学的启发和帮助是密不可分的,在此向他们表示衷心的谢意!
    特别要感谢我的家人对我学习期间的理解、支持与鼓励!
    随着科学技术的不断发展,计算机技术和网络技术也在日新月异地飞速发展,人们总是处在不断学习阶段,再加上作者水平有限,所以本文肯定存在不少错误和不尽如人意之处,欢迎广大老师和同学批评指正,在此深表感谢。

    参考文献

    [1] 郑人杰等编著,软件工程[M].清华大学出版社,1999
    [2] DAVID A. GUSTAFSON,Schaum’s Outline Series -Theory and Problems of SOFTWARE ENGINEERING[M].McGRAW-HILL Companies.Inc,2002
    [3] 唐东,《Web数据库开发进阶》,人民邮电出版社
    [4] Jeffrey D.Ullman.Fundamental Course of Database System[M].TsingHua Press,2001.
    [5] DAVID A. GUSTAFSON,Schaum’s Outline Series -Theory and Problems of SOFTWARE ENGINEERING[M].McGRAW-HILL Companies.Inc,2002
    [6] 张海藩.软件工程导论[M]. 北京:清华大学出版社,2003.
    [7] 李习文,李斌.库存控制与管理 [M].北京:机械工业出版社,2007:43-120
    [8] 周之英编著,现代软件工程[M].科学出版社,2000
    [9] 徐娟.网页制作实用技术[M].北京:清华大学出版社,2003:21-52.
    [10] 元燕辉等,《浏览器/服务器应用开发》,科学出版社

    附件1:外文文献(原文)
    Java Technical Description
    Java as a Programming Platform
    Java is certainly a good programming language. There is no doubt that it is oneofthe better languages available to serious programmers. We think it could potentially have been a great programming language, but it is probably too late for that. Once a language is out in the field, the ugly reality of compatibility with existing code sets in."
    Java was never just a language. There are lots of programming languages out there, and few of them make much of a splash. Java is a whole platform, with a huge library, containing lots of reusable code, and an execution environment that provides services such as security, portability across operating systems, and automatic garbage collection.
    As a programmer, you will want a language with a pleasant syntax and comprehensible semantics (i.e., not C++). Java fits the bill, as do dozens of other fine languages. Some languages give you portability, garbage collection, and the like, but they don’t have much of a library, forcing you to roll your own if you want fancy graphics or networking or database access. Well, Java has everything—a good language, a high-quality execution environment, and a vast library. That combination is what makes Java an irresistible proposition to so many programmers.
    Features of Java
    1.Simple
    We wanted to build a system that could be programmed easily without a lot of esoteric training and which leveraged today’s standard practice. So even though we found that C++ was unsuitable, we designed Java as closely to C++ as possible in order to make the system more comprehensible. Java omits many rarely used, poorly understood, confusing features of C++ that, in our experience, bring more grief than benefit.
    The syntax for Java is, indeed, a cleaned-up version of the syntax for C++. There is no need for header files, pointer arithmetic (or even a pointer syntax), structures, unions, operator overloading, virtual base classes, and so on. (See the C++ notes interspersed throughout the text for more on the differences between Java and C++.) The designers did not, however, attempt to fix all of the clumsy features of C++. For example, the syntax of the switch statement is unchanged in Java. If you know C++, you will find the transition to the Java syntax easy.
    If you are used to a visual programming environment (such as Visual Basic), you will not find Java simple. There is much strange syntax (though it does not take long to get the hang of it). More important, you must do a lot more programming in Java. The beauty of Visual Basic is that its visual design environment almost automatically provides a lot of the infrastructure for an application. The equivalent functionality must be programmed manually, usually with a fair bit of code, in Java. There are, however, third-party development environments that provide “drag-and-drop”-style program development.
    Another aspect of being simple is being small. One of the goals of Java is to enable the construction of software that can run stand-alone in small machines. The size of the basic interpreter and class support is about 40K bytes; adding the basic standard libraries and thread support (essentially a self-contained microkernel) adds an additional 175K.
    2. Object Oriented
    Simply stated, object-oriented design is a technique for programming that focuses on the data (= objects) and on the interfaces to that object. To make an analogy with carpentry, an “object-oriented” carpenter would be mostly concerned with the chair he was building, and secondarily with the tools used to make it; a “non-object-oriented” carpenter would think primarily of his tools. The object-oriented facilities of Java are essentially those of C++.
    Object orientation has proven its worth in the last 30 years, and it is inconceivable that a modern programming language would not use it. Indeed, the object-oriented features of Java are comparable to those of C++. The major difference between Java and C++ lies in multiple inheritance, which Java has replaced with the simpler concept of interfaces, and in the Java metaclass model. The reflection mechanism and object serialization feature make it much easier to implement persistent objects and GUI builders that can integrate off-the-shelf components.
    3. Distributed
    Java has an extensive library of routines for coping with TCP/IP protocols like HTTP and FTP. Java applications can open and access objects across the Net via URLs with the same ease as when accessing a local file system.
    We have found the networking capabilities of Java to be both strong and easy to use. Anyone who has tried to do Internet programming using another language will revel in how simple Java makes onerous tasks like opening a socket connection. (We cover networking in Volume 2 of this book.) The remote method invocation mechanism enables communication between distributed objects (also covered in Volume 2).There is now a separate architecture, the Java 2 Enterprise Edition (J2EE), that supports very large scale distributed applications.
    4. Robust
    Java is intended for writing programs that must be reliable in a variety of ways. Java puts a lot of emphasis on early checking for possible problems, later dynamic (run-time) checking, and eliminating situations that are error-prone.… The single biggest difference between Java and C/C++ is that Java has a pointer model that eliminates the possibility of overwriting memory and corrupting data.
    This feature is also very useful. The Java compiler detects many problems that, in other languages, would show up only at run time. As for the second point, anyone who has spent hours chasing memory corruption caused by a pointer bug will be very happy with this feature of Java.
    If you are coming from a language like Visual Basic that doesn’t explicitly use pointers, you are probably wondering why this is so important. C programmers are not so lucky. They need pointers to access strings, arrays, objects, and even files. In Visual Basic, you do not use pointers for any of these entities, nor do you need to worry about memory allocation for them. On the other hand, many data structures are difficult to implement in a pointerless language. Java gives you the best of both worlds. You do not need pointers for everyday constructs like strings and arrays. You have the power of pointers if you need it, for example, for linked lists. And you always have complete safety, because you can never access a bad pointer, make memory allocation errors, or have to protect against memory leaking away.
    5. Secure
    Java is intended to be used in networked/distributed environments. Toward that end, a lot of emphasis has been placed on security. Java enables the construction of virus-free, tamper-free systems.
    In the first edition of Core Java we said: “Well, one should ‘never say never again,’” and we turned out to be right. Not long after the first version of the Java Development Kit was shipped, a group of security experts at Princeton University found subtle bugs in the security features of Java 1.0. Sun Microsystems has encouraged research into Java security, making publicly available the specification and implementation of the virtual machine and the security libraries. They have fixed all known security bugs quickly. In any case, Java makes it extremely difficult to outwit its security mechanisms. The bugs found so far have been very technical and few in number.
    From the beginning, Java was designed to make certain kinds of attacks impossible, among them:
    Overrunning the runtime stack—a common attack of worms and viruses
    Corrupting memory outside its own process space
    Reading or writing files without permission
    A number of security features have been added to Java over time. Since version 1.1, Java has the notion of digitally signed classesWith a signed class, you can be sure who wrote it. Any time you trust the author of the class, the class can be allowed more privileges on your machine.
    6. Architecture Neutral
    The compiler generates an architecture-neutral object file format—the compiled code is executable on many processors, given the presence of the Java runtime system. The Java compiler does this by generating bytecode instructions which have nothing to do with a particular computer architecture. Rather, they are designed to be both easy to interpret on any machine and easily translated into native machine code on the fly.This is not a new idea. More than 20 years ago, both Niklaus Wirth’s original implementation of Pascal and the UCSD Pascal system used the same technique.
    Of course, interpreting bytecodes is necessarily slower than running machine instructions at full speed, so it isn’t clear that this is even a good idea. However, virtual machines have the option of translating the most frequently executed bytecode sequences into machine code, a process called just-in-time compilation. This strategy has proven so effective that even Microsoft’s .NET platform relies on a virtual machine.
    The virtual machine has other advantages. It increases security because the virtual machine can check the behavior of instruction sequences. Some programs even produce bytecodes on the fly, dynamically enhancing the capabilities of a running program.
    7. Portable
    Unlike C and C++, there are no “implementation-dependent” aspects of the specification. The sizes of the primitive data types are specified, as is the behavior of arithmetic on them.
    For example, an int in Java is always a 32-bit integer. In C/C++, int can mean a 16-bit integer, a 32-bit integer, or any other size that the compiler vendor likes. The only restriction is that the int type must have at least as many bytes as a short int and cannot have more bytes than a long int. Having a fixed size for number types eliminates a major porting headache. Binary data is stored and transmitted in a fixed format, eliminating confusion about byte ordering. Strings are saved in a standard Unicode format.The libraries that are a part of the system define portable interfaces. For example, there is an abstract Window class and implementations of it for UNIX, Windows, and the Macintosh.
    As anyone who has ever tried knows, it is an effort of heroic proportions to write a program that looks good on Windows, the Macintosh, and 10 flavors of UNIX. Java 1.0 made the heroic effort, delivering a simple toolkit that mapped common user interface elements to a number of platforms. Unfortunately, the result was a library that, with a lot of work, could give barely acceptable results on different systems. (And there were often different bugs on the different platform graphics implementations.) But it was a start. There are many applications in which portability is more important than user interface slickness, and these applications did benefit from early versions of Java. By now, the user interface toolkit has been completely rewritten so that it no longer relies on the host user interface. The result is far more consistent and, we think, more attractive than in earlier versions of Java.
    8. Interpreted
    The Java interpreter can execute Java bytecodes directly on any machine to which the interpreter has been ported. Since linking is a more incremental and lightweight process, the development process can be much more rapid and exploratory.
    Incremental linking has advantages, but its benefit for the development process is clearly overstated. In any case, we have found Java development tools to be quite slow. If you are used to the speed of the classic Microsoft Visual C++ environment, you will likely be disappointed with the performance of Java development environments. (The current version of Visual Studio isn’t as zippy as the classic environments, however. No matter what language you program in, you should definitely ask your boss for a faster computer to run the latest development environments. )
    9. High Performance
    While the performance of interpreted bytecodes is usually more than adequate, there are situations where higher performance is required. The bytecodes can be translated on the fly (at run time) into machine code for the particular CPU the application is running on.
    If you use an interpreter to execute the bytecodes, “high performance” is not the term that we would use. However, on many platforms, there is also another form of compilation, the just-in-time (JIT) compilers. These work by compiling the bytecodes into native code once, caching the results, and then calling them again if needed. This approach speeds up commonly used code tremendously because one has to do the interpretation only once. Although still slightly slower than a true native code compiler, a just-in-time compiler can give you a 10- or even 20-fold speedup for some programs and will almost always be significantly faster than an interpreter. This technology is being improved continuously and may eventually yield results that cannot be matched by traditional compilation systems. For example, a just-in-time compiler can monitor which code is executed frequently and optimize just that code for speed.
    10. Multithreaded
    The enefits of multithreading are better interactive responsiveness and real-time behavior.if you have ever tried to do multithreading in another language, you will be pleasantly surprised at how easy it is in Java. Threads in Java also can take advantage of multiprocessor systems if the base operating system does so. On the downside, thread implementations on the major platforms differ widely, and Java makes no effort to be platform independent in this regard. Only the code for calling multithreading remains the same across machines; Java offloads the implementation of multithreading to the underlying operating system or a thread library. Nonetheless, the ease of multithreading is one of the main reasons why Java is such an appealing language for server-side development.
    11. Dynamic
    In a number of ways, Java is a more dynamic language than C or C++. It was designed to adapt to an evolving environment. Libraries can freely add new methods and instance variables without any effect on their clients. In Java, finding out run time type information is straightforward.
    This is an important feature in those situations in which code needs to be added to a running program. A prime example is code that is downloaded from the Internet to run in a browser. In Java 1.0, finding out runtime type information was anything but straightforward, but current versions of Java give the programmer full insight into both the structure and behavior of its objects. This is extremely useful for systems that need to analyze objects at run time, such as Java GUI builders, smart debuggers, pluggable components, and object databases.
    Java and the Internet
    The idea here is simple: users will download Java bytecodes from the Internet and run them on their own machines. Java programs that work on web pages are called applets. To use an applet, you need a Java-enabled web browser, which will execute the bytecodes for you. Because Sun is licensing the Java source code and insisting that there be no changes in the language and basic library structure, a Java applet should run on any browser that is advertised as Java-enabled. Unfortunately, reality has been different. Various versions of Netscape and Internet Explorer run different versions of Java, some of which are seriously outdated. This sorry situation made it increasingly difficult to develop applets that take advantage of the most current Java version. To remedy this problem, Sun has developed the Java Plug-in, a tool that makes the newest Java runtime environment available to both Netscape and Internet Explorer
    When the user downloads an applet, it works much like embedding an image in a web page. The applet becomes a part of the page, and the text flows around the space used for the applet. The point is, the image is alive. It reacts to user commands, changes its appearance, and sends data between the computer presenting the applet and the computer serving it.
    a good example of a dynamic web page—an applet to view molecules—that carries out sophisticated calculations. By using the mouse, you can rotate and zoom each molecule to better understand its structure. This kind of direct manipulation is not achievable with static web pages, but applets make it possible.

    附件2:外文文献(译文)

    Java技术介绍
    Java是一种程序设计平台
    Java是一种优秀的程序设计语言。对于一个名副其实的程序设计人员来说,使用Java无疑是一个好的选择。有人认为:Java将有望成为一种最优秀的程序设计语言,但还需要一个相当长的发展时期。一旦一种语言应用于某个领域,与现存代码的相容性问题就摆在了人们的面前。”
    Java并不只是一种语言。在此之前出现的那么多种语言也没有能够引起那么大的轰动。Java是一个完整的平台,有一个庞大的库,其中包含很多可重用的代码和一个提供诸如安全性、跨操作系统的可移植性以及自动垃圾回收等服务的执行环境。
    作为一名程序设计人员,常常希望能够有一种语言,它具有令人赏心悦目的语法和易于理解的语义(C++不是这样的)。与许多其他的优秀语言一样,Java恰恰满足了这些要求。有些语言提供了可移植性、垃圾回收等等,但是,没有提供一个大型的库,如果想要有奇特的绘图功能、网络连接功能和数据库存取功能就必须自己动手编写代码。Java这种功能齐全的出色语言,具有高质量的执行环境以及庞大的库。正是因为它集多种优势于一身,所以对于广大的程序设计人员来说有着不可抗拒的吸引力。
    JAVA的特性
    1.简单性
    人们希望构建一个无需深奥的专业训练就可以进行编程的系统,并且要符合当今的 标准惯例。因此,尽管人们发现C++不太适用,但在设计Java的时候还是尽可能地接近 C++,以便系统更易于理解。Java别除了C++中许多很少使用、难以理解、易混淆的特性。在目前看来,这些特性带来的麻烦远远大于带来的好处。
    的确,Java语法是C++语法的一个“纯净”版本。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等等。(请参看本书各个章节给出的C++注释,那里比较详细地解释了Java与C++之间的区别。)然而,设计者并没有试图清除C++中所有不适当的特性。例如,switch语句的语法在Java中就没有改变。如果熟悉C++就会发现可以轻而易举地将它转换成Java,
    如果已经习惯于可视化的编程环境(例如Visual Basic),就不会觉得Java简单了。Java有许多奇怪的语法(尽管掌握其要领并不需要很长时间),更重要的是,使用Java需要自己编写大量的程序。Visual Basic的魅力在于它的可视化设计环境几乎自动地为应用程序提供了大量的基础结构。而使用Java实现同样的功能却需要手工地编制代码,通常代码量还相当大。然而,已经有一些支持“拖放”风格程序开发的第三方开发环境。
    简单性的另一个方面是小。Java的目标之一是支持开发能够在小型机器上独立运行的软件。基本的解释器以及类支持大约仅为40KB;再加上基础的标准类库和对线程的支持(基本上是一个自含的微内核)大约需要增加175KB。这是一个了不起的成就。然而,需要注意的是支持图形用户界面(GUI)的类库相当大。
    2.面向对象
    简单地讲,面向对象设计是一种程序设计技术。它将重点放在数据(即对象)和对象的接口上。用木匠来打一个比方,一个“面向对象的”木匠始终关注的是所制作的 椅子,第二位才是所使用的工具;一个“非面向对象的”木匠则首先考虑的是所用的工具。在本质上,Java的面向对象能力与C++是一样的。
    在过去的30年里,面向对象已经证明了自身的价值,一种现代的程序设计语言不使用面向对象技术简直让人难以置信。的确,Java的面向对象特性与C++旗鼓相当。Java与C++的主要不同点在于多继承,在Java中,取而代之的是简单的接口概念,以及Java的元类(metaclass)模型。
    反射机制以及对象序列化特性使得Java更加容易实现持久对象和GUI构建器(可以整合外来组件)。
    3.分布式
    Java有一个扩展的例程库,用于处理像HTTP和FTP这类的TCP/IP协议。Java应用程序能够通过URL打开和访问网络上的对象,其便利程度如同访问本地文件系统一样。 人们已经看到Java的网络能力强大且易于使用。任何曾经试图使用其他语言进行网络编程的人都会惊呼Java竟然把类似打开socket连接这类繁重的任务都变得如此简单。
    另外,远程方法调用机制使得分布式对象之间可以进行通信。 现在有一种独立的体系结构,Java 2企业版(J2EE ),它支持大规模的分布式应用。
    4.健壮性
    Java的设计目标之一在于使用Java编写的程序具有多方面的可靠性。Java投入了大量的精力进行早期的问题检测、后期动态的(运行时)检测,并消除了有出错倾向的状态……
    Java和C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性。这个特性非常有用。Java编译器能够检测许多在其他语言中仅在运行时刻才能够检测出来的问题。至于第二点,对于曾经花费几个小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性。
    如果曾经只使用过Visual Basic这类没有显式指针的语言,就会感觉这么说似乎有些小题大做。然而,C程序员就没有这样幸运了。他们需要利用指针来存取串、数组、对象,甚至文件。
    在Visual Basic中,根本不必使用指针来访问这些实体,也不必关心有关内存分配的问题。另一方面,在没有指针的语言中,许多数据结构很难实现。Java具有双方的优势。它不需要使用指针构造诸如串、数组这样的结构。如果需要,也能够具有指针的能力,如链表。Java绝对是安全的,其原因是永远不会存取一个“坏的”指针,造成内存分配的错误,也不必防范内存泄漏。
    5.安全性
    Java适用于网络/分布式环境。为了达到这个目标,在安全方面投入了很大精力。 使用Java可以构建防病毒、防墓改的系统。事实证明这是正确的。在Java开发工具箱启用后不久,普林斯顿大学的一些安全专家们发现了在Java 1.0中的某些安全特性方面存在着一些非常隐蔽的bug, Sun Microsystems大力支持对Java的安全性的研究,制定了供人们使用的规范,实现了虚拟机和安全库,并迅速地处理了所有已知的安全bug。在任何情况下,蒙骗Java的安全机制都是十分困难的。现在,发现bug所需的技术性越来越强,数目越来越少。 从一开始,Java就被设计成能够防范各种袭击,包括:
    ·禁止运行时堆栈溢出。例如,蠕虫等病毒常用的袭击手段。
    ·禁止在自己的处理空间之外破坏内存。
    ·未经授权禁止读写文件。许多安全特性相继不断地被加入Java中。
    自从Java 1.1问世以来,Java就有了数字签名类(digitally signed class)的概念(请参看卷II)。通过数字签名类,可以确定类的作者。如果信任这个类的作者,这个类就可以在你的机器上拥有更多的权限。
    来自微软的基于ActiveX技术的竞争代码传输机制,其安全性完全依赖于数字签名。这显然是不够的,因为微软自身产品的任何用户都可以证实,来自知名提供商的程序会崩溃并对系统产生危害。Java的安全机制比ActiveX要强得多,因为它是在应用程序运行时加以拉制并制止恶意性破坏的。
    6.体系结构中立
    编译器生成一个体系结构中立的目标文件格式,这是一种编译过场代码,只要有Java运行时系统,就可以在许多处理器上运行。Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上被解释执行,而且还可以迅速地翻译成本地机器的代码。这并不是什么新的思想。20多年以前,Niklaus Wirth最初实现的Pascal以及UCSD Pascal系统都使用了这种技术。当然,解释字节码肯定要比全速地运行机器指令慢很多。所以说,这是不是一个好的思想还很难讲!然而,虚拟机有一个选项,它可以将执行最频繁的字韦码序列翻译成机器码,这一过程被称为即时编译。这一策略已经被证明十分有效,致使微软的.NET平台也依赖于虚拟机。虚拟机还有一些其他的优点。虚拟机可以检测指令序列的行为,以增强其安全性。有些程序甚至能够快速地生成字节码,并动态地增强所运行程序的处理能力。
    7.可移植性
    与C和C++不同,Java规范中没有“依赖具体实现”的地方。塞本数据类型的大小以及有关算法都做了明确的说明。例如,Java中的int永远为32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器提供商指定的其他大小。唯一的限制只是int类型的大小不能低于short int,并且不能高于long int。在Java中,数据类型具有固足的大小,们除J代消移祖盯竿八大油a’i土女IWJ*I。-ml R77数据以固定的格式存储和传输,消除了字节顺序的困扰。字符串是用标准的Unicode格式存储的。作为系统的组成部分的类库,定义了可移植的接口。例如,有一个抽象的Window类给出了在UNIX, Windows和Macintosh环境下的不同实现。
    凡是尝试过的人都知道,要编写一个在Windows, Macintosh和10种不同风格的、在UNIX上看起来都不错的程序有多么困难。Java 1.0就尝试着做了这么一个壮举,发布了一个将常用的用户界面元素映射到不同平台上的简单工具箱。遗憾的是,花费了大量的心血,却构建了一个在各个系统上都难以让人接受的库(而且,在不同平台的图形实现中有不同的bug)。不过,这毕竟是个开端。对于许多应用问题来说,可移植性比花枝招展的用户界面更加重要。而且这些应用程序从Java的早期版本中获益匪浅。现在,用户界面工具箱已经完全被重写了,不再依赖于主机的用户接口。现在的Java版本比早期版本更加稳定,更加吸引人。
    8.解释型
    Java解释器可以在任何移植了解释器的机器上执行Java字节码。由于链接是一个更加增量且简便的过程,所以开发过程也变得更加快捷,更加具有探索性。增量链接有其优势,但给开发过程带来的好处显然是言过其实了。在任何情况下,都会觉得Java开发工具的速度相当慢。如果习惯于经典的Microsoft Visual C++环境的速度,就会对Java开发环境的性能感到失望。(但是,Visual Studio的当前版本不像经典的环境那样快捷。无论用什么语言编写程序,都需要向老板申请一台速度更快的计算机,以便运行最新的开发环境。)
    9.高性能
    尽管对解释后的字节码性能已经比较满意,但在有些情况下却需要更加高效的性能。字节码可以(在运行时刻)被快速地翻译成运行该应用程序的特定CPU的机器码。如果使用解释器执行字节码,根本就不可能用术语“高性能”。然而,在许多平台上,还有另一种编译形式,这就是即时编译器(JIT编译器)。它的基本工作方式是一次把字节码编译为本地代码,并将结果缓存起来。在需要的时候重新调用。由于这种方式只需要进行一次解释,从而极大地提高了常用代码运行速度。虽然,即时编译器仍然比真正的本地代码编译器慢一些,但是对某些程序来说,能够提高10倍乃至20倍的速度,而且几乎在任何情况下,都比解释器的速度快得多。这个技术始终在不断完善着,或许有一天它能够达到传统编译系统所无法匹敌的性能。例如,即时编译器可以监视哪些代码被频繁地执行,并对其进行优化,以提高程序的运行速度。
    10.多线程
    多线程可以带来更好的交互响应和实时行为。 如果曾经使用过其他语言编写多线程的应用程序,就会对Java多线程处理的便捷性惊叹不已。
    只要操作系统支持,Java中的线程就可以利用多个处理器。在底层,主流平台的线程实现机制各不相同,Java并没有花费太大的力气对此实现平台无关性。在不同的机器上,只是调用多线程的代码完全相同;Java把多线程的实现交给了底层的操作系统或线程库来完成。(有关线程的详细内容将在卷II中介绍。)尽管如此,多线程的简单性是Java成为颇具魅力的服务器端开发语言的主要原因之一。
    11.动态性
    从各种角度看,Java与C或C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由地添加新方法和实例变童,而时客户端却没有任何影响。在Java中找出运行时刻类型信息十分直观。当需要将某些代码添加到正在运行的程序中时,动态性将是一个非常重要的特性。一个很好的例子是:从Internet上下载代码,然后在浏览器上运行。在Java 1.0中,不能直接地获取运行时类型信息,而Java的当前版本允许程序员知晓对象的结构和行为。这对于必须在运行时分析对象的系统来说非常有用。这些系统有:Java GUI构建器、智能调试器、可插入组件以及对象数据库。
    微软曾经发布了一个叫做J++的产品,它与Java有许多共享的机制。与Java一样,J++是由虚拟机来执行的,该虚拟机与执行Java字节码的Java虚拟机相互兼容,但是,当与外部代码有接口时就会出现很多不同之处。基本语言的语法与Java几乎一样。只是除了与Windows API的接口之外,还增加了一些可能具有一定实用性的语言结构。Java和J++不仅共享通用的语法,它们的塞本类库(串、实用程序、联网、多线程、数学函数等等)从本质上说也是一致的。然而,图形库、用户界面、远程对象存取的方式则完全不同。为此,微软不再支持J++,取而代之的是另一种被称为C#语言。C#与Java有很多相似之处,然而使用的却是完全不同的虚拟机。甚至还有一种J#语言可将J++的应用迁移到使用C#的虚拟机上。
    Java与Internet
    这里的思想很简单:用户将从Internet下载Java字节码,并在自己的机器上运行。在网页中运行的Java程序称为applet。为了使用applet,需要一个启用Java的Web浏览器来执行字节码。因为Sun公司只负责发放Java源代码的许可证,并坚持不允许对语言和基本类库的结构做出任何修改,因此,Java的applet应该可以运行在任何启用Java浏览器上。遗憾的是,实际情况并非如此。
    各个版本的Netscape(网景浏览器)和Internet Explorer (IE浏览器)运行着不同版本的Java,其中有些早已过时。这种糟糕的情况导致更加难于利用Java最新版本来开发applet。为了摆脱这种局面,Sun开发了Java插件。这就使得Netscape和Internet Explorer都可以利用最新的Java运行时环境。 用户下载一个applet就如同在网页中嵌入一幅图片。applet成为了页面的一部分。文本环绕着applet所占据的空间周围。关键一点是图片为活动的。它可以对用户命令做出响应,改变外观,在运行它的计算机与提供它的计算机之间传递数据。 applet显示了分子结构,这将需要相当复杂的计算。
    在一个网页中,可以利用鼠标进行旋转,调整焦距等操作,以便能够更好地理解分子结构。用静态网页将无法实现这种直接操作,而applet却可以达到此目的。可以借助applet在网页上增加按钮和输人框。但是,通过拨号连接下载这样的applet速度相当慢。除此之外,还可以使用Dynamic HTML, HTML表单和某种脚本语言(如JavaScript)完成这类操作。当然,早期的applet主要用于动画,如大家熟悉的旋转球、跳动的卡通字符、疯狂。

    完整毕业设计下载:https://www.huzhan.com/code/goods344411.html

    展开全文
  • 数据结构/C++课程设计 仓库管理系统

    千次阅读 2021-01-13 14:16:49
    数据结构/C++课程设计 仓库管理系统 一个管理仓库内货物的信息的仓库管理程序。 仓库中货物信息的组成部分为:货物编号、货物名称、货物单价、货物数量等。 一、功能模块结构图: 二、项目介绍 1.文件与结构体与类...
  • 系统分析,功能详细描述及框图,数据结构设计,主要功能逻辑过程和实现算法,界面设计
  • 本项目是使用Java swing开发,可实现仓库管理系统登陆/注册/重置、登录后可以进行系统管理、原料管理、成品管理、管理记录以及注销退出等几大模块。界面设计比较简介、适合作为Java初学者课设设计以及学习技术使用。...
  • 1.2.1传统企业库存管理系统存在的问题 1 1.2.2现代企业库存管理系统的特点 1 1.3可行性分析 2 1.4技术方案 3 1.4.1系统开发工具 3 1.4.2实施步骤 5 第二章 系统分析 7 2.1系统需求分析 7 2.1.1摘要 7 2.1.2系统的...
  • 课程设计任务书(教师签名) ⑤ 正文(分章、层次等,每一章从新一页开始) .概述 包括项目背景、编写目的、软件定义、开发环境等内容。  .需求分析 问题陈述、需完成的功能。以数据流图和数据字典表达。 ....
  • java实现的简单仓库管理系统

    热门讨论 2011-11-18 14:32:25
    里面包含了一些数据库调用语句,挺好的,并且在其中也有一些创新,尤其在搜索的功能上面,且包含了数据库所建的表,直接导入就可以直接运行了
  • 课程设计是关于仓库管理的,用VC++和数据库的知识 多人合作进行了设计,分为四个部分,前期分析 数据库设计 程序界面设计.程序设计与编码和后期总结 比较详细的设计了仓库管理系统
  • 数据库课程设计报告(仓库管理系统

    万次阅读 多人点赞 2014-04-08 10:57:45
    三 概要设计 3.1 E—R图和相关说明   类别(类别编号,类别名称,上级类别) 仓库仓库编号,隶属单位,备注) 用户(用户名,密码,权限类型); 客户(客户编号,联系人,单位,联系电话,...
  • JAVA/数据库 课程设计 仓库管理系统 1问题描述 设计一个仓储管理系统,对仓库货品进行管理,出入库进行记录。主要功能包括,货品添加修改,出库、入库、库存查询等功能,现请你设计该系统。 2基本要求 数据库...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,067
精华内容 2,026
关键字:

仓库管理系统课程设计界面