答题玩家——项目系统设计与数据库设计

答题玩家团队账号 2025-10-20 16:28:29
这个作业属于哪个课程2501_CS_SE_FZU
这个作业要求在哪里团队作业——概要设计和数据库设计
这个作业的目标完成项目系统设计和数据库设计
其他参考文献《构建之法》

目录

  • 一、相关链接
  • 二、系统与数据库设计
  • 1.体系结构设计
  • 2.功能模块层次图
  • 3.ER分析
  • 4.表结构设计
  • 三、类图、系统安全和权限设计
  • 1.设计类图
  • 2.系统安全
  • 3.权限设计
  • 四、改进分析
  • 五、团队绩效考核标准
  • 1、工作流程
  • 2. 组员分工

一、相关链接

GitCode团队
系统设计说明书
数据库设计说明书
系统设计和数据库设计答辩PPT

二、系统与数据库设计

1.体系结构设计

设计思路: 系统采用前后端分离架构,微信小程序作为前端,通过API网关调用后端服务。后端基于微服务思想,将用户、题目、数据等核心功能模块化,实现解耦与独立部署。通过MySQL持久化数据,Redis提升缓存性能,确保系统高内聚、低耦合,便于扩展与维护。

img

2.功能模块层次图

设计思路:本项目围绕用户答题、错题管理、收藏管理展开。用户从授权登录开始,完成答题后系统验证答案并记录错题。用户可随时进入错题集查看、重做错题,或将其标记为“已掌握”以更新学习状态,并且也可以通过收藏夹进入收藏查看收藏题目。流程闭环设计确保了学习数据的有效追踪与个性化复习。

img

3.ER分析

设计思路:数据库设计围绕核心学习实体展开,包括题目、用户、练习记录、错题、收藏及社交关系。通过规范化表结构,明确各实体字段与关联关系,确保用户学习行为、答题数据、错题状态及社交互动等关键信息被完整、一致地记录与追踪,为系统功能实现提供可靠数据支撑。

img

4.表结构设计

设计思路:数据库表结构围绕用户学习全流程设计,以用户表为核心,通过题目、练习、错题、收藏等表记录学习行为。采用自增主键确保唯一性,通过外键关联维持数据一致性,利用ENUM类型规范字段取值,并设置时间戳追踪数据生命周期,形成完整的学习数据闭环。

用户表

字段名数据类型约束描述
USECLUGBIGINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY用户唯一ID,自增主键,用于唯一标识每一个用户
QDEDUGVARCHAR(128)NOT NULL, UNIQUE KEY微信用户唯一标识,用于第三方登录,保证用户唯一性
nicknameVARCHAR(255)DEFAULT ''用户昵称,支持多语言及表情符号(如emoji),默认为空字符串
avatar_urlVARCHAR(512)DEFAULT ''用户头像的URL地址,指向用户头像图片的网络链接,默认为空字符串
consecutive_daysINT UNSIGNEDDEFAULT 0用户连续使用/登录的天数,无符号整型,初始值为0
total_questions_answeredINT UNSIGNEDDEFAULT 0用户累计回答过的题目总数,无符号整型,初始值为0
correct_questionsINT UNSIGNEDDEFAULT 0用户累计答对的题目数量,无符号整型,初始值为0
scoreINT UNSIGNEDDEFAULT 0用户总积分或总得分,无符号整型,初始值为0
rankINT UNSIGNEDDEFAULT 999用户排名,无符号整型,初始值为999
created_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP记录的创建时间,自动设置为当前时间

题库分类表

字段名数据类型约束描述
category_idINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY分类唯一ID,自增主键,用于唯一标识每一个分类
nameVARCHAR(100)NOT NULL分类名称,如"数学"、"英语"等,必填项
sort_orderINT UNSIGNEDDEFAULT 0分类的排序权重,数值越小排序越靠前,默认为0
created_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP分类记录的创建时间,自动设置为当前时间

题库表

字段名数据类型约束描述
bank_idINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY题库唯一ID,自增主键,用于唯一标识每一个题库
category_idINT UNSIGNEDNOT NULL所属分类ID,关联category表,表示该题库属于哪一个分类
nameVARCHAR(255)NOT NULL题库名称,如"小学数学总复习"、"历年真题精选"等,必填项
descriptionTEXT-题库的详细描述,可以是题库的内容简介、适用人群、出题范围等,长文本类型
created_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP题库记录的创建时间,自动设置为当前时间
updated_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP题库记录的最后更新时间,每次更新时间更新为当前时间

题目表

字段名数据类型约束描述
question_idBIGINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY题目唯一ID,自增主键,用于唯一标识每一道题目
bank_idINT UNSIGNEDNOT NULL所属题库ID,关联question_bank表,表示该题目属于哪个题库
question_typeENUM('SINGLE','MULTIPLE','TRUE_FALSE','FILL_IN')NOT NULL题目类型:
• SINGLE:单选题
• MULTIPLE:多选题
• TRUE_FALSE:判断题
• FILL_IN:填空题
contentTEXTNOT NULL题目内容/题干,即题目要展示给用户看的主要文本,必填
optionsJSON-题目选项,以JSON格式存储,适用于选择题,非选择题可为空
correct_answerVARCHAR(255)NOT NULL正确答案:
• 单选题:"A"
• 多选题:"A,C"
• 判断题:"T"或"F"
• 填空题:具体答案
analysisTEXT-答案解析,用于向用户解释为什么该答案是正确的,可为空
difficultyTINYINT UNSIGNEDDEFAULT 3题目难度等级,范围1~5,数字越大越难,默认3(中等难度)
created_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP记录的创建时间,自动设置为当前时间
updated_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP记录的最后更新时间,每次更新时自动更新为当前时间

练习记录表

字段名数据类型约束描述
record_idBIGINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY练习记录唯一ID,自增主键,用于唯一标识每一次练习行为
user_idBIGINT UNSIGNEDNOT NULL用户ID,关联user表,表示本次练习是由哪个用户完成的
practice_typeENUM('SEQUENTIAL','EXAM','SPECIALIZED','WRONG_REDO')NOT NULL练习类型:
• SEQUENTIAL:顺序练习
• EXAM:模拟考试
• SPECIALIZED:专项训练
• WRONG_REDO:错题重做
bank_idINT UNSIGNED-(可为NULL)关联的题库ID,表示本次练习来源于哪个题库,专项练习或顺序练习可能关联具体题库
scoreINT UNSIGNED-(可为NULL)用户本次练习的得分,允许为空(练习未完成时可能暂无得分)
total_questionsINT UNSIGNEDNOT NULL本次练习的总题数,即用户一共做了多少道题,必填
correct_countINT UNSIGNEDNOT NULL用户答对的题数,用于计算正确率,必填
start_timeTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP练习的开始时间,自动记录为当前时间
end_timeTIMESTAMP-(可为NULL)练习的结束时间,用户完成练习时记录,未完成则为NULL

好友表

字段名数据类型约束描述
idBIGINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY好友关系记录的唯一ID,自增主键
user_idBIGINT UNSIGNEDNOT NULL用户ID(发起好友请求或添加好友的用户),关联user表
friend_idBIGINT UNSIGNEDNOT NULL好友的用户ID(被添加的用户),关联user表
relation_typeENUM('BOTH','FOLLOW')NOT NULL, DEFAULT 'BOTH'好友关系类型:
• 'BOTH':双向好友(互相添加)
• 'FOLLOW':单向关注,默认为'BOTH'
statusENUM('NORMAL','REJECTED','BLOCKED')NOT NULL, DEFAULT 'NORMAL'好友状态:
• 'NORMAL':正常
• 'REJECTED':已拒绝/已删除
• 'BLOCKED':拉黑
created_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP好友关系创建时间,自动记录为当前时间
updated_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP好友关系最后更新时间,状态变更时自动更新

错题本表

字段名数据类型约束描述
W0000_idBIGINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY错题记录的唯一ID,自增主键,用于唯一标识每一条错题记录
user_idBIGINT UNSIGNEDNOT NULL用户ID,关联user表,表示这道题是哪个用户答错的
question_idBIGINT UNSIGNEDNOT NULL题目ID,关联question表,表示用户答错的具体是哪一道题目
wrong_countINT UNSIGNEDNOT NULL, DEFAULT 1用户答错该题的次数,初始值为1,每次答错可递增,用于统计错题频率
last_wrong_timeTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP用户最后一次答错该题的时间,自动记录为当前时间,用于分析错题复习时效性
is_masteredBOOLEANNOT NULL, DEFAULT FALSE标记该错题是否已掌握,通常在用户重做该题并答对后更新为true,用于错题本筛选和复习优先级控制
created_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP该错题首次被添加到错题本的时间,自动记录为当前时间,表示用户第一次答错该题的时间
updated_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP记录的最后更新时间,自动更新为当前时间,当错题状态变化、重做正确、计数更新时同步更新

文章表

字段名数据类型约束描述
article_idINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY文章唯一ID,自增主键,用于唯一标识每一篇文章
titleVARCHAR(255)NOT NULL文章标题,展示给用户的主要标题信息,必填项
contentLONGTEXTNOT NULL文章正文内容,支持较长的HTML格式内容(如富文本内容、图文混排等),必填
authorVARCHAR(100)DEFAULT '官方'文章作者,可以是具体人员、团队或系统默认值,默认为"官方"
view_countINT UNSIGNEDDEFAULT 0文章的阅读量/浏览次数,用于统计文章的受欢迎程度或热度,初始值为0
favor_countINT UNSIGNEDDEFAULT 0文章的收藏次数,用于统计文章的受欢迎程度或热度,初始值为0
created_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP文章的发布时间/创建时间,自动记录为当前时间,表示文章首次发布的时间
updated_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP文章的最后更新时间,自动更新为当前时间,例如当文章内容被编辑后自动更新该时间

收藏表

字段名数据类型约束描述
fayoute_idBIGINT UNSIGNEDNOT NULL, AUTO_INCREMENT, PRIMARY KEY收藏记录的唯一ID,自增主键
user_idBIGINT UNSIGNEDNOT NULL收藏的用户ID,关联user表
target_typeENUM('QUESTION','ARTICLE','PRACTICE','OTHER')NOT NULL, DEFAULT 'QUESTION'收藏目标类型:
• 'QUESTION':题目
• 'ARTICLE':文章
• 'PRACTICE':练习记录
• 'OTHER':其他类型
target_idBIGINT UNSIGNEDNOT NULL收藏目标的具体ID,根据target_type关联不同表
created_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP收藏时间,自动记录为当前时间
updated_atTIMESTAMPNOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP收藏记录的最后更新时间,取消收藏后再收藏可更新时间

三、类图、系统安全和权限设计

1.设计类图

设计思路:类设计采用面向对象思想,以User为核心,关联学习行为实体。每个类职责单一,如Question负责题目验证,Quiz管理答题流程,WrongQuestion/Favorite处理学习数据。通过封装属性和方法,实现高内聚低耦合,为业务逻辑提供清晰的领域模型支撑。

img

img

2.系统安全

在JWT Token认证机制方面,系统采用了业界标准的JWT实现方案。通过HS256签名算法确保令牌的完整性和防篡改性,使用固定的密钥"ms_project_secret_key"进行签名验证。令牌设计包含多个关键要素:设置7天的访问令牌有效期和14天的刷新令牌周期,在payload中嵌入用户ID、令牌类型和用户角色信息,实现了无状态的身份认证。这种设计既保证了用户体验的连续性,又通过适当的有效期控制降低了安全风险。

微信登录安全流程体现了标准的OAuth 2.0授权模式。整个流程中,系统通过临时code机制避免了敏感信息的直接传输,服务端与微信服务器的交互确保了身份验证的权威性。特别值得注意的是,系统在完成微信认证后,将其转化为自有的JWT令牌体系,这种设计既利用了第三方认证的便利性,又保持了系统认证体系的独立性。

数据传输安全采用了双重保障机制。全链路HTTPS TLS 1.2+加密确保了数据传输过程中的机密性和完整性,有效防止了中间人攻击。在此基础上增加的API接口请求签名机制,通过验证请求的完整性,有效防范了重放攻击和数据篡改风险。

数据存储安全层面实施了分级保护策略。对敏感个人信息进行脱敏显示,在保证功能正常使用的同时最大限度地保护用户隐私。数据库连接启用SSL/TLS加密,确保数据在应用与数据库之间的传输安全,这种端到端的加密方式构成了完整的数据保护链条。

SQL注入防护采用了主动防御与事后审计相结合的方式。通过SQL关键字过滤和参数转义,从源头阻断注入攻击的可能性。同时,数据库操作日志审计机制的建立,不仅能够追踪异常操作,还为安全事件调查提供了完整的证据链。

Redis缓存配置体现了安全与性能的平衡。系统设置了连接密码认证、数据库分区和连接超时机制,从访问控制层面保障缓存安全。在缓存策略上,针对不同类型数据的特点设计了差异化的生存周期:用户会话信息设置1小时有效期平衡了安全性与用户体验;题目数据24小时的缓存周期兼顾了数据更新频率与系统性能;排行榜数据5分钟的短暂缓存确保了数据的实时性。

缓存键设计规范采用了清晰的命名空间策略。通过"业务:类型:标识符"的三级结构,实现了数据的良好组织和隔离。这种设计不仅避免了键名冲突,还便于缓存的统一管理和监控,为后续的性能优化和安全审计奠定了基础。

安全日志记录建立了完整的日志体系。系统设置了分级日志通道,特别单独设立安全审计日志,凸显了对安全事件的重点关注。日志策略配置合理,单个文件500MB的大小限制、28天的保留期和3个备份文件的设置,既保证了日志的完整性,又避免了存储空间的无限增长。

安全监控指标覆盖了系统安全的关键维度。登录失败频率监控能够及时发现暴力破解尝试;API调用异常监控有助于识别恶意攻击行为;系统资源安全监控确保了基础设施的稳定运行。这些监控指标共同构成了安全态势感知的基础,为主动安全防御提供了数据支撑。

3.权限设计

系统采用标准的RBAC模型,通过自定义注解@RequirePermission实现了方法级别的权限控制。该注解设计灵活,支持权限值的自定义设置,并通过logical参数支持权限验证的逻辑组合(AND或OR),为复杂的权限判断提供了扩展性。

在技术实现层面,注解通过@Target(ElementType.METHOD)限定在方法级别使用,确保权限控制的精确性。配合AOP技术或拦截器机制,系统能够在方法执行前自动进行权限验证,这种声明式的权限控制方式大大简化了代码的复杂度,提高了开发效率。

QuestionController中的查询接口通过@RequirePermission("question:read")注解,明确要求用户必须具备题目读取权限;而创建题目接口通过@RequirePermission("question:write")注解,限制只有具备写权限的用户才能执行该操作。这种细粒度的权限控制有效防止了越权访问。

系统设计了清晰的四级角色体系,每类角色都有明确的功能边界:
普通用户作为基础角色,专注于个人学习功能,包括答题练习、题目收藏、错题管理和基础统计查看。这种设计保证了大多数用户能够获得完整的学习体验,同时将系统管理功能有效隔离。
VIP用户在普通用户权限基础上,增加了专项练习、高级数据统计和优先服务等增值功能。这种层级化的权限设计既体现了服务的差异化,也为商业化运营提供了基础。
内容管理员专注于题目内容管理,拥有题目的增删改查权限、分类管理能力和内容审核职责。这种专业化的角色划分确保了系统内容的质量和规范性。
系统管理员作为最高权限角色,负责用户管理、全局数据统计和系统配置维护,具备系统的全方位管理能力。

该权限设计体现了"最小权限原则",每个角色仅被授予完成其职责所必需的最小权限范围,有效降低了安全风险。权限分配基于角色而非具体用户,大大简化了权限管理工作,当需要调整权限时,只需修改角色权限配置即可影响所有该角色的用户。

系统通过权限注解实现了权限控制与业务逻辑的分离,提高了代码的可维护性。开发者只需关注业务逻辑实现,而无需在每个方法中重复编写权限验证代码,这种设计符合软件工程的"关注点分离"原则。

四、改进分析

Q:是否包含修改问题?

A:抱歉,之前的忽略了修改问题、添加文章等管理员界面功能,所以这次作业补充了管理员的类图。

五、团队绩效考核标准

1、工作流程

  • 首先通过线上的交流分配任务,将作业分成系统设计模块、数据库设计模块、ppt制作、博客撰写四个方向进行。
  • 按照分工完成任务,有问题在群里提出来。
  • 进行小组对接,有问题进行解决。
  • 最后进行博客和ppt任务。

2. 组员分工

学号分工内容贡献度
102300208博客撰写12.5%
102300209系统设计说明书12.5%
102300224系统设计说明书12.5%
102300222数据库设计说明书12.5%
102300120ppt制作、汇报12.5%
102300116系统设计说明书12.5%
102300129ppt制作12.5%
102300113数据库设计说明书12.5%
...全文
179 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

103

社区成员

发帖
与我相关
我的任务
社区描述
2501_CS_SE_FZU
软件工程 高校
社区管理员
  • FZU_SE_LQF
  • 木村修
  • 心态773
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧