冲刺第四天
第一次冲刺
SCRUW部分
一、成员进度
| 姓名 | 今天的进度 | 遇到的问题 | 解决的问题 | 明天计划 |
|---|---|---|---|---|
| 雷思骞 | 百度接口的调用,与后台数据进行初步对接。 | 刚开始想利用python后台百度接口,但是一直没有找到加载动态地图的,只有静态的。 | 通过百度地图sdk文档使用js家寨动态地图。 | 产品管理的功能开发,充电桩管理功能开发。 |
| 陈舒遥 | 映射其他后台的表,开始尝试编写后端些许功能。编写后台个人信息功能。 | 项目冲刺阶段,对于数据库的设计合理。如何复习flask框架内容。 | 与宋佳豪一起讨论结局,通过查看其他项目数据库设计。按照之前自己写的笔记来进行复习 | 映射其他后台的表,开始尝试编写后端些许功能。 |
| 卿昕灿 | 测试 | 今天的测试是对于如何写好测试文档,首先经过了解得知了测试的步骤。 | 在了解完一系列流程之后,如何指定测试计划 | 开始编写需求的测试文档 |
| 刘垚 | 测试 | 今天的测试是对于登录注册的测试,首先经过了解得知了测试的步骤。 | 在了解完一系列流程之后,如何指定测试计划 | 开始编写需求的测试文档 |
| 刘俊 | 准备薪资管理,人员管理的前端页面, | 按照自己的风格设计 | Bs4上查找自己所需要的控件及样式 | 准备后台的页面大概样式 |
| 宋佳豪 | 学习python虚拟环境搭建,初步了解python | Python虚拟环境如何进行创建,python怎么使用的。 | 在陈舒遥的辅导下,了解到python虚拟环境,pipenv shell创建虚拟环境,并打印出hallo world | 学习Flask框架的初使用 |
| 郑志敏 | 准备薪资管理,人员管理的前端页面, | 按照自己的风格设计 | Bs4上查找自己所需要的控件及样式 | 准备后台的页面大概样式 |
二、团队的进度和代码
-
用户注册
-
csrf验证
https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html -
用户注册业务逻辑分析
![]()
-
用户注册接口设计和定义
-
设计接口基本思路:
1.分析要实现的业务逻辑:
明确在这个业务中涉及到几个相关子业务。
将每个子业务当做一个接口来设计。
2.分析接口的功能任务,明确接口的访问方式与返回数据:
请求方法(如GET、POST、PUT、DELETE等)。
请求地址。
请求参数(如路径参数、查询字符串、表单、JSON等)。
响应数据(如HTML、JSON等)。 -
用户注册接口设计
| 选项 | 方案 |
|---|---|
| 请求方式 | POST |
| 请求地址 | /users |
| 请求方式 | |
| 请求参数:表单参数 |
| 参数名 | 类型 | 是否必传 | 说明 |
|---|---|---|---|
| password | string | 是 | 密码 |
| password2 | string | 是 | 确认密码 |
| mobile | string | 是 | 手机号 |
| sms_code | string | 是 | 短信验证码 |
响应结果
| 响应结果 | 响应内容 |
|---|---|
| 注册失败 | 响应错误提示 |
| 注册成功 | 重定向到首页 |
-
用户注册接口定义
@api.route("/users", methods=["POST"])
def register():
"""注册
请求的参数: 手机号、短信验证码、密码、确认密码
参数格式:json
"""
# 获取请求的json数据,返回字典 -
用户模型类
from datetime import datetime from . import db from werkzeug.security import generate_password_hash, check_password_hash from home import constants class BaseModel(object): """模型基类,为每个模型补充创建时间与更新时间""" create_time = db.Column(db.DateTime, default=datetime.now) # 记录的创建时间 update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 记录的更新时间 class User(BaseModel, db.Model): """用户""" __tablename__ = "h_user_profile" id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 用户编号 name = db.Column(db.String(32), unique=True, nullable=False) # 用户暱称 password_hash = db.Column(db.String(128), nullable=False) # 加密的密码 mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号 real_name = db.Column(db.String(32)) # 真实姓名 id_card = db.Column(db.String(20)) # 身份证号 avatar_url = db.Column(db.String(128)) # 用户头像路径 houses = db.relationship("House", backref="user") # 用户发布的房屋 orders = db.relationship("Order", backref="user") # 用户下的订单 # 加上property装饰器后,会把函数变为属性,属性名即为函数名 @property def password(self): """读取属性的函数行为""" # print(user.password) # 读取属性时被调用 # 函数的返回值会作为属性值 # return "xxxx" raise AttributeError("这个属性只能设置,不能读取") # 使用这个装饰器, 对应设置属性操作 @password.setter def password(self, value): """ 设置属性 user.passord = "xxxxx" :param value: 设置属性时的数据 value就是"xxxxx", 原始的明文密码 :return: """ self.password_hash = generate_password_hash(value) def check_password(self, passwd): """ 检验密码的正确性 :param passwd: 用户登录时填写的原始密码 :return: 如果正确,返回True, 否则返回False """ return check_password_hash(self.password_hash, passwd) def to_dict(self): """将对象转换为字典数据""" user_dict = { "user_id": self.id, "name": self.name, "mobile": self.mobile, "avatar": constants.QINIU_URL_DOMAIN + self.avatar_url if self.avatar_url else "", "create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S") } return user_dict def auth_to_dict(self): """将实名信息转换为字典数据""" auth_dict = { "user_id": self.id, "real_name": self.real_name, "id_card": self.id_card } return auth_dict
三、SCRUM会议照片
四、团队的进度运行截图

PM报告
一、整个项目预期任务量:两周(14天);目前已经花费的时间:一个星期(7);剩余工作时间:一个星期(7)。
二、PM燃尽图:

三、任务总量变化线:

四、贡献度比
| 成员 | 贡献度占比 |
|---|---|
| 雷思骞 | 35 |
| 陈舒遥 | 22 |
| 卿昕灿 | 23 |
| 刘垚 | 23 |
| 刘俊 | 25 |
| 宋佳豪 | 25 |
| 郑志敏 | 30 |

浙公网安备 33010602011771号