ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

员工信息管理系统概要设计:从E-R图到MySQL建表避坑指南

员工信息管理系统概要设计:从E-R图到MySQL建表避坑指南 简介《员工信息管理系统概要设计说明书》是一份面向系统架构师、开发人员及软件工程学生的设计文档旨在为员工信息管理系统提供总体设计方案。文档依据需求规格说明书展开完整覆盖引言、任务概述、接口设计、总体设计、数据结构设计、运行设计、出错处理以及安全保密与维护设计等核心环节。其中包含顶层与二层用例图、各模块数据流图、E-R图和总体结构设计等关键图示详细阐述了管理员注册登录、员工信息添加删除查询修改等功能的模块划分与数据流向有助于读者快速理解系统架构并作为概要设计阶段的参考模板。资源为压缩包内仅含1个doc格式文档包体大小131KB结构清晰适合课程设计、毕业设计或实际项目初期借鉴。文档还介绍了登录验证与MD5加密等安全措施具备一定的实践参考价值。目前已有1419人浏览学习适合需要快速掌握员工信息管理系统设计思路的开发者阅读。1. 这份概要设计说明书到底帮你省了哪几步路做课程设计或毕业设计的人最容易卡在第一步E-R 图画完了用例图也堆出来了但文档和代码对不上被导师一句“先写概要设计”打回去重来。这篇《员工信息管理系统概要设计说明书》不是代码而是一份标准的软件工程阶段产物——它把需求规格说明翻译成总体设计覆盖功能目标、接口、模块划分、数据结构、运行设计、出错处理、安全保护与维护设计是写详细设计和编码之前的最后一道闸门。它适合信安、软工专业正在做管理类课程设计的人也适合从来没写过概要设计文档的开发者照着它的目录结构你能少走一轮“文档被导师打回重写”的弯路。需要先说明的是这份说明书的硬件环境和数据库选型停留在较早的时期而且存在若干前后不一致的地方我放在第 5 章逐一拆开讲。2. 总体设计是怎么铺开的从用例图到数据流图这一章解决“概要设计到底要画哪些图、每张图管什么用”的问题。文档的第 4 章集中了处理流程、用例图、数据流图、E-R 图和总体结构设计这五样东西不是各画各的而是一条逐步收紧的链路用例图划定系统边界数据流图标出数据走向E-R 图定义实体关系总体结构图决定代码目录怎么拆。2.1 用例图怎么读三个功能目标翻译成图文档 2.1 列出了三个目标管理员注册与登录、员工信息增删改查、管理员登录注销。顶层用例图就是把这三句话变成用例。只有“管理员”一个参与者用例有“登录”“注销”“员工信息管理”其中“员工信息管理”可以继续拆成“新增员工信息”“修改员工信息”“删除员工信息”“查询员工信息”。画这张图时有个常见误区把系统功能当成参与者。比如有人会把“数据库”画成一个 actor或者把“员工”也拖进来。员工在这个系统里不直接操作系统所有操作都由管理员代劳所以员工不是参与者。这两个参与者画错后面详细设计的类划分就会跟着歪。你只需要记住一条规则参与者是站在系统外部、主动发起动作的人或系统不是系统内部的处理环节。2.2 数据流图的分层思路顶层、中层、底层各看什么文档 4.3 给出了顶层数据流图和细化后的数据流图这是个典型的分层数据流图结构。顶层图只有一个处理过程员工信息管理系统。外部实体是管理员数据流是“登录信息”“操作请求”“显示结果”“注销请求”。这张图回答“系统和谁打交道”。第二层把系统拆成三个处理管理员登录、员工信息管理、注销退出。管理员把“账号密码”发给登录处理登录成功后把“操作指令”发给员工信息管理管理模块操作“员工信息表”数据存储把更新后的结果回显给管理员最后管理员发起“注销”。画数据流图最容易翻车的点是把控制流混进数据流。比如“登录成功后跳转到主页”是控制流不是数据流数据流只描述数据从哪来到哪去如图 2-1 所示的方向流动过程。写文档时若把“成功”“失败”当成数据流画箭头导师一眼就能看出来你对 DFD 的理解不到位。2.3 E-R 图补全文档缺的那张图我来补上文档 4.4 只写了“E-R 图”三个字没有实际内容。这是这份说明书最大的缺口因为审查人最常看的就是 E-R 图。按正文 5.1 的数据结构推演实体只有两个实体属性关键标识管理员管理员账号、管理员密码管理员账号为主键员工员工姓名、员工性别、员工年龄、员工联系方式、员工地址无明确主键需补充员工编号关系是“管理员管理员工”一个管理员可以管理多个员工属于一对多关系。补 E-R 图时我会把“员工编号 StaffID”加进去否则员工表连主键都没有物理设计没法建表。这是文档 5.1 的逻辑设计里隐藏的一个缺陷第 5 章会细说。2.4 总体结构设计模块划分直接决定代码目录文档 4.5.1 把系统拆成管理员登录模块和员工信息管理模块4.5.2 给出了两个模块的外部接口定义登录模块输入管理员账号、密码输出登录完成界面。员工信息管理模块输入添加、删除、修改操作输出更新后的信息。这两个模块的划分对应到代码里就是控制层和业务层的最初形态。写详细设计时登录模块会拆出登录页面、验证码生成器、会话管理三个类员工信息管理模块会拆出员工实体类、员工数据访问类、员工业务逻辑类。现在你就能理解为什么概要设计不能跳过了——模块切成什么样代码目录就长什么样后面改结构比改代码贵得多。3. 数据结构设计落地两张表把系统撑起来这份说明书的数据结构设计部分可以照抄作业但有一个前提你得先补字段。逻辑结构设计里给出了管理员和员工两个实体的属性物理结构设计只写了一句话“采用二维表结构”。这一章我直接把它变成可以进 PhpMyAdmin 执行的建表脚本。3.1 逻辑结构设计字段类型为什么这样定管理员信息结构字段字段名类型说明管理员账号manageID字符串主键登录名管理员密码managePassword字符串加密后存储员工信息结构字段字段名类型说明员工编号staffID整型建议自增主键员工姓名StaffName字符串必填员工性别StaffSex字符串可做枚举员工年龄StaffAge字符串注意原文档是字符串员工联系方式StaffContact整型容易溢出建议改为字符串员工地址StaffAddress字符串可空字段类型有两点要调整。第一联系方式用整型不合理手机号是 11 位数字如果带头部零整型直接丢而且将来要存座机号带区号就会变成字符串。第二年龄用字符串不如用无符号 TINYINT范围 0~255 足够覆盖正常员工年龄还能省存储。3.2 物理结构设计MySQL 建表脚本与参数说明按照文档 1.3 的定义数据库管理系统是 MySQL下面直接给出可执行的建表语句-- 管理员表 CREATE TABLE admin ( manage_id VARCHAR(32) NOT NULL COMMENT 管理员账号主键, manage_password VARCHAR(64) NOT NULL COMMENT 管理员密码建议存MD5或bcrypt哈希, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (manage_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT管理员信息表; -- 员工表 CREATE TABLE employee ( staff_id INT UNSIGNED AUTO_INCREMENT COMMENT 员工编号自增主键, staff_name VARCHAR(50) NOT NULL COMMENT 员工姓名, staff_sex ENUM(男,女,保密) DEFAULT 保密 COMMENT 员工性别, staff_age TINYINT UNSIGNED DEFAULT 0 COMMENT 员工年龄, staff_contact VARCHAR(20) NOT NULL COMMENT 员工联系方式VARCHAR避免丢失前导零, staff_address VARCHAR(255) DEFAULT NULL COMMENT 员工地址, PRIMARY KEY (staff_id), KEY idx_name (staff_name) COMMENT 按姓名查询的索引 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT员工信息表;代码说明ENGINEInnoDB支持事务和外键管理类系统默认选 InnoDB不要用 MyISAM。utf8mb4比utf8多支持部分特殊字符和表情地址栏里可能出现生僻字用这个稳妥。staff_contact用了 VARCHAR(20)虽然原文档定义是整型但实际开发里手机号、座机号并存的情况下字符串才是安全的。员工表加了一个idx_name索引因为业务上最常见的操作是按姓名查员工全表扫描在小数据量时无所谓数据量上到十万级就明显卡顿。3.3 二维表结构之外要不要加外键和唯一约束文档 5.2 只说“采用二维表结构”这在物理设计上不够。有一个容易被忽略的点管理员表和员工表之间是否存在外键从业务看员工表和管理员表没有直接父子关系员工不属于某个管理员所以不需要外键。加了反而让删管理员时产生级联麻烦。需要加的约束是唯一约束如果系统允许员工编号作为打卡或工资标识staff_id本身就是主键天然唯一。如果后续要对接考勤系统建议给staff_contact加上业务层面的唯一校验避免同一员工重复录入。这里的经验是物理设计不是把逻辑设计原样搬成 SQL而是补主键、选类型、定字符集、建索引。当初我在详设阶段拿着这份文档建表因为没注意联系方式整型的问题测试时录一个号码13800138000没出问题但录01012345678直接报超范围后来统一改成 VARCHAR 才消停。4. 接口设计与运行控制登录、增删改查、注销的链路这一章把文档第 3 章和第 6 章串起来看。接口设计解决“用户怎么操作、系统内部怎么传数据”运行设计解决“程序启动后先干什么、后干什么”。这两部分合在一起就是一个管理系统的骨架。4.1 用户接口页面流转是一张有向图文档 3.1 描述了登录界面和员工信息界面的控件把这些串起来可以得到完整的页面流转链路打开系统进入登录界面输入用户名、密码、验证码。点登录按钮通过验证后进入员工信息管理界面。在管理界面点新增、修改、删除按钮进入对应操作或弹窗。操作完成回到管理界面数据刷新显示。点注销退出系统按钮回到登录界面。这条链路里有个细节验证码输入框是登录安全的第一道门文档 8 里也提到了安全设计但正文 3.1 没有说明验证码校验失败的反馈方式。写详细设计时需要补一个分支验证码错误时提示“验证码错误请重新输入”回到登录界面并刷新验证码图片。4.2 外部接口与内部接口SQL Server 还是 MySQL文档 3.2 外部接口写的数据库连接不一致这是全文最明显的冲突之一1.3 定义说 MySQL3.2 软件接口说 SQL Server。实际课程设计用的是 PHP MySQL 组合这里以 MySQL 为准做接口设计。外部接口分两块硬件接口很简单鼠标键盘输入即可。软件接口是数据库连接常见的连接方式是 PDO 或者 mysqli。如果按文档时期的技术栈来写用 mysqli 更贴近原项目背景?php $host 127.0.0.1; $port 3306; $dbname employee_db; $username root; $password your_password; // 建立连接 $conn new mysqli($host, $username, $password, $dbname, $port); if ($conn-connect_error) { die(数据库连接失败 . $conn-connect_error); } // 设置字符集 $conn-set_charset(utf8mb4); ?内部接口文档写的是“通过面向对象语言设计类在 public 中实现调用类间实现严格封装。模块间采用数据耦合方式通过参数表传达数据”。翻译成实际操作登录模块和员工信息管理模块之间不要共享全局变量登录模块把管理员身份通过参数传给管理模块的构造函数模块内部私有方法不允许外部直接访问。数据耦合在 PHP 里的落地方式是依赖注入比如new EmployeeManager($adminId)而不是EmployeeManager::setAdminId()的静态方法硬编码。4.3 运行控制流程主循环分发模式文档 6.1 写的是“主程序运行等待用户的输入根据用户的输入调用各子模块”这是典型的页面控制器模式。PHP 的实现路径是前端控制器?php $action $_GET[action] ?? login; switch ($action) { case login: require views/login.php; break; case employee_list: require controllers/EmployeeController.php; break; case logout: session_destroy(); header(Location: index.php?actionlogin); exit; default: require views/404.php; }参数说明action是 URL 里的路由参数控制整个系统的页面分发login、employee_list、logout对应登录、员工列表、注销三个入口。这个小骨架放在详细设计阶段可以直接当路由文件用。运行设计里还要补一个文档没写的东西会话超时。管理员登录后如果长时间不操作合理时间是 30 分钟自动注销避免遗忘退出导致的信息泄露。这个属于运行控制的一部分放在详细设计页面跳转逻辑里加上即可。5. 概要设计文档避坑五处自相矛盾与三个隐藏风险这份文档最适合当作反面教材来拆。它编得比较早能反映初学者的典型问题。以下是在课程设计评审里会被重点追问的五个坑每一条都是实际翻车记录。5.1 数据库选型MySQL 还是 SQL Server 前后矛盾现象文档 1.3 定义部分写的是“MYSQL所用的数据库管理系统”但 3.2 外部接口写“通过 SQL Server 数据库进行连接”。原因写接口设计时直接套用了模板没有和定义部分对齐。解决做课程设计时先确定一个数据库然后全文统一。推荐选 MySQL理由有三个与 PHP 搭配最成熟PhpMyAdmin 或 MySQL Workbench 可视化建表方便网上资料最多出错容易搜。如果坚持用 SQL Server就需要换掉 PHP 技术栈改成 C# 或 Java工作量明显变大。我一般拿到文档先全局搜数据库名把冲突列出来再开工。5.2 运行环境过时Windows 95/98 与 Java 虚拟机现象文档 2.2 写“中文 Windows95/98/NT 4.0 或更高版本并装有 JAVA 虚拟机的操作系统”且内存占用要求小于等于 1MB硬盘空间小于等于 5MB。原因模板来源于多年前的老项目硬件指标完全没有更新。解决当前技术栈是 PHP MySQL 时把运行环境改为 Windows 10/11、Linux 或 macOS建议配置改为内存不低于 4GB、硬盘剩余空间不低于 500MB、已安装 PHP 7.4 以上版本及 MySQL 5.7 以上版本。这一条看似无伤大雅但评审老师看到“Java 虚拟机”四个字会直接质疑你文档和系统不符。5.3 条件与限制承认功能简单如何补救现象文档 2.3 写“比较简单不能实现完善和全面的功能。还不能进行更好的管理。对于一些突发事件无法处理以及特殊要求服务无法实现”。原因目标定得过低给自己留了太多退路但这在课程设计评审里是减分项。解决把“限制”改成“扩展方向”。比如写“本版本聚焦基础信息管理后续可扩展考勤、薪资、部门管理模块当前不支持批量导入导出可在二期加入”。切记限制描述要具体写“不能做什么”不如写“当前实现到什么程度、下一步加什么”。5.4 员工表缺少主键现象文档 5.1 员工信息数据结构列了姓名、性别、年龄、联系方式、地址五个字段没有员工编号。原因逻辑设计阶段只考虑了字段没有考虑每条记录的唯一定位。解决加staffID自增主键。没有主键的表在 MySQL InnoDB 下会生成隐藏主键到时候删除、修改按条件匹配极容易误伤加了主键后删除按钮通过staffID精确定位而不是按姓名匹配。5.5 安全设计说了一堆做法但没给实现位置现象文档第 8 章写了证书验证、base64 urlcode 加密、MD5随机数但正文没有任何接口或模块承接这些逻辑。原因安全章节是从模板里抄来的没有映射到具体模块。解决把安全设计落实到代码位置。第 6 章我会给出具体实现思路。简要来说base64 编码放入传输层封装MD5 加盐放进密码存储逻辑验证码放入登录模块。5.6 三个隐藏风险会话固定、SQL 注入、越权操作文档没有提这三类风险但任何一个员工管理系统上线前都要应对。会话固定攻击发生在登录前把 session 固定为已知值解决办法是登录成功后调用session_regenerate_id(true)。SQL 注入高发于登录和查询接口解决办法是全部使用预处理语句不拼接 SQL。越权操作的风险在于管理员登录后所有接口都信任当前会话解决办法是每个业务操作先校验会话是否有效、管理员是否存在。6. 把安全设计从纸面落到代码加密、传输与登录验证文档第 8 章的安全设计是最容易被忽略也最值得展开的部分。很多课程设计的安全章节写了等于没写因为只是列了三个名词证书验证、base64 urlcode 加密、MD5随机数。这一章把它们变成能放进代码里的实现。需要先说明一个关键认知base64 是编码不是加密它只负责把二进制数据转成文本方便在 URL 和 JSON 里传输不具备防篡改能力。真正的传输安全靠 HTTPS也就是文档里说的证书验证的现代落地方式。6.1 base64 urlcode 的 PHP 实现与坑PHP 里用base64_encode生成的字符串可能包含、/、三个特殊字符直接放进 URL 会被解析成空格或路径分隔符所以 URL 安全的 base64 需要替换字符?php function base64url_encode($data) { return rtrim(strtr(base64_encode($data), /, -_), ); } function base64url_decode($data) { return base64_decode(strtr($data, -_, /)); }参数说明strtr把换成-、/换成_rtrim去掉末尾的填充符。解码时反向替换。这套写法在 JWT 等现代协议里也是标准做法。文档里说“数据传输交互采用 base64 urlcode 加密算法”严格讲应该是“采用 URL 安全的 base64 编码”把加密两个字去掉才准确。6.2 MD5 随机数落成代码文档的“MD5随机数”就是经典的加盐哈希。随机数叫 salt每个用户独立生成。老式写法是md5($password . $salt)但 PHP 5.5 开始提供了更健壮的password_hash函数底层走 bcrypt自动处理盐值。课程设计如果追求安全性与工作量平衡直接用它?php // 注册时生成密码哈希 $hashed password_hash(123456, PASSWORD_DEFAULT); echo $hashed; // 输出类似 $2y$10$.... 的完整哈希 // 登录时校验 $inputPassword $_POST[password]; $storedHash 从数据库查出来的哈希串; if (password_verify($inputPassword, $storedHash)) { // 密码正确放行 session_regenerate_id(true); $_SESSION[admin] $manageId; } else { // 密码错误记录日志 }参数说明PASSWORD_DEFAULT目前是 bcrypt 算法哈希串里自带盐值不需要单独建字段存 salt。session_regenerate_id(true)用来防会话固定攻击。如果你一定要按文档写 MD5随机数那也要做两道盐而不是固定盐但说实话没有意义了password_hash 就是更直接的现代替代。6.3 把验证码登录装配进概要设计验证码和证书验证在文档里是安全章节的分项但它们应该落到用户登录流程里。验证码的现代做法是 GD 库生成图片存 $_SESSION 后比对更省事的是用 Google Authenticator 类的二次验证但课程设计做图片验证码足够。证书验证对应的是 HTTPS部署层面的操作是申请 SSL 证书后配置到 Nginx 或 Apache浏览器地址栏出现锁头即生效。我从那以后养成的习惯是每个课程设计开头先花十分钟把安全设计映射到具体文件密码存哪里、传输走什么编码、验证码生成函数放在哪个公用包里。文档里写“证书验证”四个字只要 10 秒但代码里签字确认却要改三四个文件。这份文档的价值恰恰在于它暴露了所有新手会犯的毛病你照着改一遍等于把概要设计到详细设计的路自己走了一遍。希望帮到你。本文还有配套的精品资源点击获取
返回列表