[T.12] 团队项目:Alpha阶段项目展示
项目与团队亮点
成员分工与协作
| 成员 | 分工 | 说明 |
|---|---|---|
| 饶晨烜 | 后端+运维 | 搭建后端整体架构和主要功能,负责系统部署和运维 |
| 高子贺 | Web端+后端 | 管理员后端接口开发,独立负责管理员网页端开发 |
| 安琦 | 后端 | 博雅系统开发 |
| 袁耀武 | 小程序端 | 微信小程序前端开发,负责微信小程序发布 |
| 丁子航 | 小程序端 | 微信小程序前端开发 |
| 张珺强 | 小程序端 | 微信小程序前端开发 |
项目整体采用前后端分离和微服务的思想进行开发,小组成员在确定接口后独立开发,定期进行系统联调推进项目进展。
- 通过Apifox进行接口管理和功能测试,进行前后端和微服务内部联调
- 通过飞书进行项目进度管理,分配开发任务,进行Bug管理和修复
- 后端通过nacos将Django接入Spring框架,提高开发效率和并行度
在完成代码后推送到仓库后,通过Github的workflow触发CI/CD,进行自动化测试,然后打包为Docker镜像推送到仓库中,服务器拉取镜像启动容器,提高交付效率。
用户场景
场景1:竞赛组队
- 用户:计算机学院大二同学小A
- 需求:寒假要参加冯如杯,小A已经有选题但没有找到队友,希望有2-3名同学参与
- 解决方案:通过搭伙儿小程序,在竞赛板块下发起组队
场景2:小组作业组队
- 用户:计算机学院大三同学小B
- 需求:在数据库课程设计中,需要三人组队进行Web项目开发,小B擅长后端开发,想找两位了解前端开发的同学组队
- 解决方案:通过搭伙儿小程序,在课程板块下发起组队。为了匹配队友,小B在【我的】页面选择【兴趣】,填写自己擅长的后端技术,系统可以据此推荐适合的同学。
场景3:生活中找搭子
- 用户:士谔书院大一同学小C
- 需求:小C喜欢打羽毛球,初入大学,小C想要找一个同学每周三下午一起打球
- 解决方案:小C可以在生活板块下搜索羽毛球,找到目前适合的队伍,并发起申请。在通过后,系统会推送消息,小C可以和队伍成员联系。
系统发布
我们通过微信群聊推广小程序,以校园小工具为亮点,吸引了第一批用户。
受五一期间微信小程序审核较慢影响,我们在测试阶段修复Bug后的版本未能及时通过审核,部分功能前端与最新后端版本不匹配,功能存在问题,第一批发布受到了影响。
杀手级功能
组队系统集成北航课表
为了实现更加精准的课程组队匹配,我们的系统集成了用户课表。在beta阶段中,在用户发起课程模块下的组队时,可以在课表中选择一门课作为组队课程,用户在搜索队伍时,也可以选择自己课表中的一门课进行搜索。
校内身份检查
在Alpha阶段,部分功能处于测试状态,为遵守“上网不涉密,涉密不上网”,我们对用户身份进行了严格检查。
一方面,后端在网关对用户网络状态进行了校验,只有在连接北航校园网后才可以访问。另一方面,部分功能需要验证学号,通过北航邮箱接收验证码后激活身份后才可以使用。

集成校园小工具
我们在Alpha阶段的目标用户群体主要是北航同学,为了提高系统的活跃用户数,我们集成了课程助手和博雅助手等校园工具。

软件工程质量
开发规范
后端开发制定了技术文档,规定了微服务架构下的开发方式和数据库设计规范。所有的身份校验、鉴权、负载均衡都在gateway完成,业务服务内部通过请求头传递当前用户信息,各个微服务之间通过OpenFeign和消息队列相互调用。数据库设计至少要满足3NF,在查询数据时尽可能避免联表查询,使用联合索引时需要遵守最左原则。
前端发出的所有请求,必须进行封装,开发时只能调用封装后的方法,对于浏览器出现非2xx的非异常状态码统一处理,当返回2**状态码但后端的code为0时,需要展示后端返回的msg字段。
测试
在开发阶段,后端对核心功能进行了单元测试,在接口完成后,使用Postman对接口进行测试。
在测试阶段,我们使用jmeter对项目进行了压力测试,发现了高并发场景下的线程安全问题。


前端使用Mock技术模拟请求结果,结合手工操作进行测试。
CI/CD
后端和Web端采用了CI/CD进行自动化测试和部署。
- 当后端代码提交到dev分支后,触发CI/CD流程,将代码打包成Docker镜像并推送到镜像仓库。之后,服务器从仓库中拉取镜像,启动容器完成部署过程。
- 当Web端代码提交后,会触发CI/CD流程,将代码打包成dist文件后上传到服务器中nginx配置的路径下,并重启nginx,完成部署过程。
项目与团队总结
项目管理
开发流程
我们配置了两套环境:开发环境dev和生产环境prod,服务器同时运行两套环境并进行隔离。
仓库的主分支main用于生产环境,所有提交到main的代码都会构建并部署到生产环境。开发者不允许直接提交代码到main分支,只可以从dev上发起PR将代码合并到main上。
对于开发环境,请求的baseUrl为https://joinup.org.cn/api-dev ;生产环境,请求的baseUrl为 https://joinup.org.cn/api 。
项目整体采用前后端分离和微服务的思想进行开发,小组成员在确定接口后独立开发,定期进行系统联调推进项目进展。
- 通过Apifox进行接口管理和功能测试,进行前后端和微服务内部联调
- 通过飞书进行项目进度管理,分配开发任务,进行Bug管理和修复
- 后端通过nacos将Django接入Spring框架,提高开发效率和并行度
在完成代码后推送到仓库后,通过Github的workflow触发CI/CD,进行自动化测试,然后打包为Docker镜像推送到仓库中,服务器拉取镜像启动容器,提高交付效率。
成员介绍
| 成员 | 介绍 | 个人博客地址 |
|---|---|---|
| 饶晨烜 | 我是魔精员工 | https://www.cnblogs.com/cx-rao |
| 高子贺 | 你知道我要说什么 | https://www.cnblogs.com/aron00123 |
| 安琦 | 可以写一辈子软件工程吗? | https://www.cnblogs.com/bbbbbbbbb |
| 袁耀武 | Always keep a beginner's mind! | https://www.cnblogs.com/saltfishDreamer |
| 丁子航 | 我在软工里,感觉很平静 | https://www.cnblogs.com/DingZihang |
| 张珺强 | 哦耶,坚坚的果! | https://www.cnblogs.com/oyjgq |
团队贡献
| 成员 | 角色 | 贡献分 | 说明 |
|---|---|---|---|
| 饶晨烜 | PM+后端开发+运维 | 77.5 | 独立负责搭建开发、测试、生产环境的CI/CD;独立负责服务器日常维护和项目部署;完成后端微服务框架搭建,开发系统主要功能,编写接口文档;完成部分PM工作并组织系统联调,解决Bug。 |
| 安琦 | 后端开发 | 50.5 | 独立完成基于Django的爬虫开发,并解决通过nacos接入微服务的难题,编写接口文档。 |
| 高子贺 | 后端开发+Web端 | 55 | 独立完成管理员Web端开发;独立完成管理员后端接口开发。 |
| 袁耀武 | 小程序端 | 50 | 负责微信小程序开发,参与技术选型,完成小程序审核和发布工作。 |
| 丁子航 | 小程序端 | 38.5 | 参与微信小程序开发。 |
| 张珺强 | 小程序端 | 28.5 | 参与微信小程序开发。 |
说明:每个人的贡献分由三部分组成:Base(30分,只要完成最基本开发任务即可拿满)+文档分+奖励分
其中,根据完成的文档工作量获得文档分,文档分之和为40分;奖励分需要超额完成工作,参与核心技术选型与调研,解决重大问题获得,共计80分,所有人根据实际工作量分配。
下图是从T2到T12共11次文档的完成情况,其中T9例会不参与文档分数计算。

下图是后端核心仓库的代码提交情况和Github Action触发情况。


下图是管理员Web端代码仓库的提交情况:

产品功能
发帖组队
在面对日常的学习、生活中组队、“找搭子”的需求,本产品提供了便捷的发帖平台,用户间可以通过帖子组建队伍、结识新伙伴,更加便捷的享受生活。
组队系统集成北航课表
为了实现更加精准的课程组队匹配,我们的系统集成了用户课表。在beta阶段中,在用户发起课程模块下的组队时,可以在课表中选择一门课作为组队课程,用户在搜索队伍时,也可以选择自己课表中的一门课进行搜索。
校内身份检查
在Alpha阶段,部分功能处于测试状态,为遵守“上网不涉密,涉密不上网”,我们对用户身份进行了严格检查。
一方面,后端在网关对用户网络状态进行了校验,只有在连接北航校园网后才可以访问。另一方面,部分功能需要验证学号,通过北航邮箱接收验证码后激活身份后才可以使用。
集成校园小工具
我们在Alpha阶段的目标用户群体主要是北航同学,为了提高系统的活跃用户数,我们集成了课程助手和博雅助手等校园工具。
团队凭借目标用户群体的特性实现了这些功能,团队成员对这些功能的自我评价很好,达到了预期的目标。内测用户均觉得这些功能富有特色并且很实用。
发布与反馈
我们的产品在微信小程序进行了发布。
一、场景与功能
搭伙儿是一款面向北航校内学生的组队小程序,主要功能是帮助同学们快捷方便地完成课程,竞赛,生活等等方面的组队。
场景一
- 用户:计算机学院大二同学小A
- 需求:寒假要参加冯如杯,小A已经有选题但没有找到队友,希望有2-3名同学参与
- 解决方案:通过搭伙儿小程序,在竞赛板块下发起组队

场景二
- 用户:计算机学院大三同学小B
- 需求:在数据库课程设计中,需要三人组队进行Web项目开发,小B擅长后端开发,想找两位了解前端开发的同学组队
- 解决方案:通过搭伙儿小程序,在课程板块下发起组队。为了匹配队友,小B在【我的】页面选择【兴趣】,填写自己擅长的后端技术,系统可以据此推荐适合的同学。

场景三
- 用户:士谔书院大一同学小C
- 需求:小C喜欢打羽毛球,初入大学,小C想要找一个同学每周三下午一起打球
- 解决方案:小C可以在生活板块下搜索羽毛球,找到目前适合的队伍,并发起申请。在通过后,系统会推送消息,小C可以和队伍成员联系。



场景四
-
用户:经管学院大三同学小D
-
需求:小D想要通过手机微信小程序查看自己某天某课程有无缺勤
-
解决方案:小D可以在用户中心界面点击签到记录从而进入对应页面查看自己的签到记录

场景五
- 用户:计算机学院大三同学小E
- 需求:小E想要通过手机微信小程序预约抢博雅课程
- 解决方案:小E可以在用户中心界面下点击博雅助手进入博雅抢课页面实现抢博雅

场景六
- 用户:计算机学院大三同学小F
- 需求:小F想要通过手机微信小程序给技术人员提出改善建议以提升自己的体验
- 解决方案:小F可以在用户中心界面下点击反馈问题输入反馈内容,反馈主题等等信息后提交

二、运行环境
本项目为微信小程序,需要满足以下配置
- 微信客户端:
- 微信版本需为 7.0.0 或更高。
- 支持 Android 和 iOS 微信客户端。
- 微信开发者工具:
- 需安装最新版本的微信开发者工具,用于调试和运行小程序。
- UniApp 框架:
- 本项目基于 UniApp 开发,需在支持 UniApp 的环境中运行。
- 依赖管理工具:
- 使用
npm或yarn安装项目依赖。
- 使用
三、安装与使用方法
使用个人微信扫描以下二维码在校园网环境中即可访问(因为面向北航学生,所以这里设置了必须校园网环境下访问)。

四、系统已知的问题和限制
- 正式发布版和开发版进度不一致
- 页面适配可能存在问题
- 部分页面用户指导稍差,交互感稍次,页面逻辑略显混乱
- 多人合作开发时沟通不够充分,导致前端在完成自我功能要跳转到各自界面的逻辑线不清楚
五、访问方式
微信扫描以下二维码

本次上线已在微信小程序端完成发布,覆盖了核心功能模块;
目前以内部体验与验证为主,尚处于闭环测试阶段,外部用户尚未正式开放邀请;
后续将在内部反馈基础上,择机向目标用户群发起体验邀请,并根据真实使用场景持续迭代优化。
软件工程质量
CI/CD
我们为后端配置了生产环境和开发环境两套CI/CD工作流。
在dev(开发环境)分支有新的提交后,会触发下面的workflow,构建各个微服务的Docker镜像并推送到镜像仓库中,服务器从镜像仓库中拉取镜像,并通过docker-compose启动所有微服务。

在main(生产环境)分支有新的merge后,会触发下面的workflow,与dev分支类似,区别在于二者使用不同的数据库,redis,消息队列,nacos命名空间。对于这些中间件配置等敏感信息,我们不允许提交到仓库中,需要在配置文件中通过环境变量加载。

在采用CI/CD后,Web端和后端的开发效率得到了极大提升,运维同学配置好整体CI/CD流程和服务器后,开发同学只要提交代码就可以自动完成代码编译、构建镜像上传到服务器、启动容器这一复杂过程。
仓库管理
我们的项目共有四个仓库:
- 微信小程序仓库:https://github.com/YuXiaosen0/joinup
- 服务器仓库:https://github.com/XuanxuanRao/joinup-server
- 管理员Web端仓库:https://github.com/Aron00123/joinup-admin-web
- 爬虫仓库:https://github.com/XuanxuanRao/Iclass-Crawler
main分支用于生产和发布,是正在线上运行的版本,只允许从dev分支合并;dev分支是开发环境下的最新版本,对于简单bug的修复和小功能的新增,允许直接提交到dev分支上,如果涉及到添加新的功能模块,需要进行大量修改才能修复的bug,必须迁出feature分支用于实现新功能,迁出fix分支用于bug修复。
测试方案
我们对代码进行了单元测试,
技术规范
项目的后端完全基于Docker部署,并且有专门的镜像仓库,部署与移植成本低。
运维同学和后端开发同学通过文档,记录了后端项目和用到的各个中间件的详细情况,这样其他人员继续维护时,可以很快上手,明白如何更改配置文件。

在开发过程中,规范了微服务间用户信息传递规范、微服务调用规范、接口设计规范和数据库设计规范。具体可以见我们的技术文档。


浙公网安备 33010602011771号