Day4 Scrum冲刺博客

Day4 Scrum冲刺博客

1. 团队会议

todo补充会议照片

1)昨天已完成的工作

  • 前端
    • 实现了数据过滤与分页核心逻辑与分页控制功能
    • 完成了表单中的通知公告初稿
  • 后端
    • 实现了大模型api的意图整理和栏目分类
    • 实现了关键词划分算法
    • 实现了数据清洗正则化的加强
  • 测试
    • 检查新加入各代码文件格式清晰性

2)今天计划完成的工作

  • 前端
    • 初步完成了四个通知栏目页的搭建
  • 后端
    • 完成了数据库建立的完整流程
    • 完成了时间信息的提取函数
    • 规定了部分接口格式
  • 测试
    • 检查新加入各代码文件格式清晰性
    • 准备开始测试

3)工作中遇到的困难

  • 前端
    • 于每个栏目接口返回的数据结构存在细微差异,需要额外处理字段适配。
  • 后端
    • 在时间信息提取函数开发过程中,发现部分爬取数据的日期格式不统一(如 yyyy/MM/dd、yyyy-MM-dd、中文日期等),需要编写更全面的正则与容错处理。
  • 测试
    • 在确认新加入代码文件的格式时,对于不同方向的代码差异较大,需对代码语言进行学习确认。

2. 项目燃尽图

今日为第四天,已快于理想进度。

3.代码/文档签入记录

4. 运行截图

  • 前端

    • 初步完成了通知栏目页的搭建

      • 相关功能代码

        // 总数据条数
        const totalItems = computed(() => filteredNotices.value.length);
        
        // 总页数
        const totalPages = computed(() =>
          Math.ceil(totalItems.value / PAGE_SIZE.value)
        );
        
        // 当前页码
        const currentPage = ref(1);
        
        // 当前页显示的数据
        const currentPageData = computed(() => {
          const startIndex = (currentPage.value - 1) * PAGE_SIZE.value;
          const endIndex = startIndex + PAGE_SIZE.value;
          return filteredNotices.value.slice(startIndex, endIndex);
        });
        
        // 可见页码
        const visiblePages = computed(() => {
          const pages = [];
          const total = totalPages.value;
          const current = currentPage.value;
        
          if (total <= 5) {
            for (let i = 1; i <= total; i++) {
              pages.push(i);
            }
            return pages;
          }
        
          pages.push(1);
        
          if (current > 3) {
            pages.push("...");
          }
        
          const start = Math.max(2, current - 1);
          const end = Math.min(total - 1, current + 1);
        
          for (let i = start; i <= end; i++) {
            pages.push(i);
          }
        
          if (current < total - 2) {
            pages.push("...");
          }
        
          pages.push(total);
        
          return pages;
        });
        
        // 上一页
        const prevPage = () => {
          if (currentPage.value > 1) {
            currentPage.value--;
          }
        };
        
        // 下一页
        const nextPage = () => {
          if (currentPage.value < totalPages.value) {
            currentPage.value++;
          }
        };
        
        // 跳转指定页码
        const goToPage = (page) => {
          if (typeof page === "number" && page >= 1 && page <= totalPages.value) {
            currentPage.value = page;
          }
        };
        
        // 监听总页数变化
        watch(totalPages, () => {
          if (currentPage.value > totalPages.value) {
            currentPage.value = Math.max(1, totalPages.value);
          }
        });
        </script>
        

  • 后端

    • 实现了时间关键词的提取与解析

      import re
      from datetime import datetime, timedelta
      
      def extract_and_convert_time(input_sentences):
          """
          提取句子中的时间关键词,并转换为具体日期(mm月dd日格式)
          
          参数:
              input_sentences: list,输入的句子列表(如["明天图书馆有什么活动", "最近宿舍的热水供应时间"])
          
          返回:
              list,每个元素为字典,包含句子、提取的时间关键词、转换后的具体日期
          """
          # 1. 定义时间关键词正则模式(覆盖直接日期、相对时间、模糊时间)
          # 直接日期:支持“11月13日”“十二月十号”“12-05”“2025年3月20日”等格式
          direct_date_pattern = r"""
          (?:\d{4}年)?                # 可选的年份(如2025年)
          (?:\d{1,2}月|十二|十一|十|九|八|七|六|五|四|三|二|一)  # 月份(数字或中文)
          (?:\d{1,2}日|\d{1,2}号|十|十一|十二|十三|十四|十五|十六|十七|十八|十九|二十|二十一|二十二|二十三|二十四|二十五|二十六|二十七|二十八|二十九|三十|三十一)  # 日期(数字或中文)
          |(?:\d{1,2}-\d{1,2})        # 短横线格式(如12-05)
          """
          
          # 相对时间关键词(映射为天数偏移)
          relative_time_map = {
              "今天": 0, "明天": 1, "后天": 2, "大后天": 3,
              "昨天": -1, "前天": -2, "大前天": -3,
              "本周": 0, "本周一": 0 - datetime.now().weekday(), "本周二": 1 - datetime.now().weekday(),
              "本周三": 2 - datetime.now().weekday(), "本周四": 3 - datetime.now().weekday(),
              "本周五": 4 - datetime.now().weekday(), "本周六": 5 - datetime.now().weekday(),
              "本周日": 6 - datetime.now().weekday()
          }
          
          # 模糊时间关键词(映射为日期范围)
          fuzzy_time_map = {
              "最近": (0, 7),    # 今天到7天后
              "近期": (0, 14),   # 今天到14天后
              "近几天": (0, 3),  # 今天到3天后
              "近一周": (0, 7),  # 今天到7天后
              "近两周": (0, 14), # 今天到14天后
              "近一个月": (0, 30)# 今天到30天后
          }
          
          # 合并所有时间关键词模式(忽略空格,使用VERBOSE模式)
          time_pattern = re.compile(
              rf"""
              ({direct_date_pattern}|{"|".join(re.escape(k) for k in relative_time_map.keys())}|{"|".join(re.escape(k) for k in fuzzy_time_map.keys())})
              """,
              re.VERBOSE | re.IGNORECASE
          )
          
          # 中文数字转阿拉伯数字(用于月份/日期转换)
          chinese_num_map = {
              "一": 1, "二": 2, "三": 3, "四": 4, "五": 5, "六": 6, "七": 7, "八": 8, "九": 9,
              "十": 10, "十一": 11, "十二": 12, "十三": 13, "十四": 14, "十五": 15,
              "十六": 16, "十七": 17, "十八": 18, "十九": 19, "二十": 20,
              "二十一": 21, "二十二": 22, "二十三": 23, "二十四": 24, "二十五": 25,
              "二十六": 26, "二十七": 27, "二十八": 28, "二十九": 29, "三十": 30, "三十一": 31
          }
          
          # 2. 处理每个句子
          result = []
          today = datetime.now().date()  # 当前日期(仅日期部分,忽略时间)
          
          for sentence in input_sentences:
              # 提取所有时间关键词(去重)
              time_keywords = list(set(time_pattern.findall(sentence)))
              converted_times = []
              
              for keyword in time_keywords:
                  keyword = keyword.strip()
                  
                  # 3. 处理相对时间(如“明天”“昨天”)
                  if keyword in relative_time_map:
                      offset_days = relative_time_map[keyword]
                      target_date = today + timedelta(days=offset_days)
                      converted_times.append(target_date.strftime("%m月%d日"))
                  
                  # 4. 处理模糊时间(如“最近”“近一周”)
                  elif keyword in fuzzy_time_map:
                      start_offset, end_offset = fuzzy_time_map[keyword]
                      start_date = today + timedelta(days=start_offset)
                      end_date = today + timedelta(days=end_offset)
                      converted_times.append(f"{start_date.strftime('%m月%d日')}-{end_date.strftime('%m月%d日')}")
                  
                  # 5. 处理直接日期(如“11月13日”“十二月十号”“12-05”)
                  else:
                      try:
                          # 处理短横线格式(如12-05)
                          if "-" in keyword:
                              month, day = map(int, keyword.split("-"))
                          # 处理点格式(如12.05)
                          if "." in keyword:
                              month, day = map(int, keyword.split("."))
                          else:
                              # 处理中文/数字混合格式(如“十二月十号”“11月13日”)
                              # 提取月份(替换“月”为分隔符)
                              month_part = re.search(r"(.*?)[月]", keyword).group(1) if "月" in keyword else ""
                              # 提取日期(替换“日”“号”为分隔符)
                              day_part = re.search(r"[月](.*?)[日号]", keyword).group(1) if any(c in keyword for c in ["日", "号"]) else ""
                              
                              # 中文数字转阿拉伯数字
                              month = chinese_num_map.get(month_part, int(month_part) if month_part.isdigit() else 1)
                              day = chinese_num_map.get(day_part, int(day_part) if day_part.isdigit() else 1)
                          
                          # 构造日期(年份默认为当前年)
                          target_date = datetime(today.year, month, day).date()
                          # 若日期已过(如当前12月,输入“1月5日”,自动视为明年)
                          if target_date < today and month < today.month:
                              target_date = datetime(today.year + 1, month, day).date()
                          converted_times.append(target_date.strftime("%m月%d日"))
                      except (ValueError, AttributeError):
                          # 日期格式错误时,保留原关键词
                          converted_times.append(f"无法识别:{keyword}")
              
              # 整理结果
              # 包含原句对比,方便测试
              # result.append({
              #     "句子": sentence,
              #     "时间关键词": time_keywords,
              #     "具体时间": converted_times if converted_times else ["未提取到时间"]
              # })
                  # 输入大模型
                  result.append(converted_times)
          
          return result
      
      # ------------------------------ 测试示例 ------------------------------
      if __name__ == "__main__":
          # 测试输入句子列表
          test_sentences = [
              "明天图书馆有什么活动?",
              "最近宿舍的热水供应时间是几点?",
              "11月13日的讲座取消了吗?",
              "十二月十号有没有社团招新?",
              "昨天忘记去取快递了,后天能补取吗?",
              "近一周的食堂菜单会更新吗?",
              "2025年3月20日的会议地点在哪里?",
              "12-05的考试安排出来了吗?",
              "本周五下午有体育课吗?",
              "近一个月的天气预报怎么样?"
          ]
          
          # 执行时间提取与转换
          output = extract_and_convert_time(test_sentences)
          
          # 打印结果
          # for item in output:
          #     print("-" * 50)
          #     print(f"句子:{item['句子']}")
          #     print(f"时间关键词:{item['时间关键词']}")
          #     print(f"具体时间:{item['具体时间']}")
          print(output)
      
      # 本周五识别结果为本周,待改进
      

    • 整合知识库建立整体流程

      from src.crawler.LLM_api.label_agent import create_database_JSON
      from src.crawler.data_clean.reprocess import keyword_process
      from src.crawler.library import crawl_library_func
      
      SAVE_PATH = "src/crawler/news_data"
      
      def data_process_func(save_path):
          crawl_library_func(save_path)
          keyword_process(save_path)
          create_database_JSON(save_path)
          print('知识库信息已更新')
      
      
      data_process_func(SAVE_PATH)
      

5. 每人每日总结

  • 前端
    • 张洁:今天主要完成了四个通知栏目页面的初步结构搭建,包括基础布局、静态数据占位以及路由配置的整理。在实现过程中,需要在保证页面一致性的同时兼顾不同栏目内容的展示逻辑,因此在组件复用与结构划分上进行了一些尝试。整体框架已经清晰,后续会进一步完善细节与交互。
    • 吴佳童:负责与张洁一起完成通知栏目页的搭建,并参与部分组件内容布局优化。在开发中对每个页面的展示结构进行了梳理,确保页面切换与信息展示稳定无误。同时检查了相关组件的数据流向,为后续与后端的真实数据联调提供基础。
    • 李恺凝:为四个通知栏目页提供了 UI 指导与版面结构建议,包括标题层级、信息块分布、色彩和间距统一等,使页面在视觉上保持一致性和层次感。同时根据前端开发需求调整了部分图形样式与布局规范,确保设计与实现能够顺利对齐。
  • 后端
    • 王韵清:完成了系统数据库的整体结构设计与建立,实现了基本的数据表划分和字段定义,使后续的数据存储、查询和爬虫接入有了稳定的基础。在过程中对一些字段间关联关系做了多次调整,确保逻辑合理、扩展性良好。
    • 曾钰仪:实现了时间信息的自动提取函数,能够从爬取的原始文本中稳定识别并解析日期格式。在适配不同网页的时间写法时遇到一些不一致问题,但已通过正则优化提升了兼容性,为后续的排序和筛选功能打下基础。
    • 徐伊彤:制定并实现了部分接口的格式规范,包括响应结构、字段命名规则与基本的请求处理流程。在对齐前后端沟通内容时对接口格式进行过几轮调整,最终确定了统一风格,为团队后续协作提供标准。
  • 测试
    • 戴军霞:今天主要对新增的代码文件进行了格式与规范性检查,包括缩进、命名风格与注释完整性等。在代码结构频繁更新的情况下,需要逐项比对与复核,确保整体项目代码质量保持一致。后续将继续完善测试用例准备工作。
posted @ 2025-11-27 22:59  sevanthea7  阅读(4)  评论(0)    收藏  举报