Commit Graph
112 Commits
Author SHA1 Message Date
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 5cec25736a revert 7acfabfa70
build / build-push (push) Canceled after 10s
revert 删除目录「.gitea」
2026-09-10 15:00:54 +08:00
chenxing 7acfabfa70 删除目录「.gitea」 2026-09-10 14:59:53 +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
admin 909117ea42 ci: init build workflow [skip ci] 2026-09-09 18:01:36 +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