`
673341766
  • 浏览: 27906 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    博客分类:
  • java
阅读更多


   客户需求
   一个简单的项目管理信息的,添加、删除、编辑、查询等功能的实现,把大的框架做好就可以,细节他会自己完善好,想想也很简单的一样,本以为1天时间就足可以搞定了,结果足足干了3天才算竣工,由于客户也是软件开发人员,沟通起来也比较顺畅一些,否则可能不止需要3天了。

   项目虽然很小,但是由于跟我的主营方向是一致的,同时也想锻炼一下做项目的成熟程度有多高、有多快,所以也没嫌弃钱多钱少,开开心心就把这个项目开始启动了。项目虽然小但五脏俱全来形容了这个活儿了。
   很多必要的功能虽然在需求里没有提到,但是都是需要做好的,例如:
         01:系统的登录功能、这个是必然要有的。
         02:记住密码功能,而且是需要有加密功能的。
         03:退出系统的功能,总需要能安全退出系统的吧。
         04:用户管理功能,例如哪些用户才能登录到系统里来?
         05:用户修改密码功能,停用功能,设置密码功能等。
         06:用户可以访问那些菜单等?
         07:用户有哪些操作权限等?
         08:角色管理功能,用户角色关系功能,角色的权限功能。
         09:友善的菜单导航功能。
         10:没有权限的友善提示功能。
         11:附件的管理、上传、下载、删除等等。
         12:查询分页功能等等,虽然都没提出,但是这些功能都需要做好的。


整体开发思路

数据库分2个设计:业务数据 + 权限数据,互相不干扰,相互比较独立一些。
整个系统分3个种干系人: 开发人员 + 系统管理员 + 操作人员,他们对系统各自的期望值及操作的内容如下图。
为了快速搞定项目,毕竟项目的预算很有限,所有有些功能模块能不开发就不开发,那我们就用现成的成熟组件,通用权限管理系统,做为用户账户管理、权限管理
菜单管理的核心组件,这样可以大大的提高工作效率,可以灵活配置管理这个小型B/S项目信息管理系统了。



项目的具体开发制作步骤

步骤1:项目虽然很小,但是还是按规范的软件开发步骤比较好,我们还是本着先有设计后有开发的思路,先不急着写代码,我们先把数据库结构设计好,本系统应该只设计一个表就可以了,我们先要想好哪些数据用什么格式保存,都需要哪些字段来表示各种属性,效果图如下,我们用了数据库建模工具PowerDesigner,来设计我们的业务模型中的数据模型吧,这就是所谓的开发上的领域模型吧,其实这个设计还是蛮关键的,设计乱了后面都会乱套了。


步骤2:通过用设计好的模型,我们先手工建立相应的数据库及数据表。


步骤3:下图是已经建立好的数据的效果图,Project是业务数据库、Project表是项目信息表,后面的Base_Sequence 用于产生序列及唯一排序号、Base_Comment 用于修改记录保存功能,这些不用重复设计,直接从UserCenterV30数据中心里复制过来结构就可以了,为了在软件里显示一些数据出来,可以通过手工方式先录入一些演示数据,这样成就感会更多一些、信心也更足一些,因为很快就可以在软件里显示数据出来了。


步骤4:生成好相应的数据表后,可以用代码生成器生成一些没有多少商业逻辑的代码了,所谓的添加、删除、修改、查询的代码都不用写了,直接用代码生成器生成好就可以了,虽然这个技术不怎么先进,但是省事省心,对技术的要求也很低,生成好的代码也比较规范一些,而且还支持多种数据库,还是蛮好的,若生成好后,数据库结构有变化了,也没关系,重新生成一下就可以了,生成代码1分钟足够了,顶多是命名空间可能需要整理一些就可以了,属于是很经得起折腾的做法了。


步骤5:将生成好的代码,复制到相应的位置上,适当的修正一下命名空间什么的,因为是一个很小的项目,根本不用分层啥的,分那么多层也是多余的,其实分目录就足够可以了,若很懒惰的话目录都可以不用分了,分层其实更适合大型软件项目,小项目以见效最快为主,没必要搞个7-8个层,这里是是1个层也没分,只是分了一些目录,显得思路更清晰一些。


步骤6:代码生成器不能生成所有的代码,有些代码还是有商业逻辑的,需要人工编写,其中ProjectManager.cs 中的代码就是有具体商业逻辑的代码,这部分代码无法靠代码生成器自动生成好,需要按自己的需要进行编写的,这里有2个功能,一个是查询功能的实现、另一个是更新数据时需要有修改记录的功能,需要详细记录数据被变更的全过程,这些代码都需要人工编写好,页面上会调用这些代码。


步骤7:接下来该是规划整个系统的菜单的时候,需要好好规划一下软件的菜单,到底需要有哪些菜单,都叫什么名字?当然这一步也可以在在最后做,我们同通用权限管理组件可以灵活规划整个系统的菜单,基本上想怎么设置就怎么设置,想怎么托摘、想怎么排序都可以,规划菜单时会很爽,当然不只是开发人员用起来爽、而且系统管理员今后维护时也会很爽,系统的整个菜单都可以灵活配置权限、可以灵活更改,而不是写死的菜单,将来不依赖开发人员也可以灵活配置管理,灵活设置各种权限限制等等。


步骤8:接下来,需要把相应的添加、修改、查询、删除功能页面做出来,可以考虑到今后可能会扩展很多模块进来,所有目录规划得合理一些,说不定还要做人事管理、考勤管理、薪资管理、工作日志管理等等很多模块,其实都是大同小异而已,更多是技术是体现在细节功能及业务逻辑的深入程度上。


步骤9:菜单配置好,页面制作好后,就可以实现登录系统的页面了,当然这个也是用了现成的通用权限管理系统的登录页面,只需要制作一个登录界面,然后调用相应的登录API就可以了,自然就可以达到离职人员不能登录、没有权限的用户不能登录、停用账户不能登录,不能重复登录、限制登录的IP地址等等额外的其他功能都可以集成在里面了,开发人员也不用关心更多的细节,省心省事了。


步骤10:登录好后,通用权限管理系统的底层API,自然会显示有权限的菜单,无权访问的菜单也不会出来了,哪个用户可以访问哪个菜单等等,都可以通过通用权限管理工具灵活配置管理,当然那个工具是给系统管理员、开发人员、实施人员使用的,并不是为了给普通业务操作员使用定位的。软件的最终运行效果就如下图了,由于是系统管理登录的所有菜单都能显示了,当然这里还需要一个成熟稳定的分页组件。


   底层代码生成器生成的代码,可能只占用这个系统的代码的 1/3左右,但是编写这些代码的时间也省了,整个开发过程不是可以节省1/3了,而且是纯体力劳动而已。整个权限管理等可能需要整个系统开发的1/3左右的精力,若这部分也不用开发了,又可以节省整个软件项目开发的1/3时间。整个框架的稳定完善,也可以说是占用整个软件开发项目的1/3时间是应该的,若是2手空空开始开发的话。
   那我们的项目采用了 代码生成器 + 数据库访问组件 + 通用权限组件 + 成熟的B/S开发框架 足足可以节省一个管理软件项目开发的 2/3 的开发时间,可以把精力全部放在另外的 1/3 的业务逻辑优化、界面细节优化上。
   这样也大大的降低了软件项目的开发的失败风险,谁说你不会在前面的2/3时间上失败呢?未必能走到后面的1/3时间上来啊,对吧。 

开发总结

  目前3天内搞定一个独立的内部管理系统,而且五脏俱全的是我从业10年左右的最快记录,当然若第二次做类似的东西,可能有希望2天内可以搞定了。

  经过多年的积累,手上才会有一个运行稳定、可以灵活配置的B/S开发架构,虽然看看都很简单,但是最起码不断完善几年后,才会达到铜墙铁壁的程度,我们经常会发现,开发一个小小的软件,往往1个月也开发不完,很可能是由于没有稳定的B/S开发架构导致的,这个架构也不是说技术,就是一个美观的整体效果良好的运行稳定的B/S系统吧,从头开发的B/S架构,由于需要调整很多细节环节、特别是页面、菜单的美观设计等上会耗费很多精力。
   有时候界面设计良好、程序思路严谨、用户交互效果好的B/S空框架也能卖出几万元,以前不能理解,现在是彻底能体会了,稳定的B/S架构的确可以值一些钱,因为是经过精雕细刻后才能形成最后的劳动成果的。

   软件的大体效果做到这里,大概花费了3天时间、接下来可能要花费的时间会更多,应该不止3天了,可能是30天,因为很多业务上的细节会耗费很多时间来调整,例如新增页面的先后输入的内容,页面输入的检查、页面的美观设计、光标的顺序优化、回车优化,输入内容的完善补充等等,查询页面的排序顺序优化、查询内容的先后顺序排版、表格中各列的宽度调整,一些提醒颜色的优化等等会有很多细节问题上还要耗费很久时间的, 做软件其实就是做细节,你需要有一个良好的B/S开发框架,否则全部自己弄,不知道什么时候才能弄好,有个良好的框架、再有良好的例子程序,整个管理系统,就是一个量的问题了,其次就是很多细节的优化上,会花费很多时间。
  
    有良好的稳定的B/S开发框架,前期工作只用了3天,若没有这个,从头开始做,可能30天也做不完,更不会把大多精力都花费在业务逻辑的细节优化上,可能更多的精力都耗费在B/S系统架构的稳定、优化上了,那这个软件的质量就更没保障了。

    有了稳定的B/S开发框架后,才好进行大规模生产、大量招聘人员做开发工作,若这些都没有,招聘来一大堆开发人员,那很可能局面就乱套了,大家就容易乱来了。

    ProjectManager.cs手工编写的商业逻辑代码如下:
代码 //------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2010 , Jirisoft , Ltd .
//------------------------------------------------------------

using System;
using System.Data;
using System.Data.Common;
using System.Collections.Generic;

namespace Project
{
    using DotNet.DbUtilities;
    using DotNet.Manager;
    using DotNet.Utilities;
    using DotNet.Business;

    /// <summary>
    /// ProjectManager
    /// 项目跟进表
    ///
    /// 修改纪录
    ///
    ///        2010-09-28 版本:1.0 JiRiGaLa 创建主键。
    ///
    /// 版本:1.0
    ///
    /// <author>
    ///        <name>JiRiGaLa</name>
    ///        <date>2010-09-28</date>
    /// </author>
    /// </summary>
    public partial class ProjectManager : BaseManager, IBaseManager
    {
        public DataTable Search(string userId, string searchValue)
        {
            // 一、这里是开始进行动态SQL语句拼接,字段名、表明都进行了常量定义,表名字段名发生变化时,很容易就知道程序哪里都调用了这些。
            string sqlQuery = string.Empty;
            sqlQuery = " SELECT * "
                    + " FROM " + this.CurrentTableName
                    + " WHERE " + ProjectTable.FieldDeleteMark + " =  0 ";

            // 二、我们认为 userId 这个查询条件是安全,不是人为输入的参数,所以直接进行了SQL语句拼接
            if (!String.IsNullOrEmpty(userId))
            {
                sqlQuery += " AND " + ProjectTable.FieldCreateUserId + " = '" + userId + "'";
            }

            // 三、这里是进行参数化的准备,因为是多个不确定的查询参数,所以用了List。
            List<DbParameter> dbParameters = new List<DbParameter>();

            // 四、这里看查询条件是否为空
            searchValue = searchValue.Trim();
            if (!String.IsNullOrEmpty(searchValue))
            {
                // 五、这里是进行支持多种数据库的参数化查询
                sqlQuery += " AND (" + ProjectTable.FieldKeHuMingCheng + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldKeHuMingCheng);
                sqlQuery += " OR " + ProjectTable.FieldKeHuXiangMuMingCheng + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldKeHuXiangMuMingCheng);
                sqlQuery += " OR " + ProjectTable.FieldCreateUserRealname + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldCreateUserRealname);
                sqlQuery += " OR " + ProjectTable.FieldDescription + " LIKE " + DbHelper.GetParameter(ProjectTable.FieldDescription) + ")";

                // 六、这里是判断,用户是否已经输入了%
                if (searchValue.IndexOf("%") < 0)
                {
                    searchValue = "%" + searchValue + "%";
                }

                // 七、这里生成支持多数据库的参数
                dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldKeHuMingCheng, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldKeHuXiangMuMingCheng, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldCreateUserRealname, searchValue));
                dbParameters.Add(DbHelper.MakeInParam(ProjectTable.FieldDescription, searchValue));
            }
            sqlQuery += " ORDER BY " + ProjectTable.FieldSortCode + " DESC ";

            // 八、这里是将List转换为数组,进行数据库查询
            return DbHelper.Fill(sqlQuery, dbParameters.ToArray());
        }
       
        /// <summary>
        /// 更新(带有修改记录功能)
        /// </summary>
        /// <param name="projectEntity">实体</param>
        /// <param name="changeLog">修改记录</param>
        /// <returns>影响行数</returns>
        public int Update(ProjectEntity projectEntity, bool changeLog)
        {
            // 若不需要修改记录
            if (!changeLog)
            {
                return this.UpdateEntity(projectEntity);
            }

            String changeMessage = String.Empty;

            // 获取原来的数据
            ProjectEntity oldProjectEntity = this.GetEntity((int)projectEntity.Id);
            if (oldProjectEntity.KeHuXiangMuMingCheng != projectEntity.KeHuXiangMuMingCheng)
            {
                changeMessage += "客户项目名称被修改为:" + projectEntity.KeHuXiangMuMingCheng + " 原值:" + oldProjectEntity.KeHuXiangMuMingCheng + "<br>";
            }
            if (oldProjectEntity.KeHuMingCheng != projectEntity.KeHuMingCheng)
            {
                changeMessage += "客户名称被修改为:" + projectEntity.KeHuMingCheng + " 原值:" + oldProjectEntity.KeHuMingCheng + "<br>";
            }

            if (oldProjectEntity.KaiGaiRiQi != projectEntity.KaiGaiRiQi)
            {
                // changeMessage += "开改模日期被修改为:" + ((DateTime)projectEntity.KaiGaiRiQi).ToString(BaseSystemInfo.DateFormat) + " 原值:" + ((DateTime)oldProjectEntity.KaiGaiRiQi).ToString(BaseSystemInfo.DateFormat) + "<br>";
            }

            if (!String.IsNullOrEmpty(changeMessage))
            {
                BaseCommentManager commentManager = new BaseCommentManager(this.DbHelper, this.UserInfo);
                commentManager.Add("工程管理", projectEntity.Id.ToString(), projectEntity.KeHuXiangMuMingCheng, changeMessage, false, String.Empty, false, this.UserInfo.IPAddress);
            }

            return this.UpdateEntity(projectEntity);
        }
    }
}
分享到:
评论

相关推荐

    小型B/S内部管理类软件开发经验谈(C#)

    ### 小型B/S内部管理类软件开发经验谈(C#) #### 一、项目背景与概述 在本文中,我们将探讨一个小型B/S架构的内部管理类软件开发案例。该软件旨在提供基本的项目管理功能,包括添加、删除、编辑和查询等核心操作...

    外文文献(b/s结构)

    B/S结构 B/S结构,即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务...

    B/S后台管理系统模板经典5套

    "B/S后台管理系统模板经典5套"是一组适用于构建网站或信息系统的后台界面设计资源,包含五种不同风格的模板,旨在帮助开发人员快速搭建功能完善的管理界面,从而节省他们在设计上的时间和精力。这些模板主要基于B/S...

    软件项目开发计划模板(带有详尽说明和表格)

    软件项目开发计划模板详解 软件项目开发计划模板是一份详细的计划书模板,旨在帮助软件开发团队更好地规划和管理软件开发项目。该模板总共分为22个部分,涵盖了软件开发项目中需要填写的所有主题。下面我们将对该...

    信息化项目软件开发费用测算规范-最新版

    ### 信息化项目软件开发费用测算规范解析 #### 一、概述 随着信息技术的快速发展,软件开发已成为推动各行各业数字化转型的关键力量。《信息化项目软件开发费用测算规范》(DB11/T1010—2013)作为北京市地方标准...

    B/S工作任务管理、工单、派工软件 ASP源码

    3、任务下达后,发送提醒至员工邮箱。 4、员工登陆确认任务状态后开始工作。 5、员工提交工作成果,管理员查看工作结果并确认。 6、不符合要求的工作重新处理后提交并可由管理员再次确认。 7、还有一些小功能...

    电子商务系统源码(C# B/S结构)

    【电子商务系统源码(C# B/S结构)】是一种基于C#编程语言开发的,采用B/S(Browser/Server,浏览器/服务器)架构的电子商务应用程序。这个系统的核心在于它提供了在线购物、订单处理、用户管理、商品展示等功能,适用...

    软件项目成本管理案例

    B/S 结构,公司的 JSP+SQL Server 技术比较成熟,以前成功完成过类似项目,根据工作说明书(Statement Of Work,SOW)的要求,基本上需要 2~3 个开发人员,2 个月左右的开发时间,大约 4~6 人月的工作量,所以 10 万...

    Android经典项目案例开发实战宝典源码

    "Android经典项目案例开发实战宝典源码"为开发者提供了宝贵的实践资源,包含21个精选的项目案例,覆盖了多个子领域,如移动应用开发、游戏开发等。这些源码是深入理解Android开发技术的宝贵教材,可以帮助开发者巩固...

    ASP.NET 4.0 网站开发与项目实战 光盘

    在“ASP.NET 4.0 网站开发与项目实战”光盘中,我们可以期待学习到以下核心知识点: 1. **ASP.NET 4.0基础知识**:理解ASP.NET 4.0的新特性,如改进的页面生命周期管理、更高效的缓存机制、增强的MVC(Model-View-...

    Android经典项目案例开发实战宝典(郭金尚) 实例源代码 和 第5章文件管理器 电子文档

    《Android经典项目案例开发实战宝典》是郭金尚撰写的一本专为Android开发者准备的实战指南,书中通过丰富的实例帮助读者深入理解Android应用开发。本资料包含该书的实例源代码以及第5章“文件管理器”的电子文档,...

    各种软件开发评审检查表

    1. 项目计划检查表:项目计划检查表是软件开发过程中的一个重要环节,主要检查项目计划书的完整性、正确性和合理性。检查项包括项目编号、工作产品、检查日期、检查人员、检查结果等。 知识点:项目计划书是软件...

    计算机软件开发专业论文

    计算机软件开发是一个涵盖广泛领域的主题,它涉及到从概念形成到软件发布的一系列复杂步骤。这篇“计算机软件开发专业论文”集合提供了丰富的资源,适合于正在撰写相关毕业论文的学生或者对软件开发感兴趣的从业人员...

    计算机软件开发规范 GB 8566-88

    这一规范为软件开发人员和项目管理人员提供了详尽的指导原则、方法和规则,确保了软件生命周期中的每个阶段都有明确的操作指南。 1. **软件开发阶段** - **需求分析**:这是软件开发的起点,要求对用户需求进行...

    国家标准-软件开发规范文档

    国家标准-软件开发规范文档,28个文档 1.任务申请.doc 2.可行性与计划阶段--可行性研究报告.doc 2.可行性与计划阶段--项目开发计划.doc 2.软件质量保证计划编写规范.doc 3.数据要求说明书编写规范.doc 3.软件需求说明...

    完整的全套 软件开发文档模板

    在软件开发过程中,一套完整的文档模板是至关重要的,它涵盖了项目的各个阶段,从需求分析到系统测试,确保团队之间的沟通顺畅,项目管理有序。本文将详细介绍这套“完整的全套软件开发文档模板”所包含的关键知识点...

    实战SAP程序开发

    在IT领域,SAP系统是企业资源规划(ERP)软件的领导者之一,它为企业提供了集成化的解决方案,涵盖了财务管理、人力资源、供应链管理等多个方面。而ABAP(Advanced Business Application Programming)则是SAP系统中...

    软件工程文档模板(立项建议书,软件项目投标书,软件产品开发任务书,软件开发计划书,用户需求报告,需求规格说明书,需求报告 / 需求规格说明书评审记录表,概要设计说明书,详细设计说明书,用户使用手册,用户安装手册,测试报)

    2. **软件项目投标书**:在竞标阶段,公司会提交投标书,其中包含对项目提案的技术和财务响应,以赢得合同。投标书应详细说明实施策略、预算、时间表和团队资质。 3. **软件产品开发任务书**:此文档定义了产品的...

    软件工程开发实例(各种项目文档)

    这个名为“软件工程开发实例”的压缩包提供了全面且详尽的项目文档,对于初涉软件开发的人来说极具价值。下面,我们将深入探讨这些实例可能涵盖的关键知识点。 1. **需求分析**:软件开发的第一步通常是需求分析,...

Global site tag (gtag.js) - Google Analytics