166 Commits

Author SHA1 Message Date
becomer 6bad918dd8 fix: 签到照片上传 405 + 必填样式 + 选图立即上传保存
ci/woodpecker/tag/build Pipeline was successful
1. 405 根因:前端 saveTaskForm 用 PUT,后端只注册 POST 路由,
   Fiber 返回 405。前端改 POST,后端同时兼容 POST/PUT
2. isPhoto=1 时签到照片标记必填(后端 Required + 前端红星)
3. 图片直传 OBS 成功后立即保存表单,图片地址持久化到数据库,
   不再等手动点保存;上传过程失败给出 toast 提示(补 useMessage 引入)
2026-08-23 19:44:15 +08:00
becomer fa9d10c140 fix: 无历史表单时用学校配置签到范围点兜底填充经纬度地址
ci/woodpecker/tag/build Pipeline was successful
signPlaceSelected 实际返回 JSON 数组,原代码按 string 断言导致
提取失败(longitude/latitude/signAddress 为 null 也无法兜底),
表单经纬度地址为空。改为兼容 string/数组两种格式,无历史表单时
取学校配置的第一个签到范围点作为默认坐标
2026-08-23 19:36:27 +08:00
becomer 67bdd8678a 用户名改用学校域名短码:school_id → wecloudUrl 子域(如 xacxxy-2346171010)
ci/woodpecker/tag/build Pipeline was successful
buildUsername 通过 SchoolDomainCode 从学校详情 wecloudUrl/ampUrl/idsUrl
解析真实域名短码(去掉 .campusphere.net),无可用域名时兜底学校 id;
存量 6 个用户已按新格式迁移(cdpc/gzws/amtc/sdjnwx/wsfy/xacxxy)
2026-08-23 19:28:37 +08:00
becomer 4a3fe79a89 fix: 任务相关接口域名改为从学校详情解析真实 host,修复查不到任务列表
ci/woodpecker/tag/build Pipeline was successful
根因: task.go 6 处用 school_id 拼接 https://{school_id}.campusphere.net,
绝大多数学校 school_id 是 UUID/纯数字,并非真实域名(如延安大学西安创新学院
真实域名为 xacxxy.campusphere.net,拼接域名 DNS 直接解析失败),导致添加任务时
查询不到任务列表;仅 school_id 恰好为域名短码的学校(如济南护理 sdjnwx)可用。

修复: 新增 getSchoolHost(schoolID),优先从学校详情接口 wecloudUrl/ampUrl/idsUrl
解析真实域名,内存缓存避免重复请求;GetSchoolDetail 失败时兜底原拼接逻辑。
覆盖 GetTaskTitles/GetTaskForm/ListTasks/ExecuteTask/GetUploadPolicy/GetPreviewUrl。

已验证: 延安大学西安创新学院真实域名可查到「毕业班学生夜间查寝」任务,拼接域名 DNS 解析失败。
2026-08-23 19:25:53 +08:00
becomer 521c4db023 feat: 用户名统一为「学校id-学工号」格式,不再使用 tenantCode
ci/woodpecker/tag/build Pipeline was successful
- buildUsername 简化为 school.ID + "-" + studentID(全部学校统一用学校 id,UUID/短码/纯数字均可)
- 移除 schoolAbbr/hasLatinLetter 及 TenantCode 字段
- auth_username_test.go 更新为 4 种 id 形态用例
- 生产库 5 个存量用户已迁移为新格式(如 sdjnwx-202205010060、4877427c-...-12442703276)
2026-08-17 11:47:23 +08:00
becomer 974795b0c0 feat: 用户名为「学校英文简写+学工号」格式(学校id短码优先,tenantCode降级)
ci/woodpecker/tag/build Pipeline was successful
- SchoolDetailInfo 新增 TenantCode 字段解析学校编码
- buildUsername 重写: 学校 id 为英文短码(如 sdjnwx)时直接使用;UUID/纯数字 id 降级使用 tenantCode 编码(如山东外事=13874);无则兜底中文简称
- 新增 auth_username_test.go 覆盖 5 种学校 id 形态
- 生产库 5 个存量用户已迁移为新格式(济南护理 sdjnwx 开头,其余 tenantCode 开头)
2026-08-17 11:32:19 +08:00
becomer e98ce39d84 feat: 系统设置新增「直接注册送多少积分」配置,无邀请码注册用户按配置赠送奖励积分
ci/woodpecker/tag/build Pipeline was successful
- settings.go: register_reward 配置项(默认 1.00),加入 GetSettings 默认值与更新白名单
- auth.go: getRegisterRewardAmount() 读取配置;findOrCreateUser 在无邀请码注册时发放奖励积分并推送「注册奖励到账」系统公告
- AdminSettings.vue: 奖励设置卡片新增「直接注册奖励积分」输入项与保存
2026-08-16 23:50:39 +08:00
becomer 165be6d472 feat: 用户管理列表增加设备码列 + 登录失败工单增加联系邮箱(国内知名邮箱白名单下拉)
ci/woodpecker/tag/build Pipeline was successful
- 用户管理表格新增设备码列(未绑定显示占位),后端列表接口返回 mobileCode/mobileType
- 登录失败提交工单新增联系邮箱字段:前缀输入 + 国内知名邮箱后缀下拉选择,
  后端白名单校验(仅qq/126/163/foxmail等15个国内邮箱),适配完成后用于联系用户
- 待适配学校管理页新增联系邮箱列
2026-08-16 16:52:21 +08:00
becomer 02143e66fb fix: 修复新版CAS学校登录失败(DoNotParseResponse下响应体读取为空) + 公告列表来源筛选、系统公告置底
ci/woodpecker/tag/build Pipeline was successful
- login_cas.go: DoNotParseResponse 模式下 .Body() 恒为空,统一改用 RawBody 读取,
  修复山东外事职业大学等 CAS 学校登录页解析失败问题
- 公告列表: 后端支持 ?source=manual|system 筛选,系统公告固定排在列表最后
- 管理端公告页: 顶部新增来源类型筛选(全部/手动创建/系统自动)
2026-08-16 16:41:07 +08:00
becomer 43d2676b71 feat: 公告编辑功能、管理表格手机端横向滚动、admin/用户token隔离
ci/woodpecker/tag/build Pipeline was successful
2026-08-16 16:24:34 +08:00
becomer 34175956e1 fix: abnormal reason field rendered twice + required validation
ci/woodpecker/tag/build Pipeline was successful
- Backend: abnormalReason always Show=false (data carrier only), no longer
  rendered as a standalone field; frontend linkage shows it when isMalposition=是
- Frontend: require abnormal reason when isMalposition=是 on save
2026-08-09 16:53:33 +08:00
becomer e79642694b fix: pass both username and ltId to IAP checkNeedCaptcha for school compatibility
ci/woodpecker/tag/build Pipeline was successful
2026-08-09 16:41:20 +08:00
becomer e8055c8441 fix: recent task list misses sign tasks when API returns no-data error code
ci/woodpecker/tag/build Pipeline was successful
- Treat "no task" error codes (e.g. errCode=1 暂无签到任务) as empty list
  instead of failure, so sign tasks fall back to monthly history query
- Fall back to current month query when today's query fails (not only when empty)
- Log per-task-type fetch errors in FetchAllRecentTasks instead of silently dropping
2026-08-09 15:57:10 +08:00
becomer 63b002d074 feat: announcement system upgrade + user management
ci/woodpecker/tag/build Pipeline failed
ci/woodpecker/push/build Pipeline was successful
- Add Source/TargetUserID fields to announcements, support individual push
- Add status (active/disabled) and DisabledReason to SysUser
- Add admin user management API (list, detail, enable/disable)
- Add login disabled check with reason prompt
- Add system-generated invitation notifications
- Allow invite reward amount configurable via system settings
- Frontend: AdminUsers page, update AdminAnnouncements with target user support
2026-07-05 15:23:42 +08:00
becomer f495ad600b fix: align admin API routes with frontend and set admin rate to 0
ci/woodpecker/push/build Pipeline was successful
2026-07-03 16:27:35 +08:00
becomer 2e2c161770 feat: init cpdaily-xiaozhushou with blue-green deploy
- backed/: Go Fiber backend with cpdaily integration
- frondend/: Vue 3 + Vite frontend
- Dockerfile: multi-stage build (Node → Go → Alpine)
- deploy/docker-compose.yml: production compose file
- .woodpecker/build.yml: CI/CD with blue-green zero-downtime deploy
- /health endpoint for deployment health checks
- Port 8884/8885 blue-green swap via 1Panel OpenResty
2026-07-03 15:37:55 +08:00