艾伟也谈项目管理,我是如何带领团队开发项目的

  最近有不少朋友写信问我一些关于团队开发的问题,由于这段时间有些忙,没有回复.今天写一篇这方面的文章向大家介绍一下我是如何带领团队开发工作流项目的

  关于团队建设,项目管理的文章网上已经有很多了,在这里我就不谈这些理论了,直接给大家展示一个我在 项目开发方,后台服务开发方式,前台UI开发方式,后台服务与前台UI对接方式,代码文档,页面的开发文档,源码管理,单元测试,以及单元测试文档,实现思路设计文档,数据库文档,数据库设计规范,编码规范,操做数据的方法命名规则 方面的一些片断,这是一个为期6个月的工作流平台开发项目,是今年3月份启动的,现在已完成,比计划时间多出25天.核心开发人员(不包括美工,需求,黑盒测试)共有12人(编号从114到125)

  补充一点:在UI草图设计上,这次想用绘图板,但最后还是使用铅笔绘制+扫描的方式制做的.

项目开发方式说明图

 

后台服务开发方式说明图

 

前台UI开发方式说明图

后台服务与前台UI对接方式说明图

 

代码文档(片断节选)

方法签名

public int? addBaseEnumeration(string powerID, List list)

返回值

  • [0]:方法未完成
  • [null]:操作成功
  • [401]:参数[powerID]没通过[security.checkPowerID方法]验证
  • [-1]:参数[list][null]
  • [-2]:参数[list]中的[baseEnumeration.rowID][Guid.Empty]
  • [-3]:参数[list]中的[baseEnumeration.entity][null][string.Empty]
  • [-4]:参数[list]中的[baseEnumeration.field][null][string.Empty]
  • [-5]:参数[list]中的[baseEnumeration.entityType][null][string.Empty]
  • [-6]:参数[list]中的[baseEnumeration.title][null][string.Empty]
  • [-7]:参数[list]中的[baseEnumeration.value][null][string.Empty]
  • [-8]:参数[list]中存在[rowID]重复的记录
  • [-9]:参数[list]中存在[Entity][field][value]重复的记录
  • [3] :参数[list]中的[baseEnumeration.rowID]在数据库中已存在
  • [4] :联合唯一索引[Entity][field][value]在数据库中已存在
  • [5] :参数[entityType]的传入值不是枚举表[entitytype]的基础枚举数据
  • [6] :插入时数据库异常
  • [7] :不能插入[entity]["insertBaseEnumeration"],[field]["entitytype"]的数据

参数

  • [powerID]: 权限参数
  • [list]: 多条baseEnumeration表记录,的泛型集合

约束

<1> 调用[security.checkPowerID方法]判断[powerID],如果[security.checkPowerID方法]返回[false],返回[401]

<2> 如果参数[list][null],返回[-1]

<3> 如果参数[list]中的[baseEnumeration.rowID][Guid.Empty],返回[-2]

<4> 如果参数[list]中的[baseEnumeration.entity][null][string.Empty], 返回[-3]

<5> 如果参数[list]中的[baseEnumeration.field][null][string.Empty], 返回[-4]

<6> 如果参数[list]中的[baseEnumeration.entityType][null][string.Empty], 返回[-5]

<7> 如果参数[list]中的[baseEnumeration.title][null][string.Empty], 返回[-6]

<8> 如果参数[list]中的[baseEnumeration.value][null][string.Empty], 返回[-7]

<9> 如果参数[list]中存在[rowID]重复的记录,返回[-8]

<10>如果参数[list]中存在[entity][field][value]重复的记录,返回[-9]

<11>如果参数[list]中的[baseEnumeration.rowID]在数据库中已存在, 返回[3]

<12>如果联合唯一索引[entity][field][value]在数据库中已存在, 返回[4]

<13>如果参数[entity]["baseEnumeration"],[field][entitytype]的数据,返回[7]

<14>如果参数[entityType]的传入值不是枚举表[entitytype]的基础枚举数据, 返回[5]

<15>如果插入时数据库异常, 返回[6]

说明

[Entity][field][value] 联合唯一索引

<14>获取[Entitytype]基础枚举数据时,使用[23 selectBaseEnumerationTypeName]得到枚举类型名称

单元测试

(组合测试),(自动判断返回状态),(自动判断返回结果)

WFServiceTestProject. manageServiceTest. addBaseEnumerationTest()

 

//[26] 批量添加枚举

public int? addBaseEnumeration(string powerID, List list)

{

//<1>

if (!security.checkPowerID(powerID))

{

return 401;

}

//<2>

if (list == null)

{

return -1;

}

using (wxwinterDBDataContext db = new wxwinterDBDataContext())

{

//<3>

if (list.Count(p => p.rowID == Guid.Empty) > 0)

{

return -2;

}

//<4>

if (list.Count(p => string.IsNullOrEmpty(p.entity)) > 0)

{

return -3;

}

//<5>

if (list.Count(p => string.IsNullOrEmpty(p.field)) > 0)

{

return -4;

}

//<6>

if (list.Count(p => string.IsNullOrEmpty(p.entityType)) > 0)

{

return -5;

}

...............................

页面的开发文档(片断节选)

模块编号

Wxwinter.Index.Power.manageDutyControl

模块需要调用的其它UI模块列表

Wxwinter.Index.Power.insertDutyControl

Wxwinter.Index.Power.changeDutyControl

模块的调用入口UI

Wxwinter.Index.Power.navigationOrganizationControl

UI类型

[ V ] 中控件 700 * 500

工具栏按钮的调用路径

[ V ] 无工具栏

模块调用方式

[ V ] 模式化弹出框

action说明

不需要action

 

源码管理

 

单元测试,以及单元测试文档(片断节选)

文档

×

方法签名

public int? transactComplete(string powerID , Guid instanceID , Guid stateID , string transactResult , status status)

×

返回值

  • [0]:方法未完成
  • [null]:操作成功
  • [401]:参数[powerID]没通过[security.checkPowerID方法]验证
  • [-1]:[instanceID]为[Guid.empty]
  • [-2]:[stateID]为[Guid.empty]
  • [1]:[wfStateTransactTask]表中没有指定完成的办理任务
  • [2]:所指定的办理任务处在非等待状态
  • [3]:数据库提交失败

×

参数

  • [powerID]: 权限参数
  • [instanceID]:实例编号
  • [stateID]:状态编号
  • [transactResult]:办理结果
  • [status]:身份

×

约束

<1>调用[security.checkPowerID方法]判断[powerID],如果[security.checkPowerID方法]返回[false],返回[401]

<2>调用[checkInstanceState()]方法对[instanceID][stateID]指定的实例状态进行验证,返回值不为[null],返回[checkInstanceState()]的返回值

<3>调用[checkStatus()]方法对[status]进行验证,返回值不为[null],返回[checkStatus()]的返回值

<4>得到[wfStateTransactTask]表中

[

wfStateTransactTask.instanceID = instanceID

&& wfStateTransactTask.stateID = stateID

&& wfStateTransactTask.departmentNo = status.departmentNo

&& wfStateTransactTask.dutyNo = status.dutyNo

&& wfStateTransactTask.personNo = status.personNo

]

的记录并赋给变量[taskInfo],如果不存在,返回[1]

<5>如果[taskInfo.runState != runState.wait],返回[2]

<6>修改

[

taskInfo.runState=runState.end

taskInfo.completeTime=System.DateTime.Now

taskInfo.transactResult=transactResult

]

用[taskInfo]修改[wfStateTransactTask]表中记录

<7>向[wfStepList]中插入数据

[

flowID = taskInfo.flowID

flowName = taskInfo.flowName

nodeID = taskInfo.nodeID

nodeName = taskInfo.nodeName

departmentNo = status.departmentNo

departmentName = status.departmentName

dutyNo = status.dutyNo

dutyName = status.dutyName

personNo = status.personNo

personName = status.personName

instanceID = taskInfo.instanceID

stateID = taskInfo.stateID

processID = taskInfo.processID

processName = taskInfo.processName

stepAction = stepAction.办理

stepTime = System.DateTime.Now

taskID = stepAction.办理

]

<8>如果数据库提交失败,返回[3],成功,返回[null]

×

说明

调用[checkInstanceState()]方法对实例状态进行验证

×

单元测试

 

 

单元测试选项

范围

判断

影响

(无)

 

(不需要)

 

(全路径)

 

(正常路径)

 

(简单调用)

 

(组合测试)

 

(已在外部调试通过)

(自动判断返回状态)

 

(自动判断返回结果)

 

(人工判断返回结果,结果控制台输出)

 

(人工判断返回结果,结果存入磁盘)

 

(自动判断操作结果)

 

(人工判断操作结果,结果存入数据库)

 

(人工判断操作结果,结果存入数据库)

 

(不出异常即可)

 

(说明…)

(操作数据库,完成测试后已复原)

 

(操作数据库,已做state标记)

 

(操作数据库,需要手工复原)

 

(操作临时数据库)

实现思路设计文档(片断节选)

例1:工作流结构的解析

例2:删除部门职能人员的约束

 

例3:查询用户的模块权限

public List<viewRelationModel> searchModelPowerOfPerson(string powerID,string personNo)

searchModelPowerOfPerson("","user1")

step1

使用 searchStatusList("", "user1") 得到[得到身份列表]

departmentNo 

dutyNo 

personNo 

user1 

user1 

user1 

step2

用得到的身份与[powerRelationModel]对比,并返回如下算法的集合

departmentNo 

dutyNo 

modelNo 

action 

scope 

all 

m1 

see 

 

B 

all 

m2 

see 

 

all 

all 

m3 

see 

 

m4 

see 

 

 

数据库文档

wfFlow 流程表

表说明:存储流程模板的属性信息,该表内容是将xoml存入时,解析xoml后一次性生成的,不能修改

flowID

流程编号

f1

来自iFlow

flowName

流程名称

f2

flowType

流程类型

f3

flowDescription

流程说明

f4

businessType

业务类型

f5

startWindow

启动窗体

f6

dataFormList

表单列表

f7

startDataForm

启动时填写的表单

f8

inputFormItems

传入表单

f9

inputFormItemsExpandData

传入表单扩展数据

f10

commandOption

命令选项

f11

commandOptionExpandData

命令选项扩展数据

f12

ownedType

流程归属类型

f13

timelimitUnit

时限单位

l1

来自iTimelimit

timelimit

时限

l2

overtimeOperate

超时操作

l3

calendar 

日历

l4

residualTimelimit

剩余时限

l5

createDepartmentNo

创建部门编号

创建该流程模板的人员所在部门的编号

createDepartmentName

创建部门名称

 

createDutyNo

创建职能编号

创建该流程模板的人员所担任的职能的编号

createDutyName

创建职能名称

 

createPersonNo

创建人员编号

创建该流程模板的人员的编号

createPersonName

创建人员名称

 

createTime

创建时间

 

isCheckout

是否签出

如果为真,签出人可以对流程模板进行修改,非签出人不能再将该模板签出进行修改,如果为假,就可以将该流程签出进行修改

checkoutPersonNo

签出人员编号

 

checkoutPersonName

签出人员名称

 

checkoutTime

签出时间

 

checkinTime

签入时间

 

isFreeze

是否冻结

如果为真,流程模板处于冻结状态,不能被启动

如果为假,流程模板可以正常启动


wfFlow 流程表 表结构


数据库设计规范(片断节选)

SQL Server 类型

C# 类型

说明

nvarchar(50)

string

  • 字符类的[唯一索引]
  • 标识类信息,如用户名,口令,性别
  • 标签类信息
  • 标记类信息
  • 状态标识 :如:[成功],[失败],[运行中]

对应的UI为单行行文本框,标签,提示文字

nvarchar(255)

string

  • 小量的描述信息,两行以上
  • 磁盘文件的路径信息

对应的UI为垂直滚动条的多行文本框,或多段的标签

nvarchar(MAX)

string

  • 文章
  • 二进制串行化信息
  • XML数据
  • 大字符数据

对应的UI为双滚动条的多行文本框

编码规范(片断节选)

操做数据的方法命名规则

前缀

含义

传入

返回

get

得到单条记录

rowID

单条记录对象

唯一键

search

查询多条记录

唯一键

List<记录对象>

非唯一键

多个参数, [and/or]关系组合

select

查询多条记录

唯一键,[字段名]

List

字段名所对应的[表.字段.ToString()]

非唯一键,[字段名]

多个参数, [and/or]关系组合,[字段名]

change

修改单条

记录对像

执行状态

stringResult.state 执行状态

stringResult.value 出问题的字段

set

修改单条

唯一键,[字段名],[值]

执行状态

rowID,[字段名],[值]

update

修改多条

(事物)

List<记录对象>

执行状态

modify

修改多条

(无事物)

List<记录对象>

无法完成修改的List<记录对象>

insert

添加单条

记录对象

执行状态

add

批量添加

(事物)

List<记录对象>

执行状态

stringResult.state 执行状态

stringResult.value 出问题的字段

append

批量添加

(无事物)

List<记录对象>

无法完成添加的List<记录对象>

remove

删除单条

rowID

执行状态

唯一键

delete

删除多条

(事物)

List<记录对象>

执行状态

clear

删除多条

(事物)

多个参数, [and/or]关系组合

执行状态

wipe

删除多条

(无事物)

List<记录对象>

无法完成删除的List<记录对象>

execute

执行sql

SQL 字串

 

存储过程

执行状态

stringResult.state 执行状态

stringResult.value 问题

stringResult.state 执行状态

stringResult.value 返回对象的XML

binding

添加单条(关系表)

记录对象

执行状态

unbinding

删除单条(关系表)

rowID

执行状态

转载于:https://www.cnblogs.com/waw/archive/2011/08/29/2158562.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 动态索引_MySQL的索引

在日常工作中&#xff0c;我们经常会用到mysql的索引。使用索引的目的基本上就是为了在大量的数据中快速找出某个列中一个特定值的行&#xff0c;简单说就是提高查询效率。使用索引的优点&#xff1a;可以快速检索&#xff0c;减少I/O次数&#xff0c;加快检索速度&#xff1b;…

移植U-Boot思路和实践 | 基于RK3399

0. 背景介绍我们手里这块RK3399开发板出厂时带的是2017.09版本的U-Boot。U-Boot 2017.09 (Sep 26 2021 - 08:53:15 0000)Model: Forlinx OK3399 Evaluation Board PreSerial: 2 DRAM: 2 GiB Sysmem: init Relocation Offset is: 7dbe9000 Using default environment在这个基础…

一起谈.NET技术,WPF 基础到企业应用系列5——WPF千年轮回2

一&#xff0c;摘要 首先很高兴这个系列能得到大家的关注和支持&#xff0c;前端时间身体状况不适&#xff0c;所以暂停了更新&#xff0c;对此表示非常抱歉&#xff0c;以后会逐渐加快进度&#xff0c;不过由于这是一个很长的系列&#xff0c;我也想把它写好&#xff0c;所以以…

手把手教你|拦截系统调用

一、什么是系统调用系统调用 是内核提供给应用程序使用的功能函数&#xff0c;由于应用程序一般运行在 用户态&#xff0c;处于用户态的进程有诸多限制&#xff08;如不能进行 I/O 操作&#xff09;&#xff0c;所以有些功能必须由内核代劳完成。而内核就是通过向应用层提供 系…

mysql修改列明sql语句_SqlServer修改表名、修改列名T-SQL语句

前面介绍了SQL基本用法《MSSQL数据库常见操作 SQL语句》,但是没有介绍sql修改表的相关操作,本篇文章将介绍T-SQL修改表的相关操作。1。修改表名:execute sp_rename department.mgrig ,mgrid;详述:EXEC sp_rename 表名.[原列名], 新列名, columnTransact-SQL参考sp_rename----…

公司年会

没有抽奖的年会肯定是不完美的。有抽奖没有饭局的年会也是很香的。因为疫情&#xff0c;我们没有年终饭局&#xff0c;我也不知道过去那些年腾讯是怎么开年会的&#xff0c;不过今年&#xff0c;我觉得挺不错。上周我们搞了年终活动&#xff0c;我那时候还在开会&#xff0c;CG…

给年薪不到48w的程序员提个醒!!

近日&#xff0c;一程序员在脉脉自曝“年薪37W带12人团队&#xff0c;因学历内推腾讯被拒”&#xff0c;引发争议。末流院校&#xff0c;带12人前端团队&#xff0c;到手37w股票20w&#xff0c;过硬的编程技术让他觉得可以出去“闯闯”&#xff1b;内推到腾讯&#xff0c;电话里…

实验二 网络嗅探与欺骗

实验二 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验二 网络嗅探与欺骗 学生姓名 张昊 年级 2015 区队 三 指导教师 高见 信息技术与网络安全学院 2018年9月25日 实验任务总纲 2018—20179学年 第 一 学期 一、实验目…

年终奖

我一个人走在路上&#xff0c;想说点什么&#xff0c;我觉得很难受&#xff0c;去年这个时候我一个高中同学跟我聊天&#xff0c;他跟我说「我听说你们在深圳做程序员的工资很高&#xff0c;我认识的一个朋友在深圳一个月2万多&#xff0c;年终奖发了十几万」。我想&#xff0c…

Spring AOP 五大通知类型

1.前置通知 在目标方法执行之前执行执行的通知。 前置通知方法&#xff0c;可以没有参数&#xff0c;也可以额外接收一个JoinPoint&#xff0c;Spring会自动将该对象传入&#xff0c;代表当前的连接点&#xff0c;通过该对象可以获取目标对象 和 目标方法相关的信息。 注意&…

转载CSDN博文精选:Android系列开发博客资源汇总

CSDN博客本期热文推荐&#xff0c;为您介绍有关Android应用开发的10个博客&#xff0c;分享他们的日积月累的宝贵经验&#xff0c;希望这些文章对Android开发者们能有所启发和帮助。 [1] 张国威&#xff1a;Android从入门到提高系列 前面写了十四篇关于界面的入门文章&#xff…

简单工厂模式+工厂方法模式

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; …

Windows下搭建ESP-IDF开发环境,适合ESP32/S2/C3/S3系列模组二次开发

前言本教程适用于以下两种用户&#xff1a;①无Linux环境搭建经验或搭建Linux开发环境不成功&#xff1b;②使用安信可windows一体化环境IDE V1.5开发环境搭建不成功&#xff1b;本教程提供了windows下搭建 ESP-IDF 开发环境的方法。适用系统&#xff1a;Windows 10 64 位版本、…

Lync Server 2010的部署系列_第六章 安装配置拓扑生成器、前端Server、前端池

一、安装 Lync Server 2010 管理工具&#xff08;包括拓扑生成器&#xff09; 1) 登录Front.Gianthard.com&#xff08;192.168.1.21&#xff09;。在“Microsoft Lync Server 2010 - 部署向导”页上&#xff0c;单击“安装拓扑生成器”。 2) 进行SQL方面的客户端。 3) 安装成功…

被 HR 直接怼:估计你一辈子就是个程序员

今天看到一个非常扯蛋的事情。事情来自网络&#xff0c;不是作者本人。我一直认为程序员是可以做一辈子的事情&#xff0c;程序员是一种做得越久技术越熟练的工作。但是有的人并不这样认为。---有程序员因为能力很强&#xff0c;公司非常满意&#xff0c;结果派了一位 HR 与其谈…

一起谈.NET技术,在MVC2.0使用Lodop为WEB打印提出完美解决方案

通过好友CallHot介绍Lodopweb打印控件。由于是国人开发的&#xff0c;故这两天认真了研究下&#xff0c;打算在未来的项目中使用。现将学习成果与园友分享。如果存在不足的地方&#xff0c;希望您指出。 具体的实现步骤如下&#xff1a; 一、准备工作 1.MVC2.0 jQuery1.4.1 开…

(转)python调取C/C++的dll生成方法

本文针对Windows平台下&#xff0c;python调取C/C的dll文件。 1.如果使用C语言&#xff0c;代码如下&#xff0c;文件名为test.c。 __declspec(dllexport) int sum(int a,int b) {return (a b); } 如果使用C语言&#xff0c;代码如下&#xff0c;文件名为test_cpp.cpp。在Wind…

生产者-消费者模式

生产者/消费者问题的多种Java实现方式 实质上&#xff0c;很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式&#xff0c;而这是恰恰是在本科操作系统课堂上老师反复讲解&#xff0c;而我们却视而不见不以为然的。在博文《一种面向作业流(工作流)的轻量级可复用…

周末,说下我喜欢的篮球

我应该有很久没有看NBA比赛了&#xff0c;没有其他原因&#xff0c;确实是因为工作太忙了&#xff0c;即使是在带薪上厕所&#xff0c;也没有足够的时间看下NBA比赛。如果说忙是一个比较好的托词&#xff0c;那还有一个原因&#xff0c;我现在更多的喜欢野球圈的新闻。刚毕业那…

没有串口,如何打印单片机调试信息?

输出调试信息是嵌入式开发中必不可少的调试利器&#xff0c;嵌入式开发的一个特点是很多时候没有操作系统&#xff0c;或者没有文件系统&#xff0c;常规的打印log到文件的方法基本不适用。最常用的是通过串口输出uart log&#xff0c;例如51单片机&#xff0c;只要实现串口驱动…