chenxing
|
bf3f3344c1
|
feat(dept): sys_group 增列 include_children,支持「包含子组」落库
build / build-push (push) Successful in 1m12s
- 新增 sys_group.include_children(1=部门列表含下级部门 / 0=仅本级,默认 1),仅学校节点使用
- 实体 / Vo / Repository / Service / Controller 全链路打通:单列 UPDATE + 发布 GroupChangedEvent 驱逐 groupSnapshot 缓存
- 新端点 POST /api/sysgroup/SetIncludeChildren/{id},权限只用 requireGroupInScope
(不能用 requireGroupModifiable:后者禁止 SCHOOL 级操作学校组本身,而本属性正是学校管理员要改的本校属性)
- deploy/sql/20261021_add_sys_group_include_children.sql 提供幂等 DDL,需在 160 手工执行
|
2026-10-21 15:12:31 +08:00 |
|
chenxing
|
ddaa3a6f42
|
feat(oapi): 新增移动端渠道绑定开放接口
build / build-push (push) Successful in 59s
- GET /oapi/channel/user 按 (channel, openid) 查已绑定用户,未绑定返回 null
- POST /oapi/channel/bind 凭证绑定:账号密码本服务校验 + 三层查重(openid/账号/unionid)
- POST /oapi/channel/bindByPhone 手机号证明绑定(归属由渠道验签器证明)
- POST /oapi/channel/unbind 按登录账号 + 渠道删绑定行
- 抢绑防护:openid/unionId 仅由服务端从一次性 loginTicket 获取,前端不接触
- 新增 sys_user_channel_rel 实体/仓储/服务,写操作经 @OapiLog 记审计
- 补 ChannelBindServiceTest
|
2026-10-21 08:52:52 +08:00 |
|
chenxing
|
cb40524b8e
|
feat(oapi): user/modules 新增可选 appCode,支持查询指定应用的模块树
- 传 appCode => 按 application_info.app_code 解析目标应用(供托管型应用代渲染导航)
- 未传 => 保持原行为,按验签 appKey 解析调用方应用
- 应用解析失败一律返回空列表(安全优先,禁止意外泄露其他应用模块)
- 参数用 appCode 而非整数 appId:跨环境稳定,与 form-center 的 /app/{appCode}/ 同键
|
2026-10-21 08:52:42 +08:00 |
|
chenxing
|
195936236d
|
feat(module): 子模块支持按钮权限型,custom_id 放开为可空
- AppModule.customId 去掉 @NotBlank / nullable=false;AppModuleRequest 同步放开必填校验
- AppModuleService 空白归一为 null,仅在有值时做应用内唯一校验;path 同样归一 + trim
- 必须存 NULL 而非 '':'' 在 uk_app_module_custom(app_id, custom_id) 下每应用只能有一条
- 新增幂等 DDL sql/app_module_custom_id_nullable.sql(ddl-auto=update 不会改列属性)
- 补 AppModuleServiceButtonModuleTest
|
2026-10-21 08:52:34 +08:00 |
|
chenxing
|
ad434dbc36
|
refactor(path): API 前缀收敛为 /api,退役 /{platform} 通配
- Config.API_PATH 由 "/{platform}" 改为 "/api",另留 MOBI_API_PATH 常量做对齐
- ManageAccessInterceptor 白名单改显式 /api 前缀,路径从通配变闭集
- DWebMvcConfig 拦截器注册由 /{platform}/** 改 /api/**,堵掉「任意前缀绕过白名单」的洞
|
2026-10-21 08:52:26 +08:00 |
|
chenxing
|
035df02f63
|
部门线P0最小批:sys_group加status启停(单列UPDATE+快照驱逐+oapi透出+160幂等SQL)
build / build-push (push) Successful in 57s
|
2026-10-20 22:37:22 +08:00 |
|
chenxing
|
2b754c08ca
|
feat(app): 应用矢量图标 icon_key/icon_color 落库 + icon-map 出参 + svg 上传消毒
build / build-push (push) Successful in 1m25s
|
2026-10-20 16:24:51 +08:00 |
|
chenxing
|
336b50675c
|
ci: apk 源不可达时按可达性自动切换镜像(修复流水线卡死在第一步)
build / build-push (push) Successful in 1m16s
现象:10-20 12:18 / 12:19 两轮构建都失败在第一步 apk add:
fetch https://dl-cdn.alpinelinux.org/alpine/v3.20/main: Permission denied(每个源卡满 60s)
ERROR: unable to select packages: curl (no such package)
后续 clone / 构建 / 打包 / 建档全部被 skip,代码根本没被编译到。
同一时刻本机访问该源是 200,说明是 runner 容器侧网络受限。
改法:装包前用 busybox wget 依次探测 dl-cdn / 阿里云 / 腾讯云 / 华为云,
取第一个可达源替换 /etc/apk/repositories 后再 apk add;四源全不可达则显式报错退出,
不再以 120 秒超时的形式掩盖真实原因。
|
2026-10-20 14:18:49 +08:00 |
|
chenxing
|
fe6c07cc4b
|
fix(授权): 父级勾选态改「任一子节点选中即选中」+ 无模块应用整应用授权(-appId 哨兵)
build / build-push (push) Failing after 2m2s
1. 父级选中态(组授权 / 角色授权口径统一)
两页 isAppChecked 由「全部子模块都勾选才 true」改为「任一子孙被勾选即 true」,
配合前端样式把 zTree checkbox_true_part 图标指向 checkbox_true_full,
折叠态也能一眼看出「部分授权」,不再依赖视觉很弱的半选。
2. 无子模块应用(如「一周安排」)此前勾选不落库、刷新即失效
- 新增 constant/AppLevelModuleId:用 -appId 作「整应用授权」的 module_id 哨兵。
两套授权表都是 (owner_id, module_id) 唯一键,用 0 会让同组/同角色的第二个
无模块应用撞唯一键;真实模块 id 恒正,负数段天然空闲且权限判定永不命中。
- GroupAuthzService#resolveModuleIds:应用无任何模块时返回 -appId,使「整应用」
授权能落库;findGroupAppsWithModules 按 -appId 回填应用级 checked / inheritFlag。
- AppRoleService:findRoleModuleTree 同口径回填 checked;saveRoleModules 对负数项
跳过模块校验,改为校验应用存在性与角色授权范围(角色授权是全量覆盖,哨兵必须原样落库)。
- GroupAuthzService#buildModuleTree:脏数据兜底——parent_id 指向已删模块导致根节点
全丢时,把全部模块提升为根,避免「有模块的应用」被误判成无模块应用。
涉及前端配套改动见 UserBaseFront 同名提交(GroupAuth.vue / AppModuleCheckTree.vue)。
|
2026-10-20 12:18:22 +08:00 |
|
chenxing
|
c790187f35
|
学校应用开通硬闸门:单点前置闸门+应用列表/authorized-codes 收窄(D1 保超管 bypass、D2 收敛)
build / build-push (push) Successful in 54s
- GroupAuthzService: findUserModulesForApp 超管短路后插生效学校单点开通前置闸门;新增 findUserAuthorizedAppIds(userId,schoolId) 收窄重载
- AppCategoryService.listBoaAppType 改用收窄口径;authorized-codes 端点迁至 (userId,null) 走当前身份校兜底
- 测试: 新增 GroupAuthzServiceSchoolGateTest,适配 ModuleTree/Alias/BaseFilter/AuthorizedCodes mock 签名
|
2026-10-12 14:23:05 +08:00 |
|
chenxing
|
d7d239e77c
|
外观SDK化C:UserBase 接入外观代理 starter(端点 GET /api/appearance 三态兜底)
build / build-push (push) Successful in 1m41s
- pom 加 yh-openapi-spring-boot-starter(聚合包例外须显式引出站引擎)+
yh-appearance-spring-boot-starter(平台新件,proxy 默认直连 UserHome /oapi/appearance;
不配 yh.open.services.userhome 时端点 503=预期兜底,前端通道 init 静默保键)
- ManageAccessInterceptor 白名单放行 /api/appearance(仅登录可读自身偏好;
择迹暂存只含本行,工作区既有他人拦截器重构 WIP 未混入)
- 前端零改动(通道 init 裸 fetch;alova 不生成定义)
- 方案:《外观代理SDK化与侧栏默认翻转-实施方案-20261011.md》任务 C
|
2026-10-11 13:59:53 +08:00 |
|
chenxing
|
34750c03ac
|
feat(oapi): 学校维度应用清单端点 GET /oapi/app/list-by-school(流程中心应用设置源池)
build / build-push (push) Successful in 54s
- 开通口径=学校组单点已开通(sys_group_app_rel where group_id=schId,不沿祖先/不并子树角色,拍板 D7);
基石应用过滤/端掩码过滤/convertToBoaApp 不透 secret/applyAlias 学校别名合并,骨架复用 listBoaAppType
- 新缓存 schoolAppList('s:'+schId+':c:'+clientType,60s,学校 id 不可枚举→授权/组/应用/别名事件整清)
- AppAuthzChangedEvent/GroupChangedEvent/ApplicationInfoCacheChangedEvent 三事件挂接整清
- 仅含本功能 5 文件;工作区其余未提交改动(icon-map/channel-bind 实验线)未纳入
|
2026-10-10 21:50:50 +08:00 |
|
chenxing
|
96855a8565
|
fix(identity): 可选身份列表排序改为「主校置顶→其他校 schId 升序→校内 roleId 升序」
build / build-push (push) Successful in 56s
修复同校多身份被主身份提升拆到头尾(如云海小学教师置顶、管理员落尾)。新增 IdentityService.sortForDisplay 统一 /oapi/user/roles 与 /oapi/identity/available 顺序;主身份行不再单独置顶,主校内部一律按 roleId(老师1→校领导2→管理员7),其余学校按 schId 升序。
|
2026-10-09 17:36:26 +08:00 |
|
chenxing
|
705cbde7cf
|
fix(app): 应用列表两处——「全部」视图按 id 正序 + 基石应用不进用户端列表
build / build-push (push) Successful in 1m8s
1) 排序(管理端 GET /AppList):未选应用类型(前端「全部」)统一按 id 正序,最新创建的在最后。
- SUPER:去掉 @SortDefault(sort="sortNo"),改 categoryId==null ? Sort.by(ASC,"id") : Sort.unsorted();
类别视图排序改由 Specification 内嵌 orderBy(NULL 沉底 + sortNo + id)——NULL 沉底须 case
表达式,Sort 表达不了,故该分支必须传 unsorted,否则 Pageable 排序会整体覆盖 spec 的 orderBy。
- SCHOOL:listSchoolApps 按视图分叉,全部视图走新增 appIdOrder(),选中类型仍走生效排序
(override sortNo 优先、空回落主表、并列 id 升序),学校拖拽排序管理不回归。
- 口径:sort_no 是「类型内」序号,跨类型打平无全局意义(服务内注释 + 2026-07-22 记忆)。
2) 基石过滤(oapi GET /oapi/app/list):AppCategoryService.listBoaAppType 补 AppNature.isBaseApp
过滤,UserBase 自身(appKey<=100000)与 app_nature=BASE(UserHome / 移动门户)不进用户端应用列表。
根因:findUserAuthorizedAppIds 超管分支返回全量,而该读链全程无基石判定——即
《消息卡片直批与跳转基址统一方案-20260928》§4.2「一开四关」漏掉的第 6 个触点(现收口为「关」)。
未动 findUserAuthorizedAppIds(被 /oapi/app/authorized-codes 跳转判权共用,改了会连带把
「跳到基石应用」判无权限);未动 manage 端口径(仅 isUserbaseSelf,保留基石供重置密钥)。
测试:AppCategoryServiceBaseAppFilterTest(3 用例)+ SchoolAppOverrideServiceListSchoolAppsTest(5 用例)
|
2026-10-09 12:03:49 +08:00 |
|
chenxing
|
90c08a5f14
|
feat(oapi): 本人联系方式修改端点 POST /oapi/user/self/contact——只写 sys_user phone/email 两字段(空白=不修改),手机号格式/唯一查重+邮箱格式校验,UserChangedEvent 驱逐 boaUser 缓存(含旧 phone: key 提示);附带修复 BoaUserLoader 过时置空:email 列早已存在(实体/管理端/导入均读写),回读 BoaUser 须携带 email(任务B·UserBase 侧)
build / build-push (push) Successful in 2m8s
|
2026-10-02 08:53:30 +08:00 |
|
chenxing
|
f0eaebd186
|
feat(sysuser): ByIds 批量姓名回显端点——管理面聚合页(消息追溯台收件明细)用,仅超管、窄投影 id/account/realName
build / build-push (push) Failing after 30s
|
2026-09-29 12:33:43 +08:00 |
|
chenxing
|
8f8a6b8cca
|
feat(app): app_code/app_nature 编辑必填(C5,2026-09-28 拍板)——校验组 Create 扩 {Create,Update},存量 null 历史行不追溯;学校覆盖分支由前端回传原值满足校验(editAppForSchool 只读 name/desc/pcIcon 不受影响)
build / build-push (push) Failing after 49s
|
2026-09-28 17:07:44 +08:00 |
|
chenxing
|
7e222f19b8
|
feat(app): 新增 /oapi/app/authorized-codes 判权端点(消息跳转收口 C1)——findUserAuthorizedAppIds 判权 + listAppCodesByIds 映射 app_code(空值跳过/首现去重);数据面与控制器用例补齐
|
2026-09-28 16:52:37 +08:00 |
|
chenxing
|
fe19954d8b
|
fix(test): userAppList 驱逐计数 16→18——上游 SNAPSHOT ClientEnum 增 MINIAPP(9 维度×2 格式),非本线改动
|
2026-09-28 12:44:28 +08:00 |
|
chenxing
|
257ba2dd64
|
feat(app): 应用身份统一 app_code/app_nature——五处基石判定收口 + by-code/by-key 开放端点(消息卡片方案 B1)
|
2026-09-28 12:44:26 +08:00 |
|
chenxing
|
3846ec21a9
|
chore(config): identity switch-allowed-app-keys 加 100009(流程中心 switch 授权)
|
2026-09-28 11:54:30 +08:00 |
|
chenxing
|
0b4a596bce
|
feat(app): 注册表多端地址补 miniprogram_url 三层映射(实体/Request/Vo + Boa 出参),160 表列待 DDL
|
2026-09-28 11:54:29 +08:00 |
|
chenxing
|
6cc1bc23f7
|
refactor(push): 测试推送改为手动触发(移除请求预览)
build / build-push (push) Successful in 1m0s
- PushDispatcher 删除 previewManual(预览体构建),保留 dispatchManual 手动投递
- PushSubscriptionController /push/test 不再返回 preview,改为「手动触发一次推送」语义(前端推送测试页已下线)
- PushTestRequest 注释同步;同文件的「推送角色」过滤改走身份行(findUserIdsWithAnyRole),与 roleList 同源
|
2026-09-18 11:13:05 +08:00 |
|
chenxing
|
712e94803f
|
fix(identity): 身份读侧口径统一 + 写口收口(退组/转学/本校移动/追加语义/按校收窄)
读侧(同一根因:sys_user.roles 停写后读侧漏改):
- 组用户管理列表/导出「用户身份」列只取当前组范围解析出的学校集合内的身份行(原为全平台身份并集)
- 推送 roleList 改读 sys_user_role_rel(原读停写列 → 新建/改过身份的用户恒为空,用于 lwj 空推)
- 推送订阅「推送角色」过滤与 /oapi/group/users 角色过滤共用 findUserIdsWithAnyRole(原读停写列会静默漏人)
写口收口:
- 退组补 alignIdentity(退掉某校最后一个组时清出该校身份行与滞留激活身份,消除已离校校领导仍带该校管理范围)
- 激活身份滞留检查由「只比 schoolId」升级为 (roleId, schoolId) 对(同校校领导→老师后不再返回旧角色)
- 跨校转学把源校正常态身份行复制到目标校(原源校清出、目标校不建 → 用户零身份落地)
- moveUserWithinSchool 只重建本校子树内组关系:他校关系与他校 isMain 一律不动,目标组主标记沿用原本校旧关系(不制造双主组)
- 开放接口编辑身份改追加语义(只加不删,学校缺省按 groupId 解析;BschClass 无需改动),管理端保持全量覆盖并加护栏(有 schoolId 无 roleIds 报错)
- 角色授权模块按上下文学校收窄(schId/groupId 非空时只认该校子树内归属组绑定,NULL 全局兜底行仍生效)
- /oapi/group/users 轻量 BoaUser 补 status;SysUserVo.roles 删除(读死列最后一个展示位)
契约与文档:oapi 接口文档 6 处修订 + SDK(yh-openapi-client)三处注释同步;知识库 §3 新增身份写口纪律、§8 记 D3 决议与三项待决策
测试:139 → 158(+19 例)
|
2026-09-18 11:12:56 +08:00 |
|
chenxing
|
ef5849377a
|
feat(log): 三类日志大字段加写入时 size 列,按 50KB 门槛切换在线预览/下载
build / build-push (push) Successful in 54s
- push_record/oplog/oapilog 各加 payload_size/response_size(写时算 UTF-8 字节数),列表只读该整数列、不关联大字段
- 去掉 oplog/oapilog 响应写时截断(全量 GZIP 入库),退役 maxResponseSize 注解属性与常量
- 删除 oapilog 列表逐行 findById+解压回填的 N+1,SysOapiLogListVo 去掉 responseData
- 附三个 resources/sql 迁移(DBA 手动执行,含历史行回填)
|
2026-09-18 09:24:21 +08:00 |
|
chenxing
|
8799d72d47
|
feat(access): 数据范围收敛到当前激活身份所在学校 + 「本组」备注规则修正
build / build-push (push) Successful in 1m17s
问题1 学校管理员多校并存:SCHOOL 级判定原先收拢该管理员名下所有学校
(多校 = 多棵子树并集),导致一个在云海小学+云海中学都有管理员身份的账号
左侧组织树出现两个学校根。
- AccessScopeService.computeScope:SCHOOL 分支优先取 sys_user_current_role
的 schoolId(须命中「该用户确有 {校领导,管理员} 正常态身份行且组为学校组」白名单,
一并挡住脏记录指向别校、切到非管理身份两类越权)→ 无记录/不合法回落本职主校
→ 都解析不出才保留历史宽口径(范围为空会误降 NONE 被整体 403,宁宽勿窄)
- 落在 scopeGroupIds 上游:树/列表/搜索/导入导出/写口 guard 一起收敛,
避免「树里看不到但能搜到、能跨校写」的半修复
- 新增 AccessScopeServiceTest 9 例(该类此前无测试):当前身份收敛/回落主校/
脏记录与区域组回落/主组链无学校的宽口径/超管不受影响/无管理身份行不进 SCHOOL
- 类注释与《管理端权限分级改造方案》§1/§5/§6/§8 同步修订留痕(原写明与当前身份无关)
问题3 权限一览「(本组)」备注:撤销上一版「上下文组覆盖主组」的做法,
改为 own = 用户归属组数>1 且节点为主组——单组用户不再带备注,多组用户
只有本职组带标记(兼职组不带),切换查看时才具备区分意义。
|
2026-09-16 19:13:46 +08:00 |
|
chenxing
|
30b4b0504a
|
oapi验签链治理③:删除 /oapi/internal/sign-key 兜底端点,oapi 可整段对外
build / build-push (push) Successful in 53s
- 删 SignKeyInternalController(/oapi/internal/sign-key/{appId},返回 appSecret)、
SignKeyInternalIpFilter、SignKeyInternalProperties 三文件
- application.yml 删 yh.sign-key-internal 块(其中 192.168.10.0/200 本就是非法前缀,永不匹配)
- OpenApiAuthEnforceConfiguration:删 IP 白名单过滤器与 SignKeyInternalProperties 注册;
**保留 /api/open 与 /oapi/* 的强制签名**(② oapi 整段对外代理依赖它)
- OapiLogAspect:删对 SignKeyInternalController 的排除死代码
- SignKeyCacheService 契约固化:验签密钥以共享 Redis sign:app:* 为单一真源、UserBase 唯一写入方、
读写走密钥链专用库(缺省 db0)、读侧无兜底(Redis 不可用即 fail-closed)
- 实测线上该端点在容器内匿名访问为 403(IP 白名单生效)、公网无 Caddy 路由;
删除后既无密钥外泄面,也使 /userbase/oapi/* 整段代理安全
验证:mvn compile 通过;本模块单测 124 项中 5 项 MySQL 连接失败为环境性(已用 git stash 在
原始树复跑证明同样失败)。
|
2026-09-16 18:08:25 +08:00 |
|
chenxing
|
9ec65698b6
|
feat(approle): 角色属性绑定加组维度,一行=用户×组×角色
build / build-push (push) Successful in 3m37s
- sys_user_app_role_rel 新增 group_id:组=绑定发生时所选组(路径不落库,按组ID实时拼)
- 角色用户列表按绑定行返回,新增部门列(groupPath 按查看者数据范围裁剪,学校管理员只看本校)
- 保存改为按组覆盖/增量添加:编辑弹窗按所在组覆盖,角色授权页增量添加不误删其他组绑定
- 调整组不带走角色:旧组绑定保留不生效,调回自动恢复
- collectEnabledRoleModuleIds 只算用户当前所在组上的启用角色(NULL 视为全局兜底)
- UserGroupTree/UserRoles 增加可选 groupId:所属部门按行收窄、角色按组回显
- 附迁移脚本 sys_user_app_role_rel_add_group_dimension.sql(回填主组 + 换唯一约束)
|
2026-09-16 16:33:29 +08:00 |
|
chenxing
|
ce131bf399
|
feat: oapi group/users 组成员端点(一键拉取教师组数据源)+ SignKeyCacheService 专用库支持 + 组授权存量
build / build-push (push) Successful in 1m17s
- /oapi/group/users?groupId=&withSub=&roleIds=:组内用户列表(flow-center 办理人映射批量导入数据源)
- SignKeyCacheService:sign-redis.database 配置时走专用库模板(sign:app:* 跨应用共享)
- 含组授权/身份切换相关存量(GroupAuthz/GroupController 等 2026-09 前期改动)
|
2026-09-16 01:41:57 +08:00 |
|
chenxing
|
283ac4ca0a
|
feat(module): 模块表新增 icon 字段,GetUserMod 下发模块自身图标
build / build-push (push) Successful in 56s
旧实现 toBoaModule 用 app.getPcIcon() 覆写每个模块的 icon,导致各子应用左侧菜单图标
恒等于应用图标;且 app_module 根本没有图标列,"模块自己的图标"这一概念此前不存在。
- app_module 新增 icon 列(VARCHAR(128),存 YschIcons 图标名);实体/Request/Vo 同步,
新增走 BeanUtils 自动拷贝,edit 为逐字段赋值故显式补 setIcon(字段缺省即置空,清空可生效)
- GetUserMod:toBoaModule 不再覆写 icon,改由同名属性自动拷贝。**非必填**:模块未配图标时
BoaModule.icon 即为 null,不再回退应用图标,由消费方自行兜底
- 附幂等加列脚本 sql/app_module_add_icon.sql(5.7 无 ADD COLUMN IF NOT EXISTS,用
information_schema + PREPARE 兜子;本地 dev 靠 ddl-auto=update,脚本供 dev/prod 手工执行)
- 单测:修正原「icon 按应用级下发」断言为断言 null,并新增用例锁定「配了下发自身、没配为
null、应用 pcIcon 不得覆盖」,共 10 例全绿
|
2026-09-15 18:11:02 +08:00 |
|
chenxing
|
b0a02e56b0
|
feat(oapi): GetUserMod 下发嵌套模块树,层级经 BoaModule.children 承载
build / build-push (push) Successful in 2m42s
模块表 app_module 是 level<=5 的树,管理端下发时带 children,但开放接口这条链
转成平台 BoaModule 时层级被拍平(且旧 SDK 契约无 children 字段可承载),导致每个
子应用各自复制一份 buildModuleTree 重建父子关系。
现按同目录 BoaGroup.children 的既有口径补齐:findUserModulesForApp 的三个返回点
(超管短路 / 应用无模块 / 正常路径)统一收口到 assembleModuleTree 建树。
语义:顶层只放真根(parentId 为空),兄弟沿用开放接口原有 customId 升序口径(不与
管理端 sortNo+id 统一),叶子 children 为空列表以便前端无判空递归;父模块不在本次已
授权集合内的孤儿子节点连同整枝子孙一并丢弃,并逐条打 warn([oapi:modules] drop
orphan module)避免静默少菜单——授权配置须保证「授权子模块必先授权父模块」。
新增 GroupAuthzServiceModuleTreeTest 9 例:三级嵌套与排序、sortNo 不参与、叶子空
列表、parentId 成环不死循环、全 level-1 时与改造前扁平输出等价、无模块返空、孤儿整
枝丢弃、父子同授权则嵌套、JSON 往返证明层级确实经线格式下发且可反序列化。
|
2026-09-15 16:20:05 +08:00 |
|
chenxing
|
0b67382076
|
fix(oapi): 请求体反序列化失败给友好提示,避免误报 code=6 内部服务错误
build / build-push (push) Successful in 2m31s
GlobalExceptionHandler 新增 HttpMessageNotReadableException 处理:Jackson 在进 Controller 前抛的
解析失败(如 birthday 非 yyyy-MM-dd)此前无专属 handler,穿透到 api-std 兜底渲染成 code=6「内部服务错误」。
改为从异常 path 取失败字段名,birthday 点名「字段类型需为yyyy-MM-dd」、其余走通用文案,统一复用
paramError 返回 code=4。空串/null 由 Jackson 归一为 null 不抛,满足「空不管」。附单测 2 例。
|
2026-09-11 14:48:38 +08:00 |
|
chenxing
|
877e800f82
|
perf(identity): 主身份解析先查身份行短路 + 接入无身份计数观测
build / build-push (push) Successful in 57s
- resolveMainIdentity / resolveMainIdentityByUser 求值顺序反转:先取身份行,
为空立即 null,不再先走 resolveSchoolId(沿 sys_group 祖先链无缓存、6~8 次 SQL);
批量版只对确有身份行的用户解析主校,跳过空页。有身份用户结果与查询次数不变。
- IdentityService 新增进程级 nullIdentityLookups,getCurrent 落 null 分支自增,
经 getNullIdentityLookupCount() 暴露;CacheRegistryController 在 /cache/registry
输出 identityCurrentNullLookups,作为「是否给 null 加哨兵缓存」的唯一数据源。
- IdentityServiceTest 补 4 用例锁住短路契约与计数,旧 noGroup 用例补桩身份行。
|
2026-09-11 10:29:33 +08:00 |
|
chenxing
|
2106ba3d00
|
fix(user): 组用户导出「用户身份」图例 2 由「教职工」改为「校领导」
build / build-push (push) Successful in 52s
对齐权威枚举 SysRoleEnum(SCHOOL_LEADER=2,"校领导"),导出列头图例
(1教师 2教职工 3学生 4家长) 中的旧称「教职工」更正为「校领导」。
|
2026-09-11 10:20:52 +08:00 |
|
chenxing
|
d6e995a954
|
fix(sysuser): 编辑用户接口误抛「组ID不能为空」
build / build-push (push) Successful in 1m40s
SysUserController.edit 无条件调用 requireGroupInScope(request.getGroupId()),
而该方法对 null 直接抛错;但 service.edit 不读 groupId、DTO 仅在 Create 校验、
前端编辑按契约不提交 groupId,导致每次编辑必崩。改为仅当 groupId 非空时才校验
其落在数据范围内,越权防线仍由 requireUserInScope(id) 承担。mvn test 102 全绿。
|
2026-09-11 09:58:58 +08:00 |
|
chenxing
|
fb3c5671c6
|
fix(ci): .dockerignore 产物白名单对齐 app.jar
build / build-push (push) Successful in 57s
4131dca 统一 Dockerfile/build.yml 固定产物名为 app.jar 时漏改本文件,
残留初始提交的 !target/userbase.jar 白名单——target/* 规则把 CI 拷回的
target/app.jar 排除出构建上下文,COPY 报 not found(run 特征:maven 步绿、
docker 步炸、context 仅传 ~3.5kB)。
|
2026-09-10 11:39:46 +08:00 |
|
chenxing
|
3421851b6f
|
feat: oapi /oapi/app/list 接入学校别名 + userbase 缓存事件失效基建
build / build-push (push) Failing after 20s
别名接入(本次):
- SchoolAppOverrideService 新增上下文无关合并口 applyAlias:按单一学校覆盖
BoaAppType/BoaApp 名称/图标/排序,覆盖字段为空回落主表真名(无别名=真实名),
分类间/分类内按生效排序重排,口径与管理端 mergeAppVo/mergeCategoryList 一致
- listBoaAppType 新增可选 schoolId:生效学校三级兜底=显式传校(assertSchoolId
锚点+用户归属校验,违规 code=5)→ 当前激活身份学校 → 主归属学校,均无则不合并
- userAppList 缓存 key 扩 :s: 维度:auto 字面量随用户精确枚举驱逐(8→16 条),
显式学校后缀不可枚举靠 60s TTL 自愈;别名写口 AppAuthzChangedEvent 整清链路复用
- 新增 SchoolAppOverrideServiceApplyAliasTest(10)/AppCategoryServiceSchoolAliasTest(8),
更新 CacheInvalidationListenerTest 16-key 断言;全量 102 用例全绿
缓存事件失效基建(前次会话实现,随本 commit 入库):
- AppAuthzChangedEvent/UserGroupRelLoader/CacheInvalidationListener 四事件
AFTER_COMMIT 失效链路 + CacheNames 注册表(TTL/抖动/存放路由/依赖表/失效责任)
- 应用授权域/组域/用户域各写口发布失效事件(AppModule/AppRole/GroupAuthz/
SysGroup/SysUser/Identity 等服务),配套 AppAuthzEventPublishTest 等用例
|
2026-09-10 11:13:30 +08:00 |
|
chenxing
|
46a9587160
|
ci: build.yml maven 容器名唯一化(- 按 SHA 前缀),消除同 runner 跨仓库 mavenbuild 冲突
build / build-push (push) Failing after 1m18s
|
2026-09-09 20:47:11 +08:00 |
|
chenxing
|
4131dca66e
|
chore: 关联注入的标准 CI(build.yml)——移除遗留 ci.yml,Dockerfile/run-app.sh 产物对齐 app.jar
build / build-push (push) Failing after 47s
|
2026-09-09 18:16:35 +08:00 |
|
chenxing
|
a2a6145ed2
|
chore: 合并注入的标准 CI(909117e build.yml)
|
2026-09-09 18:13:51 +08:00 |
|
chenxing
|
f5680be7a8
|
chore: env-config 迁移重建镜像重试(并发原因 run879 失败)
|
2026-09-09 18:07:58 +08:00 |
|
chenxing
|
0d0a680b82
|
refactor: 删除 PropertyEnvConfigSource,env-config 数据源由平台默认挂载文件源兜底(yh-env-config starter B2 下沉)
ci-userbase-service / build-and-push (push) Failing after 49s
|
2026-09-09 11:27:43 +08:00 |
|
chenxing
|
5347559112
|
ci: markDeployed 修复后端到端复验
ci-userbase-service / build-and-push (push) Successful in 53s
|
2026-09-08 16:48:41 +08:00 |
|
chenxing
|
783ccd99fe
|
ci: 换仓对接验证(userbase/UserbaseService)
ci-userbase-service / build-and-push (push) Successful in 1m0s
|
2026-09-08 16:22:58 +08:00 |
|
chenxing
|
751a482456
|
ci
ci-userbase-service / build-and-push (push) Failing after 39s
|
2026-09-07 20:12:41 +08:00 |
|
chenxing
|
07e803b440
|
env-config修订
|
2026-09-07 18:17:02 +08:00 |
|
chenxing
|
1047d2387f
|
后端缓存管理
|
2026-09-07 09:33:10 +08:00 |
|
chenxing
|
79b1d99db9
|
上传头像功能修订
|
2026-09-02 11:43:27 +08:00 |
|
chenxing
|
d018567642
|
上传头像功能实现
|
2026-09-02 10:23:41 +08:00 |
|
chenxing
|
53b2fedb7a
|
上传头像功能实现
|
2026-09-02 10:23:31 +08:00 |
|
chenxing
|
73e404633d
|
bug修订
|
2026-09-02 08:40:18 +08:00 |
|
chenxing
|
a937984f0b
|
ci: webhook 响应体校验(projman 业务错误也返回 HTTP 200,检测 code 字段防止静默失败)
|
2026-09-01 20:18:56 +08:00 |
|
chenxing
|
3e38d702e6
|
ci: 切换 projman 发布链路(构建->Nexus->webhook 通知 projman 部署 10001),移除 docker run 8060 自部署
|
2026-09-01 20:16:06 +08:00 |
|
chenxing
|
71adaf6acb
|
健康检查功能添加
|
2026-09-01 11:50:49 +08:00 |
|
chenxing
|
bf4e1552b8
|
GetUserMod模块列表改按customId配置编码排序
|
2026-08-31 22:04:24 +08:00 |
|
chenxing
|
c588dedea7
|
跨校身份修订
|
2026-08-27 20:14:12 +08:00 |
|
chenxing
|
ebbaeee181
|
用户启用不启用接口开发
|
2026-08-27 10:08:58 +08:00 |
|
chenxing
|
6675ccc8d5
|
转出状态2
|
2026-08-26 12:38:55 +08:00 |
|
chenxing
|
5627252eab
|
转出状态以及相关接口更改
|
2026-08-26 12:38:31 +08:00 |
|
chenxing
|
0b0be6b8e5
|
Merge remote-tracking branch 'origin/main' (仓库 .git 修复)
|
2026-08-21 10:46:58 +08:00 |
|
chenxing
|
f182fe44ce
|
本地工作区快照:恢复 .git 仓库(合并远端 main 前基线)
|
2026-08-21 10:46:47 +08:00 |
|