ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

概要设计说明书怎么读:角色、流程与库表实战解析

概要设计说明书怎么读:角色、流程与库表实战解析

简介:面向社团宣传管理平台的概要设计说明书,清晰定义了项目整体架构与核心功能,为后续详细设计和编码提供明确指导。文档由程赵旭、王成龙、岳凤彬、胡苏齐、王文通合作完成,覆盖2020年5月至7月从启动到结束的完整设计过程。内容从引言、任务概述切入,重点给出前台展示与后台管理的处理流程,包括操作流程及数据增加、修改、删除流程,同时说明总体结构、功能分配(含管理员、社长与社员角色)、数据结构设计和Web框架、数据库、身份验证等软件插件选型建议,适合正在规划社团管理类平台的高校项目组或开发者参考。资源为一份Word文档,实际为docx格式,大小仅511KB,便于直接打开阅读或二次编辑。文档章节完整、条理清晰,可作为社团管理类课程设计与毕业设计的起步模板,已有八十人学习浏览。

1. 概要设计说明书怎么读:角色、流程与库表骨架

拿到这份二十多页的概要设计说明书,我先在浏览器里快速扫目录,直接定位到“总体设计”和“数据结构设计”两节。社团宣传管理平台这类高校社团系统,业务边界其实很清晰:前台展示社团信息,后台让管理员、社长、社员三类角色各自维护自己的数据。文档锁定的技术栈是 JSP 前台页面 + DAO 层访问数据库 + SQL Server 2008 + Tomcat 本地服务器,属于最经典也最好复现的 Java Web 分层路线,没有中间件、没有微服务,依赖少,非常适合照着做课程设计或者毕业设计。这篇笔记我会把这份文档里能直接落地的模块划分、流程约束、接口参数和数据表定义逐一拆开,最后给出从 ER 图到建表语句的实操路径,让你拿到文档就能动手。

2. 处理流程拆解:从操作入口到增删改的三条路径

处理流程是概要设计里最先体现系统玩法的地方。文档明确给出了操作、数据增加、数据修改、数据删除四段流程,我按三段拆开讲。先解释一个关键点:这套平台用的登录模型是“前台和后台分离”。普通社员和社长在前台右侧功能栏登录,超级管理员走导航栏的后台超链接进入独立登录页。为什么要分?因为管理员需要操作的界面和普通用户完全不一样,强行混在一个登录入口里,代码里就要多写一套角色路由,反而增加出错面。

2.1 操作流程:一个前台、两种登录入口的设计意图

流程细节是这样的:用户打开社团网站前台展示界面,右侧功能栏有登录框,输入账号密码后,身份按“社团成员”或“社长”处理。管理员则要点击导航栏的后台超链接,进入后台登录界面,输入管理员账号密码。密码经过 DAO 层与数据库比对,匹配则跳转到后台管理界面,不匹配就弹出一个 Alert 警告框,提示“密码与账户不匹配”。

从文档描述可以看到整套分层思路:JSP 负责展示,DAO 层负责 SQL,Servlet 或 Controller 负责调度,数据库里存的是用户表和角色字段。这里有一个容易被新手忽略的设计点:管理员登录入口独立,意味着后台登录页不需要承载“记住我、验证码、找回密码”等前台功能,可以单独控制安全策略,比如后台登录失败三次就锁账号,这是我在类似项目里的常见做法。

针对“操作流程”的落地步骤,整理为:

  1. 先建用户表 UserInfo,包含登录账号、登录密码、用户类型字段。
  2. 前台登录表单提交到 LoginServlet,按普通用户流程处理。
  3. 后台登录表单提交到 AdminLoginServlet,单独处理管理员校验。
  4. DAO 层分别提供 findUserByAccount 和 findAdminByAccount 两个查询方法。
  5. 密码错误时返回 JSON 或 request 属性,JSP 端弹出 Alert。

参数层面需要注意:用户类型字段建议用 char(1) 或 tinyint,例如 1=管理员、2=社长、3=社员,不要用字符串描述,否则 SQL 查询和下拉框都要跟着写映射。

2.2 数据增加流程:自动编号与表单校验的职责边界

增加流程的约束写得很清楚:每条信息都有一个编号,编号字段不可人为编写,系统自动给出;其他信息由用户填写,填写的格式和正确性由系统判断,输入通过表单校验后才保存到数据库,非法输入会报错且无法提交。

很多人看到这里会觉得“编号自动生成”是理所当然的,但在 JSP 时代的项目里,这恰恰是最容易翻车的地方。常见写法是页面表单里放一个编号输入框,用户自己填,或者 JS 里生成一串时间戳当编号,导致数据库主键混乱。正确做法是数据库表设计时就给编号字段设置 identity(1,1),也就是自增主键,JSP 页面完全不渲染这个字段。

落地步骤可以这样:

  1. 建表时写明编号字段为 INT IDENTITY(1,1) PRIMARY KEY。
  2. 增加数据的 JSP 表单只暴露需要用户填写的业务字段。
  3. 前端 JS 负责第一层格式校验,比如时间格式、数字范围。
  4. 后端 DAO 层做第二层校验,判断活动时间是否晚于当前时间、社团类型是否在枚举范围内。
  5. 校验通过执行 INSERT,失败则返回提示信息并保留用户已填内容。

这里要特别说一句:前端校验只保证体验,后端校验才保证数据安全。文档里说的“系统进行判断”,我一般会做成前后端双重判断,避免有人绕过页面直接构造请求。

2.3 数据修改与删除流程:JSP 修改页和 confirm 确认框的配合

修改流程:管理员或社长在后台界面选中要修改的信息,点击“修改”超链接,跳转到另一个 JSP 界面,修改后提交,格式仍要与后台代码规定一致,否则提示重新修改。删除流程:点击“删除”超链接,弹出 confirm 确认框,显示“是否真的要删除”,点击确定后删除并更新数据库。

这里有一个值得记录的细节:修改操作使用超链接跳转新 JSP,说明当时的实现没有走 AJAX 弹窗,而是最传统的“列表页带 ID 拼链接”方案。对应到代码上,列表里每一行操作的 URL 大概是:

editInfo.jsp?id=101 deleteInfo?id=101

这种方案的好处是简单直接、刷新后状态清晰,缺点是如果编辑页被直接打开且 ID 不存在,需要额外做空值判断。我在复现时会加一个判断逻辑:JSP 页面顶部先查记录,查不到就重定向回列表页并提示“记录已被删除或不存在”。

删除流程里 confirm 只解决了“确认”这一步,真正的删除动作要在点击“确定”后发起。我建议把删除做成逻辑删除而不是物理删除,加一个 delete_flag 字段,列表查询默认过滤 delete_flag=0。原因很实际:社团活动删错了没法恢复,尤其是活动参与记录和日志可能关联了其他表。

3. 总体结构与功能分配:把三大角色映射成模块树

总体设计这一章最难的地方不是画模块图,而是把文档里散落的功能词条整理成可执行的模块清单。原文的模块树信息来自一张系统功能模块图和三段角色功能描述,我按自己的习惯重新归类,方便后续做数据库权限和菜单设计。

3.1 总体结构:从功能模块树到子系统划分

文档将系统划分为多个模块,模块再进一步细分。从功能描述里能明显看到几组模块:系统管理(用户、注册会员、社长注册)、社团信息(信息管理和信息查询)、社团活动(活动管理和活动审核)、新闻制度、日程表、社团相册、社团成员、日志、个人资料、社团聚餐、收藏。

这个模块划分基本等同于菜单树。复现时建议把菜单表 menu 和角色表关联,动态渲染左侧导航,而不是在 JSP 里写死。对应到概要设计,我一般会先整理一张“模块清单表”,列里写模块名、归属角色、是否涉及审核、对应数据表,这样到详细设计阶段就不会漏。

3.2 功能分配:三类角色的权限矩阵

管理员的核心职责是“管理平台”,包括系统用户管理、注册会员管理、社长注册管理、社团信息查询、社团活动管理、社团活动审核、新闻和制度管理、日程表信息管理、社团相册管理、系统管理。社长负责“管自己的社团”,包括个人资料、社团信息、社团相册、社团成员、日志、日程表、社团活动、社团聚餐。社员则是“查看和参与”,包括个人资料、我的社团、社团相册、社团信息、社团聚餐的查询,日志查询与管理,以及收藏管理。

把这段变成一个功能权限矩阵:

功能模块管理员社长社员
系统用户管理可管理不可见不可见
社长注册管理可管理不可见不可见
注册会员管理可管理不可见不可见
社团信息管理可管理可管理本社可查询
社团活动管理可管理、可审核可发布、可管理可查看
新闻和制度管理可管理可查看可查看
日程表信息管理可管理可管理本社可查看
社团相册管理可管理可管理本社可查询
社团成员管理可管理可管理本社不可见
日志管理可管理可管理本社可查询
社团聚餐管理可管理可管理本社可查询
收藏管理不可见不可见可管理自己

这张矩阵的价值在于:后续详细设计阶段,每个 Controller 方法和 DAO 查询都能从这张表里反推出权限判断条件,不需要再猜。

3.3 分配原则:数据归属决定谁能动、谁能看

从矩阵能看出一个规律:社长只能管理“本社”数据,社员只能“查询”和“管理自己的收藏和个人资料”,管理员拥有全部权限。这个“数据归属”概念直接决定了 SQL 怎么写。比如社长查询成员列表,SQL 必须带 club_id 条件;社员查询日志,只能看到自己参与社团的日志,或自己的日志;收藏管理只操作自己的收藏记录。

我在复现时会把归属字段统一命名为主表的 club_id 字段,社长登录后 session 里存 club_id,所有带归属的数据查询都拼上这个条件。如果不这么做,就会出现“社长 A 删掉了社长 B 的社团活动”这种低级事故,这在答辩演示时是非常尴尬的。

4. 接口设计与运行环境:Tomcat、JDBC、SQL Server 的取舍

接口设计章节通常最枯燥,但恰恰是复现时依赖最多的信息。文档把接口拆成外部接口和内部接口两大部分,外部接口又分用户界面、软件接口、硬件接口,内部接口直指数据库连接。

4.1 内部接口:JDBC 连接 SQL Server 的配置要点

内部接口只有一句话:与 SQL Server 数据库通过 JDBC 接口进行连接。这句话背后的配置细节值得展开。以 SQL Server 2008 为例,JDBC 驱动类名、URL 格式、端口和认证方式都是可以确定的。

配置项参数值说明
驱动类名com.microsoft.sqlserver.jdbc.SQLServerDriver对应 sqljdbc4.jar
JDBC URLjdbc:sqlserver://localhost:1433;DatabaseName=club_platform数据库名称按实际建库名替换
默认端口1433SQL Server 默认端口
认证方式混合认证或 Windows 认证开发环境常用 sql 账号加密码
连接池DBCP 或 C3P0避免每次操作新建连接

如果项目里已经有 DAO 层,最稳妥的连接获取方式是通过配置文件加载,例如 db.properties。我一般在测试连接时会先用命令行验证服务器端口通不通,再写 JDBC 代码,否则容易把“写的代码有问题”和“SQL Server 服务没启动”混在一起排查。

4.2 外部接口:界面、软件与硬件边界的说明

用户界面部分按 Windows 应用软件规范设计,风格简约,采用对话框交互。这个描述可以理解成系统面向的是纯浏览器使用场景,页面布局参考桌面软件习惯,所有操作窗口都用对话框完成。对应到前端技术上,就是表单页和列表页分离,弹窗提示用 alert、confirm。

软件接口写明本软件采用 Tomcat 本地服务器,运行于 Windows 2000 以上的操作系统。这说明部署形态是单机或实验室服务器,而不是云部署。复现时我建议用 JDK 8 + Tomcat 8.5 + SQL Server 2008 的组合,兼容性比 JDK 11 更高。硬件接口要求 Intel 或其他系列微型计算机,内存 16G 以上,硬盘 512G 以上,这是在写需求说明书时定的下限,实际跑这个项目 4G 内存也能跑,但用 16G 内存机器做开发是合理的,因为还要跑 IDE、数据库和 Tomcat。

4.3 运行环境与部署边界:Tomcat 本地服务器的定位

把运行环境整理成一张可直接照做的参数表:

项目要求
操作系统Windows 2000 以上
Web 服务器Tomcat 本地服务器
数据库SQL Server 2008
连接方式JDBC
内存16G 以上
硬盘512G 以上

一个容易被忽略的点是:Tomcat 本地服务器还要考虑端口占用。默认 8080 端口如果被其他进程占用,Tomcat 启动会报端口被占用错误。我在第一次部署时会先调整 server.xml 里的 Connector port,或者用 netstat -ano 检查端口。这些在概要设计里不会写,但属于实际环境里的必踩项。

5. 数据结构设计与常见问题:5 张核心表的字段定义和五个坑

数据结构设计是这份文档里信息密度最高的部分,它直接给出了逻辑模型和物理模型的骨架。我在这章先把关系模型讲清楚,再补全 5 张核心表的字段建议,最后给一份高频坑排查记录。

5.1 逻辑结构:关系模型的选择与查询代价

文档提到系统采用分支关系模型,以数学概率为基础。这里“分支关系模型”实际是指关系模型,也就是以二维表、行、列来组织数据,基于关系代数和集合论。关系模型最大的优点是概念简单、表达清晰,存取路径对用户透明;缺点是查询效率比不上专门优化的非关系模型,尤其在多表关联的时候。

在这个系统里,关系模型要表达的实体关系很典型:社团由社长建立,一个社长对应一个或多个社团;学生提交申请记录,申请某个社团;管理员管理所有社团和用户;活动、新闻、留言、相册分别挂在社团或用户下。落到逻辑设计上,关键是要把“登录账号”“社长”“管理员”“普通用户”统一在一个身份体系里,通过用户类型区分,而不是给每种身份单独建表。如果给管理员、社长、社员各建一张表,光登录校验就要写三套 DAO,后续扩展新角色也麻烦。

5.2 物理结构:5 张核心表的字段建议

文档在物理结构设计里列出了 5 张表,分别是社团申请信息(applysid)、网站新闻(articleid)、留言信息(bbsid)、社团信息(cinfoid)、活动信息(activityid)。括号内可以作为主键字段名延续使用,我按这个命名给了每张表的建议字段。

社团申请信息 applysid:

字段类型说明
applysidint identity申请编号,主键
user_accountvarchar(30)申请人登录账号
club_namevarchar(50)申请加入的社团名称
apply_timedatetime申请时间
audit_statustinyint0 待审核、1 通过、2 驳回
remarkvarchar(200)备注

网站新闻 articleid:

字段类型说明
articleidint identity新闻编号,主键
titlevarchar(100)标题
contenttext正文
publishervarchar(30)发布人账号
publish_timedatetime发布时间
categoryvarchar(20)新闻或制度分类

留言信息 bbsid:

字段类型说明
bbsidint identity留言编号,主键
user_accountvarchar(30)留言人账号
contentvarchar(500)留言内容
replyvarchar(500)管理员回复
create_timedatetime留言时间

社团信息 cinfoid:

字段类型说明
cinfoidint identity社团编号,主键
club_namevarchar(50)社团名称
club_typevarchar(20)社团类型
foundervarchar(30)社长账号
establish_timedatetime建立时间
descriptionvarchar(1000)社团简介

活动信息 activityid:

字段类型说明
activityidint identity活动编号,主键
club_namevarchar(50)所属社团名称
activity_titlevarchar(100)活动标题
locationvarchar(100)活动地点
activity_timedatetime活动时间
contenttext活动内容
statustinyint0 待审核、1 已发布、2 已结束

这些字段是对文档物理结构的补全,考虑到文档只给了主键标识,字段设计部分我按这类社团系统最常见的信息维度来补。实际建库时可以根据需求说明书再增删。

5.3 高频坑排查记录:现象、原因、解决三步走

第一坑:新增数据时编号字段被手动填写。现象是管理员在表单里看到“编号”输入框,填了编号提交后报主键冲突或重复。原因是没有把编号设计成数据库自增主键,页面渲染出来了本不该出现的字段。解决方法是建表时给编号字段加 identity(1,1),JSP 表单不渲染编号,服务端忽略任何传入的编号参数。

第二坑:修改数据后前端显示的还是旧值。现象是后台修改社团信息成功,前台页面没有更新。原因是浏览器缓存或查询没有重新查库,也可能事务没提交就关闭了连接。解决方法是修改操作后用重定向跳回列表页而不是转发,JSP 列表查询每次都从 DAO 取最新数据,同时确认事务在 commit 后再 close。

第三坑:删除重要社团信息后无法恢复。现象是误删了活动记录,连参与记录也没了。原因是删除用了物理 DELETE,没有做逻辑删除。解决办法是给相关表增加 delete_flag 字段,删除操作执行 UPDATE 而不是 DELETE,列表查询默认过滤 delete_flag=0。

第四坑:JDBC 连接报“不支持此服务器版本”。现象是启动 Tomcat 后第一次查询就抛 SQLServerException。原因是驱动版本与 SQL Server 2008 不匹配,或者 JDBC URL 里端口和数据库名写错。解决方法是换用 sqljdbc4.jar,确认 URL 为 jdbc:sqlserver://localhost:1433;DatabaseName=club_platform,SQL Server 的 TCP/IP 协议要在服务端开启。

第五坑:社长能删其他社团的活动。现象是两名社长登录后都能在活动列表里看到全部社团的记录。原因是列表查询没有按 club_id 过滤数据归属。解决方法是社长登录后把 club_id 存入 session,所有业务查询都带上 club_id 条件,删除和修改操作在 DAO 层再做一次归属校验。

6. 从概要设计落地建表脚本:三个值得保留的习惯

把概要设计变成建表脚本是体力活,靠的不是临场发挥,而是几个固定习惯。第一个习惯是先把角色字段和归属字段定死:用户表必须有用户类型,业务表必须有 club_id,否则权限判断一改再改。第二个习惯是编号字段全部用 identity 自增,让数据库保证唯一,应用层只做业务校验。第三个习惯是时间字段统一用 datetime,状态字段用 tinyint,并提前约定每一档数值的含义。

以用户表为例,按 SQL Server 2008 语法可以这样建:

USE club_platform; GO CREATE TABLE dbo.UserInfo ( userid INT IDENTITY(1,1) PRIMARY KEY, login_account VARCHAR(30) NOT NULL UNIQUE, login_password VARCHAR(64) NOT NULL, user_type TINYINT NOT NULL DEFAULT 3, -- 1管理员 2社长 3社员 real_name VARCHAR(30) NULL, club_id INT NULL, delete_flag TINYINT NOT NULL DEFAULT 0, create_time DATETIME NOT NULL DEFAULT GETDATE() ); GO

这段脚本把三类角色统一在 user_type 字段里,管理员不需要挂社团编号,社长和社员用 club_id 绑定归属。login_account 加唯一约束防止重复注册,delete_flag 为逻辑删除留了后路。社团表和活动表用同样的思路建,外键关联 club_id 或 founder,不要把业务归属全部压到一张表上。

从那以后,我每次拿到设计文档都会先做两张纸:角色功能矩阵一页,数据表清单一页。前者用来对权限方法,后者用来对主键、外键和归属字段。两张纸填完再动工建库,返工率低很多。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表