范文一:软件开发报告
负载均衡器软件
开发报告
院系: 班级: 成员:
目录
1. 可行性分析报告.......................................................................................................................... 1
1.1 项目背景 .............................................................................................................................. 1
1.2产品分析 . .............................................................................................................................. 1
1.3 结论意见 .............................................................................................................................. 2
2. 项目开发计划 . ............................................................................................................................. 2
2.1 总体功能要求 ...................................................................................................................... 2
2.2 软件开发平台要求 .............................................................................................................. 2
2.3 软件项目的开发实施过程管理要求 . .................................................................................. 2
3. 软件开发 . ..................................................................................................................................... 2
3.1 软件的需求分析 .............................................................................................................. 3
3.3软件的详细设计 ................................................................................................................... 4
3.4 软件的编码 .......................................................................................................................... 5
3.5软件的测试 . ........................................................................................................................ 31
3.5.1测试计划 . .................................................................................................................... 31
3.5.2 软件测试 . ................................................................................................................... 31
4. 项目开发总结报告 .................................................................................................................... 32
1. 可行性分析报告
1.1 项目背景 面对庞大的数据流量,面对集中性的访问,是不是觉得网络服务器岌岌可危呢? 不用怕,负载均衡器就能帮你缓解这个问题。负载均衡器通过虚拟IP 地址方法,解决了轮流排程所面临的许多问题。使用了负载均衡器集群系统,在外部看来,像是具有一个IP 地址的单一服务器一样,当然,这个IP 地址是虚拟的,它映射了集群中的每一台机器的地址。所以,在某种程度上,负载均衡器是将整个集群的IP 地址报漏给外部网络。
当请求到达负载均衡器时,它会重写该请求的头文件,并将之指定到集群中的机器上。如果某台机器被从集群中移除了,请求不会别发往已经不存在的服务器上,因为所有的机器表面上都具有同一个IP 地址,即使集群中的某个节点被移除了,该地址也不会发生变化。而且,internet 上缓存的DNS 条目也不再是问题了。当返回一个应答时,客户端看到的只是从负载均衡器上所返回的结果。也就是说,客户端操作的对象是负载均衡器,对于其更后端的操作,对客户端来讲,是完全透明的。
1.2产品分析 服务器一致性负载均衡器读取客户端发出的每一个请求中所包含的
cookies 或url 解释。基于所读出的这些信息,负载均衡器就可以重写报头并将请求发往集群中合适的节点上,该节点维护着相应客户端请求的会话信息。在HTTP 通信中,负载均衡器可以提供服务器一致性,但并不是通过一个安全的途径(例如:HTTPS )来提供这种服务。当消息被加密后(SSL ),负载均衡器就不能读出隐藏在其中的会话信息。
通过故障恢复机制获得高可靠性故障恢复发生在当集群中某个节点不能处理请求,需将请求重新导向到其他节点时。主要有两种故障恢复:
请求级故障恢复。当集群中的一个节点不能处理请求时(通常是由于down 机),请求被发送到其他节点。当然,在导向到其他节点的同时,保存在原节点上的会话信息将会丢失。
透明会话故障恢复。当一个引用失败后,负载均衡器会将之发送到集群中其他的节点上,以完成操作,这一点对用户来说是透明的。由于透明会话故障恢复需要节点具备相应的操作信息,因此为了实现该功能,集群中的所有节点必须具有公共存储区域或通用数据库,存储会话信息数据,以提供每个节点在进行单独进程会话故障恢复时所需要的操作信息。
既然所有的Web 应用请求都必须经过负载均衡系统,那么系统就可以确定活动会话的数量,在任何实例访问中的活动会话的数目,应答的次数,高峰负载
次数,以及在高峰期和低谷期的会话的数目,还有其他更多的。所有的这些统计信息都可以被很好的用来调整整个系统的性能。
1.3 结论意见
虽然此项目存在一定的技术难度和风险,但我们对项目要达到的目标十分清楚,对所要开发系统将要实现的功能也非常了解。而且有一些成品作为参考,并且在项目的实施过程中我们能够获得帮助,我认为只要我们能够认真思考、仔细规划、明确分工,我们可以承担此项目的开发。
2. 项目开发计划
2.1 总体功能要求
1. 扩展网络设备和服务器的带宽
2. 增加吞吐量
3. 加强网络数据处理能力
4. 提高网络的灵活性和可用性
2.2 软件开发平台要求
Visual c++ 6.0
SQL Server 2008
C++ Builder
网络架构:
完全支持TCP/IP协议
2.3 软件项目的开发实施过程管理要求
3. 软件开发
3.1 软件的需求分析 1.DNS 负载均衡最早的负载均衡技术是通过DNS 来实现的,在DNS 中为多个地址配置同一个名字,因而查询这个名字的客户机将得到其中一个地址,从而使得不同的客户访问不同的服务器,达到负载均衡的目的。DNS 负载均衡是一种简单而有效的方法,但是它不能区分服务器的差异,也不能反映服务器的当前运行状态。
2.代理服务器负载均衡 使用代理服务器,可以将请求转发给内部的服务器,使用这种加速模式显然可以提升静态网页的访问速度。然而,也可以考虑这样一种技术,使用代理服务器将请求均匀转发给多台服务器,从而达到负载均衡的目的。
3.地址转换网关负载均衡 支持负载均衡的地址转换网关,可以将一个外部IP 地址映射为多个内部IP 地址,对每次TCP 连接请求动态使用其中一个内部地址,达到负载均衡的目的。
4.协议内部支持负载均衡除了这三种负载均衡方式之外,有的协议内部支持与负载均衡相关的功能,例如HTTP 协议中的重定向能力等,HTTP 运行于TCP 连接的最高层。 5.NAT 负载均衡NAT 简单地说就是将一个IP 地址转换为另一个IP 地址,一般用于未经注册的内部地址与合法的、已获注册的Internet IP 地址间进行转换。适用于解决Internet IP 地址紧张、不想让网络外部知道内部网络结构等的场合下。 6.反向代理负载均衡普通代理方式是代理内部网络用户访问internet 上服务器的连接请求,客户端必须指定代理服务器,并将本来要直接发送到internet 上服务器的连接请求发送给代理服务器处理。反向代理(Reverse Proxy )方式是指以代理服务器来接受internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。反向代理负载均衡技术是把将来自internet 上的连接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。
7.混合型负载均衡在有些大型网络,由于多个服务器群内硬件设备、各自的规模、提供的服务等的差异,可以考虑给每个服务器群采用最合适的负载均衡方式,然后又在这多个服务器群间再一次负载均衡或群集起来以一个整体向外界提供服务(即把这多个服务器群当做一个新的服务器群),从而达到最佳的性能。将这种方式称之为混合型负载均衡。此种方式有时也用于单台均衡设备的性能不能满足大量连接请求的情况下。
3.2软件的概要设计
软件负载均衡解决方案是指在一台或多台服务器相应的操作系统上安装一
个或多个附加软件来实现负载均衡,DNSLoadBalanceCheckPointFirewall-1 ConnectControl 等,它的优点是基于特定环境,配置简单,使用灵活,成本低廉,可以满足一般的负载均衡需求。硬件负载均衡解决方案是直接在服务器和外部网络间安装负载均衡设备,这种设备通常称之为负载均衡器,由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。
一般而言,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵。 本地负载均衡能有效地解决数据流量过大、网络负荷过重的问题,并且不需花费昂贵开支购置性能卓越的服务器,充分利用现有设备,避免服务器单点故障造成数据流量的损失。其有灵活多样的均衡策略把数据流量合理地分配给服务器群内的服务器共同负担。即使是再给现有服务器扩充升级,也只是简单地增加一个新的服务器到服务群中,而不需改变现有网络结构、停止现有的服务。
全局负载均衡主要用于在一个多区域拥有自己服务器的站点,为了使全球用户只以一个IP 地址或域名就能访问到离自己最近的服务器,从而获得最快的访问速度,也可用于子公司分散站点分布广的大公司通过企业内部互联网来达到资源统一合理分配的目的。
3.3软件的详细设计 1. 轮转法:轮转算法是所有调度算法中最简单也最容易实现的一种方法。在一个任务队列里,队列的每个成员(节点)都具有相同的地位,轮转法简单的在这组成员中顺序轮转选择。在负载平衡环境中,均衡器将新的请求轮流发给节点队列中的下一节点,如此连续、周而复始,每个集群的节点都在相等的地位下被轮流选择。这个算法在DNS 域名轮询中被广泛使用。
轮转法的活动是可预知的,每个节点被选择的机会是1/N,因此很容易计算出节点的负载分布。轮转法典型的适用于集群中所有节点的处理能力和性能均相同的情况,在实际应用中,一般将它与其他简单方法联合使用时比较有效。
2. 散列法:散列法也叫哈希法(HASH ),通过单射不可逆的HASH 函数,按照某种规则将网络请求发往集群节点。哈希法在其他几类平衡算法不是很有效时会显示出特别的威力。例如,在前面提到的UDP 会话的情况下,由于轮转法和其他几类基于连接信息的算法,无法识别出会话的起止标记,会引起应用混乱。
而采取基于数据包源地址的哈希映射可以在一定程度上解决这个问题:将具有相同源地址的数据包发给同一服务器节点,这使得基于高层会话的事务可以以适当的方式运行。相对称的是,基于目的地址的哈希调度算法可以用在Web Cache 集群中,指向同一个目标站点的访问请求都被负载平衡器发送到同一个Cache 服务节点上,以避免页面缺失而带来的更新Cache 问题。
3. 最少连接法:在最少连接法中,平衡器纪录目前所有活跃连接,把下一个新的请求发给当前含有最少连接数的节点。这种算法针对TCP 连接进行,但由于
不同应用对系统资源的消耗可能差异很大,而连接数无法反映出真实的应用负载,因此在使用重型Web 服务器作为集群节点服务时(例如Apache 服务器),该算法在平衡负载的效果上要打个折扣。为了减少这个不利的影响,可以对每个节点设置最大的连接数上限(通过阈值设定体现)。
4. 最低缺失法:在最低缺失法中,平衡器长期纪录到各节点的请求情况,把下个请求发给历史上处理请求最少的节点。与最少连接法不同的是,最低缺失记录过去的连接数而不是当前的连接数。
5. 最快响应法:平衡器记录自身到每一个集群节点的网络响应时间,并将下一个到达的连接请求分配给响应时间最短的节点,这种方法要求使用ICMP 包或基于UDP 包的专用技术来主动探测各节点。
在大多数基于LAN 的集群中,最快响应算法工作的并不是很好,因为LAN 中的ICMP 包基本上都在10ms 内完成回应,体现不出节点之间的差异;如果在 WAN上进行平衡的话,响应时间对于用户就近选择服务器而言还是具有现实意义的;而且集群的拓扑越分散这种方法越能体现出效果来。这种方法是高级平衡基于拓扑结构重定向用到的主要方法。
6. 加权法:加权方法只能与其他方法合用,是它们的一个很好的补充。加权算法根据节点的优先级或当前的负载状况(即权值)来构成负载平衡的多优先级队列,队列中的每个等待处理的连接都具有相同处理等级,这样在同一个队列里可以按照前面的轮转法或者最少连接法进行均衡,而队列之间按照优先级的先后顺序进行均衡处理。在这里权值是基于各节点能力的一个估计值。
3.4 软件的编码
#include #include #include #include "conn.h" #include "log.h" #include "fdwrapper.h" conn::conn() { m_srvfd = -1; m_clt_buf = new char[ BUF_SIZE ]; if( !m_clt_buf ) { throw std::exception(); } m_srv_buf = new char[ BUF_SIZE ]; if( !m_srv_buf ) { throw std::exception(); } reset(); } conn::~conn() { delete [] m_clt_buf; delete [] m_srv_buf; } void conn::init_clt( int sockfd, const sockaddr_in& client_addr ) { m_cltfd = sockfd; m_clt_address = client_addr; } void conn::init_srv( int sockfd, const sockaddr_in& server_addr ) { m_srvfd = sockfd; m_srv_address = server_addr; } void conn::reset() { m_clt_read_idx = 0; m_clt_write_idx = 0; m_srv_read_idx = 0; m_srv_write_idx = 0; m_srv_closed = false; m_cltfd = -1; memset( m_clt_buf, '\0', BUF_SIZE ); memset( m_srv_buf, '\0', BUF_SIZE ); } RET_CODE conn::read_clt() { int bytes_read = 0; while( true ) { if( m_clt_read_idx >= BUF_SIZE ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "the client read buffer is full, let server write" ); return BUFFER_FULL; } bytes_read = recv( m_cltfd, m_clt_buf + m_clt_read_idx, BUF_SIZE - m_clt_read_idx, 0 ); if ( bytes_read == -1 ) { if( errno == EAGAIN || errno == EWOULDBLOCK ) { break; } return IOERR; } else if ( bytes_read == 0 ) { return CLOSED; } m_clt_read_idx += bytes_read; } return ( ( m_clt_read_idx - m_clt_write_idx ) > 0 ) ? OK : NOTHING; } RET_CODE conn::read_srv() { int bytes_read = 0; while( true ) { if( m_srv_read_idx >= BUF_SIZE ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "the server read buffer is full, let client write" ); return BUFFER_FULL; } bytes_read = recv( m_srvfd, m_srv_buf + m_srv_read_idx, BUF_SIZE - m_srv_read_idx, 0 ); if ( bytes_read == -1 ) { if( errno == EAGAIN || errno == EWOULDBLOCK ) { break; } return IOERR; } else if ( bytes_read == 0 ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "the server should not close the persist connection" ); return CLOSED; } m_srv_read_idx += bytes_read; } return ( ( m_srv_read_idx - m_srv_write_idx ) > 0 ) ? OK : NOTHING; } RET_CODE conn::write_srv() { int bytes_write = 0; while( true ) { if( m_clt_read_idx <= m_clt_write_idx="">=> { m_clt_read_idx = 0; m_clt_write_idx = 0; return BUFFER_EMPTY; bytes_write = send( m_srvfd, m_clt_buf + m_clt_write_idx, m_clt_read_idx - m_clt_write_idx, 0 ); if ( bytes_write == -1 ) { if( errno == EAGAIN || errno == EWOULDBLOCK ) { return TRY_AGAIN; } log( LOG_ERR, __FILE__, __LINE__, "write server socket failed, %s", strerror( errno ) ); return IOERR; } else if ( bytes_write == 0 ) { return CLOSED; } m_clt_write_idx += bytes_write; } } RET_CODE conn::write_clt() { int bytes_write = 0; while( true ) { if( m_srv_read_idx <= m_srv_write_idx="">=> { m_srv_read_idx = 0; m_srv_write_idx = 0; return BUFFER_EMPTY; } bytes_write = send( m_cltfd, m_srv_buf + m_srv_write_idx, m_srv_read_idx - m_srv_write_idx, 0 ); if ( bytes_write == -1 ) if( errno == EAGAIN || errno == EWOULDBLOCK ) { return TRY_AGAIN; } log( LOG_ERR, __FILE__, __LINE__, "write client socket failed, %s", strerror( errno ) ); return IOERR; } else if ( bytes_write == 0 ) { return CLOSED; } m_srv_write_idx += bytes_write; } } #ifndef FDWRAPPER_H #define FDWRAPPER_H #include #include #include int setnonblocking( int fd ) { int old_option = fcntl( fd, F_GETFL ); int new_option = old_option | O_NONBLOCK; fcntl( fd, F_SETFL, new_option ); return old_option; } void add_read_fd( int epollfd, int fd ) { epoll_event event; event.data.fd = fd; event.events = EPOLLIN | EPOLLET; epoll_ctl( epollfd, EPOLL_CTL_ADD, fd, &event ); setnonblocking( fd ); } void add_write_fd( int epollfd, int fd ) { epoll_event event; event.data.fd = fd; event.events = EPOLLOUT | EPOLLET; epoll_ctl( epollfd, EPOLL_CTL_ADD, fd, &event ); setnonblocking( fd ); } void closefd( int epollfd, int fd ) { epoll_ctl( epollfd, EPOLL_CTL_DEL, fd, 0 ); close( fd ); } void removefd( int epollfd, int fd ) { epoll_ctl( epollfd, EPOLL_CTL_DEL, fd, 0 ); } void modfd( int epollfd, int fd, int ev ) { epoll_event event; event.data.fd = fd; event.events = ev | EPOLLET; epoll_ctl( epollfd, EPOLL_CTL_MOD, fd, &event ); } #endif #include #include "log.h" static int level = LOG_INFO; static int LOG_BUFFER_SIZE = 2048; static const char* loglevels[] = { "emerge!", "alert!", "critical!", "error!", "warn!", "notice:", "info:", "debug:" }; void set_loglevel( int log_level ) { level = log_level; } void log( int log_level, const char* file_name, int line_num, const char* format, ... ) { if ( log_level > level ) { return; } time_t tmp = time( NULL ); struct tm* cur_time = localtime( &tmp ); if ( ! cur_time ) { return; } char arg_buffer[ LOG_BUFFER_SIZE ]; memset( arg_buffer, '\0', LOG_BUFFER_SIZE ); strftime( arg_buffer, LOG_BUFFER_SIZE - 1, "[ %x %X ] ", cur_time ); printf( "%s", arg_buffer ); printf( "%s:%04d ", file_name, line_num ); printf( "%s ", loglevels[ log_level - LOG_EMERG ] ); va_list arg_list; va_start( arg_list, format ); memset( arg_buffer, '\0', LOG_BUFFER_SIZE ); vsnprintf( arg_buffer, LOG_BUFFER_SIZE - 1, format, arg_list ); printf( "%s\n", arg_buffer ); fflush( stdout ); va_end( arg_list ); } #include #include #include #include #include "processpool.h" using std::vector; static const char* version = "1.0"; static void usage( const char* prog ) { log( LOG_INFO, __FILE__, __LINE__, "usage: %s config_file]", prog ); } int main( int argc, char* argv[] ) { char cfg_file[1024]; memset( cfg_file, '\0', 100 ); int option; while ( ( option = getopt( argc, argv, "f:xvh" ) ) != -1 ) { switch ( option ) { case 'x': { set_loglevel( LOG_DEBUG ); break; } [-v] [-h] [-f case 'v': { log( LOG_INFO, __FILE__, __LINE__, "%s %s", argv[0], version ); return 0; } case 'h': { usage( basename( argv[ 0 ] ) ); return 0; } case 'f': { memcpy( cfg_file, optarg, strlen( optarg ) ); break; } case '?': { log( LOG_ERR, __FILE__, __LINE__, "un-recognized option %c", option ); usage( basename( argv[ 0 ] ) ); return 1; } } } if( cfg_file[0] == '\0' ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "please specifiy the config file" ); return 1; } int cfg_fd = open( cfg_file, O_RDONLY ); if( !cfg_fd ) { log( LOG_ERR, __FILE__, __LINE__, "read config file met error: %s", strerror( errno ) ); return 1; } struct stat ret_stat; if( fstat( cfg_fd, &ret_stat ) < 0=""> { log( LOG_ERR, __FILE__, __LINE__, "read config file error: %s", strerror( errno ) ); return 1; } char* buf = new char [ret_stat.st_size + 1]; memset( buf, '\0', ret_stat.st_size + 1 ); ssize_t read_sz = read( cfg_fd, buf, ret_stat.st_size ); if ( read_sz < 0=""> { log( LOG_ERR, __FILE__, __LINE__, "read config file error: %s", strerror( errno ) ); return 1; } vector< host=""> balance_srv; vector< host=""> logical_srv; host tmp_host; memset( tmp_host.m_hostname, '\0', 1024 ); char* tmp_hostname; char* tmp_port; char* tmp_conncnt; bool opentag = false; char* tmp = buf; char* tmp2 = NULL; char* tmp3 = NULL; met met char* tmp4 = NULL; while( tmp2 = strpbrk( tmp, "\n" ) ) { *tmp2++ = '\0'; if( strstr( tmp, " { log( LOG_ERR, __FILE__, __LINE__, "%s", "parse config file failed" ); return 1; } opentag = true; } else if( strstr( tmp, " { log( LOG_ERR, __FILE__, __LINE__, "%s", "parse config file failed" ); return 1; } logical_srv.push_back( tmp_host ); memset( tmp_host.m_hostname, '\0', 1024 ); opentag = false; } else if( tmp3 = strstr( tmp, " log( LOG_ERR, __FILE__, __LINE__, "%s", "parse config file failed" ); return 1; } *tmp4 = '\0'; memcpy( tmp_host.m_hostname, strlen( tmp_hostname ) ); } else if( tmp3 = strstr( tmp, " if( !tmp4 ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "parse config file failed" ); return 1; } *tmp4 = '\0'; tmp_host.m_port = atoi( tmp_port ); } else if( tmp3 = strstr( tmp, " if( !tmp4 ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "parse config file failed" ); return 1; } *tmp4 = '\0'; tmp_host.m_conncnt = atoi( tmp_conncnt ); } tmp_hostname, else if( tmp3 = strstr( tmp, "Listen" ) ) { tmp_hostname = tmp3 + 6; tmp4 = strstr( tmp_hostname, ":" ); if( !tmp4 ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "parse config file failed" ); return 1; } *tmp4++ = '\0'; tmp_host.m_port = atoi( tmp4 ); memcpy( tmp_host.m_hostname, tmp3, strlen( tmp3 ) ); balance_srv.push_back( tmp_host ); memset( tmp_host.m_hostname, '\0', 1024 ); } tmp = tmp2; } if( balance_srv.size() == 0 || logical_srv.size() == 0 ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "parse config file failed" ); return 1; } const char* ip = balance_srv[0].m_hostname; int port = balance_srv[0].m_port; int listenfd = socket( PF_INET, SOCK_STREAM, 0 ); assert( listenfd >= 0 ); int ret = 0; struct sockaddr_in address; bzero( &address, sizeof( address ) ); address.sin_family = AF_INET; inet_pton( AF_INET, ip, &address.sin_addr ); address.sin_port = htons( port ); ret = bind( listenfd, sizeof( address ) ); assert( ret != -1 ); ret = listen( listenfd, 5 ); assert( ret != -1 ); //memset( cfg_host.m_hostname, '\0', 1024 ); //memcpy( cfg_host.m_hostname, "127.0.0.1", strlen( "127.0.0.1" ) ); //cfg_host.m_port = 54321; //cfg_host.m_conncnt = 5; processpool< conn,="" host,="" mgr="">* pool = processpool< conn,="" host,="" mgr="">::create( listenfd, logical_srv.size() ); if( pool ) { pool->run( logical_srv ); delete pool; } close( listenfd ); return 0; } #include #include #include #include #include #include ( struct sockaddr* )&address, #include #include #include "mgr.h" using std::pair; int mgr::m_epollfd = -1; int mgr::conn2srv( const sockaddr_in& address ) { int sockfd = socket( PF_INET, SOCK_STREAM, 0 ); if( sockfd < 0="" )="" {="" return=""> } if ( connect( sockfd, ( struct sockaddr* sizeof( address ) ) != 0 ) { close( sockfd ); return -1; } return sockfd; )&address, } mgr::mgr( int epollfd, const host& srv ) : m_logic_srv( srv ) { m_epollfd = epollfd; int ret = 0; struct sockaddr_in address; bzero( &address, sizeof( address ) ); address.sin_family = AF_INET; inet_pton( AF_INET, srv.m_hostname, &address.sin_addr ); address.sin_port = htons( srv.m_port ); log( LOG_INFO, __FILE__, __LINE__, "logcial srv host info: (%s, %d)", srv.m_hostname, srv.m_port ); for( int i = 0; i < srv.m_conncnt;="" ++i=""> { sleep( 1 ); int sockfd = conn2srv( address ); if( sockfd < 0="" )=""> log( LOG_ERR, __FILE__, __LINE__, "build connection %d failed", i ); } else { log( LOG_INFO, __FILE__, __LINE__, "build connection %d to server success", i ); conn* tmp = NULL; try { tmp = new conn; } catch( ... ) { close( sockfd ); continue; } tmp->init_srv( sockfd, address ); m_conns.insert( pair< int,="" conn*="">( sockfd, tmp ) ); } } } mgr::~mgr() { } int mgr::get_used_conn_cnt() { return m_used.size(); } conn* mgr::pick_conn( int cltfd ) { if( m_conns.empty() ) { log( LOG_ERR, __FILE__, __LINE__, "%s", "not connections to server" ); return NULL; } map< int,="" conn*="">::iterator iter = m_conns.begin(); int srvfd = iter->first; conn* tmp = iter->second; if( !tmp ) enough srv { log( LOG_ERR, __FILE__, __LINE__, "%s", "empty server connection object" ); return NULL; } m_conns.erase( iter ); m_used.insert( pair< int,="" conn*="">( cltfd, tmp ) ); m_used.insert( pair< int,="" conn*="">( srvfd, tmp ) ); add_read_fd( m_epollfd, cltfd ); add_read_fd( m_epollfd, srvfd ); log( LOG_INFO, __FILE__, __LINE__, "bind client sock %d with server sock %d", cltfd, srvfd ); return tmp; } void mgr::free_conn( conn* connection ) { int cltfd = connection->m_cltfd; int srvfd = connection->m_srvfd; closefd( m_epollfd, cltfd ); closefd( m_epollfd, srvfd ); m_used.erase( cltfd ); m_used.erase( srvfd ); connection->reset(); m_freed.insert( pair< int,="" conn*="">( srvfd, connection ) ); } void mgr::recycle_conns() { if( m_freed.empty() ) { return; } for( map< int,="" conn*="">::iterator iter = m_freed.begin(); iter != m_freed.end(); iter++ ) { sleep( 1 ); int srvfd = iter->first; conn* tmp = iter->second; srvfd = conn2srv( tmp->m_srv_address ); if( srvfd < 0=""> { log( LOG_ERR, __FILE__, __LINE__, "%s", "fix connection failed"); } else { log( LOG_INFO, __FILE__, __LINE__, "%s", "fix connection success" ); tmp->init_srv( srvfd, tmp->m_srv_address ); m_conns.insert( pair< int,="" conn*="">( srvfd, tmp ) ); } } m_freed.clear(); } RET_CODE mgr::process( int fd, OP_TYPE type ) { conn* connection = m_used[ fd ]; if( !connection ) { return NOTHING; } if( connection->m_cltfd == fd ) { int srvfd = connection->m_srvfd; switch( type ) { case READ: { RET_CODE res = connection->read_clt(); switch( res ) { case OK: { log( LOG_DEBUG, __FILE__, __LINE__, read from client: %s", connection->m_clt_buf ); } case BUFFER_FULL: { modfd( m_epollfd, srvfd, EPOLLOUT ); break; } case IOERR: case CLOSED: { free_conn( connection ); return CLOSED; } default: break; } if( connection->m_srv_closed ) { free_conn( connection ); return CLOSED; } break; "content case WRITE: { RET_CODE res = connection->write_clt(); switch( res ) { case TRY_AGAIN: { modfd( m_epollfd, fd, EPOLLOUT ); break; } case BUFFER_EMPTY: { modfd( m_epollfd, srvfd, EPOLLIN ); modfd( m_epollfd, fd, EPOLLIN ); break; } case IOERR: case CLOSED: { free_conn( connection ); return CLOSED; } default: break; } if( connection->m_srv_closed ) { free_conn( connection ); return CLOSED; } break; default: { log( LOG_ERR, __FILE__, __LINE__, "%s", "other operation not support yet" ); break; } } } else if( connection->m_srvfd == fd ) { int cltfd = connection->m_cltfd; switch( type ) { case READ: { RET_CODE res = connection->read_srv(); switch( res ) { case OK: { log( LOG_DEBUG, __FILE__, __LINE__, read from server: %s", connection->m_srv_buf ); } case BUFFER_FULL: { modfd( m_epollfd, cltfd, EPOLLOUT ); break; } case IOERR: case CLOSED: { modfd( m_epollfd, cltfd, EPOLLOUT ); "content connection->m_srv_closed = true; break; } default: break; } break; } case WRITE: { RET_CODE res = connection->write_srv(); switch( res ) { case TRY_AGAIN: { modfd( m_epollfd, fd, EPOLLOUT ); break; } case BUFFER_EMPTY: { modfd( m_epollfd, cltfd, EPOLLIN ); modfd( m_epollfd, fd, EPOLLIN ); break; } case IOERR: case CLOSED: { /* if( connection->m_srv_write_idx connection->m_srvread_idx ) { free_conn( connection ); 2 9 == } else { modfd( m_epollfd, cltfd, EPOLLOUT ); } */ modfd( m_epollfd, cltfd, EPOLLOUT ); connection->m_srv_closed = true; break; } default: break; } break; } default: { log( LOG_ERR, __FILE__, __LINE__, "%s", "other operation not support yet" ); break; } } } else { return NOTHING; } return OK; } 0 3 3.5软件的测试 3.5.1测试计划 功能部分将使用单元测试来确定其适合符合需求,性能部分将使用自动化测试来检验。主要测试为: 1 运行测试; 2 逻辑测试; 3 业务处理能力测试; 4 系统安全性测试; 5 性能测试; 6 高负荷下工作测试; 7 稳定性测试; 8 易用性测试; 3.5.2 软件测试 1. 运行测试 在进行该项测试过程中,按照按照《用户操作手册》对软件进行了全面详细的操作测试,对软件所罗列出的所有功能模块进行了精细的操作,发现了一些容错和反馈信息方面的问题,以及部分功能模块无法实现或出错。 2. 逻辑测试 在进行该项测试过程中,主要对软件的逻辑设计方面进行了深入评判,检查软件设计是否在某些方面有悖于正常的逻辑思维,是否在实际情况相符。发现了一些诸如单个包间可容纳客人数无限制、同一服务员可服务客人数无限制等逻辑错误。 3. 业务处理能力测试 在进行该项测试过程中,主要针对系统对业务的处理能力进行测试,检查了业务处理的连贯性、全面性和正确性,并检查业务处理结果是否满足客户需求。 4. 安全测试 在进行该项测试过程中,检查了系统的安全登录,查看了系统内资料的安全保密性,以及系统会不会有漏洞容易遭受外部的攻击。 5. 性能测试 在进行该项测试过程中,对于系统的运行速度、加载速度、业务处理速度等进行了测试。结果发现如果数据库中有大量数据,此时进行数据库访问,性能将会下降。 6. 高负荷下工作测试 1 3 在进行该项测试过程中,对于当数据库有大量数据,并长时间运行时,软件的运行速度、性能和资源使用情况进行了检查。通过性能监视器分别对服务器的内存、CPU 、硬盘的I/O速度等系统资源的使用情况进行观察,发现系统的资源使用有所提高,查询性能有所降低,但不影响正常使用。 7. 稳定性测试 在进行该项测试过程中,主要看软件是否会出现死机、操作系统或者网络瘫痪、程序崩溃等问题。 8. 易用性测试 在进行该项测试过程中,考察了本软件的界面设计布局是否合理,外形是否美观,操作是否简单无歧义,帮助文档是否简单易懂。 4. 项目开发总结报告 在对该项目进行开发的过程中,我们遇到了很多的困难。在于我们对于市场的研究和可行性考量的过程中。虽然我们明确了设计的目的,但国内以及国际市场的广阔性使我们在对客户需求的分析中走入了迷雾中,因此耽误了很多时间。但是,幸好最后我们还是完成了该项目。而从对该项目的开发中,我们也学到了以下几点。 我们要尽量的让客户也参与到项目的开发团队中来,也就是说我们要使客户把自己也纳入到项目的开发团队中来。如此一来,我们掌握客户需求的真实性、可靠性就会大大的提高, 也就不会为项目的后期功能开发埋下陷阱。 在项目确立后,我们就需要做好项目开发计划,需求调研用时,开发用时,测试用时,实施用时,维护用时。在我们做好了计划后,我们要随时的跟踪计划任务的完成进度,从而使我们的项目进度掌控在我们的开发周期范围之内,今日计划、行动,明日成功。 在其他行业中,人与人的之间的沟通是很重要的。项目开发也不例外,很好的沟通能够加快项目的进度,这就要求我们每一个开发人员要学会和善于沟通于客户和同事之间。在一个项目的开发过程中,我们与客户的沟通是一个不断交流和沟通的过程。在开发到一定的阶段,我们就需要和客户沟通已有功能,尽量的去避免一些隐藏的问题,及时的发现问题,解决问题,从而按时或者提前完成项目的开发。 2 3 3 3 目录 1 项目内容 ................................................................................................................................... 3 1.1 项目目的 ....................................................................................................................... 3 1.2 项目任务 ....................................................................................................................... 3 GIS软件底层开发 .................................................................................................................... 3 2.1 技术路线 ....................................................................................................................... 3 2.1.1 需求分析 ........................................................................................................... 3 2.1.2 项目设计 ........................................................................................................... 4 2.1.3 项目开发 ........................................................................................................... 5 2.2 逻辑结构 ....................................................................................................................... 5 2.3 GIS系统功能设计 ........................................................................................................ 7 2.3.1 功能概述 ........................................................................................................... 7 2.3.2 功能模块 ........................................................................................................... 8 C#.NET与AE二次开发 .......................................................................................................... 14 3.1 技术路线 ..................................................................................................................... 14 3.1.1 需求分析 ......................................................................................................... 14 3.1.2 项目设计 ......................................................................................................... 15 3.1.3 项目开发 ......................................................................................................... 15 3.2 逻辑结构 ..................................................................................................................... 15 3.3 GIS系统功能设计 ...................................................................................................... 16 3.3.1 功能概述 ......................................................................................................... 16 3.3.2 功能模块 ......................................................................................................... 16 总结......................................................................................................................................... 16 2 3 4 GIS软件开发技术课程 实习报告 院(系)名称:XXXXXXX 班级名称:XXXXX 学生姓名:XXX XX年X月 1 项目内容 1.1 项目目的 进一步了解C++开发的相关知识,掌握C++开发的基本技术,丰富C++开发的实战经验。拓展对C#+AE的二次开发的认识,对接口的调用有一定的了解,其次也是为了增强自己的团队协作意识,了解软件开发的思考角度和主要流程。 1.2 项目任务 实习一(底层开发):解析MIF、MID文件并绘制; 提供图->属性、属性->图的检索; 符号系统符合MapInfo显示规范; 构建空间索引,优化图形绘制和空间检索效率; 实习二(二次开发):SHP数据→MIF数据的格式转换 2 GIS软件底层开发(详) 2.1 技术路线 2.1.1 需求分析 正文:(宋体小四,首行缩进2字符,正文间行距固定为23磅) 1) 任务概述: 本次GIS的底层开发任务是基于MFC的图形绘制和检索,要求在windows环境下实现地图的读取、显示、基础操作(放大、缩小)、添加属性信息、地图目标物索引的建立和查询,根据个人需求使用vs/vc,利用c++语言(可包括部分c语言)。要求软件能够正常运行,并能够进一步做到优化和美化。 2) 数据描述: 数据输入:系统所针对的数据主要包括mif数据和mid数据两种类型,其中mif数据主要储存图形数据,mid数据存储属性数据。 数据输出:mif数据以点、线、面、特殊符号为对象以相应颜色矢量图形呈现在窗体中,mid数据以文字形式呈现。 3) 功能需求: 软件的功能模块划分为文件操作,建立索引、索引查询,符号绘制,图-属性、属性-图的检索。几个模块均通过鼠标点击响应机制实现功能的操作和实现。 4) 性能需求: 软件的性能尽量达到最优,包括数据的精确程度、响应时间、运行时间都尽可能地达到最优。 5) 运行需求: 软件的运行在一般的电脑上均可正常运行,对于软件的运行错误及时检查和修复。 2.1.2 项目设计 1) 总体设计 根据软件的需求分析进行系统总体设计,包括有系统设计阶段和结构设计阶段。其中系统设计阶段主要是对组成系统的文件、程序、文档等进行设计,确定系统的模块组成以及模块之间的相互关系。结构设计则包括了功能结构、数据结构。 系统需求 根据系统的需求分析内容进行软件各个阶段和内容的设计。 主要功能流程图: 2) 接口设计 用户接口 用户通过在PC机上打开软件(要求运行环境为windows系统),通过对软件功能的利用进行数据的交互处理。 外部接口 系统版本必须在Windows7及以上。 GisApp主应用程序必须安装在计算机上。 必须留有足够的硬盘空间。 内部接口 通过打开文件方式获取数据信息,进行数据操作。 软件的其他操作模块基于打开后显示的数据进行 3) 运行设计 一般的处理流程是先打开数据,随后可使用其他功能模块 系统运行时有较友好的界面,基本能够实现用户的数据处理要求 系统响应时间应该符合用户的一般需求,响应时间都应该在10秒之内 2.1.3 项目开发 1) 软件定义: 要求实现的软件为基于底层开发的具有地理数据读取和检索功能的基础地理信息软件。 2) 相关知识 Mif、mid数据读取:MIF 由文件头和数据段组成,第一部分“文件头”定义了版本信息、字符集、投影参数坐标类型与表结构。第二部分为“数据段”,数据段包含MAPINFO 定义的点、线、面、多义线、区域、圆弧、文本、矩形、圆角矩形和椭圆等实体。MID属性数据文件按MIF中定义的属性结构分别描述了每个图形对象的属性内容。 网格索引:格网型空间索引的基本思想是将研究区域用横竖线条划分大小相等或不等的格网,记录每一个格网所包含的空间实体。当用户进行空间查询时,首先计算出用户查询对象所在格网,然后再在该网格中快速查询所选空间实体,这样一来就大大地加速了空间索引的查询速度。 四叉树索引:四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割。四叉树的结构比较简单,并且当空间数据对象分布比较均匀时,具有比较高的空间数据插入和查询效率。 放大:图幅显示范围重新赋值和映射,目标重绘 符号库:符号系统符合MapInfo显示规范。 3) 项目计划: 编写软件设计方案→理解mif、mid数据组织结构→掌握C++/C语言关于读取数据的函数和语句→设计地图数据存储结构→建立符号库→绘制地图→建立索引类、索引管理类→初始化索引网格和网格动态数组→查询操作 4) 项目实施: 根据软件设计书进行软件的编码与测试 5) 项目交付: 第一阶段:数据的读取和绘制 第二阶段:软件成果汇总 2.2 逻辑结构 程序的实现按照面向对象的算法进行设计,利用了类的封装、继承、多态性。 1) 地图数据存储的逻辑结构 2) 网格索引类 3) 建立索引 4) 索引查询 2.3 GIS系统功能设计 2.3.1 功能概述 要求软件能够解析MIF、MID文件并进行绘制;提供图->属性、属性->图的检索;其次构建空间索引,实现查询操作,优化图形绘制和空间检索效率;其中符号系统的设计要符合MapInfo显示规范。 2.3.2 功能模块 1) 打开文件显示 功能描述 用于打开文件夹读取文件内容(这里为mif、mid数据),并显示出来 性能 根据数据量的多少,数据打开和绘制的时间会由实际情况的不同而有所不同。这里所用的数据显示时间不超过5秒 输入项目 在输入文件中选择要输入打开的mif、mia文件 输出项目 这里只要求数据以图形的形式显示出来,不要求进行其他的输出功能 算法 SHGetPathFromIDList(pList, szPath) //把指定的文档或目录地点转换为文档系统路径 OnOpenFolder(szPath);//通过路径打开文件夹 MIFPaths.Add(finder.GetFilePath());//列举所有的在当前目录下的文件,并且将他们的文件名存储在数组里面 ReadMIFData(MIFPaths.GetAt(i));//逐个读取文件 _wfopen_s(&fp, MIFData, _T("r"));//打开mif数据 _wfopen_s(&fp1, MIDData, _T("r"));//打开mid数据 geomap.AddLayer(layer);//逐图层添加 layer->AddObject(obj);//逐对象添加 ((CGeoPolyline *)obj)->AddPoint(CPoint(x1, y1));//线的坐标数据 ((CGeoPoint*)obj)->pt=CPoint(x1,y1);//点的坐标数据 ((CGeoPolygon*)obj)->AddPoint(CPoint(x1, y1));//面的坐标数据 geomap.wcRect = mapRect;//获得图幅显示范围 ///////////////画线 void CGeoPolyline::Draw(CDC *pDC) pDC->MoveTo(pts.GetAt(0)); pDC->LineTo(pts.GetAt(i)); ///////////////画线 pDC->TextOut(pt.x, pt.y, ColumnName); pDC->Ellipse(pt.x - 1000, pt.y - 1000, pt.x + 1000, pt.y + 1000); //////////////画面 void CGeoPolygon::Draw(CDC *pDC) pDC->Polygon(pts.GetData(),pts.GetSize()); 接口 通过按钮和菜单进行相应函数的调用,进而完成数据打开和绘制功能的实现。 限制条件 打开的数据量不能过大,否则会引起系统反应延时等情况; 打开数据类型限制为mif和mid数据。 2) 建立索引 功能描述 对于网格索引而言,建立m×n的格网(这里在程序内部赋值),对每一个网格,遍历所有对象并进行判断,若对象与当前格网相交或包含于格网中,则将对象存储在网格的对象数组中。 对于四叉树索引,设定子节点网格的对象数目阈值,要求每一个处于子节点的网格数组所包含的数量都不低于这个阈值,即每做一次网格的四象限划分都进行一次判断。 性能 格网索引适合于数据量较大的项目建立相应索引,建立的效率高;四叉树索引适合于数据量一般,索引的建立略显麻烦。 输入项目 鼠标操作指令。 输出项目 索引的建立和绘制 算法 建立索引 void CTESTGISView::OnGridIndex() geomap.IntlzIdxArea(a, b);//传递索引行列数 spatialIndex->SetSpatialIndex(wcRect, x, y);//设置索引参数 geoLayer->InitlizeIdxArea();//初始化索引动态数组 ////////////////////点状目标 if (area->IsPolygonInter(rectMIN,area->indexBounding))//判断目标与当前格网区域是否相交 { } ////////////////////线状目标 if (area->IsPolylineInter(pt1, pt2, area->indexBounding)) { area->AddObj(obj);//加入目标 } ////////////////////面状目标 if (area->IsInside(pt, area->indexBounding)) { } geomap.spatialIndex->Draw(pDC);绘制网格 接口 通过按钮和菜单进行相应函数的调用,完成相应索引类型的建立 area->AddObj(obj);//加入目标 area->AddObj(obj);//加入目标 限制条件 格网索引的行列数和四叉树索引的深度都在程序内部实现了设置, 大大缩小了程序的适用范围和使用适度 3) 索引查询 功能描述 获取鼠标在屏幕上绘制的矩形,对于网格索引,逐一遍历网格,判断矩形区域与当网格是否有交集,若有交集则对当前网格内所包含的所有对象逐一遍历,判断是否与矩形区域有交集,若有交集则对该目标进行重绘且颜色要有所改变以区分其他未被选中的目标; 对于四叉树索引,由父节点开始,若有交集,则遍历此父节点的子节点,对每一个子节点做同样的父节点处理,直到到达叶节点结束,对于所有与矩形区域有交集的子节点网格,逐一遍历其中的对象,判断是否与矩形区域有交集,若有交集则对该目标进行重绘且颜色要有所改变以区分其他未被选中的目标; 性能 网格索引查询适合于数据量大的项目,查询算法简单,查询效率高,四叉树索引适合数据量相对较小的项目,查询效率高 输入项目 根据鼠标在屏幕上的绘制输入框选矩形 输出项目 对于被选中的目标进行重绘 算法 void CTESTGISView::BoxSelected() geomap.spatialIndex->SearchIndexArea(&rect); int size = geomap.spatialIndex->SIndexAreas.GetSize(); for (int i = 0; i < size;="" i++)="" {="" indexarea="geomap.spatialIndex-">SIndexAreas.GetAt(i); indexArea->SearchIndexObj(&rect, dc); } ////////////////////////重绘点 if (IsInside(pt, rect)) { ((CGeoPoint*)obj)->Draw(pDC); } ////////////////////////重绘线 if (IsPolylineInter(pt1, pt2, rect)) { ((CGeoPolyline*)obj)->Draw(pDC); } /////////////////////////重绘面 if (IsPolygonInter(rect1,rect)) ((CGeoPolygon *)obj)->Draw(pDC); 接口 通过鼠标点击和菜单进行相应函数的调用,完成相应索引类型的建立 限制条件 目前程序只能满足拉框检索 4) 放大 功能描述 选择拉框放大菜单选项,用鼠标在屏幕需要进行放大的地方绘制合适的矩形框,鼠标松开即可实现放大操作 性能 由于所显示的地图内容均为矢量数据,并且地图的放大操作是基于重绘实现的,所以放大操作所用的时间依赖于数据量的大小 输入项目 鼠标在屏幕绘制矩形框 输出项目 放大后得到的局部图像 算法 void CTESTGISView::OnEnlarge() if (isLarge) { if (abs(pt1.x - pt2.x)<2 ||="" abs(pt1.y="" -="">2><2) return;="" geomap.wcrect.left="pt1.x">pt2.x ? pt2.x : pt1.x; geomap.wcRect.right = pt1.x } geomap.wcRect.top = pt1.y>pt2.y ? pt2.y : pt1.y; Invalidate(); 接口 通过鼠标点击菜单选项和屏幕操作 限制条件 只实现了拉框放大,其他放大功能未实现 3 C#.NET与AE二次开发(略) 3.1 技术路线 3.1.1 需求分析 1) 任务概述: 本次GIS的二次开发任务是基于C#与AE的数据格式转换,要求在windows环境下实现shp数据的读取、shp数据转换为mif数据。 2) 数据描述: 数据输入:输入shp数据 数据输出:数据输出为mif数据格式 3) 功能需求: 软件的功能要求实现shp数据的读取和shp数据转换为mif数据 4) 性能需求: 软件的性能尽量达到最优,包括数据的精确程度、响应时间、运行时间都尽可能地达到最优。 5) 运行需求: 软件的运行在一般的电脑上均可正常运行,对于软件的运行错误及时检查和修复。 3.1.2 项目设计 1) 设计思想:二次开发使用vs开发环境加以实现,并使用了ESRI interop程序集, 它服务于被放置在.NET窗体上的、位于.NET 窗体控件中的ArcGIS控件,这些程序集在托管的.NET代码和非托管的COM代码之间起了桥梁作用。 2) 主要功能流程: 开始→读取数据→弹出对话框→选择shp文件→确定→保存→选择保存路径及输入mif文件名→确定→转化→结束 3) 接口设计: 输入shp文件路径 OpenFileDialog() string fullpath = fd.FileName;//文件路径名 Shapepath = System.IO.Path.GetDirectoryName(fullpath);//得到文件的路径名 Shapename = System.IO.Path.GetFileNameWithoutExtension(fullpath);//不包括后缀的文件名 textInShape.Text = fullpath; 输出mif文件路径 SaveFileDialog() string fullpath = sf.FileName; Mifpath = System.IO.Path.GetDirectoryName(fullpath); Mifname = System.IO.Path.GetFileNameWithoutExtension(fullpath); textOutMif.Text = fullpath; 格式转换 StreamWriter myWrite = newStreamWriter(myStream);//写文件 IWorkspace pWS = pWSF.OpenFromFile(fullpath, 0)//打开工作空间 IFeatureClass pFeatureClass = pFWS.OpenFeatureClass(filename);//打开要素类IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);//逐一要素访问 写文件头/////////// if (geotype == esriGeometryType.esriGeometryPoint)//点 elseif (geotype == esriGeometryType.esriGeometryPolyline)//线 elseif (geotype == esriGeometryType.esriGeometryPolygon)//面myWrite.WriteLine(); 3.1.3 项目开发 3.2 逻辑结构 3.3 GIS系统功能设计 3.3.1 功能概述 输入shp文件路径,输出mif文件路径,进行格式转换 3.3.2 功能模块 根据软件的需求分析进行系统总体设计,包括有系统设计阶段和结构设计阶段。其中系统设计阶段主要是对组成系统的文件、程序、文档等进行设计,确定系统的模块组成以及模块之间的相互关系。结构设计则包括了功能结构、数据结构。 1) 读取shp文件 利用Iworkspace接口来对Gis中的数据库文件进行操作,因为shp文件是点集集合、数据集合和其索引文件的集合,所以需要通过专门的接口来实现。 2) 写入mif数据 通过接口调用函数,判断读取信息类型,根据不同类型信息编辑数据 4 总结 本次实习我主要操作了底层开发的内容,从读取mif数据开始逐渐从基础学起,通过网上查阅和反复询问,尝试和反复修改逐渐在编写程序的过程中理解其中的逻辑结构和语法,在实习的中段开始认识到一直困惑和为难的函数和语句的使用其实并非很关键,重要的是编程的思路要理清,对类的封装和调用之间的关系要清楚,而需要用到哪些函数或功能可以查阅相关资料和示例,理解之后转换为自己的内容即可。 安徽工业大学 软 件 开 发 技 术 报 告 课题名称 图书馆管理系统的设计与实现 学 院 计 算 机 专业班级 计 0841 组 长 孙进磊 成 员 王景山,叶万晴,张春源, 杨茗,周庆燕 摘 要 摘要内容略。 关键词:3-5个。 目录 1.绪 论 ......................................................................................................................................... 1 1.1 概述 . .................................................................................................................................. 1 1.2 开发环境与工具介绍 . ...................................................................................................... 1 1.2.1 ADO.NET简介 . ....................................................................................................... 1 1.2.2 xxx研究状况 . ....................................................................................................... 1 2.可行性研究 . ................................................................................................................................ 2 2.1 技术可行性 . ...................................................................................................................... 2 2.2 经济可行性 . ...................................................................................................................... 2 2.3 操作可行性 . ...................................................................................................................... 2 2.4 结论 . .................................................................................................................................. 2 3.系统需求分析 . ............................................................................................................................ 3 3.1 用户需求分析 . .................................................................................................................. 3 3.1.1 用户需求 . .............................................................................................................. 3 3.1.2 系统功能需求 . ...................................................................................................... 3 3.1.3 系统性能需求 . ...................................................................................................... 3 3.1.4 数据分析 . .............................................................................................................. 3 3.2 系统 DFD 图 . ...................................................................................................................... 3 3.3 系统 E-R 图 . ...................................................................................................................... 3 4.系统设计 . .................................................................................................................................... 4 4.1 数据库逻辑结构设计 . ...................................................................................................... 6 4.2 功能模块图及分模块功能描述 . ...................................................................................... 6 4.2.1 系统的功能模块图 . .............................................................................................. 6 4.2.2 系统功能模块简介 . ............................................................................................ 14 5.系统实施 . .................................................................................................................................. 15 5.1 建立数据库 . .................................................................................................................... 15 5.2 数据库连接 . .................................................................................................................... 17 5.3 主要模块实施 . ................................................................................................................ 17 5.3.1 登录模块的开发 . ................................................................................................ 17 5.3.2 xxxxx. .................................................................................................................. 19 5.4 系统测试 . ........................................................................................................................ 22 5.4.1 软件测试的对象 . ................................................................................................ 22 5.4.2 软件测试的结果 . ................................................................................................ 22 6.系统说明 . .................................................................................................................................. 22 6.1 开发环境 . ........................................................................................................................ 23 6.2 系统安装与配置 . ............................................................................................................ 23 总 结 .............................................................................................................................................. 24 参考文献 ......................................................................................................................................... 25 1.绪 论 1.1 概述 - - - - - - - - -(内容省略) - - - - - - - - - - - - - - - - - - 1.2 开发环境与工具介绍 网站开发环境:Microsoft Visual Studio 2005集成开发环境 网站开发 语言:ASP.NET+C# 网站后台数据库:SQL Server 2000 开发环境运行平台:Windows XP 1.2.1 ADO.NET简介 ADO.NET 是与数据源交互的 .NET 技术。有许多的 Data Providers ,它将允许与不同的数据源 交流 ―― 取决于它们所使用的协议或者数据库。然而无论使用什么样的 Data Provider,你将 使用相似的对象与数据源进行交互。 SqlConnection 对象管理与数据源的连接。 SqlCommand 对象允许你与数据源交流并发送命令给它。为了对进行快速的只 “ 向前 ” 地读取数据,使用 SqlDataReader 。如果想使用断开数据,使用 DataSet 并实现能进行读取或者写入数据源的 SqlDataAdapter 。 1.2.2企业自动化管理研究状况 人事管理、 企业重组再造、 追求速度效益和集成管理。 管理学科研究的主要热点与方向是混 沌理论、学习型组织与企业再造、不确定性管理决策、综合集成系统和人力资源开发管理。 2.可行性研究 2.1 技术可行性 网络化的办公管理, 使企业管理更加规范, 实现了通过网络对信息进行发 布、传递、接受、等一系列功能。系统中设置的个人办公管理模块,为个人办公 提供了一个更为方便的管理平台, 大大提高个人办公的工作效率, 进而提高整个 企业的办公效率、 2.2 经济可行性 通过网站对企业内部信息进行全面的自动化管理,可以大大提高企业的办 公效率。 通过企业生产经营过程中的数据进行全面的管理和统计, 避免人为处理 各种数据时所产生的各种问题, 提高企业的经济效益, 为企业经营决策提供大量 的、权威的数据是企业的管理逐渐实现科学化、系统化。 2.3 操作可行性 所谓可行性研究, 是指在进行项目投资、 工程建设之前的准备性研究工作。 它是经济活动中 经常使用的一种决策程序和手段, 也是投资前的必要环节。 可行性研究通常可分为四个阶段:第一阶段, 机会可行性研究, 也称为投资机会鉴定。 在这一阶段包括粗略的市场调查和预测, 寻找某一地区或某一范围内的投资机会并初步估算投资费用。第二阶段:初步可行性研究。 在投资机会研究的基础上, 进一步较为系统地研究投资机会的可行性, 包括对市场的进一步 考察分析等。第三阶段:详细可行性研究,也称技术经济可行性研究。 这是确定一个投资项 目是否可行的最终研究阶段。包括市场近期、远期需求,资源、能源、技术协作落实情况, 最佳工艺流程及其相应设备, 厂址选择及厂区布置, 设计组织系统和人员培训, 建设投资费 用,资金来源及偿还办法,生产成本,投资效果等。第四阶段:形成可行性研究报 告 . 2.4 结论 - - - - - - - - -(内容省略) - - - - - - - - - - - - - - - - - 3.系统需求分析 3.1 用户需求分析 3.1.1 用户需求 对于企业自动化办公系统来说提高办公效率、 方便企业人员的协作是至关 重要的。公司允许员工发表自己的意见和想法和丰富的活动。员工在工作中 可以传送和接受文件。员工上下班实行考勤制度。公司有事件是实行文件公 告。为此确定系统应包括部门管理、员工管理、公告管理、文件管理、交流 管理、考勤管理、规章制度管理、系统管理等功能。 3.1.2 系统功能需求 在充分理解企业自动化管理的需求基础上, 根据企业自动化管理的需要, 我们设计此 方案,来最大限度满足企业自动化管理的需求。 3.1.3 系统性能需求 3.1.4 数据分析 - - - - - - - - -(内容省略) - - - - - - - - - - - - - - - - - 3.2 系统 DFD 图 - - - - - - - - -(内容省略) - - - - - - - - - - - - - - - - - 3.3 系统 E-R 图 根据以上对系统分析和设计及功能结构的确定, 规划出系统中使用的数据库实体对象 分别为企业部门实体、企业员工实体、传送文件实体、记事本实体公告信息实体、 企业规章 制度实体、员工考勤实体、考勤时间设置实体、系统用户实体、投票信息实体等。 实体间关系 E-R 图 企业员工实体 E-R 图如下 传送文件实体 E-R 图如下 公告信息实体 E-R 图 企业规章制度实体 E-R 图如下 员工考勤实体 E-R 图如下 考勤时间设置实体 E-R 图如下 投票信息实体 E-R 图如下 4.系统设计 4.1 数据库逻辑结构设计 - - - - - - - - -(内容省略) - - - - - - - - - - - - - - - - - 4.2 功能模块图及分模块功能描述 4.2.1 系统的功能模块图 系统主页如下:在用户名栏中填写用户名和密码,管理员默认用户名为 admin ,密码 为空。职员管理由职工自己设定。 1. 管理员登陆界面如下: 1.1管理员登录时的公告管理:在标题栏中写入标题在内容框中写入发布内容点击发布即可 看到法不标题及内容。 1.2管理员登录时的考勤管理 考勤时间设置:输入考勤上班时间和下班时间点击设置设置成功时间。上班和下班 时点击签到和签退即可。 1.3管理员登录时的系统管理 个人密码设置:修改管理员和职员密码。 1.4管理员登录时的职位管理:新建和编辑职位信息。 1.5 管理员登录时的部门管理:新建和编辑部门信息。 1.6管理员登录时的员工管理:新建和编辑、删除职员信息。 1.6管理员登录时的规章制度管理:编辑规章制度。 2. 职员登陆的界面: 2.1 职员登录时的桌面:可以查看公告、规章制度以及修改个人密码。 2.2 职员登录时的文件管理:可以传送文件、接收文件以及删除文件。 2.3职员登录时的考勤管理:职员上班和下班需点击签到和签退。 4.2.2 系统功能模块简介 1. 在管理员登陆界面的下: (1) 用户使用管理员权限进行登录可对所有信息进行管理操作 (2)单击“公告管理” /“查看公告”菜单项,查看及删除公告信息操作。 (3)单击“公告管理” /“发布公告”菜单项,对公告信息进行发布操作。 (4)单击“文件管理” /“传送文件”菜单项,对文件进行传送操作。 (5)单击“文件管理” /“接收文件”菜单项,对文件进行接收、查看及下载操作。 (6)单击“文件管理” /“删除文件”菜单项,对已发送或接收的文件进行删除操作。 (7)单击“交流管理” /“发送短信息”菜单项,对发送短信息操作(可同时给多个人发送 短信息) 。 (8)单击“交流管理” /“设置投票活动”菜单项,对投票活动内容进行添加操作。 (9)单击“交流管理” /“活动投票”菜单项,对活动进行投票操作。 (10)单击“交流管理” /“查看投票结果”菜单项,对投票结果进行查看操作。 (11)通过“考勤管理”下拉菜单,可对考勤时间及上下班签到进行设置、填写。 (12)单击“系统管理” /“人个密码设置”菜单项,对个人的密码进行重新设置操作。 (13)单击“系统管理” /“操作员设置”菜单项,对系统操作员信息进行设置及删除操作。 (14)单击“部门管理” /“新建部门”菜单项,对部门信息进行添加操作。 (15)单击“部门管理” /“编辑部门信息”菜单项,对部门信息进行查看、修改及删除操 作。 (16)单击“员工管理” /“添加员工信息”菜单项,对员工信息进行添加操作。 (17)单击“员工管理” /“编辑员工信息”菜单项,对员工信息进行查看、修改及删除操 作。 (18)通过“规章制度管理”下拉菜单,可对规章制度进行更新及查看操作。 2. 在职员登陆界面的下用户使用职员权限进行登录可对考勤、文件传送、修改个人密码及 查看信息等操作。 5.系统实施 5.1 建立数据库 表 tb_department: 表 tb_employee: 表 tb_file: 表 tb_note: 表 tb_notice: 表 tb_position :表 tb_rule: 表 tb_sign: 表 tb_signstate: 表 tb_sysUser: 表 tb_vote: 5.2 数据库连接 在项目中添加 web.confing 文件配置数据库连接。 5.3 主要模块实施 5.3.1 登录模块的开发 前台开发代码: 用户名: Width = 密 码: Font-Size = OnClick = 后台开发代码: public partial class UserControl_Logon : System.Web.UI.UserControl { BaseClass bc = new BaseClass (); protected void Page_Load(object sender, EventArgs e) { } protected void btnCandel_Click(object sender, EventArgs e) { txtName.Text = txtPwd.Text = } protected void btnLogin_Click(object sender, EventArgs e) { if (txtPwd.Text == { Response.Write(bc.MessageBox( return ; } if (rdoBtnAdmin.Checked) //系统管理员登录 { DataSet ds = bc.GetDataSet( if (ds.Tables[0].Rows.Count>0) { //登录成功后,设置登录时间和标识 bc.ExecSQL( //存储登录用户名称 Session[ //登录成功后,进入系统主页 Response.Redirect( } else { Response.Write(bc.MessageBox( } } else //普通操作职员 { DataSet ds = bc.GetDataSet( if (ds.Tables[0].Rows.Count > 0) { //登录成功后,设置登录时间和标识 bc.ExecSQL( Session[ Response.Redirect( } else { Response.Write(bc.MessageBox( } } } } 5.3.2 管理员模块 Value = Value = NavigateUrl = Text = NavigateUrl = Text = NavigateUrl = Text = Value = Target = Value = Value = Value = Value = NavigateUrl = Value = Value = Target = Value = Target = NodeSpacing = Width = VerticalPadding = 5.3.3 职员登陆模块 Target = Value = Target = Value = NavigateUrl = Target = Value = Target = Value = Target = Value = Target = Value = Target = Value = NavigateUrl = Text = NavigateUrl = Text = 5.4 系统测试 5.4.1 软件测试的对象 1. 管理员测试: 测试名称 admin 公告测试: 2. 职位管理测试: 5.4.2 软件测试的结果 公告管理测试成功。 职位管理测是成功。 6.系统说明 6.1 开发环境 本系统的是在 ASP .NET 平台下开发的, 系统的后台数据库为 SQL Server 2000; 因此在使用本系统前, 应先安装 ASP .NET 框架和 SQL Server 2000数据库, 否则该 系统无法运行。 6.2 系统安装与配置 系统的原文件直接复制到机器上后,在数据库管理系统上建立一个名为 Design 的数据库后,系统便可以。 总 结 通过这次实习我们学习了应用 ASP.NET 开发企业管理软件了解了开发软件的流程。了 解到软件不是一个人的产品要通过团队合作来完成。 同时让我们了解到自己的不足之处, 以 便于自己多努力锻炼自己的各方面能力。 参考文献 ASP.NET 项目开发案例全程实录(第二版)??????郑齐心、房大伟、刘云峰等编著。 ?精品文档? 软件开发述职报告 “又是一年毕业时”,看到一批批学子离开人生的象牙塔,走上各自的工作岗位,想想自己也曾经意气风发、踌躇满志,不觉感叹万千……本文是自己工作6年的经历沉淀或者经验提炼,希望对所有的软件工程师们有所帮助,早日实现自己的人生目标本文主要是关于软件开发人员如何提高自己的软件专业技术方面的具体建议,前面几点旨在确定大的方向,算是废话吧谨以此文献给那个自己为你奉献3年青春与激情的开发团队还有团队成员,PPL、YT、YK 、TYF、LGL、CHL、CDY、CB、DPD1、 分享第一条经验,“学历代表过去、能力代表现在、学习力代表未来”其实这是一个来自国外教育领域的一个研究结果相信工作过几年、十几年的朋友对这个道理有些体会吧但我相信这一点也很重要,“重要的道理明白太晚将抱憾终生,”所以放在每一条,让刚刚毕业的朋友们早点看到哈,2、 一定要确定自己的发展方向,并为此目的制定可行的计划不要说什么,“我刚毕业,还不知道将来可能做什么,”,“跟着感觉走,先做做看”因为,这样的观点会通过你的潜意识去暗示你的行为无所事事、碌碌无为一直做技术,将来成为专家级人物,向管理方向走,成为职业经理人,先熟悉行业和领域,将来自立门户,还是先在行业里面混混,过几年转行做点别的,这很重要,它将决定你近几年、十年内“做什么事情才是在做正确的事情,”3、 软件开 1 / 12 ?精品文档? 发团队中,技术不是万能的,但没有技术是万万不能的,在技术型团队中,技术与人品同等重要,当然长相也比较重要哈,尤其在MM比较多的团队中在软件项目团队中,技术水平是受人重视和尊重的重要砝码无论你是做管理、系统分析、设计、编码,还是产品管理、测试、文档、实施、维护,多少你都要有技术基础算我孤陋寡闻,我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目,哪怕就一个,也没有看到倒是曾经看到过一个“高学历的牛人”(非技术型)带一堆人做完过一个项目,项目交付的第二天,项目组成员扔下一句“再也受不了啦,”四分五裂、各奔东西那个项目的“成功度”大家可想而知了4、 详细制定自己软件开发专业知识学习计划,并注意及时修正和调整(软件开发技术变化实在太快)请牢记,“如果一个软件开发人员在1、2年内都没有更新过自己的知识,那么,其实他已经不再属于这个行业了”不要告诉自己没有时间来自时间管理领域的著名的“三八原则”告诫我们,另外的那8小时如何使用将决定你的人生成败,本人自毕业以来,平均每天实际学习时间超过2小时5、 书籍是人类进步的阶梯,对软件开发人员尤其如此书籍是学习知识的最有效途径,不要过多地指望在工作中能遇到“世外高人”,并不厌其烦地教你对于花钱买书,我个人经验是,千万别买国内那帮人出的书,我买的那些家伙出的书,!00%全部后悔了,无一本例外更气愤的是, 2 / 12 ?精品文档? 这些书在二手市场的地摊上都很难卖掉“拥有书籍并不表示拥有知识,拥有知识并不表示拥有技能,拥有技能并不表示拥有文化,拥有文化并不表示拥有智慧”只有将书本变成的自己智慧,才算是真正拥有了它6、 不要仅局限于对某项技术的表面使用上,哪怕你只是偶尔用一、二次“对任何事物不究就里”是任何行业的工程师所不应该具备的素质开发Windows应用程序,看看Windows程序的设计、加载、执行原理,分析一下PE文件格式,试试用SDK开发从头开发一个Windows应用程序,用VC,,、Delphi、Java、.Net开发应用程序,花时间去研究一下MFC、VCL、J2EE、.Net它们框架设计或者源码,除了会用J2EE、JBoss、Spring、Hibernate等等优秀的开源产品或者框架,抽空看看大师们是如何抽象、分析、设计和实现那些类似问题的通用解决方案的试着这样做做,你以后的工作将会少遇到一些让你不明就里、一头雾水的问题,因为,软件工程师述职报告作为刚从学校出来的应届毕业生,第一份工作就落在智通,来到智通,深深地被这个企业的文化所感染,我很认同智通的企业文化,智通的企业精神“统一,专一,事业第一”体现出了这一行业优秀企业文化的特点在这三个月的学习与亲身感受之下,我更加坚定地要使自己成为一名合格并争取优秀的智通人,我对自己有信心,对智通更有信心作为一名在技术岗位的职员,要具备一定的专业知识,不断地充实自己,在不 3 / 12 ?精品文档? 断的工作学习与研究中成长,要有很好的团队协作精神,有很强的执行力,能真正为企业做实事在智通上班的三个月里,我主要完成了以下工作项目,在网站技术部工作的三个月里,自己感受非常多首先,作为刚从学校出来的毕业生,在实际开发中的经验尚不够成熟,还需要在工作中不断的提升自己其次,要进一步提高自己的开发技能,使自己的技能满足今后的需求,主动获取并学习当今最新技术信息,平衡自己的知识结构,在不断的学习中提高自己然后,要加强与同事们的沟通,融入团队,互相学习、相互提高,在团队中不断完善自己软件开发人员工作总结金秋十月是个收获季节,希望我们每一天的生活都如这个季节一样,又一个月过去了,现对工作中收获与不足总结一、工作内容九月份的工作比较繁忙,工作重点有四方面,s6测试,医院软件开发、测试,售后服务,文档书写及培训1、关于s6测试s6的新增修改功能大约30多项内容,测试的重点如,其一,每日结账时更正库存的操作,此项功能涉及的方面比较多,影响数据的准确性,测试起来比较烦琐、测试量也比较大,其二,由于业务开票时程序内部处理发生了改变,由原来的控制台转移到存储过程中处理,所以对此部分也进行了重点测试,其三,饮片划价自动批号的测试,其它方面的测试包括,gsp报表、客户对应商品销售、批次会员录入以及远程配送价格等的测试,再有就是售后人员随时提出的问题随时测试,如 4 / 12 ?精品文档? 打印模块加完打印项还是不能打印、某些模板在99pbl修改以后还是不好用、哪个报表数据是否有问题等2、医院软件开发、测试对于新版医院软件的功能模块开发工作也做出了一点贡献,作了15个打印模块,12个查询模块,所做模块包含的内容为,菜单挂接、将窗口中不需要的按钮隐藏、书写查询报表中所需要的sql语句、打印模块及查询模块所需的数据窗口大约80个,测试方面,现在只是进行了表面性的测试,测试的内容包括每个窗口中的字体是否一致、按钮是否对齐、点击按钮后弹出的提示是否正确、开票窗口的金额、价格、数量、库存等的变内蒙古金财信息技术有限公司研发二部-孟磊 年终总结2013年终总结回顾2013年5月入职到现在大半年的工作,我在公司领导及各位同事的支持和帮助下,按照公司要求,比较好地完成了本职工作现将这一年的工作情况总结如下,一、项目时间点及各阶段工作二、测试总结中间业务平台管理系统集成测试阶段,缺陷数据分配表1、需求问题,系统维护->账户维护新增时,账户类型字段是从数据库配置,联社方想通过页面控制此字段此问题在集成测试时,熬民就提出要从系统页面上新增,当时认为需求没提出此功能忽略了隐性需求导致后期东北农电项目上线需要从数据库大量配置通讯配置表教训,今后测试不止测试功能是否实现,需要考虑和结合系统与系统之间的关联关系,眼光放得在长远些 2、技术实现问题,集成测试时, 5 / 12 ?精品文档? 管理系统新增账户时其合法性需要与核心校验,此问题集成测试通过,但在上线验证阶段发现此功能没实现后经过与研发人员沟通此功能实现方式是单位关联维护时,核心直连标志选择不直连,则此业务新增账户时则不与核心校验账户功能实现逻辑就是错误,而测试基于错误的逻辑去做集成测试 教训,测试角度,只测试了功能实现与否,没测试功能实现的方式对不对 研发角度,重要的功能实现方式及其业务逻辑在编码前多跟测试人员交流,说明其实现方式项目经理能参与评审研发人员的设计文档把缺陷扼杀在摇篮之中 3、迁移配置问题,如,“机构下载提示,“FTP下载失败””、”柜员登录业务系统时提示,“用户失效””、“缴费查询时,生成批次号错误”等教训,上线中的运维手册、配置手册操作手册等文档写的不详细、描述的不够清楚,导致上线验证阶段有一半儿的问题都是迁移导致今后站在用户角度去编写文档尽量写的详细,不仅提高软件本身的质量,也要提高文档的质量乌拉特前旗财政代发加密,1、前期软件交付时财政不认可,此软件是前旗农村商业银行委托我们为前旗财政局研发一款代发工资加密软件但在软件交付时,财政完全不认可导致项目推翻重新开发教训,如果项目涉及到三方或者多方时,一定在研发工作前把握用户最原始的需求,可能从中间方挖掘出的需求并不是最终用户想要的结果中间业务代理校园一卡通,1、交易最少、问题最多的项目导致问题原因如下,研 6 / 12 ?精品文档? 发人员经常变动性大,几乎研发二部所有人都参与过此项目支持,看别人代码需要大量时间,甚至比重新研发都要费时间接口联调阶段对方工程师不在场集成测试时,对账是报文模拟,这就导致一部分案例无法覆盖到教训:在软件的生命周期内希望公司能够保持各个阶段的研发人员的稳定性用报文模拟的集成本身就存在风险,希望今后的项目中能得到第三方仿真端来降低成本,节省测试成本在案例设计方面多模拟用户真实环境三、自身存在的不足及其后期计划金财公司的工作同我之前的工作有很大不同,之前公司的测试工作只需要完成三轮集成测试的工作即可,在金财公司的测试工作不单单是测试,更是涉及到是质量管理、质量监督、质量控制的工作,同我之前相比感觉每天都在进步,大半年工作让我有所进步,但是很多地方还是存在不足,比如,1. 接到工作任务后一味的去做,做到一半发现做不下去或者做的不对做事情没方法2. 在描述一个缺陷的现象时,尽量去挖掘产生问题的原因,在定位缺陷的能力上多下一些功夫,为开发减少工作量 在2014年的工作中,我计划,1. 今后工作要学会分析事物,找到做事的办法,提前把思路汇报给上级, 2. 要尽可能深刻的理解需求,坚持编写覆盖率强的测试用例, 3. 做好管理系统、一卡通、华北市电的运维工作,4. 学会环境搭建、保持开发与测试有两套环境避免相互影响2013年年终总结2013年7月23日,我有幸成为公司一员我进入 7 / 12 ?精品文档? 公司也快6个月,回首过去的几个月中我也感受到不少的喜悦,尤其在公司度过的时间让我难忘因为在领导的指导下,同事大力的帮助下,客服了不少困难,因此我也成长了不少可以说是虚心学习,努力工作,以团队的利益和进度为中心是我一直坚守的原则虽然说在这短短的几个月中没有辉煌的成果,也算是经历了一段不平凡的考验因为我在公司感受到了团队的力量,同时也让自己更适合团队工作,尤其是我在技术方面更是突破不少,从以前的认识与了解到今天的熟练,想到此内心无比高兴尤其是刚进公司的两个月,想想当时的我是多么的笨拙和弱小,因为进入公司以后对于公司需求和业务流程不是很熟悉在同事不断帮助和指导下让我迅速提升起来以适应公司需求,以至于后来的工作做得非常舒心愉快 2013年度个人主要工作内容和任务的完成情况2013年度,我的主要工作集中在产品研发及优化领域,现将参与的主要工作内容和任务的完成情况总结如下,一、新人学习对公司的整体状况和运营模式进行了解,重点针对合同管理系统的适用领域、场景以及客户群体、一般性需求进行学习熟悉公司技术团的工作模式、编码规范和研发管理控制流程 通过对公司产品关注领域和业务流程的学习以及研发规范的了解,梳理了技术学习主线,制定了具体的学习目标和时间计划为技术研发工作奠定了基础二、公司***平台的研发参 8 / 12 ?精品文档? 与了***平台的部分功能研发,主要参与以下功能模块的代码编制、优化和初步的功能验证测试,系统平台对接浪潮系统、系统对接审批事项清单模块,系统管理模块,筹备成立模块、成立登记模块、分支机构管理、组织管理、注销信息管理、变更信息管理等等在研发中,按照团队规划完成了个人的任务并按照编码规范进行了源码优化对于部分编码进行分析和重构,对于部分功能模块进行了效率优化和源码简化,提升代码的可读性、可复用性、可移植性整个研发过程,积极融入团队,提升技术水平的同时进一步加深了对公司产品业务的理解 三、公司产品***平台的优化参与产品***平台的优化使用技术方法通过重构改进了产品的运行效率从构建模式、实现方法、代码风格上进行了多方面的知识整理、分析和优化并以此为契机,强化了效率优化的意识,学习了效率优化的方法,同时,增强了研发中兼顾效率的意识2013年度个人取得的成绩和经验2013年是我进入公司的第一年,无论是对于生活阅历还是工作经验以及技术知识都取 得了很大的成效与进步在公司的几个月里我着实成长了许多,尤其是对专业知识技能的提升、此外还增长了一些对行业的认识以及开发流程 2013年度个人工作中存在的问题和不足及改进方法刚进公司的时候我面临很多问题,在工作中遇到非常多棘手的问 9 / 12 ?精品文档? 题,不断请教前辈们.有了他们的帮助和自己坚持努力,我发现我所遇到棘手问题越来越少,就这样我从一个新人慢慢变成一个可以担当一面的团队成员,我再也不怕遇到问题在未来的一年里我应该多锻炼自己表达能力和加强对普通话的学习,其次,对于技术方面了解不够全面,不够广泛,好多技术都还处于一个熟悉、认知阶段在未来的日子里我会给自己拟定一些目标和学习、提升路线,让自己技术以及各方面不断的提高不让自己只局限于技术方面的提升与提高 在工作中我体会到了坚持就是胜利,程序员必须有较强的适应能力和承受能力,需要不断的进行学习补充新的知识,只有不断的扩充、更新自己的知识才能应变技术的更新与发展 提出目前公司存在的各方面问题及合理化建议公司领导比较给力、很会照顾下属,同事之间也比较容易相处,团队互助性也比较强但是我们公司对于技术上是不是应该增加一点技术储备方面东西我希望公司能够一个强大知识库,比如某一天某个人解决了一个极难解决或者比较罕见的问题有必要保存到知识库里,以备后续之人有一个学习认知的空间 对自己2013年度整体表现的客观评价2013年度是我在学习中不断总结经验、吸取教训、获得成长的年度本年度的工作中,我认真制定工作计划,按时完成工作任务并适时进行总结和分析,关注功能实现、代码规范、效率优化和用户 10 / 12 ?精品文档? 体验努力开展对本职工作所需专业技术学习,优化知识结构,并不断深化对合同管理业务的理解团队建设上,我积极融入团队,努力营造良好的团队氛围,和同事关系融洽综上所述,对于2013年的工作整体表现,我对自己的评定是满意的 2014年年度工作计划安排1. 在原有体系不变动情况下,配合团队完成社会组织信息系统后续的开发2. 加强自己工作中阐述问题的能力和分析能力以及解决问题的能力3. 不断学习新的技术与知识,让自己更能适应新的需求发展变化,给自己制定一个短期目标以计划 4. 努力更正自己开发习惯,提升自己开发技巧5. 了解技术以外的知识,摆脱自己“机器人”的概念 个人职业生涯规划一、 短期目标 合理规划自己时间,给自己制定一个工作之余的学习计划,学习目标,在工作不断吸取经验教训加以总结汇总,不断更正自己工作习惯二、长期目标在不断巩固自己专业知识前提下,加深对业务的理解能力、分析能力、主导能力、不断充实自己各方面知识技能,强化自己薄弱环节做一个合格高级软件工程师 研发部 2014-01-10 11 / 12 ?精品文档? 12 / 12 软件开发分析报告 版本号 1.0 修订历史 目录 1. 引言 . ........................................................................................................................................... 3 1.1项目背景 .............................................................................................................................. 3 1.2术语定义 .............................................................................................................................. 3 1.3参考资料 .............................................................................................................................. 3 2. 市场可行性 . ............................................................................................................................... 3 2.1市场前景 .............................................................................................................................. 3 2.2产品定位 .............................................................................................................................. 3 3. 技术可行性 . ............................................................................................................................... 4 3.1功能说明 .............................................................................................................................. 4 3.2技术分析 .............................................................................................................................. 4 4. 资源可行性 . ............................................................................................................................... 4 4.1人力资源 .............................................................................................................................. 4 4.2软件资源 .............................................................................................................................. 4 4.3设备资源 .............................................................................................................................. 4 4.4时间资源 .............................................................................................................................. 5 5. 经济可行性 . ............................................................................................................................... 5 5.1投资规划 .............................................................................................................................. 5 5.1.1 基础投资 . ...................................................................................................................... 5 5.1.2 直接投资 . ...................................................................................................................... 5 5.2收益分析 .............................................................................................................................. 5 5.2.1 定量收益 . ...................................................................................................................... 5 5.2.2 非定量收益 . .................................................................................................................. 5 5.3投资收益率 .......................................................................................................................... 5 5.4投资回收期 .......................................................................................................................... 5 6. 社会可行性 . ............................................................................................................................... 6 6.1法律可行性 .......................................................................................................................... 6 6.2政策可行性 .......................................................................................................................... 6 6.3使用可行性 .......................................................................................................................... 6 7. 评价过程 . ................................................................................................................................... 6 7.1评价标准 .............................................................................................................................. 6 7.2评价结果 .............................................................................................................................. 6 8. 结论 . ........................................................................................................................................... 7 1. 引言 1.1项目背景 随着人民生活水平的提高, 以及我国休假制度的完善, 人们拥有了更长更多的假期, 而 假期外出旅游成为了越来越多的人们度过假期的第一选择。 在这样的背景前提下, 各大旅游 景区更是成为了热门中的热门,这也造成了在旅游高峰期部分旅游景点人流过大导致拥堵, 从而影响到游客旅游体验的问题。 不过从根本上来说, 并不主要是因为游客数量的过大, 往 往是因为景区的服务不够全面细致, 管理不够科学, 效率不高所造成的, 例如景区内部的地 标不够详细或者是不够完整都可能会影响的游客游玩时的顺畅性。 另一方面来说, 游客人数 的急剧增长所带来的安全问题, 如游客的人生安全, 景区的设施安全等也日益明显突出起来, 系统化、电子化、网络化、智能化的景区管理系统也成为了日益迫切的需求,本项目就是在 这样的背景下提出的,旨在开发出一个能够方便游客、便于景区管理的景区导览系统。 1.2术语定义 Java :Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言。 Java 技术具 有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人 PC 、数据中心、游戏控 制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球 云计算和移动互联网的产业环境下, Java 更具备了显著优势和广阔前景。 Android :Android 是一种以 Linux 为基础的开放源代码操作系统, 主要使用于便携设备。 该平台由操作系统、中间件、用户界面和应用软件组成。 Wifi :Wi-Fi 是一种可以将个人电脑、手持设备(如 PDA 、手机)等终端以无线方式互 相连接的技术。 1.3参考资料 2.1市场前景 客户端的开发是基于谷歌 android 操作系统平台的,该操作系统是目前最火热的几大主 流操作系统之一, 具有巨大的市场和发展潜力, 有望在未来几年成为移动电子设备上占有量 最大的操作系统,因此本软件选择在之上进行开发,另外, 编程语言选择 Java ,因此具有较好的可移植性。 2.2产品定位 该系统将要完成的是旅游景区的导览功能。 这里提到的导览, 是指景区向游客提供的一 种服务,这种服务的目的是让游客能够方便的获取景区的各种介绍信息以及景区的实时状 态, 例如景区内各个分景点的人流是否拥挤、 分景点的游览车的数量等等, 还要提供相应的 查询功能, 例如查询欲知景点的位置信息, 当前位置到该景点的距离及绘制出最合适的路径 轨迹信息等等。在游客拥有自己的 PDA 设备的前提下,利用手持设备的 wifi 功能,向游客的 设备传输对应景区的览文件(如视频介绍,文字介绍,以及查询服务)。并且完成提供导览 文件资源服务器资源数据的管理, 例如日常维护, 更新文件资源等, 并且提供对客户终端请 求的处理。 该产品使用方便简易,软件设计的提供给操作人员的接口仅仅会涉及到简单的文件新 建、修改、复制、删除等操作,因此仅仅需要操作人员熟悉简单的电脑操作即可,不需要专 门进行培训。 该产品价格公道,功能齐全,且非常有实用性,如今市场上这类产品不多,所以很有市 场前景。 3. 技术可行性 3.1功能说明 具体有如下一些功能:登陆服务器,缩放地图,定位,查询定位景点,获取景点多媒体 信息,根据名称获取经纬数值,计算当前位置与指定景点的路程,获取当前各景点状况(人 数、车辆数)景点实时监控,景点人数超额报警,查询数据,分析数据,模拟疏散模型,新 增导览信息,删除导览信息,更新导览信息,定期维护,操作导览资源数据库。 3.2技术分析 见下表: 4. 资源可行性 4.1人力资源 本项目需要精通 Java 语言的软件工程师和高级系统分析师,约三名工程师,一名系统 分析师,并组成一个团队,共同完成该项目的研发。公司目前有足够数量的软件工程师,所 以,可以进行该项目的开发。 4.2软件资源 服务器系统平台 Windows XP/Windows7 及以后 客户端系统平台 Android 操作系统 2.1 及以后 4.3客户端系统平台 Android 操作系统 2.1 及以后设备资源 服务器硬件要求:支持 Intel 平台、 AMD 平台。双 CPU 2.0G 以上,内存 2.0G 以上, 100M 网 卡、硬盘 250G 以上,带液晶显示。 客户端硬件要求:支持 android 操作系统的嵌入式平台,支持 wifi 功能,支持 GPS 定位, 带触摸屏功能,具有音频输出 4.4时间资源 预计项目开发、研究,与产品测试,市场推广所需时间为六个月。 5. 经济可行性 5.1投资规划 5.1.1基础投资 ●房屋和办公设施;公司已有 ●计算机软 /硬件设备;公司已有 ●安全与保密设备:公司已有 5.1.2直接投资 包括下列各项所需的费用: ●开发及维护期的直接工资成本(工资、奖金等); ●差旅费、培训费; ●团队建设费; ●设备 /软件 /场地的租金和维护费用; ●外包费用、商务费用、业务招待费等。 总投资约 30万元。 5.2收益分析 5.2.1定量收益 说明能够用人民币数目表示的一次性收益: ●合同 /收款金额; ●系统为企业带来的预计开支降低; ●系统为企业带来的预计价值增值; ●其他如从多余设备出售回收的收入等。 大约预计有 100万的收益。 5.2.2非定量收益 逐项列出无法直接用人民币表示的收益,如服务的改进,由操作失误引起的风险减少, 差错的减少、灵活性的增加、速度的提高、信息掌握情况的改进,组织机构给外界形象的改 善等。有些不可捉摸的收益只能大概估计(可按悲观值、乐观值、可能值三种情况进行加权 平均得出结果)。 5.3投资收益率 150% 5.4投资回收期 约半年左右即可收回成本。范文二:GIS软件开发技术报告
范文三:软件开发技术报告
范文四:软件开发述职报告
范文五:软件开发分析报告