Alpha冲刺 - Day 4

Alpha冲刺 - Day 4

团队名称: 书海拾贝队
冲刺日期: 2025年11月27日
冲刺阶段: Alpha阶段 Day 4/7


一、站立式会议

1.1 会议信息

  • 会议时间: 2025年11月27日 14:00-14:15
  • 会议地点: 图书馆三楼讨论区
  • 会议时长: 15分钟
  • 参会人员: 杨浩、戴宏翔、莫圣韬、赖顺炜、陈东楷、刘霆浩
  • 会议主持: 杨浩
  • 会议记录: 陈东楷

1.2 会议照片

fddab57ceab09ba01633f48527ae577b

1.3 会议要点

  • 前三天进度超前,团队信心倍增
  • 今日重点:完成搜索功能和订单创建功能
  • 讨论:订单状态流转逻辑,确保业务正确性
  • 提醒:订单模块是核心功能,需要仔细测试
  • 决议:明天进行一次完整的功能演示

二、团队成员工作情况

2.1 杨浩(组长 - 前端开发)

昨天已完成的工作:

  • 书籍列表前端页面开发
  • 书籍搜索前端组件开发
  • 优化书籍发布页面用户体验

今天计划完成的工作:

  • 订单创建前端页面开发
  • 个人中心前端页面开发
  • 前后端联调测试

工作中遇到的困难:

  • 订单创建页面需要展示多个商品,布局比较复杂
  • 解决中:参考淘宝、京东的订单页面设计

2.2 戴宏翔(PM - 后端开发)

昨天已完成的工作:

  • 个人信息后端接口开发
  • 收货地址后端接口开发
  • 代码优化和重构

今天计划完成的工作:

  • 面交地址接口开发(卖家提供)
  • 订单确认与面交流程处理
  • 订单模块代码Review

工作中遇到的困难:

  • 面交流程需要考虑买卖双方约定时间地点
  • 已解决:设计面交地址字段,卖家发布书籍时填写,买家下单后可查看卖家面交地址进行当面交易

2.3 莫圣韬(测试工程师)

昨天已完成的工作:

  • 对书籍搜索接口进行测试
  • 对购物车接口进行测试
  • 编写测试报告

今天计划完成的工作:

  • 对订单创建接口进行测试
  • 对个人信息和地址接口进行测试
  • 整理Bug列表

工作中遇到的困难:

  • 发现购物车删除接口在商品不存在时返回500错误
  • 已反馈:提交Bug #033,优先级P1

2.4 赖顺炜(后端+DBA)

昨天已完成的工作:

  • 书籍搜索后端接口开发
  • 订单创建后端接口开发
  • 数据库性能测试

今天计划完成的工作:

  • 订单查询后端接口开发
  • 订单状态流转逻辑
  • 评价功能后端接口开发

工作中遇到的困难:

  • 订单状态流转需要考虑多种场景,逻辑比较复杂
  • 解决方案:画状态机图,明确每个状态的转换条件

2.5 陈东楷(需求+文档)

昨天已完成的工作:

  • 更新用户手册(新增书籍模块)
  • 整理Bug列表和优先级
  • 编写Alpha冲刺Day3博客

今天计划完成的工作:

  • 更新接口文档(订单模块)
  • 编写用户使用指南
  • 准备明天的功能演示PPT

工作中遇到的困难:

  • 暂无

2.6 刘霆浩(全栈+运维)

昨天已完成的工作:

  • 购物车前端页面开发
  • 集成购物车接口
  • 服务器监控

今天计划完成的工作:

  • 订单列表前端页面开发
  • 收货地址前端页面开发
  • 优化前端性能

工作中遇到的困难:

  • 购物车页面的商品选择逻辑有些复杂,需要优化
  • 已解决:使用Vuex管理购物车状态,简化逻辑

三、项目燃尽图

3.1 Day 4 燃尽图

image

图例:
红线 理想剩余工时
蓝线 实际剩余工时

3.2 燃尽图数据

日期 理想剩余工时 实际剩余工时 完成工时
Day 1 138h 138h 0h
Day 2 118h 115h 23h
Day 3 98h 98h 17h
Day 4 75h 75h 23h
Day 5 58h - -
Day 6 38h - -
Day 7 0h - -

四、代码/文档签入记录

4.1 今日签入统计

成员 签入次数 代码行数 文件数 主要内容
杨浩 2 +198 2 书籍搜索功能
戴宏翔 1 +412 4 个人信息和地址接口
莫圣韬 1 +185 2 测试用例
赖顺炜 1 +485 5 搜索和订单接口
陈东楷 1 +278 3 文档更新
刘霆浩 1 +425 4 购物车页面

4.2 Git提交记录

1000141552

4.3 Issue关联

image

image

image

image

image

Issue链接: https://github.com/Bookmatescope/ReuseBook/issues


五、Code Review

5.1 Review记录

Review 1: 书籍搜索模块

  • Reviewer: 赖顺炜
  • Reviewee: 杨浩、赖顺炜

Review内容:

  • ✅ 代码规范:符合团队编码规范
  • ✅ 搜索功能:全文搜索、排序、分页都实现
  • ✅ 用户体验:搜索历史、热门推荐很实用
  • ✅ 性能优化:使用了全文索引,查询速度快
  • ⚠️ 建议:搜索结果可以高亮显示关键词

改进措施:

  • 实现搜索关键词高亮
  • 添加搜索建议功能

代码示例:

// 书籍搜索接口(支持全文搜索和排序)
@GetMapping("/books/search")
public Result search(
    @RequestParam String keyword,
    @RequestParam(defaultValue = "1") Integer page,
    @RequestParam(defaultValue = "20") Integer size,
    @RequestParam(defaultValue = "relevance") String sortBy
) {
    // 参数验证
    if (StringUtils.isEmpty(keyword)) {
        return Result.error("搜索关键词不能为空");
    }
    
    // 构建排序条件
    String orderBy = "MATCH(title, author, description) AGAINST('" + keyword + "') DESC";
    if ("price_asc".equals(sortBy)) {
        orderBy = "price ASC";
    } else if ("price_desc".equals(sortBy)) {
        orderBy = "price DESC";
    } else if ("time".equals(sortBy)) {
        orderBy = "create_time DESC";
    }
    
    // 全文搜索
    PageInfo<Book> pageInfo = bookService.search(keyword, page, size, orderBy);
    
    // 记录搜索历史
    searchHistoryService.save(keyword);
    
    return Result.success(pageInfo);
}

Review 2: 购物车模块

  • Reviewer: 戴宏翔
  • Reviewee: 刘霆浩、戴宏翔

Review内容:

  • ✅ 代码规范:符合编码规范
  • ✅ 状态管理:使用Vuex管理状态,逻辑清晰
  • ✅ 用户体验:商品选择、数量修改、删除都很流畅
  • ✅ 总价计算:实时计算,准确无误
  • ⚠️ 建议:可以添加购物车商品数量限制

改进措施:

  • 限制购物车最多50件商品
  • 添加购物车过期清理机制

代码示例:

// Vuex购物车状态管理
export default {
  namespaced: true,
  state: {
    items: [],
    selectedIds: []
  },
  getters: {
    // 计算总价
    totalPrice(state) {
      return state.items
        .filter(item => state.selectedIds.includes(item.cartId))
        .reduce((sum, item) => sum + item.price * item.quantity, 0);
    },
    // 计算选中数量
    selectedCount(state) {
      return state.selectedIds.length;
    }
  },
  mutations: {
    // 设置购物车商品
    SET_ITEMS(state, items) {
      state.items = items;
    },
    // 更新商品数量
    UPDATE_QUANTITY(state, { cartId, quantity }) {
      const item = state.items.find(i => i.cartId === cartId);
      if (item) {
        item.quantity = quantity;
      }
    },
    // 删除商品
    REMOVE_ITEM(state, cartId) {
      state.items = state.items.filter(i => i.cartId !== cartId);
      state.selectedIds = state.selectedIds.filter(id => id !== cartId);
    },
    // 选择商品
    TOGGLE_SELECT(state, cartId) {
      const index = state.selectedIds.indexOf(cartId);
      if (index > -1) {
        state.selectedIds.splice(index, 1);
      } else {
        state.selectedIds.push(cartId);
      }
    },
    // 全选/取消全选
    TOGGLE_SELECT_ALL(state) {
      if (state.selectedIds.length === state.items.length) {
        state.selectedIds = [];
      } else {
        state.selectedIds = state.items.map(i => i.cartId);
      }
    }
  },
  actions: {
    // 加载购物车
    async loadCart({ commit }) {
      const res = await api.getCartList();
      commit('SET_ITEMS', res.data);
    },
    // 更新数量
    async updateQuantity({ commit }, { cartId, quantity }) {
      await api.updateCartQuantity(cartId, quantity);
      commit('UPDATE_QUANTITY', { cartId, quantity });
    },
    // 删除商品
    async removeItem({ commit }, cartId) {
      await api.removeCartItem(cartId);
      commit('REMOVE_ITEM', cartId);
    }
  }
}

Review 3: 订单创建模块

  • Reviewer: 杨浩
  • Reviewee: 赖顺炜

Review内容:

  • ✅ 代码规范:符合编码规范
  • ✅ 业务逻辑:订单创建流程正确
  • ✅ 数据验证:参数校验完整
  • ✅ 库存处理:库存检查和扣减正确
  • ⚠️ 建议:订单创建需要考虑并发问题

改进措施:

  • 使用数据库事务保证一致性
  • 添加乐观锁防止超卖

代码示例:

// 订单创建接口
@PostMapping("/orders")
@Transactional(rollbackFor = Exception.class)
public Result createOrder(@RequestBody OrderCreateDTO dto) {
    // 1. 参数验证
    if (dto.getItems() == null || dto.getItems().isEmpty()) {
        return Result.error("订单商品不能为空");
    }
    
    // 2. 检查库存
    for (OrderItemDTO item : dto.getItems()) {
        Book book = bookService.getById(item.getBookId());
        if (book == null) {
            return Result.error("商品不存在:" + item.getBookId());
        }
        if (book.getStock() < item.getQuantity()) {
            return Result.error("库存不足:" + book.getTitle());
        }
    }
    
    // 3. 创建订单
    Order order = new Order();
    order.setOrderNo(OrderUtil.generateOrderNo());
    order.setBuyerId(UserContext.getUserId());
    order.setStatus(OrderStatus.UNPAID);
    // ... 设置其他字段
    
    orderService.save(order);
    
    // 4. 创建订单明细
    for (OrderItemDTO item : dto.getItems()) {
        OrderItem orderItem = new OrderItem();
        orderItem.setOrderId(order.getOrderId());
        orderItem.setBookId(item.getBookId());
        orderItem.setQuantity(item.getQuantity());
        // ... 设置其他字段
        
        orderItemService.save(orderItem);
        
        // 5. 扣减库存(使用乐观锁)
        boolean success = bookService.decreaseStock(
            item.getBookId(), 
            item.getQuantity()
        );
        if (!success) {
            throw new BusinessException("库存扣减失败");
        }
    }
    
    // 6. 清空购物车
    cartService.clearByIds(dto.getCartIds());
    
    return Result.success(order);
}
-- 使用乐观锁扣减库存
UPDATE book 
SET stock = stock - #{quantity}, 
    version = version + 1
WHERE book_id = #{bookId} 
  AND stock >= #{quantity}
  AND version = #{version}

六、项目运行截图/代码

6.1 书籍搜索页面

功能说明:

  • 搜索输入框和搜索按钮
  • 搜索历史记录
  • 热门搜索推荐
  • 搜索结果展示(支持排序)
  • 分页功能

测试结果: ✅ 功能正常

代码片段:

<div className="books-page">
      <header className="books-header">
        <h1>📚 二手书市场</h1>
        <Link to="/publish" className="btn btn-primary">发布二手书</Link>
      </header>

      <div className="search-bar">
        <input
          type="search"
          placeholder="搜索书名、作者或 ISBN..."
          value={keyword}
          onChange={(e) => setKeyword(e.target.value)}
        />
      </div>

      {paged.length === 0 ? (
        <p className="empty-hint">
          {keyword ? '未找到匹配的书籍' : '暂无书籍,快来发布第一本吧!'}
        </p>
      ) : (
        <>
          <ul className="book-list">
            {paged.map((book) => (
              <li key={book.id} className="book-card">
                <Link to={`/books/${book.id}`} className="book-link">
                  <h3 className="book-title">{book.title}</h3>
                  <p className="book-author">{book.author}</p>
                  <p className="book-price">¥{book.price?.toFixed(2)}</p>
                  <span className="book-condition">{book.condition}</span>
                </Link>
              </li>
            ))}
          </ul>

          {totalPages > 1 && (
            <div className="pagination">
              <button
                disabled={currentPage === 1}
                onClick={() => setCurrentPage((p) => p - 1)}
              >
                上一页
              </button>
              <span>
                {currentPage} / {totalPages}
              </span>
              <button
                disabled={currentPage === totalPages}
                onClick={() => setCurrentPage((p) => p + 1)}
              >
                下一页
              </button>
            </div>
          )}
        </>
      )}

      <footer className="page-footer">
        <Link to="/">← 返回首页</Link>
      </footer>
    </div>

6.2 购物车页面

功能说明:

  • 商品列表展示(封面、书名、价格、数量)
  • 商品选择(单选、全选)
  • 数量修改(+/-按钮)
  • 商品删除
  • 总价实时计算
  • 结算按钮

测试结果: ✅ 功能正常

代码片段:

<template>
  <v-container>
    <v-card>
      <v-card-title>
        购物车
        <v-spacer />
        <v-btn text color="error" @click="clearSelected">删除选中</v-btn>
      </v-card-title>
      
      <v-card-text>
        <!-- 全选 -->
        <v-checkbox
          v-model="selectAll"
          label="全选"
          @change="toggleSelectAll"
        />
        
        <!-- 商品列表 -->
        <cart-item
          v-for="item in cartItems"
          :key="item.cartId"
          :item="item"
          :selected="isSelected(item.cartId)"
          @select="toggleSelect"
          @update-quantity="updateQuantity"
          @remove="removeItem"
        />
      </v-card-text>
      
      <v-card-actions>
        <v-spacer />
        <div class="total-price">
          总计:<span class="price">¥{{ totalPrice }}</span>
        </div>
        <v-btn color="primary" large @click="checkout">
          结算({{ selectedCount }})
        </v-btn>
      </v-card-actions>
    </v-card>
  </v-container>
</template>

6.3 个人中心页面

功能说明:

  • 用户头像和基本信息
  • 个人信息编辑
  • 收货地址管理
  • 我的订单入口
  • 我的发布入口

测试结果: ✅ 功能正常

代码片段:

<div className="page-container profile-page">
      <h1>个人中心</h1>

      {/* 用户信息卡片 */}
      <section className="profile-card">
        <div className="profile-header">
          <div className="avatar">
            {profile?.nickname?.charAt(0) || '?'}
          </div>
          <div className="profile-info">
            {editing ? (
              <div className="edit-nickname">
                <input
                  type="text"
                  value={nickname}
                  onChange={(e) => setNickname(e.target.value)}
                  className="nickname-input"
                  placeholder="请输入昵称"
                  maxLength={20}
                />
              </div>
            ) : (
              <h2 className="user-nickname">{profile?.nickname}</h2>
            )}
            <p className="email">{profile?.email}</p>
          </div>
          {editing ? (
            <div className="edit-actions">
              <button 
                className="btn-primary" 
                onClick={handleSave}
                disabled={saving}
              >
                {saving ? '保存中...' : '保存'}
              </button>
              <button 
                className="btn-secondary" 
                onClick={() => { setEditing(false); setNickname(profile?.nickname); }}
              >
                取消
              </button>
            </div>
          ) : (
            <button className="btn-secondary" onClick={() => setEditing(true)}>
              ✏️ 编辑
            </button>
          )}
        </div>
        <p className="join-date">
          🗓️ 加入时间:{new Date(profile?.createdAt).toLocaleDateString('zh-CN')}
        </p>
      </section>

      {/* 统计数据 */}
      <section className="profile-stats">
        <div className="stat-item" onClick={() => navigate('/orders')}>
          <span className="stat-value">{stats.orders}</span>
          <span className="stat-label">订单</span>
        </div>
        <div className="stat-item" onClick={() => navigate('/publish')}>
          <span className="stat-value">{stats.published}</span>
          <span className="stat-label">发布</span>
        </div>
        <div className="stat-item">
          <span className="stat-value">{stats.reviews}</span>
          <span className="stat-label">评价</span>
        </div>
      </section>

      {/* 功能入口 */}
      <section className="profile-menu">
        <div className="menu-item" onClick={() => navigate('/orders')}>
          <span className="menu-icon">📦</span>
          <span className="menu-text">我的订单</span>
          <span className="menu-arrow">›</span>
        </div>
        <div className="menu-item" onClick={() => navigate('/cart')}>
          <span className="menu-icon">�</span>
          <span className="menu-text">购物车</span>
          <span className="menu-arrow">›</span>
        </div>
        <div className="menu-item" onClick={() => navigate('/publish')}>
          <span className="menu-icon">📚</span>
          <span className="menu-text">发布书籍</span>
          <span className="menu-arrow">›</span>
        </div>
        <div className="menu-item" onClick={() => navigate('/books')}>
          <span className="menu-icon">�</span>
          <span className="menu-text">浏览书籍</span>
          <span className="menu-arrow">›</span>
        </div>
      </section>

      {/* 退出登录 */}
      <button className="btn-danger logout-btn" onClick={handleLogout}>
        退出登录
      </button>
    </div>

6.4 收货地址管理

功能说明:

  • 地址列表展示
  • 添加新地址
  • 编辑地址
  • 删除地址
  • 设置默认地址

测试结果: ✅ 功能正常

代码片段:

<div className="address-manager">
      <div className="address-header">
        <h3>收货地址</h3>
        <button 
          className="btn-add-address"
          onClick={() => setShowForm(!showForm)}
        >
          {showForm ? '取消' : '+ 新增地址'}
        </button>
      </div>

      {showForm && (
        <form className="address-form" onSubmit={handleSubmit}>
          <div className="form-row">
            <input
              type="text"
              placeholder="收件人姓名"
              value={form.recipientName}
              onChange={e => setForm({...form, recipientName: e.target.value})}
              required
            />
            <input
              type="tel"
              placeholder="手机号码"
              value={form.phone}
              onChange={e => setForm({...form, phone: e.target.value})}
              required
            />
          </div>
          <div className="form-row">
            <input
              type="text"
              placeholder="省份"
              value={form.province}
              onChange={e => setForm({...form, province: e.target.value})}
              required
            />
            <input
              type="text"
              placeholder="城市"
              value={form.city}
              onChange={e => setForm({...form, city: e.target.value})}
              required
            />
            <input
              type="text"
              placeholder="区县"
              value={form.district}
              onChange={e => setForm({...form, district: e.target.value})}
              required
            />
          </div>
          <input
            type="text"
            placeholder="详细地址"
            value={form.detailAddress}
            onChange={e => setForm({...form, detailAddress: e.target.value})}
            required
            className="full-width"
          />
          <label className="checkbox-label">
            <input
              type="checkbox"
              checked={form.isDefault}
              onChange={e => setForm({...form, isDefault: e.target.checked})}
            />
            设为默认地址
          </label>
          <button type="submit" className="btn-submit">保存地址</button>
        </form>
      )}

      <div className="address-list">
        {addresses.length === 0 ? (
          <p className="no-address">暂无收货地址,请添加</p>
        ) : (
          addresses.map(addr => (
            <div 
              key={addr.id} 
              className={`address-card ${selectedId === addr.id ? 'selected' : ''}`}
              onClick={() => handleSelect(addr.id)}
            >
              <div className="address-info">
                <div className="address-name">
                  <span className="recipient">{addr.recipientName}</span>
                  <span className="phone">{addr.phone}</span>
                  {addr.isDefault && <span className="default-tag">默认</span>}
                </div>
                <div className="address-detail">
                  {addr.province} {addr.city} {addr.district} {addr.detailAddress}
                </div>
              </div>
              <button 
                className="btn-delete"
                onClick={(e) => {
                  e.stopPropagation();
                  handleDelete(addr.id);
                }}
              >
                删除
              </button>
            </div>
          ))
        )}
      </div>
    </div>

6.5 接口测试(Postman)

搜索接口测试:

GET http://localhost:8081/api/books/search?keyword=数学&page=1&size=20&sortBy=relevance

Response:
{
  "code": 200,
  "message": "success",
  "data": {
    "list": [
      {
        "bookId": 1,
        "title": "高等数学(上册)",
        "author": "同济大学数学系",
        "price": 35.00,
        "relevance": 0.95
      },
      {
        "bookId": 2,
        "title": "线性代数",
        "author": "同济大学数学系",
        "price": 28.00,
        "relevance": 0.85
      }
    ],
    "total": 12,
    "page": 1,
    "size": 20
  }
}

测试结果: ✅ 接口正常


订单创建接口测试:

POST http://localhost:8081/api/orders

Request:
{
  "items": [
    {
      "bookId": 1,
      "quantity": 1
    }
  ],
  "addressId": 1,
  "shippingMethod": 2,
  "cartIds": [1]
}

Response:
{
  "code": 200,
  "message": "订单创建成功",
  "data": {
    "orderId": 1,
    "orderNo": "202511211430251234567890",
    "buyerId": 1,
    "totalPrice": 35.00,
    "shippingFee": 5.00,
    "actualPrice": 40.00,
    "status": 0,
    "createTime": "2025-11-21 14:30:25"
  }
}

测试结果: ✅ 接口正常


个人信息接口测试:

GET http://localhost:8081/api/users/profile

Response:
{
  "code": 200,
  "message": "success",
  "data": {
    "userId": 1,
    "studentId": "3123004462",
    "username": "杨浩",
    "email": "yanghao@example.com",
    "phone": "13800138000",
    "avatar": "https://oss.example.com/avatar1.jpg",
    "role": 1,
    "createTime": "2025-11-19 10:35:20"
  }
}

测试结果: ✅ 接口正常


6.6 数据库数据

订单表数据:

mysql> SELECT order_id, order_no, buyer_id, total_price, status FROM `order` LIMIT 3;
+----------+----------------------------+----------+-------------+--------+
| order_id | order_no                   | buyer_id | total_price | status |
+----------+----------------------------+----------+-------------+--------+
|        1 | 202511211430251234567890   |        1 |       35.00 |      0 |
|        2 | 202511211445301234567891   |        1 |       70.00 |      0 |
|        3 | 202511211520151234567892   |        3 |       42.00 |      0 |
+----------+----------------------------+----------+-------------+--------+
3 rows in set (0.00 sec)

订单明细表数据:

mysql> SELECT * FROM order_item LIMIT 3;
+---------+----------+---------+------------------------+-------+----------+---------+
| item_id | order_id | book_id | book_title             | price | quantity | subtotal|
+---------+----------+---------+------------------------+-------+----------+---------+
|       1 |        1 |       1 | 高等数学(上册)        | 35.00 |        1 |   35.00 |
|       2 |        2 |       1 | 高等数学(上册)        | 35.00 |        1 |   35.00 |
|       3 |        2 |       2 | 线性代数               | 28.00 |        1 |   28.00 |
+---------+----------+---------+------------------------+-------+----------+---------+
3 rows in set (0.00 sec)

收货地址表数据:

mysql> SELECT * FROM address LIMIT 2;
+------------+---------+---------------+----------------+--------+--------+----------+---------------------+------------+
| address_id | user_id | receiver_name | receiver_phone | province | city  | district | detail              | is_default |
+------------+---------+---------------+----------------+--------+--------+----------+---------------------+------------+
|          1 |       1 | 杨浩          | 13800138000    | 福建省 | 福州市 | 闽侯县   | 福州大学紫金港校区   |          1 |
|          2 |       1 | 杨浩          | 13800138000    | 福建省 | 福州市 | 闽侯县   | 福州大学旗山校区     |          0 |
+------------+---------+---------------+----------------+--------+--------+----------+---------------------+------------+
2 rows in set (0.00 sec)

测试结果: ✅ 数据正常存储


七、每日个人总结

7.1 杨浩

今天完成了书籍搜索功能的开发,实现了搜索历史和热门推荐,用户体验很好。开始了订单创建页面的开发,这是一个比较复杂的页面,需要展示多个商品、收货地址、配送方式等信息。

团队进度持续超前,大家都很有信心。明天准备进行一次完整的功能演示,展示我们的成果。

今日收获:

  • 掌握了搜索功能的实现方法
  • 学会了如何设计复杂的表单页面
  • 项目管理能力提升

明日目标:

  • 完成订单创建页面
  • 完成个人中心页面
  • 准备功能演示

7.2 戴宏翔

今天完成了个人信息和收货地址接口的开发,功能比较简单,进度很顺利。修复了购物车删除接口的Bug,提高了代码的健壮性。

明天开始面交地址功能的开发,卖家发布书籍时需要填写面交地址,买家下单后可查看卖家提供的面交地点进行当面交易。作为PM,我会继续关注项目进度和质量。

今日收获:

  • 学会了如何处理异常情况
  • 代码健壮性意识增强
  • 项目管理经验增加

明日目标:

  • 完成面交地址接口开发
  • 完成订单确认与面交流程处理
  • 进行代码Review

7.3 莫圣韬

今天对搜索和购物车模块进行了测试,发现了3个Bug,都已经反馈给开发人员。其中购物车删除接口的Bug已经修复,其他两个Bug正在修复中。

测试工作让我对业务逻辑有了更深入的理解。明天继续对订单模块进行测试,这是核心功能,需要仔细测试。

今日收获:

  • 测试能力持续提升
  • 学会了如何编写性能测试用例
  • Bug跟踪管理经验增加

明日目标:

  • 对订单创建接口进行测试
  • 对面交地址接口进行测试
  • 编写测试报告

7.4 赖顺炜

今天完成了搜索和订单创建接口的开发,这两个都是核心功能。搜索功能使用了MySQL全文索引,性能很好。订单创建使用了乐观锁防止超卖,保证了数据一致性。

明天继续订单模块的开发,完成订单查询和状态流转功能。

今日收获:

  • 掌握了乐观锁的使用方法
  • 学会了如何处理并发问题
  • 订单业务逻辑理解更深入

明日目标:

  • 完成订单查询接口
  • 完成订单状态流转逻辑
  • 完成评价功能接口

7.5 陈东楷

今天主要工作是更新文档和准备明天的功能演示PPT。接口文档的更新需要与开发人员密切沟通,确保文档的准确性。

功能演示PPT需要展示我们的核心功能和亮点,让大家看到我们的成果。

今日收获:

  • 文档管理能力持续提升
  • 学会了如何制作演示PPT
  • 沟通协调能力增强

明日目标:

  • 完善功能演示PPT
  • 协助进行功能演示
  • 编写冲刺博客

7.6 刘霆浩

今天完成了购物车页面的开发,使用Vuex管理状态,逻辑清晰,代码质量不错。购物车页面的交互比较复杂,但最终实现得很流畅。

明天开始订单列表和收货地址页面的开发,这两个页面相对简单。

今日收获:

  • 掌握了Vuex状态管理的高级用法
  • 学会了如何设计复杂的交互逻辑
  • 前端架构设计能力提升

明日目标:

  • 完成订单列表页面
  • 完成收货地址页面
  • 优化前端性能

书海拾贝队 - Alpha冲刺 Day 4 完成

posted @ 2025-12-03 21:04  elysia。。。  阅读(2)  评论(0)    收藏  举报