2024秋软件工程结对作业(第二次之程序实现)

bushiwanglujie / 2024-10-11 / 原文

这个作业属于哪个课程
这个作业要求在哪里
这个作业的目标 编写程序实现上次作业的原型模型,要求小程序或网站能实现一些符合客户需求的基本功能
学号 102202108(我)和102202115

1.小程序码(未发布可能用不了)

1.相关链接

🐝结对同学的博客链接:

🐞本作业的博客链接:

🐌咱队创建的仓库的Github项目地址:https://github.com/nymph4x/102202108-102202115

2.具体分工

102202108王露洁:社区模块,流程图
102202115孙佳会:项目模块,消息模块,个人中心模块

3.PSP表格

| PSP | 预计耗时(分钟) | 实际耗时(分钟) | |---------------------------------------------|----------------|----------------| | 计划 |180 |200 | | 估计这个任务需要多少时间 |60 |80 | | 开发 | 240| 480| | 需求分析(包括学习新技术) | 120| 120| | 生成设计文档 | 140|150 | | 设计复审 | 420|421| | 代码规范(为目前的开发制定合适的规范) | 120|130 | | 具体设计 |320 | 360| | 具体编码 | 1440| 1600| | 代码复审 | 120|180 | | 测试(自我测试,修改代码,提交修改) | 180| 200| | 报告 |120 | 180| | 测试报告 |90 |100 | | 计算工作量 |60 | 80| | 事后总结,并提出过程改进计划 |60 |120 |

4.解题思路和设计说明

1. 问题分析

我们需要为大学生跨专业合作项目设计一套信息化系统,帮助学生发起或参与项目,解决跨专业合作时人脉和资源不足的问题。该系统应实现以下几个核心功能:

  • 项目的发起和参与:用户能够发起或参与项目,项目可以包括不同学科的合作,发起者可以发布项目需求和技能要求。
  • 社区互动:用户可以发布帖子,招募合作伙伴,寻找感兴趣项目,分享项目经验。
  • 消息沟通:为每个项目创建群聊,方便项目成员之间的实时交流。
  • 个人信息管理:用户可以查看和修改个人信息,管理查看自己发起或参与的项目、查看帖子。

2. 设计实现说明

为了解决该问题,设计了四个功能模块:

2.1 项目模块

  • 功能:展示推荐项目、发起项目、查看项目详情。
  • 数据存储:项目数据保存在数据库 projects 中,用户可以通过搜索、筛选找到感兴趣的项目。

2.2 社区模块

  • 功能:展示帖子和讨论,用户可以发布和查看帖子,进行项目合作的讨论和招募。
  • 数据存储:帖子存储在 posts 数据库中。

2.3 消息模块

  • 功能:项目成员之间的群聊和通知信息,帮助成员实时沟通。每个项目自动生成群聊,消息记录存储在 chat-record 中。
  • 数据存储:群聊信息存储在 chat-groups 中,消息存储在 chat-record 中。

2.4 个人中心模块

  • 功能:用户的个人信息和项目管理,允许用户查看和修改自己的资料,查看自己发起或参与的项目。
  • 数据存储:个人信息存储在 users 数据库中。

🌱代码实现思路

3.1 注册和登录

  • 注册:用户在注册页面填写姓名、学号、专业等基本信息,信息存储在数据库 users 中。
  • 身份验证:系统使用微信云开发的 getUserOpenid 云函数获取用户的唯一标识 openid,并与用户信息绑定,确保系统的封闭性和安全性。
  • 登录:用户可以使用账号密码登录。

3.2 项目发起与参与

  • 项目管理:项目页面展示推荐项目,可以发起项目,查看项目详情。
  • 数据存储:项目数据存储在数据库 projectsmy-launched-projectsmy-participated-projects 中。
  • 发起项目:用户发起项目时填写项目信息(名称、描述、技能要求等),项目保存到数据库中,并自动生成一个聊天群聊。

3.3 群聊和消息管理

  • 群聊生成:每个项目创建时自动生成一个群聊,群聊存储在 chat-groups 数据库中。
  • 消息记录:项目成员可以在群聊中进行实时沟通,消息记录存储在 chat-record 中。
  • 消息展示:消息模块展示所有群聊的最新消息和系统通知。

3.4 社区互动与帖子管理

  • 社区功能:社区模块展示用户发布的帖子,用户可以发布新的帖子,或浏览其他用户的帖子。
  • 数据存储:帖子数据存储在 posts 数据库中。

3.5 个人信息管理

  • 个人信息:用户可以查看并修改个人信息,个人信息存储在 users 数据库中,并与微信 OpenID 绑定。
  • 项目管理:用户在“我的”页面可以管理自己发起和参与的项目,查看项目详情。

🌷关键实现的流程图

🍄重要代码片段及解释

5.附加特点设计与展示

🎨设计及意义

创意与独到之处:

  • 跨专业合作的便捷化:该系统创新性地为学生提供了一个跨专业的合作平台,不再依赖传统的人脉积累或教师推荐来寻找合作伙伴。通过项目发布和参与功能,学生可以根据项目需求和技能要求迅速找到合适的队友,打破了校园内专业隔阂,促进学科间的深度合作。
  • 项目群聊实时沟通:每个项目自动生成群聊,成员可以实时进行讨论和协作,确保项目成员之间的及时沟通,避免传统方式中使用多个平台进行项目沟通的不便。
  • 社区互动与经验分享:不仅局限于项目合作,系统还提供了社区互动平台,用户可以发布经验分享帖子,激发其他用户的灵感和想法,进一步扩展用户之间的合作机会。

设计意义:

  • 提高合作效率:通过信息化的方式,学生可以在短时间内快速找到所需的合作伙伴,提升了跨专业项目合作的效率,避免了资源浪费。
  • 扩大人脉与资源:在传统校园环境下,学生的合作多依赖于现有社交圈,而这个系统打破了这种限制,让不同专业的学生通过兴趣和技能进行连接,扩大了人脉和资源积累的机会。
  • 支持多样化项目:该系统支持从学术研究到创业项目的广泛项目合作,适用于多学科、跨学科的需求,帮助学生提升综合能力。

💡实现思路

核心思路:

  • 模块化设计:系统分为四大模块(项目、社区、消息、个人中心),每个模块功能独立又彼此相关,确保整个系统的逻辑清晰、易于维护和扩展。
  • 数据库的合理使用:使用云开发数据库存储项目、用户信息、群聊信息和帖子数据,每个用户的项目数据、个人信息与 OpenID 绑定,确保用户数据的隐私性和安全性。
  • 自动化群聊生成:用户发起项目时,系统自动创建对应的群聊,实现项目成员的实时沟通功能,简化了用户的操作流程。
  • 身份验证和隐私保护:通过微信 getUserOpenid 获取用户唯一标识,保障用户数据的封闭性和隐私性,只有认证过的用户才能参与项目和发起讨论。

💎重要代码片段及解释

👑实现成果展示

注册页面效果:

登录界面效果:

项目模块发起项目并更新:

查看项目详情、申请加入项目:

个人中心查看我的项目:

个人中心查看、编辑资料:

项目负责人调整项目进度和状态:

消息模块效果:

项目聊天效果:

6.目录说明和使用说明

📋目录如何组织

目录说明

  1. pages/:包含了各个页面的代码,包括页面的业务逻辑(.js)、结构(.wxml)和样式(.wxss)。
  2. cloudfunctions/:包含了所有的云函数代码,例如 getUserOpenid/ 云函数用于获取用户的 OpenID。
  3. images/:存储项目中的图片和图标资源。
  4. app.jsapp.jsonapp.wxss:全局的应用逻辑、配置和样式文件。

目录结构

|-- cloud/                         # 云函数目录
|   |-- getUserOpenid/             # 云函数,用于获取用户的OpenID
|       |-- index.js               # 云函数的入口文件
|       |-- index.json             # 云函数的配置文件
|
|-- images/                        # 图片资源文件夹
|   |-- ...                        # 项目使用的图片资源
|
|-- pages/                         # 小程序页面目录
|   |-- applyProject/              # 申请加入项目页面
|       |-- applyProject.js        # 申请加入项目的业务逻辑
|       |-- applyProject.wxml      # 申请加入项目的页面结构
|       |-- applyProject.wxss      # 申请加入项目的页面样式
|
|   |-- chatting/                  # 群聊页面
|       |-- chatting.js            # 群聊页面的业务逻辑
|       |-- chatting.wxml          # 群聊页面的结构
|       |-- chatting.wxss          # 群聊页面的样式
|
|   |-- community/                 # 社区页面
|       |-- community.js           # 社区页面的业务逻辑
|       |-- community.wxml         # 社区页面的结构
|       |-- community.wxss         # 社区页面的样式
|
|   |-- editProfile/               # 编辑个人资料页面
|       |-- editProfile.js         # 编辑个人资料的业务逻辑
|       |-- editProfile.wxml       # 编辑个人资料的页面结构
|       |-- editProfile.wxss       # 编辑个人资料的页面样式
|
|   |-- index/                     # 首页
|       |-- index.js               # 首页的业务逻辑
|       |-- index.wxml             # 首页的页面结构
|       |-- index.wxss             # 首页的页面样式
|
|   |-- initProjectDetails/        # 初始化项目详情页面
|       |-- initProjectDetails.js  # 项目详情的业务逻辑
|       |-- initProjectDetails.wxml# 项目详情的页面结构
|       |-- initProjectDetails.wxss# 项目详情的页面样式
|
|   |-- invoProjectDetails/        # 参与的项目详情页面
|       |-- invoProjectDetails.js  # 参与项目详情的业务逻辑
|       |-- invoProjectDetails.wxml# 参与项目详情的页面结构
|       |-- invoProjectDetails.wxss# 参与项目详情的页面样式
|
|   |-- launchProject/             # 发起项目页面
|       |-- launchProject.js       # 发起项目的业务逻辑
|       |-- launchProject.wxml     # 发起项目的页面结构
|       |-- launchProject.wxss     # 发起项目的页面样式
|
|   |-- login/                     # 登录页面
|       |-- login.js               # 登录页面的业务逻辑
|       |-- login.wxml             # 登录页面的页面结构
|       |-- login.wxss             # 登录页面的页面样式
|
|   |-- logs/                      # 日志页面
|       |-- logs.js                # 日志的业务逻辑
|       |-- logs.wxml              # 日志的页面结构
|       |-- logs.wxss              # 日志的页面样式
|
|   |-- message/                   # 消息页面
|       |-- message.js             # 消息页面的业务逻辑
|       |-- message.wxml           # 消息页面的结构
|       |-- message.wxss           # 消息页面的样式
|
|   |-- myProjects/                # 我的项目页面
|       |-- myProjects.js          # 我的项目的业务逻辑
|       |-- myProjects.wxml        # 我的项目的页面结构
|       |-- myProjects.wxss        # 我的项目的页面样式
|
|   |-- utils/                     # 工具函数目录
|       |-- util.js                # 工具函数文件
|
|-- app.js                         # 小程序的全局业务逻辑文件
|-- app.json                       # 全局配置文件
|-- app.wxss                       # 全局样式表
|-- project.config.json            # 微信开发者工具的项目配置文件
|-- sitemap.json                   # 小程序的站点地图

📍测试人员如何运行

为了帮助测试人员顺利运行该微信小程序,以下是详细的操作步骤:

2.1 环境准备

  1. 下载并安装微信开发者工具

    • 从微信开发者工具官网下载并安装:微信开发者工具。
  2. 配置微信云开发环境

    • 在微信开发者工具中创建一个新的小程序项目,选择“使用云开发”选项。
    • 在小程序控制台中启用云开发功能,并创建云数据库和云函数环境。

2.2 项目导入步骤

  1. 获取项目代码

    • 将项目的代码克隆或下载到本地,并保存到合适的文件夹中。
  2. 导入微信开发者工具

    • 打开微信开发者工具,选择“导入项目”,然后选择本地的项目文件夹(例如:miniprogram-1/ 文件夹)。
  3. 配置项目

    • 在项目导入完成后,进入项目的 cloudfunctions 目录下,点击右键选择“上传并部署”云函数。
    • 在数据库控制台中,创建 usersprojectschat-recordchat-groups 等数据库集合。

2.3 运行测试

  1. 运行项目

    • 在微信开发者工具中点击“编译”按钮,系统将自动运行项目。
    • 可以通过模拟器测试小程序的各个页面和功能(如登录、发起项目、加入项目、社区发帖、消息沟通等)。
  2. 注册与登录

    • 使用注册功能创建新账户,填写姓名、学号、专业等信息,成功注册后,登录进入系统。
  3. 测试项目发起与参与

    • 在项目页面发起一个新项目,并填写相关信息,确保项目能够成功保存,并更新到相关页面。
    • 进入项目群聊页面,测试消息发送和接收的功能。
  4. 社区功能

    • 测试在社区页面发帖、查看帖子的功能。
  5. 查看和修改个人信息

    • 进入个人中心,查看我发起的项目和我参与的项目及项目详情,还可以点击进行项目成员内部聊天,查看并修改个人信息,确保数据可以成功更新。

2.4 注意事项

  • 请确保微信开发者工具版本是最新版本,以支持云开发功能。
  • 项目运行过程中,请确保网络连接正常,云数据库和云函数能够正常访问。

7.单元测试

🧰所选测试工具及简易教程

1.1 测试工具选用

我们选用了 Jest 作为主要的单元测试工具,虽然微信小程序并没有直接集成单元测试框架,但我们可以通过模拟 API 调用、云函数调用和数据库交互来进行测试。Jest 是一个功能强大、易于使用的 JavaScript 测试框架,支持异步测试,适合我们测试小程序的业务逻辑和数据库交互。

1.2 学习单元测试的过程

单元测试是开发过程中重要的一环,我们通过以下几个步骤逐步掌握:

  1. 学习基础概念
    • 了解什么是单元测试,以及为什么需要编写单元测试。单元测试是为了验证代码的正确性和稳定性,确保每个功能单元在不同情况下都能正常运行。
  2. 选择合适的测试框架
    • 在研究了 Mocha、Jest 等流行的测试框架后,我们最终选择了 Jest 作为主要测试框架。它提供了丰富的 API 来模拟函数调用和异步操作,适合小程序的测试需求。
  3. 学习 Jest 的基本用法
    • 使用 describeit 方法来定义测试单元,使用 expect 进行断言。
    • 了解如何使用 mock 功能来模拟 API 请求、数据库调用等外部依赖。
  4. 模拟微信小程序 API
    • 通过使用 jest.mock 模拟微信小程序的 API 调用(如 wx.requestwx.cloud.database 等),模拟不同的数据库响应,测试业务逻辑是否按预期工作。

1.3 简易教程

简易教程:如何使用 Jest 编写单元测试

  1. 安装 Jest
    在项目根目录下运行以下命令安装 Jest:

    npm install --save-dev jest
    
    
  2. 编写测试文件
    在 tests/ 目录下创建一个测试文件user.test.js:

const user = require('../path/to/user');

describe('User Registration', () => {
  it('should successfully register a new user', () => {
    const result = user.register('John', 'Doe', 'CS', '123456');
    expect(result).toBeTruthy();
  });
});
  1. 运行测试: 运行以下命令来执行测试:
 npm run test
  1. 查看测试结果: Jest 将输出测试结果,显示成功或失败的测试,并给出失败的详细信息。

🏷️部分单元测试代码及函数说明

2.1 测试代码示例:注册功能的测试

const register = require('../path/to/register');

describe('User Registration', () => {
// 测试注册功能是否正常
it('should register a new user successfully', () => {
  const mockUser = {
    name: 'John Doe',
    studentId: '123456',
    major: 'Computer Science',
    email: 'john@example.com'
  };

  // 模拟注册函数
  const result = register(mockUser);
  expect(result).toBeTruthy();  // 期望注册成功
});

// 测试重复注册的处理
it('should not allow duplicate registration', () => {
  const duplicateUser = {
    name: 'Jane Doe',
    studentId: '123456',  // 重复的学号
    major: 'Design',
    email: 'jane@example.com'
  };

  const result = register(duplicateUser);
  expect(result).toBeFalsy();  // 期望注册失败,因为学号重复
});
});

2.2 测试的函数说明

register() 函数:这是一个处理用户注册的函数,负责验证用户信息并存储在数据库中。
测试场景:
成功注册:用户提供的学号、姓名等信息是唯一的,注册成功。
重复注册:同一个学号不能重复注册,测试是否能正确处理重复注册的情况。

🔍构造测试数据的思路

1.如何考虑各种情况?

2.如何考虑将来测试人员的***难?

3.1 测试数据构造思路

在构造测试数据时,我们需要考虑不同的输入情况,以确保代码在各种场景下都能正确工作。测试数据的构造要包括正向测试和负向测试。

正向测试:

成功的注册场景:输入合法的、正确格式的数据,如正确的姓名、学号、专业等。
正常的登录场景:使用已经注册的账号登录,测试是否能成功。

负向测试:

非法输入:测试边界条件,比如学号为空、邮箱格式错误、姓名字段缺失等,确保系统能处理非法输入。
重复注册:确保同一个学号不能重复注册。
错误的登录信息:测试用户使用错误的账号或密码登录,系统是否能正确返回登录失败的提示。

3.2 如何考虑测试人员的***难

为了防止测试人员提出的各种***难,我们需要对代码的异常处理和边界情况进行全面考虑。构造的测试数据不仅要涵盖常规情况,还要考虑以下场景:

极端数据:测试使用非常大的或非常小的数据,如空字符串、超长字符串等。
并发情况:测试多个用户同时注册或登录的场景,确保系统不会因为并发导致数据冲突或错误。
随机数据:使用随机生成的数据进行测试,确保系统的稳定性。

8.Github代码签入记录

![](https://img2024.cnblogs.com/blog/3512237/202410/3512237-20241010233645799-1853917239.png)

9.工作中的困难及解决办法

👄问题描述:没有办法将注册的用户,发布的帖子和项目存储起来或者是展示出来

✍️做过的尝试:写了很多个界面,每次发帖子,都再加一个新帖子的详细信息界面,类似这样,效率极低,还很占内存

👀是否解决:已经用云开发解决

💐有何收获:使用云开发的数据库功能就能很好地解决这一系列问题

10.评价队友

102202108王露洁

首先如果没有我的队友,我会不知道这个作业如何下手。在跟她的交流下我慢慢学会使用这些从未使用过的工具,对解决问题的思路也有更新的角度。我的队友很认真严谨,值得信赖,相比之下,我的能力和态度都还需要提升。我们相互配合,合理分配任务,才能在如此之短的时间内完成这一项难度很大的作业。但也许是时间比较短,我们并没有很深度地交流,大部分时间都在分别动手完成任务,希望下次合作的时间能长一点!

102202115孙佳会

在这次作业中,和队友的合作很愉快。
首先,因为这次的作业我们开始的时间不太早,而且小程序开发之前完全不熟悉,前两天基本上毫无进展,在摸索阶段,但是队友的反馈都很积极,执行力比较强,没有消极摆烂现象;我们通过微信、GitHub 进行协作,队友在代码提交、测试和问题讨论时也非常配合,虽然整个过程中遇到很多问题,但是交流很愉快。
最后,因为项目开发的很仓促,很多功能没有实现,页面也没有进行优化设计,希望之后能够做一个完成度更高的小程序。