• 基于Android的仓库管理系统APP设计与实现


    目 录
    目 录 III
    1 引言 1
    1.1小型仓库管理系统开发背景 1
    1.1.1 Android移动应用开发产业的现状分析 2
    1.1.2 Android平台的市场优势 3
    1.2 课题开发内容与目标 3
    2 小型仓库管理系统开发技术简介 3
    2.1 Android系统架构 3
    2.1.1 应用程序层 3
    2.1.2 应用程序框架 4
    2.1.3 系统运行库 5
    2.1.4 Linux内核 6
    2.2 开发环境配置 6
    2.2.1 开发工具 6
    2.2.2 搭建Android 4.4开发环境 6
    2.2.3 安装Eclipse平台 8
    2.3 SQLite简介 8
    3 小型仓库管理系统可行性分析 9
    3.1 技术条件可行性 9
    3.2 硬件条件可行性 11
    3.3市场需求可行性分析 11
    3.4 市场因素可行性 11
    4 小型仓库管理系统分析与设计 12
    4.1 系统需求分析 12
    5 小型仓库管理系统分析实现 13
    5.1 App端功能模块的实现 13
    5.1.1 登录注册、修改个人信息 13
    5.1.2修改密码 14
    5.1.3出库 15
    5.1.4提出改进app功能建议 17
    5.1.5入库 18
    5.1.6入库记录界面 19
    5.1.7个人信息界面 20
    5.2 Web端功能模块的实现 21
    5.2.1管理员登录、修改密码 21
    5.2.2 出库列表记录 22
    5.2.3 供应商管理 22
    5.2.4产品管理 23
    6 运行与测试 23
    6.1 Android应用开发的测试技术 23
    6.2 测试的任务 24
    6.3 测试方案与过程 25
    6.3.1 模块测试 25
    6.3.2 验收测试 25
    6.4 测试结果 25
    结束语 26
    参考文献 27
    致谢 29
    4 小型仓库管理系统分析与设计
    4.1 系统需求分析
    该系统的客户端定位于Android手机平台。系统的用户信息和聊天信息在客户端存储在Android平台自身所带的SQLite数据库中,多媒体文件和图片文件存储在Android平台虚拟文件存储设备sdcard中。通过对聊天软件的调研,进行需求分析、总体设计、UI设计、数据库设计,采用Java技术在Android平台上实现聊天软件的各个功能模块,设计测试用例,调试并完善系统功能。
    (1)基本信息管理,主要实现产品信息、供应商信息的增加、删除、修改、查询操作。
    (2)库存信息管理,主要实现产品的出库、入库以及产品信息的增删改差查操作。
    (3)系统设置,主要实现管理用户、修改密码、退出系统等操作。
    (4)统计汇总分析等系统功能,主要实现仓库仓储量的入库、出库数量的统计。
    (5)解决思路: 通过对系统功能需求进行分析,在Android平台上开发此系统,利用Eclipse软件工具开发,利用MySQL数据库为系统进行后台技术开发,实现对系统信息的管理。其主要 功能为:本文转载自http://www.biyezuopin.vip/onews.asp?id=12466用户管理、基本信息、库存管理、信息查询等模块。用户管理模块包括管理用户、修改密码,基本信息模块包括供应商信息管理、产品信息管理,库存管理模块包括添加入库、添加出库,信息查询模块包括查询入库、查询出库、库存查询。
    6 运行与测试
    6.1 Android应用开发的测试技术
    第一步:首先在AndroidManifest.xml中加入下面代码:
    package="cn.itcast.action“ android:versionCode="1"android:versionName=“1.0”>







    上面targetPackage指定的包要和应用的package相同。
    第二步:编写单元测试代码,选择要测试的方法,右键点击“Run As”—“Android Junit Test”进行测试[7]。
    6.2 测试的任务
    设计测试方案是测试阶段的关键技术问题。所谓测试方案包括预定要测试的功能。应该输入的测试数据和预期的结果,目标是设计一组可能发现错误的数据。测试有两种方法:黑盒测试和白盒测试。
    黑盒测试又称为功能测试,在程序接口进行,只检查程序功能是否能够按照规格说明书的规定正确使用,程序是否能适当地接收输入数据并发生正确的输出信息,而且要能够保持外部信息的完整性。[8]
    白盒测试又叫结构测试,完全了解程序的结构和处理过程,这种方法按照程序内部的逻辑测试程序,检验程序中每条通路是否都能按照预定要求正确工作。
    主要的测试目标是在软件成功运行之前,能够尽早尽快的发现软件存在的错误,以便调试改正。
    6.3 测试方案与过程
    针对系统的模块化的设计,采取各个模块的独立测试和程序初运行的完整测试。
    6.3.1 模块测试
    在学习模块中,对Activity中的类进行测试,首先测试词库初始化时是否完成了文件的转移以及词库的加载。还对单词的朗读功能进行测试,检测文本数据的转换能否完成。
    在统计功能中将对SharedPreferences是否完成测试和挑战模块的测试条目和正确的条目的记录,以及结果的显示。[9]
    在主题和背景音乐的功能实现中检测其更换的成功与否。
    6.3.2 验收测试
    在完成逐个模块测试后,开始对系统进行验收测试,运行该系统,在运行过程中查找出现的错误。
    6.4 测试结果
    首次是在配置好环境的计算机上安装的模拟器上运行测试,出现了由于内存空间的设置不足的问题出现无法运行的情况,随后使用真机进行测试,基本功能完全实现,能够实现仓库的出库、入库操作。

    package com.example.meinv;
    
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnCancelListener;
    import android.content.DialogInterface.OnClickListener;
    import android.content.DialogInterface.OnKeyListener;
    import android.graphics.Bitmap;
    import android.os.Message;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.webkit.JsPromptResult;
    import android.webkit.JsResult;
    import android.webkit.WebChromeClient;
    import android.webkit.WebView;
    import android.widget.EditText;
    
    
    //****************************************************************************
    public class MyWebChromeClient extends WebChromeClient {
    	
    	
    	@Override
    	public void onCloseWindow(WebView window) {
    		super.onCloseWindow(window);
    	}
    
    	@Override
    	public boolean onCreateWindow(WebView view, boolean dialog,
    			boolean userGesture, Message resultMsg) {
    		return super.onCreateWindow(view, dialog, userGesture, resultMsg);
    	}
    
    	/**
    	 * 覆盖默认的window.alert展示界面,避免title里显示为“:来自file:”
    	 */
    	public boolean onJsAlert(WebView view, String url, String message,
    			JsResult result) {
    		final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
    				
    		builder.setTitle("对话框")
    				.setMessage(message)
    				.setPositiveButton("确定", null);
    				
    		// 不需要绑定按键事件
    		// 屏蔽keycode等于84之类的按键
    		builder.setOnKeyListener(new OnKeyListener() {
    			public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
    				Log.v("onJsAlert", "keyCode==" + keyCode + "event="+ event);
    				return true;
    			}
    		});
    		// 禁止响应按back键的事件
    		builder.setCancelable(false);
    		AlertDialog dialog = builder.create();
    		dialog.show();
    		result.confirm();// 因为没有绑定事件,需要强行confirm,否则页面会变黑显示不了内容。
    		return true;
    		// return super.onJsAlert(view, url, message, result);
    	}
    
    	public boolean onJsBeforeUnload(WebView view, String url,
    			String message, JsResult result) {
    		return super.onJsBeforeUnload(view, url, message, result);
    	}
    
    	/**
    	 * 覆盖默认的window.confirm展示界面,避免title里显示为“:来自file:”
    	 */
    	public boolean onJsConfirm(WebView view, String url, String message,
    			final JsResult result) {
    		final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
    		builder.setTitle("对话框")
    				.setMessage(message)
    				.setPositiveButton("确定",new OnClickListener() {
    							public void onClick(DialogInterface dialog,int which) {
    								result.confirm();
    							}
    						})
    				.setNeutralButton("取消", new OnClickListener() {
    					public void onClick(DialogInterface dialog, int which) {
    						result.cancel();
    					}
    				});
    		builder.setOnCancelListener(new OnCancelListener() {
    			@Override
    			public void onCancel(DialogInterface dialog) {
    				result.cancel();
    			}
    		});
    
    		// 屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
    		builder.setOnKeyListener(new OnKeyListener() {
    			@Override
    			public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
    				Log.v("onJsConfirm", "keyCode==" + keyCode + "event="+ event);
    				return true;
    			}
    		});
    		// 禁止响应按back键的事件
    		// builder.setCancelable(false);
    		AlertDialog dialog = builder.create();
    		dialog.show();
    		return true;
    		// return super.onJsConfirm(view, url, message, result);
    	}
    
    	/**
    	 * 覆盖默认的window.prompt展示界面,避免title里显示为“:来自file:”
    	 * window.prompt('请输入您的域名地址', '618119.com');
    	 */
    	public boolean onJsPrompt(WebView view, String url, String message,
    			String defaultValue, final JsPromptResult result) {
    		final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
    				
    		builder.setTitle("对话框").setMessage(message);
    				
    		final EditText et = new EditText(view.getContext());
    		et.setSingleLine();
    		et.setText(defaultValue);
    		builder.setView(et)
    				.setPositiveButton("确定", new OnClickListener() {
    					public void onClick(DialogInterface dialog, int which) {
    						result.confirm(et.getText().toString());
    					}
    		
    				})
    				.setNeutralButton("取消", new OnClickListener() {
    					public void onClick(DialogInterface dialog, int which) {
    						result.cancel();
    					}
    				});
    
    		// 屏蔽keycode等于84之类的按键,避免按键后导致对话框消息而页面无法再弹出对话框的问题
    		builder.setOnKeyListener(new OnKeyListener() {
    			public boolean onKey(DialogInterface dialog, int keyCode,KeyEvent event) {
    				Log.v("onJsPrompt", "keyCode==" + keyCode + "event="+ event);
    				return true;
    			}
    		});
    
    		// 禁止响应按back键的事件
    		// builder.setCancelable(false);
    		AlertDialog dialog = builder.create();
    		dialog.show();
    		return true;
    		// return super.onJsPrompt(view, url, message, defaultValue,
    		// result);
    	}
    
    	@Override
    	public void onProgressChanged(WebView view, int newProgress) {
    		super.onProgressChanged(view, newProgress);
    	}
    
    	@Override
    	public void onReceivedIcon(WebView view, Bitmap icon) {
    		super.onReceivedIcon(view, icon);
    	}
    
    	@Override
    	public void onReceivedTitle(WebView view, String title) {
    		super.onReceivedTitle(view, title);
    	}
    
    	@Override
    	public void onRequestFocus(WebView view) {
    		super.onRequestFocus(view);
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    干货 | 一文搞定 pytest 自动化测试框架(二)
    C# 第八章『多线程』◆第3节:线程的方法
    Kubernetes(K8s)的基础概念
    MYSQL之主从复制
    【ArcGIS模型构建器】04:根据矢量范围批量裁剪影像栅格数据
    基于armv8的kvm实现分析(一)虚拟化介绍
    ELK集群搭建流程(实践可用)
    LDR6023AQ-PDHUB最简外围成本低搂到底就是干
    外包干了五年,废了...
    BeanFactory和ApplicationContext
  • 原文地址:https://blog.csdn.net/newlw/article/details/126759198