1、文档编号版本 A1 密级 商密 A项目名称 Xx系统研发生产中心项目来源QR-RD-022(Ver1.2) XXX 系统详细设计说明书(内部资料 请勿外传)编 写: 日 期:检 查: 日 期:审 核: 日 期:批 准: 日 期:XX 公 司版权所有 不得复制文档变更记录序号 变更(+/-)说明 作者 版本号 日期 批准12目 录1. 引言 .41.1 编写目的和范围 .41.2 术语表 .41.3 参考资料 .41.4 使用的文字处理和绘图工具 .42. 全局数据结构说明 .52.1 常量 .52.2 变量 .52.3 数据结构 .53. 模块设计 .53.1 用例图 .53.2 功能设计说明
2、 .53.2.1 模块 1 .53.2.2 模块 2 .64. 接口设计 .74.1 内部接口 .74.2 外部接口 .74.2.1 接口说明 74.2.2 调用方式 85. 数据库设计 .86. 系统安全保密设计 .86.1 说明 .86.2 设计 .86.2.1 数据传输部分 86.2.2 IP 过滤分部 .86.2.3 身份验证部分 87. 系统性能设计 .98. 系统出错处理 .91. 引言1.1 编写目的和范围说明写这份详细设计说明书的目的。本详细设计说明书编写的目的是说明程序模块的设计考虑,包括程序描述、输入 /输出、算法和流程逻辑等,为软件编程和系统维护提供基础。本说明书的预期读
3、者为系统设计人员、软件开发人员、软件测试人员和项目评审人员。1.2 术语表定义系统或产品中涉及的重要术语,为读者在阅读文档时提供必要的参考信息。序号 术语或缩略语 说明性定义1 PM Project Manager,项目经理21.3 参考资料列出有关资料的名称、作者、文件编号或版本等。参考资料包括:a需求说明书、架构设计说明书等;b本项目的其他已发表的文件;c引用文件、资料、软件开发标准等。 资料名称 作者 文件编号、版本 资料存放地点1.4 使用的文字处理和绘图工具文字处理软件:word office绘图工具: Visio2. 全局数据结构说明本章说明本程序系统中使用的全局数据常量、变量和数
4、据结构。2.1 常量static String SERVER_ADDRESS 服务器地址boolean loginFlag 登录状态2.2 变量BlueUserInfo 用户账户结构体2.3 数据结构包括数据结构名称,功能说明,具体数据结构说明(定义、注释、取值)等。3. 模块设计3.1 用例图登 录设 置人 员 管 理池 塘 管 理育 苗 管 理物 流 管 理注 销加 工 包 装数 据 管 理人 事 部育 苗 场生 产 部加 工 厂市 场 部系 统 用 户3.2 功能设计说明3.2.1 登录模块模块 1主要分为以下几个子模块:子模块 1、子模块 2和子模块 N。3.2.1.1 设计图3.2.
5、1.2 功能描述此模块的主要功能是登录验证功能,保证程序的安全性问题。用户需要验证用户和密码是否正确才能进行下一部操作。3.2.1.3 输入数据变量名 类型 说明userName String 用户名(必填)password String 密码(必填 )STOPSPLASH int 开场动画标志位SPLASHTIME long 消息发送延迟时间LOGINBUTTON int 登录按钮是否能够点击标志位3.2.1.4 输出数据字段 说明code 结果,0 表示失败,1 表示成功,2 表示该养殖场地不存在,3 表示该 Rfid 已存在userName 用户名PassWord 密码userRolel
6、d 用户权限,1 代表系统用户,2 代表人事部,3 代表育苗场,4 代表生产部,5 代表加工厂,6 代表市场部,7 代表捕捞管理员 表现形式为:code=13.2.1.5 流程图登 录输 入 用 户 名 和 密 码用 户 名 /密 码 是 否 为 空 ?用 户 名 是 否 正 确 ?提 示 : 账 号 或 密 码不 能 为 空N提 示 : 用 户 名 不 存在YNY用 户 名 是 否 正 确 ?提 示 : 用 户 名 不 存在NY登 入 系 统结 束3.2.1.6 源程序文件说明3.2.1.7 函数说明对密码进行 MD5加密:md5(密码)将用户的账号密码暂时保存等下次登录时可以不用再次输入:
7、saveUserInfo(Activity名,用户名,密码)3.2.1.8 限制条件必须在有网的条件下能使用登录功能。3.2.2 人员管理3.2.2.1 设计图3.2.2.2 功能描述通过手持设备扫描员工的 RFID 号,并在员工工号的输入框手动输入员工工号,并将两条数据上传到服务器中的数据库。将员工工号与 RFID 号相互绑定。3.2.2.3 输入数据变量名 属性 说明number string 员工的员工号(必填)rfid string 员工的 RFID 号(必填)如:E2005032530B0187144085E3在检测数据的有效性是像是判断数据是否为空,当向服务器发送消息时服务器会对数
8、据进行有效性检测,显示判断员工的员工号是否存在,员工的 RFID号是否已被其他工作人员应将绑定。这些数据的获取离不开具有 RFID 扫描功能的手持设备,对员工的 RFID 卡进行扫描获取 RFID 号。才实现此功能3.2.2.4 输出数据变量名 属性 说明number string 员工的员工号rfid string 员工的 RFID 号flag int 数据存储状态的标志位3.2.2.5 业务算法和流程登 录输 入 RFID号 和 员 工 号RFID号 /员 工 号 是 否 为 空 ?提 示 : RFID号 或 员工 号 不 能 为 空NY结 束将 数 据 保 存 到 本 地数 据 库3.2
9、.2.6 数据设计给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计(具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性等。 )3.2.2.7 源程序文件说明package com.blueocean.BlueOceanSource.ui;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.text.TextUtils;import android.uti
10、l.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import cn.pda.hf.Util;import com.blueocean.BlueOceanSource.R;import com.blueocean.BlueOceanSource.entity.BlueOceanEmployee;import com.blueocean.BlueOc
11、eanSource.service.BlueOceanEmployeeService;import com.blueocean.BlueOceanSource.service.UploadService;import com.blueocean.BlueOceanSource.utility.RfidScan;/引入 RFID扫描的开发包/* Created by zhouxingguo on 2015/7/15.*/public class EmployeeActivity extends Activity private Button scan;private Button saveMes
12、sage;/保存员工信息private EditText inputNumber;/员工编号、卡号private TextView inputRfid;/员工 RFID信息private String number;/获取得到的卡号、编号private String rfid;/获取得到的 RFIDprivate RfidScan rfidScan;private String rfidget;Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContent
13、View(R.layout.activity_employee);Util.initSoundPool(this);init();/获取 RFID号和员工工号并保存到本地数据库/初始化控件private void init() inputNumber = (EditText) findViewById(R.id.input_employee_number);inputRfid = (TextView) findViewById(R.id.input_employee_rfid);saveMessage = (Button) findViewById(R.id.save_message_empl
14、oyee);scan=(Button)findViewById(R.id.scan_rfid);MyListener listener = new MyListener(this);saveMessage.setOnClickListener(listener);scan.setOnClickListener(listener);/ datareceive = getIntent().getExtras();/ dataflag=datareceive.getInt(“dataflag“);/ /0代表从主界面跳转, 1代表从扫描接口跳转/ if(dataflag=0)/ inputRfid.
15、setText(“请扫描员工卡号 “);/ else if(dataflag=1)/ rfidget = datareceive.getString(“rfid“);/0代表从员工录入跳转, 1代表从快递跳转/ inputRfid.setText(rfidget);/ private class MyListener implements View.OnClickListener private Context context;public MyListener(Context context) this.context = context;Overridepublic void onClic
16、k(View view) switch (view.getId() case R.id.scan_rfid:rfidScan=new RfidScan();rfidget=rfidScan.scan();if(rfidget!=null)inputRfid.setText(rfidget);elseToast.makeText(getApplicationContext(),R.string.scan_rfid_fail, Toast.LENGTH_SHORT).show();break;case R.id.save_message_employee:/保存员工信息按钮到数据库 ,保存成功之后
17、清空 editText/要保证输入的信息不能全部为空if (!TextUtils.isEmpty(inputNumber.getText() rfid = inputRfid.getText().toString().trim();BlueOceanEmployeeService employeeService = new BlueOceanEmployeeService(context);BlueOceanEmployee boe = new BlueOceanEmployee();int flag = 0;/0表示保存到本地数据库, 1表示本地数据库数据待删除boe.setFlag(fla
18、g);boe.setNumber(number);boe.setRfid(rfid);employeeService.insert(boe);inputNumber.setText(“);inputRfid.setText(“);Toast.makeText(getApplicationContext(), R.string.bind_success, Toast.LENGTH_LONG).show();/开辟一个新线程上传数据new Thread(networkTask).start();Toast.makeText(getApplicationContext(), R.string.sav
19、e_success_toast, Toast.LENGTH_LONG).show(); else Toast.makeText(getApplicationContext(), R.string.employee_rfid_number_not_null, Toast.LENGTH_LONG).show();break;Runnable networkTask = new Runnable() Overridepublic void run() / TODO/ 在这里进行 http request.网络请求相关操作UploadService uploadService = new Upload
20、Service();uploadService.upload(getApplicationContext();3.2.2.8 函数说明大扫描 RFID就成功时发出提示音:Util.initSoundPool(activity 名称);程序的主体:init();开启数据上传线程:networkTask 3.2.2.9 限制条件要实现此功能必须要具备可以扫描 RFID 功能的手持设备,不然无法扫描员工的 RFID 号。3.2.3 池塘管理3.2.3.1 设计图3.2.3.2 功能描述此模块主要实现的功能是扫描池塘的 RFID,并手动输入池塘编号,并将其保存到本地数据库。并等到有网的条件下,将此条信
21、息上传到服务器端的数据库。实现池塘 RFID 号与池塘编号的绑定。3.2.3.3 输入数据变量名 属性 说明number string 池塘编号(必填) 如:育苗池 1rfid string 池塘的 RFID 号(必填) :E2005032530B0187144085E3在检测数据有效性时,需要检测数据是否为空。这些数据的获取离不开具有 RFID 扫描功能的手持设备,对池塘的 RFID 卡进行扫描获取 RFID 号。才实现此功能3.2.3.4 输出数据变量名 属性 说明number string 池塘编号rfid string 池塘的 RFID 号flag Int 数据存储标志位3.2.3.5
22、 业务算法和流程登 录输 入 RFID号 和 员 工 号RFID号 /员 工 号 是 否 为 空 ?提 示 : RFID号 或 员工 号 不 能 为 空NY结 束将 数 据 保 存 到 本 地数 据 库3.2.3.6 数据设计给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计(具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性等。 )3.2.3.7 源程序文件说明package com.blueocean.BlueOceanSource.ui;import android.app.Activity;
23、import android.content.Context;import android.os.Bundle;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import cn.pda.hf.Util;import com.blueocean.Blu
24、eOceanSource.R;import com.blueocean.BlueOceanSource.entity.BlueOceanPond;import com.blueocean.BlueOceanSource.service.BlueOceanPondService;import com.blueocean.BlueOceanSource.service.UploadService;import com.blueocean.BlueOceanSource.utility.RfidScan;/* Created by zhouxingguo on 2015/7/15.*/public
25、class PondActivity extends Activity private Button scanPond;/点击扫描池塘private Button bindPond;/绑定池塘编号和 RFID信息private EditText pondNumber;/池塘编号、卡号private TextView pondRfid;/池塘 RFID信息private String number;/获取得到的卡号、编号private String rfid;/获取得到的 RFIDprivate RfidScan rfidScan;private String rfidget;Overridep
26、ublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_pond);Util.initSoundPool(this);init();/初始化控件private void init() pondNumber = (EditText) findViewById(R.id.input_pond_number);pondRfid = (TextView) findViewById(R.id.input_pond_rfid);sca
27、nPond=(Button)findViewById(R.id.scan_pond_rfid);bindPond = (Button) findViewById(R.id.bind_pond);MyListener listener = new MyListener(this);scanPond.setOnClickListener(listener);bindPond.setOnClickListener(listener);private class MyListener implements View.OnClickListener private Context context;pub
28、lic MyListener(Context context) this.context = context;Overridepublic void onClick(View view) Log.d(“aa“,“进入点击“);switch (view.getId() case R.id.scan_pond_rfid:rfidScan=new RfidScan();rfidget=rfidScan.scan();if(rfidget!=null)pondRfid.setText(rfidget);elseToast.makeText(getApplicationContext(),R.strin
29、g.scan_rfid_fail, Toast.LENGTH_SHORT).show();break;case R.id.bind_pond:/保存员工信息按钮到数据库 ,保存成功之后清空 editText/要保证输入的信息不能全部为空if (!TextUtils.isEmpty(pondNumber.getText() rfid = pondRfid.getText().toString().trim();BlueOceanPondService pondService = new BlueOceanPondService(context);BlueOceanPond boe = new B
30、lueOceanPond();int flag = 0;/0表示保存到本地数据库, 1表示本地数据库数据待删除boe.setFlag(flag);boe.setNumber(number);boe.setRfid(rfid);pondService.insert(boe);pondNumber.setText(“);pondRfid.setText(“);Toast.makeText(getApplicationContext(), R.string.bind_success, Toast.LENGTH_LONG).show();/开辟一个新线程上传数据new Thread(networkTa
31、sk).start();elseToast.makeText(getApplicationContext(), R.string.pond_rfid_number_not_null, Toast.LENGTH_LONG).show();break;Runnable networkTask = new Runnable() Overridepublic void run() / TODO/ 在这里进行 http request.网络请求相关操作UploadService uploadService = new UploadService();uploadService.upload(PondAc
32、tivity.this);3.2.3.8 函数说明当扫描 RFID就成功时发出提示音:Util.initSoundPool(activity 名称);程序的主体:init();开启数据上传线程:networkTask 3.2.3.9 限制条件要实现此功能必须要具备可以扫描 RFID 功能的手持设备,不然无法扫描员工的 RFID 号。3.2.4 育苗管理3.2.4.1 设计图3.2.4.2 功能描述本功能主要是对员工对育苗池的操作进行记录,显示扫描员工 RFID、池塘RFID。还要扫描海产品的批次二维码,当员工对池塘进行操作时,需要记录操作类型,并且记录池塘的温度。经这些信息记录到本地数据库。3
33、.2.4.3 输入数据变量名 属性 说明rfidgetUser string 员工的 RFID (必填) 如:E2005032530B0187144085E3rfidgetPool string 池塘的 RFID 号(必填) 如:E2005032530B017318305B53Batch String 批次二维码(必填) http:/ String 操作类型(必填) ,包括:喂食、换水、测温、入池、投放temp String 温度(非必填) 如:10time String 时间(必填 )如: 201603110922在检测数据有效性时,需要检测 rfidgetUser 与 rfidgetPoo
34、l 两个输入变量是否为空。这些数据的获取离不开具有 RFID 扫描功能及二维码扫描的手持设备,对池塘的 RFID 卡进行扫描并获取 RFID 号并且对池塘上的产品批次二维码进行扫描,获取产品批次二维码。3.2.4.4 输出数据变量名 属性 说明rfidgetUser string 员工的 RFID rfidgetPool string 池塘的 RFID 号Data String 批次二维码,如:getEvenType String 操作类型temp String 温度:10flag int 数据存储标志位3.2.4.5 业务算法和流程登 录输 入 员 工 RFID号 、 池 塘 RFID号 、
35、 批 次 二 维 码 操 作 类 型 、 温 度员 工 RFID号 、 池 塘 RFID号 、 批 次 二 维 码 操 作 类 型 是 否 为 空提 示 : 除 温 度 外 ,其 他 不 能 为 空N Y将 数 据 保 存 到 本 地数 据 库结 束3.2.4.6 数据设计给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计(具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性等。 )3.2.4.7 源程序文件说明package com.blueocean.BlueOceanSource.ui;impo
36、rt android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.os.Handler;import android.text.TextUtils;import android.util.Log;import android.view.View;import a
37、ndroid.view.inputmethod.EditorInfo;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.EditText;import android.widget.Spinner;import android.widget.TextView;import android.widget.Toast;import com.blueocean.BlueOceanSource.R;import c
38、om.blueocean.BlueOceanSource.entity.BlueOceanEvent;import com.blueocean.BlueOceanSource.service.BlueOceanEventService;import com.blueocean.BlueOceanSource.service.UploadService;import com.blueocean.BlueOceanSource.utility.DateDefined;import com.blueocean.BlueOceanSource.utility.RfidScan;import java.
39、util.ArrayList;import java.util.List;import cn.pda.hf.Util;import cn.pda.scan.ScanThread;/*保苗阶段 activity* Created by zhouxingguo on 2015/7/15.*/public class YouthActivity extends Activity private Button scanUser;/扫描员工 rfidprivate Button scanPond;/扫描池塘 RFIDprivate Button saveButton;/保存信息private Butto
40、n scanQrcode;/扫描池塘二维码批次信息private TextView userRfid;/员工 RFID信息private EditText poolRfid;/池子 RFID信息private TextView pondQrcode;/池塘二维码包含的批次信息private EditText temperature;/输入池塘温度private String rfidUser;/获取得到的 RFIDprivate RfidScan rfidScanUser;/rfid扫描 user 类private String rfidgetUser;/获取得到的 userRfidpriva
41、te String rfidPool;/获取得到的池子 RFIDprivate RfidScan rfidScanPool;/rfid扫描池子 类private String rfidgetPool;/获取得到的 poolRfidprivate String batch;/获取池子标签上的批次二维码信息private Spinner spinner;/操作类型下拉控件private List eventList;/操作类型数据源private ArrayAdapter adapter;/适配器适配操作类型列表private String getEventType;private String
42、poolTemp=“;/池子温度,暂时用不到private String data;private BroadcastReceiver receive;private ScanThread scanThread;private Handler mHandler = new Handler() public void handleMessage(android.os.Message msg) if (msg.what = ScanThread.SCAN) data = msg.getData().getString(“data“);Log.d(“acc_data“,data);Util.play
43、(1, 0);pondQrcode.setText(data);Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_youth);Util.initSoundPool(this);init_spinner();init();/* 开启二维码扫描线程* */try scanThread = new ScanThread(mHandler); catch (Exception e) Toast.makeT
44、ext(getApplicationContext(), “serialport init fail“, 0).show();return;scanThread.start();receive = new FunkeyListener();/代码注册广播接收者IntentFilter filter = new IntentFilter();filter.addAction(“android.intent.action.FUN_KEY“);registerReceiver(receive, filter);Util.initSoundPool(getApplication();private c
45、lass FunkeyListener extends BroadcastReceiver Overridepublic void onReceive(Context context, Intent intent) boolean defaultdown=false;int keycode = intent.getIntExtra(“keycode“, 0);boolean keydown = intent.getBooleanExtra(“keydown“, defaultdown);if(keycode = 134 /初始化控件private void init() userRfid =
46、(TextView)findViewById(R.id.input_baomiao_user);poolRfid = (EditText)findViewById(R.id.input_baomiao_pond);pondQrcode = (TextView)findViewById(R.id.input_baomiao_pond_qrcode);temperature = (EditText)findViewById(R.id.input_temperature);temperature.setInputType(EditorInfo.TYPE_CLASS_PHONE);scanUser =
47、 (Button) findViewById(R.id.baomiao_scan_employee);scanPond = (Button) findViewById(R.id.baomiao_scan_pond);scanQrcode = (Button) findViewById(R.id.baomiao_pond_qrcode);/扫描池塘二维码批次信息saveButton = (Button) findViewById(R.id.save_button1);MyListener listener = new MyListener(this);scanUser.setOnClickLis
48、tener(listener);scanPond.setOnClickListener(listener);scanQrcode.setOnClickListener(listener);saveButton.setOnClickListener(listener);private void init_spinner()spinner=(Spinner)findViewById(R.id.action_spinner);/定义数据源eventList=new ArrayList();eventList.add(“喂食“);eventList.add(“换水“);eventList.add(“测
49、温“);eventList.add(“入池“);eventList.add(“投放“);adapter=new ArrayAdapter(this, R.layout.simple_spinner_item,eventList);adapter.setDropDownViewResource(R.layout.spinner_checked_text);spinner.setAdapter(adapter);/spinner监听器获取选择内容spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() Overri