第4篇Scrum冲刺博客

每日Scrum报告

日期: [2025.11.29]
会议时间: [21:00]

1. 当日站立式会议记录

会议照片

cacf2c8bc8a2405e0d7b092c00fbf51b

成员同步内容

成员:齐思贤

  • 昨天已完成的工作:
      1. 设计JWT payload结构(包含user_id/role/exp);
      1. 集成jwt-cpp依赖,实现Token生成逻辑;
      1. 开发用户登录接口(校验student_id+加密密码)
      1. 编写Drogon全局鉴权Filter(拦截需登录接口,验证Token有效性);2. 处理Token过期/无效返回401错误;5
      1. 测试登录+鉴权流程
  • 今天计划完成的工作:
      1. 开发个人资料查询接口(GET /api/v1/users/me),返回用户详情(含review_count/collection_count);
      1. 设计collection表(id/user_id/merchant_id/collected_at字段)
      1. 开发个人资料修改接口(PUT /api/v1/users/me),支持修改nickname/avatar;
      1. 编写collection表索引(user_id+merchant_id唯一索引,防止重复收藏)
  • 工作中遇到的困难:
    • 未来需要修改API但需保持向后兼容
    • 用户量大时,collections表可能过大

成员:阿里亚

  • 昨天已完成的工作:
      1. 协助开发登录接口(编写Token验证逻辑,解析user_id/role);
      1. 编写用户模块单元测试框架(基于gtest)
      1. 测试全局鉴权Filter(覆盖未登录/Token过期/无效Token场景);
      1. 协助排查登录接口异常(如密码校验失败)
  • 今天计划完成的工作:
      1. 协助开发个人资料接口(编写用户信息组装逻辑,计算review_count/collection_count);
      1. 设计collection表索引优化方案
      1. 编写收藏表数据操作工具类(CRUD封装);
      1. 测试资料修改接口(覆盖昵称长度限制/头像URL格式校验)
  • 工作中遇到的困难:
    • 昵称敏感词/头像URL格式校验繁琐,统计更新后缓存未及时清理

成员:林旭坚

  • 昨天已完成的工作:
      1. 实现商户创建接口(POST /api/v1/merchants),参数校验(名称/地址不能为空、分类合法);
      1. 初始状态设为10(待审核),生成merchant_id(雪花算法)
      1. 开发商户列表查询接口(GET /api/v1/merchants),支持category_id/campus筛选;
      1. 编写筛选逻辑(仅返回status=20的商户)
  • 今天计划完成的工作:
      1. 实现商户详情查询接口(GET /api/v1/merchants/{id}),返回完整信息(含tags/images/avg_score);
      1. 集成Redis ZSET维护平均评分(avg_score),初始值0
      1. 开发商户标签管理逻辑(添加/删除标签,去重);
      1. 测试商户详情接口(覆盖已审核/未审核/不存在商户场景)
  • 工作中遇到的困难:
    • 多请求同时修改标签导致数据错乱,Redis与DB评分数据不一致问题

成员:谢嘉骏

  • 昨天已完成的工作:
      1. 实现点评发布接口(POST /api/v1/reviews),参数校验(score1-5分、content非空(可选?按文档需确认,此处按必填处理)、商户存在且已审核);
      1. 支持匿名发布(anonymous=true隐藏用户信息)
      1. 同步商户点评数和平均评分(更新merchant表review_count/avg_score,同步Redis ZSET)
      1. 测试点评发布流程(正常发布/参数错误/商户未审核)
  • 今天计划完成的工作:
      1. 实现商户点评列表查询接口(GET /api/v1/merchants/{id}/reviews),支持分页、排序(latest/最热/评分优先);
      1. 编写排序逻辑(最热=like_count+reply_count加权)
      1. 开发点评点赞接口(POST /api/v1/reviews/{id}/like),Redis INCR计数,防止重复点赞;
      1. 测试点赞功能(点赞/取消点赞/重复点赞)
  • 工作中遇到的困难:
    • 高并发下用户重复操作边界条件处理,多字段加权计算+分页查询慢

成员:袁镇清

  • 昨天已完成的工作:
      1. 协助开发点评发布接口(编写评分范围校验/图片数量限制逻辑)
      1. 编写商户评分同步工具类(封装avg_score计算和Redis更新)
      1. 测试点评发布接口(覆盖匿名/非匿名、多图/无图场景
      1. 排查评分同步异常(如小数精度问题)
  • 今天计划完成的工作:
      1. 协助开发商户点评列表接口(编写分页工具类,支持page/size参数
      1. 测试排序逻辑(验证latest/最热/评分优先结果正确性)
      1. 协助开发点赞接口(编写重复点赞校验逻辑,基于review_like表+Redis)
      1. 编写点赞定时落库脚本
  • 工作中遇到的困难:
    • 多维度排序(最新/最热/评分)需复合索引,设计复杂

成员:彭文昊

  • 昨天已完成的工作:
      1. 对接后端登录接口(POST /api/v1/users/login),实现登录功能
      1. 实现“记住密码”功能(localStorage存储学号+加密密码,有效期7天)
      1. 开发注册页UI(表单布局、密码确认校验)
      1. 编写注册表单校验逻辑(两次密码一致、昵称长度限制)
  • 今天计划完成的工作:
      1. 对接后端注册接口(POST /api/v1/users/register),实现注册功能
      1. 注册成功后自动登录,跳转首页
      1. 开发个人中心UI(头像+昵称展示、功能入口布局、底部设置入口)
      1. 对接个人资料查询接口(GET /api/v1/users/me),展示用户信息
  • 工作中遇到的困难:
    • 注册成功到自动登录状态同步存在延迟,页面跳转时用户状态未就绪

成员:张嘉铭

  • 昨天已完成的工作:
      1. 对接热门商户推荐接口(GET /api/v1/search/merchants),展示热门商户列表;
      1. 开发首页轮播图功能(展示系统公告,支持点击跳转)
      1. 开发分类列表页UI(分类标题、筛选栏(校区+排序)、商户卡片列表)
      1. 封装筛选组件(校区下拉选择、排序下拉选择)
  • 今天计划完成的工作:
      1. 对接商户列表查询接口(GET /api/v1/merchants),实现分类筛选和排序功能
      1. 开发分类列表页分页加载
      1. 开发商户详情页UI(基础信息区域、标签区域、图片轮播、评分分布图表、点评列表区域、收藏按钮、写点评按钮)
  • 工作中遇到的困难:
    • 后端返回评分分布数据格式与前端图表库适配问题

2. 项目燃尽图发布

f0fa22b8a6a6b8fb59b733d9b9a4b51c

3. 每人的代码/文档签入记录

齐思贤

  • 签入记录对应的Issue内容与链接:
    • 用户个人资料模块开发 - 核心功能模块:实现个人资料查询接口(GET /api/v1/users/me)、修改功能(PUT /api/v1/users/me)和收藏系统设计
  • 说明:
    • 包含JWT鉴权验证、数据库CRUD操作、Redis缓存集成,确保用户数据安全性和高性能访问
    • 代码必须每天可执行,支持单元测试和接口测试覆盖

阿里亚

  • 签入记录对应的Issue内容与链接:
    • 个人资料模块性能优化- 系统优化模块:优化统计查询性能,实现收藏防重复机制,设计collection表索引优化方案
  • 说明:
    • 通过Redis缓存策略提升查询效率,唯一索引+分布式锁防止并发问题,保证数据一致性
    • 代码必须每天可执行,包含性能压测脚本和监控指标

林旭坚

  • 签入记录对应的Issue内容与链接:
    • 商户详情接口开发 - 商户核心模块:实现商户详情查询、Redis ZSET动态评分维护和标签管理系统
  • 说明:
    • 集成Redis实现实时评分计算,支持商户标签的增删改查,包含完整的API文档和错误处理机制
    • 代码必须每天可执行,覆盖各种边界条件测试

谢嘉骏

  • 签入记录对应的Issue内容与链接:
    • 点评列表与点赞功能 - 社交互动模块:实现点评列表查询、多维度排序和点赞系统
  • 说明:
    • 支持latest/最热/评分优先三种排序算法,点赞功能使用Redis计数器防止重复操作,提升用户体验
    • 代码必须每天可执行,包含并发测试和数据一致性验证

袁镇清

  • 签入记录对应的Issue内容与链接:
    • 点评系统辅助功能开发 - 基础设施模块:开发通用分页工具类、点赞校验逻辑和定时数据同步脚本
  • 说明:
    • 提供可复用的分页组件,基于数据库+Redis的双重校验机制,定时脚本确保数据最终一致性
    • 代码必须每天可执行,包含完整的错误日志和监控告警

彭文昊

  • 签入记录对应的Issue内容与链接:
    • 前端注册和个人中心功能 - 前端用户模块:实现用户注册、自动登录状态管理和个人中心UI组件
  • 说明:
    • 采用响应式设计,支持表单验证、错误提示、加载状态等用户体验优化,确保前后端数据同步
    • 代码必须每天可执行,包含组件单元测试和端到端测试

张嘉铭

  • 签入记录对应的Issue内容与链接:
    • 商户列表和详情页前端开发 - 前端展示模块:实现商户列表筛选、分页加载和详情页完整UI开发
  • 说明:
    • 包含图片轮播、评分分布图表、标签展示等交互组件,支持多校区筛选和实时数据更新
    • 代码必须每天可执行,优化加载性能和用户交互体验

4. Code Review的更新

  • 今日无代码规范文档更新。

5. 项目程序/模块最新截图

最新模块代码截图(含注释)

1. 用户认证模块 (UserController.h + UserService.h)

// UserController.h - 用户控制器,处理HTTP请求
namespace dianping {
namespace controller {
class UserController : public drogon::HttpController<UserController> {
private:
    std::shared_ptr<service::UserService> userService_;

public:
    // 发送验证码 - POST /user/code?phone=13800138000
    ADD_METHOD_TO(UserController::sendCode, "/user/code", drogon::Post);
    
    // 用户登录 - POST /user/login
    // Body: {"phone": "13800138000", "code": "123456"}
    ADD_METHOD_TO(UserController::login, "/user/login", drogon::Post);
    
    // JWT Token认证 - GET /user/me
    ADD_METHOD_TO(UserController::me, "/user/me", drogon::Get);
};

// UserService.h - 用户业务逻辑服务
class UserService {
private:
    std::shared_ptr<mapper::UserMapper> userMapper_;
    std::shared_ptr<utils::RedisClient> redis_;

public:
    // 发送验证码:存储到Redis,5分钟过期
    dto::Result sendCode(const std::string& phone);
    
    // 用户登录:验证码校验 + JWT Token生成
    dto::Result login(const dto::LoginFormDTO& loginForm);
    
    // Token刷新:延长Redis中用户信息有效期
    bool refreshToken(const std::string& token);
};

2. Redis缓存模块 (CacheClient.h)

// CacheClient.h - 缓存客户端,解决缓存穿透/雪崩/击穿
namespace dianping {
namespace utils {
class CacheClient {
private:
    std::shared_ptr<RedisClient> redis_;
    
public:
    // 获取缓存,支持空值缓存防止穿透
    template<typename T>
    std::optional<T> get(const std::string& key);
    
    // 设置缓存,随机过期时间防止雪崩
    template<typename T>
    bool set(const std::string& key, const T& value, int ttl = 0);
    
    // 互斥锁获取,防止缓存击穿
    bool tryLock(const std::string& lockKey, int expireTime = 10);
    
    // 删除缓存,保证数据库和缓存一致性
    bool deleteKey(const std::string& key);
    
    // Cache Aside模式实现
    template<typename T>
    std::optional<T> getWithFallback(
        const std::string& key, 
        std::function<std::optional<T>()> dbLoader,
        int ttl = 1800
    );
};

3. 秒杀系统模块 (VoucherOrderService.h)

// VoucherOrderService.h - 秒杀订单服务
namespace dianping {
namespace service {
class VoucherOrderService {
private:
    std::shared_ptr<mapper::VoucherMapper> voucherMapper_;
    std::shared_ptr<mapper::VoucherOrderMapper> orderMapper_;
    std::shared_ptr<utils::RedisClient> redis_;
    std::shared_ptr<utils::RedisIdWorker> idWorker_;

public:
    // 秒杀下单:分布式锁 + 库存校验 + 一人一单
    dto::Result createSeckillOrder(long userId, long voucherId);
    
    // 预检查库存:Redis原子操作,避免无效请求
    bool preCheckStock(long voucherId);
    
    // 检查是否重复下单:使用Redis Set防止一人多单
    bool checkOrdered(long userId, long voucherId);
    
private:
    // Redis分布式锁实现
    bool acquireLock(const std::string& lockKey, const std::string& requestId);
    void releaseLock(const std::string& lockKey, const std::string& requestId);
    
    // Lua脚本保证原子性
    static const std::string STOCK_DECREASE_SCRIPT;
};

4. 应用程序启动模块 (main.cpp)

// main.cpp - 应用程序入口,系统集成
int main(int argc, char* argv[]) {
    // 1. 加载YAML配置文件
    auto config = loadConfig("config/application.yaml");
    
    // 2. 初始化日志系统
    initLogger(config);
    spdlog::info("点评系统 C++ 版本启动中...");
    
    // 3. 初始化数据库连接池 (20个连接)
    auto dbPool = initDatabase(config);
    
    // 4. 初始化Redis客户端 (连接池30个)
    auto redis = initRedis(config);
    
    // 5. 配置Drogon Web服务器
    drogon::app()
        .addListener("0.0.0.0", 8081)  // 监听端口
        .setThreadNum(4)              // 4个工作线程
        .setLogLevel(trantor::Logger::kInfo);
    
    // 6. 注册所有路由和中间件
    registerRoutes(dbPool, redis, config);
    
    // 7. 启动HTTP服务器
    spdlog::info("服务器启动成功,端口: 8081");
    drogon::app().run();
    
    return 0;
}

5. 数据库连接池模块 (DBConnectionPool.h)

// DBConnectionPool.h - 数据库连接池实现
namespace dianping {
namespace mapper {
class DBConnectionPool {
private:
    std::queue<std::unique_ptr<sql::Connection>> available_;
    std::set<sql::Connection*> used_;
    std::mutex mutex_;
    std::condition_variable condition_;
    std::string connectionString_;
    std::string user_;
    std::string password_;
    std::string database_;
    int maxConnections_;

public:
    // 获取连接 (支持超时等待)
    std::unique_ptr<ConnectionWrapper> getConnection(int timeoutMs = 5000);
    
    // 归还连接 (自动调用)
    void returnConnection(sql::Connection* conn);
    
    // 连接池状态监控
    int getAvailableCount() const;
    int getUsedCount() const;
    
private:
    // 创建新连接
    sql::Connection* createConnection();
    
    // 维护连接池大小
    void maintainPool();
};

6. 每日每人总结

齐思贤

  • 今日总结与反馈:
    • 完成了用户个人资料模块的开发,包含查询接口、修改功能和收藏系统,实现了完整的用户个人信息管理能力。

阿里亚

  • 今日总结与反馈:
    • 完成个人资料模块开发,包含查询/修改接口和收藏系统。解决了统计查询性能瓶颈(通过缓存优化),防止了重复收藏(唯一索引+锁机制),确保了数据一致性(事务+异步更新)。

林旭坚

  • 今日总结与反馈:
    • 已实现商户详情查询接口,返回完整信息并集成Redis ZSET维护动态平均评分,确保高性能读取。商户标签管理系统支持增删去重,接口测试覆盖已审核、未审核及不存在等全部场景,功能稳定可用。

谢嘉骏

  • 今日总结与反馈:
    • 已实现商户点评列表查询接口,支持分页及多维度排序,其中“最热”采用like_count+reply_count加权算法。同时开发了点评点赞接口,基于Redis INCR计数并防止重复点赞,完成点赞/取消/重复等多种场景测试,功能完整且性能稳定。

袁镇清

  • 今日总结与反馈:
    • 协助完成商户点评列表接口:开发了通用分页工具类支持page/size参数,并验证了latest/最热/评分优先三种排序结果的正确性。协助实现点赞接口,基于review_like表与Redis结合的双重校验逻辑防止重复点赞。额外编写了定时落库脚本,确保Redis点赞计数定期同步至数据库。

彭文昊

  • 今日总结与反馈:
    • 已完成注册功能对接:实现用户注册,成功后自动登录并跳转首页。个人中心UI已完成,包含头像昵称展示、功能入口布局及底部设置。已对接个人资料查询接口,正常展示用户信息,整体流程顺畅。

张嘉铭

  • 今日总结与反馈:
    • 已对接商户列表接口,支持分类筛选、排序及分页加载。商户详情页UI已完成开发,包含基础信息、标签、图片轮播、评分图表、点评列表、收藏和写点评按钮等功能区域,交互流畅。
posted @ 2025-12-03 16:05  pascal5233  阅读(7)  评论(0)    收藏  举报