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

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

  关于团队建设,项目管理的文章网上已经有很多了,在这里我就不谈这些理论了,直接给大家展示一个我在 项目开发方,后台服务开发方式,前台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;…

排序算法之简单插入法排序(Java)

简单插入排序 时间复杂度 O(n*n) 稳定的排序算法逐一取出元素&#xff0c;在已排好的元素序列中从后向前扫描&#xff0c;插入到适当的位置 部分代码如下&#xff1a; public static void insert_sort(int[] data){int i 0;int j 0;int len 0;int tmp 0; //局部变量if…

牛客提高R5 A.同余方程

题意 题目链接 Sol 设\(solve(x, y)\)表示\(i \in [0, x], j \in [0, y]\)满足题目要求的方案数 首先容斥一下&#xff0c;\(ans solve(r_1, r_2) - solve(l_1 - 1, r_2) - solve(l_2 - 1, r_1) solve(l_1 -1, l_2 - 1)\) 然后按照套路按位拆分&#xff0c;这里拆的时候是直接…

移植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在这个基础…

mysql 查询 集合_MySQL使用集合函数进行查询操作实例详解

本文实例讲述了MySQL使用集合函数进行查询操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;COUNT函数SELECT COUNT(*) AS cust_num from customers;SELECT COUNT(c_email) AS email_num FROM customers;SELECT o_num, COUNT(f_id) FROM orderitems GROUP BY o_num;…

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

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

排序算法之希尔排序(Java)

希尔排序 平均时间复杂度&#xff1a;O(nlogn) 不稳定的排序算法 v[0]与v[0n/2]比较&#xff0c;v[1]与v[1n/2]比较&#xff0c;v[2]与v[2n/2]比较&#xff0c;小的放到前面&#xff0c;以此类推.............. 关键部分代码如下&#xff1a; public static void shell_so…

AOP和IOC

AOP切面编程&#xff0c;作用&#xff1a;事务&#xff0c;日志&#xff0c;统一调用&#xff0c;统一实现&#xff0c;拦截,分发&#xff1b; 切点&#xff1a;告诉编译器切面作用于哪个package中的class IOC&#xff1a;控制反转&#xff0c;相对于new 对象来说的&#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----…

求2个数的最大公约数

求2个数的最大公约数 该方法只适用于部分数 int gongyueshu(int m, int n) {if ((0 m) || (0 n)){return 0;}while (n)//考虑到n是负数{int temp n;n m % n;m temp; }return m; }

[转载]C 指针

一、认识存储单元指针是C语言最显著的特色。要理解指针的概念&#xff0c;需要先理解计算机读写内存的的方式以及变量的概念。计算机内存是以字节为单位划分内存单元的&#xff0c;每个内存单元占用一个字节&#xff0c;每个内存单元都有自己的地址编号&#xff0c;操作系统或软…

公司年会

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

MySQL函数笔记_MySQL笔记之数学函数详解

绝对值函数ABS(x)和圆周率函数PI()复制代码 代码如下:mysql> SELECT ABS(0.5), ABS(-0.5), PI();-------------------------------| ABS(0.5) | ABS(-0.5) | PI() |-------------------------------| 0.5 | 0.5 | 3.141593 |-------------------------------…

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

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

POLYCOM RMX2000 激活与初始化 信令板卡初始化

POLYCOM RMX2000 激活与初始化 信令板卡初始化 上个星期跟组长去建行升级RMX2000的时候遇到的问题就是系统起来后&#xff0c;在“硬件监视器”下可以找到MPMx板卡&#xff0c;但是系统的“IP 网络服务”里面找不到信令板卡。 刚开始以为是板卡激活出现问题&#xff0c;重复了几…

实验二 网络嗅探与欺骗

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

年终奖

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

python barrier_Python线程障碍对象Barrier原理详解

python线程Barrier俗称障碍对象&#xff0c;也称栅栏&#xff0c;也叫屏障。一.线程障碍对象Barrier简介# 导入线程模块import threading# 障碍对象barrierbarrier threading.Barrier(parties, actionNone, timeoutNone)parties — 线程计数器&#xff0c;记录线程数量&#x…

Spring AOP 五大通知类型

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