- 12 Aug, 2026 1 commit
-
-
DaiJiezhang authored
-
- 06 Aug, 2026 6 commits
-
-
这个文件此前被 .gitignore 挡在仓库外,导致新克隆的人缺后端配置、服务起不来: 端口、MyBatis 设置、会话时长、登录失败最小耗时等都只存在于各自本地。 挡住它并没有安全上的必要——数据库账号密码和 JWT 密钥在文件里全是 ${} 环境 变量占位符,真值放在 .env,而 .env 依然被忽略。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>DaiJiezhang authored -
纯文案替换,不含任何逻辑改动,单独成一次提交,避免 34 个文件的一行改动把 前面几次提交里真正的逻辑变更淹掉。 范围:后端提示语与注释、前端页面文案与测试断言、openspec 变更文档。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
三个列表页顶部的「资产列表 共 N 条」整块去掉,与设备资产管理页保持一致。 总条数底部分页器已经在报,重复一遍只是白占一行高度。 侧边栏「企微资料」改为「企业微信资产」,与页面标题、新增按钮、弹窗标题统一。 其余菜单项已逐个核对与各页 h2 标题一致,只有这一处不对齐。 手机号码管理页支持从地址栏读取 phoneNumber 预筛选,供企业微信资产页的注册 手机号链接跳转使用。 本次提交同时包含手机号码管理页文案由「手机号资产」改为「手机号码管理」的 部分改动——该页的文案替换与上述结构调整改在同一批代码行上,无法干净拆分。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
企微此前只能新增。补上编辑和删除后,难点在注册手机号的联动——新增时填一个 库里没有的号码,系统会自动建一条外部号码资产(phoneLinkMode=CREATED)并把它 的 sourceAssetId 指回这条企微。 换号和删除时,那条自动新建的号码要满足三个条件才会被一并软删: - phoneLinkMode 是 CREATED(复用的已有号码是独立资产,绝不能碰) - 来源标记对得上,防止误删同号但另有出处的记录 - 没有别的企微、微信、抖音仍在引用它 三道闸门缺一不可。号码没改动时整段联动直接跳过,避免把复用号码误标成新建, 或把还在用的号码当成旧号清理掉。删除确认框会明说自动新建的号码将一并删除。 关联设备:表单加远程搜索选择,新增和编辑都支持,列表也展示。打开弹窗即预载 一页设备,否则用户点开下拉只看到「无数据」,得先猜着打字才有列表。已选设备 不在后端返回的前 20 条里时会被补回列表头部,避免选择框丢掉名称回落成裸 ID。 顺带修复 PhoneAssetValidationException 没有任何 handler 的问题:它会一路落进 GlobalExceptionHandler 的 Exception 兜底,用户填错手机号却收到「服务器处理 失败,请稍后重试」。同样地,接口不存在或请求方式不对此前也被兜底成 500,把 「前后端版本不同步」伪装成线上故障,排查时会往完全错误的方向查;现在分别返回 400、405、404。 列表信息密度:去掉资产 ID 列与关联字段的(ID:n)后缀,别名收进名称下方做 浅灰小字,性别做成名称右侧图标,实名状态做成实名人右上角圆点,关联方式做成 手机号右上角一字角标。注册手机号和关联设备做成链接,跳转到对应资产页并预筛 出该条——为此手机号码管理页和设备资产管理页补上了读取地址栏参数的能力, 否则链接点过去只是一个没筛选的全量列表。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
图片性能:列表里 40px 的小图原本加载的是完整原图。实测单张 1672x941 的 PNG 约 1.8MB,一页 20 条最多 40 张,需要传输约 72MB、浏览器解码后常驻内存约 250MB;每页条数还能选到 50,翻倍到 180MB / 630MB。图片接口又没有任何缓存头, 每次刷新、翻页回来都要重下一遍。 改法分四层: - 保存时用 ImageReader 降采样解码,一次完成格式校验和长边 240px 缩略图生成。 实测 1890KB -> 4KB,耗时 82ms,比原先只做校验的全图解码(119ms)还快。 缩略图先写临时文件再原子替换,并发补生成不会读到半截文件。 - 列表和弹窗预览改用缩略图,只有点开大图才请求原图;历史图片首次被请求时 自动补生成一次并落盘。 - 图片接口加 Cache-Control: max-age=1年, private, immutable。文件名是随机 UUID、内容永不改写,换图必然换标识,所以缓存安全;用 private 而非 public, 避免受登录态保护的图片被共享代理缓存后发给别人。 - 列表图加 loading=lazy、悬停时预取并解码原图,点开大图几乎无等待。 上传交互:上传控件此前没有 accept 属性,系统文件框要枚举目录下所有类型的 文件;预览又把原图直接塞进 104x78 的框,浏览器同步解码整张图会明显卡顿。 现在限定图片类型,并用 createImageBitmap 异步解码后缩到 320px 再显示, 上传的仍是未经处理的原始文件。 设备编号:设备名称输入框加一键生成下一个「前缀N号机」。编号由后端在全库范围 计算,不按当前页推算——一页只有 20 条,最大编号很可能在别的页上,按当前页 算会撞上已存在的名字被唯一性校验打回。前缀限定 1-20 位中英文数字,因为它要 拼进 LIKE 条件,% 和 _ 会被当通配符。 列表同时去掉编号列、图片挪到首列并支持展示两张、无图与加载失败统一显示占位框、 更新时间只保留日期。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
MyBatis-Plus 的 updateById 默认用 FieldStrategy.NOT_NULL,实体里值为 null 的 字段会被整个从 SET 子句里剔除。表现极具欺骗性:接口返回成功、update_time 也 更新了,唯独那一列的旧值原封不动,刷新后又冒出来。 已确认受影响的操作: - 设备资产「移除图片」保存后列表仍显示旧图 - 设备资产、手机号码管理「清空使用人 / 运营商 / ICCID / 实名人 / 管理模式 / 关联设备」保存后均不生效 给这些业务上允许清空的字段声明 updateStrategy = ALWAYS。企微、微信、抖音的 device_id 目前还没有编辑接口,一并声明是提前立规矩,避免补编辑功能时重蹈覆辙。 没有改全局 update-strategy 配置:那会让所有模块的 update 都把 null 写进库, 可能在别处造成数据丢失。放开 ALWAYS 的前提是所有 updateById 调用点都走 「先查全量实体再改字段」,已逐个核对确认。 新增 NullableColumnUpdateTest 直接检查 MyBatis-Plus 生成的 SET 子句,而不是 mock 掉 Mapper——原来的 Service 测试正是因为 mock 了 Mapper、SQL 从未被验证, 才让这个缺陷漏了出去。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored
-
- 05 Aug, 2026 12 commits
-
-
feat: 手机号资产按设备名称关联并统一列表与弹窗字段 See merge request !10
DaiJiezhang authored -
关联设备原本只显示和输入设备 ID,用户得自己去设备资产页记数字。 改为按设备名称搜索选择,列表也直接显示名称。 - 新增 GET /api/phone-assets/lookups/devices,走手机号页 READ 权限而不是设备页的 管理员权限,避免只有手机号权限的用户搜不到设备 - PhoneAssetResponse 增加 deviceName,分页时一次 IN 查询批量解析,不逐行查库 - 弹窗设备 ID 输入框改为可搜索下拉,编辑时预置当前设备保证名称回显 - 弹窗字段名统一为列表叫法:卡类型→运营商、实名归属→实名人、管理方式→管理模式、 处置状态→使用状态、设备 ID→关联设备 - 运营商增加「电销卡「联通」」 - 列表与弹窗字段顺序调整为 手机号、实名人、运营商 - ICCID 不再单独占列,收进手机号单元格由图标点击弹出,图标用内联 SVG 以免引入 不在 package.json 里的 @element-plus/icons-vue - 修复下拉已选中的值被 placeholder 灰色规则一起染灰 - 修复筛选框写死宽度导致手机号提示语截断、重置按钮换行 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
列表分页器统一与界面文案中文化 See merge request !9
DaiJiezhang authored -
删除侧边栏品牌副标题、账号权限页与历史参考页副标题, 连同登录页早已停用的 login-brand__eyebrow 一并清理, eyebrow 这个类自此在源码中不再出现。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
构建产物此前走内置英文默认,分页器显示 20/page、删除确认框显示 OK。 显式注入 zh-cn 后统一为中文,并同步更新按英文按钮定位的回归用例。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
- 新增 AppPagination 共享分页组件,四个列表页改用同一套分页器 - 采用分段容器样式:翻页控件收进灰槽,当前页为槽内浮起白块 - 无数据时分页器不再整块消失,容器高度恒定 66px,槽内页码灰化占位 - 企微资产与公司档案补上每页条数选择 - 列表加载后若当前页为空且页码大于 1,自动回退到实际最后一页 - 设备列表 ID 列改名为编号 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
列表页固定一屏高度 + 公司档案工作台与登录安全加固 See merge request !8
DaiJiezhang authored -
uploads/ 是后端写入的资产图片目录,此前没有被任何规则挡住, 执行 git add . 会把设备图片一并提交进仓库。 同时忽略 db-seed/ 与 *.seed.sql:本地造数脚本各人环境不同, 放在仓库外,需要时自行执行。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
五个列表页不再随数据量把页面撑长,改为锁定在一屏内、表头固定、行区域内部滚动、分页始终可见: 手机号资产、企微资料、公司档案、设备资产、账号与权限。 实现要点: - app-shell 锁定视口高度,滚动分给侧栏与内容区各自承担 - 列表页根节点用 min-height:100% 的 flex 纵向布局,表格面板吃掉剩余空间 - 表格外层新增 grid-wrap 容器并绝对定位 el-table,否则 el-table 会用自身内容高度 反向撑开父级导致 flex 收缩失效;同时必须显式写 height:100%, 盖掉 Element Plus 自带的 .el-table{height:fit-content} - grid-wrap 设 min-height:220px 兜底,窗口过矮时改由内容区整页滚动,避免表格被压成一两行 - 断点 640px 以下整体回退为整页滚动,小屏可视行数太少反而不好用 顺带修复设备资产列表始终报「数据库字段未同步」: AssetDeviceEntity 的 imageAttachment1/2 被 MyBatis-Plus 推导成 image_attachment1, 与表中的 image_attachment_1 对不上导致 SELECT 抛 BadSqlGrammarException, 补 @TableField 显式指定列名。 验证:1280x918 与 420px 矮窗口下逐页实测表头固定、内部滚动、分页可见与兜底生效; 设备页以 30 条真实数据验证滚动,并实测图片上传、列表读回与页面渲染全链路; 前端 27 项 e2e 全部通过。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>DaiJiezhang authored -
本提交是 codex 已完成、此前一直留在工作区未提交的改动,本次原样归档: - 公司档案:后端 Controller / Service / 4 个 DTO,前端 company-profile 模块与路由注册,配套单测与 e2e - 登录安全:新增 LoginAttemptGuard / InMemoryLoginAttemptGuard / LoginThrottledException 失败限流,AuthService 与异常处理相应调整 - 企微资产:注册主体选择、弹窗滚动复位,相关 Service 与测试更新 - 账号权限:SystemUserAdmin 相关调整与登录锁定解除入口 - openspec 变更记录 4 份,.gitignore 补充两条本地产物忽略 未经改动地提交,作者本人未复核;如需拆分或回退请以此提交为界。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored -
修复:保留接口真实报错并限制手机号输入 See merge request !7
DaiJiezhang authored -
DaiJiezhang authored
-
- 04 Aug, 2026 8 commits
-
-
chore: ignore local development artifacts See merge request !6
DaiJiezhang authored -
DaiJiezhang authored
-
feat: 合并认证权限与原生登录密码框修复 See merge request !5
DaiJiezhang authored -
DaiJiezhang authored
-
DaiJiezhang authored
-
集成认证、刷新重定向与本地 CORS 修复 See merge request !4
DaiJiezhang authored -
DaiJiezhang authored
-
DaiJiezhang authored
-
- 03 Aug, 2026 5 commits
-
-
DaiJiezhang authored
-
DaiJiezhang authored
-
DaiJiezhang authored
-
DaiJiezhang authored
-
DaiJiezhang authored
-
- 01 Aug, 2026 6 commits
-
-
企业微信与手机号资产相关改动 See merge request !2
DaiJiezhang authored -
DaiJiezhang authored
-
DaiJiezhang authored
-
DaiJiezhang authored
-
功能:改进手机号资产列表管理 See merge request !1
DaiJiezhang authored -
DaiJiezhang authored
-
- 31 Jul, 2026 2 commits
-
-
DaiJiezhang authored
-
DaiJiezhang authored
-