ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CRM需求分析设计文档实战:从用例到代码的权限模型与数据结构落地

CRM需求分析设计文档实战:从用例到代码的权限模型与数据结构落地 简介这份CRM客户关系管理需求分析设计文档面向企业信息化项目中的产品经理、需求分析师与开发人员围绕企业版CRM系统的建设目标提供从需求梳理到设计落地的完整参考。文档系统覆盖引言、任务概述、功能需求、性能需求等章节包含用户基本情况、组织结构与业务流程说明并配有详尽的用例描述、数据概念结构图实体—关系图、系统业务流程图以及界面原型预览帮助读者理解销售流程自动化、客户信息整合与数据分析支持等核心诉求。资源包为1个doc文件约1.66MB结构完整、目录清晰可直接用于需求评审、方案撰写或教学参考。目前已有187人学习适合需要快速掌握CRM需求分析方法、对照用例与数据流图完成系统设计的读者参考借鉴。1. 从一份 60 页的 CRM 需求文档说起它到底能帮你省下多少返工接手过 CRM 项目的人大概都有过这种体验需求评审会上大家点头如捣蒜开发到第三周突然发现客户信息管理的权限边界没人说得清销售主管到底能不能看到下属的日程安排翻遍聊天记录也找不到结论。这份《CRM 客户关系管理需求分析设计文档》就是冲着这个场景来的——它不是一份泛泛而谈的模板而是一份带编号、带用例、带业务规则的完整需求规格说明书覆盖客户信息管理、日程安排、邮件系统、审批管理、短信管理、组织结构、系统管理七大模块光用例编号就从 CRM101 排到 CRM305。文档的骨架很清晰引言交代编写目的和项目背景任务概述锁定运行环境和条件限制功能需求部分用大量用例描述把每个操作的前置条件、基本事件流、备选流、后置条件、业务规则全部写死后面还跟着数据概念结构图和系统业务流程图。适合谁用正在做 CRM 需求分析的产品经理、需要把需求翻译成代码的开发者、以及要拿这份文档去跟客户对齐验收标准的实施人员。如果你手上正缺一份能直接改改就用的需求底稿这份文档的颗粒度值得你花时间拆一遍。2. 需求文档的骨架怎么搭从引言到功能划分的落地路径2.1 引言和任务概述里藏着哪些必须锁死的参数很多人拿到需求文档习惯直接跳到功能描述结果开发到一半发现运行环境对不上。这份文档在引言和任务概述部分把该锁的东西全锁了我建议你按下面的顺序过一遍。先看编写目的和项目背景。文档明确写了读者对象是就业部、市场部门、系统维护人员这意味着需求描述的详略程度是按非技术背景也能看懂来定的。项目背景里交代了用户组织结构是销售部门、就业部门、系统维护部门三层这个结构直接决定了后面权限模型的设计——销售只能管自己范围内的客户系统管理员可以在任何机构下创建用户机构管理员只能在自己机构下新建用户。再看运行环境。硬件部分写得很细HP DL380G5 服务器四核 E5430 2.66GHz 处理器2G 内存P400i RAID 卡支持 RAID 0/1/15/5存储用 MSA1000 光纤磁盘柜。软件环境是 Windows XP SP2 SQL Server 2000 JDK 1.5 WebSphere Application Server 6.1。这些参数在今天看来确实老旧但它的价值在于示范了运行环境该怎么写——不是笼统写主流服务器而是具体到型号、核数、内存、RAID 级别。条件与限制部分有一条特别值得注意用户不需要且不要使用 LDAP 服务但需要单点登录功能。这是一个典型的约束条件它直接排除了基于 LDAP 的 SSO 方案逼着你在应用层自己实现会话共享。如果你在做一个类似的项目这条约束一定要在需求阶段就确认清楚否则架构选型会走弯路。2.2 功能划分表怎么读优先级和角色边界是重点文档第 3.2 节的功能划分表是整份文档的索引我把它整理成了一张更直观的表格功能模块用例编号范围最高优先级关键角色限制客户信息管理CRM2015销售、主管均可操作日程安排CRM101-1045仅本人可增删改查指派员工/目标CRM205-206—仅主管可操作邮件系统CRM107-1135不同身份看到不同邮件审批管理CRM114-115—主管审批销售申请短信管理CRM116-118—发送、查询、删除组织结构CRM119-120—部门与员工管理系统管理CRM301-3053-5仅系统管理员这张表的核心价值在于两点优先级标注和角色边界。优先级 5 的用例是必须最先实现的优先级 3 的可以放到二期。角色边界则直接对应后面的业务规则——比如日程安排模块明确写了销售人员只能对自己的日程安排信息进行查询、添加、修改、删除这条规则如果漏掉开发出来的系统就会出现销售能看到主管日程的越权问题。功能划分表还有一个容易被忽略的作用它是需求变更的基线。当客户后期提出能不能让销售也指派任务时你可以翻到这张表指出指派功能的角色限制是主管变更需要走评审流程。这比口头扯皮有效得多。2.3 用例描述的三段式结构前置条件、事件流、业务规则文档第 3.3 节是重头戏每个用例都按统一结构展开。以 CRM1.01 日程安排为例它的结构是这样的前置条件已登录到系统平台。这看起来是废话但它定义了用例的起点——所有操作都必须在登录态下进行意味着权限校验是每个用例的第一道关卡。基本事件流用户点击日程安排页面菜单中有日常事务、日日程、周日程、月日程四个选项。以日日程为例点击进入界面后点新增弹出窗口填写主题、起始时间、内容、关联客户点击保存完成。这里的关键信息是关联客户字段——日程不是孤立的时间记录它必须能关联到具体客户这是 CRM 系统和普通日历应用的本质区别。备选流查询、修改、删除。查询是点击相应日期显示日程信息修改是点击日程条目弹出窗体修改后保存删除是点击条目后点删除。备选流覆盖了主流程之外的所有分支开发时如果只实现基本事件流用户一用就会发现怎么改不了。业务规则销售人员只能对自己的日程安排信息进行查询、添加、修改、删除。这条规则是整个用例的灵魂它决定了数据权限的实现方式——每条日程记录必须带创建人 ID查询时强制拼接当前用户 ID 作为过滤条件。我一般会建议团队在评审用例时重点盯三样东西前置条件是否完整、备选流是否覆盖了异常分支、业务规则是否可测试。这份文档在这三点上做得比较扎实可以直接作为需求评审的检查清单。3. 把用例翻译成代码权限模型与数据结构的实现要点3.1 角色权限模型怎么落地三类角色的数据隔离方案文档定义了系统管理员、主管、业务员三类角色每类角色的数据可见范围不同。系统管理员可以跨机构操作主管只能看本部门数据业务员只能看自己的数据。这个权限模型用代码实现时核心是在数据层加一个数据范围字段。常见的做法是在用户表里加一个data_scope字段取值分别为ALL、DEPT、SELF。查询时根据当前用户的data_scope动态拼接 SQL 条件。下面是一个简化的实现示例def build_query(user, base_query): 根据用户的数据范围构建查询条件 user: 当前登录用户对象包含 role 和 dept_id base_query: 基础查询语句 if user.role admin: # 系统管理员不加任何数据过滤 return base_query elif user.role manager: # 主管只能看本部门数据 return base_query.filter(dept_iduser.dept_id) else: # 业务员只能看自己的数据 return base_query.filter(owner_iduser.id)这段代码的逻辑很直白管理员不加过滤主管按部门过滤业务员按创建人过滤。参数说明一下——user.role来自登录时写入 session 的角色标识user.dept_id是用户所属部门 IDuser.id是用户唯一标识。这三个字段在用户表设计时就要预留好后期补加会很痛苦。需要特别注意的是文档里提到系统管理员可以在任何机构下创建用户机构管理员可以在自己机构下新建用户这意味着创建用户这个操作本身也需要做数据范围校验。我见过不少项目在查询上做了权限控制但创建和修改接口忘了加导致业务员可以通过构造请求把数据挂到别的部门下面。血泪经验是权限校验要覆盖增删改查全部操作不能只做查询。3.2 日程安排模块的数据结构关联客户字段怎么设计日程安排是这份文档里描述最详细的模块之一日日程、周日程、月日程三个子功能共享同一套数据结构。从用例描述里可以提取出这几个关键字段主题、起始时间、内容、关联客户、创建人。关联客户这个字段的设计有两种常见方案。一种是单客户关联日程表里加一个customer_id外键另一种是多客户关联加一张schedule_customer中间表。文档里写的是关联客户是指日日程计划中所涉及的客户信息用的是单数表述但实际业务中一次拜访可能涉及多个客户我一般会建议用中间表方案扩展性更好。-- 日程主表 CREATE TABLE schedule ( id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(200) NOT NULL COMMENT 主题, start_time DATETIME NOT NULL COMMENT 起始时间, content TEXT COMMENT 内容, schedule_type TINYINT NOT NULL COMMENT 类型1日 2周 3月, owner_id INT NOT NULL COMMENT 创建人ID, dept_id INT NOT NULL COMMENT 所属部门ID, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 日程与客户关联表 CREATE TABLE schedule_customer ( schedule_id INT NOT NULL, customer_id INT NOT NULL, PRIMARY KEY (schedule_id, customer_id) );建表时有两个细节容易翻车。第一owner_id和dept_id必须冗余存储不能只存owner_id然后关联用户表查部门——因为用户可能调岗历史日程的部门归属应该保持创建时的状态。第二schedule_type字段用来区分日、周、月日程查询时按类型过滤这样三个子功能可以共用一套后端逻辑前端只传不同的 type 值。3.3 邮件模块的文件夹模型收件箱、发件箱、废件箱的状态流转邮件模块在文档里占了很大篇幅收件箱、发件箱、废件箱三个文件夹的操作逻辑各不相同。收件箱支持查看、回复、删除、导出、打印发件箱支持查看、删除、导出、打印、再次发送废件箱支持查看、恢复、永久删除、清空。这三个文件夹本质上是一张邮件表加一个状态字段。我一般会这样设计CREATE TABLE mail ( id INT PRIMARY KEY AUTO_INCREMENT, sender_id INT NOT NULL COMMENT 发件人ID, receiver_id INT NOT NULL COMMENT 收件人ID, subject VARCHAR(500) COMMENT 主题, body TEXT COMMENT 正文, status TINYINT DEFAULT 1 COMMENT 状态1正常 2已删除 3永久删除, folder TINYINT NOT NULL COMMENT 文件夹1收件箱 2发件箱 3废件箱, send_time DATETIME COMMENT 发送时间, is_read TINYINT DEFAULT 0 COMMENT 是否已读 );状态流转的逻辑是这样的新邮件写入时status1folder根据是发送还是接收分别设为 2 或 1。删除操作把status改为 2同时folder改为 3。废件箱里的恢复操作把status改回 1folder改回原文件夹。永久删除把status改为 3清空废件箱则是批量把当前用户废件箱里所有status2的记录改为 3。这里有个坑要注意文档里写不同身份登录看到的邮件不同这意味着查询邮件列表时必须同时按sender_id或receiver_id过滤当前用户。收件箱查receiver_id当前用户 AND folder1发件箱查sender_id当前用户 AND folder2废件箱查(sender_id当前用户 OR receiver_id当前用户) AND folder3。漏掉任何一个条件都会导致越权看到别人的邮件。4. 避坑与排查需求文档落地时最容易翻车的五个地方4.1 用例编号和功能编号对不上现象开发拿着 CRM1.03 去找对应的功能描述发现文档里 CRM1.03 是我的审批但功能划分表里 CRM114 才是审批管理两个编号体系并行对不上号。原因文档在编写过程中经历了多次修改功能划分表用的是 CRM1XX 系列用例描述里混用了 CRM1.0X 和 CRM1.XX 两种格式没有统一。解决在需求评审阶段就要求统一编号规则。我的做法是建一张映射表把功能划分表的编号和用例描述的编号一一对应评审时逐条核对。如果文档已经定稿无法修改就在开发任务拆分时以用例描述为准功能划分表只作为模块索引使用。4.2 备选流覆盖不全导致异常分支漏实现现象开发只实现了基本事件流用户点击修改按钮时页面没反应因为备选流里的修改逻辑没写。原因用例描述里基本事件流写得很详细备选流往往只有几行开发容易只盯着主流程。解决把每个用例的备选流单独抽出来做成检查清单每条备选流对应一个开发任务。比如日程安排的备选流有查询、修改、删除三条就拆成三个子任务完成一个勾一个。这份文档的备选流写得还算完整但像我的申请用例里写了审批通过后就不能对结果进行删除、修改只能有查看的功能这种状态约束很容易在开发时被忽略需要在代码里加状态判断。4.3 业务规则里的权限约束在代码层被绕过现象测试发现业务员 A 可以通过修改请求参数看到业务员 B 的日程安排。原因前端做了权限控制隐藏了入口按钮但后端接口没有做数据范围校验直接根据前端传来的 ID 查询。解决所有查询接口强制拼接当前用户的权限过滤条件不信任前端传来的任何 ID 参数。具体做法是在 DAO 层封装一个统一的查询方法所有涉及数据范围的查询都必须走这个方法。文档里销售人员只能对自己的日程安排信息进行查询、添加、修改、删除这条规则要在代码层面落实为WHERE owner_id :currentUserId而不是靠前端隐藏按钮。4.4 运行环境参数与实际情况不符现象开发环境用 JDK 1.8 和 MySQL 8.0 开发部署到生产环境发现是 JDK 1.5 和 SQL Server 2000SQL 语法不兼容启动直接报错。原因需求文档里写的运行环境是 2009 年的配置但开发团队用的是新环境没有提前对齐。解决项目启动前先确认运行环境如果生产环境无法升级开发环境就必须降级到相同版本。这份文档明确写了 JDK 1.5 和 SQL Server 2000如果照着做开发时就要避免使用 JDK 1.6 的语法特性和 MySQL 专有函数。我一般会在项目根目录放一个environment.md把 JDK 版本、数据库版本、应用服务器版本写清楚每次新人入职先看这个文件。4.5 单点登录需求与 LDAP 限制的冲突现象文档要求单点登录但不使用 LDAP开发团队按常规方案集成 LDAP 后发现不符合约束返工重做。原因需求文档在条件与限制里明确写了用户不需要且不要使用 LDAP 服务但这条约束在功能需求部分没有再次强调开发容易忽略。解决把不使用 LDAP这条约束提升为架构决策记录在技术方案评审时作为一票否决项。替代方案可以是用数据库做用户存储通过共享 session 或 token 实现单点登录。具体做法是登录成功后生成一个 token 写入 Redis其他系统通过校验 token 来识别用户身份不依赖 LDAP 目录服务。5. 从需求文档到可运行系统一份用例的完整验证路径文档读完了代码也写得差不多了怎么验证做出来的东西跟需求文档是一致的我一般会挑一个用例走完整条链路日程安排里的日日程模块就很适合拿来练手。先看前置条件已登录到系统平台。验证时先用业务员账号登录确认能正常进入系统。然后走基本事件流点击日程安排进入日日程界面点新增填写主题、起始时间、内容、关联客户点保存。保存成功后回到列表页确认新增的日程出现在对应日期下。这一步验证的是主流程是否跑通。接着走备选流。查询点击相应日期确认能显示该日期的日程信息。修改点击日程条目弹出修改窗口改掉主题后保存确认列表里的主题变了。删除点击日程条目点删除确认列表里该条目消失。这三条备选流覆盖了增删改查的完整闭环。然后验证业务规则。用业务员 A 的账号创建一条日程退出后用业务员 B 的账号登录确认 B 看不到 A 的日程。再用主管账号登录确认主管能看到本部门所有业务员的日程。这一步验证的是数据权限是否生效。最后验证后置条件新增、修改或删除日程信息成功后可以通过检索的方式验证。在列表页用日期筛选确认筛选结果与操作结果一致。这套验证路径走下来基本能覆盖一个用例 80% 以上的场景。我习惯把每个用例的验证步骤写成测试用例开发提交代码后先跑一遍通过后再交给测试团队。从那以后我每次拿到需求文档都会先挑一个用例走完整条链路确认需求、代码、验证三者对得上再批量推进其他模块。希望帮到你。本文还有配套的精品资源点击获取
返回列表