[T.6] 团队项目:技术规格说明书
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 首页 - 2025年春季软件工程(罗杰、任健) - 北京航空航天大学 - 班级博客 - 博客园 |
| 这个作业的要求在哪里 | [T.6] 团队项目:技术规格说明书 |
| 我在这个课程的目标是 | 在实践中掌握软件工程的基本方法,提高开发能力 |
| 这个作业在哪个具体方面帮助我实现目标 | 确定开发过程中的技术规范,约定前后端交互方式,提高开发效率 |
技术栈
微信小程序端
在HBuilder和微信开发者工具开发微信小程序的同时,我们采用uni-app框架作为核心开发方案,结合Vue.js语法和小程序原生API,使用WXML/WXSS构建页面结构,通过HBuilder X高效编写代码并调试,再借助微信开发者工具进行真机预览和发布。技术栈包括基础HTML5/CSS3、JavaScript/ES6+(可选TypeScript)、uni-ui或WeUI等组件库、Vuex状态管理,以及微信小程序特有的生命周期、组件系统和云开发能力,实现一次开发多端适配,兼顾开发效率和平台兼容性。
Web端
前端采用 Vue3 进行开发,构建工具使用 Vite,框架采用 Composition API 与 TypeScript 结合,提升代码的可维护性和开发效率。UI 框架方面选用 Element Plus,配合 Pinia 管理全局状态,提升页面响应能力与组件解耦性。同时使用 Vue Router 实现前端路由控制,Axios 用于与后端接口的数据交互。
为了实现与后端 WebSocket 实时通信,前端集成了 WebSocket 客户端模块,主要用于聊天模块的实时消息展示,与后端保持双向通信,提升用户交互体验。
前端构建后的静态资源将通过 Nginx 进行部署,Nginx 作为反向代理服务器,同时也负责处理跨域请求、静态资源缓存等功能。开发环境下,前端可通过 Vite 本地服务运行,并通过代理配置接入后端服务;生产环境中,前端构建产物(dist 目录)部署在 Ubuntu 服务器上的 Nginx 服务中,实现与后端服务的高效集成。
后端
后端使用Java开发(JDK11),框架为Spring,使用的中间件有MySQL,Redis,nacos,RabbitMQ,主要技术有SpringCloud,MybatisPlus,WebSocket。
其中Redis用于数据缓存提高性能,并用于实现分布式锁保证分布式环境下的线程安全。选择RabbitMQ作为消息队列,一方面RabbitMQ具有较高的可用性、消息稳定性,虽然吞吐量不如Kaffa,但对于我们的项目是足够的,因此我们选择RabbitMQ作为消息队列来实现服务的异步调用、缓存数据库双写一致性保证以及异构网络环境下的服务访问。WebSocket用户实现聊天模块的实时消息推送,取代请求方式降低系统开销。
所有中间件都通过Docker部署在服务器上,并且有开发和生产两套环境进行数据隔离。开发时,代码可以在本地运行,通过nacos接入其他服务。生产环境下,后端会通过Docker部署在Ubuntu服务器上。
爬虫
爬虫部分使用Python开发,主体框架采用DjangoRestFramework,使用的中间库包括Celery,Request+Cryptography。
DRF是基于Django的强大RESTful API开发框架,集成了序列化,视图逻辑抽象,路由管理等功能,开发速度快,性能高,安全性强。Request库简单易用,适用于大多数静态页面的爬取,适合本项目快速原型开发的需求。Celery是一个分布式任务队列系统,可以实现实时异步任务处理与定时任务调度,具有高并发异步任务处理能力,因此我们选择Celery作为消息队列,用于处理定时任务。
系统架构
我们的项目采用传统的前后端分离设计。
前端分为用户端和管理员端,二者单独开发互不影响。以微信小程序形式开发,提供便捷的用户交互体验。管理员端以电脑Web端的方式开发,并通过nginx进行部署。
后端采用微服务架构,采用Spring Cloud和Django构建,实现系统功能的模块化和解耦,使用Nacos作为服务注册与配置中心,统一管理微服务。
-
网关作为系统的入口,负责用户认证、鉴权、负载均衡和流量控制,确保系统安全和稳定。
-
按照业务类型在水平方向进行划分:
-
用户模块负责处理用户信息、身份校验
-
组队模块为系统的核心,用于实现创建组队、加入组队、管理组队等功能
-
聊天模块负责消息推送、私信聊天和群组聊天
-
校园助手模块负责和爬虫交互
-
-
按照功能在垂直方向进行划分:
-
邮件服务负责发送邮件,记录相关日志
-
短信服务负责发送短信,记录相关日志
-
文件模块与对象存储服务(OSS)集成,实现文件上传、下载和管理。
-
-
爬虫模块用于提供为组队模块提供服务,使用Python基于Django框架完成,为了系统安全性不对外提供接口,只能由后端服务调用
在数据存储方面,我们使用MYSQL进行数据的持久化保存,Redis进行数据缓存以及分布式锁的实现,并通过消息队列实现微服务间的异步调用以及异构网络环境下服务的访问。

功能设计

接口规范
接口设计
对于所有请求,后端封装后返回,都包含三个字段:
| 属性(字段) | 类型 | 说明 |
| code | number | 请求结果。1表示成功,0表示失败 |
| msg | string | 响应信息,用于描述响应结果。通常只在响应失败返回错误信息时需要关注,如果成功统一为 success |
| data | json | 后端返回的数据 |
身份校验
用户登录后,后端会返回一个token,前端需要将token存在localStorage中。后续每次发出请求,都需要在请求头的Authorization携带这个token用来进行身份校验。
如果身份校验失败(未携带token或者token失效),后端不会返回任何数据,请求失败,状态码为401(Unauthorized)。
请求转发
为了保证服务器安全,生产环境下后端不会为前端配置允许跨域访问。前端的请求需要通过nginx转发到服务器上。
如果前端想要发出一个请求,请求方式为POST,路径为/user/login。后端服务器地址为http://backend,启动在端口为8080上;前端部署在http://joinup.org.cn
-
在开发环境下,发出请求的url为:http://backend:8080/user/login
-
在生产环境下,发出请求的url为:http://joinup.org.cn/api/user/login
nginx会识别以api开头的请求路径,转发到真正的后端服务器上。
状态码
| 状态码 | 含义 | 说明 |
| 401 | Unauthorized | 身份认证失败,用户未登录或登录超时 |
| 403 | Forbidden | 没有访问权限 |
| 404 | NotFound | - |
| 405 | MethodNotFound | - |
| 429 | Too Many Requests | 网关通过Sentinel配置了限流,前端访问过于频繁 |
| 500 | InternalServerError | 服务器出现了错误 |
参数校验
前端在发送请求前需要根据接口文档对参数逐个校验,同时后端在处理请求之前也必须对参数进行校验,如果参数错误,则请求处理失败,返回的code为0,data字段会以键值对的形式返回所有非法参数的信息。
{
"code": 0,
"msg": "参数错误",
"data": {
"email": "邮箱格式错误"
}
}
接口文档
后端使用Swagger在代码中通过注解对接口的参数、返回值、用法进行说明,并通过Apifox的IDE插件一键导入到Apifox中,减少文档工作量同时保证接口文档的准确性。
系统性能
使用响应时间、吞吐量、并发用户数来描述系统性能。
由于采用微服务架构,可以通过消息队列实现异步调用来减少响应时间、提高吞吐量。比如,当用户加入队伍的申请通过后,会通过邮件/手机短信的方式发送通知,这一过程可以使用异步调用邮件/短信服务提高接口响应速度。
同时,课程查询服务可能会被组队服务频繁调用,而相同参数查询得到的数据通常是不变的,因此后端会对课程查询服务建立两级缓存——将数据存放在数据库和Redis中,减少爬虫调用开销。
高并发下系统的稳定性和线程安全也是系统性能的重要因素。我们计划在nginx中使用漏桶算法进行前端请求的限流,同时使用Sentinel在网关对部分耗时接口进行限流。为保证线程安全,会联合使用Redis和JVM锁来保证重要接口在高并发下的数据安全和并发度。

浙公网安备 33010602011771号