becomer
|
4ec3e55030
|
v1.2.62:二维码解析全面移到前端,移除后端解析接口与 gozxing 依赖
ci/woodpecker/tag/build Pipeline was successful
① 前端:取消二维码解析的后端降级。二维码一律由前端 jsQR 解码并提取 uuid;
识别失败直接提示用户换更清晰的图片,不再把图片回传后端。
② 后端:删除 POST /task/qr/decode 接口(handler.DecodeTaskQr)及其路由;
删除 qrcode.go 中所有图片解码相关代码(DecodeQRFromImage / decodeQRImage / scaleImage /
ResolveQrUuidFromContent / decodeQrTextToUuid)——后端不再接收二维码图片。
保留 ExtractQrUuid(纯正则文本提取),提交签到(fillScanSubmitForm)与历史值归一化仍在用。
③ 依赖:go mod tidy 移除 github.com/makiuchi-d/gozxing(不再被引用)。
golang.org/x/image 因验证码字体(captcha.go)仍在用,保留。
删除仅供已删测试使用的 internal/service/cpdaily/testdata/test_qr.png。
④ 前端 API:移除 auth.ts 的 decodeQr()。
⑤ 验证:go build / go vet / go test ./...、vue-tsc --noEmit、npm run build 全过。
v1.2.62
|
2026-09-18 16:40:15 +08:00 |
|
becomer
|
0bd354cfee
|
v1.2.61:二维码改前端解析(jsQR)+ 图片上传前压缩 + 修复 message 解构错误 + 上传 loading
ci/woodpecker/tag/build Pipeline was successful
① 修复 message 解构错误(导致「undefined is not an object (evaluating 't.warning')」):
useMessage() 返回的是 { toasts, success, error, info, warning, removeToast } 对象本身,
而 HomeView 与 LeaveView 写成了 const { message } = useMessage(),解构出的 message 恒为 undefined,
所有 message.xxx() 调用都会抛错。改为 const message = useMessage()(其余 18 个文件均为正确写法)。
② 二维码改为前端 jsQR 解析(问题 3、4):
上传二维码时不再走后端解析,直接在前端用 jsQR 从画布像素解码(多尺度尝试 + attemptBoth),
提取 uuid 存表;前端识别失败时降级调用后端 /task/qr/decode(gozxing 多尺度重试)兜底。
好处:免上传、免压缩、响应快;且能正确解析 https://...?uuid=xxx&isNeedExtra=0&schoolId=... 这类链接。
新增依赖 jsqr@^1.4.0。
③ 图片上传前前端压缩到 ≤300KB(问题 4):
签到照片等需上传 OBS 的图片,先经 canvas 逐步降质量/降尺寸压缩到 300KB 以下再上传,
避免大图(如 4032x3024)直传。二维码字段不走压缩(不保存图片,只存 uuid)。
④ 二维码上传增加 loading(问题 1):
原二维码分支从未设置 uploadingImage,故无 loading 效果。现统一走 uploadingImage + uploadingLabel
(解析中/压缩中/上传中),二维码与图片两种字段的 loading 块都补上阶段文案。
⑤ 验证:vue-tsc --noEmit、npm run build 通过。不检查部署。
v1.2.61
|
2026-09-18 16:36:37 +08:00 |
|
becomer
|
6e145f75e1
|
v1.2.60:修复签到照片可能以 base64 存入 formData
ci/woodpecker/tag/build Pipeline was successful
① 问题:签到照片(signImg)本应上传今日校园 OBS 后保存正式 URL,但实测存在 2.1MB 的 base64 记录(id=42)。
根因在前端 handleImageUpload:先把所选图片读成 dataURL 写入 content 作本地预览,上传 OBS 成功后才覆盖为
previewUrl;而以下任一情况都会把 base64 留在表单里并被保存:OBS 返回非 2xx(原代码直接 return 不回滚)、
获取预览 URL 失败(同样不回滚)、网络异常、以及用户在上传完成前就点了保存。
(后端 ExecuteTask 对 base64 有自动补传 OBS 的兜底,所以任务仍能成功,但表单里一直存着大字段。)
② 修复:
- handleImageUpload 各失败路径回滚 content 为原值(prevContent),不再残留 base64;
- 新增 guardBase64Images:保存前校验图片字段不得为 data: 开头(本地预览),
在 saveForm / saveEdit 两处拦截并提示,避免上传未完成时保存。
③ 数据清理(已执行,不可回滚):清空 id=133(二维码 base64,2.9MB)与 id=42(签到照片 base64,2.1MB)
的 form_data,让用户重新填写;全库已无 >50KB 的 formData 记录。
同时删除调试探针 backed/internal/tmpprobe/(含硬编码用户数据,未被任何代码引用)。
④ 验证:vue-tsc --noEmit、npm run build 通过;go build ./... 通过。
v1.2.60
|
2026-09-18 16:26:12 +08:00 |
|
becomer
|
879628d0eb
|
v1.2.59:修复首页接口传输 2.9MB(列表瘦身 + gzip)+ 二维码只存 uuid
ci/woodpecker/tag/build Pipeline was successful
① 根因:GET /api/task/list 每次返回约 2.9MB。ListTasks 用 Find 返回整行 CpTask(含 longtext 的 formData),
而历史数据里 formData 存过 base64 图片(id=133 的 qrCode 单条 2,959,961 字节,实为 4032x3024 现场照片),
且 nginx gzip_types 未覆盖 application/json,明文传输。该任务创建于 09-18 13:25,与“今天突然变慢”吻合。
实测:任务仅 62 条,form_data 合计 515 万字节;某 IP 单日拉取 53 次 ≈ 99MB。
② 列表瘦身:ListTasks 改返回轻量 DTO TaskListItem(不含 formData),并新增服务端预计算的 missingFields
(用已加载的 formData 计算,零额外 IO)。新增 GET /task/form-data/:id 返回该任务已保存表单,供编辑弹窗预填
(/task/form/:id 是从今日校园重拉模板会丢已填值,不能替代)。前端 executeTask 预检改用 missingFields,
openEditModal 改走新接口;TaskInfo.formData 改为可选。
③ 二维码只存 uuid:新增 POST /task/qr/decode,复用后端已有 gozxing 解析(不引入新库),
前端上传后仅保存 uuid(Prompt:中文名“二维码ID”,colName=uuid),不再写入整张 base64 图片。
关键修正:ExtractQrUuid 原先只认 32 位 hex 裸串,而链接里的 uuid 允许 [0-9a-zA-Z_-]+,
仅存裸 uuid 会导致非 hex 学校执行时解析失败 → 新增 bareTokenPattern(8~64 位 token)分支,
并让 fillScanSubmitForm 兼容 uuid/qrCode 双字段名(旧数据不受影响)。
④ gzip:在应用层加 fiber compress 中间件(nginx 由 1Panel 托管、跨 5 站点、不进版本库,不宜直改),
用 Next 排除 SSE 端点 /api/task/execute/*(流式响应不可缓冲)。
⑤ 验证:go build、go vet、go test ./...(新增裸 uuid/非 hex uuid/字段归一化用例)、vue-tsc --noEmit、npm run build 全过。
不清理历史 base64 数据(按要求暂不动)。
v1.2.59
|
2026-09-18 16:09:20 +08:00 |
|
becomer
|
8435095b4f
|
v1.2.58:改为真·蓝绿部署(消除部署期 502)+ 设备码按钮文案随绑定状态变化
ci/woodpecker/tag/build Pipeline was successful
① 部署方式重构为真正的蓝绿(修复 v1.2.55~57 每次部署约 3 分钟的 502 窗口):
根因:旧脚本是「翻到备用端口 → 1 秒后翻回 → 在活跃端口重启容器」,最终稳态只剩一个容器;且两次 nginx -s reload 仅隔 1 秒,openresty 未设 worker_shutdown_timeout(仅 keepalive_timeout 60),旧 worker 会继续持有连接并按旧配置往已删除的备用端口转发 → 502 持续到旧 worker 排空(实测 17:28:27~17:31:21,8885 Connection refused 86 次,8884 为 0)。
新方案:两个固定槽位(blue=8884 / green=8885)常驻。每次部署只更新「当前无流量的备用槽」→ 容器内健康检查 → nginx -t 校验 → 翻一次反代指向它 → 等旧 worker 全部退出;活跃槽容器保留作为上一版本供秒级回滚。因两端口始终都有活容器,旧 worker 无论是否排空都不可能出现 502。
另含:旧命名容器一次性收养(cpdaily-xiaozhushou → cpdaily-xiaozhushou-<端口>,避免下次部署端口冲突)、清理 cpdaily-blue 陈尸容器、反代配置切换前备份与 nginx -t 失败自动回滚、健康检查失败时不动反代。脚本已用 mock docker 干跑验证:两次连续部署正确轮换(8885→8884)、健康检查失败分支正确中止且不改反代。
② 个人中心设备码按钮:未绑定设备码时显示「立即绑定」,已绑定显示「重新绑定」(新增 hasDeviceCode computed)。
③ 验证:vue-tsc --noEmit、npm run build(含 postbuild-css)全过。前端改动 + CI 配置,无后端逻辑变更。
v1.2.58
|
2026-09-17 18:07:21 +08:00 |
|
becomer
|
200edd75bb
|
v1.2.57:设备绑定页文案与返回按手机端场景调整
ci/woodpecker/tag/build Pipeline was successful
① 面向手机端(主要客户群为手机用户)重写操作引导,三步简化为两步:第 1 步「保存二维码」(点击上方按钮保存二维码图片)、第 2 步「打开今日校园右上角扫一扫」(扫描二维码,绑定成功后自动跳转);删除原第 3 步「等待自动完成」(信息已并入第 2 步副文案)。
② 顶部说明由「请用今日校园 App 扫描下方二维码完成绑定」改为「请扫描二维码,绑定设备信息」。
③ 底部返回按钮改用 router.back()(原先写死 push('/profile'));因该页当前仅由个人中心「重新绑定」进入,back 即回个人中心,同时避免依赖硬编码路由。
④ 清理与手机端矛盾的文案(原「扫描电脑屏幕上的二维码」)。验证:vue-tsc --noEmit、npm run build 全过。纯前端改动,无后端变更。
v1.2.57
|
2026-09-17 17:27:56 +08:00 |
|
becomer
|
b39f57b879
|
v1.2.56:设备绑定页底部「退出登录」改为「返回」——点击回到个人中心
ci/woodpecker/tag/build Pipeline was successful
① 需求:绑定设备页(/bind-device)底部的「退出登录」按钮改为「返回」,点击回到个人中心。
② 改动:BindDeviceView.vue 底部按钮图标 LogOut→ArrowLeft、文案「退出登录」→「返回」、handleLogout()→handleBack()(router.push('/profile'))。用 push 固定目标而非 back(),因为本页由个人中心「重新绑定」进入(ProfileView.vue:136),返回目标明确。
③ 清理:移除 handleLogout 与 LogOut import(tsconfig 开启 noUnusedLocals,不清理会导致 vue-tsc 报错)。退出登录功能未丢失——个人中心 ProfileView.vue:467-475 保留独立退出入口;轮询/倒计时的清理仍由 onUnmounted 承担,导航离开即触发,无泄漏。
④ 验证:vue-tsc --noEmit、npm run build(含 postbuild-css)全过。纯前端改动,无后端变更。
v1.2.56
|
2026-09-17 17:16:00 +08:00 |
|
becomer
|
f20a6b57c1
|
v1.2.55:弹窗统一化——全站手写弹窗迁移到统一 AppDialog 组件 + 国产浏览器/微信内核兼容
ci/woodpecker/tag/build Pipeline was successful
① 弹窗统一化(核心):新增 AppDialog 组件(reka-ui Dialog 底座),把 13 个视图文件里 34 处手写弹窗全部迁移,全项目手写 role="dialog" 残留归零。
- 目的:以 Dialog 原语换取焦点捕获、Esc 关闭、body 滚动锁定、aria 语义与 Portal 渲染,同时保持与手写弹窗一致的视觉(面板基类 w-full/bg-white/flex-col/overflow-hidden/shadow-xl/max-h-[85vh])。
- 公开 API 与底座解耦:open / variant(sheet|center) / z-class / overlay-class / wrapper-class / panel-class / dismissable / fade / @update:open / 默认插槽。
- 逐处核对:阴影(原无阴影者显式传 shadow-none 抵消基类 shadow-xl、shadow-2xl 显式覆盖)、圆角(非基类值显式覆盖)、fade(原 <Transition name="fade"> 者传 :fade=true)、守卫(dismissable:LeaveView executing/applying、AdminCdks result 视图、AdminPendingSchools rejectSubmitting、HomeView「重新登录」原遮罩不可点故 false)、z-index(z-[60] 等)、定位层边距(wrapper-class px-4/6)。
- fade 实现说明:reka 的 Presence 只识别 CSS animation(读 computed animation-name 并监听节点自身 animationend),不认 Vue 的 class 过渡;故用 CSS animation + reka 输出的 data-state="open|closed" 实现,挂在 DismissableLayer 根节点(即 role="dialog" 节点)。实现在 fade 时额外给 content 根加 relative + 同层 z-class:opacity<1 会形成 z-index:0 的层叠上下文,否则内部 fixed 面板会被 overlay 盖住。
- 迁移固有行为差异:MobileLayout 公告面板失去 slide-up 上滑动画改为 fade;各弹窗新增 Esc 关闭能力(reka 默认);面板固定 overflow-hidden+max-h-[85vh](原无此二类的面板有微调)。非弹窗遮罩(AdminLayout 侧边栏抽屉、右侧滑出公告面板;GuideOverlay 引导层)按判断保留未迁移。
② 国产浏览器/微信内核兼容(chrome78+):
- vite build.target 降到 chrome78(微信 XWEB 常见下限),旧的默认 target 会产出 Chrome 80 以下无法解析的新语法导致白屏。
- 新增 scripts/postbuild-css.mjs 并接入 build:解包 :where、降级 oklch 颜色、剥离 @layer,产出对老内核可用的 CSS;含兜底校验(残留 @layer/oklch/:where 直接失败)。
- index.html 内联补齐 Object.hasOwn(Chrome 93+,reka-ui 与 @vueuse/shared 内部调用;esbuild 只降语法不降运行时 API)。
③ 收尾修复既有问题:AdminUsers 删除从未使用的 Card 死 import;AdminCdks 修正 copiedResultIdx/resultCopiedIdx 变量名不一致(导致结果视图复制高亮失效并抛 ReferenceError);MobileLayout 原 .slide-up-leave-to 误用 transition(随迁移一并移除,问题消失)。
④ 验证:vue-tsc --noEmit、vite build(含 postbuild-css)全过;headless Chrome 实测整站启动渲染正常;全项目残留扫描确认无遗留手写弹窗。
⑤ 本次为纯前端改动(含 reka-ui 依赖),不含后端变更。
v1.2.55
|
2026-09-17 16:05:11 +08:00 |
|
becomer
|
55eff6e80a
|
v1.2.54:修复请假附件区被隐藏——根因:旧套学校 enableAttach 恒为 0,不能作为显示/放行条件——① 实测复现:陈莎莎(ysdwl 昆明文理学院)名下 6 个请假类型,queryLeaveTypeCfg 全部返回 enableAttach=0、attachmentNumberLimit=4(学校实际允许传 4 张,app 内亦显示为可选附件),而 v1.2.53 前端显示条件为 enableAttach===1,导致所有旧套学校附件区被隐藏;多校只读采样(马鞍山/兰州财经/安徽师大/芜湖职大/蚌埠医科/新疆师大/矿大)确认旧套 enableAttach 全为 0、limit 全为 4,属该字段在旧套链路的语义问题而非个例;② 判定修正:可传附件 = enableAttach===1 或 attachmentNumberLimit>0(前端新增 applyAttachVisible;旧套服务端校验同步改为「两者都表明不可用才拒绝」);上限仍取 min(4, 学校值);③ 新套侧补漏:leaveNewToLeaveTypes 在 isVisibledEvidenceFile=false 时不再带出 evidenceFileCountMax(否则前端按「上限>0」会误显示上传入口),仅可见时带出;④ 新增回归测试 TestLeaveNewToLeaveTypesAttachGating(可见/不可见类型分别断言开关与上限);go build、go vet、go test -count=1 ./...、vue-tsc --noEmit、npm run build 全过;⑤ 全流程只读实测(未调用任何提交接口),真实提交由用户自测
ci/woodpecker/tag/build Pipeline was successful
v1.2.54
|
2026-09-16 18:02:35 +08:00 |
|
becomer
|
b436781d7d
|
v1.2.53:请假申请附件支持多图上传(最多 4 张)——用户对比老版本发现「请假那里没有上传图片」——① 现状澄清:上传入口本就存在但被学校开关隐藏(v-if=enableAttach===1),且只能传 1 张;本版新增「附件」字段并支持多图,保留学校开关(用户确认);② 数量上限:min(4, 学校配置)——新增 LeaveMaxAttachCount(未配置/超 4 均按 4,否则取学校值),旧套取 queryLeaveTypeCfg.attachmentNumberLimit、新套取 getLeaveTypeDetail.evidenceFileCountMax;③ 协议确认:两套提交体字段本就是数组(旧套 applyAttach=[{type:1,url}]、新套 attachs=[{attachType:1,attachUrl,obsKey,...}]),多图为自然扩展,无需新增接口;上传/预览复用现有 /api/task/upload-policy、/api/task/preview-url(已含新旧套分流),每张图走一遍链路;④ 后端:LeaveApplyParams.ImageURL→ImageURLs、LeaveNewApplyParams.ImageURL/ImageKey→ImageURLs(每张 obsKey 由 URL 推导);请求体新增 imageUrls[],保留旧 imageUrl 字段做兼容合并(保序去重、剔除空串,避免旧缓存前端附件被静默丢弃);服务端复核:旧套校验 enableAttach 开关与数量上限,新套校验 isVisibledEvidenceFile 开关、数量上限、isRequiredEvidenceFile 必填与 evidenceFileCountMini 张数下限;⑤ 前端:附件区改多图网格(缩略图+单张 X 移除+未达上限显示上传方块),label 显示「最多 N 张,已传 x/N」;多选逐张顺序上传并复用 uploadImageToObs;切换类型时不支持附件则清空、上限变小则截断;提交前复核开关与上限;⑥ 销假保持单图不动(未在本次范围内);⑦ 新增测试:service 层多图断言(旧套 2 张 applyAttach、新套 2 张 attachs 逐张 obsKey)、LeaveMaxAttachCount 边界(0/-1/2/4/9)、空串剔除、handler mergeApplyImageURLs 7 用例(去重/追加/空白裁剪/全空);go build、go vet、go test -count=1 ./...、vue-tsc --noEmit、npm run build 全过
ci/woodpecker/tag/build Pipeline was successful
v1.2.53
|
2026-09-16 17:48:17 +08:00 |
|
becomer
|
ac743eda88
|
v1.2.52:执行日志软删除改造——用户删除仅标记 deleted_at(前台隐藏、任务状态不受影响),后台统计与明细计入已删除(标注「已删除」)——① 动机:日志删除原为物理删除,会连带从后台统计中消失,导致「已执行累计/今日统计」凭空减少,且删除当天成功日志会让任务被跨天重置逻辑误判为未执行、出现重复打卡;② 模型:CpTaskLog / CpLeaveLog 增加 DeletedAt gorm.DeletedAt(带索引),AutoMigrate 自动加列,存量数据 deleted_at 为 NULL 视为未删除,无需数据迁移;③ 前台:GORM 默认作用域自动过滤软删除,用户端日志列表(/task/logs、/leave/logs)与删除接口(DB.Delete 自动转为 UPDATE deleted_at)无需改动即符合预期;④ 任务完成状态:ListTasks 的「当天是否存在成功日志」跨天重置查询改用 Unscoped,删除当天日志不再触发状态回退(否则会重复打卡);⑤ 后台统计:已执行累计、今日状态、今日统计卡片(执行/成功总数)全部改用 Unscoped 并并入请假/销假(cp_leave_logs),口径统一为「签到+查寝+请假+销假」;⑥ 后台明细:AdminListTaskLogs 由单表查询改为两表 UNION(同一条常量 adminLogUnionSQL,事务探针复用),新增 deleted(已删除标注)与 source(1=任务 2=请假销假)字段,请假/销假映射 task_type=leave_apply/leave_report;⑦ 修复 UNION 真实报错:两表分属不同时期建表,字符串列 collation 不一致(cp_task_logs=utf8mb4_unicode_ci / cp_leave_logs=utf8mb4_general_ci),直接 UNION 报 MySQL 1271 Illegal mix of collations,已对请假侧字符串列显式 COLLATE utf8mb4_unicode_ci;⑧ 新增事务级探针 TestSoftDeleteProbe(默认跳过,PROBE_DB=1 时连真实库执行并整体回滚,不改动任何持久数据):覆盖前台隐藏、状态不受影响、后台计入、UNION 标注/deleted/source/success 过滤分支;⑨ 前端:AdminUsers.vue 日志明细类型标签补「请假/销假」、已删除记录追加灰色「已删除」徽标、列表 key 由 id 改为 source-id(两表 id 独立自增会撞键),api/admin.ts 类型同步;⑩ 验证:go build、go vet、go test ./...、PROBE_DB=1 事务探针、vue-tsc --noEmit、npm run build 全过
ci/woodpecker/tag/build Pipeline was successful
v1.2.52
|
2026-09-15 18:38:16 +08:00 |
|
becomer
|
53cbedeb95
|
v1.2.51:泰州学院(tzxy)等新套学校请假/销假适配——新增 wec-counselor-leave-new-apps 全链路 + 按学校应用自动分流
ci/woodpecker/tag/build Pipeline was successful
① 根因与定位:tzxy 的旧前缀 wec-counselor-leave-apps 被网关整体拦截返回 HTTP 420「产品已到期」,
但该校实际使用的是新一代「请销假」应用 wec-counselor-leave-new-apps/stu/mobile/index.html
(由辅导猫首页 getAppInfos 应用列表确认;实际接口实测全部正常)。
新旧两套是完全不同的 API:新套明文 JSON + CpdailyClientType、类型用 typeWid、
审批流/抄送独立接口;旧套 bodyString 加密 + Cpdaily-Extension 签名、类型用 code。
② 自动分流:新增 handler/leave_flavor.go——辅导猫 getAppInfos 探测本校请假应用 openUrl
判定 new/old,探测失败用新套 ping 兜底,结果按学校缓存 30 分钟;
所有请假链路(类型/审批人/待销假列表/销假审批人/销假执行/请假执行/上传策略/预览)按 flavor 分发。
③ 新套实现(cpdaily/leave_new.go):queryLeaveType(分页拉全)、getLeaveTypeDetail(权威开关)、
getApproveFlowList(审批人+flowData)、getCcSearchList/getLastCcObjects(抄送人)、
/stu/leave/apply(明文 JSON 提交)、/stu/leave/list、reportList(规定销假位置)、
getReportApprovers(销假确认人)、queryLeaveDetail、/stu/leave/report(销假提交)、
OBS getUploadPolicy/previewAttachment(COS 风格,obsKey 从 URL 推导与官方前端一致)。
④ 契约翻译:新套数据在 handler 层翻译为现有前端契约(LeaveType/LeaveItem/LeaveApprover),
前端零结构改动;新增 statusText 权威状态文案(新套 1审批中/2即将休假/3休假中/4销假逾期/
5销假确认中/6销假已驳回/7已完成/8已驳回/9已撤销/10退回重填),前端优先展示、旧套回退本地映射;
pending-list 仅对 status 3/4 补拉详情判断 canReport(reportMode 1/2),附图/审批人开关。
⑤ 服务端复核:新套请假执行重新拉类型详情校验(原因必填/字数/证明材料)、审批流候选
(userWid 匹配完整对象、无候选不阻止)、抄送人完整对象解析、离校语义(isLeaveOut 强制时以类型为准);
销假执行复核 canReport 状态与确认人。
⑥ 测试:新增 leave_new_test.go 7 个测试(obsKey 推导/canReport/状态文案/销假表单/请假表单
离校与不离校两分支/响应码解析);go build/go vet/go test 全过;前端 vue-tsc + npm run build 通过;
端到端只读实测 tzxy:flavor=new、5 类型、审批人张文烨、2 销假位置、销假确认人、详情与 OBS 策略全部正常。
v1.2.51
|
2026-09-15 13:34:05 +08:00 |
|
becomer
|
42d3b332a5
|
v1.2.50:辽宁工程技术大学(lntu)登录适配——强制走 CAS + 滑块验证码——① 根因:平台接口返回 joinType=CLOUD(IsIap=true),但网关 /iap/doLogin 不存在(HTTP 405),IAP 账密提交必然失败并返回 FAIL_UPNOTMATCH("用户名或密码不匹配",误导用户以为密码错误);真实链路为 fdm.lntu.edu.cn/iap 302 → 学校 CAS(authserver.lntu.edu.cn/authserver/login)→ 账密 + 验证码 → 回调 /iap/loginSuccess?sessionToken=...&ticket=... 建立网关会话(cookie 落在 fdm.lntu.edu.cn,与 wec-* 任务接口同域);② 修复:新增 login_lntu.go 的 lntuCasLogin(同 xcu 模式,用 /iap 网关入口覆盖 ampUrl 后走通用 CAS 流程),CpdailyLogin 中对 LntuSchoolId 特判强制走 CAS;③ 验证码类型:抓取登录页 JS 确认 captchaSwitch="2" 且 startLogin 走 createSliderCaptcha()(wisedu 定制滑块,非图形验证码),协议与华侨大学完全同源(openSliderCaptcha.htl 取图、sign=AES(JSON.stringify({canvasLength,moveLength,tracks}), 小图 base64 末16字节) 提交 verifySliderCaptcha.htl、errorCode==1 通过),故仅需将 lntu 加入 sliderIds 配置即可复用现有滑块实现(config.toml.example 同步更新);④ 端到端实测:真实待适配账号两次登录均一次通过(gapX=92/149 首候选 offset=0 直接命中 errorCode=1),CAS 302 → 6 cookies(CASTGC/JSESSIONID/MOD_AUTH_CAS/happyVoyage/route/platformMultilingual)→ FetchUserProfile 会话有效;⑤ 按用户要求回滚此前 LoginUrl(忘记密码地址)改动——原地址打不开是因为走了 IAP 入口,改走 CAS 后浏览器可直接打开,无需特殊处理;⑥ 新增 login_lntu_test.go(入口计算 7 用例 + ampUrl 覆盖 + 协议常量),go test ./...、go vet 全过
ci/woodpecker/tag/build Pipeline was successful
v1.2.50
|
2026-09-14 23:12:06 +08:00 |
|
becomer
|
021ac7f7bd
|
v1.2.49:请假审批人「候选为空可不选」+ 新增抄送人(非必填,候选取自审批人列表)——① 审批人校验放宽(实测驱动):ysdwl「大四学生请假」needApproval=1 但审批节点(政工队伍应用管理员)未配置人员,obtainApproveFlow 返回空列表,旧逻辑强制必选导致用户无法提交;现前端在候选为空时不显示必选星号、提示「该校未配置审批人,可不选」,校验仅在有候选时要求选择;后端 execute 校验同步改为「needApproval=1 且候选非空才必填」(服务端自行查候选,避免前端被绕过),候选为空时记录日志放行;② 抄送人功能:ccInfo 从硬编码空结构改为按用户选择构造(BuildLeaveCcInfo),按 userWid 去重、按 userId 是否纯数字分组 teachers/students(personType 0/1,官方结构含 name2Id/dept/sex/teacherName 字段);前端抄送人区显示条件与 needApproval 解耦(候选同源 obtainApproveFlow,类型+时间齐全即加载),蓝色复选框多选、非必填,类型/时间变化后自动清理失效选择;③ 静默降级:候选加载失败不再弹错(避免每次切换类型红字打扰),需审批时提交由后端复核并给明确提示;④ 新增 TestBuildLeaveCcInfo 覆盖学生/教师分组、空列表、表单携带;go test ./...、go vet、vue-tsc、npm run build 全过
ci/woodpecker/tag/build Pipeline was successful
v1.2.49
|
2026-09-14 14:47:26 +08:00 |
|
becomer
|
b75e1f9bd9
|
v1.2.48:请/销假入口卡片副标题改为「异地一键请假销假,自行设置位置」——原文案「提交请假申请,或返校后一键销假」仅描述操作流程,未体现可异地执行与手动指定位置的核心能力;新文案同时覆盖请假与销假两个按钮(位置在按钮上方,两按钮共用),突出「异地」与「自行设置位置」卖点。vue-tsc、npm run build 通过
ci/woodpecker/tag/build Pipeline was successful
v1.2.48
|
2026-09-14 12:57:22 +08:00 |
|
becomer
|
c41176af8d
|
v1.2.47:请/销假页新增「无法请/销假?提交工单」贴边按钮 + 核对请/销假扣费与打卡一致——① 贴边按钮:位置/样式/交互对齐打卡页「收藏本站」竖条(fixed right-0 bottom-32、图标在上竖排文字在下、rounded-l-md、active:scale-95),配色改用玫红(与请/销假页主色一致),点击 router.push('/ticket') 跳转工单列表页,便于用户在无法请/销假时快速反馈;② 扣费核对(本次无代码改动,仅确认):请假/销假与打卡执行三处逻辑完全一致——VIP 未过期免扣,非 VIP 执行前检查 sign_count<=0 则拒绝并返回「可用次数不足」提示,成功后以 WHERE sign_count > 0 原子扣减 1 次防并发超卖;限流三档规则亦相同(2m×3 / 1h×6 / 24h×10),差异仅在限流键维度(打卡按用户+任务、请假/销假按用户,因其无任务维度);③ vue-tsc、npm run build 通过
ci/woodpecker/tag/build Pipeline was successful
v1.2.47
|
2026-09-14 12:39:46 +08:00 |
|
becomer
|
26c5115a32
|
v1.2.46:打卡页文案统一为「打卡」口径 + 请/销假页顶部补齐用户信息栏——① 文案:打卡页「签到管理」→「打卡管理」、「签到任务」→「打卡任务」、「执行日志」→「打卡日志」、「新的签到任务」→「新的打卡任务」(含任务列表空态、日志空态;同步修正新手引导中指向该按钮的文案「+ 新的签到任务」→「+ 新的打卡任务」,避免引导指向不存在的按钮);② 用户栏:MobileLayout 顶部用户信息栏(头像/姓名/学校/公告铃铛)展示条件由仅首页扩展为首页与请/销假页,两页视觉一致(同一组件,无重复实现);③ 说明:页面内功能性文案(如「编辑签到信息」「执行签到」「范围外签到原因」等描述具体动作的词)保持不变,仅统一入口与列表标题口径。vue-tsc 与 npm run build 通过
ci/woodpecker/tag/build Pipeline was successful
v1.2.46
|
2026-09-14 12:21:58 +08:00 |
|
becomer
|
7639912d7c
|
v1.2.45:请假申请功能落地(后端链路 + 前端请假弹窗),前端 tab 改「请/销假」、请假/销假按钮并排平分——① 功能:新增请假接口组(GET /leave/types 类型列表含权威开关、POST /leave/apply-approvers 审批人、POST /leave/apply SSE 同步执行),cpdaily/leave_apply.go 封装 checkOnceLeave + queryLeaveTypes + queryLeaveTypeCfg + obtainApproveFlow + apply 提交全链路;前端 LeaveView 新增请假申请弹窗(类型选择/起止时间/离校开关与三字段/请假原因含字数校验/一键定位/图片附件/审批人选择),日志区同时展示请假与销假记录并以徽标区分;② 关键差异(对比老版本 + 只读实测三校样本):queryLeaveTypes 返回的 needApproval/enableAttach 等开关全为 null,权威开关只在 queryLeaveTypeCfg(老版本逐类型再查一次,本实现按同样方式合并后返回,单类型 cfg 失败不阻塞列表);/leave/apply 为明文 JSON body + 仅 Cpdaily-Extension 头(与销假的 bodyString+sign 加密链路不同,实测确认);mustOut=1 时强制离校且开关不可改;审批人接口时间必须精确到秒(yyyy-MM-dd HH:mm:ss,datetime-local 值自动补秒);③ 服务端复核:execute 时重新查 cfg 并校验 disableTime/原因字数下限/needApproval 必选审批人,再做 checkOnceLeave 资格检查,全部失败均落日志;日志表新增 action 字段(apply/report)延续同表记录;限流扣费与销假同规则(2m×3/1h×6/24h×10,VIP 免扣非 VIP 成功扣 sign_count);④ 全程只读实测(checkOnceLeave/queryLeaveTypes/queryLeaveTypeCfg,未调用 /leave/apply 提交),新增 4 个单测覆盖类型合并/资格检查/表单构造(离校与不离校两分支)/提交,go test ./...、go vet、前端 build、vue-tsc 全过
ci/woodpecker/tag/build Pipeline was successful
v1.2.45
|
2026-09-14 12:13:47 +08:00 |
|
becomer
|
2f20eebccd
|
v1.2.44:销假功能完整落地(后端 SSE 同步执行 + 前端销假页重写),并按真实接口实测修正位置/审批人语义——① 功能:新增 /leave 路由组(pending-list 待销假列表 / approvers 审批人 / execute SSE 执行 / logs 日志 CRUD),cpdaily/leave.go 封装 listOther+detailOther+obtainApproveFlow+report 全链路,cp_leave_logs 落库成败日志,用户级限流(2m×3/1h×6/24h×10),VIP 免扣非 VIP 成功扣 sign_count,图片经 OBS 浏览器直传(taskType=leave);前端 api/leave.ts + LeaveView.vue 重写(销假按钮/日志区/待销假弹窗/销假表单弹窗);② 规定销假位置修正:老版本取 leaveExtends[0](续假位置,实测近乎全空)或注释的 detail.applyLocation(请假提交时定位),均非学校规定位置;实测真实返回 reportPlaces[](address/经纬度/radius 米/设置人),已改为解析并前端列表选择+预填经纬度,用户可在规定位置间切换;③ 多校差异适配:实测 ynu/whit/lzufe 三校样本确认 leaveType.reportApplyFlow 控制销假是否需选审批人(ynu=1,whit/lzufe=0)、enableAttach 控制图片上传(ynu=1,其余=0),前端按开关自适应渲染审批人选择器与图片组件,提交时按需携带 approverWid;④ 解析 bug 修复:leaveType.code 真实为数字(3/12/2),原声明 string 导致 detailOther 全部解析失败(即"规定位置拿不到"的根因),改为 interface{} 承接并同时产出文本/数字双形式;obtainApproveFlow 要求时间精确到秒(yyyy-MM-dd HH:mm:ss),已自动补秒;⑤ 全程只读实测(listOther/detailOther/obtainApproveFlow,未调用任何 /report 提交),新增/重写 4 个单测覆盖开关解析/规定位置/审批人/提交表单,go test ./...、go vet、前端 build、vue-tsc 全过
ci/woodpecker/tag/build Pipeline was successful
v1.2.44
|
2026-09-14 11:44:37 +08:00 |
|
becomer
|
3aee45be80
|
v1.2.43:滑块验证码改为「激活窗口等待 + 打码值窄序列」策略,推翻 ±12 扫描——① 决定性发现:服务端 open 后存在约 1.3~1.7s 激活延迟,延迟内提交任何值(含真值)都返回 errorCode=0;激活后接受以真值为中心的 ±8 宽区间(实测上缘 +8、下缘 -6~-8,相对打码值),打码平台返回值即为区间中心(误差 0±1),此前观测到的「打码偏差 -8~+9」实为快速扫描跨过激活窗口的落点伪影,并非识别误差;② 策略改造:slider.go 单轮流程改为 取图 → 打码 → 等待至 open+2.5s(抖动裕度)→ 按 v、v+1、v-1 窄序列提交(候选间隔 350ms,首候选通常即命中),全部失败仍换图重试(最多 5 轮),提交次数上界从 125 次降至 15 次;③ 新增激活等待回归测试(mock 复刻 300ms 拒绝窗口,断言等待后首个候选命中且不重发),重写候选命中/枚举耗尽测试(3×5=15 次 verify 上界),新增 v-1 命中用例;④ 真实账号端到端实测 3/3 一次通过(gapX=75/96/122 均 offset=0 直接命中,全程约 4s,302 ST 票据 → 7 cookies),go test ./...、go vet 全过
ci/woodpecker/tag/build Pipeline was successful
v1.2.43
|
2026-09-14 00:29:25 +08:00 |
|
becomer
|
46c8a554ff
|
v1.2.42:华侨大学(hqdx)CAS 滑块验证码登录完整落地——① sign 协议:POST /authserver/common/verifySliderCaptcha.htl 提交 sign=AES-128-CBC-PKCS7(key=openSliderCaptcha 小图 base64 解码末 16 字节 safeSecure、iv=16 位随机、明文=64 位随机前缀+JSON{canvasLength:280,moveLength,tracks}),响应 errorCode=1 通过 / 0 失败,moveLength 为缺口真实值精确整数(±1 无容差),失败不消费图片、仅成功才作废;② 识别与连发策略:打码平台 /slider 识别打码值 v 后在同一张图上按 v、v±1…v±12(±12 窗口 25 候选)顺序连发,任一命中即止,全部失败换图重试(最多 5 轮 + 递增等待);实测打码偏差分布 -8~+9(另偶发识别失败图靠换图覆盖),故窗口取 ±12 留裕度;③ 流程接入:login_cas.go 按配置 sliderIds 分流滑块学校,casLogin 的表单选择器 #pwdLoginDiv 适配 hqu 登录页三表单布局(账密字段),滑块通过后 captcha 留空提交登录;hqdx 特判强制走 CAS(IAP 账密接口 FAIL_UPNOTMATCH 不兼容);④ 新增 slider.go + slider_test.go:sign 加解密/载荷/轨迹校验、候选命中、换图重试、5 图全失败(125 次 verify 上界)mock 全覆盖。实测:华侨大学真实账号端到端登录成功(3.11s,首图 +9 偏差命中 → 302 ST 票据 → CASTGC/JSESSIONID/MOD_AUTH_CAS 等 7 cookies),go test ./...、go vet 全过
ci/woodpecker/tag/build Pipeline was successful
v1.2.42
|
2026-09-13 23:46:28 +08:00 |
|
becomer
|
1507b386bc
|
v1.2.41:许昌学院(xcu)单独适配 CAS 登录 + MFA 验证方式解析兼容 xcuTheme 弹窗布局——① 许昌学院:平台接口返回 joinType=CLOUD(IsIap=true),但其 IAP 账密接口 /iap/doLogin 与通用密码加密格式不兼容(实测 RSA hex/base64 多种编码均返回 FAIL_UPNOTMATCH,无法走通);学校真实链路为校园网关 302 → 学校 CAS(authserver.xcu.edu.cn)账密 + 多因子认证 → 回调 /iap/loginSuccess?sessionToken=... 建立网关会话,故在 CpdailyLogin 中对 xcu 特判强制走 CAS,登录入口由 ampUrl(casp.xcu.edu.cn,service 与 cookie 域不匹配)替换为 wecloud 网关 /portal/login(service 指向 xcu.campusphere.net,cookie 正确落在 wec-* 任务接口所在域),新增 login_xcu.go;② MFA 解析:许昌学院定制主题 xcuTheme 将验证方式渲染在「选择认证方式」弹窗中(div.other_type_button[id],id 即方式编号),原选择器均不匹配导致解析出 0 个方式(只能靠兜底),mfaMethodSelectors 新增 .other_type_button 兼容该布局;新增单测 5 个(xcu 入口计算 2 个 + MFA 弹窗布局 3 个),go test ./... 全过;已用真实账号端到端验证:CpdailyLogin → 网关入口 → CAS 账密成功 → MFA 触发并解析出 [{3 短信验证码 default:true}](修复前为 0 个)
ci/woodpecker/tag/build Pipeline was successful
v1.2.41
|
2026-09-13 21:50:54 +08:00 |
|
becomer
|
1a15b359f8
|
v1.2.40:扫码签到(signMode=2)提交格式修复 + MFA 验证方式「全列表选择」改造——① 扫码签到:平台对二维码任务校验 qrUuid,旧格式(带 signInstanceWid 无 qrUuid)响应虽为 SUCCESS 但不落签到记录(假成功),现提交体改为 qrUuid 替代 signInstanceWid(不并存、不含经纬度、跳过定位校验),新增 qrcode.go 用 gozxing 解码二维码图片提取 uuid(URL uuid= 后 32 位串),空白 qrUuid 必失败;成功与否以提交后复核 isSigned 为唯一判据,已用真实任务(云大 2026.09.13 年级大会签到)闭环验证;② MFA:登录触发后不再自动发码,改为解析 reAuthLoginView 页面 Tab 渲染的全部支持验证方式(.mobile-reauth-tab-item/.reauth-tab-item/.reauth-tab-more-item/.changeReAuthTypes 多布局兼容、跳过注释块、过滤非动态码方式、空列表用当前方式兜底)随 4281 返回(authMethods/defaultType),用户选择后调新增接口 POST /api/auth/login/mfa/send 发送验证码(所选≠当前先调 changeReAuthType.do 切换并同步会话,响应含 mobile/codeTime),新增业务码 4284(发送失败)与 4282(验证码错误可重试)/4283(会话过期需重登)区分;前端登录页 MFA 弹窗改为「选择验证方式→输入验证码」两阶段,选择态/校验态失败判定与登录失败弹窗解耦,输入态支持「更换验证方式」回退;新增后端单测 10 个(MFA 方式解析含真实样本、规范化、发码全流程 mock)+ 扫码表单解析测试,go test ./...、go vet、前端 build、vue-tsc 全部通过
ci/woodpecker/tag/build Pipeline was successful
v1.2.40
|
2026-09-13 21:03:51 +08:00 |
|
becomer
|
f23ab1a261
|
v1.2.39 补充:MFA access token 服务端校验宽限——存量已签发 token 无需重新登录即可平滑过渡到 2 小时——已签发的 JWT 因签名保护无法原地修改,且 MFA 通道 access/refresh 同 TTL、刷新窗口实际不存在(refresh 与 access 同时过期,前端又仅在 401 时被动刷新),存量用户(如杨蕊宁)原本只能重新登录换发新 token;现 ValidateToken 对已过期的 MFA access token(issuer=cpdaily-new 且携带 iat)按「签发时间 + 当前 MfaAccessExpire」再放行一次,配置调大后存量 1h token 自动延用至 2 小时窗口;refresh 不享受宽限(严格按自身 exp 校验),避免出现刷新窗口导致会话被滑动静默续期、违背 MFA 短会话设计。新增 jwt_test.go 覆盖 7 个场景:宽限内放行(存量 1h token 过期 30 分钟)、超 2h 拒绝、refresh 拒绝、非 MFA 拒绝、正常有效期放行、错误签名拒绝、缺 iat 拒绝。全部测试与 go vet 通过
ci/woodpecker/tag/build Pipeline was successful
v1.2.39
|
2026-09-13 18:28:16 +08:00 |
|
becomer
|
84a602ae3b
|
v1.2.39:MFA 通道短期 JWT 有效期从 1 小时调整为 2 小时——MFA 学校(如云南大学)第三方会话无法自动续期,token 需与第三方 Cookie 有效期对齐;实测 whit 学校 MOD_AUTH_CAS cookie 签发后超过 1.5 小时仍有效(校验接口返回 errCode=0),说明第三方会话寿命大于 1 小时,故将 MFA 短期 token 放宽到 2 小时。新增独立配置项 mfaAccessExpire(默认 7200 秒,未配置时 Load 自动采用,服务器部署新版本无需修改配置文件即生效),不再复用普通登录的 accessExpire(仍为 1 小时),MFA 专属调整不影响常规登录链路;登录签发(finalizeLogin)与刷新重签(RefreshTokens 的 MFA 分支)同步改用新配置。注意:MFA 通道 access/refresh 同 TTL(现 2 小时),已签发的旧 token 无法原地延长,需重新登录后生效
|
2026-09-13 18:22:49 +08:00 |
|
becomer
|
35a2f1e432
|
v1.2.38:修复云南大学 CAS 登录 MFA 流程被 302 踢回登录页的两个根因——① simpleCookieJar 此前按 cookie 名处理删除指令,而云大 CAS 先发 CASTGC=TGT-...(Path=/authserver)再发删除指令 CASTGC=; Max-Age=0; path=/authserver/(尾部多一斜杠,Path 不匹配),浏览器与标准库 jar 按 RFC 6265 精确匹配作用域不会删除 TGT,按名删除把有效 TGT 一并误删,导致 reAuthLoginView.do 因检查不到 SSO 会话而 302 踢回登录页、MFA 页面无法渲染;现改为跳过删除指令与空值 cookie(不入库也不删除,同时避免发送空值 CASTGC 的历史问题),同名残留会在下次登录时被 CAS 重新 Set-Cookie 覆盖,离线 diff 验证与标准库 jar 对 MFA URL 的输出一致;② resty 默认重定向策略在跨 host 请求时把 User-Agent 替换为 go-resty/2.x(redirect.go checkHostAndAddHeaders),而 wisedu 定制 CAS 按请求 UA 分流渲染移动端/PC 模板,campusphere 网关跳转 ids.ynu.edu.cn 必然跨 host,UA 被替换后 CAS 渲染 PC 模板(25824 字节)导致 MFA 流程校验失败,现自定义 RedirectPolicy 在跨 host 重定向时保留原 UA,移动端模板(14283 字节)正常渲染。云大真实账号端到端验证通过:登录页移动模板 → POST 302 MFA → reAuthLoginView.do 200(29730 字节)→ reAuthType=3(短信通道)解析成功 → dynamicCodeByReauth.do 发码返回 success(短信实发至用户手机)
ci/woodpecker/tag/build Pipeline was successful
v1.2.38
|
2026-09-13 17:59:19 +08:00 |
|
becomer
|
98689f68f4
|
v1.2.37:修复 MFA 通道登录丢失邀请码导致邀请奖励不生效的问题——v1.2.35 抽取 finalizeLogin 公共函数时,MFAVerify 调用传了空邀请码且 Redis 暂存的 mfaSession 未保存 InviteCode,导致经 MFA 验证码流程注册的新用户不建立邀请关系、不发放邀请奖励;现 startMFALogin 暂存会话时一并保存登录请求中的 inviteCode,验证成功注册时正常传入 findOrCreateUser,与普通登录通道行为完全一致
ci/woodpecker/tag/build Pipeline was successful
v1.2.37
|
2026-09-12 14:56:04 +08:00 |
|
becomer
|
3632cb642e
|
v1.2.36:MFA 触发响应改为 HTTP 200 + 专用业务码,修复前端误弹「登录失败」弹窗的问题——登录触发多因子认证时不再返回 401(会被前端 catch 走登录失败 Dialog 路径),改为 code 4281(需MFA,data 含 mfaToken/expiresIn);验证码提交失败区分 code 4282(验证码错误可重试,弹窗保留清空重输)与 code 4283(验证会话过期/失效,关闭弹窗引导重新登录),cpdaily 包新增 ErrMFASessionExpired 哨兵错误供 errors.Is 判定;前端登录成功分支按 code 4281 弹出独立的多因子认证验证码弹窗,MFA 提交按 0/4282/4283 精确分支处理,与普通登录错误提示彻底解耦
ci/woodpecker/tag/build Pipeline was successful
v1.2.36
|
2026-09-12 14:42:50 +08:00 |
|
becomer
|
47401e7388
|
v1.2.35:多因子认证(MFA)登录全流程支持——CAS 账密登录 302 到 reAuthCheck/reAuthLoginView.do?isMultifactor=true 时不再误判为登录成功,自动解析 MFA 页面参数(reAuthType/service/reAuthUserId)并调用 dynamicCode/getDynamicCodeByReauth.do 自动发送验证码;CAS 会话按域暂存 Redis(mfa_session:<token>,10 分钟 TTL,密码 AES 加密),新增 POST /api/auth/login/mfa 接口提交验证码(reAuthSubmit.do)→ CAS 票据交换 → activateSession → 与普通登录一致的注册/更新流程;MFA 通道登录签发短期 JWT(access/refresh 均与第三方 Cookie 有效期对齐,默认 1 小时,Claims 携带 mfa 标记且刷新不延长会话),静默重登遇 MFA 学校返回明确提示需重新登录;前端登录页处理 needMFA 响应弹出多因子认证 Dialog(验证码输入/10 分钟倒计时/输错可重试),验证成功后进入正常登录态。已用待适配学校(合肥幼儿师范高等专科学校)真实账号端到端验证:发码→收码→提交→reAuth_success→用户注册成功→第三方接口可正常拉取用户信息
ci/woodpecker/tag/build Pipeline was successful
v1.2.35
|
2026-09-12 14:32:13 +08:00 |
|
becomer
|
c5fe95b3ec
|
v1.2.34:后台用户管理表格四列合并为两列——「学工号」「真实姓名」合并为「学工号/姓名」列(主行学工号 font-mono、副行姓名小灰字),「学校」「设备码」合并为「学校/设备码」列(主行学校名、副行脱敏设备码 mono 小字保留复制按钮),均采用与「最后登录」列一致的两行主副格式,列宽调整为 10%/12%,腾出的横向空间还给其余列;顺带提交打卡页收藏本站贴边窄竖条按钮的圆角微调(rounded-l-full 改 rounded-l-md,接近长方形观感)
ci/woodpecker/tag/build Pipeline was successful
v1.2.34
|
2026-09-12 13:16:05 +08:00 |
|
becomer
|
0f49e7b1da
|
v1.2.33:收藏本站贴边按钮修正为窄竖条——上一版把 writing-mode 加在按钮容器上导致 flex 主轴随竖排书写模式转为水平,图标被挤到右侧、整体过宽;现改为容器保持常规纵排、仅文字 span 用 writing-mode 竖排,效果为图标在上、竖排文字在下、贴屏幕右缘的窄条(宽约 28px),并按需求移除上下浮动跳动动画及相关 keyframes/降级样式
ci/woodpecker/tag/build Pipeline was successful
v1.2.33
|
2026-09-12 12:50:19 +08:00 |
|
becomer
|
95988c3ca9
|
v1.2.32:打卡页「收藏本站」悬浮气泡改为贴屏幕右缘竖排标签——全局引导入口上移后与原收藏气泡(right-3 bottom-20)位置重叠互相遮挡,收藏按钮改为 writing-mode 竖排、right-0 贴边、左侧圆角、位置抬高至引导按钮上方(bottom-32),两者横向纵向均错开互不遮挡,保留浮动跳动动画
ci/woodpecker/tag/build Pipeline was successful
v1.2.32
|
2026-09-12 12:47:56 +08:00 |
|
becomer
|
edd2b248e2
|
v1.2.31:新手引导第四步文案统一为「执行签到」并去掉「自动」二字,引导入口按钮提升为全局显示——标题改为「执行签到」,真实任务/示例卡空态/列表兜底三种说明与第四步 mock 提示中的「自动完成今天的签到」「自动完成每日签到」「开始今天的自动签到」分别改为「完成今天的签到」「完成每日签到」「开始今天的签到」;「忘记操作?再次查看引导」悬浮气泡从个人中心(ProfileView)移至移动端布局层(MobileLayout,含 guide-bob 浮动动画与 prefers-reduced-motion 降级),打卡/销假/个人中心所有页面恒定显示,引导展示期间自动隐藏,ProfileView 移除旧入口及 inject/Sparkles/样式残留
ci/woodpecker/tag/build Pipeline was successful
v1.2.31
|
2026-09-12 12:43:57 +08:00 |
|
becomer
|
985748a3d3
|
v1.2.30:新手引导第四步(执行任务自动签到)在用户无真实任务时补齐示例任务卡 mock——原第三步的示例卡机制扩展为第三/四步共用:第四步先高亮空态区并展示示例卡,随后定位轮询自动升级命中示例卡自身的「执行」按钮(data-guide 按步骤动态挂载,第三步不抢焦点),按钮加蓝色脉冲动画强调,气泡文案切换为「点示例卡片右侧的执行按钮即可开始今天的自动签到」;示例卡锚定改为空态区 rect(轮询持续校正),不随高亮框滑移错位,mock 判定用 guide-root 归属区分真实任务按钮避免乒乓循环;有真实任务时第四步仍高亮真实执行按钮,行为不变
ci/woodpecker/tag/build Pipeline was successful
v1.2.30
|
2026-09-12 12:37:01 +08:00 |
|
becomer
|
c0ea9ecd8f
|
v1.2.29:前端新增亮暗主题按时间自动切换与底部导航改版——利用 Tailwind v4 颜色工具类引用 --color-* 变量的特性,globals.css 在 .dark 作用域整体覆盖灰阶/彩色浅底/语义 token 调色板,全站 1000+ 处硬编码颜色类一次性适配暗色(深彩色与遮罩黑保持原值),蓝底彩底上的白字/半透明白元素用类名级规则恢复纯白;切换规则为浏览器系统时间 18:00–次日 06:00 暗色(useTheme.ts 立即校正+分钟级轮询自动切换,index.html 内联脚本首屏渲染前预设 .dark 防白闪,theme-color 同步状态栏色),纯自动无手动开关;底部导航「首页」改名「打卡」(CalendarCheck2 图标,路由 name 保持 home 零逻辑改动),新增「销假」tab(CalendarX2)与 /leave 可爱风占位页(🚧 弹跳+糖果漂浮装饰+马卡龙渐变+颜文字,暗色自动适配);绑定成功文案「即将进入首页」同步改为「即将进入打卡页」,布局内容区 bg-[#f5f5f5] 改语义类 bg-background
ci/woodpecker/tag/build Pipeline was successful
v1.2.29
|
2026-09-12 12:17:51 +08:00 |
|
becomer
|
e7e106c606
|
v1.2.28:验证码字体子集化——用 fonttools pyftsubset 从 Sour Gummy ExtraBold 提取仅含 0-9 的数字子集(验证码只需数字),嵌入体积从 58KB 降至 3.3KB,cmap 仅保留 U+0030-0039,渲染效果不变
ci/woodpecker/tag/build Pipeline was successful
v1.2.28
|
2026-09-12 10:44:28 +08:00 |
|
becomer
|
240e1226ef
|
v1.2.27:验证码全面改版为可爱风——弃用 7x9 像素点阵,嵌入 Sour Gummy ExtraBold 开源字体(OFL 授权,猫啃网)渲染数字,字符按字形包围盒精确居中并随机旋转 ±10°,白描边贴纸效果;画布 180x60 且代码级保障最小尺寸,四周统一 15px 留白;干扰线改为绘制在数字上层的贯穿式弯曲斜线(强制大倾角、四向随机、线身带 1~2 个正弦拱似抛物线/波浪),专用冷色色池避开红粉;马卡龙背景+白色气泡+糖珠点缀;引入 golang.org/x/image 字体渲染依赖
ci/woodpecker/tag/build Pipeline was successful
v1.2.27
|
2026-09-12 10:41:00 +08:00 |
|
becomer
|
643e706335
|
v1.2.26:记录用户登录 IP——认证中间件当天首次更新登录时间时同步写入客户端真实 IP(优先 nginx 转发的 X-Real-IP,其次 X-Forwarded-For 首段,兜底 RemoteAddr),真实登录接口同样记录;后台用户列表新增「最后登录」列(IP+时间)、详情弹窗新增最后登录IP展示
ci/woodpecker/tag/build Pipeline was successful
v1.2.26
|
2026-09-11 23:27:59 +08:00 |
|
becomer
|
61a8d2b3fb
|
v1.2.25:首页新增「收藏本站」右侧悬浮气泡按钮(与个人中心引导气泡同款交互),点击复制本站网址到剪贴板并按设备类型展示手动添加步骤——手机浏览器通过菜单添加书签/收藏或添加到主屏幕,电脑浏览器 Ctrl+D
ci/woodpecker/tag/build Pipeline was successful
v1.2.25
|
2026-09-11 22:29:44 +08:00 |
|
becomer
|
6532025cc0
|
v1.2.24:已打卡任务的绿色对勾改为可点击,点击后弹窗确认"您当前已经打卡,是否再次打卡",确认后以与正常执行完全相同的规则(表单校验、次数检测、限流、设备校验)再次打卡;执行中显示加载动画,失败自动回到可执行状态
ci/woodpecker/tag/build Pipeline was successful
v1.2.24
|
2026-09-11 22:20:28 +08:00 |
|
becomer
|
7a4507903f
|
v1.2.23:修复任务状态两个问题——1)跨天状态不重置:昨日成功后今天仍显示绿色对勾且无法执行,改为列表查询时按当天成功日志惰性重置为待执行;2)打卡完成后列表仍显示未签到/不刷新:成功后本地乐观更新+延迟校正刷新,显示以本地当天成功优先,并增加切回页面自动刷新
ci/woodpecker/tag/build Pipeline was successful
v1.2.23
|
2026-09-11 22:16:23 +08:00 |
|
becomer
|
a95c843bf7
|
v1.2.22:个人中心取消底部真实姓名/学号展示行,避免明文暴露敏感信息;新增右侧气泡跳动按钮「忘记操作?再次查看引导」,点击重播新手引导
ci/woodpecker/tag/build Pipeline was successful
v1.2.22
|
2026-09-11 19:51:42 +08:00 |
|
becomer
|
764bae23fc
|
v1.2.21:认证中间件补当天登录标记——token 长期有效不重新登录时,当天首次请求条件更新 last_login_at,修正后台当天登录人数统计
ci/woodpecker/tag/build Pipeline was successful
v1.2.21
|
2026-09-11 14:24:40 +08:00 |
|
becomer
|
1f4d601ffa
|
v1.2.20:后台用户管理列表中当天已登录用户的整行背景色显示为浅绿色
ci/woodpecker/tag/build Pipeline was successful
v1.2.20
|
2026-09-10 20:40:21 +08:00 |
|
becomer
|
5de7852786
|
v1.2.19:修复签到图片直传OBS被拒(改用接口返回formData字段集);执行时自动将base64照片上传换正式URL;验证码创建/校验改multipart;表单必填项为空执行前拦截
ci/woodpecker/tag/build Pipeline was successful
v1.2.19
|
2026-09-10 18:06:10 +08:00 |
|
becomer
|
98631afdc5
|
v1.2.18:代理后台仅保留仪表盘、代理管理、CDK管理菜单,其余页面路由守卫拦截重定向回仪表盘
ci/woodpecker/tag/build Pipeline was successful
v1.2.18
|
2026-09-10 11:21:18 +08:00 |
|
becomer
|
bc4e739e09
|
v1.2.17:hfnu 切换为标准 IAP 登录(绕过学校 SSO 拒绝单点登录跳转);忘记密码提示改为打开学校官方登录地址测试登录或找回密码
ci/woodpecker/tag/build Pipeline was successful
v1.2.17
|
2026-09-10 11:14:37 +08:00 |
|
becomer
|
9bffdb7026
|
恢复 CI 触发逻辑:when 保持 event: tag + tag: v*(仅打 tag 触发)
ci/woodpecker/tag/build Pipeline was successful
v1.2.16
|
2026-09-09 23:48:14 +08:00 |
|
becomer
|
42c8b66a01
|
CI 修复:when 语法适配 Woodpecker 3.16;蓝绿部署入口切换到 jinrixiaoyuan.top
- when 改为 event: tag + ref: refs/tags/v*(tag: v* 为无效遗留键导致 pipeline 被过滤)
- 反代切换文件由已废弃的 xiaozhushou 站点改为 jinrixiaoyuan.top/proxy/root.conf(frps 公网链路)
- 移除首次部署初始化分支(站点已存在),未知端口时中止部署防误切
|
2026-09-09 23:44:04 +08:00 |
|
becomer
|
81b2942cad
|
v1.2.16:hfnu 专属登录适配;拒绝改为单条记录;修复拒绝按钮换行与真实 IP 获取
- 新增 login_hfnu.go:合肥师范学院老式 jasig CAS 专用登录(URL 重写 jsessionid + 强制验证码),识别学校端 SSO 跳转被拒故障并明确报错
- 拒绝待适配学校改为仅拒绝当前记录,邮件只通知该条记录联系邮箱,不再批量拒绝同校其他记录
- 管理页操作按钮加 whitespace-nowrap 修复换行
- TrustedProxies 增加 127.0.0.1,配合 frpc PROXY protocol 透传恢复真实客户端 IP
|
2026-09-09 23:11:41 +08:00 |
|