# Scrum 一个自己用的Scrum管理系统,主要是网络上现有的系统要么太臃肿要么很难看。功能上包含`Scrum`常规的`Product Backlog`以及`Burndown Chart`,能够按照用户安排工作列表并展示用户当前/历史工作燃尽图。 感谢以下网站或者项目: > 1. 关于Scrum的流程和交互动作,参考了[Scrumy](https://scrumy.com)。 > 2. 使用了[jQuery](https://jquery.com/)以及[jQuery UI](https://jqueryui.com/)来加快交互控件的实现。 > 3. 使用了[Bootstrap](http://getbootstrap.com/)框架实现快速布局和前端样式。 > 4. 后台采用`PHP+MySql`的架构实现接口的开发和数据的存储。 ## 项目文件结构 ## 项目从代码结构上分为三个部分: > * 表现层(项目的WEB页,用于呈现各个数据页面) > * 工具层(为页面提供方法和数据支持) > * 接口层(提供API接口,便于在特殊环境下的访问,例如要做一个客户端什么的) 主要文件夹以及文件说明: > - admin,文件夹,管理后台入口 > - api,文件夹,放置API接口,提供列表、单体信息查询、修改等功能 > - css,文件夹,放置样式文件 > - font,文件夹,放置可能用到的icon或者特殊字体 > - imgs,文件夹,放置图片资源 > - js,文件夹,放置前端JS文件 > - sql,文件夹,数据库备份以及通用sql语句 > - util,文件夹,为页面展示提供方法和数据 > - index.php,首页,展示任务Scrum图表 > - member.php,成员列表页,用于展示成员列表以及成员详情 > - program.php,项目列表页,用于展示项目列表以及项目详情 > - about.php,关于页面 ## 数据库及表结构 ## 虽然并不想把功能做的很复杂,但是为了可能的拓展,还是建立了4张表,其中3张业务表,1张日志表。 核心表为任务表,任务涉及到对应的项目以及对应的人员,所以需要一个项目表和人员表;日志表的数据由任务表触发器写入,只增查,不删改。 ### 任务表 ### 任务表(TASK)用于存放所有的任务信息,包括所属项目,执行人,DeadLine,进度等信息,项目通过项目ID字段关联到[项目表](#项目表 "项目表(PROGRAM)"),人员通过人员ID字段关联到[人员表](#人员表 "人员表(MEMBER)")。 任务表包含一个触发器,用于监听任务的核心字段有变动时,向[日志表](#日志表 "日志表(LOG)")写入记录,标识出变更内容以及操作人还有操作时间。 任务表结构如下: | 字段描述 | 任务ID | 任务名称 | 目标时间 | 任务备注 | 任务状态 | 归属人员 | 归属项目 | 作者 | |:--------: |:------: |:------------: |:--------: |:------------: |:----------: |:---------: |:----------: |:---------: | | 是否必填 | 是 | 是 | 是 | 否 | 是 | 是 | 是 | 是 | | 字段名称 | id | name | deadline | remark | status | member_id | program_id | author_id | | 字段类型 | int(8) | varchar(100) | datetime | varchar(200) | tinyint(2) | int(8) | int(8) | int(8) | | 是否主键 | 主键 | | | | | | | | 建表: ```sql DROP TABLE IF EXISTS `task`; CREATE TABLE `task` ( `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '任务ID', `name` varchar(100) NOT NULL COMMENT '任务名称', `deadline` datetime NOT NULL COMMENT '任务deadline', `remark` varchar(200) DEFAULT NULL COMMENT '任务说明', `status` tinyint(2) NOT NULL COMMENT '任务状态', `member_id` int(8) NOT NULL COMMENT '归属人员', `program_id` int(8) NOT NULL COMMENT '归属项目', `author_id` int(8) NOT NULL COMMENT '任务作者/修改者', PRIMARY KEY (`id`), KEY `member_id` (`member_id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; ``` 触发器: ```sql INSERT INTO `task` VALUES ('1', '名字', '2016-03-16 00:00:13', '备注', '2', '5', '1', '5'); DROP TRIGGER IF EXISTS `loging`; DELIMITER ;; CREATE TRIGGER `loging` AFTER UPDATE ON `task` FOR EACH ROW BEGIN IF NEW.name != OLD.name THEN INSERT INTO log( task_id, task_name, info, time, author) values( NEW.id, NEW.name, concat('任务名称变更:' , OLD.name , '→' , NEW.name), NOW(), NEW.author_id); END IF; IF NEW.deadline != OLD.deadline THEN INSERT INTO log( task_id, task_name, info, time, author) values( NEW.id, NEW.name, concat('任务时间变更:' , OLD.deadline , '→' , NEW.deadline), NOW(), NEW.author_id); END IF; IF NEW.status != OLD.status THEN INSERT INTO log( task_id, task_name, info, time, author) values( NEW.id, NEW.name, concat('任务状态变更:' , OLD.status , '→' , NEW.status), NOW(), NEW.author_id); END IF; IF NEW.member_id != OLD.member_id THEN INSERT INTO log( task_id, task_name, info, time, author) values( NEW.id, NEW.name, concat('任务成员变更:' , OLD.member_id , '→' , NEW.member_id), NOW(), NEW.author_id); END IF; END ;; DELIMITER ; ``` ### 人员表 ### 人员表(MEMBER)用于存储参与项目的所有人员,也是登录系统的所有用户,便于之后拓展用户属性,例如要加个头像或者昵称什么的,或者要支持公司内网的openID登录需要存储Token等信息。 有了这个独立的表格,便于统计某个人员在整个系统下或者某个模块下的工作量,可以按照人来统计燃尽图,绘制长期的任务下达与交付效果的曲线。 人员表结构如下: | 字段描述 | 人员ID | 人员名称 | 人员备注 | 人员邮箱 | 人员状态 | |:--------: |:------: |:-----------: |:------------: |:-----------: |:----------: | | 是否必填 | 是 | 是 | 否 | 是 | 是 | | 字段名称 | id | name | remark | mail | status | | 字段类型 | int(8) | varchar(10) | varchar(200) | varchar(20) | tinyint(2) | | 是否主键 | 主键 | | | | | 建表: ```sql DROP TABLE IF EXISTS `member`; CREATE TABLE `member` ( `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '人员ID', `name` varchar(10) NOT NULL COMMENT '人员名称', `remark` varchar(200) NOT NULL COMMENT '人员备注', `mail` varchar(20) NOT NULL COMMENT '人员邮箱', `status` tinyint(2) NOT NULL COMMENT '人员状态', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; ``` ### 项目表 ### 项目表(PROGRAM)用于存储所有的项目,任务可以按照项目分类,项目的定义可以随意,保证是一个周期内需要完成的任务的合集就行,建立项目表也是为了方便拓展,例如项目的负责人、里程碑等字段。 项目表结构如下: | 字段描述 | 项目ID | 项目名称 | 项目状态 | 项目作者 | |:--------: |:------: |:------------: |:----------: |:---------: | | 是否必填 | 是 | 是 | 是 | 是 | | 字段名称 | id | name | status | member_id | | 字段类型 | int(8) | varchar(100) | tinyint(2) | int(8) | | 是否主键 | 主键 | | | | 建表: ```sql DROP TABLE IF EXISTS `program`; CREATE TABLE `program` ( `id` int(8) NOT NULL AUTO_INCREMENT COMMENT '项目ID', `name` varchar(100) NOT NULL COMMENT '项目名称', `status` tinyint(2) NOT NULL COMMENT '项目状态', `member_id` int(8) NOT NULL COMMENT '创建者ID', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; ``` ### 日志表 ### 日志表(LOG)用于存储[任务表](#任务表 "任务表(TASK)")的变动记录,通过触发器写入,只能插入和查询,不提供接口修改和删除,任务表的核心字段例如任务名称、deadline、责任人等发生变化时,需要存储变化前后的对应的字段值以及操作人。 日志表结构如下: | 字段描述 | 日志ID | 任务ID | 任务描述 | 日志内容 | 修改时间 | 修改作者 | |:--------: |:-------: |:-------: |:------------: |:------------: |:--------: |:--------: | | 是否必填 | 是 | 是 | 是 | 是 | 是 | 是 | | 字段名称 | id | task_id | task_name | info | time | author | | 字段类型 | int(12) | int(8) | varchar(100) | varchar(500) | datatime | int(8) | | 是否主键 | 主键 | | | | | | 建表: ```sql DROP TABLE IF EXISTS `log`; CREATE TABLE `log` ( `id` int(12) NOT NULL AUTO_INCREMENT COMMENT '日志ID', `task_id` int(8) NOT NULL COMMENT '任务ID', `task_name` varchar(100) NOT NULL COMMENT '任务名称', `info` varchar(500) DEFAULT NULL COMMENT '日志内容', `time` datetime NOT NULL COMMENT '变化时间', `author` int(8) NOT NULL COMMENT '修改人', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8; ``` ## 通用服务与接口 ## ing...