摘 要
目前国内使用和发展的MIS 平台模式大体有两种:客户机/服务器(Client/Server,简称C/S)模式和Web浏览器/服务器(Browser/Server,简称B/S)模式。利用某个开发平台结合C/S模式实现一个信息管理系统,在目前还是比较常见的。访问数据库的技术主要还是采用ODBC(Open Database Connectivity)。
文中重点讨论了一个企业办公自动化系统的设计和实现过程。在此之前介绍了此次开发过程中用到的相关技术,较详细的介绍了该系统的总体功能结构,简洁明了的阐述了本系统的功能。
开始部分首先简单的叙述了国内外办公自动化系统的过去,现在和未来。接着介绍了开发本系统所用到部分技术的相关概念和术语,着重分析了面向对象技术和java语言的特点,以及表明了所用技术在本系统中的作用和意义。之后详细地描述了整个系统的功能,然后通过对某医药公司的内部组织结构和业务过程的分析,在此基础上给出了系统的数据流程图和实体关系图,同时也全面地介绍了此次利用Java结合SQL 2000数据库开发一个企业办公自动化系统的设计和实现过程。
利用面向对象的技术建立各种模型对该系统进行分析和实现。在众多面向对象分析方法中,建立了实体关系模型图(E-R图)。该模型图主要为系统的数据库设计服务。
最后,从数据库安全方面说明了该办公自动化系统的安全性。
关键词:办公自动化,数据库,面向对象
Abstract
Key words: Office Automation, Database, Object-Oriented
目 录
摘 要……………………………………………………………………Ⅰ
ABSTRACT………………………………………………………………Ⅱ
1 绪论……………………………………………………………………………
- 1办公自动化的基本定义和产生背景……………………………………..
1.2 办公自动化的处理范围…………………………………………………..
1.3 办公系统化在国内的发展…………………………………………………
2 工作流技术…………………………………………………………………….
2.1 工作流与流程建模………………………………………………………..
- 2工作流与流程分析………………………………………………………..
3 面向对象技术………………………………………………………………..
3.1 面向对象技术的基本概念和术语…………………………………………
3.2 面向对象的思想方法………………………………………………………
3.3 面向对象的分析简介……………………………………………………..
4 Java概述……………………………………………………………………..
4.1 Java的字节码………………………………………………………………..
5 系统详细设计………………………………………………………………….
5.1 系统目标…………………………………………………………………….
5.2 系统功能图………………………………………………………………..
5.3 系统功能模块设计…………………………………………………………
5.4 系统功能实现………………………………………………………………
5.4.1 用户登陆模块创建………………………………………………………
5.4.2 用户管理功能的实现……………………………………………………
5.4.3 药品信息设置功能的实现………………………………………………
5.4.4 数据库设计………………………………………………………………
6 安全性………………………………………………………………………..
7 结束语………………………………………………………………………
致 谢……………………………………………………………………………..
参考文献………………………………………………………………………..
1 绪 论
随着经济的快速发展,世界经济进入整体化,企业的发展突飞猛进,随着企业的大规模发展,企业内部的各种事务也会日益的复杂,工作量也会加大。因此利用先进现代科学技术和先进的管理理念来开发一个管理系统来管理企业的事物是非常必要的。
目前市面上办公自动化系统的特点是以办文处理、档案管理为核心的办公管理系统 。
其主要的功能包括收文管理、发文管理、会议管理、档案管理等内容。系统的高度集成,基于web,知识化和流程化将是办公自动化大发展方向。
1.1 办公自动化的基本定义和产生背景
办公自动化(OA, Office Automation),是70年代中期发达国家为解决办公业务量急剧增加企业生产率产生巨大影响问题的背景下,发展起来的一门综合性技术。他的基本任务是利用先进的科学技术,是人们借助各种解决对一部分办公业务的处理,达到提高生产效率、工作效率和质量,方便管理和决策的目的。OA的知识领域覆盖了行为科学、管理科学、社会科学、系统工程学等学科,并且OA体现了多学科的相互交叉、相互渗透性,所以的OA的应用是企业管理现代化的标志之一。
1.2 办公自动化的处理范围
OA的核心问题是如何提高日常的办公效率问题。因此人们日常工作的所有内容可以归入OA处理的范围,如文字处理、文件眷写、传真、申请审批、办公用品、办文管理、会议管理、资料管理、档案管理、客户管理、订货销售、库存管理、生产计划、器材需求、技术管理、质量管理、成本、财务计算、劳资、人事管理等等,那么这些都是办公软件的处理范围。
OA的承载过多,以至无法定义和处理这么丰富的内涵的名词,由于他如此耳熟,更换一个名词的成本太高,人们现在还不得不和这个丰富内涵的变色龙一样的名词打交道,并且通过上下文来揣摩他的确切含义。在这种情况下就迫切需要建立一个交流的基础。
在处理不同的名词的办法就是在OA 之前加上范围修饰和在之后加上附加名词来界定它们。同时把提高工作效率的电子设备,如打印机、复印机、传真机,称之为办公自动化设备。
对于提高日常工作效率的软硬件系统,称之为广义的办公自动化软件系统。这个名词仍然犯着上面的毛病。但是这种认识已经进一步了,如果人们在交流时已经明确自己谈的OA所谓何物(即加上了适当的前置语和后置语),那么Lotus(电子邮件厂商)和Xerox复印机厂商之间的交流是完全可能的。
如果再看看世面上的各种软件系统,就回发现很多事物性的工作已经被包含,并且从来不让人觉得自己是一个办公自动化软件系统。如果硬要把这些东西归为OA系统软件,理论上当然非常完美并且包容力非常强,因为无论以后有什么更好的发明,都是办公自动化的范围。这样就对讨论问题没有丝毫好处。因为这个时候还是不明确具体的含义是什么,根据目前的名称只能称为某某系统。在日常事物中,有许许多多都是和这些系统相关的。然而仍有一些事物是目前的系统处理不了或根本就不处理的。这些事物一般都是非结构化的内容譬如文件、会议、档案、日程安排和办公事物等,就称之为狭义的办公自动化软件系统。这就是目前世面上称之为办公自动化的软件系统所处理的内容。
1.3 办公自动化在国内的发展
中国的办公自动化起源于政府的公文和档案管理。由于计划经济体制的影响,政府对企业的管理出了依靠法律、法规之外,还有大量的行政指令和指示。企业在进行许多决策的时候,也经常学要向主管的政府部门请示汇报。另外,当时的政府官员和企业领导经常是难以分辨的,并且存在着比较严格的对应关系,即企业领导和政府官员行政级别挂钩,因此在企业应用红头文件就比较自然。
此时的办公自动化系统的特点:以办文处理、档案管理为核心的办公管理系统 。其实办公就是办文。其主要的功能包括:
收文管理、发文管理、会议管理、档案管理等内容。管理的中心内容是依靠国家的公文管理办法和档案管理法规以及各部委或者行业的档案管理的需要存档的文件以及企业内部的其他文件等。
各地政府机关和企业主管部门一般根据国务院下发的关于办文管理的行政法规制作出相应的执行措施,基本保持系统内的一致性,规范了办公中的办文处理和档案管理流程。同时也起到了内部的信息沟通、上行下达以及和上级主管部门的沟通作用。因为采用电脑和网络进行处理,提高了工作效率,减少了纸张的浪费。
尽管如此,由于大部分企业的组织架构都有明显的层次结构,传统的办文程序,从文件起草、审阅、会签、签发、下达到归档、借阅等各个环节,存在流程复杂,流程时间长,导致办公效率低,决策缓慢等问题。
由于在机构和流程上很难作很大的改动,因此解决之道就是采用先进的计算机和网络技术,不仅将办文内容电子化,而且实现整个办文过程电子化,从根本上改变了传统的工作模式。办文者可随时了解文件到哪里,办文的情况怎样,对逾期没有办理的文件,可以自动催办,文件办理完毕,可以自动归档,归档后的文件可供借阅和调阅等,消除手工工作过程中的存在流转时间长,文件去向不明以及不便跟踪等问题。
在此种情况下,办公自动化做的所有工作不过是将手工工作半岛计算机网络上,并利用了计算机技术的一些先进特点,却没有增加任何先进的管理理念和方法。另外办公自动化的处理的信息范围是在过于有限,仅仅处理一些公文就可以称为办公自动化了吗?仔细观察市面上的办公自动化产品,所提供的附加的深度和广度也是非常让人失望的。这就是国内目前的办公自动化系统所处的基本现实和困境。这也是客户对办公自动化不满意的焦点所在。
面对这样的困境,人们会问:客户究竟需要什么样的办公自动化系统?办公自动化会发展到哪里去呢?
实际上,这是两个相关的问题,解决方法的获得必须要更高的高度,更宽阔的视野来看待办公自动化以及其他系统之间的关系。同时也不能忽略技术的影响。
只要把目光移开办公自动化系统,就不难会发现,在企业除了办公自动化系统之外,还有财务、库存、生产、销售、人力等管理系统。由于大量的信息孤岛式的建设,它们之间很少能够紧密协调起来。就前端来说,人们经常需要进行退出一个系统然后进入另一个系统,并且发现数据常常不一致,可以比较肯定的说,目前中国具有信息系统的企业绝大多数都是这种情况。他们往往具有多个供应商提供的多个系统,但很少集成。也有少数企业采用ERP套件,集成了其中的一部分,全部集成的企业凤毛麟角,也可能正在产生中。
对于他们后台数据的完全集成,由于集成的工作量和供应数量成非线性增长(n*(n-1)),在一定时期内,人们几乎不报信心。于是希望能够由前台(界面)集成这些信息,如果能过从办公自动化系统获得所需的全部信息,就太好不过了。办公自动化在这里变成了一个粘合剂,把所有的系统集成在一起。使人们感觉到是一个整体,虽然还有遗憾,总算进一步了。
集成,是第一点需求。从目前用户的使用技能和接受程度以及系统的维护成本考虑,WEB界面最容易接受。另外从集成方面来讲,必须采用人人支持的web标准如HTML,JavaScript,Activex,IIOP,DHTML,XML,JAVA等才能在一个截面下容纳,否则技术难度就会导致集成不可能实现。
完全基于web,这是第二点要求。对于流程,熟悉办公自动化的人就会想起收发文的流程。那是非常完善的、符合层级结构的、效率低下的流程。对于如何优化流程,如果宥于原来的思维模式和知识领域,就无法获得更多。必须基于现代的流程思想对目前的业务流程进行重组。
流程优化的,这是第三点要求。进入知识经济时代,人人都是知识工作者,要求办公自动化系统必须具有知识内涵,或者说是基于知识的。提供知识管理所需的最基本的IT工具,知识存储库和知识交流场所,更高级的意义上提供,基于知识的岗位要求和评估体系。
基于知识的,这是第四点要求。总之人们要求的办公自动化是和其他应用系统紧密集成的,完全采用web技术的,流程优化以及基于知识的管理的办公管理系统。根据这个需就不难发现目前的市场上很少有这样的产品。在今后相当一段时间内,目前的办公自动化还会存在着,但已经日暮西山。当办公自动化系统已经符合上述需求的时候,她已经成为一个企业雇员门户(EEP),它是更广义的企业信息门户(EIP)的一个组成部分。这也是应用系统的发展方向。
2工作流技术
2.1工作流与流程建模
2.2工作流技术与流程分析
3面向对象技术
面向对象(Object-Oriented)方法学的出发点和基本原则,是尽可能能模拟人类习惯的思维方式,使开发软件的方法尽量尽可能接近人类认识世界解决问题的方法与过程,也就是描述问题的问题空间(也称为问题域)在结构上尽量可能一致。
客观世界的问题都是客观世界中的实体及实体间相互间的关系构成的,人们把客观世界中的实体抽象为问题域中的对象(Object),因为所要解决问题的特殊性,因此,对象是不固定的,一个雇员可以看做一个对象,一家公司也可以看作一个对象,到底应该把什么抽象作为对象,就要有所要解决的问题决定。
3.1向对象技术的基本感念和术语
对象(Object),在应用领域中有意义的,如所要解决问题有关系的任何事物都可以看作对象,她既可以是物理的实体的抽象,也可以是认为的概念,或者是任何有明确边界和意义的东西。
类(Class),现实世界中存在的客观事物有些是彼此相似的,人们习惯把他们归为一类,在计算机软件中,“类”就是对有相数据和相同操作的一组相似对象的定义,也就是说,类是有相同属性和行为的一个或多个对象的描述,通常在这种描述中也包括得怎么要创建该类的新对象的说明。
实例(Instance),实例就是有某个特定的类所描述的一个具体的对象。
消息(Message),消息,就是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明,通常,一个消息由下述三部分组成:接收消息的对象;消息选择符(也叫消息名);零个或多个变元。
方法(Method),方法就是对多能执行的操作,也是类中所定义的服务
继承(Inheriance)。继承是只能直接获得已有的性质和特征,也不必重复他们。
多态性(Polymorphism),多态是指子类对象可以像父类对象那样使用,同样的消息既可以发给父类对象也可以发给子类对象。
重载(Overloading),函数重载是指在同一个领域内若干个参数特征不同的函数可以使用相同的函数名字;运算符重载是指同一个运算符可以施加\于不同类型的操作数上面。
3.2面向对象思想方法
身边的一切事物,一名职工,一个公司,一个窗口,一所学校,一个国家或者整个地球都是对象。一个对象有其自身的特点和状态,并具有与外界联系沟通的渠道和能力。这里,给出对象OBJ的定义形式为:OBJ::=〈ID,MS,DS,MI〉其中ID是对象的标识;MS是对象的操作集合;DS是对象的资料集合;MI是对象的消息集合,也称对外接口或协议。
在设计和实现一个客观的系统时,应该照人们在现实世界中对客观事物的思维方式进行描述,设计尽可能直接、自然地表现问题的求解。面向对象方法所追求的是现实问题空间与软件系统解空间的近似和直接模拟,它希望人们用最小的代价、最大限度利用软件系统来求解问题,将客观世界的对象映像到面向对象的解空间是面向对象方法的核心内容。
3.3 面向对象分析简介
面向对象分析(OOA)的关键,是识别出问题域内的对象,并分析他们相互间的关系,最终建立起问题域的简洁,精确和可理解的正确模型。在用面向对象观点建立起的三个模型中,对象模型是最基本,最重要,最核心的。
面向对象分析,就是抽取和整理用户需求并建立问题域精确模型的过程。在分析需求称述的过程中,需要反复多次的与用户协商,讨论,交流信息,还应该调研,了解现有的类似的系统。
面向对象分析方法是建立在对象及其属性、类属及其成员、整体及其本分这些基本概念的基础上。
OOA的方法层出不穷,其中比较流行的有Coad & Yourdon的五层次分析方法和四组件方法,Booch的静态和动态的描述方法以及Rumbaugh的三种模型描述法等等,这些方法都有各自的特点。Coad & Yourdon的方法简单实用,描述能力强;Booh的方法比较全面,动态静态描述兼而有之。
对象—类层。该层反映了待开发系统的基本构造块。对象都是现实世界中应用领域概念的抽象,这一层是整个模型的基础。图符的外层边界表示实力边界,实际上他表示对象是非空的。而图符的内层边界则表示类边界。有时可以定义一些不当作程序块来实现的对象,即只有类边界而没有实例边界。在默写情况下,定义这些对象是很有用的。这就是所谓的模板类或抽象类。模板类可以为结成较高级的集合体提供一条方便的途径。
属性层。对象的属性和实例连接共同组成了OOA模型的属性层。对象所存储的资料称为对象的属性。类的实例间相互约束,它们必须遵从应用领域的某些限制条件或事物规则。例如,当某工作人员信息取消后,则通讯录中相应的信息也该被取消,这可能是一项事物规则。这些约束被称为实例连接。
服务层。对象的服务和消息通信组成了OOA模型的服务层。对象所做的工作就是所谓的服务或方法。系统的不同对象都分别执行一定的工作或功能,它们之间通过消息通信,即所谓的协同。对象饿服务及对象实例之间的消息通信共同组成了OOA模型的服务层。
结构层。该层负责捕捉特定应用领域中的结构关系。泛化—特化结构获得类及成员组织,有助于刻画问题空间的类—成员层次,它通过搜集公共特性并把这些特性扩充到特例中来显示现实世界事件的通用性及专用性。整体—部分结构表达了人类的一种基本组织方式,即自然的整体和部分的结构关系,从而把一些部分的聚合构造成整体。
主题层。相当于全局系统的子系统或子模型。由于OAA 模型的结构庞大而复杂,因而众多的对象有时很难处理。于是,可以把对象归到各个主题层中,可以把有关的对象用一个边框框起来加以实现。
4 Java概述
Java总是和C++联系在一起,而C++则是从C语言派生而来的,所以Java语言继承了这两种语言的大部分特性。Java的语法是从C继承的,Java许多面向对象的特性受到C++的影响。事实上,Java中几个自定义的特性都来自于或可以追溯
到它的前驱。而且,Java语言的产生与过去30年中计算机语言细致改进和不断不断发展密切相关。每一次语言设计的革新都是因为先前的语言不能解决目前遇到的基本问题而引起。
Java可以产生跨平台运行的程序。字节码可以在提供Java虚拟机(JVM)的任何一种系统上被解释执行。
Java设计者考虑的一个主要问题是程序代码的持久性和可移植性。程序员面临的一个主要问题是,不能保证今天编写的程序明天能否在同一台机器上顺利运行。操作系统升级、处理器升级以及核心系统资源的变化,都可能导致程序无法继续运行。Java设计者对这个问题做过多种尝试,Java虚拟机(JVM)就是试图解决这个问题的。他们的目标是“只要写一次程序,在任何地方、任何时间该程序永远都能运行”。在很大程度上,Java实现了这个目标。
Java的核心是面向对象编程。事实上,所有的Java程序都是面向对象的,你别无选择。这一点与C++不同,因为在那里你可以选择是否面向对象编程。面向对象编程与Java密不可分。
在Java中,一个源程序文件被称为一个编译单元。它是一个包含一个或多个类定义的文本文件。Java编译器要求源程序文件使用.java文件扩展名。
4.1Java的字节码
Java解决安全性和可移植性的关键在于Java编译器的输出并不是可执行的代码,而是bytecode。字节码是一套设计用来在Java运行时系统下执行的高度优化的指令集,该Java运行时系统称为Java虚拟机(JavaVirtual Machine,JVM)。在其标准形式下,JVM 就是一个字节码解释器。这可能有点让人吃惊,因为像C++之类语言的编译结果是可执行的代码。事实上,出于对性能的考虑,许多现代语言都被设计为编译型,而不是解释型。然而,正是通过JVM运行Java程序才有助于解决在Internet上下载程序的主要问题。这就是Java输出字节码的原因。
将一个Java程序翻译成字节码,有助于它更容易地在一个大范围的环境下运行程序。原因非常直接:只要在各种平台上都实现Java虚拟机就可以了。在一个给定的系统中,只要系统运行包存在,任何Java程序就可以在该系统上运行。记住:尽管不同平台的Java虚拟机的细节有所不同,但它们都解释同样的Java字节码。如果一个Java程序被编译为本机代码,那么对于连接到Internet上的每一种CPU类型,都要有该程序的对应版本。这当然不是一个。
5系统的详细设计
面对企业办公自动化的现状和发展趋势,应孝感药都医药公司的要求,本小组有针对性的为该公司开发一套办公自动化系统,借助该自动化系统,提高了办公过程的自动化程度,也提高员工日常工作效率,减少了纸张浪费和规范管理层的工作。
一套软件,首先要能够满足用户的使用要求,这是基本条件。诚然,经过这么多年的发展,时常上的进销存软件的功能都已经非常完整,可以说基本上可以满足一般企业的仓库管理要求。
了解到该医药公司的业务流程特点,结合现代企业的先进管理思想和模式,采用了Client/Server的可靠、高效系统作为平台,该系统包括了七大功能模块:系统管理、基本信息设置、进货信息管理、售货信息管理、库存信息管理、财务信息管理、系统帮助。
开发软件使用Jbuilder开发工具,SQL2000数据库系统作为后台数据库,整体系统采用传统的C/S(Client/Server,客户端/服务器)够架。在客户端为用户提供了一个高集成度的服务和应用体系。
对于一般的企业,采用相应的安全措施,没有可能权限的用户不能直接大开文件查看数据,有足够安全措施。从而构成了严密的权限保护系统。
创建面向整个公司所处理的数据对象的数据结构,从而减少、消除相同数据多次重复录入,数据一直性差、冗余的现象,以保证数据准确性、安全性提高工作的时效性。
5.1系统的目标
市场竞争的激烈意味着管理工作的重要性,药品种类和数量的增加也就意味着销售管理的重要性。本医药公司销售管理系统的目标大体有:
1.为该公司提供一体化解决方案涵盖物流的整个过程,满足业内各种经营模式和特性。
2.适合特色管理和经营,针对该行业经营品种繁多,对药品的有效期,批准文号,合格证等要有比较严格的管理。
5.2 系统的功能图
图1 系统功能结构图
5.3 系统功能模块设计
系统开发的总体任务是实现各种信息的系统化,规范化和自动化。该公司的销售管理系统完成功能的设计如下:
1系统管理用于管理本系统用户的增加、删除和修改用户密码等操作。
图2 系统管理功能图
2基本信息设置包括对药品类别的设置、药品的设置、供应商的设置和业务员的设置等。
图3 基本信息设置功能图
3货源信息管理主要完成对订货单的录入和进货入库等操作。
图4 货源信息管理功能图
4分类销售查询主要完成销售结果的查询,如按照药品查询和按照业务员查询。
图5 基本信息设置功能图
5.4系统实现
面向对象分析首要的高能工作,是建立问题域的对象模型,这个模型描述了现实世界的“类---&----对象”以及它们之间的关系,表示了目标系统的静态数据结构,静态数据结构对应细节以来较少,比较容易确定;当用户的需求变化时,静态数据结构相对来说比较稳定。因此,用面向对象开发的决大多数软件时,都首先建立对象模型,然后再建立子模型。
类和对象是对应用领域中的概念的标识,是系统分析及软件的复用的基础,这一过程需要考虑多种情况,正确的表示类—对象,以形成下一步软件的复用性,提高软件质量及生产效率。例如,在办公自动化系统中,文档是整个软件的基础,如果没有标识此类对象,一旦文档稍有改变,则整个系统就会面临重建的风险。
OOA系统的属性层包括对象的属性及对象间的实例连接(关系),属性为对象的一些静态信息,它是对象的内部资料描述,即内部封装的资料。
对象所能执行的操作称为服务或方法。在属性层讨论是应用领域的静态方面。而对象间的动态关系及对象实例间的消息连接构成了服务层。
结合面向对象的语言,就非常符合实际的情况。应用户在各种处理方面的需求,以及针对系统功能的具体设计将得到如下所示的本系统所要处理的数据流程图。
图6 数据流程图
5.4.1 用户登陆模块的创建
运行本系统后将出现一个对话框如图6所示,提供用户输入用户名和密码,验证用户的合法性。如果用户3次输入登陆信息错误,将退出系统。这个模块包括三个类:LoginSystem.java、CheckUser.java和Main.java。其中Main.java是系统启动后运行的第一个类,在该类中初始化登陆窗口(Longinsystem.java)并将它显示出来,CheckUser.java封装了登陆和验证中一些公用的方法。
图7 登陆界面图
在CheckUser类中用JDBC连接数据库,提供了验证用户,也实现了为以后添加用户和修改密码的功能。
package com.csbook.restaurant.utility;
import java.sql.*;
import javax.swing.*;
public class CheckUser{
//构造数据库连接参数
//private String url="jdbc:odbc:yumen","","";
public CheckUser() {
try {
//装载数据库驱动程序
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//检查指定用户是否为合法用户
public boolean isValidUser(String operator,String password)
{
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
boolean isValid=false;
try{
con = DriverManager.getConnection("jdbc:odbc:yumen","","");
String queryStr = "select * from operator WHERE id=? and password=?";
ps = con.prepareStatement(queryStr);
ps.setString(1, operator);
ps.setString(2, password);
rs = ps.executeQuery();
if (rs.next())
isValid = true;
}
catch(SQLException exc){
exc.printStackTrace();
}
finally{
if (rs != null) try { rs.close();}catch (SQLException ignore) {}
if (ps != null) try{ ps.close();}catch (SQLException ignore) {}
if (con != null) try{con.close();}catch (SQLException ignore) {}
}
return isValid;
}
//更改用户密码
public void updatePassword(String operator,String password)
{
Connection con=null;
PreparedStatement ps=null;
try{
//con = DriverManager.getConnection(url);
con = DriverManager.getConnection("jdbc:odbc:yumen","","");
String updateStr = "update operator set password=? WHERE id=?";
ps = con.prepareStatement(updateStr);
ps.setString(1, password);
ps.setString(2, operator);
ps.executeUpdate();
}
catch(SQLException exc){
exc.printStackTrace();
}
finally{
if (ps != null) try{ ps.close();}catch (SQLException ignore) {}
if (con != null) try{con.close();}catch (SQLException ignore) {}
}
}
//检查指定用户是否存在
public boolean userExist(String userID)
{
Connection con = null;
PreparedStatement ps = null;
ResultSet rs=null;
boolean exist=false;
try{
// con = DriverManager.getConnection(url);
con = DriverManager.getConnection("jdbc:odbc:yumen","","");
String selectStr = "select id from operator where id=?";
ps = con.prepareStatement(selectStr);
ps.setString(1, userID);
rs=ps.executeQuery();
if(rs.next())
exist=true;
}
catch(SQLException exc){
exc.printStackTrace();
}
finally{
if (rs != null) try{ rs.close();}catch (SQLException ignore) {}
if (ps != null) try{ ps.close();}catch (SQLException ignore) {}
if (con != null) try{con.close();}catch (SQLException ignore) {}
}
return exist;
}
//添加新用户
public void addOperator(String userID,String username,String userType,String password,String PICNo,String tel,String addr,String remark)
{
Connection con=null;
PreparedStatement ps=null;
try{
//con = DriverManager.getConnection(url);
con = DriverManager.getConnection("jdbc:odbc:yumen","","");
String updateStr = "insert into operator(id,password,name,type,tel,addr,PICNo,remark) values(?,?,?,?,?,?,?,?)";
ps = con.prepareStatement(updateStr);
ps.setString(1, userID);
ps.setString(2, password);
ps.setString(3,username);
ps.setString(4,userType);
ps.setString(5,tel);
ps.setString(6,addr);
ps.setString(7,PICNo);
ps.setString(8,remark);
ps.executeUpdate();
}
catch(SQLException exc){
exc.printStackTrace();
}
finally{
if (ps != null) try{ ps.close();}catch (SQLException ignore) {}
if (con != null) try{con.close();}catch (SQLException ignore) {}
}
}
//删除用户
public boolean deleteOperator(String userID)
{
Connection con=null;
PreparedStatement ps=null;
boolean succeed=true;
try{
//con = DriverManager.getConnection(url);
con = DriverManager.getConnection("jdbc:odbc:yumen","","");
String deleteStr="delete from operator where id=?";
ps=con.prepareStatement(deleteStr);
ps.setString(1,userID);
ps.executeUpdate();
}
catch(SQLException exc){
succeed=false;
}
finally{
if (ps != null) try{ ps.close();}catch (SQLException ignore) {}
if (con != null) try{con.close();}catch (SQLException ignore) {}
}
return succeed;
}
//获得用户类型
public String getUserType(String user)
{
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
String userType="";
try{
//con = DriverManager.getConnection(url);
con = DriverManager.getConnection("jdbc:odbc:yumen","","");
String queryStr = "select * from operator WHERE id=?";
ps = con.prepareStatement(queryStr);
ps.setString(1, user);
rs = ps.executeQuery();
if (rs.next())
userType = rs.getString("type");
}
catch(SQLException exc){
exc.printStackTrace();
}
finally{
if (rs != null) try { rs.close();}catch (SQLException ignore) {}
if (ps != null) try{ ps.close();}catch (SQLException ignore) {}
if (con != null) try{con.close();}catch (SQLException ignore) {}
}
return userType;
}
}
5.4.2用户管理功能的实现
以添加用户为例说明用户管理功能的实现,在Jbuilder自动生成的jbInint()方法的末尾加上如下的代码:
userType.addItem("operator");
userType.addItem("manager");
userType.addItem("sa");
然后在设计(design)界面选定“确定”按钮,在Events选项的actionPerformed后的空格中双击,加入如下代码:void ok_actionPerformed(ActionEvent e) {
String id = userID.getText();
//检查用户名是否为空,如为空,提示用户输入用户名
if(id.trim().equals("")){
JOptionPane.showMessageDialog(this, "用户名不能为空!", "警告",
JOptionPane.ERROR_MESSAGE);
return;
}
String name = username.getText();
String userT = (String) userType.getSelectedItem();
String telephone = tel.getText();
String addr = address.getText();
char temp[]=password.getPassword();
String pass=new String(temp);
String PIC = PICNo.getText();
String note = remark.getText();
CheckUser cUser = new CheckUser();
boolean userExist=cUser.userExist(id);
if(userExist)
{
JOptionPane.showMessageDialog(this, "系统中已存在该用户!", "错误",
JOptionPane.ERROR_MESSAGE);
return;
}
//调用CheckUser类中的方法添加用户
cUser.addOperator(id,name,userT,pass,PIC,telephone,addr,note);
//刷新列表显示
JButton refreshButton=DBNavToolBar.getRefreshButton();
refreshButton.doClick();
//提示用户添加成功
JOptionPane.showMessageDialog(this,"该用户已成功添加","提示",JOptionPane.PLAIN_MESSAGE);
}
图8 用户管理
5.4.3药品信息设置功能的实现
在药品信息设置界面中,药品类型和生产厂商的输入信息是以下拉框的形式给出的,它不能由用户自由输入,它们的选项列表分别从yType和supplier中读取的。在本系统中它们是在prepareShow()方法中实现的。
private void prepareShow(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
conn=DriverManager.getConnection("jdbc:odbc:yumen","","");
ps=conn.prepareStatement("select name from supplier");
rs=ps.executeQuery();
while(rs.next())
producer.addItem(rs.getString("name"));
ps=conn.prepareStatement("select name from foodType");
rs=ps.executeQuery();
while(rs.next())
foodType.addItem(rs.getString("name"));
}
catch(SQLException e){
e.printStackTrace();
}
finally{
if(rs!=null)try{rs.close();}catch(SQLException ignore){}
if(ps!=null)try{ps.close();}catch(SQLException ignore){}
if(conn!=null)try{conn.close();}catch(SQLException ignore){}
}
}
在添加之前,先要检测系统中是否已经存在相同名称的药品,通过加入下面的方法来实现。
private boolean foodExist(String food)
{
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
boolean exist=false;
try{
conn=DriverManager.getConnection("jdbc:odbc:yumen","","");
ps=conn.prepareStatement("select name from food where name='"+food+"'");
rs=ps.executeQuery();
if(rs.next())
exist=true;
}
catch(SQLException e){
e.printStackTrace();
}
finally{
if(rs!=null)try{rs.close();}catch(SQLException ignore){}
if(ps!=null)try{ps.close();}catch(SQLException ignore){}
if(conn!=null)try{conn.close();}catch(SQLException ignore){}
}
return exist;
}
图9药品信息设置
5.4.4 创建销售功能模块
销售模块是本系统中比较复杂的功能模块,主要是同时更新销售信息表和库存信息表里的对应信息和一些异常处理。把Jbuilder自动生成的构造函数修改为:
public BookService(String title,boolean resizable,boolean closable,boolean maximizable,boolean iconifiable,String operator) {
super(title,resizable,closable,maximizable,iconifiable);
this.currentOper=operator;
try {
jbInit();
}
catch(Exception ex) {
ex.printStackTrace();
}
}
此外,还要在BookServer中声明一个String类型的变量currentOper来保存传入的数据。在系统的构造函数中还应有下面的方法,提供下拉框的选项。
public void prepareShow(){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
conn=DriverManager.getConnection("jdbc:odbc:yumen","","");
ps=conn.prepareStatement("select id from room");
rs=ps.executeQuery();
while(rs.next())
roomNo.addItem(rs.getString("id"));
}
catch(SQLException ex){
ex.printStackTrace();
}
try{
conn=DriverManager.getConnection("jdbc:odbc:yumen","","");
ps=conn.prepareStatement("select commodity from stockInfo");
rs=ps.executeQuery();
while(rs.next())
customer.addItem(rs.getString("commodity"));
}
catch(SQLException ex){
ex.printStackTrace();
}
finally{
if(rs!=null)try{rs.close();}catch(SQLException ignore){}
if(ps!=null)try{ps.close();}catch(SQLException ignore){}
if(conn!=null)try{conn.close();}catch(SQLException ignore){}
}
}
图10 销售功能图
5.4.5数据库设计
数据库在一个信息管理系统中占有一个非常重要的地位,数据库结构设计的好坏将直接对系统的效率和实现的效果产生影响。合理的数据结构可以提高数据存储的效率,保证数据的完整和一致。
通过医药行业管理工作过程的内容和数据流程的分析,简要的数据库设计如下:
药品类别信息,包括的数据项有:类别编号、类别名称等。
药品信息,包括的数据项有:药品编号、药品名称、类别、计量单位、入库价格、分销价格、生产厂家等等。
客户信息,包括的数据项有:供应商编号、供应商名称、地址、电话号码等。
业务员类别信息,包括的数据项有:类别编号、业务员名称、地址、电话号码等。
仓库信息,包括的信息项有:仓库编号、仓库名称。
进货定单信息,包括的数据项有:订货日期、编号、业务员、供应商编号、药品编号等等。
入库单信息,包括的信息项有:入库日期、编号、业务员、供应商编号、药品编号等等。
售货定单信息,包括的数据项有:售货日期、编号、业务员、客户编号、药品编号等等。
销售出货单信息,包括的数据项有:销售日期、编号、业务员、客户编号、药品编号等等。
库存信息,包括的信息项有:更新日期、编号、仓编号、药品编号等。
现在需要将上面的数据库结构转化为SQL Server2000数据库系统所支持 的实际数据模型,也就是数据的逻辑结构。根据数据库的需求分析和概念结构设计,设计了一个数据库。数据库由多个表组成。
表4-1 药品类别表
列名 | 数据类型 | 可否为空 | 说明 |
Lbcode | Char | Not null | 类别编号 |
Lbname | Char | Null | 类别名称 |
Lbremak | Char | Null | 备注信息 |
表4-2 药品信息表
列名 | 数据类型 | 可否为空 | 说明 |
Ypcode | Char | Not null | 药品编号 |
Lbcode | Char | Null | 类别编号 |
Ypname | Char | Null | 药品名称 |
Jldw | Char | Null | 计算单位 |
Rkprice | Float | Null | 入库价格 |
Xshprice | Float | Null | 销售价格 |
Sccj | Char | Null | 生产厂家 |
Gxrq | Datetime | Null | 更新日期 |
Ypremark | Char | Null | 备注信息 |
表4-3 客户信息表
列名 | 数据类型 | 可否为空 | 说明 |
Khcode | Char | Not null | 客户编号 |
Khname | Char | Null | 客户姓名 |
Htel | Char | Null | 联系电话 |
Addr | Char | Null | 联系地址 |
postalcode | Char | Null | 邮政编码 |
Itaddr | Char | Null | 公司主页 |
Linkman | Char | Null | 联系人 |
| Char | Null | 电子邮件 |
Bank | Char | Null | 开户银行 |
Bank_no | Char | Null | 银行账号 |
khremark | Char | Null | 备注信息 |
表4-4供应商信息表
列名 | 数据类型 | 可否为空 | 说明 |
Gycode | Char | Not null | 供应商编号 |
Gyname | Char | Null | 供应商姓名 |
Tel | Char | Null | 联系电话 |
Addr | Char | Null | 联系地址 |
Postalcode | Char | Null | 邮政编码 |
Itaddr | Char | Null | 公司主页 |
| Char | Null | 电子邮件 |
Bank | Char | Null | 开户银行 |
Bank_no | Char | Null | 银行账号 |
Gyremark | Char | Null | 备注信息 |
表4-5业务员信息表
列名 | 数据类型 | 可否为空 | 说明 |
Yycode | Char | Not null | 业务员编号 |
Yyname | Char | Null | 业务员姓名 |
Tel | Char | Null | 联系电话 |
Addr | Char | Null | 地址 |
Sfcode | Char | Null | 身份证号 |
yyremark | Char | Null | 备注信息 |
表4-6销售信息表
列名 | 数据类型 | 可否为空 | 说明 |
Out_date | Datetime | Not null | 销售日期 |
Yyname | Char | Not null | 业务员 |
Khcode | Char | Null | 客户编号 |
Ypcode | Char | Null | 药品编号 |
Quantity | Float | Null | 数量 |
Price | Float | Null | 单价 |
Discount | Float | Null | 折扣 |
Cmoney | Float | Null | 总金额 |
Sremark | Char | Null | 备注信息 |
表4-7库存信息表
列名 | 数据类型 | 可否为空 | 说明 |
Update_date | Datetime | Not null | 更新日期 |
Kccode | Char | Not null | 库存编号 |
Ypcode | Char | Null | 药品编号 |
Gycode | Char | Null | 供应商编号 |
Quantity | Float | Null | 数量 |
Kremark | Char | Null | 备注信息 |
将上面的数据库观念结构化为SQL Server 2000数据库支持的实际数据模型就可以了,也就是数据库的逻辑结构同时得到系统E-R图。
图10简单总体E-R图
图11 部分实体相关属性图
6.安全性
数据库的安全性是指保护数据库以防止不合法的使用所造成的资料泄露、更改破坏。安全性问题不是数据库系统所独有的,计算机系统都有这个问题。这是在数据库系统中大量资料集中存放,而且为许多用户直接共享,是宝贵的信息资源。从而使安全性问题更为突出。系统安全性保护措施是否幽香是数据库系统的主要性能指标之一。
与管理的层次和权限想适应,OA系统中不同拥护的级别不用,因而能使用的系统功能和资源也是不同的。通过访问权限的设置来限定用户能够使用系统功能和资源,是进行系统访问控制的基本方法和策略。在本系统中设计了不同种类别的用户,也赋予他们不同的权限,为了保护数据库的安全性同时也设计了不同的角色和数据库用户。
7.结 束 语
办公自动化是为了解决办公业务量急剧增加对企业生产率产生巨大影响问题的背景下,发展起来的一门综合性技术。它的基本任务是利用先进的科学技术,使人们借助各种设备解决对一部门办公业务的处理,达到提高生产率工作效率和质量,方便管理和决策的目的。OA的知识领域覆盖了行为科学、管理科学、社会科学、系统工程学等学科,并且OA体现了多学科的相互交叉、相互渗透性,所以OA的应用是企业管理现代化的标志之一。
本文在前面部分简单的介绍了开发医药公司销售管理所要用的基本技术,重点介绍了的技术和面向对象的分析和设计方法,讨论了该系统的需求分析和逻辑结构设计,如何选择最优的分析和设计方法,建立最优的返工自动化系统的分析和设计模型是一个需要不断研究的课题。
致 谢
首先,我要想我们的导师表示深深的谢意,感谢老师在我的这次论文中的精心指导,才使得本次论文能顺利完成。张老师认真求实的态度;诲人不倦,对学生,对工作高度认真负责的精神;非我留下了深刻的印象,这些有形的和潜移默化的影响必将使我终身受益!在此特向导师表示我最衷心的感谢和最崇高的敬意!
同时,也感谢网院的老师多年来对我们谆谆教导。感谢长期以来给予了我帮助、关心和支持的老师和同学们。
最后感谢老师们在百忙之中审阅本文。
参考文献
[1]作者:张海潘 书名:软件工程 出版社:人民邮电出版社
[2]作者:杨岚 刘静 书名:java实例导航 出版社:人民邮电出版社
[3]作者:Herbert Schilot 书名:java2参考大全 出版社:电子工业出版
[4]作者:陆正中 马进德 石正贵 书名:JBiulder软件开发项目实践
出版社:清华大学出版社
[5] 网络文章:工作流技术在流程分析中的应用研究
[6] 网络文章:基于面向对象技术的异构系统整合
毕业设计[论文]任务书
姓名 ______________ 班级学号 ______________ 专业 ________________
课题名称 _____________________ 指导老师 ___________________