feat(backend): 调整课程日期为周日并优化计划提交时间窗口

- 将上课日从周六调整为周日,新增 CLASS_WEEKDAY 常量
- 更新 get_class_date 和 get_sunday_of_week 函数以支持周日计算
- 修改 generate_week_list 函数生成周日日期而非周六日期
- 重构月计划和年计划的时间窗口逻辑,增加提前提交功能
- 新增 monthly_window 和 yearly_window 函数定义准确的提交窗口期
- 调整默认周期选择逻辑,支持跨月年的时间窗口
- 添加 period_labels 字段提供前端周期标签显示
- 移除旧的 _validate_current_period 函数
- 完善计划提交验证逻辑,支持多种时间周期类型

chore(miniapp): 更新小程序项目配置

- 补充 project.config.json 中的设置选项
- 调整 project.private.config.json 配置结构
- 移除冗余的页面调试条件配置
- 更新编辑器和编译相关配置项
This commit is contained in:
王宏豪
2026-09-11 17:51:24 +08:00
parent 9a7681112b
commit 65ec4e6a52
2 changed files with 171 additions and 66 deletions

View File

@@ -22,38 +22,34 @@ SELECT_COLS = "id,user_id,class_date,checked_at,status,note"
# 周期列表起始年份
PERIOD_START_YEAR = 2022
# 上课日:每周周日(date.weekday(): 周一=0 ... 周六=5, 周日=6)
CLASS_WEEKDAY = 6
def get_class_date(ref_date=None):
"""获取指定日期所在周的周六日期(上课日)。"""
"""获取指定日期所在自然周的周日日期(上课日)。"""
today = ref_date or date.today()
return today + timedelta(days=(5 - today.weekday()))
return today + timedelta(days=(CLASS_WEEKDAY - today.weekday()))
def get_saturday_of_week(week_monday: date) -> date:
"""给定某周周一,返回该周周六。"""
return week_monday + timedelta(days=5)
def get_sunday_of_week(week_monday: date) -> date:
"""给定某周周一,返回该周周日(上课日)。"""
return week_monday + timedelta(days=CLASS_WEEKDAY)
def generate_week_list(start_year: int = PERIOD_START_YEAR) -> list:
"""
生成从 start_year 到今天的所有上课周(每周六)列表,倒序排列。
返回格式: ["2026-09-19", "2026-09-12", ...]
生成从 start_year 到今天的所有上课周(每周日)列表,倒序排列。
返回格式: ["2026-09-20", "2026-09-13", ...]
"""
today = date.today()
# 找到 start_year 第一个周六
# 从1月1日往前找最近的周六,再往后逐周生成
# 找到 start_year 第一个周日(1月1日之后的第一个周日)
d = date(start_year, 1, 1)
# 调整到第一个周六
days_until_saturday = (5 - d.weekday()) % 7
if days_until_saturday == 0 and d.weekday() != 5:
days_until_saturday = 0
first_saturday = d + timedelta(days=days_until_saturday)
# 确保第一个周六在 start_year 内
if first_saturday.year < start_year:
first_saturday += timedelta(days=7)
days_until_sunday = (CLASS_WEEKDAY - d.weekday()) % 7
first_sunday = d + timedelta(days=days_until_sunday)
weeks = []
current = first_saturday
current = first_sunday
while current <= today + timedelta(days=7): # 多生成一周
weeks.append(current.strftime("%Y-%m-%d"))
current += timedelta(days=7)
@@ -142,7 +138,7 @@ class CheckinRequest(BaseModel):
@router.get("/weeks")
def weeks(user=Depends(get_current_user)):
"""
返回所有上课周列表(每周六日期),从 2022 年到当前,倒序排列。
返回所有上课周列表(每周日日期),从 2022 年到当前,倒序排列。
用于前端做历史周切换选择器。
"""
week_list = generate_week_list()