《基于cmm的软件外包服务平台的开发-毕业论文.doc》由会员分享,可在线阅读,更多相关《基于cmm的软件外包服务平台的开发-毕业论文.doc(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、片p就业等信息作泉 州 师 范 学 院毕业论文(设计)题 目 基于CMM的软件外包服务平台的开发 数计 学 院 计算机科学与技术 专 业 12 级 01 班学生姓名 李涛 学 号 110304012 指导教师 曾玉珠 职 称 副教授 完成日期 2015年01月06日 教务处 制基于CMM的软件外包服务平台的开发泉州师范学院 数计学院 计算机科学与技术专业 110304012李涛指导教师曾玉珠 副教授【摘要】本论文针对现有软件外包公共服务平台的不足之处即承接方只限于软件企业、不利于充分发挥软件人才潜力或缺少最佳方案的推荐等,创新性地研究并开发基于CMM的软件外包公共智能服务平台,平台实现以项目经
2、理为承接方的软件外包业务的在线交易、软件外包研发人才的技术和能力成熟度的在线管理、基于价格低和质量高的软件外包团队的在线最佳组建、软件外包实施过程的在线管理等功能。本论文能充分挖掘软件人才的潜力,规范软件开发管理流程和软件质量控制,逐渐地告别我国手工作坊式的开发时代,推动软件外包业的创新发展。【关键词】CMM;软件外包; JEECG; MySQL数据库.目 录第一章 绪论41.1 选题背景41.2 研究内容4第二章 CMM52.1 CMM简介52.2 CMM等级介绍5第三章 系统的开发技术53.1 JEECG智能开发平台简介53.1 JEECG智能开发平台优势63.1 JEECG智能开发平台功
3、能特点6第四章 系统需求分析64.1 系统数据分析74.2 需求分析7第五章 系统的实现75.1 用户注册、登录85.1.1 用户注册85.1.2 登录105.2 项目管理115.2.1 项目发布125.2.2 项目承包165.2.3 项目审核195.3 过程管理205.3.1 最佳团队组建205.3.2 申请人员225.4 人员管理235.4.1 发包商235.2.2 研发人员245.2.3 项目经理26第六章 总结与展望27第一章 绪论1.1 选题背景软件行业和服务外包行业是信息行业的核心,也是信息社会的基础性和战略性的产业。在2015年3月5日举行的第十二届全国人民代表大会第三次会议上,
4、李克强总理在政府工作报告中第一次提出了“互联网+”的行动计划,主旨在于以互联网为主的一整套信息技术在经济和社会生活各部门方面的扩散和应用,他指明这是势不可挡的时代潮流。事实上,“互联网+”企业也就是所谓的企业互联网化,这说明企业客户的生意增长将更多来源于互联网创新,这就促使企业软件借助外包形式的手段来打造生态创新发展环境,为行业客户构建竞争优势,企业软件市场将发生一场革命性的巨变。传统的软件外包就是企业为了专注核心竞争力业务和降低软件项目成本两方面,将软件项目中的全部或部分工作发包给提供外包服务的企业完成的软件需求活动。或者说这种软件外包是一种人力资本高、技术含量高、国际化水平高、附加值高、资
5、源消耗低以及环境污染低的高端服务技术的交易活动。在世界产业结构的不断调整和世界市场各领域的持续深化中,各类型的软件外包逐步成为发展中国家、地区承接世界产业转移的新型产业模式。CMM即软件能力成熟程度型,是鉴定企业在开发流程化和质量管理上的国际通行标准,共分为五级即初始级、可重复级、定义级、管理级和优化级。本论文针对现有软件外包公共服务平台的不足之处即承包商只限于软件企业、不利于充分发挥软件人才潜力或缺少最佳方案的推荐等,创新性地研究并开发基于CMM的软件外包公共智能服务平台,平台实现以项目经理为承包商的软件外包业务的在线交易、以企业为发包商的软件外包业务的项目管理、软件外包相关人员的技术和能力
6、成熟度的在线管理、基于价格低和质量高的软件外包团队的在线最佳组建、软件外包实施过程的在线管理等功能。本论文能充分挖掘软件人才的潜力,规范软件开发管理流程和软件质量控制,逐渐地告别我国手工作坊式的开发时代,推动软件外包行业的创新发展。1.2 研究内容本论文的研究开发内容是基于CMM的软件外包公共智能服务平台,目的在于充分挖掘软件人才,推动软件外包行业的创新发展。平台采用B/S架构,利用JEECG智能开发平台实现软件外包项目管理的项目发布、项目审核和项目承包,软件外包过程管理的最佳组建团队和申请人员,以及软件外包人员管理的发包商、研发人员和项目经理等功能。具体如下:研究CMM模型,并制定选定级别的
7、规范规则,包括软件人员的组成和过程管理。研究并制定每类软件人员的岗位职责和技能要求。研究并制定软件外包的实施方案研发软件外包业务的项目管理研发软件外包研发人才的人员管理研发软件外包团队的最佳组建团队研发软件外包过程的过程管理系统的集成和测试第二章 CMM2.1 CMM简介CMM是指“能力成熟度模型”,它是对于软件组织在定义、实施、度量、控制和改善其软件过程的实践中各个发展阶段的概述。CMM的核心是把软件开发看成一个过程,并且根据这一原则来对软件开发和维护进行过程监控和研究,使其更加科学化和标准化,使企业能够更好地实现商业目标。CMM的基本思想是:因为问题是由我们管理软件过程的方法引起的,所以新
8、软件技术的运用不会自动提高生产率和利润率。因此CMM有助于组织建立一个有规律的、成熟的软件过程。改进的过程将会生产出质量更好的软件,使更多的软件项目免受时间和费用的超支之苦。CMM为软件的过程能力提供了一个阶梯式的改进框架,它基于以往软件工程的经验教训,提供了一个基于过程改进的框架图,它指出了一个软件组织在软件开发方面需要进行哪些主要工作,理清这些工作之间的关系,以及安排开展工作的先后顺序,使得开发者能一步一步地做好这些工作来使软件组织逐渐走向成熟。2.2 CMM等级介绍CMM是鉴定企业在开发流程化和质量管理上的国际通行标准,共分为五个等级:一级为初始级,二级为可重复级,三级为定义级,四级为管
9、理级,五级为优化级。第一级是初始级,也是最低级,它的特点是软件工程管理制度的缺乏,过程定义的缺乏、混乱无序;成功依靠的是个人的技术和经验,经常由于缺乏管理和计划导致时间、费用超支;管理方式属于反应式,主要用来应付危机。因此过程不可预测,难以重复。第二级是可重复级,它的特点是基于类似项目中的经验,建立基本的项目管理制度并采取一定的措施来控制费用和时间的超支;管理人员可以及时发现问题并采取措施;一定程度上可重复类似项目的软件开发工作。其关键过程为需求管理,项目计划,项目跟踪和监控,软件子合同管理,软件配置管理以及软件质量保障。第三级是定义级,它的特点是软件过程已文档化、标准化,可以按需求来改进开发
10、过程,采用评审方法来保障软件质量;可以借助CASE工具来提高质量和效率。其关键过程为组织过程定义,组织过程焦点,培训大纲,软件集成管理,软件产品工程,组织协调以及专家审评。第四级是管理级,它的特点是针对制定质量和效率目标两方面,收集、测量相应指标;利用统计工具分析并采取改进措施;对软件过程和产品质量有定量的理解和控制。其关键过程为定量的软件过程管理和产品质量管理。第五级是优化级,也是最高级,它的特点是基于统计质量和过程控制工具两方面,持续改进软件过程;质量和效率稳步提高。其关键过程为缺陷预防,过程变更管理和技术变更管理。第三章 系统的开发技术3.1 JEECG智能开发平台简介JEECG(J2E
11、E Code Generation)是一款基于代码生成器的智能快速开发平台,引领新的开发模式(智能开发在线开发插件开发),可以帮助解决Java项目60%的重复工作,让开发更多关注业务逻辑。它既能快速提高开发效率,也能帮助公司节省人力成本,同时又不失灵活性。JEECG的快速开发宗旨是:简单功能由代码生成器生成使用;复杂业务采用表单自定义,业务流程使用工作流来实现、扩展出任务接口,供开发编写业务逻辑。实现了流程任务节点和任务接口的灵活配置,既能保证公司流程的保密性,又能减少开发人员的工作量。JEECG拥有四大技术特点:代码生成器:支持多种数据模型,根据表生成对应的Entity,Service,Da
12、o,Controller,JSP等,增删改查功能生成直接使用;UI快速开发库:针对WEB UI进行标准封装,页面统一采用UI标签实现功能:数据datagrid,表单校验,Popup,Tab等,实现JSP页面零JS,开发维护非常高效;在线流程设计:在线流程定义,采用开源Activiti流程引擎,实现在线画流程,自定义表单,表单挂接,业务流转,流程监控,流程跟踪,流程委托等;系统日志记录:系统操作日志详细记录,帮助运维人员进行系统分析和故障排查。3.2 JEECG智能开发平台优势JEECG拥有七大优势:采用主流架构技术,容易上手;代码生成器依赖性低,很方便的扩展能力,可完全实现二次开发;开发效率很
13、高,单表数据模型和一对多(父子表)数据模型的增删改查自动生成,功能直接使用;页面校验自动生成(必须输入、数字校验、金额校验、时间空间等);封装完善的用户权限和数据字典等基础功能,直接使用无需修改;常用共通封装,各种工具类(定时任务,短信接口,邮件发送,Excel导出等),基本满足80%项目需求;集成简易报表工具,图像报表和数据导出非常方便,可极其方便的生成pdf、excel、word等报表;集成工作流jbpm,并实现了只需在页面配置流程转向,可极大的简化jbpm工作流的开发;用jbpm的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的java代码。3.3 JEECG智能开发平台
14、功能特点架构技术:Spring MVC+Hibernate4+UI快速开发库+Spring JDBC+Highcharts图形报表+Jquery+Ehcache;代码生成器:自动生成规范的后台代码+统一风格的前台页面+表单校验;查询条件过滤器:动态拼SQL,追加查询条件;页面校验器:采用EasyUI检验机制;完整Spring用户权限;报表封装:Excel简易导出工具类+Highcharts图形报表;工作流设计器让业务系统更灵活;常用共通封装:数据字典/邮件发送/定时任务/短信接口/Freemarker模板工具/Jquery;兼容IE 6、IE 8+和Google等浏览器;支持SQL Serve
15、r、Oracle和MySQL等主流数据库。第四章 系统需求分析4.1 系统数据分析本系统由用户注册产生发包商、研发人员或者承包商;发包商登录后发布项目,产生项目;承包商登录后承包项目,产生团队;研发人员登录后申请已承包的项目,产生申请表,或者由承包商选择研发人员,组建团队;发包商根据项目进展对项目进行审核。图4-1 软件外包E-R图该图是本系统的E-R图,发包商登录系统后,根据其用户名,可以进行项目发布的录入、编辑以及审核操作。承包商登录系统后,匹配其用户名,可以进行项目承包的承包操作、最佳团结组建的编辑以及申请人员的同意操作。研发人员登录系统后,验证其用户名,可以进行项目承包的申请操作。4.
16、2 系统功能需求分析本系统是由发包商管理项目管理模块中的项目发布和项目审核;由研发人员管理项目管理模块中的项目承包里的申请操作;由项目经理管理项目管理模块中的项目承包里的接包操作以及过程管理模块中的最佳团队组建和申请人员。其中人员管理模块由各自用户所属角色进行编辑和查看操作。图 4-2 系统结构图该图为软件外包系统的结构图,从图中可以看出本系统由项目管理、过程管理和人员管理组成,其中项目管理包含企业权限的项目发布和项目审核,项目经理和个人权限的项目承包,过程管理包含项目经理权限的最佳团队组建和申请人员,人员管理包含企业权限的发包商、个人权限的研发人员和项目经理权限的接包商。第五章 系统的实现5
17、.1 用户注册、登录5.1.1 用户注册在此系统中,用户有三种角色:发包商、研发人员和承包商,根据用户所需身份进行注册。发包商可以根据公司要求来进行项目的发布和审核。承包商可以在已发布的项目中进行承包,组建最佳团队进行工作。研发人员可以在已承包的项目中进行申请,等待承包商的同意。图5-1 发包商注册图5-2 研发人员、承包商注册利用JEECG智能开发平台原有的系统用户表进行整改,用户名和密码是用户的标识,利用发包商、研发人员和承包商角色拥有的权限的不同来进行数据库的写入。使用goRegister()方法进行注册,利用systemService.findUniqueByProperty()方法得
18、到用户信息,判断用户是否存在,利用ConDB.java进行数据库的修改。关键代码:public ModelAndView goRegister(HttpServletRequest req, TSUser user) String roleid = oConvertUtils.getString(req.getParameter(roleid);String password = oConvertUtils.getString(req.getParameter(password);/得到当前登录用户所有信息TSUser users = systemService.findUniqueByPro
19、perty(TSUser.class, userName,user.getUserName();/判断用户是否存在if (users != null) message = 用户已经存在; else user.setPassword(PasswordUtil.encrypt(user.getUserName(), password, PasswordUtil.getStaticSalt();user.setStatus(Globals.User_Normal);/系统表添加用户systemService.save(user);saveUserOrgList(req, user);message
20、= 用户添加成功;if (StringUtil.isNotEmpty(roleid) saveRoleUser(user, roleid);String sql = ;ConnDB con = new ConnDB();/判断用户注册的角色,并写入相应数据库if (roleid.equals(4028c98151c7585a0151c7970a7b0016) String company = oConvertUtils.getString(req.getParameter(company);String companyadd = oConvertUtils.getString(req.getP
21、arameter(companyadd);sql = insert into software_fmember(user_id,user_name,name,mobilephone,telephone,email,company,companyadd) values(+ user.getId() +,+ user.getRealName() +,+ user.getUserName() +,+ user.getMobilePhone() +,+ user.getOfficePhone() +,+ user.getEmail() +,+ company +,+ companyadd +);els
22、e String skill = oConvertUtils.getString(req.getParameter(skill);String experience = oConvertUtils.getString(req.getParameter(experience);String sex = oConvertUtils.getString(req.getParameter(sex);String age = oConvertUtils.getString(req.getParameter(age);String address = oConvertUtils.getString(req
23、.getParameter(address);if (roleid.equals(402880e74d75c4dd014d75d3c5f40001) sql = insert into software_ymember(user_id,user_name,name,mobilephone,email,skill,experience,sex,age,address) values(+ user.getId() +,+ user.getRealName() +,+ user.getUserName() +,+ user.getMobilePhone() +,+ user.getEmail() +
24、,+ skill +,+ experience +,+ sex +,+ age +,+ address +);else if (roleid.equals(8a8ab0b246dc81120146dc81818b0051) sql = insert into software_manager(user_id,user_name,name,mobilephone,email,skill,experience,sex,age,address) values(+ user.getId() +,+ user.getRealName() +,+ user.getUserName() +,+ user.g
25、etMobilePhone() +,+ user.getEmail() +,+ skill +,+ experience +,+ sex +,+ age +,+ address +);con.doUpdate(sql);systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);return new ModelAndView();5.1.2 登录登录页面通过与MySQL数据库的连接来实现进入软件外包分析系统的主页面。如若用户已有账号,可点击登录进入,也可以点击重置来重置登录名和密码;如若用户还未
26、有账号,可根据个人身份进行注册,然后登录使用。图5-3 登录界面根据用户名和密码的匹配性,再加上随机验证码的输入,登录后判断用户所属角色的不同,进入相应的权限页面来进行操作。使用checkuser()方法检查登录用户的相关信息,利用req.getParameter()得到验证码等信息,进行验证,使用login()方法进行登录验证,利用ResourceUtil.getSessionUserName()得到登录用户信息。关键代码:public AjaxJson checkuser(TSUser user, HttpServletRequest req) HttpSession session =
27、ContextHolderUtils.getSession();DataSourceContextHolder.setDataSourceType(DataSourceType.dataSource_jeecg);AjaxJson j = new AjaxJson();if (req.getParameter(langCode)!=null) req.getSession().setAttribute(lang, req.getParameter(langCode);/验证码String randCode = req.getParameter(randCode);if (StringUtils
28、.isEmpty(randCode) j.setMsg(mutiLangService.getLang(common.enter.verifycode);j.setSuccess(false); else if (!randCode.equalsIgnoreCase(String.valueOf(session.getAttribute(randCode) j.setMsg(mutiLangService.getLang(common.verifycode.error);j.setSuccess(false); /用户名和密码 else int users = userService.getL
29、ist(TSUser.class).size();if (users = 0) j.setMsg(a);j.setSuccess(false); else TSUser u = userService.checkUserExits(user);if(u = null) j.setMsg(mutiLangService.getLang(common.username.or.password.error);j.setSuccess(false);return j;TSUser u2 = userService.getEntity(TSUser.class, u.getId();if (u != n
30、ull&u2.getStatus()!=0) if (true) Map attrMap = new HashMap();j.setAttributes(attrMap);String orgId = req.getParameter(orgId);if (oConvertUtils.isEmpty(orgId) Long orgNum = systemService.getCountForJdbc(select count(1) from t_s_user_org where user_id = + u.getId() + );if (orgNum 1) attrMap.put(orgNum
31、, orgNum);attrMap.put(user, u2); else Map userOrgMap = systemService.findOneForJdbc(select org_id as orgId from t_s_user_org where user_id=?, u2.getId();saveLoginSuccessInfo(req, u2, (String) userOrgMap.get(orgId); else attrMap.put(orgNum, 1);saveLoginSuccessInfo(req, u2, orgId); else j.setMsg(mutiL
32、angService.getLang(common.check.shield);j.setSuccess(false); else j.setMsg(mutiLangService.getLang(common.username.or.password.error);j.setSuccess(false);return j;public String login(ModelMap modelMap,HttpServletRequest request) DataSourceContextHolder.setDataSourceType(DataSourceType.dataSource_jee
33、cg);TSUser user = ResourceUtil.getSessionUserName();String roles = ;/得到当前登录用户信息if (user != null) List rUsers = systemService.findByProperty(TSRoleUser.class, TSUser.id, user.getId();for (TSRoleUser ru : rUsers) TSRole role = ru.getTSRole();roles = role.getRoleName();if (roles.length() 0) roles = rol
34、es.substring(0, roles.length() - 1);modelMap.put(roleName, roles);modelMap.put(userName, user.getUserName();modelMap.put(currentOrgName, ClientManager.getInstance().getClient().getUser().getCurrentDepart().getDepartname();request.getSession().setAttribute(CKFinder_UserRole, admin);SysThemesEnum sysT
35、heme = SysThemesUtil.getSysTheme(request);if(ace.equals(sysTheme.getStyle()request.setAttribute(menuMap, getFunctionMap(user);return sysTheme.getIndexPath(); else return login/login;5.2 项目管理5.2.1 项目发布发包商可以在项目发布中发布企业需要外包的软件相关基本信息,再上传外包软件的各项详细信息附件,但须注意的是,信息越详细越好,这样等待承包的时间会缩短很多。在这里,仅有发包商可以录入信息,编辑各自用户发布
36、的项目。图 5-4 项目发布发包商登录后,遍历发包商列表,构成发包商下拉框,读取所有发布的项目。其中项目等级、项目领域和状态都是来自数据字典。使用softwareSend()方法进入项目发布,利用ModelAndView()方法进行页面跳转,利用systemService.getList()得到发包商列表。关键代码:public ModelAndView softwareSend(HttpServletRequest request) String fmember = ;/得到发包商列表List fmemberList = systemService.getList(SoftwareFmemb
37、erEntity.class);for (SoftwareFmemberEntity sfmember : fmemberList) if (fmember.length() 0) fmember += ,;fmember += sfmember.getUserName() + _ + sfmember.getId();request.setAttribute(fmember, fmember);return new ModelAndView(com/buss/software/softwareSendList);图 5-5 项目发布录入发布项目时,读取当前登录的用户名,得到发包商,利用fil
38、e控件进行文件上传操作。使用goAdd()方法进入项目录入页面,利用ModelAndView()方法进行跳转,利用softwareSendService.getEnitity()得到指定项目列表,利用ResourceUtil.getSessionUserName()得到登录用户信息。利用ConDB.java进行t_s_document数据库和t_s_attachment数据库的修改。使用doAdd()方法执行项目录入,利用Ajax()方法进行录入成功或者失败的页面提示,利用softwareSendService.save()方法进行software_send数据库的保存。关键代码:public
39、 ModelAndView goAdd(SoftwareSendEntity softwareSend, HttpServletRequest req) if (StringUtil.isNotEmpty(softwareSend.getId() softwareSend = softwareSendService.getEntity(SoftwareSendEntity.class, softwareSend.getId();req.setAttribute(softwareSendPage, softwareSend);/得到登录用户的信息TSUser user = ResourceUti
40、l.getSessionUserName();req.setAttribute(fname, user.getRealName();return new ModelAndView(com/buss/software/softwareSend-add);public AjaxJson doAdd(SoftwareSendEntity softwareSend, HttpServletRequest request) AjaxJson j = new AjaxJson();message = 项目发布添加成功;/保存trysoftwareSendService.save(softwareSend)
41、;systemService.addLog(message, Globals.Log_Type_INSERT, Globals.Log_Leavel_INFO);ConnDB conn = new ConnDB();SoftwareSendEntity t = softwareSendService.get(SoftwareSendEntity.class, softwareSend.getId();/附件保存if (t.getOther().length()!=0) String sql = select * from t_s_document order by id desc;String
42、 otherid = conn.readDbFirstResult(sql, id);String sql2 = update t_s_document set documenttitle=+ t.getProjectname() + where id=+ otherid +;conn.doUpdate(sql2);else String ran = 4028c981+ Math.random()*0xFFFFFFF;String sql = insert into t_s_attachment(id) values(+ ran +);int n = conn.doUpdate(sql);St
43、ring sql2 = insert into t_s_document(id,documenttitle) values(+ ran +,+ t.getProjectname() +);conn.doUpdate(sql2);t.setAccept(0);catch(Exception e)e.printStackTrace();message = 项目发布添加失败;throw new BusinessException(e.getMessage();j.setMsg(message);return j;图 5-6 项目发布编辑读取当前用户名,匹配发包商后可进行修改。但要注意,项目名称无法再
44、修改,如果项目已承包,发包商无法修改。使用goUpdate()方法进入项目编辑页面,利用ModelAndView()方法进行页面跳转,利用softwareSendService.getEnitity()得到指定项目列表,利用ResourceUtil.getSessionUserName()得到当前登录用户所有信息。使用doUpdate()方法执行项目编辑,利用Ajax()方法进行项目编辑成功或者失败的页面提示,利用softwareSendService.saveOrUpdate()方法进行software_send数据库的更新,利用ConDB.java进行t_s_document数据库和t_s
45、_attachment数据库的修改。关键代码:public ModelAndView goUpdate(SoftwareSendEntity softwareSend, HttpServletRequest req) /得到登录用户TSUser user = ResourceUtil.getSessionUserName();req.setAttribute(fname, user.getRealName();String addr = index;if (StringUtil.isNotEmpty(softwareSend.getId() softwareSend = softwareSendService.getEntity(SoftwareSendEntity.class, softwareSend.getId();req.setAttribute(softwareSendPage, softwareSend);/判断项目是否承包if (softwareSend.getAccept().equals(0) /判断登录用户所属角