CY-947205926

云打印团队展示

团队名称: 云打印
作业要求: 团队作业第一次—团队展示
作业目标:团队配合,开发项目,增强动手实践能力

团队队员

队员学号 队员姓名 个人博客地址 备注
221600412 陈宇 http://www.cnblogs.com/chenyuu/ 队长
221600411 陈迎仁 https://www.cnblogs.com/yinen/
221600409 蔡森林 https://www.cnblogs.com/csl8013/
221600401 陈诗娴 https://www.cnblogs.com/orangepoem/
221600408 蔡鸿键 https://www.cnblogs.com/jichiwoyaochi/

团队名称: 云打印


团队项目描述:打印资料就上云打印。

队员风采

队员姓名 队员介绍
陈宇 性格:开朗乐观,擅长的技术:擅长javaee后端开发,编程兴趣:对编程有较大的兴趣,希望担任开发,PM等,宣言:不做代码的搬运工
陈迎仁 性格:内向;擅长的技术:会一点微信小程序,有点菜;编程兴趣:一般;希望的软工角色:开发;少熬夜,坚决不掉发。
蔡森林 性格:随和 技术:后端python开发 兴趣:跑步 角色:开发 一句话:人生苦短,好好学习
陈诗娴 我的性格比较内向,在努力变得开朗,擅长前端web的设计,对编程的兴趣其实不大,希望担任测试的角色。一句话宣言:学得越多就越能成功
蔡鸿键 性格:内向 技术:测试 前端html 兴趣:喜欢解bug曾被邀请参加ioccc比赛 角色:开发和测试 一句话:不做码农

团队的首次合照

团队的特色描述:
拥有妹子的团队,男生敲代码积极性很高,团队成员大部分有获奖经历,代码实践能力较强,有较强的责任心。

团队作业第二次—项目选题报告

团队名称: 云打印
作业要求: 团队作业第二次—项目选题报告
作业目标:团队配合,开发项目,增强动手实践能力
选题报告下载
评审表下载
演示PPT下载

团队队员

队员学号 队员姓名 个人博客地址 备注
221600412 陈宇 http://www.cnblogs.com/chenyuu/ 队长
221600411 陈迎仁 https://www.cnblogs.com/yinen/
221600409 蔡森林 https://www.cnblogs.com/csl8013/
221600401 陈诗娴 https://www.cnblogs.com/orangepoem/
221600408 蔡鸿键 https://www.cnblogs.com/jichiwoyaochi/

产品简介

云打印是一款以微信小程序为基础的在线打印服务,通过和实体打印店合作,用户可以通过微信小程序上传word,ppt,pdf等文档,后台可以通过代码计算页数然后返回给前端计算出价格,通过微信下单,付款。商家通过网页界面接单和下载文档,并进行打印和配送。


发展前景

现代生活是快节奏的生活方式,低效率的服务已经逐渐被淘汰,便利快捷的服务方式逐渐被人们所认同,而在线打印就是解决了传统的打印方式用人工打印算钱的低效率方式,利用在线支付下单,线下实体打印店打印,配送,用户只需利用微信小程序操作,无需到实体打印店排队,提高了打印店的打印效率,合理利用打印资源,提高盈业额。


产品与服务 -- 微信小程序的设计

功能部分

1、文档打印:用以打印用户需要打印的文档文件
2、图片打印:用以打印用户需要打印的图片
3、历史订单:用以查询用户历史打印文档或图片等消费记录
4、扫一扫:待开发

用户部分

1、注册登录:微信授权登录
2、用户信息管理:用户管理自己的账户和个人信息

微信小程序的制作

进入云打印的首页,有4个功能按钮,分别为文档打印,图片打印,历史订单以及扫一扫。选择文档打印或图片打印功能,进入订单填写页面,填写个人信息,上传需要打印的文档或图片之后,设置打印属性,可选单双面和黑白或者彩色打印,之后提交订单,核对订单信息,然后进入支付页面,支付成功后就提交订单到服务器,服务器会将订单实时反馈到商检的web端,商家可以在订单列表中选择订单,然后打印订单中的文档,并且根据需要安排配送人员进行资料的配送。

微信小程序的完善及发展方向

1、增加图像文字识别功能,让用户随时拍照想要的文字内容,随时生成对应的文档,随时打印相应的文档,达到即拍即印的效果。
2、增加路径规划功能,用户可通过在线输入当前所在地址,系统自动匹配距离最近的打印店供用户选择,提高用户获取资料的时效。
3、增加年度账单功能,让用户知道本年度所打印文档或图片的相关消费记录。
4、增加资源共享功能,让用户不用通过其他途径,直接通过本程序达到资源共享的效果。

微信小程序的创新要点

本项目将传统的线下打印流程全部移植到线上,通过小程序一步完成,省去了自己去打印店打印的过程,而且线上上传要打印的文件,可选单面(双面)、黑白(彩色)打印,高度还原了打印店应有的所有服务,免去了在电脑拷贝的过程,而且不用排队,既方便了自己,商家也更加省事。还有效地避免了一些不必要的麻烦,例如我们经常在打印店打印资料时,可能会遇到下列问题:U盘会感染一些病毒,忘记带U盘,资料缺损。。。
在技术实现上,本项目的客户端采用了时下最流行的微信小程序,这无疑极大地方便了广大师生的打印流程,免去了安装app的麻烦,随时随地就可以下单。商家端,本项目采用了html+css+javascript语言,展现的形式为web,商家只需打开浏览器就能接单,订单列表一目了然,操作方便。


NABCD模型

  • N (Need,需求)

    • 帮助用户便捷快速的打印文件
    • 无论何时何地用户只要在微信上操作,即可下单打印
    • 用户从微信小程序上传文档,下单,付款
      • 后台计算文档页数和价格
      • 商家进行打印,配送
    • 商家从后台界面,可以进行接单,配送
    • 对商家打印订单进行数据可视化

  • A(Approach,方法)

    • 设计一个基于微信小程序实现相关需求。
    • 用户从手机选择文件上传
    • 后台计算页数和价格
    • 商家进行接单打印,配送
  • B(Benefit,好处)

    • 用户可以便捷快速的打印自己想要的材料
    • 通过微信小程序,用户无需安装额外软件
    • 能随时随地打印

  • C(Competitors,竞争)

    • 优点:
      • 这个创意很新颖,福州大学目前还没有一个这样的微信小程序在大学里面使用
      • 操作简单方便
      • 能在任何地方打印
    • 缺点:
      • 前期和店家合作比较难达成
      • 文件上传大小容易受到限制
      • 前期用户数不足

  • D(Delivery,推广)

    • 线上推广
      • 通过写推文进行推广
      • 和广告商进行合作
      • 用微信公众号进行推广
    • 线下推广
      • 以简单便捷的方式使用,提高用户体验,用户互相推广
      • 在人流量较大的位置粘贴宣传海报

评审表

队员贡献

队员学号 队员姓名 此次作业任务 贡献比例
221600412 陈宇 安排任务,文档撰写,博客撰写,PPT制作,整理报告,演讲答辩,回答问题,提问 27%
221600411 陈迎仁 文档撰写,问卷调查,PPT制作 24%
221600401 陈诗娴 评审表撰写,文档撰写 19%
221600409 蔡森林 文档撰写 15%
221600408 蔡鸿键 文档撰写 15%

选题报告下载
评审表下载
演示PPT下载

项目原型设计


格式描述


团队队员

队员学号 队员姓名 个人博客地址 备注
221600412 陈宇 http://www.cnblogs.com/chenyuu/ 队长
221600411 陈迎仁 https://www.cnblogs.com/yinen/
221600409 蔡森林 https://www.cnblogs.com/csl8013/
221600401 陈诗娴 https://www.cnblogs.com/orangepoem/
221600408 蔡鸿键 https://www.cnblogs.com/jichiwoyaochi/

项目描述

一、项目描述

1.1产品简介

      云打印是一款以微信小程序为基础的在线打印服务,通过和实体打印店合作,用户可以通过微信小程序上传word,ppt,pdf等文档,后台可以通过代码计算页数然后返回给前端计算出价格,通过微信下单,付款。商家通过网页界面接单和下载文档,并进行打印和配送。

1.2发展前景

      现代生活是快节奏的生活方式,低效率的服务已经逐渐被淘汰,便利快捷的服务方式逐渐被人们所认同,而在线打印就是解决了传统的打印方式用人工打印算钱的低效率方式,利用在线支付下单,线下实体打印店打印,配送,用户只需利用微信小程序操作,无需到实体打印店排队,提高了打印店的打印效率,合理利用打印资源,提高盈业额。

二、市场需求分析

2.1需求调查方式

      为了更好的了解用户需求,我们采用了发放问卷的方式。问卷主要涵盖三个方面:个人情况调查、打印资料习惯调查和平台满意度调查以及功能需求调查。其中个人情况题1题,打印资料习惯调查4题,平台满意度调查1题,功能需求调查2题,意见反馈1题。

2.1.1 抽样方式

      本着自愿的原则,我们共邀请了142名被试者。为了使数据层次更加丰富,我们向不同年级的人发放了问卷,覆盖大一到大四学生。

2.1.2 调查时间

2019年3月18日开展调查,并于3月20日完成数据的统计分析工作。

2.2 问卷分析

2.2.1 打印资料习惯分析

      受访的142名参与者中经常去打印店打印资料的占42.96%,较多人还是有去打印店打印资料的需求。在这142名参与者,较多人选择打印试卷、练习,比例达到86.62%,论文报告以及课件等也分别占到了60.56%、53.52%。这些打印者对于他们资料的私密性,总的来看还是可被分享的占绝大多数。对于资料私密性要求较高的仅有25.35%。紧接着对于打印店碰到的问题,也是我们这个平台想解决的用户痛点,大部分被调查的人都遇到了打印店人多拥挤的情况,比例占到90.85%;还有其他比如错印、多印的情况也占到52.82%;所以去打印店打印碰到的问题还是较多的。
是否经常去打印店打印资料?

去打印店主要打印什么类型的材料?

资料的保密性如何

在打印店遇到的问题?

2.2.2 平台满意度分析

      对于开发一个平台来解决打印者在打印店碰到的一些问题的这个想法还是比较受到大家的欢迎以及支持;有55.63%的被调查者非常希望有这样一个平台来解决问题,也仅仅只有4.23%的人较为不需要这个平台提供帮助。


####2.2.3 功能需求调查分析       针对平台的载体我们进行了调查,81.69%的人更希望通过简单的微信小程序来使用这个平台,更加便捷和方便。针对功能上除了提供在线打印和上传资料,他们还对配送提出了一些希望的要求,比如配送费以及时效性等。当然也提到了文件的保密问题。

NABCD模型

  • N (Need,需求)

    • 帮助用户便捷快速的打印文件
    • 无论何时何地用户只要在微信上操作,即可下单打印
    • 用户从微信小程序上传文档,下单,付款
      • 后台计算文档页数和价格
      • 商家进行打印,配送
    • 商家从后台界面,可以进行接单,配送
    • 对商家打印订单进行数据可视化

  • A(Approach,方法)

    • 设计一个基于微信小程序实现相关需求。
    • 用户从手机选择文件上传
    • 后台计算页数和价格
    • 商家进行接单打印,配送
  • B(Benefit,好处)

    • 用户可以便捷快速的打印自己想要的材料
    • 通过微信小程序,用户无需安装额外软件
    • 能随时随地打印

  • C(Competitors,竞争)

    • 优点:
      • 这个创意很新颖,国内还没有一个这样的微信小程序在大学里面使用
      • 操作简单方便
      • 能在任何地方打印
    • 缺点:
      • 前期和店家合作比较难达成
      • 文件上传大小容易受到限制
      • 前期用户数不足

  • D(Delivery,推广)

    • 线上推广
      • 通过写推文进行推广
      • 和广告商进行合作
      • 用微信公众号进行推广
    • 线下推广
      • 以简单便捷的方式使用,提高用户体验,用户互相推广
      • 在人流量较大的位置粘贴宣传海报

三、产品与服务

3.1 微信小程序的设计

功能部分:
1、文档打印:用以打印用户需要打印的文档文件
2、图片打印:用以打印用户需要打印的图片
3、历史订单:用以查询用户历史打印文档或图片等消费记录
4、扫一扫:待开发

用户部分:

1、注册登录:微信授权登录
2、用户信息管理:用户管理自己的账户和个人信息
3.2 微信小程序的制作
使用微信web开发者工具进行开发小程序
3.3微信小程序所能提供的服务
进入云打印的首页,有4个功能按钮,分别为文档打印,图片打印,历史订单以及扫一扫。选择文档打印或图片打印功能,进入订单填写页面,填写个人信息,上传需要打印的文档或图片之后,设置打印属性,可选单双面和黑白或者彩色打印,之后提交订单,核对订单信息,然后进入支付页面,支付成功后就提交订单到服务器,服务器会将订单实时反馈到商检的web端,商家可以在订单列表中选择订单,然后打印订单中的文档,并且根据需要安排配送人员进行资料的配送。

3.4微信小程序的完善及发展方向

1、增加图像文字识别功能,让用户随时拍照想要的文字内容,随时生成对应的文档,随时打印相应的文档,达到即拍即印的效果。
2、增加路径规划功能,用户可通过在线输入当前所在地址,系统自动匹配距离最近的打印店供用户选择,提高用户获取资料的时效。
3、增加年度账单功能,让用户知道本年度所打印文档或图片的相关消费记录。

原型设计


使用工具: 墨刀

项目原型设计--微信小程序 (点击左边进入墨刀预览)
项目原型设计--商家端 (点击左边进入墨刀预览)


效能分析和PSP

PSP是卡耐基梅隆大学(CMU)的专家们针对软件工程师所提出的一套模型:Personal Software Process (PSP, 个人开发流程,或称个体软件过程)。
PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 0 0
• Estimate • 估计这个任务需要多少时间 800 1000
Development 开发 0 0
• Analysis • 需求分析 (包括学习新技术) 60 90
• Design Spec • 生成设计文档 50 60
• Design Review • 设计复审 50 50
• Coding Standard • 代码规范 (为目前的开发制定合适的规范) 40 45
• Design • 具体设计 500 600
• Coding • 具体编码 0 0
• Code Review • 代码复审 0 0
• Test • 测试(自我测试,修改代码,提交修改) 30 35
Reporting 报告 30 30
• Test Report • 测试报告 30 30
• Size Measurement • 计算工作量 30 35
• Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 30 30
合计 850 1005

向客户推销

    首先我们先介绍我们的项目是一个以微信小程序为基础的在线打印服务,能在线下单并配送至宿舍,接着向它演示如何使用在线打印,其次在说明传统的打印店模式,人多,U盘容易中毒,U盘容易丢失等问题,最后推荐它注册并使用一下小程序。

使用建议

  • 文件尽量上传pdf格式,以便打印格式不变
  • 上传的文件尽量不要含有太多图片,以免计算价格出错

原型设计

我们程序分为小程序端和商家端 我们小组分别对原型进行了讨论并进行了设计。
首先我们讨论小程序的登录注册和上传文件,接着进行了用户界面的原型设计
其次我们讨论了商家网页端的原型设计过程。

微信小程序原型












商家端原型






团队的选题报告问题的回答

Question 1.很接地气,有没有打印预览功能

Answer:首先打印预览功能是一个能有效避免用户打印出来的文件和预期打印的文件不一样的功能,它能提高用户体验,所以这个功能我们一直在考虑,我们选用的微软的在线预览功能,能预览常见的word,ppt,pdf等文档。


#### Question 2.市场是否只局限于福大?推广的力度不够 #### Answer:市场当然不局限于福大,只是我们的产品刚开始投入使用,需要事先进行试点实验,如果于福大试验成功,并深受学生爱戴,我们便可有理由向其他高校进行一系列宣传。说到宣传,我们打算通过微信公众号,qq空间,朋友圈等途径进行推广,让云打印成为每个同学的资料神器。
#### Question 3.打印内容安全和隐私如何保障? #### Answer:保密配送: 针对调查发现 25%的资料是隐私的 75%的资料是可以公开的 可以具体实现保密配送和非保密配送。 保密配送对于客户的隐私保护是有一套规范和严格的流程的:       1. 首先用户使用小程序前要同意用户隐私协议       2、保密文件由我们专门的配送员派送,并会事先与您约好收货地点,这样就避免了贸然上门派件时遇到的尴尬情况;       3、在外包装上,我们会使用统一的文件带包裹打印的文件,不会留下任何标示及产品说明。       4、使用中继号来联系配送和顾客。       安全: 将配送过程分成三方责任人         1.商家         2.配送         3.顾客 通过app进行网上登记来确定安全责任的划分。 非隐私文件: 支持到店自取 和 打印店配送员配送至宿舍
#### Question 4.是否有类似的软件竞争? #### Answer:在软件商城中我看到挺多可以连接自己的打印机来打印文件的软件,但这就需要自己有一台打印机,与我们小程序的功能不同,我认为这类不构成明显的竞争关系。我只找到很少的与我们的小程序类似的高校云打印网站,而且这些网站都是只针对个别学校,覆盖面比较小,我也没有看到福州的任何一所高校有被包含在网站服务的学校之内,所以我认为若是我们将小程序向周边学校扩展的话这些网站与我们会是竞争关系,但目前只是在校内使用应该还不会产生竞争。
#### Question 5.打印任务的优先级如何保证?加急怎么处理? #### Answer:打印优先级在微信小程序的两个方面来体现,一个是用户自选择的配送时间,另一个可以在小程序设置一个订单选项,让用户自己选择是否加急。如果用户选择加急可以在web商家端的订单上显示一个加急图标。在项目上线时,与商家老板进行系统的简单讲解,包括优先级的图标显示,从而让商家老板根据加急文件优先打印。

解决方案预期规划

    首先完善基础功能,其次针对用户打印文件可能格式出错,和隐私问题进行针对性解决。对于打印文件的格式的问题,预期解决方案提供一个在线编辑的word文档,并在用户提交订单后后台自动把word转成pdf保持文件格式不变,或者就是用户自己上传pdf文件格式,这两种文件都能保持文件不变,针对用户隐私问题,我们会在用户上传的文件的时候进行提醒,并独立出一个用户隐私文件打印模块,由我们指定的商家进行打印配送。


队员贡献

队员学号 队员姓名 此次作业任务 贡献比例
221600412 陈宇 安排任务,博客撰写,原型设计,问题的回答,整理问题 20%
221600411 陈迎仁 小程序原型设计,问题的回答 19%
221600401 陈诗娴 网页原型设计,问题的回答 21%
221600409 蔡森林 小程序原型设计,问题的回答 22%
221600408 蔡鸿键 网页原型设计,问题的回答 18%

博文下载.PDF

下载


团队作业第4次-项目需求分析


格式描述


团队队员

队员学号 队员姓名 个人博客地址 备注
221600412 陈宇 http://www.cnblogs.com/chenyuu/ 队长
221600411 陈迎仁 https://www.cnblogs.com/yinen/
221600409 蔡森林 https://www.cnblogs.com/csl8013/
221600401 陈诗娴 https://www.cnblogs.com/orangepoem/
221600408 蔡鸿键 https://www.cnblogs.com/jichiwoyaochi/

整体计划安排

  • 原型设计
    • 时间:3.23-3.30
    • 任务:完成微信小程序,登录注册,个人信息,上传文件,订单界面等原型界面设计,完成商家端,下载文件,登录注册,接单等原型界面的设计。
    • 状态:已完成
  • 需求分析报告
    • 时间:3.25-4.7
    • 任务:对该项目进行需求分析,并完成类图和用况图。
    • 状态:已完成
  • 系统设计与数据库设计
    • 时间:4.8-4.14
    • 任务:确定后台数据库表的结构,设计模式。
    • 状态:未完成

里程碑 一 :实现项目核心功能

  • 基础编码实现
    • 时间:4.15-4.21
    • 任务:实现后台基本功能,并和小程序对接。
    • 状态:未完成

里程碑 二 :项目基本完成

  • Alpha冲刺
    • 时间:4.21-5.4
    • 任务:采用敏捷开发中的迭代开发,先完成一个最简单的版本,之后不断迭代开发。
    • 状态:未完成

里程碑 三 :优化项目

  • Beta冲刺
    • 时间:5.5-6.1
    • 任务:完善和优化基础功能,并逐步扩展功能。
    • 状态:未完成

撰写需求规格说明书的工作流程

1.首先我们组员先进行了对需求规格说明书的内容进行讨论
2.接着对这个项目的类和用况进行了分析,并进行分工
3.增改原型设计,画出类图、用例图、活动图,提交新增页面的功能设计
4.整合文档,制作PPT


组员分工及队员贡献

队员学号 队员姓名 此次作业任务 贡献比例
221600412 陈宇 安排任务,需求规格说明书第一部分,博客撰写,修改评审表,整理文档 22%
221600411 陈迎仁 画用况图,ppt制作,答辩 22%
221600401 陈诗娴 需求规格说明书第五部分,用例文本 19%
221600409 蔡森林 需求规格说明书第三部分,类图 19%
221600408 蔡鸿键 需求规格说明书第二部分 18%

博文下载.PDF

下载


团队作业第五次—项目系统设计与数据库设计


格式描述


团队队员

队员学号 队员姓名 个人博客地址 备注
221600412 陈宇 http://www.cnblogs.com/chenyuu/ 队长
221600411 陈迎仁 https://www.cnblogs.com/yinen/
221600409 蔡森林 https://www.cnblogs.com/csl8013/
221600401 陈诗娴 https://www.cnblogs.com/orangepoem/
221600408 蔡鸿键 https://www.cnblogs.com/jichiwoyaochi/

撰写系统设计和数据库设计说明书

1.先针对上次答辩的问题进行了修改很整理
2.开始对系统设计和数据库设计的分析
3.改进类图
4.查找资料
5.组员分工
5.整理文档
6.撰写PPT


组员分工及队员贡献

队员学号 队员姓名 此次作业任务 贡献比例
221600412 陈宇 安排任务,系统设计说明书,数据库设计说明书,博客,PPT 25%
221600411 陈迎仁 数据库设计说明书,数据库设计说明书 23%
221600401 陈诗娴 数据库设计说明书本 17%
221600409 蔡森林 数据库设计说明书数据库设计说明书 20%
221600408 蔡鸿键 数据库设计说明书 15%

博文下载.PDF

下载


团队作业第六次—团队Github实战训练

团队名称: 云打印
作业要求: 团队作业第六次—团队Github实战训练
作业目标:搭建一个相对公平公正的抽奖系统,根据QQ聊天记录,完成从统计参与抽奖人员颁布抽奖结果的基本流程。
Github地址:Github地址

团队队员

队员学号 队员姓名 个人博客地址 备注
221600412 陈宇 http://www.cnblogs.com/chenyuu/ 队长
221600411 陈迎仁 https://www.cnblogs.com/yinen/
221600409 蔡森林 https://www.cnblogs.com/csl8013/
221600401 陈诗娴 https://www.cnblogs.com/orangepoem/
221600408 蔡鸿键 https://www.cnblogs.com/jichiwoyaochi/

组员分工及组员贡献

队员学号 队员姓名 此次作业任务 贡献比例
221600412 陈宇 项目管理、后端代码的编写,服务器的部署 23%
221600411 陈迎仁 后端逻辑模块的编写,聊天记录过滤的处理,博客文档的编写 21%
221600401 陈诗娴 编写博客文档结构,前端美工设计 15%
221600409 蔡森林 附加功能的实现,数据处理与挖掘、编写附加功能部分的博客文档 21%
221600408 蔡鸿键 前端代码的编写与设计 20%

github 的提交日志截图






程序运行截图





程序运行环境

  • 本项目为web项目,搭载在阿里云服务器上,web访问链接为: 项目运行地址

  • 前端:

开发工具为PhpStorm,开发语言为Ajax、js、css、HTML,框架为boostrap;运行环境为各类浏览器(谷歌浏览器、火狐浏览器、IE6以上的IE浏览器等)

  • 后端

开发工具为IntelliJ IDEA Ultimate,开发语言为java,框架为boostrap;运行环境为java环境


GUI界面







基础功能实现

基本功能实现的核心代码

  • 抽奖
@RequestMapping("/draw")
    public ResponseData draw(String email,String name, String document, Integer winnerNum,
                             String startTime, String endTime, String resultTime,
                             String keyWord, Integer filterType, String award,
                             HttpServletRequest request) throws ClientException, IOException, MessagingException {
        ResponseData responseData = new ResponseData();
       LotteryDrawRule lotteryDrawRule=new LotteryDrawRule(LotteryDrawFilter.getFilterTypeString(filterType),keyWord,startTime,
               endTime,resultTime, winnerNum);
        //LotteryDrawFilter lotteryDrawFilter=new LotteryDrawFilter(lotteryDrawRule,"/home/QQrecord-2022.txt");
       LotteryDrawFilter lotteryDrawFilter=new LotteryDrawFilter(lotteryDrawRule,"G:\\MyJavaWeb\\Luckydraw\\src\\main\\resources\\QQrecord-2022.txt");
       Map<String, Integer> users = lotteryDrawFilter.doFilter();
       List<User> awardUsers = LcgRandom.getResult(users,winnerNum);
       String str[] = award.split("\\,");
       int j = 0;
       for(String s : str){
           String awardName = s.split(":")[0];
           Integer awardNum = Integer.valueOf(s.split(":")[1]);
           for (int i = 0; i<awardNum;i++){
               if(j<awardUsers.size()){
                   awardUsers.get(j).setAward(awardName);
                   j++;
               }
           }
       }
       StringBuilder awardString = new StringBuilder();
       for (User u: awardUsers) {
           awardString.append(u.toString()+"\r\n");
       }
       awardString.append(" ");
       DrawLuckResult dr = new DrawLuckResult(name,document,keyWord,startTime,endTime,resultTime,winnerNum,award,
               LotteryDrawFilter.getFilterTypeString(filterType),awardString.toString());
       drawLuckResultDao.insert(dr);
       responseData.setData(dr);
       Thread t = new Thread(new Runnable() {
           @Override
           public void run() {
               try {
                   StringBuilder sb = new StringBuilder();
                   for (User u: awardUsers) {
                       sb.append(u.toString()+"</br>");
                   }
                   sb.append(" ");
                   EmailUtil.send465("中奖结果","<h1>中奖结果通知</h1></br>" + sb.toString(),email);
               } catch (MessagingException e) {
                   e.printStackTrace();
               }
               for (User u: awardUsers) {
                   try {
                       String name = u.getName();
                       String email = null;
                       if(name.contains("(")){
                           email = name.substring(name.indexOf("(") +1 ,name.lastIndexOf(")"));
                           if (!email.contains("@qq.com")){
                               email += "@qq.com";
                           }
                       }else if(name.contains("<")){
                           email = name.substring(name.indexOf("<") +1 ,name.lastIndexOf(">"));
                       }
                       // System.out.println(email);
                       // 为了不打扰其他人只通知自己
                       if (email.contains("947205926")){
                           EmailUtil.send465("中奖通知","恭喜" + u.getName() + "获得" + u.getAward(),"947205926@qq.com");
                       }
                   } catch (Exception e) {
                       e.printStackTrace();
                   }
               }
           }
       });
       t.start();
        return responseData;
    }
  • Lgc随机数
public static List<User> getResult(Map<String, Integer> users, Integer awardNum) {
        Iterator it = users.entrySet().iterator();
        List<User> listUser = new ArrayList<>();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            String name = (String) entry.getKey();
            Integer weight = (Integer) entry.getValue();
            // System.out.println(name + "  " + weight);
            listUser.add(new User(name, weight));
        }
        Random random = new Random();
        // 对所有参与的用户进行随机排序
        Collections.sort(listUser, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return random.nextInt(2) - 1;
            }
        });
        int i = 0;
        int size = listUser.size();
        LcgRandom lcg = new LcgRandom();
        List<User> awardList = new ArrayList<>();
        if (size > 0) {
            while (i < awardNum) {
                int ran = lcg.nextInt(size);
                // 对水群的用户降低获奖权重
                if (listUser.get(ran).getWeight() > 0) {
                    listUser.get(ran).setWeight(listUser.get(ran).getWeight() - 1);
                } else {
                    awardList.add(listUser.get(ran));
                    listUser.remove(ran);
                    size = listUser.size();
                    i++;
                }
            }
        }
        return awardList;
    }

LCG算法

LCG(linear congruential generator)线性同余算法,是一个古老的产生随机数的算法。由以下参数组成:

参数 m a c X
性质 模数 乘数 加数 随机数
作用 取模 移位 偏移 作为结果
LCG算法是如下的一个递推公式,每下一个随机数是当前随机数向左移动 log2 a 位,加上一个 c,最后对 m 取余,使随机数限制在 0 ~ m-1 内

  • 从该式可以看出,该算法由于构成简单,具有以下优点
    • 计算速度快
    • 易于实现
    • 易于写入硬件

二、伪随机数算法

  伪随机数产生的方法有个逼格挺高的名字---伪随机数发生器。伪随机数产生器中最最最基础的思想是均匀分布(当然这不是唯一的思路)。一般来说,只敢说"一般来说",因为我也不敢百分百肯定,如今主流的编程语言中使用的随机数函数基本采用这种均匀分布思想,而其中最常用的算法就是"线性同余法"。

  1. 什么是线性同余法?

  线性同余法基于如下线性同余方程组

  用于产生均匀型伪随机数的线性同余产生器(与上面的方程符号没有对应关系)

   

  其中,a为"乘数",b为"增量",m为"模数",x0为"种子数"。

  如果产生的是区间实在(0,1)之间的,则只需要每个数都除以m即可,即取

  

  2. 线性同余法产生均匀型伪随机数需要注意什么?

   2.1)种子数是在计算时随机给出的。比如C语言中用srand(time(NULL))函数进行随机数种子初始化。

   2.2)决定伪随机数质量的是其余的三个参数,即a,b,m决定生成伪随机数的质量(质量指的是伪随机数序列的周期性)

   2.3)一般b不为0。如果b为零,线性同余法变成了乘同余法,也是最常用的均匀型伪随机数发生器。

  3. 高性能线性同余法参数取值要求?

   3.1)一般选取方法:乘数a满足a=4p+1;增量b满足b=2q+1。其中p,q为正整数。 PS:不要问我为什么,我只是搬运工,没有深入研究过这个问题。

   3.2)m值得话最好是选择大的,因为m值直接影响伪随机数序列的周期长短。记得Java中是取得32位2进制数吧。

   3.3)a和b的值越大,产生的伪随机数越均匀

   3.4)a和m如果互质,产生随机数效果比不互质好。
反正这图我没有发现明显的规律。因此这种伪随机数在一定条件下是可以满足随机性性质的。

聊天记录过滤思路

  • 基本过滤:

首先通过正则表达式进行聊天记录的切割,分为用户信息和用户聊天内容;通过用户信息获取用户的ID(昵称+账号);根据用户ID的开头进行判断是否是系统消息、助教、教师,对这三类的对象进行过滤,不参与后续的抽奖活动,实现基本过滤。

```
if (Pattern.matches("系统消息\\([0-9]+\\)", userID) || Pattern.matches("教师_.*\\(.*\\)", userID)|| Pattern.matches("助教_.*\\(.*\\)", userID))
{
     userID = null;
}
```

三种过滤选择:

  • 不过滤

针对抽奖名单的过滤,只实现基本过滤,并不对名单进一步的进行筛选,即只去除系统消息、教师、助教这三类对象。

  • 普通过滤

针对抽奖名单的过滤,首先实现基本过滤,去除系统消息、教师、助教这三类用户;其次针对只发表抽奖关键字的对象,也进行过滤。主要通过去除聊天记录中的关键字后,如果为空,则这条消息对应的说话人则不加入待抽奖名单。

  • 深度过滤

针对抽奖名单的过滤,首先实现基本过滤,去除系统消息、教师、助教这三类用户;其次针对只发表抽奖关键字的对象,也进行过滤;并且对于聊天内容只有图片和抽奖关键字的对象也进行一定抽奖概率的降低,但不进行过滤。

基本实现:

  • 读取文件,基本过滤处理
BufferedReader bufferedReader = openFile();
        //读取文件
        String talkContent = null;
        String temp = null;
        while ((temp = bufferedReader.readLine()) != null) {
            if (textType.equals("USER_TALK_CONTENT")) {
                if (!(isUserInfo(temp))) {
                    talkContent += temp;
                } else{
                    //判断发言是否有抽奖关键字
                    if (hasKeyWord(lotteryDrawRule.getKeyWord(), talkContent) && userID != null) {
                        talkContentFilter(talkContent);
                    }
                    talkContent = null;
                    userID = null;
                    textType = "USER_INFO";
                }
            }
            if (textType.equals("USER_INFO")) {
                userID = getUser(temp);
                if (userID != null) {
                    //去除系统消息、教师、助教
                    if (Pattern.matches("系统消息\\([0-9]+\\)", userID)
                            || Pattern.matches("教师_.*\\(.*\\)", userID)
                            || Pattern.matches("助教_.*\\(.*\\)", userID)) {
                        userID = null;
                    }
                }
                textType = "USER_TALK_CONTENT";
            }
        }
        //测试
        for (String key : users.keySet()) {
            System.out.println(key + ":" + users.get(key));
        }
        read.close();
        return users;
  • 三种过滤的处理
*
        过滤函数
        filterType=NO_FILTER:表示不过滤;所有人参与抽奖
        filterType=NORMAL_FILTER:表示普通过滤;过滤只有抽奖关键字的用户
        filterType=DEEP_FILTER:表示深度过滤;过滤只有抽奖关键字的用户或降低只有图片+抽奖关键字的用户的获奖概率
		 */
    public void talkContentFilter(String talkContent) {
        boolean flag = true;    //判断其需不需要被过滤
        int deepNum = 0;        //满足深度过滤的次数
        //如果为NO_FILTER;不执行任何过滤
        if ((lotteryDrawRule.getFilterType().equals("NO_FILTER"))) {
        }
        else if((lotteryDrawRule.getFilterType().equals("NORMAL_FILTER"))){
            //去除抽奖关键关键字
            talkContent = talkContent.substring(talkContent.lastIndexOf(\'#\')+1);
            //符合NORMAL_FILTER
            if (talkContent == null || talkContent.equals("")) {
                flag = false;
            }
        }
        else{
             //去除抽奖关键关键字
            talkContent = talkContent.substring(talkContent.lastIndexOf(\'#\')+1);
            //符合NORMAL_FILTER
            if (talkContent == null || talkContent.equals("")) {
                flag = false;
            }
            //符合DEEP_FILTER
            if (talkContent.equals("[图片]") && lotteryDrawRule.getFilterType().equals("DEEP_FILTER")) {
                deepNum = 1;
            }
        }
        if (!users.containsKey(userID) && flag) { // 如果该用户id未出现过且不需要过滤
            users.put(userID, deepNum); // 存入map
        }
        else if (deepNum > 0) {       //如果该用户满足深度过滤的要求,就保存他的言论次数,用于计算概率时降低它的获奖权值
            deepNum = (int) users.get(userID) + 1;
            users.put(userID, deepNum);
        }
    }

附加功能实现

附加需求功能

一、聊天记录数据分析

用户各时间段发言统计

整体分析用户各时间段的发言情况,统计每个用户各个时间段的发言次数,然后以柱形图形式展现,通过柱状图我们很容易得出用户在哪些时间段发言频率较高。

    def get_time(self):
        times = re.findall(r\'\d{2}:\d{2}:\d{2}\', self.data)#提取用户发言时间哪小时
        Xi = [time.split(":")[0] for time in times]
        sns.countplot(Xi, order=[str(i) for i in range(0, 24)])
        plt.plot()
        plt.rcParams[\'font.sans-serif\'] = [\'SimHei\']
        plt.title("各时间段发言统计")
        plt.xlabel("时间00:00—24:00")
        plt.ylabel("发言次数/次")
        plt.savefig(r"img\hour.png", format=\'png\')
        plt.close()

活跃用户的发言情况

局部分析前五名活跃用户的发言情况,统计每个用户的发言次数,然后进行排序提取前五个活跃用户的发言情况,然后以折线图的形式展现,通过折线图我们很容易发现这五个用户在哪些时间段发言频率较高。

    def get_active(self):
        str_list = re.findall(r\'\d{2}:\d{2}:\d{2} .*?\n\', self.data)
        chat = {}
        i = 0
        for string in str_list:#提取用户昵称及其发言的时间段分布
            size = len(string) - 1
            dict2 = {}
            if string[9:size] != "系统消息(10000)":
                if not chat.__contains__(string[9:size]):
                    i = i + 1
                    dict2[string[0:2]] = 1
                    chat[string[9:size]] = dict2
                else:
                    if not chat[string[9:size]].__contains__(string[0:2]):
                        chat[string[9:size]][string[0:2]] = 1
                    else:
                        chat[string[9:size]][string[0:2]] = chat[string[9:size]][string[0:2]] + 1
        dict3 = {}
        for key, dic in chat.items():#降序排序统计用户活跃情况
            count = 0
            for val in dic.values():
                count += val
            dict3[key] = count
        result = dict(sorted(dict3.items(), key=operator.itemgetter(1), reverse=True))
        colors = [\'red\', \'green\', \'blue\', \'orange\', \'black\']
        Xi = [str(k) for k in range(0, 24)]
        i = 0
        for key in result.keys():#遍历前五名活跃用户的发言情况
            if i >= 5:
                break
            Yi = []
            for j in range(0, 24):
                Yi.append(0)
            for key2 in chat[key].keys():
                Yi[int(key2)] = chat[key][key2]
            plt.plot(Xi, Yi, color=colors[i], label=key)
            i = i + 1
        plt.rcParams[\'font.sans-serif\'] = [\'SimHei\']
        plt.xticks(range(len(Xi)))
        plt.legend()
        plt.title("活跃用户统计")
        plt.xlabel("时间00:00—24:00")
        plt.ylabel("发言次数/次")
        plt.savefig(r"img\active.png", format=\'png\')
        plt.close()

分析聊天记录有效关键词

对用户聊天记录进行有效关键词提取与分析,然后对这些关键词进行整合分析,绘出词云图,通过词云图我们很容易得出,聊天记录中哪些关键词使用频率较高。

    def get_wordcloud(self):
        pattern = re.compile(r\'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} .*?\(\d+\)\n(.*?)\n\', re.DOTALL)
        contents = re.findall(pattern, self.data)
        word_list = []
        for sentence in contents:
            sentence = sentence.replace("[表情]", "").replace("[图片]", "").replace("@全体成员", "")
            if sentence != "" and not sentence.__contains__("撤回了一条消息") and not sentence.__contains__("加入本群。") and \
                not sentence.__contains__(\'长按复制此消息,打开最新版支付宝就能领取!\') and not sentence.__contains__(\'请使用新版手机QQ查收红.\'):
                word_list.append(" ".join(jieba.cut(sentence.strip())))
        new_text = " ".join(word_list)
        wordcloud = WordCloud(background_color="white",
                              width=1200,
                              height=1000,
                              min_font_size=50,
                              font_path="simhei.ttf",
                              random_state=50,
                              )
        my_wordcloud = wordcloud.generate(new_text)
        plt.imshow(my_wordcloud)
        plt.axis("off")
        wordcloud.to_file(r\'img\wordcloud.png\')

实验结果如下

  • PlusA.txt聊天记录数据分析


  • PlusB.txt聊天记录数据分析


二、绘画获奖名单海报

1、思路分析
通过接受服务器传来的获奖名单json数据,然后对json字符串进行相应的处理,提取出获奖者的昵称,QQ号或邮箱和奖品名称,然后对相应的模块进行绘画,生成海报图。

header = \'[云打印抽奖] QQ互动\'
title = \'2019年4月QQ互动获奖名单\'
chapter = [\'昵称\', \'QQ号\', \'奖品\']
string = \'恭喜以上获奖的同学,我们将在近期发出本次活动的奖励,请有获奖的同学注意关注本平台抽奖动态,感谢您的参与,谢谢!\'
n = 19
foot = [string[i:i + n] for i in range(0, len(string), n)]

# 设置字体和颜色
font_type = r\'font\my_font.ttc\'
header_font = ImageFont.truetype(font_type, 40)
title_font = ImageFont.truetype(font_type, 23)
chapter_font = ImageFont.truetype(font_type, 25)
email_font = ImageFont.truetype(font_type, 18)
list_font = ImageFont.truetype(font_type, 24)
foot_font = ImageFont.truetype(font_type, 20)
header_color = \'#FFFFFF\'
title_color = \'#EE0000\'
chapter_color = \'#CD3333\'
list_color = \'#EE2C2C\'
foot_color = \'#EE3B3B\'

# 设置图片
img = \'img/mode.png\'
new_img = \'img/scholarship.png\'  
image = Image.open(img)
draw = ImageDraw.Draw(image)
width, height = image.size

# header
header_x = 38
header_y = 880
draw.text((header_x, height - header_y), u\'%s\' % header, header_color, header_font)

# title
title_x = header_x + 30
title_y = header_y - 140
draw.text((title_x, height - title_y), u\'%s\' % title, title_color, title_font)

# chapter
chapter_x = title_x - 20
chapter_y = title_y - 40
draw.text((chapter_x, height - chapter_y), u\'%s\' % chapter[0], chapter_color, chapter_font)
draw.text((chapter_x + 140, height - chapter_y), u\'%s\' % chapter[1], chapter_color, chapter_font)
draw.text((chapter_x + 270, height - chapter_y), u\'%s\' % chapter[2], chapter_color, chapter_font)

# 获取student_list
data = sys.argv[1]
contents = data.split(\'\\r\\n\')
student_list = []
size = len(contents) - 1
for i in range(0, size):
    item = []
    if contents[i].__contains__(\'):\'):
        nick_name = re.findall(r\'(.*?)\(\', contents[i])
    elif contents[i].__contains__(\'>:\'):
        nick_name = re.findall(r\'(.*?)<\', contents[i])
    if contents[i].__contains__(\'):\'):
        qq = re.findall(r\'\((.*?)\)\', contents[i])
    elif contents[i].__contains__(\'>:\'):
        qq = re.findall(r\'<(.*?)>\', contents[i])
    reward = re.findall(r\':(.*?),\', contents[i])
    item.append(nick_name[0])
    item.append(qq[0])
    item.append(reward[0])
    student_list.append(item)
    
list_x = chapter_x - 20
list_y = chapter_y - 40
for student in student_list:
    for i in range(0, len(student)):
        if student[i].__contains__(\'@\'):
            draw.text((list_x + i * 140, height - list_y), u\'%s\' % student[i], list_color, email_font)
        else:
            draw.text((list_x + i * 140, height - list_y), u\'%s\' % student[i], list_color, list_font)
    list_y = list_y - 40
    
#footer
foot_x = chapter_x - 30
foot_y = list_y - 40
for i in range(0, len(foot)):
    foot_y = foot_y - 40
    draw.text((foot_x, height - foot_y), u\'%s\' % foot[i], foot_color, foot_font)
draw.text((chapter_x + 30, height - (foot_y - 40)), u\'%s(云打印)\' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), foot_color, foot_font)

image.save(new_img, \'png\')

2、实验结果如下


增加功能

邮件提醒

增加了对中奖学生的邮件提醒,通过处理聊天记录中的用户信息,获取用户的邮箱信息比如qq邮箱,实现对中奖用户的邮件提醒,提高用户的体验。

  • 基本实现
public class EmailUtil {
    // 发件人 账号和密码
    public static final String MY_EMAIL_ACCOUNT = "cy947205926@163.com";
    public static final String MY_EMAIL_PASSWORD = "**********";// 密码,是你自己的设置的授权码
    public static void send465(String subject,String content,String receiveEmail) throws AddressException, MessagingException {
        Properties p = new Properties();
        p.put("mail.smtp.ssl.enable", true);
        p.setProperty("mail.smtp.host", MEAIL_163_SMTP_HOST);
        p.setProperty("mail.smtp.port", "465");
        p.setProperty("mail.smtp.socketFactory.port", SMTP_163_PORT);
        p.setProperty("mail.smtp.auth", "true");
        p.setProperty("mail.smtp.socketFactory.class", "SSL_FACTORY");
        Session session = Session.getInstance(p, new Authenticator() {
            // 设置认证账户信息
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(MY_EMAIL_ACCOUNT, MY_EMAIL_PASSWORD);
            }
        });
        session.setDebug(true);
        MimeMessage message = new MimeMessage(session);
        // 发件人
        message.setFrom(new InternetAddress(MY_EMAIL_ACCOUNT));
        // 收件人和抄送人
        message.setRecipients(Message.RecipientType.TO, receiveEmail);
        // 内容(这个内容还不能乱写,有可能会被SMTP拒绝掉;多试几次吧)
        message.setSubject(subject);
        message.setContent("<h1>"+ content +"</h1>", "text/html;charset=UTF-8");
        message.setSentDate(new Date());
        message.saveChanges();
        Transport.send(message);
    }
}


遇到的困难及解决方法

  • 陈宇
    • 遇到的困难:java和python对接后端的时候出现了一些问题,部署服务器的时候遇到了一些浪费了比较多的时间。java调用shell命令出了点问题
    • 解决办法:查询相关资料。团队成员一起努力一起解决了。

  • 陈迎仁
    • 遇到的困难:
      • 正则表达式应用不熟悉,在对于文档的切割过程中,经常遇到一些切割错误;花费了较多的时间在对聊天记录的切割。
    • 解决办法:
      • 通过查询百度文档,学习郑重地表达式的基本语法,根据具体格式去寻找正则表达式的书写;与团队队友进行商量。

  • 陈诗娴
    • 遇到的困难:
      • 编程方面比较弱,算法单一,有很多不懂的
    • 解决办法:
      • 做力所能及的部分

  • 蔡森林
    • 遇到的困难:对于数据分析,自己从未接触过,不知道怎么使用python绘制图表;对前后端交互不是很懂;bug调试不是很熟练。
    • 解决办法:通过网上搜索有关python绘图知识,边模仿边践行,一步一步实现聊天记录的可视化图表,如柱形图,折线图,词云图和海报图;对于前后端的交互,主要通过接口实现,以json数据格式进行数据处理;慢慢积累调bug经验,培养独立解决问题的能力。

  • 蔡鸿键
    • 遇到的困难:
      • git bash使用不便,前后端数据传输不顺,JS参数传输遇到困难
    • 解决办法:
      • 依靠队友指导,大家一起测试寻找BUG,使用搜索引擎查询,多实践


马后炮

  • 陈宇

    • 如果我能力能在强一点,那么队友就能轻松一点

  • 陈迎仁

    • 如果我学java后端的进度能更快一点,那么这次我就能独自实践Java后端开发以及服务器的搭建了,实现我所渴望的技术。

  • 陈诗娴

    • 如果我的代码能力能强一点,那么就能为团队做更多事。

  • 蔡森林

    • 如果我能提前好好学python,那么我将能为我的团队做得更多

  • 蔡鸿键

    • 如果好好学习,那么就没什么BUG要解决了


PSP表格

陈宇

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 20
Estimate 估计这个任务需要多少时间 10 10
Development 开发 200 320
Analysis 需求分析 (包括学习新技术) 60 120
Design Spec 生成设计文档 0 0
Design Review 设计复审 0 0
Coding Standard 代码规范(为目前的开发制定合适的规范) 20 30
Design 具体设计 0 0
Coding 具体编码 160 210
Code Review 代码复审 20 60
Test 测试(自我测试,修改代码,提交修改) 30 120
Reporting 报告 30 40
Test Repor 测试报告 0 0
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 15 20
合计 575 960

陈迎仁

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 10
Estimate 估计这个任务需要多少时间 10 10
Development 开发 160 220
Analysis 需求分析 (包括学习新技术) 60 150
Design Spec 生成设计文档 0 0
Design Review 设计复审 0 0
Coding Standard 代码规范(为目前的开发制定合适的规范) 5 5
Design 具体设计 0 0
Coding 具体编码 120 160
Code Review 代码复审 30 80
Test 测试(自我测试,修改代码,提交修改) 40 140
Reporting 报告 40 120
Test Repor 测试报告 0 0
Size Measurement 计算工作量 10 10
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 15 20
合计 500 925

陈诗娴

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 5 10
Estimate 估计这个任务需要多少时间 0 0
Development 开发 60 60
Analysis 需求分析 (包括学习新技术) 20 40
Design Spec 生成设计文档 0 0
Design Review 设计复审 0 0
Coding Standard 代码规范(为目前的开发制定合适的规范) 0 0
Design 具体设计 60 60
Coding 具体编码 60 60
Code Review 代码复审 10 10
Test 测试(自我测试,修改代码,提交修改) 10 15
Reporting 报告 10 15
Test Repor 测试报告 0 0
Size Measurement 计算工作量 0 0
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 10 10
合计 245 280

蔡森林

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 60
Estimate 估计这个任务需要多少时间 150 300
Development 开发 120 300
Analysis 需求分析 (包括学习新技术) 40 100
Design Spec 生成设计文档 20 40
Design Review 设计复审 30 100
Coding Standard 代码规范(为目前的开发制定合适的规范) 10 20
Design 具体设计 40 80
Coding 具体编码 120 300
Code Review 代码复审 30 150
Test 测试(自我测试,修改代码,提交修改) 30 90
Reporting 报告 20 20
Test Repor 测试报告 20 10
Size Measurement 计算工作量 15 30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计 775 1640

蔡鸿键

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 30 30
Estimate 估计这个任务需要多少时间 120 300
Development 开发 120 300
Analysis 需求分析 (包括学习新技术) 40 80
Design Spec 生成设计文档 20 20
Design Review 设计复审 20 120
Coding Standard 代码规范(为目前的开发制定合适的规范) 10 20
Design 具体设计 30 60
Coding 具体编码 120 300
Code Review 代码复审 30 120
Test 测试(自我测试,修改代码,提交修改) 30 60
Reporting 报告 20 20
Test Repor 测试报告 20 10
Size Measurement 计算工作量 15 30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 20 40
合计 645 1510


Alpha代码规范、冲刺任务与计划

团队名称: 云打印
作业要求: Alpha代码规范、冲刺任务与计划
作业目标:代码规范、冲刺任务与计划。

团队队员

队员学号 队员姓名 个人博客地址 备注
221600412 陈宇 http://www.cnblogs.com/chenyuu/ 队长
221600411 陈迎仁 https://www.cnblogs.com/yinen/
221600409 蔡森林 https://www.cnblogs.com/csl8013/
221600401 陈诗娴 https://www.cnblogs.com/orangepoem/
221600408 蔡鸿键 https://www.cnblogs.com/jichiwoyaochi/

代码规范

后端采用Springboot编写 java代码规范我一直是用阿里云java开发手册上的要求。(有些浏览器可能不支持pdf在线预览,那就只能直接下载,我正常使用的都是Google浏览器)
阿里巴巴Java开发手册纪念版.pdf在线预览

代码规范参考阿里巴巴Java开发手册纪念版:

一、命名风格

【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
反例:name / name / $name / name / name$ / name
【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免采用。国际通用的名称,可视同英文。
反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3
【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。
正例:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion
反例:macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion
【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式。
正例: localValue / getHttpMessage() / inputUserId
【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。
正例:MAX_STOCK_COUNT
反例:MAX_COUNT
【强制】抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类 命名以它要测试的类的名称开始,以 Test 结尾。
【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。
正例:应用工具类包名为 com.alibaba.ai.core.util、类名为 MessageUtils(此规则参考 spring 的框架结构)
【强制】杜绝完全不规范的缩写,避免望文不知义。
反例:AbstractClass“缩写”命名成AbsClass;condition“缩写”命名成 condi,此类随 意缩写严重降低了代码的可阅读性。
【推荐】为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。
正例:在 JDK 中,表达原子更新的类名为:AtomicReferenceFieldUpdater。
反例:变量 int a 的随意命名方式。

二、代码格式

【强制】大括号的使用约定。如果是大括号内为空,则简洁地写成{}即可,不需要换行;如果是非空代码块则:
左大括号前不换行。
左大括号后换行。
右大括号前换行。
右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。
【强制】if/for/while/switch/do 等保留字与括号之间都必须加空格。
【强制】采用 4 个空格缩进,禁止使用 tab 字符。

三、注释规约

【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用/**内容/格式,不得使用 // xxx 方式。
说明:在 IDE 编辑窗口中,Javadoc 方式会提示相关注释,生成 Javadoc 可以正确输出相应注释;在 IDE 中,工程调用方法时,不进入方法即可悬浮提示方法、参数、返回值的意义,提高阅读效率。
【强制】所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能。
说明:对子类的实现要求,或者调用注意事项,请一并说明。
【强制】所有的类都必须添加创建者和创建日期。
【强制】方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释 使用/
*/注释,注意与代码对齐。
【强制】所有的枚举类型字段必须要有注释,说明每个数据项的用途。
【推荐】与其“半吊子”英文来注释,不如用中文注释把问题说清楚。专有名词与关键字保持英文原文即可。
反例:“TCP连接超时”解释成“传输控制协议连接超时”,理解反而费脑筋。
【推荐】代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。
说明:代码与注释更新不同步,就像路网与导航软件更新不同步一样,如果导航软件严重滞后,就失去了导航的意义。

前端代码规范

1、变量名称用先小写后大写命名,如:maxStudy
2、先后端数据变量一致使用后端命名方式
3、若在小范围的命名变量中使用三个字母的命名,如:msg
4、避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的静态变量来代替。
5、不要使用难懂的技巧性很高的语句,除非很有必要时。说明:高技巧语句不等于高效率的程序,实际上程序的效率关键在于算法。
6、css、js语句代码后加“ ; ”断句
7、使用空行来分割逻辑

冲刺任务与计划(含冲刺总结)

任务 内容 时间
第一天 阅读代码规范,安装相应的环境 4.24
第二天 完成微信小程序登录授权 4.25
第三天 完成微信小程序上传文件 4.26
第四天 完成后台计算页数 4.27
第五天 学习微信支付接口 4.28
第六天 完成小程序微信支付接口 4.29
第七天 后端和小程序和微信支付对接 4.30
第八天 完成商家端接单和查看订单 5.1
第九天 整合代码,测试程序 5.2
第十天 发布Alpha版本程序 5.3
第十一天 发布一篇冲刺总结随笔,描述项目预期计划、现实进展、过程体会、组员分工及在Alpha阶段的工作量比例、下阶段展望。 5.4

项目Alpha冲刺(团队1/10)

团队名称: 云打印
作业要求: 项目Alpha冲刺(团队)
作业目标: 完成项目Alpha版本

团队队员

队员学号 队员姓名 个人博客地址 备注
221600412 陈宇 http://www.cnblogs.com/chenyuu/ 队长
221600411 陈迎仁 https://www.cnblogs.com/yinen/
221600409 蔡森林 https://www.cnblogs.com/csl8013/
221600401 陈诗娴 https://www.cnblogs.com/orangepoem/
221600408 蔡鸿键 https://www.cnblogs.com/jichiwoyaochi/

各成员情况

  • 陈宇(组长)

    • 昨天完成了哪些任务
      • 完成了Alpha代码规范、冲刺任务与计划
      • 完成任务安排
      • 休整了团队
    • 今天任务
      • 阅读代码规范,安装相应的环境
      • 帮助队友安装相关环境;
      • 规划日程、任务
    • 有哪些困难
      • 搭建Springboot环境遇到了一些小问题
      • 对敏捷开发的规划、设计方式不熟悉
    • 有哪些收获
      • 查阅百度并学习了相应的方法

  • 陈迎仁

    • 昨天完成了哪些任务
      • 阅读了任务要求,安排了开发周期任务
    • 今天任务
      • 确定代码规范。
      • 安装IDE:微信web开发者工具
      • 熟悉IDE
    • 有哪些困难
      • 第一次接触微信小程序开发,对于一些工具及其文档不熟悉
    • 有哪些收获
      • 学会使用微信小程序的开发工具

  • 陈诗娴

    • 昨天完成了哪些任务
      • 学习java
      • 确认团队分工
    • 今天任务
      • 学习java
      • 阅读代码规范
      • 安装相应的环境
    • 有哪些困难
      • 环境搭建的时候遇到了问题
    • 有哪些收获
      • 意识到一开始就明确自己要做什么很重要
      • 学会了如何搭建Springboot环境

  • 蔡森林

    • 昨天完成了哪些任务
      • 接受组长任务调配
      • 与组员讨论分工
    • 今天任务
      • 安装相应的开发工具和环境
      • 计划分工任务
    • 有哪些困难
      • 安装环境出错
    • 有哪些收获
      • 百度解决环境搭建问题

  • 蔡鸿键

    • 昨天完成了哪些任务
      • 阅读了任务要求
    • 今天任务
      • 确定代码规范。
      • 安装IDE:phpstrom
      • 熟悉IDE
    • 有哪些困难
      • 对英文环境有些困难
    • 有哪些收获
      • 熟悉了PHPstrom

站立式会议照片


项目燃尽图


冲刺情况描述

项目进展

阅读代码规范,大家一起安装好相应的环境,规划好每个人的任务

问题困难

第一次安装环境遇到了好多问题,大家对敏捷开发的规划、设计方式也都不太熟悉

心得体会

已经安装好环境,可以准备着手开发了,希望不要经常熬夜

项目Alpha冲刺(团队2/10)

团队名称: 云打印
作业要求: [项目Alpha冲刺(团队)](https

分类:

技术点:

相关文章: