Codex
e2a8a8c85f
feat(phase-11): NotificationService — 10 business templates + privacy-safe external copy
...
Phase 11 Notification — EXTEND per JIRA. P11-V11-T01 through P11-V11-T11.
New notification module (4 files):
- Entity: Notification -> notifications (existing DB table)
- Mapper: findByUser/countUnread/markRead/markAllRead + findExisting(idempotent)
- Service: NotificationService with 10 business templates
T01 appointmentSubmitted T02 appointmentConfirmed T03 appointmentChanged
T04 counselingAssigned T05 counselingScheduled T06 counselingCompleted
T07 premaritalScheduled T08 leNeedEvidence T09 leVerified
T10 leRejected
T11 buildPrivacySafeCopy -> external lock-screen copy NEVER reveals
sensitive counseling type names (INV-010 compliance)
- Controller: GET list, GET unread, PUT markRead/{id}, PUT readAll
Design invariants:
- sendExternal() wrapped in try/catch -> failure does NOT rollback core service
- Idempotency via (user, type, business_type, business_id, content) dedup
- External copy uses neutral words '服务/预约' for counseling events, not '咨询'
2026-09-14 14:33:37 +08:00
Codex
cf3a84e725
feat(phase-10): Chat Safety — content scan + rate limit + RiskNotice
...
Phase 10 Chat Safety — KEEP per JIRA. P10-V11-T01/P10-V11-T02.
New ChatSafetyService (chat module):
- scanContent(): HIGH_RISK keyword + CONTACT regex (phone/wechat/QQ/scan)
- checkRateLimit(): Redis counter + fail-open fallback, stricter for new Match (first 5 min)
- buildRiskNoticeBody(): system message JSON with anti-fraud targetPage
ChatService.sendText() integrated Phase 10:
1. Redis rate limit check (newMatch-aware)
2. Content scan -> risk_level on Message
3. high/critical -> throw, block send
4. warning -> peer gets RiskNotice system message (P10-V11-T01: anti-fraud entry)
(P10-V11-T02: RiskNotice -> anti-fraud content page)
5. Log enriched with risk_level
Constants already had RISK_LEVEL_* and MESSAGE_TYPE_SYSTEM — no new constants needed.
2026-09-14 14:16:47 +08:00
Codex
eda2ce19a8
feat(phase-09): Text Chat full backend + WebSocket
...
Phase 09 Chat — KEEP per JIRA. P09-V11-T01 Activity Match source compatibility.
New chat module (11 files):
- Entity: Conversation, ConversationMember (复合主键), Message
- Mapper: ConversationMapper, ConversationMemberMapper, MessageMapper
- Service: ChatService (getOrCreateConversation/sendText/loadMessages/markAsRead/syncFromMatch)
- Controller: ConversationController (POST /from-match, GET /{id}, GET list)
MessageController (POST send, GET load history, PUT mark read)
- WebSocket: WebSocketConfig + ChatWebSocketHandler (/ws/chat, JSON protocol)
Core invariants:
- INV-005: ChatService requires Match status active/getting_to_know
- Conversation.status sync with Match.status (syncFromMatch)
- Member.canSend + Conversation.status + sender membership all validated
- Client-side idempotency via client_message_id
- P09-V11-T01: Conversation binds only match_id — works identically for
user_like / activity_mutual / matchmaker Match sources
WebSocket note: Memory-based session map; multi-node will need Redis Pub/Sub.
2026-09-14 14:00:04 +08:00
Codex
8b62b5b5df
feat(phase-08): Like / Match / Block full backend implementation
...
Phase 08 Like/Match/Block — KEEP per JIRA, incremental P08-V11-T01.
New entities (match module):
- UserRelation -> user_relations (liked/passed/blocked)
- Match -> matches (source: user_like/activity_mutual/matchmaker, episode-aware)
New mappers:
- UserRelationMapper: findOne/countBlockedEitherWay/countReverseLike
- MatchMapper: findActiveBetween/findLatestBetween/findActiveByUser/findHistoryByUser
New services:
- RelationService: like/pass/block/unblock + mutual detection + capability guard
- INV-004: Block priority highest (auto-unmatch, mutual block check)
- INV-005: Like only creates Match on Mutual
- MatchService (static): createOrReuseMatch factory
- AGENTS.md #19 : existing active Match -> reuse
- AGENTS.md #20 : prior unmatched -> new Match with episode+1
- source-aware: user_like / activity_mutual / matchmaker
New controllers:
- POST /api/v1/likes
- POST /api/v1/blocks, DELETE /api/v1/blocks/{target}
- GET /api/v1/matches, GET /api/v1/matches/{id}, POST /api/v1/matches/{id}/unmatch
Integrates with CapabilityService for base eligibility checks on Like.
2026-09-14 12:15:27 +08:00
Codex
0da82c9914
docs(gate): add phase 4 gate output artifacts
2026-09-14 11:44:02 +08:00
Codex
984827f415
docs: phase 4 acceptance report + STATUS sync
...
- STATUS.md updated: 阶段0-4全部完成, Ready for User Acceptance
- New acceptance report: 三端构建/13契约/源码健康度/债务清单
- CapabilityService independentized (AGENTS.md #26 compliance)
- discover 筛选完整重设计 (5 chip + 4 section + bottom sheet)
- miniapp C组 content/anti-fraud/service-station TS-only
- 三端构建全绿: miniapp tsc=0, admin-web vue-tsc=0, vite build OK
- 13/13 contracts all green
2026-09-14 11:43:46 +08:00
Codex
dd58ab6eae
feat(capability): extract CapabilityService — AGENTS.md rule #26 compliance
...
New module backend/capability/:
- CapabilityService: getCapabilities(entry point for frontend),
plus public helpers (isAccountNormal/isIdentityVerified/isProfileApproved/
isSearching/isBaseEligible/hasLocalEligibility/entry builder)
- CapabilityController: GET /api/v1/capabilities endpoint
HomeApplicationService refactored:
- Injects CapabilityService, delegates buildCapabilities()
and QuickEntry construction + recommendation eligibility checks
- Removes duplicated private methods (isSearching/isIdentityVerified/
isProfileApproved/entry) — single source of truth now in CapabilityService
Contracts updated to check CapabilityService.java for capability-related
assertions (setDisabledReason/isIdentityVerified/ACCOUNT_STATUS_NORMAL)
2026-09-14 11:38:30 +08:00
Codex
22325ec2b0
feat(discover): chip-targeted filter panel — scroll to + highlight target section
...
- Each filter chip (年龄/学历/婚姻) carries data-target pointing to its section
- openFilterPanel receives TouchEvent, maps target to section id, sets panelScrollTo + panelHighlight
- Panel uses scroll-view scroll-into-view with scroll-with-animation for smooth scroll
- Targeted section gets pink outline highlight via .hl class
- Non-targeted sections remain normally visible for context
2026-09-14 11:27:52 +08:00
Codex
adfa4ff31e
fix(discover): filter panel as bottom sheet with mask, add debug log
...
- Changed filter panel from in-flow to fixed bottom drawer with semi-transparent mask
- Mask click closes panel (closeFilterPanel)
- Added console.log in openFilterPanel for debugging event firing
- Panel now z-index:11 above mask z-index:10, guaranteeing visibility
2026-09-14 11:19:25 +08:00
Codex
3e5d2314aa
fix(discover): restore discover-filter-chips class for contract
2026-09-14 11:09:53 +08:00
Codex
146ebab61d
feat(discover): rewrite filter UI to align with backend DiscoverController 5 params
...
- Top chips: 推荐(重置) / 丹阳本地(regionCode=321181) / 年龄 / 学历 / 婚姻
- Each chip has real active state bound to applied filter value
- Panel expanded to 4 sections: age slider + region + education + maritalStatus
- Param names fixed: minAge/maxAge/regionCode/educationCode/maritalStatus
- Data flow: panel temp -> onApplyFilter -> applied -> _buildParams -> API
- Panel opens with current applied values, closes with openFilterPanel/closeFilterPanel
2026-09-14 11:09:23 +08:00
Codex
0f06d82a92
fix(discover): filter chips use applied state and apply immediately on top-chip tap
...
- Top chip '推荐' now active only when no active filter (was hardcoded)
- Top chip '丹阳本地' uses applied.region (was tempRegion)
- Top chip '年龄' uses applied age range
- New onTopRegionTap applies region filter immediately and refreshes results
- Panel onRegionTap preserved for filter-panel multi-select flow
2026-09-14 10:59:43 +08:00
Codex
7009ec079c
fix(miniapp): delete redundant api.ts to avoid build conflict with CommonJS api.js
...
WeChat DevTools TypeScript compilation overwrites the CommonJS api.js
output with the ES-module api.ts compiled output, breaking require()
consumers (authStore.js getToken, authService.js post). The remaining
api.js has the identical ApiClient class plus extra patch() method.
2026-09-14 10:29:15 +08:00
Codex
751f14d5ee
chore: remove obsolete .js sources for migrated C-group pages
2026-09-14 10:14:27 +08:00
Codex
93fc9b0d88
feat(miniapp): migrate C-group pages to TypeScript, update contracts
2026-09-14 10:14:05 +08:00
Codex
e59038790c
docs(status): sync with phase 0 gate results, V035 migration and clean git tree
2026-09-14 10:04:08 +08:00
Codex
fd5f4d6e80
chore: add artifacts/backups to gitignore
2026-09-14 10:02:58 +08:00
Codex
ea2bb2439d
chore: complete infrastructure config, contracts, reference images and ui redesign artifacts
2026-09-14 10:02:34 +08:00
Codex
63cbbff2de
feat: implement miniapp C-group pages with real API calls and design tokens
2026-09-14 10:02:22 +08:00
Codex
bb380d40f6
feat: enhance home aggregate, review atomicity, local eligibility and match engine (phase 04-07)
2026-09-14 10:02:07 +08:00
Codex
10887f40ed
feat: add V034-V035 flyway migrations and phase 04-07 test classes
2026-09-14 10:01:50 +08:00
Codex
0518cda95c
docs: add phase 04-06 recovery reports, gate outputs and execution plan
2026-09-14 10:01:41 +08:00
Codex
1aea6f7791
feat: redesign public relationship services
2026-09-14 08:51:26 +08:00
Codex
a6037ded59
feat: redesign activity and profile tabs
2026-09-14 07:05:20 +08:00
Codex
b7dc52b517
feat: redesign discovery and messages tabs
2026-09-14 06:49:49 +08:00
Codex
36b15d9ca8
feat: rebuild miniapp reference home
2026-09-14 06:45:36 +08:00
Codex
df47543501
feat: add miniapp reference assets and primitives
2026-09-14 06:38:44 +08:00
Codex
311f251609
test: lock miniapp reference page scope
2026-09-14 06:19:11 +08:00
Codex
8b8972a77b
test: verify admin reference UI fidelity
2026-09-13 22:09:15 +08:00
Codex
72b0758e8c
feat: recreate admin dashboard from reference
2026-09-13 21:50:44 +08:00
Codex
fbafe693b6
feat: add admin dashboard data adapter
2026-09-13 21:44:58 +08:00
Codex
9279359678
feat: rebuild admin shell from reference
2026-09-13 21:39:32 +08:00
Codex
ad9d32f544
feat: establish admin reference design foundation
2026-09-13 21:34:43 +08:00
Codex
3a634b4ef2
docs: finalize UI cleanup report
2026-09-13 21:26:30 +08:00
Codex
097c4c4778
chore: finalize miniapp page source cleanup
2026-09-13 21:25:50 +08:00
Codex
61ca737e02
docs: record UI cleanup checkpoint
2026-09-13 21:24:54 +08:00
Codex
eed4400611
refactor: remove duplicate miniapp page sources
2026-09-13 21:19:05 +08:00
Codex
c66e42dd8a
docs: retire conflicting UI baselines
2026-09-13 21:12:50 +08:00
Codex
1deda1e943
chore: inventory obsolete UI files
2026-09-13 20:15:33 +08:00
Codex
56e8329b59
docs: plan reference-driven dual-client UI redesign
2026-09-13 20:07:43 +08:00
Codex
8b5d2b35f8
docs: define reference-driven dual-client UI redesign
2026-09-13 19:54:31 +08:00
admin
d8f3c2a42e
feat: deliver admin redesign pilot
2026-09-11 17:27:12 +08:00
admin
d8338f225b
fix: preserve admin warm-white contract
2026-09-11 17:06:46 +08:00
admin
564fc88fc8
feat: establish admin visual foundation
2026-09-11 17:02:42 +08:00
admin
47dacb5a1b
feat: add original Shanyuan Danyang brand assets
2026-09-11 16:52:32 +08:00
admin
aad666d1a0
test: freeze full UI redesign page matrix
2026-09-11 16:08:17 +08:00
admin
159772f615
docs: plan full dual-client UI redesign
2026-09-11 15:51:03 +08:00
admin
8550ab980d
docs: define dual-client UI redesign
2026-09-11 15:09:44 +08:00
admin
b8c33b9a0c
chore: remove legacy build artifacts
2026-09-11 10:19:22 +08:00
admin
ff451d3185
docs: plan Codex baseline cleanup
2026-09-11 10:15:38 +08:00