luoweijian
|
9a9d6a3270
|
docs(opportunity): 商机域 spec 定稿收尾(grill 补拍 20260821 回填 PRD/map/待确认清单 + OCR 存档)
- PRD V1.0 冻结态补拍:origin_dept_id、E8/E9/E10 迁移细化、切主客户一致性、待发通知表、
子表软删复用键 delete_key 约定等 grill 拍板内容
- 实现期回填两处一致性修正(票 03 code-review Spec 轴发现):
* §2.2 owner_name_snapshot varchar(100)→varchar(64)(对齐票 03 B1「对称 lead」,lead 即 64)
* §2.2 补登 version 乐观锁行(§7.1/§3.4 已引用但字段表漏登)
- 方案卡模板 OCR 原始存档(1787558225260_*.png + ocr-scheme-card/doc_0.md)
|
2 weeks ago |
luoweijian
|
d768080ed7
|
commit
|
2 weeks ago |
luoweijian
|
bb2dad7b58
|
commit
|
2 weeks ago |
luoweijian
|
6583863b49
|
commit
|
2 weeks ago |
luoweijian
|
3d0699df6f
|
commit
|
3 weeks ago |
luoweijian
|
f11b840c3e
|
commit
|
3 weeks ago |
luoweijian
|
162ecbf9d2
|
commit
|
3 weeks ago |
luoweijian
|
e4b2a320ea
|
feat: 钉钉组织同步端点 + 管理员角色配置接口——dt-java 部门树/HTTP listbypage 用户幂等同步,dt_dept_id 与 account 作幂等键,负责人反写不映射角色(frontend-integration 票据 03)
|
3 weeks ago |
luoweijian
|
56d8abcdc3
|
feat: 权限码全集下发——/me 增加 permCodes 与 perms→denyBehavior 映射(auth-perms-01)
|
3 weeks ago |
luoweijian
|
2a67fd9be8
|
commit
|
3 weeks ago |
luoweijian
|
1d6c9c6d7a
|
commit
|
3 weeks ago |
luoweijian
|
fa476b4766
|
feat: 单端在线登录(顶号)——每 (用户, 端类型) 至多一个活会话
按 .scratch/single-device-login spec(票 01-07)落地:
- 会话反向索引 session:{userId}:{clientType}->jti(token 键为真相、索引为线索,
反查必验证、脏索引自愈),与 token 键 TTL 对齐并跟随滑动续期
- login/dingtalk 增可选 clientType(默认 pc、大小写不敏感、非法值 61016);
检测到设备在线不签正式 token,返回 61013 + 短命 preLoginToken(带 data 不抛异常)
- 新增 login/dingtalk/confirm:GETDEL 消费 preLoginToken(拿到即烧)-> 踢旧会话
(埋 kicked 标记 + 删旧 token)-> 签新 token 覆写索引;失效统一 61014
- 被顶设备下次请求:filter 埋 ATTR_KICKED_OFFLINE -> commence 输出 401 + 61015
- 登出改 CAS 删索引(Lua 脚本,防误删已被顶号覆写的新索引)
- crm-base Result 增 fail(code, msg, data) 重载;错误码 61013-61016 登记 README
- 存量会话(无 clientType)与老前端(不传 clientType)路径完全兼容;JWT 不变
- 测试:TokenServiceTest 18 / FilterTest 4 / HandlersTest 3 / AuthServiceImplTest +5,
crm-auth 183 全过,全仓 8 模块 BUILD SUCCESS
|
3 weeks ago |
luoweijian
|
dfd1fc6f01
|
commit
|
3 weeks ago |
luoweijian
|
70b53de34c
|
commit
|
3 weeks ago |
luoweijian
|
3277f701de
|
commit
|
3 weeks ago |
luoweijian
|
b345c4dc7b
|
commit
|
3 weeks ago |
luoweijian
|
54aa290c89
|
commit
|
4 weeks ago |
luoweijian
|
4a4b31d8e1
|
commit
|
4 weeks ago |
luoweijian
|
96230913ae
|
refactor: SystemController IO to DTOs (ADR-0017 ticket 07)
- new DeptDTO (extends BaseDTO, children tree, fromEntity/toEntity)
- new AssignDeptDTO (plain POJO, no key semantics)
- rename UserStatsVO -> UserStatsDTO
- menuTree returns List<ResourceNodeDTO>; PermissionResolver.visibleMenuTree maps entity->DTO before tree build
- deptTree returns List<DeptDTO>; saveDept takes DeptDTO; assignUserDepts takes AssignDeptDTO
- userPage drops @RequestBody -> form binding (aligns with documented form-urlencoded convention)
- sync role-management doc RoleDetailVO -> RoleDTO
- DataScopeIntegrationTest updated for ResourceNodeDTO
|
4 weeks ago |
luoweijian
|
ef7ad8e368
|
refactor: RoleController IO to RoleDTO/RoleParam, sink paging into service (ADR-0017 ticket 06)
- rename RoleDetailVO -> RoleDTO extending BaseDTO, add toEntity()
- new RoleParam extends BaseParam; page() now uses PageConverter (size clamp + orderBy anti-injection), fixing pagination bypass
- saveOrUpdate 6 @RequestParam -> RoleDTO; detail returns RoleDTO
- add PageConverterTest covering size clamp + orderBy injection guard
|
4 weeks ago |
luoweijian
|
f989b566cc
|
refactor: rename ResourceNode to ResourceNodeDTO extending BaseDTO (ADR-0017 ticket 05)
|
4 weeks ago |
luoweijian
|
e888aeeb42
|
chore: mark tickets 02/03/04 as resolved (InitBinder + Dict IO)
|
4 weeks ago |
luoweijian
|
b50002f47f
|
commit
|
4 weeks ago |
luoweijian
|
80bc06304c
|
chore: mark ticket 01 as resolved (BaseDTO refactor complete)
|
4 weeks ago |
luoweijian
|
ae103a1f1c
|
refactor: BaseDTO 重构为 abstract 基类 + IBaseService 清理死代码 (ADR-0017 ticket 01)
- BaseDTO 改为 abstract,仅保留 id/createTime/updateTime(均加 @JsonInclude NON_NULL)
- 移除 creatorId/updaterId/deleted 字段及默认值——防止出参侧泄露
- 移除泛型 toEntity(Supplier) 方法——转换方法下沉到各 DTO 类
- IBaseService 删除 saveDTO/updateDTO 死代码(零调用方)
- BeanCopyUtils javadoc 同步更新(移除 BaseDTO.toEntity 引用)
- README §3/§4/§10 同步更新 BaseDTO 和 IBaseService 说明
- 修复 ResourceController/RoleController 预存 UTF-8 BOM 问题
- 新增 ADR-0017、spec.md、7 个 implementation tickets
Refs: ADR-0017, .scratch/controller-io-conventions/
|
4 weeks ago |
luoweijian
|
0dc2da99d5
|
commit
|
4 weeks ago |
luoweijian
|
51b7e2a749
|
feat(auth,dict,base): extract PermissionSeeder seam to replace shadow entities (ADR-0016)
- Add PermissionSeeder interface + PermissionModuleDescriptor/ButtonSeed records in crm-base
- Implement PermissionSeederImpl in crm-auth with find-or-create idempotent seeding
- Refactor DataInitializer to use seam (3 seedModule calls) + @Order(1)
- Refactor DictPermissionInitializer to use seam (1 seedModule call) + @Order(10)
- Delete 6 shadow entity/mapper files from crm-dict (SysMenuSeed, SysRoleSeed, SysRoleMenuSeed + mappers)
- Rewrite DictPermissionInitializerTest to mock PermissionSeeder (no more H2 auth tables)
- Add PermissionSeederImplTest (H2 integration test covering idempotency, catalog sharing, role-not-found)
- Add ADR-0016 documenting the decision, rationale, alternatives, and consequences
- Create crm-base/CONTEXT.md with PermissionSeeder domain glossary
- Update CONTEXT-MAP.md to link crm-base/CONTEXT.md
Eliminates schema leakage: crm-dict no longer knows sys_menu's physical schema.
Runtime dependency accepted: crm-dict needs crm-auth's PermissionSeederImpl at runtime (via crm-app classpath aggregation).
|
4 weeks ago |
luoweijian
|
3d55eeb196
|
feat(dict): data dictionary module — two-level flat model, CRUD/default/cache/permission/seed (ADR-0015)
- 4 tables (dict_group/dict_item/dict_group_default/dict_ref_count), delete_key soft-delete reuse
- DictGroup/DictItem full CRUD + force-delete + status toggle + enabled-list
- DictReferenceService: increment/decrement/batchApply/isReferenced, same-tx ref_count, no cache
- DictQueryService: Caffeine 10s cache + 2s negative cache for empty results, group.status join
- Default item: INSERT ON DUPLICATE KEY UPDATE, hibernate on group disable, auto-restore
- Permission seeds: 10 perm codes → sys_menu tree, bound to ROLE_ADMIN, no crm-auth import
- Built-in dict initializer: idempotent upsert, builtin=false never touched (US-41), value not overwritten
- 48 tests pass; full project compiles
|
1 month ago |
luoweijian
|
50f79a884d
|
commit
|
1 month ago |
luoweijian
|
3499353b28
|
feat(file): thumbnail preview - async generation + sync fallback, PDFBox/LibreOffice renderers, retry (ADR-0013)
|
1 month ago |
luoweijian
|
a263f1736c
|
feat(auth): role management — ancestor completion, CRUD, permission assignment, cascade delete (ADR-0012)
Implements ADR-0005 (backend ancestor completion) and ADR-0012 (role management
architecture) across 5 tracer-bullet tickets:
- ISysMenuService.getAncestorIds: batch query full table, in-memory parentId
traversal, returns complete ancestor set (ADR-0005)
- SysRole.builtin field + DataInitializer idempotent refactor + 5 button
permission seeds (crm:role:list/detail/save/delete/assign) bound to ADMIN
- RoleController (/api/roles/*): page, saveOrUpdate, detail, assign-resources,
delete — pure hasAuthority, POST + action suffix, form params
- SysRoleServiceImpl.saveRole: roleCode uniqueness, builtin protection,
dataScope 1-4 range, create can't set builtin=true
- assignResources: calls getAncestorIds for ancestor completion, then
full replacement (delete + insert) of sys_role_menu
- getRoleDetail: returns RoleDetailVO with basic info + resourceIds
- deleteRoleCascade: cleans sys_role_menu + sys_user_role, builtin rejection,
three-table transaction
- SystemController: all role endpoints removed, unused deps cleaned
- Dead code removed: assignMenus, getMenuIdsByRoleId (superseded by
assignResources, getRoleDetail)
- H2 test schemas updated with builtin column
- 150 tests pass (16 new in SysRoleServiceImplTest, 7 in SysMenuServiceImplTest)
|
1 month ago |
luoweijian
|
b38ab9ec94
|
feat(auth): 动态权限拦截 + 封遗留写路径
基于 apiUrl 的动态权限拦截机制(fail-open,Ant 风格匹配):
- ApiPermissionCache:Caffeine 缓存 button 节点 apiUrl→perms 规则
- ApiPermissionInterceptor:HandlerInterceptor 匹配 URL 校验 authority
- ApiPermissionRule:pattern→perms 映射 record
- WebMvcConfig:注册拦截器 /api/**
- ResourceServiceImpl:save/delete 后触发缓存失效
封遗留写路径 + 收拢 Mapper 到 Service 层:
- 删除 /menus/save 和 /menus/delete(ResourceController 已覆盖)
- ISysRoleService.assignMenus() + deleteRoleCascade() 事务保护
- IAuthUserService.assignRoles() 事务保护
- SystemController 不再持有 SysRoleMenuMapper/SysUserRoleMapper
测试:ApiPermissionInterceptorTest 7 个 + ResourceServiceImplTest 缓存失效验证
|
1 month ago |
luoweijian
|
6329a6ba74
|
first-commit
|
1 month ago |