软件规划项目工程详细设计资料文档材料模板.doc
. 文档编文档编 号号 版版 本本 A1密级密级商密 A 项目名项目名 称称 XxXx 系统系统研发生产中心研发生产中心 项目来项目来 源源 QR-RD-022(Ver1.2) XXXXXX 系统系统 详细设计说明书详细设计说明书 (内部资料 请勿外传) 编编 写:写: 日日 期:期: 检检 查:查: 日日 期:期: 审审 核:核: 日日 期:期: 批批 准:准: 日日 期:期: XX 公公司司 . 版权所有版权所有 不得复制不得复制 文档变更记录文档变更记录 序号序号变更(变更(+/-)说明)说明作者作者版本号版本号日期日期批准批准 1 2 . 目 录 1. 引言 .4 1.1 编写目的和范围 .4 1.2 术语表 .4 1.3 参考资料 .4 1.4 使用的文字处理和绘图工具 .4 2. 全局数据结构说明 .5 2.1 常量 .5 2.2 变量 .5 2.3 数据结构 .5 3. 模块设计 .5 3.1 用例图 .5 3.2 功能设计说明 .5 3.2.1 模块 1 .5 3.2.2 模块 2 .6 4. 接口设计 .7 4.1 内部接口 .7 4.2 外部接口 .7 4.2.1 接口说明 .7 4.2.2 调用方式 .8 5. 数据库设计 .8 6. 系统安全保密设计 .8 6.1 说明 .8 6.2 设计 .8 6.2.1 数据传输部分 .8 6.2.2 IP 过滤分部.8 6.2.3 身份验证部分 .8 7. 系统性能设计 .9 8. 系统出错处理 .9 . . 1. 引言 1.1 编写目的和范围 说明写这份详细设计说明书的目的。 本详细设计说明书编写的目的是说明程序模块的设计考虑,包括程序描述、 输入/输出、算法和流程逻辑等,为软件编程和系统维护提供基础。本说明书的 预期读者为系统设计人员、软件开发人员、软件测试人员和项目评审人员。 1.2 术语表 定义系统或产品中涉及的重要术语,为读者在阅读文档时提供必要的参考 信息。 序号术语或缩略语说明性定义 1PM Project Manager,项目经理 2 1.3 参考资料 列出有关资料的名称、作者、文件编号或版本等。参考资料包括: a需求说明书、架构设计说明书等; b本项目的其他已发表的文件; c引用文件、资料、软件开发标准等。 资料名称作者文件编号、版本资料存放地 点 1.4 使用的文字处理和绘图工具 文字处理软件:word office 绘图工具: Visio . 2. 全局数据结构说明 本章说明本程序系统中使用的全局数据常量、变量和数据结构。 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.1.2 功能描述 此模块的主要功能是登录验证功能,保证程序的安全性问题。用户需要验 证用户和密码是否正确才能进行下一部操作。 3.2.1.3 输入数据 变量名类型说明 . userNameString用户名(必填) passwordString密码(必填) STOPSPLASHint开场动画标志位 SPLASHTIMElong消息发送延迟时间 LOGINBUTTONint 登录按钮是否能够点击 标志位 3.2.1.4 输出数据 字段说明 code结果,0 表示失败,1 表示成功,2 表示该养殖场地 不存在,3 表示该 Rfid 已存在 userName用户名 PassWord密码 userRoleld用户权限,1 代表系统用户,2 代表人事部,3 代表 育苗场,4 代表生产部,5 代表加工厂,6 代表市场 部,7 代表捕捞管理员 表现形式为: code=1 . 3.2.1.5 流程图 登录 输入用户名和密码 用户名/密码是否为空? 用户名是否正确? 提示:账号或密码 不能为空 N 提示:用户名不存 在 Y N Y 用户名是否正确? 提示:用户名不存 在 N Y 登入系统 结束 3.2.1.6 源程序文件说明 3.2.1.7 函数说明 对密码进行 MD5 加密:md5(密码) 将用户的账号密码暂时保存等下次登录时可以不用再次输入: saveUserInfo(Activity 名,用户名,密码) 3.2.1.8 限制条件 必须在有网的条件下能使用登录功能。 . 3.2.2 人员管理 3.2.2.1 设计图 3.2.2.2 功能描述 通过手持设备扫描员工的 RFID 号,并在员工工号的输入框手动输入员工 工号,并将两条数据上传到服务器中的数据库。将员工工号与 RFID 号相互绑 定。 3.2.2.3 输入数据 变量名属性说明 numberstring 员工的员工号(必填) rfidstring员工的 RFID 号(必填)如: E2005032530B0187144085E3 在检测数据的有效性是像是判断数据是否为空,当向服务器发送消息时服 务器会对数据进行有效性检测,显示判断员工的员工号是否存在,员工的 RFID 号是否已被其他工作人员应将绑定。 这些数据的获取离不开具有 RFID 扫描功能的手持设备,对员工的 RFID 卡 进行扫描获取 RFID 号。才实现此功能 3.2.2.4 输出数据 变量名属性说明 numberstring 员工的员工号 . rfidstring员工的 RFID 号 flagint 数据存储状态的标志位 3.2.2.5 业务算法和流程 登录 输入RFID号和员工号 RFID号/员工号是否为空? 提示:RFID号或员 工号不能为空 N Y 结束 将数据保存到本地 数据库 3.2.2.6 数据设计 给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体 数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计 (具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性 等。 ) 3.2.2.7 源程序文件说明 packagepackage com.blueocean.BlueOceanSource.ui; importimport android.app.Activity; . importimport android.content.Context; importimport android.os.Bundle; importimport android.text.TextUtils; importimport android.util.Log; importimport android.view.View; importimport android.widget.Button; importimport android.widget.EditText; importimport android.widget.TextView; importimport android.widget.Toast; importimport cn.pda.hf.Util; importimport com.blueocean.BlueOceanSource.R; importimport com.blueocean.BlueOceanSource.entity.BlueOceanEmployee; importimport com.blueocean.BlueOceanSource.service.BlueOceanEmployeeService; importimport com.blueocean.BlueOceanSource.service.UploadService; importimport com.blueocean.BlueOceanSource.utility.RfidScan;/引入 RFID 扫描 的开发包 /* * Created by zhouxingguo on 2015/7/15. */ publicpublic classclass EmployeeActivity extendsextends Activity privateprivate Button scanscan; privateprivate Button saveMessagesaveMessage;/保存员工信息 privateprivate EditText inputNumberinputNumber;/员工编号、卡号 privateprivate TextView inputRfidinputRfid;/员工 RFID 信息 privateprivate String numbernumber;/获取得到的卡号、编号 privateprivate String rfidrfid;/获取得到的 RFID privateprivate RfidScan rfidScanrfidScan; privateprivate String rfidgetrfidget; Override publicpublic voidvoid onCreate(Bundle savedInstanceState) supersuper.onCreate(savedInstanceState); setContentView(R.layout.activity_employeeactivity_employee); Util.initSoundPool(thisthis); init();/获取 RFID 号和员工工号并保存到本地数据库 . /初始化控件 privateprivate voidvoid init() inputNumberinputNumber = (EditText) findViewById(R.id.input_employee_numberinput_employee_number); inputRfidinputRfid = (TextView) findViewById(R.id.input_employee_rfidinput_employee_rfid); saveMessagesaveMessage = (Button) findViewById(R.id.save_message_employeesave_message_employee); scanscan=(Button)findViewById(R.id.scan_rfidscan_rfid); MyListener listener = newnew MyListener(thisthis); saveMessagesaveMessage.setOnClickListener(listener); scanscan.setOnClickListener(listener);/ datareceive = getIntent().getExtras(); / dataflag=datareceive.getInt("dataflag"); / /0 代表从主界面跳转,1 代表从扫描接口跳转 / if(dataflag=0) / inputRfid.setText("请扫描员工卡号"); / else if(dataflag=1) / rfidget = datareceive.getString("rfid");/0 代表从员工 录入跳转,1 代表从快递跳转 / inputRfid.setText(rfidget); / privateprivate classclass MyListener implementsimplements View.OnClickListener privateprivate Context contextcontext; publicpublic MyListener(Context context) thisthis.contextcontext = context; Override publicpublic voidvoid onClick(View view) switchswitch (view.getId() casecase R.id.scan_rfidscan_rfid: rfidScanrfidScan=newnew RfidScan(); rfidgetrfidget=rfidScanrfidScan.scan(); ifif(rfidgetrfidget!=nullnull) . inputRfidinputRfid.setText(rfidgetrfidget); elseelse Toast.makeText(getApplicationContext(),R.string.scan_rfid_failscan_rfid_fail, Toast.LENGTH_SHORTLENGTH_SHORT).show(); breakbreak; casecase R.id.save_message_employeesave_message_employee:/保存员工信息按钮到 数据库,保存成功之后清空 editText /要保证输入的信息不能全部为空 ifif (!TextUtils.isEmpty(inputNumberinputNumber.getText() rfidrfid = inputRfidinputRfid.getText().toString().trim(); BlueOceanEmployeeService employeeService = newnew BlueOceanEmployeeService(contextcontext); BlueOceanEmployee boe = newnew BlueOceanEmployee(); intint flag = 0;/0 表示保存到本地数据库, 1 表示 本地数据库数据待删除 boe.setFlag(flag); boe.setNumber(numbernumber); boe.setRfid(rfidrfid); employeeService.insert(boe); inputNumberinputNumber.setText(""""); inputRfidinputRfid.setText(""""); Toast.makeText(getApplicationContext(), R.string.bind_successbind_success, Toast.LENGTH_LONGLENGTH_LONG).show(); /开辟一个新线程上传数据 newnew Thread(networkTasknetworkTask).start(); Toast.makeText(getApplicationContext(), R.string.save_success_toastsave_success_toast, Toast.LENGTH_LONGLENGTH_LONG).show(); elseelse Toast.makeText(getApplicationContext(), R.string.employee_rfid_number_not_nullemployee_rfid_number_not_null, Toast.LENGTH_LONGLENGTH_LONG).show(); . breakbreak; Runnable networkTasknetworkTask = newnew Runnable() Override publicpublic voidvoid run() / TODOTODO / 在这里进行 http request.网络请求相关操作 UploadService uploadService = newnew UploadService(); uploadService.upload(getApplicationContext(); ; 3.2.2.8 函数说明 大扫描 RFID 就成功时发出提示音:Util.initSoundPool(activityactivity 名称名称); 程序的主体:init(); 开启数据上传线程:networkTask 3.2.2.9 限制条件 要实现此功能必须要具备可以扫描 RFID 功能的手持设备,不然无法扫描 员工的 RFID 号。 . 3.2.3 池塘管理 3.2.3.1 设计图 3.2.3.2 功能描述 此模块主要实现的功能是扫描池塘的 RFID,并手动输入池塘编号,并将其 保存到本地数据库。并等到有网的条件下,将此条信息上传到服务器端的数据 库。实现池塘 RFID 号与池塘编号的绑定。 3.2.3.3 输入数据 变量名属性说明 numberstring 池塘编号(必填)如:育苗池 1 rfidstring池塘的 RFID 号(必填) . :E2005032530B0187144085 E3 在检测数据有效性时,需要检测数据是否为空。 这些数据的获取离不开具有 RFID 扫描功能的手持设备,对池塘的 RFID 卡 进行扫描获取 RFID 号。才实现此功能 3.2.3.4 输出数据 变量名属性说明 numberstring 池塘编号 rfidstring池塘的 RFID 号 flagInt数据存储标志位 3.2.3.5 业务算法和流程 登录 输入RFID号和员工号 RFID号/员工号是否为空? 提示:RFID号或员 工号不能为空 N Y 结束 将数据保存到本地 数据库 . 3.2.3.6 数据设计 给出本程序中的局部数据结构说明,包括数据结构名称,功能说明,具体 数据结构说明(定义、注释设计、取值)等。相关数据库表,数据存储设计 (具体说明需要以文件方式保存的数据文件名、数据存储格式、数据项及属性 等。 ) 3.2.3.7 源程序文件说明 packagepackage com.blueocean.BlueOceanSource.ui; importimport android.app.Activity; importimport android.content.Context; importimport android.os.Bundle; importimport android.text.TextUtils; importimport android.util.Log; importimport android.view.View; importimport android.widget.Button; importimport android.widget.EditText; importimport android.widget.TextView; importimport android.widget.Toast; importimport cn.pda.hf.Util; importimport com.blueocean.BlueOceanSource.R; importimport com.blueocean.BlueOceanSource.entity.BlueOceanPond; importimport com.blueocean.BlueOceanSource.service.BlueOceanPondService; importimport com.blueocean.BlueOceanSource.service.UploadService; importimport com.blueocean.BlueOceanSource.utility.RfidScan; /* * Created by zhouxingguo on 2015/7/15. */ publicpublic classclass PondActivity extendsextends Activity privateprivate Button scanPondscanPond;/点击扫描池塘 privateprivate Button bindPondbindPond;/绑定池塘编号和 RFID 信息 privateprivate EditText pondNumberpondNumber;/池塘编号、卡号 privateprivate TextView pondRfidpondRfid;/池塘 RFID 信息 privateprivate String numbernumber;/获取得到的卡号、编号 privateprivate String rfidrfid;/获取得到的 RFID privateprivate RfidScan rfidScanrfidScan; privateprivate String rfidgetrfidget; . Override publicpublic voidvoid onCreate(Bundle savedInstanceState) supersuper.onCreate(savedInstanceState); setContentView(R.layout.activity_pondactivity_pond); Util.initSoundPool(thisthis); init(); /初始化控件 privateprivate voidvoid init() pondNumberpondNumber = (EditText) findViewById(R.id.input_pond_numberinput_pond_number); pondRfidpondRfid = (TextView) findViewById(R.id.input_pond_rfidinput_pond_rfid); scanPondscanPond=(Button)findViewById(R.id.scan_pond_rfidscan_pond_rfid); bindPondbindPond = (Button) findViewById(R.id.bind_pondbind_pond); MyListener listener = newnew MyListener(thisthis); scanPondscanPond.setOnClickListener(listener); bindPondbindPond.setOnClickListener(listener); privateprivate classclass MyListener implementsimplements View.OnClickListener privateprivate Context contextcontext; publicpublic MyListener(Context context) thisthis.contextcontext = context; Override publicpublic voidvoid onClick(View view) Log.d("aa""aa"," "进入点击进入点击" "); switchswitch (view.getId() casecase R.id.scan_pond_rfidscan_pond_rfid: rfidScanrfidScan=newnew RfidScan(); rfidgetrfidget=rfidScanrfidScan.scan(); ifif(rfidgetrfidget!=nullnull) . pondRfidpondRfid.setText(rfidgetrfidget); elseelse Toast.makeText(getApplicationContext(),R.string.scan_rfid_failscan_rfid_fail, Toast.LENGTH_SHORTLENGTH_SHORT).show(); breakbreak; casecase R.id.bind_pondbind_pond:/保存员工信息按钮到数据库,保存成 功之后清空 editText /要保证输入的信息不能全部为空 ifif (!TextUtils.isEmpty(pondNumberpondNumber.getText() rfidrfid = pondRfidpondRfid.getText().toString().trim(); BlueOceanPondService pondService = newnew BlueOceanPondService(contextcontext); BlueOceanPond boe = newnew BlueOceanPond(); intint flag = 0;/0 表示保存到本地数据库, 1 表示 本地数据库数据待删除 boe.setFlag(flag); boe.setNumber(numbernumber); boe.setRfid(rfidrfid); pondService.insert(boe); pondNumberpondNumber.setText(""""); pondRfidpondRfid.setText(""""); Toast.makeText(getApplicationContext(), R.string.bind_su