成员:刘小兵(D23381007),周帆(D23382401),王宇霄(M23380804),季行(M23380808),熊丰(D23382405),项耀东(M23380803)
一、软件开发计划:
开发计划如图所示:
“飞花令”软件开发计划表 | ||||||
阶段 | 主要工作 | 应完成的文档 | 计划起始时间 | 计划结束时间 | 实际起始时间 | 实际结束时间 |
需求分析 | 确定系统运行环境 | 10.21 | 10.31 | 10.21 | 10.31 | |
建立系统逻辑模型 | 10.21 | 10.31 | 10.21 | 10.31 | ||
确定系统功能及性能要求 | 10.21 | 10.31 | 10.21 | 10.31 | ||
编写需求规格说明、用户手册概要、测试计划 | 10.21 | 10.31 | 10.21 | 10.31 | ||
确认项目开发计划 | 10.21 | 10.31 | 10.21 | 10.31 | ||
学习网页编程语言 | 学习编程代码 | 10.31 | 12.9 | 10.31 | 12.8 | |
概要设计 | 建立系统总体结构,划分功能模块 | 11.13 | 11.16 | 11.13 | 11.25 | |
定义各功能模块接口 | 11.13 | 11.16 | 11.13 | 11.25 | ||
数据库设计 | 11.13 | 11.16 | 11.13 | 11.25 | ||
制定组装测试计划 | 11.13 | 11.16 | 11.13 | 11.25 | ||
详细设计 | 设计各模块具体实现算法 | 11.16 | 11.19 | 11.16 | 11.29 | |
确定模块间详细接口 | 11.16 | 11.19 | 11.16 | 11.29 | ||
制定模块测试方案 | 11.16 | 11.19 | 11.16 | 11.29 | ||
实现 | 编写程序源代码 | 11.19 | 11.30 | 11.19 | 11.29 | |
进行模块测试和调试 | 11.19 | 11.30 | 11.19 | 11.29 | ||
效果测试 | 测试整体效果 | 11.30 | 12.3 | 11.30 | 12.4 | |
上线 | 上线 | 12.3 | 12.3 | 12.3 | 12.4 | |
维护与更新 | 网页维护 | 12.3 | 12.10 | 12.3 | 12.9 |
二、软件设计
1、系统UML建模
答题活动图
对战模块
诗词库管理
用户管理模块
注册系统活动图
系统整体视图
系统接口图
2、系统构建图
系统构件图
3、数据设计
飞花令数据库建模:
在创建飞花令网站的数据库模型时,我们考虑以下几个主要的组成部分:
- 用户信息:这包括用户的用户名、密码等基本信息。这些信息用于创建和验证用户账户。
- 诗词信息:数据库包含所有可能的诗词,这是飞花令游戏的核心。诗词信息包括诗词的作者、标题、内容等。
- 游戏记录:为了跟踪和管理游戏,需要保存每场比赛的详细记录,包括参与玩家、比赛主题、开始和结束时间等。
- 用户活动:为了提供个性化体验和统计数据,需要记录用户的活动,比如用户玩的游戏、赢得的比赛、发表的评论等。
基于以上需求,我们设计以下的数据库表:
用户表 (Users)
- id (主键)
- username
- password
- 其他用户相关信息
诗词表 (Poems)
- id (主键)
- author
- title
- content
- 其他诗词相关信息
游戏记录表 (GameRecords)
- id (主键)
- user_id (外键,关联到Users表的id)
- poem_id (外键,关联到Poems表的id)
- start_time
- end_time
- game_status (游戏状态,例如:进行中、已结束等)
- 其他游戏记录相关信息
用户活动表 (UserActivities)
- id (主键)
- user_id (外键,关联到Users表的id)
- activity_type (活动类型,例如:玩游戏、赢得比赛、发表评论等)
- activity_detail (活动详情)
- activity_time (活动时间)
- 其他用户活动相关信息
数据库截图
三、代码实现
1、部分功能代码
public function findts()
{
$num = db('ts')->count();
$random = rand(0, $num);
for ($i = 1; $i <= $num; $i++)
{
$data = db('ts')->where('id', $random)->find();
if ($data)
{
break;
}
}
$data['contents'] = str_replace(',', '-', $data['contents']);
$data['contents'] = str_replace(',', '-', $data['contents']);
$data['contents'] = str_replace('。', '-', $data['contents']);
$data['contents'] = str_replace('!', '-', $data['contents']);
$data['contents'] = str_replace('!', '-', $data['contents']);
$data['contents'] = str_replace('.', '-', $data['contents']);
$data['contents'] = str_replace('?', '-', $data['contents']);
$data['contents'] = str_replace('?', '-', $data['contents']);
$data['contents'] = explode('-', $data['contents']);
$this->success('成功', $data);
}
这段代码的作用是从数据库中随机获取一条数据,并将其中的标点符号替换成短横线,最后将内容以短横线为分隔符拆分成一个数组,然后返回给调用者。具体实现过程是先获取数据库中数据的总数,然后随机生成一个数字作为查询条件,循环查询直到找到符合条件的数据为止。最后将内容进行替换和拆分,返回给调用者。
public function subject()
{
$num = db('ts')->count();
$random = rand(0, $num);
for ($i = 1; $i <= $num; $i++)
{
$data = db('ts')->where('id', $random)->find();
if ($data)
{
break;
}
}
$data['contents'] = str_replace(',', '-', $data['contents']);
$data['contents'] = str_replace(',', '-', $data['contents']);
$data['contents'] = str_replace('。', '-', $data['contents']);
$data['contents'] = str_replace('!', '-', $data['contents']);
$data['contents'] = str_replace('!', '-', $data['contents']);
$data['contents'] = str_replace('.', '-', $data['contents']);
$data['contents'] = str_replace('?', '-', $data['contents']);
$data['contents'] = str_replace('?', '-', $data['contents']);
$contentsArr = explode('-', $data['contents']);
$contentsArr = array_slice($contentsArr, 0, count($contentsArr) - 1);
$item = $contentsArr[rand(0, count($contentsArr) - 1)]; //随机第几个数组
$word = mb_substr($item, rand(0, mb_strlen($item)), 1);
$searchForPoems = db('ts')->where('contents', 'like', '%'.$word.'%')->column('contents'); //搜索诗句
$accordWithArr = [];
foreach ($searchForPoems as $value)
{
$value = str_replace(',', '-', $value);
$value = str_replace(',', '-', $value);
$value = str_replace('。', '-', $value);
$value = str_replace('!', '-', $value);
$value = str_replace('!', '-', $value);
$value = str_replace('.', '-', $value);
$value = str_replace('?', '-', $value);
$value = str_replace('?', '-', $value);
$contentsArr = explode('-', $value);
if (empty($word))
{
$this->subject();
return;
}
foreach ($contentsArr as $valueA)
{
try
{
if (mb_strpos($valueA, $word))
{
array_push($accordWithArr, $valueA);
}
}
catch (Exception $e)
{
var_dump($word);
}
}
}
$data = [
'word' => $word,
'list' => $accordWithArr
];
$this->success('成功', $data);
}
这段代码的作用是从数据库中随机选择一条记录,然后将该记录的内容进行处理,将其中的逗号、句号、感叹号、问号等标点符号替换为短横线,并将处理后的内容按照短横线进行分割,随机选择其中的一个元素,并随机选择该元素中的一个字,然后在数据库中搜索包含该字的诗句,并将搜索结果返回。如果搜索结果为空,则重新执行该函数。
public function savePoints()
{
$user_id = $this->auth->id;
$fraction = $this->request->post('fraction');
$data = db('fraction_log')->insert(['user_id' => $user_id, 'fraction' => $fraction, 'createtime' => time()]);
if ($data)
{
$data = db('fraction')->where('user_id', $user_id)->find();
if ($data && $data['fraction'] < $fraction)
{
db('fraction')->where('id', $data['id'])->update(['fraction' => $fraction, 'createtime' => time()]);
$this->success('更新成功');
}
if ($data && $data['fraction'] >= $fraction)
{
$this->success('保存成功');
}
if (!$data)
{
db('fraction')->insert(['user_id' => $user_id, 'fraction' => $fraction, 'createtime' => time()]);
$this->success('添加成功');
}
}
else
{
$this->error('添加失败');
}
}
这段代码的作用是将用户的分数保存到数据库中。具体来说,它首先获取用户ID和分数,然后将它们插入到名为fraction_log
的数据库表中。接下来,它检查名为fraction
的另一个数据库表中是否已经存在该用户的记录。如果存在,则更新该记录的分数和创建时间。如果该记录的分数小于新分数,则更新分数并返回“更新成功”消息。如果该记录的分数大于或等于新分数,则返回“保存成功”消息。如果该用户在fraction
表中没有记录,则将其插入到该表中,并返回“添加成功”消息。如果插入操作失败,则返回“添加失败”消息。
2、代码实现流程
1、启动小皮
2、新建网址,同时也连接数据库root并配置
3、npm run serve运行
4、视频演示:
202312091919
参考资料: 如何搞懂html+php实现个人博客网站?【附代码详解】毕业设计 大作业项目_毕业设计 html php-CSDN博客
html+css+php+mysql 简单的页面登录与注册(数据库的交互)_html+css+php+mysql实现注册+登录-CSDN博客
四、项目过程管理与记录
——完成计划见第一部分。
——代码仓库地址:industrious_coder/feihua
——用户手册:进入本地网页之后,看到欢迎登陆的界面,玩家可输入自己的用户名并设置密码,系统会根据玩家输入的账号进入页面。
当玩家正确输入账号密码之后,会进入页面如下,可以看见系统提供的五个选项。
基本功能是飞花令大挑战并在此基础上添加了其他需求,玩家只需要点击飞花令大挑战,系统会自动给出问题,玩家只需要在弹出的文本框中输入相关要求的诗句。
当按照要求输入相关的诗句点击确定,系统会给出你赢了,并显示积分。当玩家不输入或者答题错误,系统会给出你输了的示,并且不会积分,直到回答正确。
点击退出,回到主页面,玩家可以将诗词库中的没有的诗词进行补充,如下图点击词汇补充,即可以进入补充界面,会出现页面如下。
录入新的诗词,可以将诗词的详细信息进行录入,玩家可以将诗词进行补充,分成类别,题目,作者和诗词内容进行补充,按照基本要求完成对输入框的输入,输入完成后点击确定就可,会提示添加成功
点击古诗鉴赏,页面会弹出古诗词,玩家点击下方图标就可以随机切换古诗,如果玩家不点击任何部分,页面就会一直保持在这首古诗,由于该诗词库是建立数据库的基础上,玩家可以鉴赏诗词库里面的任何一首古诗。
每个玩家进行输入账号进行对战,系统会记录每个玩家的成绩,并在排行榜中显示所有的积分,玩家点击排行榜就可以查看自己的排名和分数。
玩家点击退出登陆,即可回到账号输入页面。
——各成员贡献度:
姓名 | 分工 | 完成情况 | 贡献度 | |||||
周帆 | 飞花令构件系统与飞花令数据库建模 | 80% | 1/6 | |||||
刘小兵 | 飞花令系统结构框图和接口图 | 80% | 1/6 | |||||
熊丰 | 飞花令网页系统的 UML 建模 | 80% | 1/6 | |||||
季行 | 根据系统的相关要求搭网页页面 | 80% | 1/6 | |||||
王宇霄 | 飞花令答题逻辑编程 | 80% | 1/6 | |||||
项耀东 | 飞花令网页系统HTML编程 | 80% | 1/6 |
Issue中里程碑
Gitee签入代码记录
Gitee代码变化示意图
——各成员的具体工作:
刘小兵:我的具体工作时负责飞花令系统结构框图和接口图,总共花费8小时,设计系统结构框图和接口图是团队合作项目中非常重要的一部分,以下是我在设计完成过程中遇到的主要问题:
1.理解需求:我会仔细阅读项目需求文档,与团队成员进行讨论,确保对系统功能和性能需求有清晰的理解。2.根据需求:我会确定系统的各个模块,包括功能模块、数据模块等,以及它们之间的关系。3.绘制结构框图:我会使用 UML 或其他适合的工具,绘制系统的结构框图,包括模块之间的关系、依赖关系、数据流向等,以便整体把握系统的结构。4.确定接口:在结构框图的基础上,我会确定各个模块之间的接口,包括函数接口、数据接口等,确保模块之间的交互清晰明了。5.优化和修改:根据团队成员的反馈,我会对设计进行优化和修改,确保系统结构框图和接口图满足需求,并且易于理解和实现。6.文档优化:最后,我会对设计过程进行文档化,包括结构框图、接口图以及相应的说明文档,以便团队其他成员能够理解和参考。通过这样的设计过程,我可以确保系统结构框图和接口图清晰明了,有利于团队成员之间的协作和沟通,也有利于后续的系统实现和测试工作。
周帆:我的具体工作时负责飞花令构件系统与飞花令数据库建模,总共花费6小时,在制作过程中主要遇到的问题有:1.数据一致性问题:在构建数据库模型时,确保数据的一致性是非常重要的。这意味着确保数据的准确性和完整性,以及在多个数据库之间保持数据的一致性。2.扩展性问题:随着业务的发展,系统可能需要扩展到更多的数据和更多的用户。因此,在设计数据库模型时,需要考虑如何方便地进行扩展。3.兼容性问题:不同的数据库系统可能具有不同的语法和功能,因此在设计数据库模型时需要考虑与不同数据库系统的兼容性,以便能够适应不同的系统和需求。
熊丰:我的具体工作涉及设计飞花令网页系统的 UML 建模。基于功能要求,创建用例图以展示系统的各个功能模块和用户与系统之间的交互。总共花了10个小时。遇到的问题:1 使用 UML 工具可能需要一些时间来熟悉,确保能够充分利用工具的功能;2 飞花令系统涵盖了多个模块和复杂的功能需求;3 确保系统中各个模块的设计保持一致性,以便整个系统能够协同工作。
王宇霄:我的具体工作时负责飞花令答题逻辑编程,总共花费30个小时,在编程的过程中主要遇到的问题是:1、确定主题字,人机识别并在数据库中查找。2、创建数据列表,用于存储参与游戏的玩家名称或编号。3、游戏胜负设计,如在游戏开始后,进入一个循环,每个玩家依次说出含有主题字的诗句,并存储在数据库中。如果玩家或人机说出的诗句重复,则玩家或人机被淘汰。4、检查诗句重复的问题:在玩家说出诗句后,通过搜索诗句字典,检查是否有重复的诗句。如果有重复,则淘汰玩家。5、设计人机答题时间和答题正确率的问题。
季行:我的具体工作是根据系统的相关要求搭网页页面,同时设计页面的基本框架,实现几个模块的正常使用,查找gitee和github上的相关的飞花令功能基本代码,并尝试调用,完善和美化网址的页面,根据搭建的基本模型思路编写相关的php代码,使用数据库编写相关代码,保证基本页面功能正常工作,同时研究相关的功能之间的库函数的调用,整合相关模块,最后将十条需求进行测试,将各个模块的基本串口和链接进行调试,将相关展示过程整理成文档,将编写的代码上传至码云,最后参与博客的编写。
项耀东:我的具体工作是查找HTML,CSS与JS相关资料,并尝试修改例程实现飞花令的页面布局与交互界面。遇到的主要问题有:1、布局突然很混乱;2、表格嵌套时将外层的表格撑大;3、所设的属性值不起作用;4、页面的上边总是留出一段空白等等。
——项目改善计划:在软件工程项目中,开发进度缓慢的问题通常是由于多种因素导致的。为了改善这种情况,我们可以从流程、方法和工具三个方面进行优化和改进。
一、流程方面
1、明确项目目标和范围
在项目开始之前,团队需要充分了解项目的目标和范围,确保所有的工作都围绕这个核心展开。这可以避免在开发过程中出现偏离目标的情况,确保项目能够顺利推进。
2、制定详细的计划和时间表
在明确了项目目标和范围后,需要制定详细的计划和时间表,包括任务分配、时间节点、里程碑等。这有助于团队成员明确自己的任务和责任,并能够及时掌握项目进度。
3、建立有效的沟通机制
团队成员之间需要建立有效的沟通机制,包括定期会议、进度报告等。这可以帮助团队成员了解项目的进展情况,及时解决问题,确保项目能够顺利进行。
4、引入敏捷开发方法
敏捷开发方法可以帮助团队更好地应对需求变化和不确定性,提高项目的灵活性和效率。通过短周期的迭代开发,可以及时发现和解决问题,确保项目能够按时完成。
二、方法方面
1、优化代码结构
优化代码结构可以提高程序的效率和性能,减少开发时间和工作量。团队成员在进行飞花令编程时要不断学习和掌握优秀的编程技巧和算法知识,以提高自身的编码能力和效率。
2、采用模块化和组件化开发
模块化和组件化开发可以将飞花令的软件程序分解为独立的每个模块,降低系统的复杂度和耦合度,提高代码的可维护性和可重用性。这可以减少开发时间和工作量,提高开发效率。
3、实施测试驱动开发
测试驱动开发可以提高代码的质量和可维护性,降低代码的缺陷率和修改成本。通过单元测试和集成测试,可以及时发现和解决问题,确保程序的正确性和稳定性。
三、工具方面
4、选择高效的开发工具和平台
选择高效的开发工具和平台可以提高团队的效率和生产力,减少开发时间和工作量。例如,选择优秀的集成开发环境gitee可以提高团队的协作效率和代码质量。
5、利用工具进行自动化管理
利用工具进行自动化管理可以提高团队的效率和准确性,减少人工错误和沟通成本。例如,利用自动化测试工具等,可以及时发现和解决问题,确保程序的正确性和稳定性。
6、使用工具进行代码审查和质量控制
使用工具进行代码审查和质量控制可以提高代码的质量和可维护性,降低代码的缺陷率和修改成本。例如,使用代码分析工具、单元测试工具等,可以及时发现和解决问题,确保程序的正确性和稳定性。
通过以上规划可以有效地提高软件工程项目的开发进度和质量。提高团队协作效率、减少错误率,在较短时间内完成高效任务。
五、项目中软件工程的体现
系统开发方法提供完成系统开发生命周期每一步的详细指导,包括具体的模型、工具、技术。系统开发方法呈现出来就是一些文档,这些文档规定了在项目开发过程中具体要做的工作。例如,项目开发遵循的过程、如何建立需求和设计模型,如何书写文档等等。在本次大作业中,使用了gitee进行代码开发与管理,有必要的部分可以搭配文档。Gitee 为了协助用户提高代码质量,进行完善的代码审查,推出了代码质量分析工具 Gitee Scan ,依托于 Gitee 企业版的现有功能,Gitee Scan 能够通过扫描仓库内的代码,帮助开发团队找出其中的问题,尤其是一些不需要人工审查的低质量错误,帮助团队进行代码审查,从而提高代码质量。
六、个人总结作业
项耀东:软件工程学习心得-CSDN博客
季行: 软件工程心得体会-CSDN博客
七、其他任务
1、慕课学习:
2、梦断代码:
在这本书中,作者向人们讲述了一个基于软件开发的过程,在全书中,这么一句话,他提出问题,讲述问题,作者并没有直接的给出每个问题的标准答案,甚至都没有加入自己的一点倾向,就完全站在一个中立者的角度来讲述这个故事,这本书并的优势就是并不仅仅是讲述一个故事,同时引起人们的思考。
这本书以一条主线描述Chandler项目的故事,不断从项目的各种现象中挖掘软件开发中的各种问题,并旁征博引其他项目的故事,罗列大家对问题的各种观点和方法,但是几乎所有提到的问题直到今天都没有明确的结论,比如卡普尔和卡兹维尔的对赌:在这些对赌的背后,也就是所有问题的根本,软件开发是否有一个合适的方法论,在书中,作者将软件开发工程师称为是一个艺术家,开发一个完美的软件几乎是不可能得,一个完美得项目需要的是进行时间得检测,针对软件开发这个过程中,这本书中并没有给出答案,虽然书中给出了各种各样的细节问题。在这本书中,提出的问题和冲突数不胜数,。从项目管理到软件开发设计,在书中只给出模糊的建议,将前人的经验进行总结,以经验性主导,在这个过程中估算工期。从代码实到项目形态千奇百怪。
花了几个小时读完这本书,感触挺多思考也很多,虽然我不是计算机的学生,但是接触到这个软件开发这门课程,对于代码的了解只能说是九牛一毛,但是在平时的学习中,会接触基本的代码编写,在这个过程中对于整个编程的编写是什么重要的,在这个过程中我看到了我推崇的开源技术的脆弱,我看到了软件工程的重要和繁杂,我看到了软件工程开发的繁琐性。
一个开源的项目,一个在大教堂模式的开源项目,怎么样取得成功,怎样才能避免失败。
一开始他们只有一个想法,想建立一个各个平台都可以使用的时间管理软件,他们没有规格,他们确定技术和方向,他们没有确定人员,他们和规格设计,他们测试,他们没有里程碑,他们没有确定开发模型,他们只有各种各样的美好的愿景,纵使他们是天才,也一样要面临失败。在这篇文章中,现在回头看看他们的想法,他们选择了python这本来就是不错的选择,可是他们没有中居然没有一个人熟悉python这门语言!什么语言并不重要,重要的是你的项目组里面是否有人特别熟悉这么技术,如果有,有多少人,对于团队中的具体人员的水平没有明确的认识,如果一开始就选对人,那么就不会有那么多问题了,如果一开始就根据愿景确立里程碑并进行明确分工,确定开发模型,比如说原型演化模型,如果建立了规格说明,建立编码规范,有自己的一套测试体系,而不是一昧地想搞出个超过outlook和exchange的软件,这个项目还会不会失败。
如果成功,他们怎么盈利?当然,十分可惜我们看不到,整个项目的结果最后以失败告终,前段时间看到一则报道说有的企业说再穷也不上开源的ERP,感到很不解,现在终于明白了。支持,那么优秀的软件,缺乏支持,用户多了,怎么办,要知道软件最后就是为了服务其他行业,就是为了让那些普通的,不懂计算机的人也会知道使用。
开源世界那么多优秀的语言,产品,框架,如果没有产商的支持,仅仅靠着几个开发者的热情,他们的使用空间,产品的寿命,在哪里呢?有多少商家采用wxwidget的。开源技术的强大生产力和商家结合起来才能产生更加巨大的威力,python之于gogole,java之于ibm
这本书中提出的开源问题,同时在文中很多遇到的问题都没有给出解释。在这个软件工程过程开发过程中,更新换代,开源问题还有检测问题都提了出来,所以整个软件开发的是一个十分复杂的问题,并不是一个一成不变的状态,更应该是一个不断改进精进的过程。
从这本书中所说的情况在结合现在起计算机技术的发展,可以看出现在整个计算机的发展速度是有目共睹的,从硬件到软件中,技术更新换代速度之快,任何行业都无法比拟。各种计算机网络语言可以说是层出不穷,各种编程框架也还是数不胜数,并且也在不断变化。软件开发并不是简单的代码编写,但是代码编写只是软件工程内部的方法,但是软件工程的内部问题包括计算,控制论,系统工程,人机交互等等。所以在软件开发过程中遇到的问题,一方面是对问题的理解和抽象的问题,另一方面是对软件开发技术本身的理解,软件开发团队中必须对这种问题进行解决。
在进行飞花令的开发过程中,我们遇到各种各样的问题,有时候会因为队友回复不及时而烦恼,有时候因为代码设计问题产生分歧,但是在商量协商的过程中很多问题基本都可以迎刃而解,良好的沟通和分工可以大大的提高效率,一般在团队开发遇到的各种问题有时候很难进行的时候,就需要进行必要的群体分工,借助团队和群体的力量,明确三个诸葛亮,顶个诸葛亮的思想。在项目的开发过程中,不能只强调个人的能力,必须统筹兼顾,将整个团体的作用的发挥出来,实现取长补短的优势,才可以将整个项目的要求完美实现。