基于拼团基本模式功能开发的一个AA拼团系统

第1章 绪论

1.1 引言

随着经济快速发展,人民的精神生活日益丰富,对健康的意识也提高了,因此参加活动的意愿十分强烈。在此基础上,我们小组选择了拼团系统的制作和学习,借此锻炼我们的实际问题分析解决和团队协作能力。

1.2 研究内容

拼团--团队活动AA 制

1.2.1 组团

(1)团长创建(组建) 团队并发布活动消息(时间、起点、主要内容等);

(2)加入团员(团员申请参加活动);

(3)(团长)确定团队成立,并通知参与人;

(4)确定团队活动的起始时间,交纳团费(可多次交纳);

1.2.2 团队活动

(1)每次团队活动记录参加人员,活动费用参与人员均摊;

(2)活动过程中根据需要追加AA 费用,也支持某团员独立追加费用;

(3)活动结束,计算团队成员分推费用;

(4)支持输出帐单,并导出到EXCEL 表格中。

(5)活动结束,生成活动报告。

1.2.3 开发工具

(1)后端采用MVC设计模式,使用SpringBoot+MyBatis plus框架,数据库采用MySQL;

(2)前端采用Bootstrap,视图界面美观;

(3)使用Docker进行部署;

(4)系统运行以微服务的方式运行,微服务框架采用Spring Cloud

(5)系统项目源码通过git进行管理;

第2章 需求分析

2.1 业务流程分析

2.1.1 基于实验需求的业务分析

⑴ 组团

团长创建新团,编辑团队信息,需要一个创建活动页面,提供信息填写与提交。团员申请参加活动需要在首页活动列表增加一个参加活动按钮,触发后添加团员信息到参团记录表。

⑵ 团队活动

在导航栏加入参团记录,实现每次团队活动记录参加人员,在团长的管理活动页面添加活动起始按钮以及账单生成按钮,实现AA制。成员可以在管理活动页面(仅参加的活动)独立追加团费,追加费用计入总费用和AA计算,团长结束活动后,打印生成活动报告和账单明细。

2.1.2 业务流程图及其说明

系统结构图

流程说明:首先以游客身份进入系统,可预览团队信息,当用户登录(注册,登录)账户后,可进入拼团系统首页,普通团员有3种操作,分别是:①加入团队:可以看到已创建的团队活动,可以选择加入团队;②创建团队:自己成为团长,输入团队信息创建,获得管理活动权限;③管理团队:创建团队自动成为团长,管理团队只能管理自己创建的团队,获得修改、结束活动,打印活动报告和账单权限;④缴纳团费:可以为自己缴费也可以追加团费,缴费后可以通过AA制导出活动账单到Excel。

2.2 系统用例分析

系统用例图

第3章 概要设计

3.1 总体架构

3.1.1 总体架构图

系统总体架构图

3.2 项目结构

3.2.1 项目结构图

项目结构图

src/main/java结构说明

common 存放公共的常量类,自定义异常

config 存放配置类,相当于xml配置文件

controller 存控制器,负责接收http请求,转发请求,封装业务数据

entity存实体类, 用lombok插件生成set get方法

mapper 数据接口访问层DAO文件

service 存业务接口service/impl下存放实现类

utils存工具类

Application.java是系统的启动类

src/main/resources下存放配置文件其中

application.yml是主要配置文件

webapp/page存放jsp页面

webapp/static是存放js ,css ,图片等静态资源的

3.2.2 项目实现功能

用户注册登录:

login.jsp是登陆页面,用户输入用户名密码进行登录,没有账户的用户点击注册跳转到register.jsp,进行注册,注册成功会自动跳转到登录页面。

加入团队:

team/list.jsp里布置了参加活动按钮,点击即可参与。

创建团队:

选择导航栏的创建活动,输入相关信息提交即可创建。

管理活动:

manage.jsp页面提供修改活动、确定活动、结束活动、生成报告、帐单列表、追加费用按钮实现相应功能。

参团列表:

joinRecord/list.jsp页面展示参团人员记录。

AA制团费:

bill.list页面展示账单明细并提供导出excel按钮。

账单导出excel:

BillController进行跳转实现本地下载。

3.2.3 总体流程

新用户注册后进行登录,老用户输入用户名/手机号进行登录,进入系统界面后可以选择团队加入,也可创建新的团队,成为新团的团长,拥有修改团队信息、生成活动报告、账单等权限,所有团员都可通过参团记录查看各人的拼团情况。活动刚成立处于新建状态,由团长决定活动开始时间和结束时间,活动结束后可生成活动账单,查看AA费用,团员进行缴纳,并支持团长和团员独立追加费用,活动结束后可退出系统。

第4章 数据库设计

4.1  数据库选型

4.1.1  几种数据库比较

随着数据库管理系统技术的成熟,目前比较流行的数据库有MySQL、SQL Server、Oracle、Sybase等,而我们本次设计所使用的MySQL,它是最受欢迎的开源SQL数据库管理系统。MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键人物、重负载生产系统的使用,也可以将它嵌入到一个大配置的软件中去。而与其他的数据库相比较,MySQL有如下的一些优点:

1)MySQL是一个关系数据库管理系统

2)MySQL是开源的

3)MySQL服务器是一个快速的、可靠的和易于使用的数据库服务器

4)MySQL服务器工作在客户/服务器或嵌入系统中

5)有大量的MySQL软件可以使用

4.1.2  MySQL数据库

MySQL是一个完全免费的数据库系统,是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

4.1.3 数据库安全

我们采用MD5实现数据库用户表密码的单项加密,先将原来的数据变成一个16个字节的数组,然后将这个长度为16的字节数组用16进制表示,这个16进制的字符串就是加密最后的结果。

MD5加密

4.2 数据库设计

数据库ER图

表4.1 用户表

表名用户表 user
说明记录用户的身份信息以及对系统的相关设置
字段名数据类型是否为空是否为主键说明
idINTEGERNY用户唯一标志号
usernameVARCHAR(50)YN用户昵称
passwordVARCHAR(255)YN用户密码
real_nameVARCHAR(50)YN用户真实姓名
phoneVARCHAR(255)YN用户的电话号码
roleINTEGERYN用户是否为管理员

表4.2 团队表

表名团队表team
说明所选团队信息
字段名数据类型是否为空是否为主键说明
idINTEGERNY团队
team_nameVARCHAR(50)YN团队名称
team_leaderINTEGERYN团长的id
start_timeVARCHAR(50)YN开始时间
end_timeVARCHAR(50)YN结束时间
stateINTEGERYN团队建立状态
costDECIMAL(10,2)YN团队总消费

表4.3 参团记录表

表名用户表 join_record
说明参团人员记录
字段名数据类型是否为空是否为主键说明
idINTEGERNY用户唯一标志号
team_idINTEGERYN团队序号
user_idINTEGERYN用户序号

表4.4 账单表

表名bill
说明账单
字段名数据类型是否为空是否为主键说明
idINTEGERNY用户唯一标志号
user_idINTEGERYN用户昵称
team_idINTEGERYN团队名称
costDECIMAL(10,2)YN费用
remarkVARCHAR(255)YN备注

第5章 详细设计

5.1 数据访问层设计

表的操作(CURD):

项目利用MybatisPlus简化开发,启动即会注入基本CURD,直接面向对象操作,MP内置通用mapper、通用service,每个service都继承IService,在IService里定义了各种方法,帮助我们用少量配置实现大部分CURD操作。

我们只需要创建TeamMapper、UserMapper等接口,并继承BaseMapper接口,不需要创建SQL映射文件。

5.2 表示层设计

(1)登录注册页面设计

创建一个login的jsp页面,在里面添加一个form表单,在里面设计用户名、密码输入文本框,同时也可以采用手机号登录,以及登录跳转按钮,再添加一个注册用户信息的模态框。

<form style="margin<form style="margin-top: -30px;">
   <center><h4>登录</h4></center>
   <input type="text" id="username" class="form-control uname" placeholder="用户名" value=""/>
   <input type="password" id="password" class="form-control pword m-b" placeholder="密码" value=""/>
   <input type="button" value="登录" class="btn btn-primary btn-block" οnclick="login()"></input>
                   <a href="/signup">注册</a>
</form>
<form style="margin-top: -30px;">
   <center><h4>登录</h4></center>
   <input type="text" id="phone" class="form-control uname" placeholder="手机号" />
   <input type="password" id="password2" class="form-control pword m-b" placeholder="密码" />
   <input type="button" value="登录" class="btn btn-primary btn-block" οnclick="loginByPhone()"></input>
                   <a href="/signup">注册</a>
</form>

(2)创建活动页面设计

在页面展示的中间有一个创建活动的按钮,点击则跳转到创建活动的信息输入页面,通过输入活动名称,费用,开始时间,结束时间,点击提交按钮则创建成功。

<input type="text" placeholder="活动名称" class="form-control" name="teamName" id="teamName" value="${data.teamName}">
<input type="text" placeholder="费用" class="form-control" name="cost" id="cost" value="${data.cost}">
<input type="text" placeholder="开始时间" class="form-control" name="startTime" id="startTime" value="${data.startTime}">
<input type="text" placeholder="结束时间" class="form-control" name="endTime" id="endTime" value="${data.endTime}">
<button class="btn btn btn-sm btn-primary" id="btn">提交</button>

(3)参团记录页面设计

在页面展示的右边有一个参团记录的按钮,点击则跳转到参团记录页面,该页面可以看见活动ID,活动名称,以及团员姓名,同时表格的右上方也有刷新按钮,可以实时查看参团记录。

  <div class="table-responsive">
             <table id="table">
             </table>
    </div>

(4)活动列表页面设计

在页面展示的左边有一个活动列表的按钮,点击则跳转到活动列表页面,该页面可以查看活动ID,活动名称,费用,开始时间,结束时间以及状态,同时也可以进行参加活动这一操作,表格的右上方也有着刷新按钮,确保活动的最新情况。

同(3),自适应表格。

(5)管理活动页面设计

该页面在活动列表的操作基础上新增了修改活动,确定成立,结束活动,生成报告,账单列表,追加费用等功能,同时也包含着刷新按钮,以此确保活动的最新情况。

events: {               // 注册按钮组事件
    'click #edit': function (event, value, row, index) {
        edit(row.id)
    },
    'click #setup': function (event, value, row, index) {
        updateState(row.id, 2)
    },
    'click #finish': function (event, value, row, index) {
        updateState(row.id, 3)
    },
    'click #appendCost': function (event, value, row, index) {
        appendCost(row.id)
    },
    'click #genReport': function (event, value, row, index) {
        genReport(row.id)
    },
    'click #billList': function (event, value, row, index) {
        billList(row.id)
    },
    'click #excel': function (event, value, row, index) {
        excel(row.id)
    }
}

5.3 业务逻辑层设计

(1)用户登录

login.jsp发送请求通过@PostMapping("/login")找到CommonController的login方法,用mybatisplus提供的方法查询用户表,把查询结果放到httpSession里,方便页面使用。

(2)加入团队

用户登陆进入系统后,点击“参加活动”按钮,该成员会自动加入到团队中,并将用户的信息保存到join_record表中,在JoinRecordController中添加注解,把用户提交的请求通过对url的匹配,分配给List,进行处理并返回结果。

(3)创建团队

用户点击创建团队跳转到teamAdd.jsp,输入新团队相关信息进行创建。

(4)管理团队

用户只可以对自己创建的团队进行信息修改和数据查看,TeamController中根据函数需要的url返回操作成功的消息或者无权操作的提示或者访问对应jsp文件。

(5)AA缴费

请求通过 @PostMapping("team/updateState")找到TeamController的updateState方法,业务是判断把团队状态修改为结束时,用总团费除以总人数,得到AA制每人的团费,存到账单表。

(6)账单导出

在进入帐单列表界面后,点击导出账单,在BillController中进行跳转,实现本地账单下载。请求通过@GetMapping("/bill/exportExcel")找到BillController的exportExcel方法,先查出该团队的账单list,然后设置keys(字段名数组),columnNames(excel表头),两者是一一对应的,然后循环账单list, 填充表格,然后调用ExcelUtil.downloadExcel方法导出excel,底层是通过调用apache的POI组件实现的。

5.4团队合作设计过程实现(git进行下的版本管理)

计划利用git进行项目的版本管理,专项负责人已掌握通过vscode进行git的分支管理技术,例如git branch xx(创建分支) , git checkout xx(切换分支), git mergexx(项目合并)等操作.因为部分组员在git官网下载的64位版本被系统识别不适用,且尝试与组长沟通解决未果,所以本团队共同商议决定统一将自己实现的部分上交组长,由组长试运行检验,接着通过腾讯会议将已完成部分交付组员并部署下一步各自任务,让团队可以通过共同讨论,参与,实现前后端的功能衔接,最终分别于7.4,7.7,7.9发布三个版本的项目(最终链接已附在目录下方)。为弥补本团队因特殊原因无法完美实现git版本管理功能的遗憾,本团队对此项目的开发进行了开发日志管理,下附开发日志。

日志

第六章 测试报告

6.1 功能检验

(1)登录页面

登录页面

⑵ 注册页面

注册页面

(3) 系统首页

系统首页

(4) 团长页面

团长页面

(5) 团员页面

团员页面

不是自己加入的团:

不是自己加入的团

(6) 创建团队页面

创建团队页面

创建团队页面

(7) 开始/结束活动页面

开始活动页面

结束活动页面

(8) 追加费用页面

追加费用页面

追加费用页面

(9) 缴费页面

缴费页面

(10) AA制账单页面

AA制账单页面

(11) 数据库密码安全页面

数据库密码安全页面

(12) 导出excel页面

导出excel页面

结 论

1、任务完成情况

(1)登陆注册功能都可以实现

(2)团长能够创建活动,但是没有实现通知团员功能

(3)团员可以申请加入活动

(4)缴纳团费,模拟缴费,AA制缴费均以实现

(5)用户可以参加多个活动,且每次团队活动记录参加人员

(6)成功实现将活动账单导入到Excel表格中

(7)活动结束后可以生成活动报告

(7)未能实现Docker部署和以微服务方式运行

2、问题总结

[CR]:

(1)需求分析环节未提前考虑到对团员隐私的保护,虽然考虑到了非拼团创建者无权改变团队活动的状态,但是对生成报告的功能未进行合理保护

(2)docker已实现将项目部署上传到我们租借的阿里云服务器,但是未能成功运行springboot项目,已尝试百度常用解决办法(关闭防火墙,重启docker,修改登录拦截器)最终依旧未能实现运行,采用本地localhost运行。

img

img

(3)考虑到指导老师于7号提出的建议,特决定对用户表的password实现保护,即采用md5技术实现对其单向加密。

(4)关于git的版本管理,我们进行了三次大更新,分别完善了其前端页面,AA机制等已上传到github

[XY]:

(1)对于MyBatis—Plus的熟悉程度不够,花费一些时间在狂神说上学习了MP后,了解了其中的一些基础。

(2)对MySQL的认知更深刻了,对其存储、索引、优化等方面都有了一定的掌握。

(3)经过这次实验,对于MyBatis—Plus的强大功能有了更深层次的认识,采用Maven插件快速生成了Mapper、Model、Service、Controller代码,使用起来相较MyBatis而言更加便捷。

[XH]:

(1)Springboot框架不够熟练,花费大量时间在熟悉框架上,致使项目开发匆忙;

(2) 使用Spring boot报错时,难以定位问题所在;

(3) 项目的数据传输较为复杂,我经常弄混或忘记;

(4) 新学习到了导出账单的功能实现;

(5) 协助编写前端也让我学到很多,例如thymeleaf,提高了页面、代码的复用性,以及对 jQuery的ajax方法的熟悉;

(6) 经过这次项目,对SpringBoot+MybatisPlus整合更加熟悉,配置文件的减少,让我体验到了效率的提高。

[XLJ]:

(1)jQuery的ajax方法不熟悉,所以花费了大量的时间进行准备,以此来完成本次实践项目的前端开发

(2)表格使用了bootstrapTable,也是通过网上资料的查阅与学习,一步步来进行前端的开发

(3)在配置弹窗时用到了layer.js方面的知识,通过自身的学习以及组员之间的相互讨论,最终完成了前端的开发。

项目源码地址:https://github.com/ChengRui79/pintuanAA-version3.0.git

部署服务器url:http://47.110.34.43/

参 考 文 献

[1] 黑马程序员编著. Java EE企业级应用开发教程[M]. 人民邮电出版社 2017年

[2] 详细SpringBoot教程之入门[ED/OL]:http://t.csdn.cn/aqMNh

[3] Springboot,SSM及SSH的概念、优点、区别及缺点[ED/OL]: http://t.csdn.cn/s4Vbw

[4] Springboot+Mybatis+EasyPOI 进行对MySQL数据库内表进行导入导出[ED/OL]: http://t.csdn.cn/M0R2t

[5] SpringBoot开发单体应用[ED/OL]: http://t.csdn.cn/qVn4P

[6] mybatis-plus超详细讲解[ED/OL]: http://t.csdn.cn/We21U

[7] MyBatisPlus最新完整教程通俗易懂:

12、逻辑删除_哔哩哔哩_bilibili

[8] 130SSM阶段实战-实战-登录-MD5加密1[ED/OL]: 130SSM阶段实战-登录-MD5加密1_哔哩哔哩_bilibili

[9] MD5[ED/OL]: http://t.csdn.cn/pnpjt

[10] docker常用命令大全[ED/OL]: https://www.cnblogs.com/qq-965324258/articles/14911469.html

  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Antidote 

欢迎打赏,给点动力呀大佬们

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值