这个作业属于哪个课程 | 2019学年02学期单红老师软件工程实践 |
---|---|
这个作业要求在哪里 | 团队作业第二次——团队Github实战训练 |
团队名称 | 松果星球委员会 |
这个作业的目标 | 实现GitHub实训并完成一个小项目 |
作业正文 | 本博文 |
其他参考文献 | 构建之法 |
Github链接
https://github.com/Benjamin-Gnep/live-project
项目链接
项目部署至云服务器:http://radishbear.top/ky/#/
组员职责分工
学号 | 职责 |
---|---|
221701311 | 整理文档 |
221701325 | 前端 |
221701410 | 后端 |
221701231 | 前端、后端 |
221701213 | |
131700127 | |
221701129 | |
221701433 | |
221701110 |
部分组员负责的工作
221701410 摇号功能
1.功能描述
该功能为摇号功能,在每次预约结束后会对该次预约的用户进行摇号,产生中签的用户。摇号规则为加权平均数,如果用户参加了多次未中签,则中奖的几率会越来越大;相应的,若用户以往中过签,中奖几率会相应有一定减少。
2.设计实现
- 取数据库里预约该次活动的所有用户,按照加权规则(每中签一次权重*0.9,每未中签一次权重*1.1,初始权重100,按照身份证号判断同一用户),每次随机产生一个用户。
- 取该用户的预约口罩数与当前剩余口罩数量比对,若用户预约数小于剩余口罩数则该用户中签,剩余口罩数减少。
- 循环直到所有人都中签,或剩余口罩数已经不够分给任何一个未中签的用户。
3.部分代码
- 循环取随机用户
while($total>0)
{
$winID = MyRand($weightArray); // 使用MyRand函数随机取得一个下标,范围为$winArray的长度
if ($winArray[$winID] == "否" && $numArray[$winID] <= $total) // 若该用户未中签且需要的口罩数量小于当前所剩余数量
{
$winArray[$winID] = "是"; // 该用户的中奖标志设为1
$total = $total - $numArray[$winID]; // 口罩剩余数量减少
}
for($x = 0; $x < count($idArray); $x++){
if($winArray[$x] == "否" && $numArray[$x] <= $total) // 如果还存在用户未中签且需要的口罩数量小于当前所剩余数量
{
$flag = 1;
break;
}
$flag = 0; // 如果不存在用户未中签且需要的口罩数量小于当前所剩余数量的情况,将flag置0
}
if($flag == 0) // flag为0则跳出while循环
{
break;
}
}
- 加权随机数:使用较为简单的算法,可以理解为将所有用户的权重线段组成一整条线段,然后在此线段上随机产生一个点,判断该点在哪个用户的线段上。
function MyRand(array $arr){
$sum = 0;
foreach($arr as $key => $value){
$sum += $value;
$new[] = $sum;
}
$return = 0;
$rand = mt_rand(0 , $sum-1);
foreach ($new as $key1 => $value2){
if($rand < $value2){
$return = $key1;
break;
}
}
return $return;
}
4.优化方向
因为项目的时间较紧,所以在实现的时候基本只考虑了实现,而并未考虑优化,因此这个简单的加权随机数算法在面对大量用户时并不适用,后续会学习更多算法,思考摇号算法的实现和优化。
221701129 中签功能
-
根据用户输入的用户编号查询是否中签,后端获取用户输入的编号并对相应字段进行查询,
如果“否”就是没有中签,反之为“是”,则为中签,返回用户的相关信息。
131700127 查询与设置
- 查询
根据用户输入的ID查找对应的win。若win为是,返回所需要的信息,若为否,则返回false。
- 设置
输入设置所需参数,执行相关SQL语句,更新manage表中相关数据。
221701110 前台数据的可行性判断
写了预约时从前台读取数据时进行初步的预约可行性判断,主要写了身份证合法性判定,算法及说明如下:
其中对于算法有解析
function isCreditNo($vStr){
//数组存取各省市编号
$vCity = array(
'11','12','13','14','15','21','22',
'23','31','32','33','34','35','36',
'37','41','42','43','44','45','46',
'50','51','52','53','54','61','62',
'63','64','65','71','81','82','91'
);
//因为身份证号有15位(旧)和18位(新)两种,所以先对身份证进行判断是否位纯数字的15位或者除最后一位为x或X的18位数字
//利用正则表达式匹配
if (!preg_match('/^([\d]{17}[xX\d]|[\d]{15})$/', $vStr)) return false;
//判断前两位是否符合省份编号
if (!in_array(substr($vStr, 0, 2), $vCity)) return false;
$vStr = preg_replace('/[xX]$/i', 'a', $vStr);
$vLength = strlen($vStr);
//获取出生年月日,新旧版身份证号获取方式不一致
if ($vLength == 18) {
$vBirthday = substr($vStr, 6, 4) . '-' . substr($vStr, 10, 2) . '-' . substr($vStr, 12, 2);
}
else {
$vBirthday = '19' . substr($vStr, 6, 2) . '-' . substr($vStr, 8, 2) . '-' . substr($vStr, 10, 2);
}
//出生年月日判定是否合法
if (date('Y-m-d', strtotime($vBirthday)) != $vBirthday) return false;
//如果是新版身份证,判断校验位是否符合ISO 7064:1983.MOD 11-2的规定,最后一位如果为X/x,则把它替换成数字10
if ($vLength == 18) {
$vSum = 0;
for ($i = 17 ; $i >= 0 ; $i--) {
$vSubStr = substr($vStr, 17 - $i, 1);
$vSum += (pow(2, $i) % 11) * (($vSubStr == 'a') ? 10 : intval($vSubStr , 11));
}
if($vSum % 11 != 1) return false;
}
return true;
}
github提交截图
统计的commit次数
次数 | |
---|---|
1 | |
14 | |
4 | |
5 | |
3 | |
7 | |
程序运行截图
组员遇到的困难和问题
131700127吴章权
- 遇到的困难: PHP语法不够熟练
- 解决方法: 需要加强对PHP的学习
221701231朱鸿昊
- 遇到的困难:vue项目打包后部署,图片无法正常显示
- 解决方法:经分析 产生原因为vue框架对资源大小加了限制,解决方案:把框架里对图片大小的限制加大
221701433 赖晓辉
-
遇到的困难:
1.初次接触vue框架,对vue语法和书写规范不熟悉,安装nodejs和配置环境变量浪费过多时间
2.前后端数据交互采用ajax和php,对这部分很陌生。
- 解决方法 :团队里的小伙伴(鸿昊和苯甲醚)帮助了我很多,鸿昊像带学生一样一步步帮助我们熟悉vue,苯甲醚总能对我的问题有及时的反馈和帮助
221701410胡锦浩
- 遇到的困难:对php编程不太熟悉,效率较低;对前后端交互不了解,难以测试自己的后端代码
- 解决方法:通过百度和编码渐渐熟悉php语法;通过前端同学提供的demo包测试了自己的代码,提高了编码和debug效率
221701129龚俊鹏
-
Q1:php有一段时间没用过了,有点生疏,
解决:花了一小部分时间看了以前的代码,回忆起来
-
Q2:对于php编码问题,有时候会出现乱码
解决:在php代码里面设置编码方式,解决了这个问题
-
Q3:echo 输出问题,惯性的采用了+链接输出,输出出现问题
解决:+改为.
-
Q4:数据库获得的数据存入数组?
解决:采用array_push存入对应字段
221701110包鹏飞
- 遇到的问题: php运行时一直显示数字和小数得一串字符,
- 解决方法: 后面重新写了一个拷贝过去就好了,只是还不懂为什么
221701213胡世鑫
- 遇到的困难:一开始对于本次实战训练的需求理解不够深刻,导致代码功能缺少,并且对于php中的数据库操作的代码忘记较多,在网上查询了较多内容,浪费了大量时间。
- 解决方法:需增强对编程任务的需求理解
221701311李昊朋
- 遇到的困难:环境变量配置不好 无法正确运行clone下来的代码
- 解决方法: 多百度多思考
- 另附:这次起晚了 导致一天都没跟上团队节奏 实属不应该 只能落魄写文档。。 下次保证不会出现这种情况
221701325彭陈浩
- 遇到的困难:遇到的问题就是axios和后端的数据交互、表格数据的动态渲染以及vue框架的入门学习
- 解决方法:平时多积累 多学习
评估每位组员的贡献比例
贡献度 | |
---|---|
9 | |
11 | |
10 | |
20 | |
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 650 | 740 |
Estimate | 估计这个任务需要多少时间 | ||
Development | 开发 | 610 | 690 |
Analysis | 需求分析 (包括学习新技术) | 240 | 400 |
Design Spec | 生成设计文档 | 15 | |
Design Review | 设计复审 | ||
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | ||
Design | 具体设计 | ||
Coding | 具体编码 | 200 | |
Code Review | 代码复审 | ||
Test | 测试(自我测试,修改代码,提交修改) | 40 | |
Reporting | 报告 | 30 | |
Test Repor | 测试报告 | ||
Size Measurement | 计算工作量 | ||
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | ||
合计 |
221701129 龚俊鹏
80 | 75 | ||
395 | 345 |
221701410 胡锦浩
250 | 305 | ||
60 | |||
120 | 140 | ||
35 | |||
300 | 340 |
221701110 包鹏飞
25 | |||
360 |
221701231 朱鸿昊
280 |
131700217 吴章权
50 | |||
550 | 640 |
221701325 彭陈浩
221701213 胡世鑫
325 | |||
350 |
对团队选题提问的回答
接受助教和老师的建议 已经更换选题
我们的新思考和想法
经过和第三组的商讨,我们决定更改我们的选题。经过讨论决定我们小组准备做校内安利平台,一开始我们仅打算做食堂的安利平台,旨在推销校内及校园周边美食,后来考虑了一下这样好像没什么市场,所以就改成全类安利平台。